Fixed .lo and .lopl

This commit is contained in:
Master Kwoth 2017-07-06 19:20:00 +02:00
parent 88945af60b
commit 1694727ad9
2 changed files with 92 additions and 48 deletions

View File

@ -13,6 +13,8 @@ using Discord.Commands;
using Discord.WebSocket; using Discord.WebSocket;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Net.Http; using System.Net.Http;
using NadekoBot.Services.Impl;
using System.Globalization;
namespace NadekoBot.Services.Music namespace NadekoBot.Services.Music
{ {
@ -232,7 +234,7 @@ namespace NadekoBot.Services.Music
public async Task<SongInfo> ResolveSoundCloudSong(string query, string queuerName) public async Task<SongInfo> ResolveSoundCloudSong(string query, string queuerName)
{ {
var svideo = !_sc.IsSoundCloudLink(query) ? var svideo = !_sc.IsSoundCloudLink(query) ?
await _sc.GetVideoByQueryAsync(query).ConfigureAwait(false): await _sc.GetVideoByQueryAsync(query).ConfigureAwait(false) :
await _sc.ResolveVideoAsync(query).ConfigureAwait(false); await _sc.ResolveVideoAsync(query).ConfigureAwait(false);
if (svideo == null) if (svideo == null)
@ -286,58 +288,93 @@ namespace NadekoBot.Services.Music
} }
} }
public async Task<SongInfo> ResolveYoutubeSong(string query, string queuerName) public Task<SongInfo> ResolveYoutubeSong(string query, string queuerName)
{ {
_log.Info("Getting video"); _log.Info("Getting video");
var (link, video) = await GetYoutubeVideo(query); //var (link, video) = await GetYoutubeVideo(query);
if (video == null) // do something with this error //if (video == null) // do something with this error
//{
// _log.Info("Could not load any video elements based on the query.");
// return null;
//}
////var m = Regex.Match(query, @"\?t=(?<t>\d*)");
////int gotoTime = 0;
////if (m.Captures.Count > 0)
//// int.TryParse(m.Groups["t"].ToString(), out gotoTime);
//_log.Info("Creating song info");
//var song = new SongInfo
//{
// Title = video.Title.Substring(0, video.Title.Length - 10), // removing trailing "- You Tube"
// Provider = "YouTube",
// Uri = async () => {
// var vid = await GetYoutubeVideo(query);
// if (vid.Item2 == null)
// throw new HttpRequestException();
// return await vid.Item2.GetUriAsync();
// },
// Query = link,
// ProviderType = MusicType.YouTube,
// QueuerName = queuerName
//};
return GetYoutubeVideo(query, queuerName);
}
private async Task<SongInfo> GetYoutubeVideo(string query, string queuerName)
{ {
_log.Info("Could not load any video elements based on the query.");
_log.Info("Getting link");
string[] data;
try
{
using (var ytdl = new YtdlOperation())
{
data = (await ytdl.GetDataAsync(query)).Split('\n');
}
if (data.Length < 6)
{
_log.Info("No song found. Data less than 6");
return null; return null;
} }
//var m = Regex.Match(query, @"\?t=(?<t>\d*)"); TimeSpan time;
//int gotoTime = 0; if (!TimeSpan.TryParseExact(data[4], new[] { "m\\:ss", "mm\\:ss", "h\\:mm\\:ss", "hh\\:mm\\:ss", "hhh\\:mm\\:ss" }, CultureInfo.InvariantCulture, out time))
//if (m.Captures.Count > 0) time = TimeSpan.FromHours(24);
// int.TryParse(m.Groups["t"].ToString(), out gotoTime);
_log.Info("Creating song info"); return new SongInfo()
var song = new SongInfo
{ {
Title = video.Title.Substring(0, video.Title.Length - 10), // removing trailing "- You Tube" Title = data[0],
VideoId = data[1],
Uri = () => Task.FromResult(data[2]),
AlbumArt = data[3],
TotalTime = time,
QueuerName = queuerName,
Provider = "YouTube", Provider = "YouTube",
Uri = async () => {
var vid = await GetYoutubeVideo(query);
if (vid.Item2 == null)
throw new HttpRequestException();
return await vid.Item2.GetUriAsync();
},
Query = link,
ProviderType = MusicType.YouTube, ProviderType = MusicType.YouTube,
QueuerName = queuerName Query = "https://youtube.com/watch?v=" + data[1],
}; };
return song; }
catch (Exception ex)
{
_log.Warn(ex);
return null;
} }
private async Task<(string, YouTubeVideo)> GetYoutubeVideo(string query) //if (string.IsNullOrWhiteSpace(link))
{ //{
_log.Info("Getting link"); // _log.Info("No song found.");
var link = (await _google.GetVideoLinksByKeywordAsync(query).ConfigureAwait(false)).FirstOrDefault(); // return (null, null);
if (string.IsNullOrWhiteSpace(link)) //}
{ //_log.Info("Getting all videos");
_log.Info("No song found."); //var allVideos = await Task.Run(async () => { try { return await _yt.GetAllVideosAsync(link).ConfigureAwait(false); } catch { return Enumerable.Empty<YouTubeVideo>(); } }).ConfigureAwait(false);
return (null, null); //var videos = allVideos.Where(v => v.AdaptiveKind == AdaptiveKind.Audio);
} //var video = videos
_log.Info("Getting all videos"); // .Where(v => v.AudioBitrate < 256)
var allVideos = await Task.Run(async () => { try { return await _yt.GetAllVideosAsync(link).ConfigureAwait(false); } catch { return Enumerable.Empty<YouTubeVideo>(); } }).ConfigureAwait(false); // .OrderByDescending(v => v.AudioBitrate)
var videos = allVideos.Where(v => v.AdaptiveKind == AdaptiveKind.Audio); // .FirstOrDefault();
var video = videos
.Where(v => v.AudioBitrate < 256)
.OrderByDescending(v => v.AudioBitrate)
.FirstOrDefault();
return (link, video); //return (link, video);
} }
private bool IsRadioLink(string query) => private bool IsRadioLink(string query) =>

