Dev #11
| @@ -5,6 +5,7 @@ using Lavalink4NET.Player; | |||||||
| using Microsoft.Extensions.Logging; | using Microsoft.Extensions.Logging; | ||||||
| using System; | using System; | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
|  | using System.Diagnostics; | ||||||
| using System.Text; | using System.Text; | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
| using TomatenMusic.Commands.Checks; | using TomatenMusic.Commands.Checks; | ||||||
| @@ -35,6 +36,8 @@ namespace TomatenMusic.Commands | |||||||
|             [OnlyGuildCheck] |             [OnlyGuildCheck] | ||||||
|             public async Task PlayQueryCommand(InteractionContext ctx, [Option("query", "The song search query.")] string query) |             public async Task PlayQueryCommand(InteractionContext ctx, [Option("query", "The song search query.")] string query) | ||||||
|             { |             { | ||||||
|  |             var sw = Stopwatch.StartNew(); | ||||||
|  |  | ||||||
|                 await ctx.DeferAsync(true); |                 await ctx.DeferAsync(true); | ||||||
|  |  | ||||||
|                 GuildPlayer player = (GuildPlayer)_audioService.GetPlayer(ctx.Guild.Id); |                 GuildPlayer player = (GuildPlayer)_audioService.GetPlayer(ctx.Guild.Id); | ||||||
| @@ -50,7 +53,9 @@ namespace TomatenMusic.Commands | |||||||
|                     await ctx.EditResponseAsync(new DiscordWebhookBuilder() |                     await ctx.EditResponseAsync(new DiscordWebhookBuilder() | ||||||
|                      .WithContent($"❌ An error occured while resolving your query: ``{ex.Message}``, ```{ex.StackTrace}```") |                      .WithContent($"❌ An error occured while resolving your query: ``{ex.Message}``, ```{ex.StackTrace}```") | ||||||
|                       ); |                       ); | ||||||
|                     return; |                 sw.Stop(); | ||||||
|  |                 _logger.LogDebug($"Command {ctx.CommandName} took {sw.ElapsedMilliseconds}ms to execute."); | ||||||
|  |                 return; | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 try |                 try | ||||||
| @@ -66,7 +71,9 @@ namespace TomatenMusic.Commands | |||||||
|                         await ctx.EditResponseAsync(new DiscordWebhookBuilder() |                         await ctx.EditResponseAsync(new DiscordWebhookBuilder() | ||||||
|                          .WithContent($"❌ An error occured while connecting to your Channel: ``{ex.Message}``") |                          .WithContent($"❌ An error occured while connecting to your Channel: ``{ex.Message}``") | ||||||
|                           ); |                           ); | ||||||
|                         return; |                     sw.Stop(); | ||||||
|  |                     _logger.LogDebug($"Command {ctx.CommandName} took {sw.ElapsedMilliseconds}ms to execute."); | ||||||
|  |                     return; | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
| @@ -97,9 +104,13 @@ namespace TomatenMusic.Commands | |||||||
|                     await ctx.EditResponseAsync(new DiscordWebhookBuilder() |                     await ctx.EditResponseAsync(new DiscordWebhookBuilder() | ||||||
|                      .WithContent($"❌ An error occured while playing your Query: ``{ex.Message}``") |                      .WithContent($"❌ An error occured while playing your Query: ``{ex.Message}``") | ||||||
|                       ); |                       ); | ||||||
|                     return; |                 sw.Stop(); | ||||||
|  |                 _logger.LogDebug($"Command {ctx.CommandName} took {sw.ElapsedMilliseconds}ms to execute."); | ||||||
|  |                 return; | ||||||
|                 } |                 } | ||||||
|             } |             sw.Stop(); | ||||||
|  |             _logger.LogDebug($"Command {ctx.CommandName} took {sw.ElapsedMilliseconds}ms to execute."); | ||||||
|  |         } | ||||||
|  |  | ||||||
|             [SlashCommand("file", "Play a song file. (mp3/mp4)")] |             [SlashCommand("file", "Play a song file. (mp3/mp4)")] | ||||||
|             [UserInVoiceChannelCheck] |             [UserInVoiceChannelCheck] | ||||||
| @@ -107,8 +118,9 @@ namespace TomatenMusic.Commands | |||||||
|             [OnlyGuildCheck] |             [OnlyGuildCheck] | ||||||
|             public async Task PlayFileCommand(InteractionContext ctx, [Option("File", "The File that should be played.")] DiscordAttachment file) |             public async Task PlayFileCommand(InteractionContext ctx, [Option("File", "The File that should be played.")] DiscordAttachment file) | ||||||
|             { |             { | ||||||
|  |             var sw = Stopwatch.StartNew(); | ||||||
|  |  | ||||||
|                 await ctx.DeferAsync(true); |             await ctx.DeferAsync(true); | ||||||
|  |  | ||||||
|                 GuildPlayer player = (GuildPlayer)_audioService.GetPlayer(ctx.Guild.Id); |                 GuildPlayer player = (GuildPlayer)_audioService.GetPlayer(ctx.Guild.Id); | ||||||
|  |  | ||||||
| @@ -123,7 +135,9 @@ namespace TomatenMusic.Commands | |||||||
|                     await ctx.EditResponseAsync(new DiscordWebhookBuilder() |                     await ctx.EditResponseAsync(new DiscordWebhookBuilder() | ||||||
|                      .WithContent($"❌ An error occured while resolving your file: ``{ex.Message}``") |                      .WithContent($"❌ An error occured while resolving your file: ``{ex.Message}``") | ||||||
|                       ); |                       ); | ||||||
|                     return; |                 sw.Stop(); | ||||||
|  |                 _logger.LogDebug($"Command {ctx.CommandName} took {sw.ElapsedMilliseconds}ms to execute."); | ||||||
|  |                 return; | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 try |                 try | ||||||
| @@ -138,7 +152,9 @@ namespace TomatenMusic.Commands | |||||||
|                         await ctx.EditResponseAsync(new DiscordWebhookBuilder() |                         await ctx.EditResponseAsync(new DiscordWebhookBuilder() | ||||||
|                          .WithContent($"❌ An error occured while connecting to your Channel: ``{ex.Message}``") |                          .WithContent($"❌ An error occured while connecting to your Channel: ``{ex.Message}``") | ||||||
|                           ); |                           ); | ||||||
|                         return; |                     sw.Stop(); | ||||||
|  |                     _logger.LogDebug($"Command {ctx.CommandName} took {sw.ElapsedMilliseconds}ms to execute."); | ||||||
|  |                     return; | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
| @@ -148,7 +164,9 @@ namespace TomatenMusic.Commands | |||||||
|                     .AddEmbed(Common.AsEmbed(track, player.PlayerQueue.LoopType, 0))); |                     .AddEmbed(Common.AsEmbed(track, player.PlayerQueue.LoopType, 0))); | ||||||
|  |  | ||||||
|                 await player.PlayNowAsync(response.Track); |                 await player.PlayNowAsync(response.Track); | ||||||
|             } |             sw.Stop(); | ||||||
|  |             _logger.LogDebug($"Command {ctx.CommandName} took {sw.ElapsedMilliseconds}ms to execute."); | ||||||
|  |         } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         [SlashCommandGroup("play", "Queues or plays the Song")] |         [SlashCommandGroup("play", "Queues or plays the Song")] | ||||||
| @@ -172,7 +190,9 @@ namespace TomatenMusic.Commands | |||||||
|             [OnlyGuildCheck] |             [OnlyGuildCheck] | ||||||
|             public async Task PlayQueryCommand(InteractionContext ctx, [Option("query", "The song search query.")] string query) |             public async Task PlayQueryCommand(InteractionContext ctx, [Option("query", "The song search query.")] string query) | ||||||
|             { |             { | ||||||
|                 await ctx.DeferAsync(true); |             var sw = Stopwatch.StartNew(); | ||||||
|  |  | ||||||
|  |             await ctx.DeferAsync(true); | ||||||
|  |  | ||||||
|                 GuildPlayer player = (GuildPlayer)_audioService.GetPlayer(ctx.Guild.Id); |                 GuildPlayer player = (GuildPlayer)_audioService.GetPlayer(ctx.Guild.Id); | ||||||
|  |  | ||||||
| @@ -187,7 +207,9 @@ namespace TomatenMusic.Commands | |||||||
|                     await ctx.EditResponseAsync(new DiscordWebhookBuilder() |                     await ctx.EditResponseAsync(new DiscordWebhookBuilder() | ||||||
|                      .WithContent($"❌ An error occured while resolving your query: ``{ex.Message}``, ```{ex.StackTrace}```") |                      .WithContent($"❌ An error occured while resolving your query: ``{ex.Message}``, ```{ex.StackTrace}```") | ||||||
|                       ); |                       ); | ||||||
|                     return; |                 sw.Stop(); | ||||||
|  |                 _logger.LogDebug($"Command {ctx.CommandName} took {sw.ElapsedMilliseconds}ms to execute."); | ||||||
|  |                 return; | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 try |                 try | ||||||
| @@ -202,7 +224,9 @@ namespace TomatenMusic.Commands | |||||||
|                         await ctx.EditResponseAsync(new DiscordWebhookBuilder() |                         await ctx.EditResponseAsync(new DiscordWebhookBuilder() | ||||||
|                          .WithContent($"❌ An error occured while connecting to your Channel: ``{ex.Message}``") |                          .WithContent($"❌ An error occured while connecting to your Channel: ``{ex.Message}``") | ||||||
|                           ); |                           ); | ||||||
|                         return; |                     sw.Stop(); | ||||||
|  |                     _logger.LogDebug($"Command {ctx.CommandName} took {sw.ElapsedMilliseconds}ms to execute."); | ||||||
|  |                     return; | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
| @@ -233,9 +257,13 @@ namespace TomatenMusic.Commands | |||||||
|                     await ctx.EditResponseAsync(new DiscordWebhookBuilder() |                     await ctx.EditResponseAsync(new DiscordWebhookBuilder() | ||||||
|                      .WithContent($"❌ An error occured while playing your Track: ``{ex.Message}``, ```{ex.StackTrace}```") |                      .WithContent($"❌ An error occured while playing your Track: ``{ex.Message}``, ```{ex.StackTrace}```") | ||||||
|                       ); |                       ); | ||||||
|                     return; |                 sw.Stop(); | ||||||
|  |                 _logger.LogDebug($"Command {ctx.CommandName} took {sw.ElapsedMilliseconds}ms to execute."); | ||||||
|  |                 return; | ||||||
|                 } |                 } | ||||||
|             } |             sw.Stop(); | ||||||
|  |             _logger.LogDebug($"Command {ctx.CommandName} took {sw.ElapsedMilliseconds}ms to execute."); | ||||||
|  |         } | ||||||
|  |  | ||||||
|             [SlashCommand("file", "Play a song file. (mp3/mp4)")] |             [SlashCommand("file", "Play a song file. (mp3/mp4)")] | ||||||
|             [UserInVoiceChannelCheck] |             [UserInVoiceChannelCheck] | ||||||
| @@ -243,8 +271,9 @@ namespace TomatenMusic.Commands | |||||||
|             [OnlyGuildCheck] |             [OnlyGuildCheck] | ||||||
|             public async Task PlayFileCommand(InteractionContext ctx, [Option("File", "The File that should be played.")] DiscordAttachment file) |             public async Task PlayFileCommand(InteractionContext ctx, [Option("File", "The File that should be played.")] DiscordAttachment file) | ||||||
|             { |             { | ||||||
|  |             var sw = Stopwatch.StartNew(); | ||||||
|  |  | ||||||
|                 await ctx.DeferAsync(true); |             await ctx.DeferAsync(true); | ||||||
|  |  | ||||||
|                 GuildPlayer player = (GuildPlayer)_audioService.GetPlayer(ctx.Guild.Id); |                 GuildPlayer player = (GuildPlayer)_audioService.GetPlayer(ctx.Guild.Id); | ||||||
|  |  | ||||||
| @@ -259,7 +288,9 @@ namespace TomatenMusic.Commands | |||||||
|                     await ctx.EditResponseAsync(new DiscordWebhookBuilder() |                     await ctx.EditResponseAsync(new DiscordWebhookBuilder() | ||||||
|                      .WithContent($"❌ An error occured while resolving your file: ``{ex.Message}``") |                      .WithContent($"❌ An error occured while resolving your file: ``{ex.Message}``") | ||||||
|                       ); |                       ); | ||||||
|                     return; |                 sw.Stop(); | ||||||
|  |                 _logger.LogDebug($"Command {ctx.CommandName} took {sw.ElapsedMilliseconds}ms to execute."); | ||||||
|  |                 return; | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 try |                 try | ||||||
| @@ -274,7 +305,9 @@ namespace TomatenMusic.Commands | |||||||
|                         await ctx.EditResponseAsync(new DiscordWebhookBuilder() |                         await ctx.EditResponseAsync(new DiscordWebhookBuilder() | ||||||
|                          .WithContent($"❌ An error occured while connecting to your Channel: ``{ex.Message}``") |                          .WithContent($"❌ An error occured while connecting to your Channel: ``{ex.Message}``") | ||||||
|                           ); |                           ); | ||||||
|                         return; |                     sw.Stop(); | ||||||
|  |                     _logger.LogDebug($"Command {ctx.CommandName} took {sw.ElapsedMilliseconds}ms to execute."); | ||||||
|  |                     return; | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
| @@ -284,6 +317,9 @@ namespace TomatenMusic.Commands | |||||||
|                     .AddEmbed(Common.AsEmbed(track, player.PlayerQueue.LoopType, player.State == PlayerState.NotPlaying ? 0 : player.PlayerQueue.Queue.Count + 1))); |                     .AddEmbed(Common.AsEmbed(track, player.PlayerQueue.LoopType, player.State == PlayerState.NotPlaying ? 0 : player.PlayerQueue.Queue.Count + 1))); | ||||||
|  |  | ||||||
|                 await player.PlayAsync(response.Track); |                 await player.PlayAsync(response.Track); | ||||||
|  |  | ||||||
|  |             sw.Stop(); | ||||||
|  |             _logger.LogDebug($"Command {ctx.CommandName} took {sw.ElapsedMilliseconds}ms to execute."); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -34,7 +34,7 @@ namespace TomatenMusic.Music.Entitites | |||||||
|         public int SpotifyPopularity { get; set; } |         public int SpotifyPopularity { get; set; } | ||||||
|         public Uri SpotifyUri { get; set; } |         public Uri SpotifyUri { get; set; } | ||||||
|  |  | ||||||
|         public static async Task<LavalinkTrack> PopulateAsync(LavalinkTrack track, string spotifyIdentifier = null) |         public static async Task<LavalinkTrack> PopulateAsync(LavalinkTrack track, FullTrack spotifyTrack = null, string spotifyId = null) | ||||||
|         { |         { | ||||||
|             FullTrackContext context = (FullTrackContext)track.Context; |             FullTrackContext context = (FullTrackContext)track.Context; | ||||||
|  |  | ||||||
| @@ -43,11 +43,15 @@ namespace TomatenMusic.Music.Entitites | |||||||
|  |  | ||||||
|             var spotifyService = TomatenMusicBot.ServiceProvider.GetRequiredService<ISpotifyService>(); |             var spotifyService = TomatenMusicBot.ServiceProvider.GetRequiredService<ISpotifyService>(); | ||||||
|             var youtubeService = TomatenMusicBot.ServiceProvider.GetRequiredService<YoutubeService>(); |             var youtubeService = TomatenMusicBot.ServiceProvider.GetRequiredService<YoutubeService>(); | ||||||
|             context.SpotifyIdentifier = spotifyIdentifier; |             if (spotifyId != null) | ||||||
|             context.YoutubeUri = new Uri($"https://youtu.be/{track.TrackIdentifier}"); |                 context.SpotifyIdentifier = spotifyId; | ||||||
|  |             else if (spotifyTrack != null) | ||||||
|  |                 context.SpotifyIdentifier = spotifyTrack.Id; | ||||||
|  |                  | ||||||
|  |             context.YoutubeUri = new Uri(track.Source); | ||||||
|             track.Context = context; |             track.Context = context; | ||||||
|             await youtubeService.PopulateTrackInfoAsync(track); |             await youtubeService.PopulateTrackInfoAsync(track); | ||||||
|             await spotifyService.PopulateTrackAsync(track); |             await spotifyService.PopulateTrackAsync(track, spotifyTrack); | ||||||
|              |              | ||||||
|             return track; |             return track; | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -11,6 +11,7 @@ using TomatenMusic.Services; | |||||||
| using TomatenMusic.Music; | using TomatenMusic.Music; | ||||||
| using Lavalink4NET; | using Lavalink4NET; | ||||||
| using Lavalink4NET.Player; | using Lavalink4NET.Player; | ||||||
|  | using System.Runtime.Caching; | ||||||
|  |  | ||||||
| namespace TomatenMusic.Services | namespace TomatenMusic.Services | ||||||
| { | { | ||||||
| @@ -18,9 +19,9 @@ namespace TomatenMusic.Services | |||||||
|     public interface ISpotifyService |     public interface ISpotifyService | ||||||
|     { |     { | ||||||
|         public Task<MusicActionResponse> ConvertURL(string url); |         public Task<MusicActionResponse> ConvertURL(string url); | ||||||
|         public Task<SpotifyPlaylist> PopulateSpotifyPlaylistAsync(SpotifyPlaylist playlist); |         public Task<SpotifyPlaylist> PopulateSpotifyPlaylistAsync(SpotifyPlaylist playlist, FullPlaylist spotifyPlaylist = null); | ||||||
|         public Task<SpotifyPlaylist> PopulateSpotifyAlbumAsync(SpotifyPlaylist playlist); |         public Task<SpotifyPlaylist> PopulateSpotifyAlbumAsync(SpotifyPlaylist playlist, FullAlbum spotifyAlbum = null); | ||||||
|         public Task<LavalinkTrack> PopulateTrackAsync(LavalinkTrack track); |         public Task<LavalinkTrack> PopulateTrackAsync(LavalinkTrack track, FullTrack spotifyFullTrack = null); | ||||||
|  |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -29,10 +30,13 @@ namespace TomatenMusic.Services | |||||||
|         public ILogger _logger { get; set; } |         public ILogger _logger { get; set; } | ||||||
|         public IAudioService _audioService { get; set; } |         public IAudioService _audioService { get; set; } | ||||||
|  |  | ||||||
|  |         public ObjectCache Cache { get; set; } | ||||||
|  |  | ||||||
|         public SpotifyService(SpotifyClientConfig config, ILogger<SpotifyService> logger, IAudioService audioService) : base(config) |         public SpotifyService(SpotifyClientConfig config, ILogger<SpotifyService> logger, IAudioService audioService) : base(config) | ||||||
|         { |         { | ||||||
|             _logger = logger; |             _logger = logger; | ||||||
|             _audioService = audioService; |             _audioService = audioService; | ||||||
|  |             Cache = MemoryCache.Default; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public async Task<MusicActionResponse> ConvertURL(string url) |         public async Task<MusicActionResponse> ConvertURL(string url) | ||||||
| @@ -43,9 +47,11 @@ namespace TomatenMusic.Services | |||||||
|                 .Replace("https://open.spotify.com/playlist/", "") |                 .Replace("https://open.spotify.com/playlist/", "") | ||||||
|                 .Substring(0, 22); |                 .Substring(0, 22); | ||||||
|  |  | ||||||
|  |             _logger.LogDebug($"Starting spotify conversion for: {url}"); | ||||||
|  |  | ||||||
|             if (url.StartsWith("https://open.spotify.com/track")) |             if (url.StartsWith("https://open.spotify.com/track")) | ||||||
|             { |             { | ||||||
|                 FullTrack sTrack = await Tracks.Get(trackId); |                 FullTrack sTrack = Cache.Contains(trackId) ? Cache.Get(trackId) as FullTrack : await Tracks.Get(trackId); | ||||||
|  |  | ||||||
|                 _logger.LogInformation($"Searching youtube from spotify with query: {sTrack.Name} {String.Join(" ", sTrack.Artists)}"); |                 _logger.LogInformation($"Searching youtube from spotify with query: {sTrack.Name} {String.Join(" ", sTrack.Artists)}"); | ||||||
|  |  | ||||||
| @@ -53,39 +59,43 @@ namespace TomatenMusic.Services | |||||||
|  |  | ||||||
|                 if (track == null) throw new ArgumentException("This Spotify Track was not found on Youtube"); |                 if (track == null) throw new ArgumentException("This Spotify Track was not found on Youtube"); | ||||||
|  |  | ||||||
|                 return new MusicActionResponse(await FullTrackContext.PopulateAsync(track, trackId)); |                 Cache.Add(trackId, sTrack, DateTimeOffset.MaxValue); | ||||||
|  |  | ||||||
|  |                 return new MusicActionResponse(await FullTrackContext.PopulateAsync(track, sTrack)); | ||||||
|  |  | ||||||
|             } |             } | ||||||
|             else if (url.StartsWith("https://open.spotify.com/album")) |             else if (url.StartsWith("https://open.spotify.com/album")) | ||||||
|             { |             { | ||||||
|                 List<LavalinkTrack> tracks = new List<LavalinkTrack>(); |                 List<LavalinkTrack> tracks = new List<LavalinkTrack>(); | ||||||
|  |  | ||||||
|                 FullAlbum album = await Albums.Get(trackId); |                 FullAlbum album = Cache.Contains(trackId) ? Cache.Get(trackId) as FullAlbum : await Albums.Get(trackId); | ||||||
|  |  | ||||||
|                 foreach (var sTrack in await PaginateAll(album.Tracks)) |                 foreach (var sTrack in await PaginateAll(album.Tracks)) | ||||||
|                 { |                 { | ||||||
|                     _logger.LogInformation($"Searching youtube from spotify with query: {sTrack.Name} {String.Join(" ", sTrack.Artists.ConvertAll(artist => artist.Name))}"); |                     _logger.LogInformation($"Searching youtube from spotify with query: {sTrack.Name} {String.Join(" ", sTrack.Artists.ConvertAll(artist => artist.Name))}"); | ||||||
|  |  | ||||||
|                     var track = await _audioService.GetTrackAsync($"{sTrack.Name} {String.Join(" ", sTrack.Artists.ConvertAll(artist => artist.Name))}", Lavalink4NET.Rest.SearchMode.YouTube); |                     var track = await _audioService.GetTrackAsync($"{sTrack.Name} {String.Join(" ", sTrack.Artists.ConvertAll(artist => artist.Name))}", Lavalink4NET.Rest.SearchMode.YouTube); | ||||||
|  |  | ||||||
|                     if (track == null) throw new ArgumentException("This Spotify Track was not found on Youtube"); |                     if (track == null) throw new ArgumentException("This Spotify Track was not found on Youtube"); | ||||||
|  |                      | ||||||
|                     tracks.Add(await FullTrackContext.PopulateAsync(track, sTrack.Uri.Replace("spotify:track:", ""))); |                     tracks.Add(await FullTrackContext.PopulateAsync(track, spotifyId: sTrack.Uri.Replace("spotify:track:", ""))); | ||||||
|                 } |                 } | ||||||
|                 Uri uri; |                 Uri uri; | ||||||
|                 Uri.TryCreate(url, UriKind.Absolute, out uri); |                 Uri.TryCreate(url, UriKind.Absolute, out uri); | ||||||
|  |  | ||||||
|                 SpotifyPlaylist playlist = new SpotifyPlaylist(album.Name, album.Id, tracks, uri); |                 SpotifyPlaylist playlist = new SpotifyPlaylist(album.Name, album.Id, tracks, uri); | ||||||
|                 await PopulateSpotifyAlbumAsync(playlist); |                 await PopulateSpotifyAlbumAsync(playlist, album); | ||||||
|  |  | ||||||
|  |                 Cache.Add(trackId, album, DateTimeOffset.MaxValue); | ||||||
|  |  | ||||||
|                 return new MusicActionResponse(playlist: playlist); |                 return new MusicActionResponse(playlist: playlist); | ||||||
|  |  | ||||||
|             } |             } | ||||||
|             else if (url.StartsWith("https://open.spotify.com/playlist")) |             else if (url.StartsWith("https://open.spotify.com/playlist")) | ||||||
|             { |             { | ||||||
|  |  | ||||||
|                 List<LavalinkTrack> tracks = new List<LavalinkTrack>(); |                 List<LavalinkTrack> tracks = new List<LavalinkTrack>(); | ||||||
|  |  | ||||||
|                 FullPlaylist spotifyPlaylist = await Playlists.Get(trackId); |                 FullPlaylist spotifyPlaylist = Cache.Contains(trackId) ? Cache.Get(trackId) as FullPlaylist : await Playlists.Get(trackId); | ||||||
|                  |                  | ||||||
|                 foreach (var sTrack in await PaginateAll(spotifyPlaylist.Tracks)) |                 foreach (var sTrack in await PaginateAll(spotifyPlaylist.Tracks)) | ||||||
|                 { |                 { | ||||||
| @@ -98,23 +108,28 @@ namespace TomatenMusic.Services | |||||||
|  |  | ||||||
|                         if (track == null) throw new ArgumentException("This Spotify Track was not found on Youtube"); |                         if (track == null) throw new ArgumentException("This Spotify Track was not found on Youtube"); | ||||||
|  |  | ||||||
|                         tracks.Add(await FullTrackContext.PopulateAsync(track, fullTrack.Uri.Replace("spotify:track:", ""))); |                         tracks.Add(await FullTrackContext.PopulateAsync(track, fullTrack)); | ||||||
|                     } |                     } | ||||||
|  |  | ||||||
|                 } |                 } | ||||||
|                 Uri uri; |                 Uri uri; | ||||||
|                 Uri.TryCreate(url, UriKind.Absolute, out uri); |                 Uri.TryCreate(url, UriKind.Absolute, out uri); | ||||||
|                 SpotifyPlaylist playlist = new SpotifyPlaylist(spotifyPlaylist.Name, spotifyPlaylist.Id, tracks, uri); |                 SpotifyPlaylist playlist = new SpotifyPlaylist(spotifyPlaylist.Name, spotifyPlaylist.Id, tracks, uri); | ||||||
|                 await PopulateSpotifyPlaylistAsync(playlist); |                 await PopulateSpotifyPlaylistAsync(playlist, spotifyPlaylist); | ||||||
|  |  | ||||||
|  |                 Cache.Add(trackId, spotifyPlaylist, DateTimeOffset.MaxValue); | ||||||
|  |  | ||||||
|                 return new MusicActionResponse(playlist: playlist); |                 return new MusicActionResponse(playlist: playlist); | ||||||
|             } |             } | ||||||
|             return null; |             return null; | ||||||
|         } |         } | ||||||
|     |     | ||||||
|         public async Task<SpotifyPlaylist> PopulateSpotifyPlaylistAsync(SpotifyPlaylist playlist) |         public async Task<SpotifyPlaylist> PopulateSpotifyPlaylistAsync(SpotifyPlaylist playlist, FullPlaylist spotifyPlaylist = null) | ||||||
|         { |         { | ||||||
|             var list = await this.Playlists.Get(playlist.Identifier); |             FullPlaylist list = spotifyPlaylist; | ||||||
|  |             if (list == null)  | ||||||
|  |                 list = await this.Playlists.Get(playlist.Identifier); | ||||||
|  |  | ||||||
|             string desc = list.Description; |             string desc = list.Description; | ||||||
|  |  | ||||||
|             playlist.Description = desc.Substring(0, Math.Min(desc.Length, 1024)) + (desc.Length > 1020 ? "..." : " "); |             playlist.Description = desc.Substring(0, Math.Min(desc.Length, 1024)) + (desc.Length > 1020 ? "..." : " "); | ||||||
| @@ -134,9 +149,12 @@ namespace TomatenMusic.Services | |||||||
|             return playlist; |             return playlist; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public async Task<SpotifyPlaylist> PopulateSpotifyAlbumAsync(SpotifyPlaylist playlist) |         public async Task<SpotifyPlaylist> PopulateSpotifyAlbumAsync(SpotifyPlaylist playlist, FullAlbum spotifyAlbum = null) | ||||||
|         { |         { | ||||||
|             var list = await this.Albums.Get(playlist.Identifier); |             FullAlbum list = spotifyAlbum; | ||||||
|  |             if (list == null) | ||||||
|  |                 list = await this.Albums.Get(playlist.Identifier); | ||||||
|  |  | ||||||
|             string desc = list.Label; |             string desc = list.Label; | ||||||
|  |  | ||||||
|             playlist.Description = desc.Substring(0, Math.Min(desc.Length, 1024)) + (desc.Length > 1020 ? "..." : " "); |             playlist.Description = desc.Substring(0, Math.Min(desc.Length, 1024)) + (desc.Length > 1020 ? "..." : " "); | ||||||
| @@ -148,13 +166,15 @@ namespace TomatenMusic.Services | |||||||
|             return playlist; |             return playlist; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public async Task<LavalinkTrack> PopulateTrackAsync(LavalinkTrack track) |         public async Task<LavalinkTrack> PopulateTrackAsync(LavalinkTrack track, FullTrack spotifyFullTrack) | ||||||
|         { |         { | ||||||
|             FullTrackContext context = (FullTrackContext)track.Context; |             FullTrackContext context = (FullTrackContext)track.Context; | ||||||
|             if (context.SpotifyIdentifier == null) |             if (context.SpotifyIdentifier == null) | ||||||
|                 return track; |                 return track; | ||||||
|  |  | ||||||
|             var spotifyTrack = await this.Tracks.Get(context.SpotifyIdentifier); |             FullTrack spotifyTrack = spotifyFullTrack; | ||||||
|  |             if (spotifyTrack == null) | ||||||
|  |                 spotifyTrack = await Tracks.Get(context.SpotifyIdentifier); | ||||||
|  |  | ||||||
|             context.SpotifyAlbum = spotifyTrack.Album; |             context.SpotifyAlbum = spotifyTrack.Album; | ||||||
|             context.SpotifyArtists = spotifyTrack.Artists; |             context.SpotifyArtists = spotifyTrack.Artists; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user