YouTube Video via Quelltext herunterladen

  • C#

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von VincentTB.

    YouTube Video via Quelltext herunterladen

    Wie Ihr dem Titel entnehmen könnt, möchte ich selbst Methoden etc. schreiben um YT Videos aus dem Quelltext herunterladen zu können.
    Ich bin ein C# Entwickler.
    Es gibt zum Beispiel diese Bibliothek um Videos runterlzuladen. Diese funktioniert auch nur zu 50%.
    Manche Videos funktionieren, andere wiederrum nicht.
    Ich bin seit zwei Tagen dabei, es irgendwie auf die Reihe zu bekommen, aber bis jetzt ohne Erfolg.
    Es gibt ja eine sogenannte Video Info die man so bekommt:

    C#-Quellcode

    1. http://www.youtube.com/get_video_info?el=detailpage&video_id="ID"


    Wo Infos drinstehen.

    Der eig. Downloadlink besteht ja aus:
    URL + Fallback_Host + Signatur

    Wenn ich diesen zusammensetze, als Beispiel dieses Video: "https://www.youtube.com/watch?v=OehxXNCYvTM"
    bekomme ich diese Url:
    "https://r5---sn-4g57kn6d.googlevideo.com/videoplayback?mime=video/mp4&itag=22&pl=47&upn=2vmzBL4fJzA&sparams=dur,ei,id,initcwndbps,ip,ipbits,itag,lmt,mime,mm,mn,ms,mv,pl,ratebypass,requiressl,source,upn,expire&ipbits=0&initcwndbps=1128750&source=youtube&id=o-AAVhpkmTNsBgO_4bmA3Y2D4F4P8gkV6E-Q2z5MQx9IsX&beids=[9466594]&lmt=1471146710812948&ip=2003:64:f2e:e9ff:8c2e:6b1e:1311:1f6&key=yt6&expire=1494100925&dur=231.061&mv=m&mt=1494079224&ms=au&ei=XdcNWbDgIcGHcbvqsvgP&requiressl=yes&ratebypass=yes&mn=sn-4g57kn6d&mm=31&fallback_host=&signature="

    Bei diesem Video bekomme ich die Meldung:
    "Der Zugriff auf r5---sn-4g57kn6d.googlevideo.com wurde verweigert"

    Die Methode die ich benutze, um diesen Link zusammenzusetzen ist diese hier:(Ist von einem anderen Projekt vom Internet, um es auszutesten)

    C#-Quellcode

    1. public List<Video> DownloadUrls
    2. {
    3. get
    4. {
    5. YouTubeVideoHelper youTubeVideoHelper = new YouTubeVideoHelper();
    6. List<Video> videoList = new List<Video>();
    7. string query = new WebClient()
    8. {
    9. Proxy = ((IWebProxy)null)
    10. }.DownloadString(string.Format("http://www.youtube.com/get_video_info?&video_id={0}&el=detailpage&ps=default&eurl=&gl=US&hl=en", (object)this.ID)); //Holt die Video ID mittels einer Eigenschaft
    11. if (query.Contains("errorcode="))
    12. {
    13. string str1 = query.Substring(checked(query.IndexOf("errorcode=") + 10));
    14. if (str1.Contains("&"))
    15. str1 = str1.Remove(str1.IndexOf("&"));
    16. int integer = Convert.ToInt32(str1);
    17. if (query.Contains("reason="))
    18. {
    19. string str2 = query.Substring(checked(query.IndexOf("reason=") + 7));
    20. if (str2.Contains("&"))
    21. str2 = str2.Remove(str2.IndexOf("&"));
    22. throw new YouTubeVideoIsNotAvailableException(str2 + " Error Code : " + integer.ToString());
    23. }
    24. throw new YouTubeVideoIsNotAvailableException("ErrorCode " + integer.ToString());
    25. }
    26. NameValueCollection nameValueCollection = new NameValueCollection();
    27. string str3 = HttpUtility.ParseQueryString(query)["url_encoded_fmt_stream_map"];
    28. if (string.Compare(str3, string.Empty, false) == 0)
    29. throw new YouTubeVideoIsNotAvailableException("Failed To Get Video Data");
    30. new List<string>((IEnumerable<string>)Regex.Split(str3, ",")).ForEach((Action<string>)(format =>
    31. {
    32. if (string.IsNullOrEmpty(format.Trim()))
    33. return;
    34. NameValueCollection queryString = HttpUtility.ParseQueryString(format);
    35. string str1 = queryString["url"];
    36. string s = queryString["itag"];
    37. string str2 = queryString["sig"];
    38. string str4 = queryString["fallback_host"];
    39. byte num = byte.Parse(s);
    40. Uri uri = new Uri(HttpUtility.UrlDecode(HttpUtility.UrlDecode(string.Format("{0}&fallback_host={1}&signature={2}", (object)str1, (object)str4, (object)str2))));
    41. videoList.Add(new Video()
    42. {
    43. DownloadLink = uri.ToString(),
    44. VideoQuality = youTubeVideoHelper.GetVideoQuality(Convert.ToInt32(num.ToString()))
    45. });
    46. }));
    47. if (videoList.Count <= 0)
    48. throw new YouTubeVideoIsNotAvailableException("This Video Does Not Contains Any VideoURL's");
    49. return videoList;
    50. }
    51. }


    Bei manchen Videos geht es, bei anderen wiederrum nicht.
    Möchte gern alle, bzw. viele Videos herunterladen können.
    Hast du Ideen, Tipps oder Verbesserungsvorschläge?
    MfG
    Check mal github.com/rg3/youtube-dl/blob…e_dl/extractor/youtube.py das funktioniert eigentlich sehr zuverlässig. Ich habe mich damit auch mal beschäftigt, bin dann aber zu dem Entschluss gekommen, dass externe Tools da eher geeignet sind, weil die Methoden ja nicht offiziell sind und sich deswegen ab und zu ändern. Ich weiß nicht, ob du das schon gefunden hast, aber hier gibt es auch eine C# Repository: github.com/flagbug/YoutubeExtractor

    Zu deinem Problem, dass nur manche Videos funktionieren: Ich meine mich zu erinnern, dass bei manchen Videos noch etwas entschlüsselt werden muss. Das findest du aber auch bei der Repository auf GitHub.
    Mfg
    Vincent

    simpelSoft schrieb:

    Und bei den UT APIs ist nichts dabei?


    Die Api unterstützt keine Downloads.

    VincentTB schrieb:

    Check mal github.com/rg3/youtube-dl/blob…e_dl/extractor/youtube.py das funktioniert eigentlich sehr zuverlässig. Ich habe mich damit auch mal beschäftigt, bin dann aber zu dem Entschluss gekommen, dass externe Tools da eher geeignet sind, weil die Methoden ja nicht offiziell sind und sich deswegen ab und zu ändern. Ich weiß nicht, ob du das schon gefunden hast, aber hier gibt es auch eine C# Repository: github.com/flagbug/YoutubeExtractor

    Zu deinem Problem, dass nur manche Videos funktionieren: Ich meine mich zu erinnern, dass bei manchen Videos noch etwas entschlüsselt werden muss. Das findest du aber auch bei der Repository auf GitHub.


    Und was für externe Tools sind zuverlässig?