using Services.Helpers; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using UMP.Services.Helpers; using UnityEngine; using UnityEngine.Networking; namespace UMP.Services.Youtube { public class YoutubeService : ServiceBase { private const string PLAYBACK = "videoplayback"; private string[] _signatures = { "youtu.be/", "www.youtube", "youtube.com/embed/" }; public static YoutubeService Default { get { return new YoutubeService(); } } public override bool ValidUrl(string url) { foreach (var signature in _signatures) { if (url.Contains(signature)) return true; } return false; } public override IEnumerator GetAllVideos(string url, Action> resultCallback, Action errorCallback = null) { if (!TryNormalize(url, out url)) throw new ArgumentException("URL is not a valid Youtube URL!"); var requestText = string.Empty; #if UNITY_2017_2_OR_NEWER var request = UnityWebRequest.Get(url); request.SetRequestHeader("User-Agent", string.Empty); yield return request.SendWebRequest(); #else var headers = new Dictionary(); headers.Add("User-Agent", string.Empty); var request = new WWW(url, null, headers); yield return request; #endif if (!string.IsNullOrEmpty(request.error)) { errorCallback(string.Format("[YouTubeService.GetAllVideos] url request is failed: {0}", request.error)); yield break; } #if UNITY_2017_2_OR_NEWER requestText = request.downloadHandler.text; #else requestText = request.text; #endif var ytVideos = new List(); yield return ParseVideos(requestText, (videos) => { var orderedVideos = from video in videos orderby video.Resolution, video.AudioBitrate select video; ytVideos = orderedVideos.ToList(); }, errorCallback); if (resultCallback != null) resultCallback(ytVideos.Cast