diff --git a/GitVersion.yml b/GitVersion.yml index ed16160..ad1bdae 100644 --- a/GitVersion.yml +++ b/GitVersion.yml @@ -1,5 +1,29 @@ mode: ContinuousDelivery -branches: {} +branches: + main: + regex: ^master$|^main$ + mode: ContinuousDelivery + tag: '' + increment: None + prevent-increment-of-merged-branch-version: true + track-merge-target: false + source-branches: [ 'develop', 'release' ] + tracks-release-branches: false + is-release-branch: true + is-mainline: true + pre-release-weight: 55000 + develop: + regex: ^dev(elop)?(ment)?$ + mode: ContinuousDeployment + tag: pre + increment: None + prevent-increment-of-merged-branch-version: false + track-merge-target: true + source-branches: [] + tracks-release-branches: true + is-release-branch: false + is-mainline: false + pre-release-weight: 0 ignore: sha: [] merge-message-formats: {} diff --git a/TomatenMusic/config.json b/TomatenMusic/config.json index 650b90c..ae2595d 100644 --- a/TomatenMusic/config.json +++ b/TomatenMusic/config.json @@ -1,8 +1,8 @@ { - "TOKEN": "YOUR_BOT_TOKEN", + "TOKEN": "Bot_Token", "LavaLinkPassword": " ", "SpotifyClientId": " ", "SpotifyClientSecret": " ", "YoutubeApiKey": " " - } + diff --git a/TomatenMusicCore/Commands/PlayCommandGroup.cs b/TomatenMusicCore/Commands/PlayCommandGroup.cs index 389dff6..bf8799f 100644 --- a/TomatenMusicCore/Commands/PlayCommandGroup.cs +++ b/TomatenMusicCore/Commands/PlayCommandGroup.cs @@ -206,14 +206,14 @@ namespace TomatenMusic.Commands } } - try + try { if (response.isPlaylist) { LavalinkPlaylist playlist = response.Playlist; await player.PlayPlaylistAsync(playlist); - _ = ctx.EditResponseAsync(new DiscordWebhookBuilder().WithContent("Now Playing:").AddEmbed( + await ctx.EditResponseAsync(new DiscordWebhookBuilder().WithContent("Now Playing:").AddEmbed( Common.AsEmbed(playlist) )); @@ -231,7 +231,7 @@ namespace TomatenMusic.Commands catch (Exception ex) { await ctx.EditResponseAsync(new DiscordWebhookBuilder() - .WithContent($"❌ An error occured while playing your Track: ``{ex.Message}``") + .WithContent($"❌ An error occured while playing your Track: ``{ex.Message}``, ```{ex.StackTrace}```") ); return; } diff --git a/TomatenMusicCore/Music/PlayerQueue.cs b/TomatenMusicCore/Music/PlayerQueue.cs index ce90a26..9ab8453 100644 --- a/TomatenMusicCore/Music/PlayerQueue.cs +++ b/TomatenMusicCore/Music/PlayerQueue.cs @@ -40,8 +40,10 @@ namespace TomatenMusic.Music { return Task.Run(() => { - if (CurrentPlaylist == null) + if (CurrentPlaylist == null && Queue.Count == 0) CurrentPlaylist = playlist; + else + CurrentPlaylist = null; _logger.LogInformation("Queued Playlist {0}", playlist.Name); foreach (LavalinkTrack track in playlist.Tracks) diff --git a/TomatenMusicCore/Services/SpotifyService.cs b/TomatenMusicCore/Services/SpotifyService.cs index 9fff28d..fe36a3e 100644 --- a/TomatenMusicCore/Services/SpotifyService.cs +++ b/TomatenMusicCore/Services/SpotifyService.cs @@ -70,7 +70,7 @@ namespace TomatenMusic.Services if (track == null) throw new ArgumentException("This Spotify Track was not found on Youtube"); - tracks.Add(await FullTrackContext.PopulateAsync(track, sTrack.Uri)); + tracks.Add(await FullTrackContext.PopulateAsync(track, sTrack.Uri.Replace("spotify:track:", ""))); } Uri uri; Uri.TryCreate(url, UriKind.Absolute, out uri); @@ -98,7 +98,7 @@ namespace TomatenMusic.Services if (track == null) throw new ArgumentException("This Spotify Track was not found on Youtube"); - tracks.Add(await FullTrackContext.PopulateAsync(track, fullTrack.Uri)); + tracks.Add(await FullTrackContext.PopulateAsync(track, fullTrack.Uri.Replace("spotify:track:", ""))); } } @@ -115,23 +115,35 @@ namespace TomatenMusic.Services public async Task PopulateSpotifyPlaylistAsync(SpotifyPlaylist playlist) { var list = await this.Playlists.Get(playlist.Identifier); - playlist.Description = list.Description; - playlist.AuthorUri = new Uri(list.Owner.Uri); + string desc = list.Description; + + playlist.Description = desc.Substring(0, Math.Min(desc.Length, 1024)) + (desc.Length > 1020 ? "..." : " "); + if (playlist.Description.Length < 2) + playlist.Description = "None"; + + playlist.AuthorUri = new Uri($"https://open.spotify.com/user/{list.Owner.Id}"); playlist.AuthorName = list.Owner.DisplayName; playlist.Followers = list.Followers.Total; - playlist.Url = new Uri(list.Uri); - playlist.AuthorThumbnail = new Uri(list.Owner.Images.First().Url); + playlist.Url = new Uri($"https://open.spotify.com/playlist/{playlist.Identifier}"); + try + { + playlist.AuthorThumbnail = new Uri(list.Owner.Images.First().Url); + } + catch (Exception ex) { } + return playlist; } public async Task PopulateSpotifyAlbumAsync(SpotifyPlaylist playlist) { var list = await this.Albums.Get(playlist.Identifier); - playlist.Description = list.Label; - playlist.AuthorUri = new Uri(list.Artists.First().Uri); + string desc = list.Label; + + playlist.Description = desc.Substring(0, Math.Min(desc.Length, 1024)) + (desc.Length > 1020 ? "..." : " "); + playlist.AuthorUri = new Uri($"https://open.spotify.com/user/{list.Artists.First().Uri}"); playlist.AuthorName = list.Artists.First().Name; playlist.Followers = list.Popularity; - playlist.Url = new Uri(list.Uri); + playlist.Url = new Uri($"https://open.spotify.com/album/{playlist.Identifier}"); return playlist; } @@ -147,7 +159,7 @@ namespace TomatenMusic.Services context.SpotifyAlbum = spotifyTrack.Album; context.SpotifyArtists = spotifyTrack.Artists; context.SpotifyPopularity = spotifyTrack.Popularity; - context.SpotifyUri = new Uri(spotifyTrack.Uri); + context.SpotifyUri = new Uri($"https://open.spotify.com/track/{context.SpotifyIdentifier}"); track.Context = context; return track; diff --git a/TomatenMusicCore/Music/TrackProvider.cs b/TomatenMusicCore/Services/TrackProvider.cs similarity index 96% rename from TomatenMusicCore/Music/TrackProvider.cs rename to TomatenMusicCore/Services/TrackProvider.cs index 652ca9e..3c5f389 100644 --- a/TomatenMusicCore/Music/TrackProvider.cs +++ b/TomatenMusicCore/Services/TrackProvider.cs @@ -41,6 +41,8 @@ namespace TomatenMusic.Music else loadResult = await _audioService.LoadTracksAsync(query, SearchMode.YouTube); + if (uri != null && uri.AbsolutePath.Contains(".")) + return await SearchAsync(uri); if (loadResult.LoadType == TrackLoadType.LoadFailed) throw new ArgumentException("Track loading failed"); diff --git a/TomatenMusicCore/Services/YoutubeService.cs b/TomatenMusicCore/Services/YoutubeService.cs index 12bf269..1adfd6a 100644 --- a/TomatenMusicCore/Services/YoutubeService.cs +++ b/TomatenMusicCore/Services/YoutubeService.cs @@ -39,7 +39,9 @@ namespace TomatenMusic.Services context.YoutubeAuthorSubs = (ulong) channel.Statistics.SubscriberCount; context.YoutubeAuthorThumbnail = new Uri(channel.Snippet.Thumbnails.High.Url); context.YoutubeAuthorUri = new Uri($"https://www.youtube.com/channel/{channel.Id}"); - context.YoutubeDescription = video.Snippet.Description; + string desc = video.Snippet.Description; + + context.YoutubeDescription = desc.Substring(0, Math.Min(desc.Length, 1024)) + (desc.Length > 1020 ? "..." : " "); if (video.Statistics.LikeCount != null) context.YoutubeLikes = (ulong) video.Statistics.LikeCount; context.YoutubeTags = video.Snippet.Tags; @@ -66,7 +68,10 @@ namespace TomatenMusic.Services string desc = list.Snippet.Description; - playlist.Description = desc.Substring(0, Math.Min(desc.Length, 4092)) + (desc.Length > 4092 ? "..." : " "); + playlist.Description = desc.Substring(0, Math.Min(desc.Length, 1024)) + (desc.Length > 1020 ? "..." : " "); + if (playlist.Description == "") + playlist.Description = "None"; + playlist.Thumbnail = new Uri(list.Snippet.Thumbnails.High.Url); playlist.CreationTime = (DateTime)list.Snippet.PublishedAt; playlist.YoutubeItem = list; diff --git a/TomatenMusicCore/TomatenMusicBot.cs b/TomatenMusicCore/TomatenMusicBot.cs index 7180ce7..c460998 100644 --- a/TomatenMusicCore/TomatenMusicBot.cs +++ b/TomatenMusicCore/TomatenMusicBot.cs @@ -4,7 +4,6 @@ using Microsoft.Extensions.Logging; using DSharpPlus; using DSharpPlus.EventArgs; using DSharpPlus.Entities; -using DSharpPlus.Net; using System.Linq; using DSharpPlus.SlashCommands; using DSharpPlus.SlashCommands.EventArgs; @@ -77,7 +76,6 @@ namespace TomatenMusic }) - // Lavalink .AddSingleton() .AddSingleton() .AddSingleton(new InactivityTrackingOptions @@ -114,7 +112,6 @@ namespace TomatenMusic { await BuildServiceProvider(); - //_ = _host.StartAsync(); _host.Start(); var client = ServiceProvider.GetRequiredService(); @@ -126,15 +123,10 @@ namespace TomatenMusic { Services = ServiceProvider }); - /* - slash.RegisterCommands(888493810554900491); - slash.RegisterCommands(888493810554900491); - slash.RegisterCommands(888493810554900491); - - slash.RegisterCommands(835089895092387872); - slash.RegisterCommands(835089895092387872); - slash.RegisterCommands(835089895092387872); - */ + + //slash.RegisterCommands(888493810554900491); + //slash.RegisterCommands(888493810554900491); + //slash.RegisterCommands(888493810554900491); slash.RegisterCommands(); slash.RegisterCommands(); @@ -194,7 +186,7 @@ namespace TomatenMusic if (e.Exception is NotFoundException) logger.LogDebug($"{ ((NotFoundException)e.Exception).JsonMessage }"); if (e.Exception is BadRequestException) - logger.LogDebug($"{ ((BadRequestException)e.Exception).JsonMessage }"); + logger.LogInformation($"{ ((BadRequestException)e.Exception).Errors }"); return Task.CompletedTask; } diff --git a/TomatenMusicCore/Util/Common.cs b/TomatenMusicCore/Util/Common.cs index 4a21db9..8fbcdd3 100644 --- a/TomatenMusicCore/Util/Common.cs +++ b/TomatenMusicCore/Util/Common.cs @@ -104,9 +104,9 @@ namespace TomatenMusic.Util .WithAuthor(playlist.AuthorName, playlist.AuthorUri.ToString(), youtubePlaylist.AuthorThumbnail.ToString()) .WithTitle(playlist.Name) .WithUrl(playlist.Url) - .WithDescription(playlist.Description) + .WithDescription(TrackListString(playlist.Tracks)) .WithImageUrl(youtubePlaylist.Thumbnail) - .AddField("Tracks", TrackListString(playlist.Tracks), false) + .AddField("Description", playlist.Description, false) .AddField("Track Count", $"{playlist.Tracks.Count()} Tracks", true) .AddField("Length", $"{Common.GetTimestamp(playlist.GetLength())}", true) .AddField("Create Date", $"{youtubePlaylist.CreationTime:dd. MMMM, yyyy}", true); @@ -115,17 +115,21 @@ namespace TomatenMusic.Util { SpotifyPlaylist spotifyPlaylist = (SpotifyPlaylist)playlist; builder - .WithAuthor(playlist.AuthorName, playlist.AuthorUri.ToString(), spotifyPlaylist.AuthorThumbnail.ToString()) .WithTitle(playlist.Name) .WithUrl(playlist.Url) - .WithDescription(playlist.Description) - .AddField("Tracks", TrackListString(playlist.Tracks), false) + .WithDescription(TrackListString(playlist.Tracks)) + .AddField("Description", playlist.Description, false) .AddField("Track Count", $"{playlist.Tracks.Count()} Tracks", true) .AddField("Length", $"{Common.GetTimestamp(playlist.GetLength())}", true) .AddField("Spotify Followers", $"{spotifyPlaylist.Followers:N0}", true); + if (spotifyPlaylist.AuthorThumbnail != null) + { + builder.WithAuthor(playlist.AuthorName, playlist.AuthorUri.ToString(), spotifyPlaylist.AuthorThumbnail.ToString()); + }else + builder.WithAuthor(playlist.AuthorName, playlist.AuthorUri.ToString()); } - return builder; + return builder.Build(); } public static DiscordEmbed GetQueueEmbed(GuildPlayer player) @@ -161,9 +165,9 @@ namespace TomatenMusic.Util foreach (LavalinkTrack track in tracks) { FullTrackContext context = (FullTrackContext)track.Context; - if (count > 15) + if (count > 10) { - builder.Append(String.Format("***And {0} more...***", tracks.Count() - 15)); + builder.Append(String.Format("***And {0} more...***", tracks.Count() - 10)); break; } @@ -258,17 +262,18 @@ namespace TomatenMusic.Util FullTrackContext context = (FullTrackContext)track.Context; string progressBar = $"|{ProgressBar((int)player.Position.Position.TotalSeconds, (int)track.Duration.TotalSeconds)}|\n [{Common.GetTimestamp(player.Position.Position)}/{Common.GetTimestamp(track.Duration)}]"; - - builder.WithAuthor(track.Author, context.YoutubeAuthorUri.ToString(), context.YoutubeAuthorThumbnail.ToString()); + + builder.WithAuthor(track.Author); builder.WithTitle(track.Title); - builder.WithUrl(context.YoutubeUri); - builder.WithImageUrl(context.YoutubeThumbnail); + builder.WithUrl(track.Source); builder.WithColor(player.State == PlayerState.Paused ? DiscordColor.Orange : DiscordColor.Green); builder.AddField("Length", Common.GetTimestamp(track.Duration), true); builder.AddField("Loop", player.PlayerQueue.LoopType.ToString(), true); builder.AddField("Progress", progressBar, true); if (!context.IsFile) { + builder.WithAuthor(track.Author, context.YoutubeAuthorUri.ToString(), context.YoutubeAuthorThumbnail.ToString()); + builder.WithImageUrl(context.YoutubeThumbnail); builder.AddField("Views", $"{context.YoutubeViews:N0} Views", true); builder.AddField("Rating", $"{context.YoutubeLikes:N0} 👍", true); builder.AddField("Upload Date", $"{context.YoutubeUploadDate.ToString("dd. MMMM, yyyy")}", true);