private async Task <UrlParseResult> Parse(Uri url, ParseResultType type) { var result = new UrlParseResult(_log, type); var match = _urlPattern.Match(url.AbsoluteUri); var collection = default(NameValueCollection); while (match.Success) { collection = HttpUtility.ParseQueryString(url.Query); var keys = collection.AllKeys; foreach (var key in keys) { var id = collection.Get(key).ToLowerInvariant(); switch (key) { case "v": var videos = await _api.GetVideo(id).ConfigureAwait(false); foreach (var video in videos) { result.MediaItems.Add(video); } break; case "list": var playlists = await _api.GetPlaylists(id).ConfigureAwait(false); foreach (var playlist in playlists) { result.Playlists.Add(playlist); } break; default: return(new UrlParseResult(_log, ParseResultType.None)); } } match = match.NextMatch(); } return(result); }
private async Task <UrlParseResult> Parse(Uri url, ParseResultType type = ParseResultType.None) { var result = new UrlParseResult(_log, type); var regex = @"(?:http|https|)(?::\/\/|)(?:www.|m.|)(?:youtu\.be\/|youtube\.com(?:\/embed\/|\/v\/|\/watch\?v=|\|\/feeds\/api\/videos\/|\/user\S*[^\w\-\s]|\S*[^\w\-\s]))([\w\-]*)[a-z0-9;:@?&%=+\/\$_.-]*"; var match = Regex.Match(url.AbsoluteUri, regex); var youtubeService = new Service(_log); while (match.Success) { var keys = HttpUtility.ParseQueryString(url.Query).AllKeys; foreach (var key in keys) { var id = HttpUtility.ParseQueryString(url.Query).Get(key); switch (key) { case "v": var videos = await youtubeService.GetVideo(id); foreach (var video in videos) { result.MediaItems.Add(video); } break; case "list": var playlists = await youtubeService.GetPlaylists(id); foreach (var playlist in playlists) { result.Playlists.Add(playlist); } break; } } match = match.NextMatch(); } return(result); }
public async Task <UrlParseResult> Parse(string data, ParseResultType type) { var failure = new UrlParseResult(_log, ParseResultType.None); if (type == ParseResultType.None) { return(failure); } if (string.IsNullOrEmpty(data)) { return(failure); } if (Uri.TryCreate(data.Trim(), UriKind.RelativeOrAbsolute, out var url)) { try { switch (url.DnsSafeHost) { case "youtu.be": url = new Uri(url.AbsoluteUri.Replace(@"youtu.be/", @"youtube.com/watch?v=")); return(await Parse(url, type).ConfigureAwait(false)); case "www.youtube.com": return(await Parse(url, type).ConfigureAwait(false)); } } catch (Exception ex) { _log.Error(this, ex); } } return(failure); }