diff --git a/src/NadekoBot/Modules/Music/Classes/Song.cs b/src/NadekoBot/Modules/Music/Classes/Song.cs
index 2fb7f38b..cd3e47a3 100644
--- a/src/NadekoBot/Modules/Music/Classes/Song.cs
+++ b/src/NadekoBot/Modules/Music/Classes/Song.cs
@@ -11,6 +11,7 @@ using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using VideoLibrary;
+using System.Net;
namespace NadekoBot.Modules.Music.Classes
{
@@ -46,7 +47,25 @@ namespace NadekoBot.Modules.Music.Classes
public string PrettyFullTime => PrettyCurrentTime + " / " + PrettyTotalTime;
- public string PrettyName => $"**[{SongInfo.Title.TrimTo(70)}]({SongInfo.Query})**";
+ //public string PrettyName => $"**[{SongInfo.Title.TrimTo(70)}]({SongInfo.Query})**";
+
+ public string PrettyName {
+ get {
+ switch (SongInfo.ProviderType)
+ {
+ case MusicType.Normal:
+ return $"**[{SongInfo.Title.TrimTo(70)}]({SongInfo.Query})**";
+ case MusicType.Soundcloud:
+ return $"**[{SongInfo.Title.TrimTo(70)}]({SongInfo.Query})**";
+ case MusicType.Local:
+ return $"**{SongInfo.Title.TrimTo(70)}**";
+ case MusicType.Radio:
+ return $"**{SongInfo.Title.TrimTo(70)}**";
+ default:
+ return "";
+ }
+ }
+ }
public string PrettyInfo => $"{PrettyTotalTime} | {PrettyProvider} | {QueuerName}";
@@ -67,16 +86,36 @@ namespace NadekoBot.Modules.Music.Classes
public string Thumbnail {
get {
- switch (SongInfo.ProviderType)
+ switch (SongInfo.Provider)
{
- case MusicType.Normal:
+ case "YouTube":
//todo have videoid in songinfo from the start
var videoId = Regex.Match(SongInfo.Query, "<=v=[a-zA-Z0-9-]+(?=&)|(?<=[0-9])[^&\n]+|(?<=v=)[^&\n]+");
return $"https://img.youtube.com/vi/{ videoId }/0.jpg";
+ case "SoundCloud":
+ return SongInfo.AlbumArt;
+ case "Local File":
+ return $"https://cdn.discordapp.com/attachments/155726317222887425/261850914783100928/1482522077_music.png"; //test links
+ case "Radio Stream":
+ return $"https://cdn.discordapp.com/attachments/155726317222887425/261850925063340032/1482522097_radio.png"; //test links
+ default:
+ return "";
+ }
+ }
+ }
+
+ public string songURL {
+ get {
+ switch (SongInfo.ProviderType)
+ {
+ case MusicType.Normal:
+ return SongInfo.Query;
case MusicType.Soundcloud:
- return SongInfo.AlbumArt;
+ return SongInfo.Query;
case MusicType.Local:
+ return $"https://google.com/search?q={ WebUtility.UrlEncode(SongInfo.Title).Replace(' ', '+') }";
case MusicType.Radio:
+ return $"https://google.com/search?q={SongInfo.Title}";
default:
return "";
}
@@ -104,6 +143,7 @@ namespace NadekoBot.Modules.Music.Classes
{
var s = new Song(SongInfo);
s.MusicPlayer = MusicPlayer;
+ s.QueuerName = QueuerName;
return s;
}
diff --git a/src/NadekoBot/Modules/Music/Music.cs b/src/NadekoBot/Modules/Music/Music.cs
index 2c16f4b0..d68fd191 100644
--- a/src/NadekoBot/Modules/Music/Music.cs
+++ b/src/NadekoBot/Modules/Music/Music.cs
@@ -235,12 +235,12 @@ namespace NadekoBot.Modules.Music
var embed = new EmbedBuilder()
.WithAuthor(eab => eab.WithName("Now Playing")
.WithMusicIcon())
- .WithTitle($"{currentSong.SongInfo.Title}")
+ .WithTitle(currentSong.SongInfo.Title)
.WithDescription(currentSong.PrettyFullTime)
.WithFooter(ef => ef.WithText($"{currentSong.PrettyProvider} | {currentSong.QueuerName}"))
.WithOkColor()
.WithThumbnail(tn => tn.Url = currentSong.Thumbnail)
- .WithUrl(currentSong.SongInfo.Query);
+ .WithUrl(currentSong.songURL);
await channel.EmbedAsync(embed.Build()).ConfigureAwait(false);
}
@@ -327,28 +327,28 @@ namespace NadekoBot.Modules.Music
var count = ids.Count();
var msg = await channel.SendMessageAsync($"🎵 Attempting to queue **{count}** songs".SnPl(count) + "...").ConfigureAwait(false);
-
- var cancelSource = new CancellationTokenSource();
+
+ var cancelSource = new CancellationTokenSource();
var gusr = (IGuildUser)umsg.Author;
-
- while (ids.Any() && !cancelSource.IsCancellationRequested)
+
+ while (ids.Any() && !cancelSource.IsCancellationRequested)
{
var tasks = Task.WhenAll(ids.Take(5).Select(async id =>
{
if (cancelSource.Token.IsCancellationRequested)
- return;
- try
- {
- await QueueSong(gusr, channel, gusr.VoiceChannel, id, true).ConfigureAwait(false);
- }
- catch (SongNotFoundException) { }
- catch { try { cancelSource.Cancel(); } catch { } }
- }));
+ return;
+ try
+ {
+ await QueueSong(gusr, channel, gusr.VoiceChannel, id, true).ConfigureAwait(false);
+ }
+ catch (SongNotFoundException) { }
+ catch { try { cancelSource.Cancel(); } catch { } }
+ }));
- await Task.WhenAny(tasks, Task.Delay(Timeout.Infinite, cancelSource.Token));
- ids = ids.Skip(5);
- }
+ await Task.WhenAny(tasks, Task.Delay(Timeout.Infinite, cancelSource.Token));
+ ids = ids.Skip(5);
+ }
await msg.ModifyAsync(m => m.Content = "✅ Playlist queue complete.").ConfigureAwait(false);
}
@@ -404,7 +404,7 @@ namespace NadekoBot.Modules.Music
var dir = new DirectoryInfo(arg);
var fileEnum = dir.GetFiles("*", SearchOption.AllDirectories)
.Where(x => !x.Attributes.HasFlag(FileAttributes.Hidden | FileAttributes.System));
- var gusr = (IGuildUser)umsg.Author;
+ var gusr = (IGuildUser)umsg.Author;
foreach (var file in fileEnum)
{
try
@@ -486,8 +486,9 @@ namespace NadekoBot.Modules.Music
var embed = new EmbedBuilder()
.WithAuthor(eab => eab.WithName("Song Removed!").WithMusicIcon())
.AddField(fb => fb.WithName("**Song Position**").WithValue($"#{num}").WithIsInline(true))
- .AddField(fb => fb.WithName("**Song Name**").WithValue($"**[{song.SongInfo.Title.TrimTo(70)}]({song.SongInfo.Query})** `{song.PrettyProvider} | {song.QueuerName.TrimTo(15)}`").WithIsInline(true))
- .WithErrorColor();
+ .AddField(fb => fb.WithName("**Song Name**").WithValue(song.PrettyName).WithIsInline(true))
+ .WithFooter(ef => ef.WithText($"{song.PrettyProvider} | {song.QueuerName}"))
+ .WithErrorColor();
await channel.EmbedAsync(embed.Build()).ConfigureAwait(false);
}
@@ -540,11 +541,12 @@ namespace NadekoBot.Modules.Music
playlist.RemoveAt(nn1);
var embed = new EmbedBuilder()
- .WithTitle($"{s.SongInfo.Title.TrimTo(70)}")
- .WithUrl($"{s.SongInfo.Query}")
+ .WithTitle(s.SongInfo.Title.TrimTo(70))
+ .WithUrl(s.SongInfo.Query)
.WithAuthor(eab => eab.WithName("Song Moved").WithMusicIcon())
.AddField(fb => fb.WithName("**From Position**").WithValue($"#{n1}").WithIsInline(true))
.AddField(fb => fb.WithName("**To Position**").WithValue($"#{n2}").WithIsInline(true))
+ .WithFooter(ef => ef.WithText($"{s.PrettyProvider} | {s.QueuerName}"))
.WithOkColor();
await channel.EmbedAsync(embed.Build()).ConfigureAwait(false);
}
@@ -580,7 +582,8 @@ namespace NadekoBot.Modules.Music
await channel.EmbedAsync(new EmbedBuilder()
.WithOkColor()
.WithAuthor(eab => eab.WithMusicIcon().WithName("🔂 Repeating track"))
- .WithDescription(currentSong.PrettyFullName)
+ .WithDescription(currentSong.PrettyName)
+ .WithFooter(ef => ef.WithText(currentSong.PrettyInfo))
.Build()).ConfigureAwait(false);
else
await channel.SendConfirmAsync($"🔂 Current track repeat stopped.")
@@ -655,9 +658,9 @@ namespace NadekoBot.Modules.Music
}
IUserMessage msg = null;
try { msg = await channel.SendMessageAsync($"🎶 Attempting to load **{mpl.Songs.Count}** songs...").ConfigureAwait(false); } catch (Exception ex) { _log.Warn(ex); }
-
- var usr = (IGuildUser)umsg.Author;
- foreach (var item in mpl.Songs)
+
+ var usr = (IGuildUser)umsg.Author;
+ foreach (var item in mpl.Songs)
{
try
{
@@ -688,7 +691,7 @@ namespace NadekoBot.Modules.Music
var embed = new EmbedBuilder()
.WithAuthor(eab => eab.WithName($"Page {num} of Saved Playlists").WithMusicIcon())
- .WithDescription(string.Join("\n", playlists.Select(r => $"`#{r.Id}` - **{r.Name}**\t by **`{r.Author}`**\t ({r.Songs.Count} songs)")))
+ .WithDescription(string.Join("\n", playlists.Select(r => $"`#{r.Id}` - **{r.Name}** by *{r.Author}* ({r.Songs.Count} songs)")))
.WithOkColor();
await channel.EmbedAsync(embed.Build()).ConfigureAwait(false);
@@ -770,41 +773,6 @@ namespace NadekoBot.Modules.Music
await channel.SendConfirmAsync($"Skipped to `{minutes}:{seconds}`").ConfigureAwait(false);
}
- [NadekoCommand, Usage, Description, Aliases]
- [RequireContext(ContextType.Guild)]
- public async Task GetLink(IUserMessage umsg, int index = 0)
- {
- var channel = (ITextChannel)umsg.Channel;
- MusicPlayer musicPlayer;
- if (!MusicPlayers.TryGetValue(channel.Guild.Id, out musicPlayer))
- return;
-
- if (index < 0)
- return;
-
- if (index > 0)
- {
-
- var selSong = musicPlayer.Playlist.DefaultIfEmpty(null).ElementAtOrDefault(index - 1);
- if (selSong == null)
- {
- await channel.SendErrorAsync("Could not select song, likely wrong index");
-
- }
- else
- {
- await channel.SendMessageAsync($"🎶 Selected song **{selSong.SongInfo.Title}**: <{selSong.SongInfo.Query}>").ConfigureAwait(false);
- }
- }
- else
- {
- var curSong = musicPlayer.CurrentSong;
- if (curSong == null)
- return;
- await channel.SendMessageAsync($"🎶 Current song **{curSong.SongInfo.Title}**: <{curSong.SongInfo.Query}>").ConfigureAwait(false);
- }
- }
-
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
public async Task Autoplay(IUserMessage umsg)
@@ -877,8 +845,8 @@ namespace NadekoBot.Modules.Music
playingMessage = await textCh.EmbedAsync(new EmbedBuilder().WithOkColor()
.WithAuthor(eab => eab.WithName("Playing Song").WithMusicIcon())
- .WithDescription($"{song.PrettyName}")
- .WithFooter(ef => ef.WithText($"🔉 {(int)(sender.Volume * 100)}% | {song.PrettyInfo}"))
+ .WithDescription(song.PrettyName)
+ .WithFooter(ef => ef.WithText($"🔉 {(int)(sender.Volume * 100)}% | {song.PrettyInfo}"))
.Build())
.ConfigureAwait(false);
}
@@ -899,7 +867,7 @@ namespace NadekoBot.Modules.Music
pauseMessage = await textCh.SendConfirmAsync("🎵 Music playback **resumed**.").ConfigureAwait(false);
}
if (pauseMessage != null)
- pauseMessage.DeleteAfter(5);
+ pauseMessage.DeleteAfter(15);
}
catch { }
};
@@ -928,9 +896,9 @@ namespace NadekoBot.Modules.Music
//var queuedMessage = await textCh.SendConfirmAsync($"🎵 Queued **{resolvedSong.SongInfo.Title}** at `#{musicPlayer.Playlist.Count + 1}`").ConfigureAwait(false);
var queuedMessage = await textCh.EmbedAsync(new EmbedBuilder().WithOkColor()
.WithAuthor(eab => eab.WithName("Queued Song").WithMusicIcon())
- .WithTitle($"{resolvedSong.SongInfo.Title}")
- .WithDescription($"Queue #{musicPlayer.Playlist.Count + 1}")
- .WithFooter(ef => ef.WithText($"{resolvedSong.PrettyProvider}"))
+ .WithDescription($"{resolvedSong.PrettyName}\nQueue #{musicPlayer.Playlist.Count + 1}")
+ .WithThumbnail(tn => tn.Url = resolvedSong.Thumbnail)
+ .WithFooter(ef => ef.WithText(resolvedSong.PrettyProvider))
.Build())
.ConfigureAwait(false);
if (queuedMessage != null)
diff --git a/src/NadekoBot/Resources/CommandStrings.Designer.cs b/src/NadekoBot/Resources/CommandStrings.Designer.cs
index 35bfb686..e51a9405 100644
--- a/src/NadekoBot/Resources/CommandStrings.Designer.cs
+++ b/src/NadekoBot/Resources/CommandStrings.Designer.cs
@@ -2651,33 +2651,6 @@ namespace NadekoBot.Resources {
}
}
- ///
- /// Looks up a localized string similar to getlink gl.
- ///
- public static string getlink_cmd {
- get {
- return ResourceManager.GetString("getlink_cmd", resourceCulture);
- }
- }
-
- ///
- /// Looks up a localized string similar to Shows a link to the song in the queue by index, or the currently playing song by default..
- ///
- public static string getlink_desc {
- get {
- return ResourceManager.GetString("getlink_desc", resourceCulture);
- }
- }
-
- ///
- /// Looks up a localized string similar to `{0}gl`.
- ///
- public static string getlink_usage {
- get {
- return ResourceManager.GetString("getlink_usage", resourceCulture);
- }
- }
-
///
/// Looks up a localized string similar to give.
///
diff --git a/src/NadekoBot/Resources/CommandStrings.resx b/src/NadekoBot/Resources/CommandStrings.resx
index ee6f9a5a..a75839a5 100644
--- a/src/NadekoBot/Resources/CommandStrings.resx
+++ b/src/NadekoBot/Resources/CommandStrings.resx
@@ -1692,15 +1692,6 @@
`{0}goto 30`
-
- getlink gl
-
-
- Shows a link to the song in the queue by index, or the currently playing song by default.
-
-
- `{0}gl`
-
autoplay ap