Added duration for music files O.O

This commit is contained in:
Kwoth 2016-10-19 12:40:43 +02:00
parent 4428c9d90f
commit 13bac49acc
5 changed files with 85 additions and 5 deletions

View File

@ -243,6 +243,31 @@ namespace NadekoBot.Modules.Music.Classes
}); });
} }
internal async Task UpdateSongDurationsAsync()
{
var curSong = CurrentSong;
var toUpdate = playlist.Where(s => s.SongInfo.ProviderType == MusicType.Normal &&
s.TotalLength == TimeSpan.Zero);
if (curSong != null)
toUpdate = toUpdate.Append(curSong);
var ids = toUpdate.Select(s => s.SongInfo.Query.Substring(s.SongInfo.Query.LastIndexOf("?v=") + 3))
.Distinct();
var durations = await NadekoBot.Google.GetVideoDurationsAsync(ids);
toUpdate.ForEach(s =>
{
foreach (var kvp in durations)
{
if (s.SongInfo.Query.EndsWith(kvp.Key))
{
s.TotalLength = kvp.Value;
return;
}
}
});
}
public void Destroy() public void Destroy()
{ {
actionQueue.Enqueue(async () => actionQueue.Enqueue(async () =>

View File

@ -38,7 +38,14 @@ namespace NadekoBot.Modules.Music.Classes
public string PrettyCurrentTime() public string PrettyCurrentTime()
{ {
var time = TimeSpan.FromSeconds(bytesSent / 3840 / 50); var time = TimeSpan.FromSeconds(bytesSent / 3840 / 50);
return $"【{(int)time.TotalMinutes}m {time.Seconds}s】"; var str = $"【{(int)time.TotalMinutes}m {time.Seconds}s】**/** ";
if (TotalLength == TimeSpan.Zero)
str += "**?**";
else if (TotalLength == TimeSpan.MaxValue)
str += "**∞**";
else
str += $"【{(int)TotalLength.TotalMinutes}m {TotalLength.Seconds}s】";
return str;
} }
const int milliseconds = 20; const int milliseconds = 20;
@ -60,6 +67,8 @@ namespace NadekoBot.Modules.Music.Classes
} }
} }
public TimeSpan TotalLength { get; set; } = TimeSpan.Zero;
public Song(SongInfo songInfo) public Song(SongInfo songInfo)
{ {
this.SongInfo = songInfo; this.SongInfo = songInfo;
@ -263,7 +272,8 @@ namespace NadekoBot.Modules.Music.Classes
Provider = "Radio Stream", Provider = "Radio Stream",
ProviderType = musicType, ProviderType = musicType,
Query = query Query = query
}); })
{ TotalLength = TimeSpan.MaxValue };
} }
if (SoundCloud.Default.IsSoundCloudLink(query)) if (SoundCloud.Default.IsSoundCloudLink(query))
{ {
@ -275,7 +285,8 @@ namespace NadekoBot.Modules.Music.Classes
Uri = svideo.StreamLink, Uri = svideo.StreamLink,
ProviderType = musicType, ProviderType = musicType,
Query = svideo.TrackLink, Query = svideo.TrackLink,
}); })
{ TotalLength = TimeSpan.FromMilliseconds(svideo.Duration) };
} }
if (musicType == MusicType.Soundcloud) if (musicType == MusicType.Soundcloud)
@ -288,7 +299,8 @@ namespace NadekoBot.Modules.Music.Classes
Uri = svideo.StreamLink, Uri = svideo.StreamLink,
ProviderType = MusicType.Normal, ProviderType = MusicType.Normal,
Query = svideo.TrackLink, Query = svideo.TrackLink,
}); })
{ TotalLength = TimeSpan.FromMilliseconds(svideo.Duration) };
} }
var link = (await NadekoBot.Google.GetVideosByKeywordsAsync(query).ConfigureAwait(false)).FirstOrDefault(); var link = (await NadekoBot.Google.GetVideosByKeywordsAsync(query).ConfigureAwait(false)).FirstOrDefault();

View File

