Пример #1
0
            public Task <string> PreviewUrl(IResourceNetworkLayer networkLayer, IProgress <float> progress, System.Threading.CancellationToken cancelToken)
            {
                string gfyName  = GetGfyName(_originalUrl);
                var    thumbUrl = string.Format("http://thumbs.gfycat.com/{0}-poster.jpg", gfyName);

                return(Task.FromResult(thumbUrl));
            }
		public async Task<IEnumerable<Tuple<string, string>>> GetImagesFromUri(string title, Uri uri, IResourceNetworkLayer networkLayer, IProgress<float> progress, CancellationToken token)
        {
            try
            {
                var href = uri.OriginalString;
                if (href.IndexOf("/sizes") == -1)
                {
                    var inPosition = href.IndexOf("/in/");
                    var inFragment = "";
                    if (inPosition != -1)
                    {
                        inFragment = href.Substring(inPosition);
                        href = href.Substring(0, inPosition);
                    }

                    href += "/sizes/c" + inFragment;
                }
                href = href.Replace("/lightbox", "");
                var jsonResult = await networkLayer.Get("http://www.flickr.com/services/oembed/?format=json&url=" + Uri.EscapeUriString(href), token, progress, null, false);
                var resultObject = JsonConvert.DeserializeObject<OEmbedResult>(jsonResult);
                return new Tuple<string, string>[] { Tuple.Create(resultObject.author_name + " via " + resultObject.provider_name + " : " + resultObject.title, resultObject.url) };
            }
            catch
            {
                return Enumerable.Empty<Tuple<string, string>>();
            }
        }
            async Task<RootVimeo> LoadContents(IResourceNetworkLayer networkLayer, IProgress<float> progress, CancellationToken token)
            {
                var reset = _cancelTokenSource.AddToken(token);
                if (_configRootPack == null || reset)
                {
                    lock (this)
                    {
                        if (_configRootPack == null || reset)
                        {
                            _configRootPack = Tuple.Create(LoadContentsImpl(networkLayer, progress, _cancelTokenSource.Token), progress);
                        }
                    }

                }

                if (_configRootPack.Item2 != progress)
                {
                    HttpClientUtility.NetworkLayer.JoinProgress(_configRootPack.Item2, progress);
                }

                try
                {
                    return await _configRootPack.Item1;
                }
                finally
                {
                    _cancelTokenSource.Clear();
                }
            }
            async Task<RootVimeo> LoadContentsImpl(IResourceNetworkLayer networkLayer, IProgress<float> progress, CancellationToken token)
            {
                using (var client = networkLayer.Clone())
                {
                    client.AddHeaders("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0");
                    client.AddHeaders("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
                    client.AddHeaders("Accept-Language", "ru,en;q=0.8,en-us;q=0.5,uk;q=0.3");
                    client.SetReferer("http://www.google.com");
                    var pageData = await client.Get(_originalUrl, token, progress, null, false);
                    string clipId = null;
                    if (Regex.Match(pageData, @"clip_id=(\d+)", RegexOptions.Singleline).Success)
                    {
                        clipId = Regex.Match(pageData, @"clip_id=(\d+)", RegexOptions.Singleline).Groups[1].ToString();
                    }
                    else if (Regex.Match(pageData, @"(\d+)", RegexOptions.Singleline).Success)
                    {
                        clipId = Regex.Match(pageData, @"(\d+)", RegexOptions.Singleline).Groups[1].ToString();
                    }

                    if (!string.IsNullOrWhiteSpace(clipId))
                    {
                        client.SetReferer(string.Format("http://vimeo.com/{0}", clipId));
                        var configResult = await client.Get(string.Format("http://player.vimeo.com/video/{0}/config", clipId), token, progress, null, false);
                        return JsonConvert.DeserializeObject<RootVimeo>(configResult);
                    }
                    else
                        return null;
                }
            }
            async Task<string> LoadContents(IResourceNetworkLayer networkLayer, IProgress<float> progress, CancellationToken token)
            {
                var reset = _cancelTokenSource.AddToken(token);
                if (_pageContentLoadPack == null || reset)
                {
                    lock(this)
                    {
                        if (_pageContentLoadPack == null || reset)
                        {
                            if (_originalUrl.Contains("&ajax=1"))
                                _pageContentLoadPack = Tuple.Create(networkLayer.Get(_originalUrl, _cancelTokenSource.Token, progress, null, false), progress);
                            else
                                _pageContentLoadPack = Tuple.Create(networkLayer.Get(_originalUrl + "&ajax=1", token, progress, null, false), progress);
                        }
                    }
                    
                }

                if (_pageContentLoadPack.Item2 != progress)
                {
                    HttpClientUtility.NetworkLayer.JoinProgress(_pageContentLoadPack.Item2, progress);
                }

                try
                {
                    return await _pageContentLoadPack.Item1;
                }
                finally
                {
                    _cancelTokenSource.Clear();
                }
            }
            async Task <RootVimeo> LoadContents(IResourceNetworkLayer networkLayer, IProgress <float> progress, CancellationToken token)
            {
                var reset = _cancelTokenSource.AddToken(token);

                if (_configRootPack == null || reset)
                {
                    lock (this)
                    {
                        if (_configRootPack == null || reset)
                        {
                            _configRootPack = Tuple.Create(LoadContentsImpl(networkLayer, progress, _cancelTokenSource.Token), progress);
                        }
                    }
                }

                if (_configRootPack.Item2 != progress)
                {
                    HttpClientUtility.NetworkLayer.JoinProgress(_configRootPack.Item2, progress);
                }

                try
                {
                    return(await _configRootPack.Item1);
                }
                finally
                {
                    _cancelTokenSource.Clear();
                }
            }
        public static IVideoResult GetVideo(string originalUrl, IResourceNetworkLayer networkLayer)
        {
            string targetHost = null;
            string fileName = null;

            if (Uri.IsWellFormedUriString(originalUrl, UriKind.Absolute))
            {
                var uri = new Uri(originalUrl);
                targetHost = uri.DnsSafeHost.ToLower();
                fileName = uri.AbsolutePath;
            }

            if (fileName.EndsWith(".gifv"))
                return new DummyVideoResult(originalUrl, originalUrl.Replace(".gifv", "l.jpg"));
            else if (fileName.EndsWith(".mp4") || fileName.EndsWith(".mpg"))
                return new DummyVideoResult(originalUrl, null);
            else if (YouTube.IsAPI(originalUrl))
                return YouTube.GetVideoResult(originalUrl, networkLayer);
            else
            {
                switch (HttpClientUtility.GetDomainFromUrl(originalUrl).ToLower())
                {
                    case "liveleak.com":
                        return Liveleak.GetVideoResult(originalUrl);
                    case "gfycat.com":
                        return Gfycat.GetVideoResult(originalUrl);
                    case "vimeo.com":
                        return Vimeo.GetVideoResult(originalUrl);
                }
            }
            return null;
        }
            async Task <RootVimeo> LoadContentsImpl(IResourceNetworkLayer networkLayer, IProgress <float> progress, CancellationToken token)
            {
                using (var client = networkLayer.Clone())
                {
                    client.AddHeaders("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0");
                    client.AddHeaders("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
                    client.AddHeaders("Accept-Language", "ru,en;q=0.8,en-us;q=0.5,uk;q=0.3");
                    client.SetReferer("http://www.google.com");
                    var pageData = await client.Get(_originalUrl, token, progress, null, false);

                    string clipId = null;
                    if (Regex.Match(pageData, @"clip_id=(\d+)", RegexOptions.Singleline).Success)
                    {
                        clipId = Regex.Match(pageData, @"clip_id=(\d+)", RegexOptions.Singleline).Groups[1].ToString();
                    }
                    else if (Regex.Match(pageData, @"(\d+)", RegexOptions.Singleline).Success)
                    {
                        clipId = Regex.Match(pageData, @"(\d+)", RegexOptions.Singleline).Groups[1].ToString();
                    }

                    if (!string.IsNullOrWhiteSpace(clipId))
                    {
                        client.SetReferer(string.Format("http://vimeo.com/{0}", clipId));
                        var configResult = await client.Get(string.Format("http://player.vimeo.com/video/{0}/config", clipId), token, progress, null, false);

                        return(JsonConvert.DeserializeObject <RootVimeo>(configResult));
                    }
                    else
                    {
                        return(null);
                    }
                }
            }
			public async Task<IEnumerable<Tuple<string, string>>> PlayableStreams(IResourceNetworkLayer networkLayer, IProgress<float> progress, System.Threading.CancellationToken cancelToken)
			{
				string gfyName = GetGfyName(_originalUrl);
				var jsonResult = await networkLayer.Get("http://gfycat.com/cajax/get/" + gfyName, cancelToken, progress, null, false);
				var gfyResult = JsonConvert.DeserializeObject<GfyResult>(jsonResult);
				return new List<Tuple<string, string>> { Tuple.Create(gfyResult.gfyItem.mp4Url, "MP4") };
			}
 private static async Task <string> HttpGet(string uri, IResourceNetworkLayer networkLayer, IProgress <float> progress, CancellationToken token)
 {
     using (var headeredNetworkLayer = networkLayer.Clone())
     {
         networkLayer.AddHeaders("User-Agent", BotUserAgent);
         return(await networkLayer.Get(uri, token, progress, null, true));
     }
 }
            public async Task <string> PreviewUrl(IResourceNetworkLayer networkLayer, IProgress <float> progress, System.Threading.CancellationToken cancelToken)
            {
                var config = await LoadContents(networkLayer, progress, cancelToken);

                if (config != null)
                {
                    return(config.video.thumbs.medium);
                }
                else
                {
                    return(null);
                }
            }
        private async Task <ImgurInfo> GetResponse(string url, IResourceNetworkLayer networkLayer, IProgress <float> progress, CancellationToken token)
        {
            if (string.IsNullOrWhiteSpace(_apiKey))
            {
                throw new Exception("ApiKey not set for Imgur, please set it on ImageAquisition.ImgurAPIKey");
            }

            using (var network = networkLayer.Clone())
            {
                network.AddHeaders("Authorization", string.Format("Client-ID {0}", _apiKey));
                var responseString = await network.Get(url, token, progress, null, false);

                return(JsonConvert.DeserializeObject <ImgurInfo>(responseString));
            }
        }
			public async Task<IEnumerable<Tuple<string, string>>> PlayableStreams(IResourceNetworkLayer networkLayer, IProgress<float> progress, System.Threading.CancellationToken cancelToken)
			{
				var pageContents = await LoadContents(networkLayer, progress, cancelToken);
                if (pageContents != null)
				{
					var targetString = "file: \"http://edge.liveleak.com";
					var targetStringStart = pageContents.IndexOf(targetString);
					if (targetStringStart != -1)
					{
						var endofTargetString = pageContents.IndexOf("\",", targetStringStart);
						if (endofTargetString != -1)
						{
							targetStringStart += "file: \"".Length;
							var fileUrl = pageContents.Substring(targetStringStart, endofTargetString - targetStringStart);
							return new List<Tuple<string, string>> { Tuple.Create(fileUrl, "mp4") };
						}
					}
				}
				return Enumerable.Empty<Tuple<string, string>>();
			}
			public async Task<string> PreviewUrl(IResourceNetworkLayer networkLayer, IProgress<float> progress, System.Threading.CancellationToken cancelToken)
			{
                var pageContents = await LoadContents(networkLayer, progress, cancelToken);
				if (pageContents != null)
				{
					var targetString = "image: \"http://edge.liveleak.com";
					var targetStringStart = pageContents.IndexOf(targetString);
					if (targetStringStart != -1)
					{
						var endofTargetString = pageContents.IndexOf("\",", targetStringStart);
						if (endofTargetString != -1)
						{
							targetStringStart += "image: \"".Length;
							var fileUrl = pageContents.Substring(targetStringStart, endofTargetString - targetStringStart);
							return fileUrl;
						}
					}
				}
				return null;
			}
Пример #15
0
            public async Task <string> PreviewUrl(IResourceNetworkLayer networkLayer, IProgress <float> progress, System.Threading.CancellationToken cancelToken)
            {
                var pageContents = await LoadContents(networkLayer, progress, cancelToken);

                if (pageContents != null)
                {
                    var targetString      = "image: \"http://edge.liveleak.com";
                    var targetStringStart = pageContents.IndexOf(targetString);
                    if (targetStringStart != -1)
                    {
                        var endofTargetString = pageContents.IndexOf("\",", targetStringStart);
                        if (endofTargetString != -1)
                        {
                            targetStringStart += "image: \"".Length;
                            var fileUrl = pageContents.Substring(targetStringStart, endofTargetString - targetStringStart);
                            return(fileUrl);
                        }
                    }
                }
                return(null);
            }
        public async Task<IEnumerable<Tuple<string, string>>> GetImagesFromUri(string title, Uri uri, IResourceNetworkLayer networkLayer, IProgress<float> progress, CancellationToken token)
        {
            var href = uri.OriginalString.Split('?')[0];
            var groups = hashRe.Match(href).Groups;

            if (groups.Count > 2 && string.IsNullOrWhiteSpace(groups[2].Value))
            {
                var hash = groups[1].Value;
                if (hash.StartsWith("m"))
                {
                    var apiURL = "http://min.us/api/GetItems/" + hash;
                    var jsonResult = await networkLayer.Get(apiURL, token, progress, null, false);
                    dynamic result = JsonConvert.DeserializeObject(jsonResult);
                    return new Tuple<string, string>[] { Tuple.Create(title, (string)result.src) };
                }
                else
                    return Enumerable.Empty<Tuple<string, string>>();
            }
            else
                return Enumerable.Empty<Tuple<string, string>>();
        }
Пример #17
0
        public static IVideoResult GetVideo(string originalUrl, IResourceNetworkLayer networkLayer)
        {
            string targetHost = null;
            string fileName   = null;

            if (Uri.IsWellFormedUriString(originalUrl, UriKind.Absolute))
            {
                var uri = new Uri(originalUrl);
                targetHost = uri.DnsSafeHost.ToLower();
                fileName   = uri.AbsolutePath;
            }

            if (fileName.EndsWith(".gifv"))
            {
                return(new DummyVideoResult(originalUrl, originalUrl.Replace(".gifv", "l.jpg")));
            }
            else if (fileName.EndsWith(".mp4") || fileName.EndsWith(".mpg"))
            {
                return(new DummyVideoResult(originalUrl, null));
            }
            else if (YouTube.IsAPI(originalUrl))
            {
                return(YouTube.GetVideoResult(originalUrl, networkLayer));
            }
            else
            {
                switch (HttpClientUtility.GetDomainFromUrl(originalUrl).ToLower())
                {
                case "liveleak.com":
                    return(Liveleak.GetVideoResult(originalUrl));

                case "gfycat.com":
                    return(Gfycat.GetVideoResult(originalUrl));

                case "vimeo.com":
                    return(Vimeo.GetVideoResult(originalUrl));
                }
            }
            return(null);
        }
Пример #18
0
            async Task <string> LoadContents(IResourceNetworkLayer networkLayer, IProgress <float> progress, CancellationToken token)
            {
                var reset = _cancelTokenSource.AddToken(token);

                if (_pageContentLoadPack == null || reset)
                {
                    lock (this)
                    {
                        if (_pageContentLoadPack == null || reset)
                        {
                            if (_originalUrl.Contains("&ajax=1"))
                            {
                                _pageContentLoadPack = Tuple.Create(networkLayer.Get(_originalUrl, _cancelTokenSource.Token, progress, null, false), progress);
                            }
                            else
                            {
                                _pageContentLoadPack = Tuple.Create(networkLayer.Get(_originalUrl + "&ajax=1", token, progress, null, false), progress);
                            }
                        }
                    }
                }

                if (_pageContentLoadPack.Item2 != progress)
                {
                    HttpClientUtility.NetworkLayer.JoinProgress(_pageContentLoadPack.Item2, progress);
                }

                try
                {
                    return(await _pageContentLoadPack.Item1);
                }
                finally
                {
                    _cancelTokenSource.Clear();
                }
            }
        /// <summary>
        /// Returns the title of the YouTube video.
        /// </summary>
        public static async Task <string> GetVideoTitleAsync(string youTubeId, IResourceNetworkLayer networkLayer, IProgress <float> progress, CancellationToken token)
        {
            using (var client = networkLayer.Clone())
            {
                client.AddHeaders("User-Agent", BotUserAgent);
                var html = await client.Get("http://www.youtube.com/watch?v=" + youTubeId + "&nomobile=1", token, progress, null, true);

                var startIndex = html.IndexOf(" title=\"");
                if (startIndex != -1)
                {
                    startIndex = html.IndexOf(" title=\"", startIndex + 1);
                    if (startIndex != -1)
                    {
                        startIndex += 8;
                        var endIndex = html.IndexOf("\">", startIndex);
                        if (endIndex != -1)
                        {
                            return(html.Substring(startIndex, endIndex - startIndex));
                        }
                    }
                }
                return(null);
            }
        }
        /// <summary>
        /// Returns all available URIs (audio-only and video) for the given YouTube ID.
        /// </summary>
        public static async Task <YouTubeUri[]> GetUrisAsync(string youTubeId, IResourceNetworkLayer networkLayer, IProgress <float> progress, CancellationToken token)
        {
            var    urls           = new List <YouTubeUri>();
            string javaScriptCode = null;

            var response = await HttpGet("https://www.youtube.com/watch?v=" + youTubeId + "&nomobile=1", networkLayer, progress, token);

            var match = Regex.Match(response, "url_encoded_fmt_stream_map\": ?\"(.*?)\"");
            var data  = Uri.UnescapeDataString(match.Groups[1].Value);

            match = Regex.Match(response, "adaptive_fmts\": ?\"(.*?)\"");
            var data2 = Uri.UnescapeDataString(match.Groups[1].Value);

            var arr = Regex.Split(data + "," + data2, ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");             // split by comma but outside quotes

            foreach (var d in arr)
            {
                var url = "";
                //var connection = "";
                //var stream = "";
                var signature = "";
                var tuple     = new YouTubeUri();
                foreach (var p in d.Replace("\\u0026", "\t").Split('\t'))
                {
                    var index = p.IndexOf('=');
                    if (index != -1 && index < p.Length)
                    {
                        try
                        {
                            var key   = p.Substring(0, index);
                            var value = Uri.UnescapeDataString(p.Substring(index + 1));
                            if (key == "url")
                            {
                                url = value;
                            }
                            //else if (key == "conn")
                            //    connection = value;
                            //else if (key == "stream")
                            //    stream = value;
                            else if (key == "itag")
                            {
                                tuple.Itag = int.Parse(value);
                            }
                            else if (key == "type" && (value.Contains("video/mp4") || value.Contains("audio/mp4")))
                            {
                                tuple.Type = value;
                            }
                            else if (key == "sig")
                            {
                                signature = value;
                            }
                            else if (key == "s")
                            {
                                if (javaScriptCode == null)
                                {
                                    var javaScriptUri = "http://s.ytimg.com/yts/jsbin/html5player-" +
                                                        Regex.Match(response,
                                                                    "\"\\\\/\\\\/s.ytimg.com\\\\/yts\\\\/jsbin\\\\/html5player-(.+?)\\.js\"")
                                                        .Groups[1] + ".js";
                                    javaScriptCode = await HttpGet(javaScriptUri, networkLayer, progress, token);
                                }

                                signature = GenerateSignature(value, javaScriptCode);
                            }
                        }
                        catch (Exception exception)
                        {
                            Debug.WriteLine("YouTube parse exception: " + exception.Message);
                        }
                    }
                }

                //if (string.IsNullOrEmpty(url) && !string.IsNullOrEmpty(connection) && !string.IsNullOrEmpty(stream))
                //{
                //    url = connection + "?" + stream;
                //}

                if (url.Contains("&signature=") || url.Contains("?signature="))
                {
                    tuple._url = url;
                }
                else
                {
                    tuple._url = url + "&signature=" + signature;
                }

                if (tuple.IsValid)
                {
                    urls.Add(tuple);
                }
            }

            return(urls.ToArray());
        }
			public Task<string> PreviewUrl(IResourceNetworkLayer networkLayer, IProgress<float> progress, System.Threading.CancellationToken cancelToken)
			{
				string gfyName = GetGfyName(_originalUrl);
				var thumbUrl = string.Format("http://thumbs.gfycat.com/{0}-poster.jpg", gfyName);
				return Task.FromResult(thumbUrl);
			}
Пример #22
0
        public static async Task <IEnumerable <Tuple <string, string> > > GetImagesFromUrl(string title, string url, IResourceNetworkLayer networkLayer, IProgress <float> progress, CancellationToken token)
        {
            try
            {
                var uri = new Uri(url);

                string filename = Path.GetFileName(uri.LocalPath);

                if (filename.EndsWith(".jpg") || filename.EndsWith(".png") || filename.EndsWith(".jpeg") || filename.EndsWith(".gif"))
                {
                    return new Tuple <string, string>[] { Tuple.Create(title, url) }
                }
                ;
                else
                {
                    var domain = HttpClientUtility.GetDomainFromUrl(url).ToLower();

                    IAsyncAcquisitionAPI asyncApi  = null;
                    IAcquisitionAPI      simpleApi = null;
                    if (_simpleAPIs.TryGetValue(domain, out simpleApi))
                    {
                        return(new Tuple <string, string>[] { Tuple.Create(title, simpleApi.GetImageFromUri(uri)) });
                    }
                    else if (_asyncAPIs.TryGetValue(domain, out asyncApi))
                    {
                        return(await asyncApi.GetImagesFromUri(title, uri, networkLayer, progress, token));
                    }
                    else
                    {
                        return(Enumerable.Empty <Tuple <string, string> >());
                    }
                }
            }
            catch
            {
                return(Enumerable.Empty <Tuple <string, string> >());
            }
        }
 public Task <string> PreviewUrl(IResourceNetworkLayer networkLayer, IProgress <float> progress, CancellationToken cancelToken)
 {
     return(Task.FromResult(YouTube.GetThumbnailUri(YouTube.GetYouTubeId(_originalUrl)).ToString()));
 }
			public async Task<string> PreviewUrl(IResourceNetworkLayer networkLayer, IProgress<float> progress, System.Threading.CancellationToken cancelToken)
			{
				var config = await LoadContents(networkLayer, progress, cancelToken);
				if (config != null)
				{
					return config.video.thumbs.medium;
				}
				else
					return null;
			}
        /// <summary>
        /// Returns the title of the YouTube video. 
        /// </summary>
        public static async Task<string> GetVideoTitleAsync(string youTubeId, IResourceNetworkLayer networkLayer, IProgress<float> progress, CancellationToken token)
        {
			using (var client = networkLayer.Clone())
			{
				client.AddHeaders("User-Agent", BotUserAgent);
				var html = await client.Get("http://www.youtube.com/watch?v=" + youTubeId + "&nomobile=1", token, progress, null, true);
				var startIndex = html.IndexOf(" title=\"");
				if (startIndex != -1)
				{
					startIndex = html.IndexOf(" title=\"", startIndex + 1);
					if (startIndex != -1)
					{
						startIndex += 8;
						var endIndex = html.IndexOf("\">", startIndex);
						if (endIndex != -1)
							return html.Substring(startIndex, endIndex - startIndex);
					}
				}
				return null;
			}
        }
 public Task<string> PreviewUrl(IResourceNetworkLayer networkLayer, IProgress<float> progress, System.Threading.CancellationToken cancelToken)
 {
     return Task.FromResult(_previewUrl);
 }
		/// <summary>
		/// Returns the best matching YouTube stream URI which has an audio and video channel and is not 3D. 
		/// </summary>
		/// <returns>Returns null when no appropriate URI has been found. </returns>
		public static Task<YouTubeUri> GetVideoUriAsync(string youTubeId, YouTubeQuality maxQuality, IResourceNetworkLayer networkLayer, IProgress<float> progress, CancellationToken token)
		{
			return GetVideoUriAsync(youTubeId, DefaultMinQuality, maxQuality, networkLayer, progress, token);
		}
			public async Task<IEnumerable<Tuple<string, string>>> PlayableStreams(IResourceNetworkLayer networkLayer, IProgress<float> progress, CancellationToken cancelToken)
			{
				var uris = await YouTube.GetUrisAsync(YouTube.GetYouTubeId(_originalUrl), networkLayer, progress, cancelToken);
				return uris.Select(uri => Tuple.Create(uri.Uri.ToString(), uri.Type)).ToList();
			}
 /// <summary>
 /// Returns the best matching YouTube stream URI which has an audio and video channel and is not 3D.
 /// </summary>
 /// <returns>Returns null when no appropriate URI has been found. </returns>
 public static Task <YouTubeUri> GetVideoUriAsync(string youTubeId, YouTubeQuality maxQuality, IResourceNetworkLayer networkLayer, IProgress <float> progress, CancellationToken token)
 {
     return(GetVideoUriAsync(youTubeId, DefaultMinQuality, maxQuality, networkLayer, progress, token));
 }
Пример #30
0
 public Task <IEnumerable <Tuple <string, string> > > PlayableStreams(IResourceNetworkLayer networkLayer, IProgress <float> progress, System.Threading.CancellationToken cancelToken)
 {
     return(Task.FromResult((IEnumerable <Tuple <string, string> >) new List <Tuple <string, string> > {
         new Tuple <string, string> (_videoUrl, "mp4")
     }));
 }
Пример #31
0
 public Task <string> PreviewUrl(IResourceNetworkLayer networkLayer, IProgress <float> progress, System.Threading.CancellationToken cancelToken)
 {
     return(Task.FromResult(_previewUrl));
 }
        public async Task <IEnumerable <Tuple <string, string> > > GetImagesFromUri(string title, Uri uri, IResourceNetworkLayer networkLayer, IProgress <float> progress, CancellationToken token)
        {
            var href   = uri.OriginalString.Split('?')[0];
            var groups = hashRe.Match(href).Groups;

            if (groups.Count > 2 && string.IsNullOrWhiteSpace(groups[2].Value))
            {
                var hash = groups[1].Value;
                if (hash.StartsWith("m"))
                {
                    var apiURL     = "http://min.us/api/GetItems/" + hash;
                    var jsonResult = await networkLayer.Get(apiURL, token, progress, null, false);

                    dynamic result = JsonConvert.DeserializeObject(jsonResult);
                    return(new Tuple <string, string>[] { Tuple.Create(title, (string)result.src) });
                }
                else
                {
                    return(Enumerable.Empty <Tuple <string, string> >());
                }
            }
            else
            {
                return(Enumerable.Empty <Tuple <string, string> >());
            }
        }
Пример #33
0
            public async Task <IEnumerable <Tuple <string, string> > > PlayableStreams(IResourceNetworkLayer networkLayer, IProgress <float> progress, System.Threading.CancellationToken cancelToken)
            {
                string gfyName    = GetGfyName(_originalUrl);
                var    jsonResult = await networkLayer.Get("http://gfycat.com/cajax/get/" + gfyName, cancelToken, progress, null, false);

                var gfyResult = JsonConvert.DeserializeObject <GfyResult>(jsonResult);

                return(new List <Tuple <string, string> > {
                    Tuple.Create(gfyResult.gfyItem.mp4Url, "MP4")
                });
            }
			public Task<string> PreviewUrl(IResourceNetworkLayer networkLayer, IProgress<float> progress, CancellationToken cancelToken)
			{
				return Task.FromResult(YouTube.GetThumbnailUri(YouTube.GetYouTubeId(_originalUrl)).ToString());
			}
		/// <summary>
		/// Returns the best matching YouTube stream URI which has an audio and video channel and is not 3D. 
		/// </summary>
		/// <returns>Returns null when no appropriate URI has been found. </returns>
		public static async Task<YouTubeUri> GetVideoUriAsync(string youTubeId, YouTubeQuality minQuality, YouTubeQuality maxQuality, IResourceNetworkLayer networkLayer, IProgress<float> progress, CancellationToken token)
		{
			var uris = await GetUrisAsync(youTubeId, networkLayer, progress, token);
			return GetBestVideoUri(uris, minQuality, maxQuality);
		}
		internal static IVideoResult GetVideoResult(string originalUrl, IResourceNetworkLayer networkLayer)
		{
			return new VideoResult(originalUrl);
		}
        public async Task <IEnumerable <Tuple <string, string> > > GetImagesFromUri(string title, Uri uri, IResourceNetworkLayer networkLayer, IProgress <float> progress, CancellationToken token)
        {
            var       href         = uri.OriginalString.Split('?')[0];
            string    hash         = "";
            var       gallaryMatch = galleryHashRe.Match(href);
            var       albumsMatch  = albumHashRe.Match(href);
            var       hostedMatch  = hostedHashRe.Match(href);
            var       hashMatch    = hashRe.Match(href);
            ImgurInfo info         = null;

            if (gallaryMatch != null && gallaryMatch.Groups != null && gallaryMatch.Groups.Count > 0 && !string.IsNullOrWhiteSpace(gallaryMatch.Groups[0].Value))
            {
                hash = gallaryMatch.Groups[1].Value;
                info = await GetResponse(apiPrefix + "gallery/" + hash, networkLayer, progress, token);
            }
            else if (albumsMatch != null && albumsMatch.Groups != null && albumsMatch.Groups.Count > 0 && !string.IsNullOrWhiteSpace(albumsMatch.Groups[1].Value))
            {
                hash = albumsMatch.Groups[1].Value;
                info = await GetResponse(apiPrefix + "album/" + hash, networkLayer, progress, token);
            }
            else if (hostedMatch != null && hostedMatch.Groups != null && hostedMatch.Groups.Count > 2 && !string.IsNullOrWhiteSpace(hostedMatch.Groups[2].Value))
            {
                hash = hostedMatch.Groups[2].Value;
                info = HandleImage(hash, href);
            }
            else if (hashMatch != null && hashMatch.Groups != null && hashMatch.Groups.Count > 1 && !string.IsNullOrWhiteSpace(hashMatch.Groups[1].Value))
            {
                hash = hashMatch.Groups[1].Value;
                var splitHash = Regex.Split(hash, "[&,]");
                if (splitHash != null && splitHash.Length > 0)
                {
                    // handle separated list of IDs
                    info = HandleImageCollection(splitHash, href);
                }
                else
                {
                    info = HandleImage(hash, href);
                }
            }


            if (info != null && info.success == true && info.data.images != null)
            {
                return(info.data.images.Select(image => Tuple.Create(image.title ?? title, string.IsNullOrWhiteSpace(image.gifv) ? image.link : image.gifv)));
            }
            else if (info?.data?.link != null)
            {
                return(new Tuple <string, string>[] { Tuple.Create(info.data.title as string ?? title, info.data.link) });
            }
            else if (info.success)
            {
                return(Enumerable.Empty <Tuple <string, string> >());
            }
            else
            {
                throw new Exception("imgur returned status: " + info.status);
            }
            //        var href = uri.OriginalString;
            //        var groups = hashRe.Match(href).Groups;
            //        GroupCollection albumGroups = null;

            //        if (groups.Count == 0 || (groups.Count > 0 && string.IsNullOrWhiteSpace(groups[0].Value)))
            //            albumGroups = albumHashRe.Match(href).Groups;

            //        if (groups.Count > 2 && string.IsNullOrWhiteSpace(groups[2].Value))
            //        {
            //            if (Regex.IsMatch(groups[1].Value, "[&,]"))
            //            {
            //                var hashes = Regex.Split(groups[1].Value, "[&,]");
            //                //Imgur doesn't really care about the extension and the browsers don't seem to either.
            //                return hashes
            //                    .Select(hash => Tuple.Create(title, string.Format("http://i.imgur.com/{0}.gif", hash)));

            //            }
            //            else
            //            {
            //                if (uri.AbsolutePath.ToLower().StartsWith("/gallery"))
            //                {
            //                    return await GetImagesFromUri(title, new Uri("http://imgur.com/a/" + groups[1].Value), networkLayer, progress, token);
            //                }
            //                else
            //                {
            //                    //Imgur doesn't really care about the extension and the browsers don't seem to either.
            //                    return new Tuple<string, string>[] { Tuple.Create(title, string.Format("http://i.imgur.com/{0}.gif", groups[1].Value)) };
            //                }
            //            }
            //        }
            //        else if (albumGroups.Count > 2 && string.IsNullOrWhiteSpace(albumGroups[2].Value))
            //        {
            //            var apiURL = string.Format("{0}album/{1}.json", apiPrefix, albumGroups[1].Value);
            //            var jsonResult = await networkLayer.Get(apiURL, token, progress, null, true);
            //            if(string.IsNullOrWhiteSpace(jsonResult))
            //                return Enumerable.Empty<Tuple<string, string>>();

            //JObject result = null;
            //try
            //{
            //	result = JsonConvert.DeserializeObject(jsonResult) as JObject;
            //}
            //catch { }

            //            if (result != null && result.HasValues)
            //            {
            //                JToken errorToken;
            //                if (result.TryGetValue("error", out errorToken))
            //                {
            //                    if(((JObject)errorToken)["message"].Value<string>() == "Album not found")
            //                        return new Tuple<string, string>[] { Tuple.Create(title, string.Format("http://i.imgur.com/{0}.gif", albumGroups[1].Value)) };
            //                    else
            //                        return Enumerable.Empty<Tuple<string, string>>();
            //                }

            //                var albumTitleElement = (string)((JObject)result.GetValue("album")).GetValue("title");
            //                var albumTitle = string.IsNullOrWhiteSpace(albumTitleElement) ? title : albumTitleElement;

            //                var resultImages = ((IEnumerable)((JObject)result.GetValue("album")).GetValue("images"))
            //                    .Cast<JObject>()
            //                    .Select(e =>
            //                        {
            //                            var caption = (string)((JObject)e.GetValue("image")).GetValue("caption");

            //                            if (!string.IsNullOrWhiteSpace(caption))
            //                                caption = caption.Replace("&#039;", "'").Replace("&#038;", "&").Replace("&#034;", "\"");

            //                            return Tuple.Create(string.IsNullOrWhiteSpace(caption) ? albumTitle : caption, (string)((JObject)e.GetValue("links")).GetValue("original"));
            //                        })
            //		.ToArray();
            //	return resultImages;
            //            }
            //            else
            //	return new Tuple<string, string>[] { Tuple.Create(title, string.Format("http://i.imgur.com/{0}.gif", albumGroups[1].Value)) };
            //        }
            //        else
            //            return Enumerable.Empty<Tuple<string, string>>();
        }
		private static async Task<string> HttpGet(string uri, IResourceNetworkLayer networkLayer, IProgress<float> progress, CancellationToken token)
		{
            using (var headeredNetworkLayer = networkLayer.Clone())
            {
                networkLayer.AddHeaders("User-Agent", BotUserAgent);
                return await networkLayer.Get(uri, token, progress, null, true);
            }
		}
			public async Task<IEnumerable<Tuple<string, string>>> PlayableStreams(IResourceNetworkLayer networkLayer, IProgress<float> progress, System.Threading.CancellationToken cancelToken)
			{
				var config = await LoadContents(networkLayer, progress, cancelToken);
				if (config != null)
				{
					var result = new List<Tuple<string, string>>();
					if(config.request.files.h264.mobile != null)
						result.Add(Tuple.Create(config.request.files.h264.mobile.url, config.request.files.h264.mobile.bitrate.ToString()));
					if(config.request.files.h264.hd != null)
						result.Add(Tuple.Create(config.request.files.h264.hd.url, config.request.files.h264.hd.bitrate.ToString()));
					if (config.request.files.h264.sd != null)
						result.Add(Tuple.Create(config.request.files.h264.sd.url, config.request.files.h264.sd.bitrate.ToString()));
					return result;
				}
				else
					return null;
			}
            public async Task <IEnumerable <Tuple <string, string> > > PlayableStreams(IResourceNetworkLayer networkLayer, IProgress <float> progress, System.Threading.CancellationToken cancelToken)
            {
                var config = await LoadContents(networkLayer, progress, cancelToken);

                if (config != null)
                {
                    var result = new List <Tuple <string, string> >();
                    if (config.request.files.h264.mobile != null)
                    {
                        result.Add(Tuple.Create(config.request.files.h264.mobile.url, config.request.files.h264.mobile.bitrate.ToString()));
                    }
                    if (config.request.files.h264.hd != null)
                    {
                        result.Add(Tuple.Create(config.request.files.h264.hd.url, config.request.files.h264.hd.bitrate.ToString()));
                    }
                    if (config.request.files.h264.sd != null)
                    {
                        result.Add(Tuple.Create(config.request.files.h264.sd.url, config.request.files.h264.sd.bitrate.ToString()));
                    }
                    return(result);
                }
                else
                {
                    return(null);
                }
            }
            public async Task <IEnumerable <Tuple <string, string> > > PlayableStreams(IResourceNetworkLayer networkLayer, IProgress <float> progress, CancellationToken cancelToken)
            {
                var uris = await YouTube.GetUrisAsync(YouTube.GetYouTubeId(_originalUrl), networkLayer, progress, cancelToken);

                return(uris.Select(uri => Tuple.Create(uri.Uri.ToString(), uri.Type)).ToList());
            }
		/// <summary>
		/// Returns all available URIs (audio-only and video) for the given YouTube ID. 
		/// </summary>
		public static async Task<YouTubeUri[]> GetUrisAsync(string youTubeId, IResourceNetworkLayer networkLayer, IProgress<float> progress, CancellationToken token)
		{
			var urls = new List<YouTubeUri>();
			string javaScriptCode = null;

			var response = await HttpGet("https://www.youtube.com/watch?v=" + youTubeId + "&nomobile=1", networkLayer, progress, token);
			var match = Regex.Match(response, "url_encoded_fmt_stream_map\": ?\"(.*?)\"");
			var data = Uri.UnescapeDataString(match.Groups[1].Value);
			match = Regex.Match(response, "adaptive_fmts\": ?\"(.*?)\"");
			var data2 = Uri.UnescapeDataString(match.Groups[1].Value);

			var arr = Regex.Split(data + "," + data2, ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)"); // split by comma but outside quotes
			foreach (var d in arr)
			{
				var url = "";
				//var connection = "";
				//var stream = "";
				var signature = "";
				var tuple = new YouTubeUri();
				foreach (var p in d.Replace("\\u0026", "\t").Split('\t'))
				{
					var index = p.IndexOf('=');
					if (index != -1 && index < p.Length)
					{
						try
						{
							var key = p.Substring(0, index);
							var value = Uri.UnescapeDataString(p.Substring(index + 1));
							if (key == "url")
								url = value;
							//else if (key == "conn")
							//    connection = value;
							//else if (key == "stream")
							//    stream = value;
							else if (key == "itag")
								tuple.Itag = int.Parse(value);
							else if (key == "type" && (value.Contains("video/mp4") || value.Contains("audio/mp4")))
								tuple.Type = value;
							else if (key == "sig")
								signature = value;
							else if (key == "s")
							{
								if (javaScriptCode == null)
								{
									var javaScriptUri = "http://s.ytimg.com/yts/jsbin/html5player-" +
														Regex.Match(response,
															"\"\\\\/\\\\/s.ytimg.com\\\\/yts\\\\/jsbin\\\\/html5player-(.+?)\\.js\"")
															.Groups[1] + ".js";
									javaScriptCode = await HttpGet(javaScriptUri, networkLayer, progress, token);
								}

								signature = GenerateSignature(value, javaScriptCode);
							}
						}
						catch (Exception exception)
						{
							Debug.WriteLine("YouTube parse exception: " + exception.Message);
						}
					}
				}

				//if (string.IsNullOrEmpty(url) && !string.IsNullOrEmpty(connection) && !string.IsNullOrEmpty(stream))
				//{
				//    url = connection + "?" + stream; 
				//}

				if (url.Contains("&signature=") || url.Contains("?signature="))
					tuple._url = url;
				else
					tuple._url = url + "&signature=" + signature;

				if (tuple.IsValid)
					urls.Add(tuple);
			}

			return urls.ToArray();
		}
        public static async Task<IEnumerable<Tuple<string, string>>> GetImagesFromUrl(string title, string url, IResourceNetworkLayer networkLayer, IProgress<float> progress, CancellationToken token)
        {
            try
            {
                var uri = new Uri(url);

                string filename = Path.GetFileName(uri.LocalPath);

                if (filename.EndsWith(".jpg") || filename.EndsWith(".png") || filename.EndsWith(".jpeg") || filename.EndsWith(".gif"))
                    return new Tuple<string, string>[] { Tuple.Create(title, url) };
                else
                {
					var domain = HttpClientUtility.GetDomainFromUrl(url).ToLower();
					IAsyncAcquisitionAPI asyncApi = null;
					IAcquisitionAPI simpleApi = null;
					if (_simpleAPIs.TryGetValue(domain, out simpleApi))
					{
						return new Tuple<string, string>[] { Tuple.Create(title, simpleApi.GetImageFromUri(uri)) };
					}
					else if (_asyncAPIs.TryGetValue(domain, out asyncApi))
					{
						return await asyncApi.GetImagesFromUri(title, uri, networkLayer, progress, token);
					}
					else
						return Enumerable.Empty<Tuple<string, string>>();
                }
            }
            catch
            {
                return Enumerable.Empty<Tuple<string, string>>();
            }
        }
        public async Task<IEnumerable<Tuple<string, string>>> GetImagesFromUri(string title, Uri uri, IResourceNetworkLayer networkLayer, IProgress<float> progress, CancellationToken token)
        {

            var href = uri.OriginalString.Split('?')[0];
            string hash = "";
            var gallaryMatch = galleryHashRe.Match(href);
            var albumsMatch = albumHashRe.Match(href);
            var hostedMatch = hostedHashRe.Match(href);
            var hashMatch = hashRe.Match(href);
            ImgurInfo info = null;
            if (gallaryMatch != null && gallaryMatch.Groups != null && gallaryMatch.Groups.Count > 0 && !string.IsNullOrWhiteSpace(gallaryMatch.Groups[0].Value))
            {
                hash = gallaryMatch.Groups[1].Value;
                info = await GetResponse(apiPrefix + "gallery/" + hash, networkLayer, progress, token);
            }
            else if (albumsMatch != null && albumsMatch.Groups != null && albumsMatch.Groups.Count > 0 && !string.IsNullOrWhiteSpace(albumsMatch.Groups[1].Value))
            {
                hash = albumsMatch.Groups[1].Value;
                info = await GetResponse(apiPrefix + "album/" + hash, networkLayer, progress, token);
            }
            else if (hostedMatch != null && hostedMatch.Groups != null && hostedMatch.Groups.Count > 2 && !string.IsNullOrWhiteSpace(hostedMatch.Groups[2].Value))
            {
                hash = hostedMatch.Groups[2].Value;
                info = HandleImage(hash, href);
            }
            else if (hashMatch != null && hashMatch.Groups != null && hashMatch.Groups.Count > 1 && !string.IsNullOrWhiteSpace(hashMatch.Groups[1].Value))
            {
                hash = hashMatch.Groups[1].Value;
                var splitHash = Regex.Split(hash, "[&,]");
                if (splitHash != null && splitHash.Length > 0)
                {
                    // handle separated list of IDs
                    info = HandleImageCollection(splitHash, href);
                }
                else {
                    info = HandleImage(hash, href);
                }
            }


            if (info != null && info.success == true && info.data.images != null)
            {
                return info.data.images.Select(image => Tuple.Create(image.title ?? title, string.IsNullOrWhiteSpace(image.gifv) ? image.link : image.gifv));
            }
            else if (info?.data?.link != null)
            {
                return new Tuple<string, string>[] { Tuple.Create(info.data.title as string ?? title, info.data.link) };
            }
            else if (info.success)
            {
                return Enumerable.Empty<Tuple<string, string>>();
            }
            else
            {
                throw new Exception("imgur returned status: " + info.status);
            }
            //        var href = uri.OriginalString;
            //        var groups = hashRe.Match(href).Groups;
            //        GroupCollection albumGroups = null;

            //        if (groups.Count == 0 || (groups.Count > 0 && string.IsNullOrWhiteSpace(groups[0].Value)))
            //            albumGroups = albumHashRe.Match(href).Groups;

            //        if (groups.Count > 2 && string.IsNullOrWhiteSpace(groups[2].Value))
            //        {
            //            if (Regex.IsMatch(groups[1].Value, "[&,]"))
            //            {
            //                var hashes = Regex.Split(groups[1].Value, "[&,]");
            //                //Imgur doesn't really care about the extension and the browsers don't seem to either.
            //                return hashes
            //                    .Select(hash => Tuple.Create(title, string.Format("http://i.imgur.com/{0}.gif", hash)));

            //            }
            //            else
            //            {
            //                if (uri.AbsolutePath.ToLower().StartsWith("/gallery"))
            //                {
            //                    return await GetImagesFromUri(title, new Uri("http://imgur.com/a/" + groups[1].Value), networkLayer, progress, token);
            //                }
            //                else
            //                {
            //                    //Imgur doesn't really care about the extension and the browsers don't seem to either.
            //                    return new Tuple<string, string>[] { Tuple.Create(title, string.Format("http://i.imgur.com/{0}.gif", groups[1].Value)) };
            //                }
            //            }
            //        }
            //        else if (albumGroups.Count > 2 && string.IsNullOrWhiteSpace(albumGroups[2].Value))
            //        {
            //            var apiURL = string.Format("{0}album/{1}.json", apiPrefix, albumGroups[1].Value);
            //            var jsonResult = await networkLayer.Get(apiURL, token, progress, null, true);
            //            if(string.IsNullOrWhiteSpace(jsonResult))
            //                return Enumerable.Empty<Tuple<string, string>>();

            //JObject result = null;
            //try
            //{
            //	result = JsonConvert.DeserializeObject(jsonResult) as JObject;
            //}
            //catch { }

            //            if (result != null && result.HasValues)
            //            {
            //                JToken errorToken;
            //                if (result.TryGetValue("error", out errorToken))
            //                {
            //                    if(((JObject)errorToken)["message"].Value<string>() == "Album not found")
            //                        return new Tuple<string, string>[] { Tuple.Create(title, string.Format("http://i.imgur.com/{0}.gif", albumGroups[1].Value)) };
            //                    else
            //                        return Enumerable.Empty<Tuple<string, string>>();
            //                }

            //                var albumTitleElement = (string)((JObject)result.GetValue("album")).GetValue("title");
            //                var albumTitle = string.IsNullOrWhiteSpace(albumTitleElement) ? title : albumTitleElement;

            //                var resultImages = ((IEnumerable)((JObject)result.GetValue("album")).GetValue("images"))
            //                    .Cast<JObject>()
            //                    .Select(e => 
            //                        {
            //                            var caption = (string)((JObject)e.GetValue("image")).GetValue("caption");

            //                            if (!string.IsNullOrWhiteSpace(caption))
            //                                caption = caption.Replace("&#039;", "'").Replace("&#038;", "&").Replace("&#034;", "\"");

            //                            return Tuple.Create(string.IsNullOrWhiteSpace(caption) ? albumTitle : caption, (string)((JObject)e.GetValue("links")).GetValue("original"));
            //                        })
            //		.ToArray();
            //	return resultImages;
            //            }
            //            else
            //	return new Tuple<string, string>[] { Tuple.Create(title, string.Format("http://i.imgur.com/{0}.gif", albumGroups[1].Value)) };
            //        }
            //        else
            //            return Enumerable.Empty<Tuple<string, string>>();
        }
 internal static IVideoResult GetVideoResult(string originalUrl, IResourceNetworkLayer networkLayer)
 {
     return(new VideoResult(originalUrl));
 }
        private async Task<ImgurInfo> GetResponse(string url, IResourceNetworkLayer networkLayer, IProgress<float> progress, CancellationToken token)
        {
            if (string.IsNullOrWhiteSpace(_apiKey))
            {
                throw new Exception("ApiKey not set for Imgur, please set it on ImageAquisition.ImgurAPIKey");
            }

            using (var network = networkLayer.Clone())
            {
                network.AddHeaders("Authorization", string.Format("Client-ID {0}", _apiKey));
                var responseString = await network.Get(url, token, progress, null, false);
                return JsonConvert.DeserializeObject<ImgurInfo>(responseString);
            }
        }
        /// <summary>
        /// Returns the best matching YouTube stream URI which has an audio and video channel and is not 3D.
        /// </summary>
        /// <returns>Returns null when no appropriate URI has been found. </returns>
        public static async Task <YouTubeUri> GetVideoUriAsync(string youTubeId, YouTubeQuality minQuality, YouTubeQuality maxQuality, IResourceNetworkLayer networkLayer, IProgress <float> progress, CancellationToken token)
        {
            var uris = await GetUrisAsync(youTubeId, networkLayer, progress, token);

            return(GetBestVideoUri(uris, minQuality, maxQuality));
        }
        public async Task <IEnumerable <Tuple <string, string> > > GetImagesFromUri(string title, Uri uri, IResourceNetworkLayer networkLayer, IProgress <float> progress, CancellationToken token)
        {
            try
            {
                var href = uri.OriginalString;
                if (href.IndexOf("/sizes") == -1)
                {
                    var inPosition = href.IndexOf("/in/");
                    var inFragment = "";
                    if (inPosition != -1)
                    {
                        inFragment = href.Substring(inPosition);
                        href       = href.Substring(0, inPosition);
                    }

                    href += "/sizes/c" + inFragment;
                }
                href = href.Replace("/lightbox", "");
                var jsonResult = await networkLayer.Get("http://www.flickr.com/services/oembed/?format=json&url=" + Uri.EscapeUriString(href), token, progress, null, false);

                var resultObject = JsonConvert.DeserializeObject <OEmbedResult>(jsonResult);
                return(new Tuple <string, string>[] { Tuple.Create(resultObject.author_name + " via " + resultObject.provider_name + " : " + resultObject.title, resultObject.url) });
            }
            catch
            {
                return(Enumerable.Empty <Tuple <string, string> >());
            }
        }
 public Task<IEnumerable<Tuple<string, string>>> PlayableStreams(IResourceNetworkLayer networkLayer, IProgress<float> progress, System.Threading.CancellationToken cancelToken)
 {
     return Task.FromResult((IEnumerable<Tuple<string, string>>)new List<Tuple<string, string>> { new Tuple<string, string> ( _videoUrl, "mp4" )});
 }
Пример #50
0
            public async Task <IEnumerable <Tuple <string, string> > > PlayableStreams(IResourceNetworkLayer networkLayer, IProgress <float> progress, System.Threading.CancellationToken cancelToken)
            {
                var pageContents = await LoadContents(networkLayer, progress, cancelToken);

                if (pageContents != null)
                {
                    var targetString      = "file: \"http://edge.liveleak.com";
                    var targetStringStart = pageContents.IndexOf(targetString);
                    if (targetStringStart != -1)
                    {
                        var endofTargetString = pageContents.IndexOf("\",", targetStringStart);
                        if (endofTargetString != -1)
                        {
                            targetStringStart += "file: \"".Length;
                            var fileUrl = pageContents.Substring(targetStringStart, endofTargetString - targetStringStart);
                            return(new List <Tuple <string, string> > {
                                Tuple.Create(fileUrl, "mp4")
                            });
                        }
                    }
                }
                return(Enumerable.Empty <Tuple <string, string> >());
            }