View File

@ -21,11 +21,12 @@ namespace NadekoBot.Services.Music
//private volatile bool restart = false; //private volatile bool restart = false;
public SongBuffer(string songUri, string skipTo) public SongBuffer(string songUri, string skipTo, bool isLocal)
{ {
_log = LogManager.GetCurrentClassLogger(); _log = LogManager.GetCurrentClassLogger();
//_log.Warn(songUri); //_log.Warn(songUri);
this.SongUri = songUri; this.SongUri = songUri;
this._isLocal = isLocal;
this.p = StartFFmpegProcess(songUri, 0); this.p = StartFFmpegProcess(songUri, 0);
var t = Task.Run(() => var t = Task.Run(() =>
@ -38,10 +39,14 @@ namespace NadekoBot.Services.Music
private Process StartFFmpegProcess(string songUri, float skipTo = 0) private Process StartFFmpegProcess(string songUri, float skipTo = 0)
{ {
var args = $"-err_detect ignore_err -i {songUri} -f s16le -ar 48000 -vn -ac 2 pipe:1 -loglevel error";
if (!_isLocal)
args = "-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5 " + args;
return Process.Start(new ProcessStartInfo return Process.Start(new ProcessStartInfo
{ {
FileName = "ffmpeg", FileName = "ffmpeg",
Arguments = $"-err_detect ignore_err -reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5 -i {songUri} -f s16le -ar 48000 -vn -ac 2 pipe:1 -loglevel error", Arguments = args,
UseShellExecute = false, UseShellExecute = false,
RedirectStandardOutput = true, RedirectStandardOutput = true,
RedirectStandardError = true, RedirectStandardError = true,
@ -62,6 +67,8 @@ namespace NadekoBot.Services.Music
} }
private readonly object locker = new object(); private readonly object locker = new object();
private readonly bool _isLocal;
public Task<bool> StartBuffering(CancellationToken cancelToken) public Task<bool> StartBuffering(CancellationToken cancelToken)
{ {
var toReturn = new TaskCompletionSource<bool>(); var toReturn = new TaskCompletionSource<bool>();