@ -141,6 +141,12 @@ namespace NadekoBot.Modules.Music
var currentSong = musicPlayer.CurrentSong; var currentSong = musicPlayer.CurrentSong;
if (currentSong == null) if (currentSong == null)
return; return;
if (currentSong.TotalLength == TimeSpan.Zero)
{
await musicPlayer.UpdateSongDurationsAsync().ConfigureAwait(false);
}
var toSend = $"🎵`Now Playing` {currentSong.PrettyName} " + $"{currentSong.PrettyCurrentTime()}\n"; var toSend = $"🎵`Now Playing` {currentSong.PrettyName} " + $"{currentSong.PrettyCurrentTime()}\n";
if (musicPlayer.RepeatSong) if (musicPlayer.RepeatSong)
toSend += "🔂"; toSend += "🔂";
@ -168,6 +174,11 @@ namespace NadekoBot.Modules.Music
var currentSong = musicPlayer.CurrentSong; var currentSong = musicPlayer.CurrentSong;
if (currentSong == null) if (currentSong == null)
return; return;
if (currentSong.TotalLength == TimeSpan.Zero)
{
await musicPlayer.UpdateSongDurationsAsync().ConfigureAwait(false);
}
await channel.SendMessageAsync($"🎵`Now Playing` {currentSong.PrettyName} " + await channel.SendMessageAsync($"🎵`Now Playing` {currentSong.PrettyName} " +
$"{currentSong.PrettyCurrentTime()}").ConfigureAwait(false); $"{currentSong.PrettyCurrentTime()}").ConfigureAwait(false);
} }

View File

@ -1,4 +1,5 @@
using System.Collections.Generic; using System;
using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace NadekoBot.Services namespace NadekoBot.Services
@ -9,6 +10,7 @@ namespace NadekoBot.Services
Task<IEnumerable<string>> GetPlaylistIdsByKeywordsAsync(string keywords, int count = 1); Task<IEnumerable<string>> GetPlaylistIdsByKeywordsAsync(string keywords, int count = 1);
Task<IEnumerable<string>> GetRelatedVideosAsync(string url, int count = 1); Task<IEnumerable<string>> GetRelatedVideosAsync(string url, int count = 1);
Task<IEnumerable<string>> GetPlaylistTracksAsync(string playlistId, int count = 50); Task<IEnumerable<string>> GetPlaylistTracksAsync(string playlistId, int count = 50);
Task<IReadOnlyDictionary<string, TimeSpan>> GetVideoDurationsAsync(IEnumerable<string> videoIds);
Task<string> ShortenUrl(string url); Task<string> ShortenUrl(string url);
} }

View File

@ -8,6 +8,7 @@ using System.Text.RegularExpressions;
using Google.Apis.Urlshortener.v1; using Google.Apis.Urlshortener.v1;
using Google.Apis.Urlshortener.v1.Data; using Google.Apis.Urlshortener.v1.Data;
using NLog; using NLog;
using System.Collections;
namespace NadekoBot.Services.Impl namespace NadekoBot.Services.Impl
{ {
@ -133,5 +134,34 @@ namespace NadekoBot.Services.Impl
return toReturn; return toReturn;
} }
public async Task<IReadOnlyDictionary<string,TimeSpan>> GetVideoDurationsAsync(IEnumerable<string> videoIds)
{
var videoIdsList = videoIds as List<string> ?? videoIds.ToList();
Dictionary<string, TimeSpan> toReturn = new Dictionary<string, TimeSpan>();
if (!videoIdsList.Any())
return toReturn;
var toGet = 0;
var remaining = videoIdsList.Count;
do
{
toGet = remaining > 50 ? 50 : remaining;
remaining -= toGet;
var q = yt.Videos.List("contentDetails");
q.Id = string.Join(",", videoIds);
var items = (await q.ExecuteAsync().ConfigureAwait(false)).Items;
foreach (var i in items)
{
toReturn.Add(i.Id, System.Xml.XmlConvert.ToTimeSpan(i.ContentDetails.Duration));
}
}
while (remaining > 0);
return toReturn;
}
} }
} }