Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }