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; }
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>>(); }
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 <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); }
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)); }
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") })); }
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> >()); } }
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("'", "'").Replace("&", "&").Replace(""", "\""); // 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("'", "'").Replace("&", "&").Replace(""", "\""); // 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" )}); }
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> >()); }