File size: 5,324 Bytes
e26fba6 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Linq;
using HtmlAgilityPack;
namespace MovieTube.Client.Scraper
{
public class Youtube : VideoScraperBase
{
//private static readonly YouTubeRequestSettings settings = new YouTubeRequestSettings("test", null) { AutoPaging = true, Maximum = 100 };
protected override string OnScrape(string url, HtmlNode elem)
{
try
{
var input = SubstringBetween(elem.InnerHtml, "url_encoded_fmt_stream_map=", "&");
if(String.IsNullOrEmpty(input.Trim()))
input = SubstringBetween(elem.InnerHtml, "url_encoded_fmt_stream_map=");
var expression = HttpUtility.UrlDecode(input);
var tokens = expression.Split(',').FirstOrDefault(x => x.Contains("quality=medium")).Split('&');
var newUrl = tokens.FirstOrDefault(x => x.StartsWith("url"));
if (!String.IsNullOrEmpty(newUrl))
{
newUrl = newUrl.Split('=')[1];
return HttpUtility.UrlDecode(newUrl);
}
}
catch (Exception ex)
{
throw;
}
throw new Exception("File Not Found");
//var version = HttpUtility.ParseQueryString(new Uri(url).Query).Get("video_id");
//newUrl = String.Format("http://www.youtube.com/watch?v={0}", version);
//elem = Get(url);
//var start = elem.InnerHtml.IndexOf("url_encoded_fmt_stream_map");
//var end = elem.InnerHtml.IndexOf("</script>", start);
//var script = elem.InnerHtml.Substring(start, end - start);
//start = script.IndexOf("url=") + 4;
//end = script.IndexOf("0026", start) - 2;
//url = script.Substring(start, end - start);
//return System.Web.HttpUtility.UrlDecode(url);
//elem = Get(newUrl);
//var script = SubstringBetween(elem.InnerHtml, "url_encoded_fmt_stream_map", "</script>");
//newUrl = SubstringBetween(script, "url=", "0026");
//return System.Web.HttpUtility.UrlDecode(newUrl);
}
//private string GetVideoById(string id)
//{
// var request = new YouTubeRequest(settings);
// var url = new Uri(YouTubeQuery.CreateVideoUri(id));
// Feed<Video> videoFeed = request.Get<Video>(url);
// var x = videoFeed.Entries.First();
// return null;
//}
public override string SanitizeUrl(string url)
{
if (url.Contains("http://www.youtube.com/get_video_info"))
return url;
var version = HttpUtility.ParseQueryString(new Uri(url).Query).Get("v");
if (version == null && url.Contains("embed"))
version = SubstringBetween(url, "embed/");
if(version == null && url.Contains("/video/"))
version = SubstringBetween(url, "video/");
if (version == null && url.Contains("/v/"))
{
version = SubstringBetween(url, "/v/", "?");
if(version == null)
version = SubstringBetween(url, "/v/", "&");
if(version == null)
version = SubstringBetween(url, "/v/");
}
if (version == null && url.Contains("youtu.be/"))
version = SubstringBetween(url, ".be/");
var start = version.IndexOf("?");
if (start != -1)
version = version.Substring(0, start);
url = String.Format("http://www.youtube.com/get_video_info?video_id={0}&el=detailpage", version);
return url;
}
public override string RootUrl
{
get { return "http://www.youtube.com/"; }
}
public override string ID
{
get { return ScrapperId.Youtube; }
}
public override string Title
{
get { return "YouTube"; }
}
public override bool CanProcess(string url)
{
if (base.CanProcess(url))
return true;
return url.ToLower().Contains("youtube.com") ||
url.ToLower().Contains("youtu.be");
}
public override string GetFlashUrl(string url)
{
//http://www.youtube.com/watch?v=feIciElwsWM
if (url.Contains("get_video_info"))
{
var id = SubstringBetween(url, "video_id=", "&");
url = String.Format("http://www.youtube.com/watch?v={0}", id);
}
else if (url.Contains("/embed"))
{
var id = SubstringBetween(url, "video_id=", "&");
url = url.Replace("embed/", "watch?v=");
}
return url;
}
public override ScraperRank Rank
{
get
{
return ScraperRank.Youtube;
}
}
}
}
|