|
|
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
|
|
|
{
|
|
|
|
|
|
|
|
|
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");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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)
|
|
|
{
|
|
|
|
|
|
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;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|