Fixed .lo and .lopl
This commit is contained in:
		@@ -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
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -231,8 +233,8 @@ 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)
 | 
				
			||||||
@@ -252,7 +254,7 @@ namespace NadekoBot.Services.Music
 | 
				
			|||||||
                QueuerName = queuerName
 | 
					                QueuerName = queuerName
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public SongInfo ResolveLocalSong(string query, string queuerName)
 | 
					        public SongInfo ResolveLocalSong(string query, string queuerName)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            return new SongInfo
 | 
					            return new SongInfo
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
@@ -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.");
 | 
					            //    _log.Info("Could not load any video elements based on the query.");
 | 
				
			||||||
                return null;
 | 
					            //    return null;
 | 
				
			||||||
            }
 | 
					            //}
 | 
				
			||||||
            //var m = Regex.Match(query, @"\?t=(?<t>\d*)");
 | 
					            ////var m = Regex.Match(query, @"\?t=(?<t>\d*)");
 | 
				
			||||||
            //int gotoTime = 0;
 | 
					            ////int gotoTime = 0;
 | 
				
			||||||
            //if (m.Captures.Count > 0)
 | 
					            ////if (m.Captures.Count > 0)
 | 
				
			||||||
            //    int.TryParse(m.Groups["t"].ToString(), out gotoTime);
 | 
					            ////    int.TryParse(m.Groups["t"].ToString(), out gotoTime);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            _log.Info("Creating song info");
 | 
					            //_log.Info("Creating song info");
 | 
				
			||||||
            var song = new SongInfo
 | 
					            //var song = new SongInfo
 | 
				
			||||||
            {
 | 
					            //{
 | 
				
			||||||
                Title = video.Title.Substring(0, video.Title.Length - 10), // removing trailing "- You Tube"
 | 
					            //    Title = video.Title.Substring(0, video.Title.Length - 10), // removing trailing "- You Tube"
 | 
				
			||||||
                Provider = "YouTube",
 | 
					            //    Provider = "YouTube",
 | 
				
			||||||
                Uri = async () => {
 | 
					            //    Uri = async () => {
 | 
				
			||||||
                    var vid = await GetYoutubeVideo(query);
 | 
					            //        var vid = await GetYoutubeVideo(query);
 | 
				
			||||||
                    if (vid.Item2 == null)
 | 
					            //        if (vid.Item2 == null)
 | 
				
			||||||
                        throw new HttpRequestException();
 | 
					            //            throw new HttpRequestException();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    return await vid.Item2.GetUriAsync();
 | 
					            //        return await vid.Item2.GetUriAsync();
 | 
				
			||||||
                },
 | 
					            //    },
 | 
				
			||||||
                Query = link,
 | 
					            //    Query = link,
 | 
				
			||||||
                ProviderType = MusicType.YouTube,
 | 
					            //    ProviderType = MusicType.YouTube,
 | 
				
			||||||
                QueuerName = queuerName
 | 
					            //    QueuerName = queuerName
 | 
				
			||||||
            };
 | 
					            //};
 | 
				
			||||||
            return song;
 | 
					            return GetYoutubeVideo(query, queuerName);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private async Task<(string, YouTubeVideo)> GetYoutubeVideo(string query)
 | 
					        private async Task<SongInfo> GetYoutubeVideo(string query, string queuerName)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            _log.Info("Getting link");
 | 
					 | 
				
			||||||
            var link = (await _google.GetVideoLinksByKeywordAsync(query).ConfigureAwait(false)).FirstOrDefault();
 | 
					 | 
				
			||||||
            if (string.IsNullOrWhiteSpace(link))
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                _log.Info("No song found.");
 | 
					 | 
				
			||||||
                return (null, null);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            _log.Info("Getting all videos");
 | 
					 | 
				
			||||||
            var allVideos = await Task.Run(async () => { try { return await _yt.GetAllVideosAsync(link).ConfigureAwait(false); } catch { return Enumerable.Empty<YouTubeVideo>(); } }).ConfigureAwait(false);
 | 
					 | 
				
			||||||
            var videos = allVideos.Where(v => v.AdaptiveKind == AdaptiveKind.Audio);
 | 
					 | 
				
			||||||
            var video = videos
 | 
					 | 
				
			||||||
                .Where(v => v.AudioBitrate < 256)
 | 
					 | 
				
			||||||
                .OrderByDescending(v => v.AudioBitrate)
 | 
					 | 
				
			||||||
                .FirstOrDefault();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            return (link, video);
 | 
					            _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;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                TimeSpan time;
 | 
				
			||||||
 | 
					                if (!TimeSpan.TryParseExact(data[4], new[] { "m\\:ss", "mm\\:ss", "h\\:mm\\:ss", "hh\\:mm\\:ss", "hhh\\:mm\\:ss" }, CultureInfo.InvariantCulture, out time))
 | 
				
			||||||
 | 
					                    time = TimeSpan.FromHours(24);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                return new SongInfo()
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    Title = data[0],
 | 
				
			||||||
 | 
					                    VideoId = data[1],
 | 
				
			||||||
 | 
					                    Uri = () => Task.FromResult(data[2]),
 | 
				
			||||||
 | 
					                    AlbumArt = data[3],
 | 
				
			||||||
 | 
					                    TotalTime = time,
 | 
				
			||||||
 | 
					                    QueuerName = queuerName,
 | 
				
			||||||
 | 
					                    Provider = "YouTube",
 | 
				
			||||||
 | 
					                    ProviderType = MusicType.YouTube,
 | 
				
			||||||
 | 
					                    Query = "https://youtube.com/watch?v=" + data[1],
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception ex)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                _log.Warn(ex);
 | 
				
			||||||
 | 
					                return null;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //if (string.IsNullOrWhiteSpace(link))
 | 
				
			||||||
 | 
					            //{
 | 
				
			||||||
 | 
					            //    _log.Info("No song found.");
 | 
				
			||||||
 | 
					            //    return (null, null);
 | 
				
			||||||
 | 
					            //}
 | 
				
			||||||
 | 
					            //_log.Info("Getting all videos");
 | 
				
			||||||
 | 
					            //var allVideos = await Task.Run(async () => { try { return await _yt.GetAllVideosAsync(link).ConfigureAwait(false); } catch { return Enumerable.Empty<YouTubeVideo>(); } }).ConfigureAwait(false);
 | 
				
			||||||
 | 
					            //var videos = allVideos.Where(v => v.AdaptiveKind == AdaptiveKind.Audio);
 | 
				
			||||||
 | 
					            //var video = videos
 | 
				
			||||||
 | 
					            //    .Where(v => v.AudioBitrate < 256)
 | 
				
			||||||
 | 
					            //    .OrderByDescending(v => v.AudioBitrate)
 | 
				
			||||||
 | 
					            //    .FirstOrDefault();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //return (link, video);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private bool IsRadioLink(string query) =>
 | 
					        private bool IsRadioLink(string query) =>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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>();
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user