From 85ff050061a5cc4de6a56d08e7eddd479e716d47 Mon Sep 17 00:00:00 2001 From: Master Kwoth Date: Thu, 30 Jun 2016 01:05:37 +0200 Subject: [PATCH] Soundcloud playlist support (!m scpl) - Better late than never. closes #123 --- .../Modules/Music/Classes/MusicControls.cs | 1 + NadekoBot/Modules/Music/Classes/Song.cs | 8 ++++- NadekoBot/Modules/Music/Classes/SoundCloud.cs | 17 ++++++---- NadekoBot/Modules/Music/MusicModule.cs | 34 +++++++++++++++++-- 4 files changed, 51 insertions(+), 9 deletions(-) diff --git a/NadekoBot/Modules/Music/Classes/MusicControls.cs b/NadekoBot/Modules/Music/Classes/MusicControls.cs index 62eabc33..deb9bc2a 100644 --- a/NadekoBot/Modules/Music/Classes/MusicControls.cs +++ b/NadekoBot/Modules/Music/Classes/MusicControls.cs @@ -174,6 +174,7 @@ namespace NadekoBot.Modules.Music.Classes throw new ArgumentNullException(nameof(s)); lock (playlistLock) { + s.MusicPlayer = this; playlist.Add(s); } } diff --git a/NadekoBot/Modules/Music/Classes/Song.cs b/NadekoBot/Modules/Music/Classes/Song.cs index 520ab3d8..f9c7f3ae 100644 --- a/NadekoBot/Modules/Music/Classes/Song.cs +++ b/NadekoBot/Modules/Music/Classes/Song.cs @@ -54,7 +54,7 @@ namespace NadekoBot.Modules.Music.Classes } } - private Song(SongInfo songInfo) + public Song(SongInfo songInfo) { this.SongInfo = songInfo; } @@ -67,6 +67,12 @@ namespace NadekoBot.Modules.Music.Classes return s; } + public Song SetMusicPlayer(MusicPlayer mp) + { + this.MusicPlayer = mp; + return this; + } + private Task BufferSong(CancellationToken cancelToken) => Task.Factory.StartNew(async () => { diff --git a/NadekoBot/Modules/Music/Classes/SoundCloud.cs b/NadekoBot/Modules/Music/Classes/SoundCloud.cs index 00216fbb..159d0d9e 100644 --- a/NadekoBot/Modules/Music/Classes/SoundCloud.cs +++ b/NadekoBot/Modules/Music/Classes/SoundCloud.cs @@ -1,4 +1,5 @@ using NadekoBot.Classes; +using Newtonsoft.Json; using System; using System.Threading.Tasks; @@ -34,18 +35,22 @@ namespace NadekoBot.Modules.Music.Classes public class SoundCloudVideo { - public string Kind = ""; - public long Id = 0; - public SoundCloudUser User = new SoundCloudUser(); - public string Title = ""; + public string Kind { get; set; } = ""; + public long Id { get; set; } = 0; + public SoundCloudUser User { get; set; } = new SoundCloudUser(); + public string Title { get; set; } = ""; + [JsonIgnore] public string FullName => User.Name + " - " + Title; - public bool Streamable = false; + public bool Streamable { get; set; } = false; + [JsonProperty("permalink_url")] + public string TrackLink { get; set; } = ""; + [JsonIgnore] public string StreamLink => $"https://api.soundcloud.com/tracks/{Id}/stream?client_id={NadekoBot.Creds.SoundCloudClientID}"; } public class SoundCloudUser { [Newtonsoft.Json.JsonProperty("username")] - public string Name; + public string Name { get; set; } } /* {"kind":"track", diff --git a/NadekoBot/Modules/Music/MusicModule.cs b/NadekoBot/Modules/Music/MusicModule.cs index bf88a5a6..ef482532 100644 --- a/NadekoBot/Modules/Music/MusicModule.cs +++ b/NadekoBot/Modules/Music/MusicModule.cs @@ -6,6 +6,7 @@ using NadekoBot.DataModels; using NadekoBot.Extensions; using NadekoBot.Modules.Music.Classes; using NadekoBot.Modules.Permissions.Classes; +using Newtonsoft.Json.Linq; using System; using System.Collections.Concurrent; using System.Collections.Generic; @@ -302,6 +303,37 @@ namespace NadekoBot.Modules.Music await msg.Edit("🎵 `Playlist queue complete.`").ConfigureAwait(false); }); + cgb.CreateCommand("soundcloudpl") + .Alias("scpl") + .Description("Queue a soundcloud playlist using a link. | `!m scpl https://soundcloud.com/saratology/sets/symphony`") + .Parameter("pl", ParameterType.Unparsed) + .Do(async e => + { + var pl = e.GetArg("pl")?.Trim(); + + if (string.IsNullOrWhiteSpace(pl)) + return; + + var scvids = JObject.Parse(await SearchHelper.GetResponseStringAsync($"http://api.soundcloud.com/resolve?url={pl}&client_id={NadekoBot.Creds.SoundCloudClientID}"))["tracks"].ToObject(); + await QueueSong(e.Channel, e.User.VoiceChannel, scvids[0].TrackLink); + + MusicPlayer mp; + if (!MusicPlayers.TryGetValue(e.Server, out mp)) + return; + + foreach (var svideo in scvids.Skip(1)) + { + mp.AddSong(new Song(new Classes.SongInfo + { + Title = svideo.FullName, + Provider = "SoundCloud", + Uri = svideo.StreamLink, + ProviderType = MusicType.Normal, + Query = svideo.TrackLink, + })); + } + }); + cgb.CreateCommand("localplaylst") .Alias("lopl") .Description("Queues all songs from a directory. **Bot Owner Only!**\n**Usage**: `!m lopl C:/music/classical`") @@ -757,8 +789,6 @@ namespace NadekoBot.Modules.Music return mp; }); var resolvedSong = await Song.ResolveSong(query, musicType).ConfigureAwait(false); - resolvedSong.MusicPlayer = musicPlayer; - musicPlayer.AddSong(resolvedSong); if (!silent) {