Beispiel #1
0
    public bool TryNormalizeUrl(string url, out string normalizedUrl)
    {
        url = url.Trim();

        url = url.Replace(_parserUrlSignatures[0], "youtube.com/watch?v=");
        url = url.Replace(_parserUrlSignatures[1], "youtube");
        url = url.Replace(_parserUrlSignatures[2], "youtube.com/watch?v=");

        if (url.Contains("/v/"))
        {
            url = "http://youtube.com" + new Uri(url).AbsolutePath.Replace("/v/", "/watch?v=");
        }

        url = url.Replace("/watch#", "/watch?");

        IDictionary <string, string> query = VideoHostingHelper.ParseQueryString(url);

        string v;

        if (!query.TryGetValue("v", out v))
        {
            normalizedUrl = null;
            return(false);
        }

        normalizedUrl = "http://youtube.com/watch?v=" + v;

        return(true);
    }
Beispiel #2
0
    private static IEnumerable <VideoHostingInfo> GetVideoInfos(IEnumerable <ExtractionInfo> extractionInfos, string videoTitle)
    {
        var downLoadInfos = new List <VideoHostingInfo>();

        foreach (ExtractionInfo extractionInfo in extractionInfos)
        {
            string itag = VideoHostingHelper.ParseQueryString(extractionInfo.Uri.Query)["itag"];

            int formatCode = int.Parse(itag);

            VideoHostingInfo info = VideoHostingInfo.Defaults.SingleOrDefault(videoInfo => videoInfo.FormatCode == formatCode);

            if (info != null)
            {
                info = new VideoHostingInfo(info)
                {
                    DownloadUrl        = extractionInfo.Uri.ToString(),
                    Title              = videoTitle,
                    RequiresDecryption = extractionInfo.RequiresDecryption
                };
            }

            else
            {
                info = new VideoHostingInfo(formatCode)
                {
                    DownloadUrl = extractionInfo.Uri.ToString()
                };
            }

            downLoadInfos.Add(info);
        }

        return(downLoadInfos);
    }
Beispiel #3
0
    public IEnumerator DecryptDownloadUrl(VideoHostingInfo videoInfo, Action <VideoHostingInfo> completeCallback)
    {
        IDictionary <string, string> queries = VideoHostingHelper.ParseQueryString(videoInfo.DownloadUrl);

        if (queries.ContainsKey(SIGNATURE_QUERY))
        {
            string encryptedSignature = queries[SIGNATURE_QUERY];

            string decrypted;

            string jsUrl = string.Format("http://s.ytimg.com/yts/jsbin/player{0}.js", videoInfo.HtmlPlayerVersion);
            WWW    www   = new WWW(jsUrl);
            yield return(www);

            try
            {
                decrypted = DeciphererYoutube.DecipherWithVersion(www.text, encryptedSignature, videoInfo.HtmlPlayerVersion);
            }
            catch (Exception ex)
            {
                throw new Exception("Could not decipher signature", ex);
            }

            videoInfo.DownloadUrl        = VideoHostingHelper.ReplaceQueryStringParameter(videoInfo.DownloadUrl, SIGNATURE_QUERY, decrypted);
            videoInfo.RequiresDecryption = false;

            if (completeCallback != null)
            {
                completeCallback(videoInfo);
            }
        }
    }
Beispiel #4
0
    private static IEnumerable <ExtractionInfo> ExtractDownloadUrls(VideoHostingJson json)
    {
        string[] splitByUrls = (GetStreamMap(json) + ',' + GetAdaptiveStreamMap(json)).Split(',');

        foreach (string s in splitByUrls)
        {
            IDictionary <string, string> queries = VideoHostingHelper.ParseQueryString(s);
            string url;
            bool   requiresDecryption = false;

            if (queries.ContainsKey("s") || queries.ContainsKey("sig"))
            {
                requiresDecryption = queries.ContainsKey("s");
                string signature = queries.ContainsKey("s") ? queries["s"] : queries["sig"];

                url = string.Format("{0}&{1}={2}", queries["url"], SIGNATURE_QUERY, signature);

                string fallbackHost = queries.ContainsKey("fallback_host") ? "&fallback_host=" + queries["fallback_host"] : String.Empty;

                url += fallbackHost;
            }
            else
            {
                url = queries["url"];
            }

            url = VideoHostingHelper.UrlDecode(url);

            IDictionary <string, string> parameters = VideoHostingHelper.ParseQueryString(url);
            if (!parameters.ContainsKey(RATE_BYPASS_FLAG))
            {
                url += string.Format("&{0}={1}", RATE_BYPASS_FLAG, "yes");
            }

            yield return(new ExtractionInfo {
                RequiresDecryption = requiresDecryption, Uri = new Uri(url)
            });
        }
    }