YouTube Download

    • VB.NET

    Es gibt 152 Antworten in diesem Thema. Der letzte Beitrag () ist von Validation.

      YouTube Download

      Hi,

      ich habe vor kurzem einen YouTube Download programmiert aber habe keine Lust den zu Releasen oder ihn weiter zu entwickeln. Damit die ganze "Arbeit" nicht umsonst war, habe ich mich entschieden den Sourececode mit ein paar beschreibungen hier zu veröffentlichen.

      Dan wollen wir mal anfangen:

      Da wir wahrscheinlich nicht einfach nur das Video downloaden möchten, sondern auch ein paar Infos zu den Videos haben möchten (Autor,Titel), fangen wir auch erstmal damit an. Alle Funktionen(Außer die zum Download vom Quelltext) basieren auf RegEx.


      Als erstes brauchen wir den Quelltext von dem YouTube Video:

      VB.NET-Quellcode

      1. Dim Request As HttpWebRequest = HttpWebRequest.Create("URL")
      2. Dim Response As HttpWebResponse = Request.GetResponse()
      3. Dim reader As StreamReader = New StreamReader(Response.GetResponseStream)
      4. Dim httpContent As String
      5. httpContent = reader.ReadToEnd


      Jetzt haben wir schonmal die vorraussetzung für alle folgenden Schritte.

      Titel auslesen:

      VB.NET-Quellcode

      1. Dim TitleRegEx As New Regex("title=""(?<Title>(.*))"" />")
      2. Dim title as String
      3. title = TitleRegEx.Match(httpContent).Groups("Title").ToString


      Diese Funktion liefert uns schonmal den Titel des Videos. Hier mal eine kleine Erläuterung:

      Der Titel eines Videos, liegt in diesem Vormat in dem Quelltext der Seite vor:

      Quellcode

      1. title="Titel des Videos" />


      Da wir den Titel ja nicht wissen, und ihn auslesen wollen, können wir ja nicht im RegEx den Titel schon angeben(wäre auch ohne sinn).
      Deswegen schreibt man "(?<Title>(.*))" wobei man "Title" in jedes x-beliebige Wort ändern kann.

      Das "(.*)" sagt dem Programm, dass der Text der da stehen sollte (Also der Titel des Videos) x-beliebige zeichen bzw. Zahlen hat. Das brauchen wir,
      da wir auch hier nicht wissen wie Lang der Titel ist oder ob er aus Buchstaben und Zahlen besteht.

      Zum schluss haben wir noch das "?" am Anfang der Klammer. Das Fragezeichen sagt dem Programm, dass es den Text der da steht in die Speichern soll und zwar
      in der Variable, die wir zwischen den "<>" stehen haben(in diesem Fall "Title")

      In der Letzteb Zeile des Codes("title = TitleRegEx.Match(httpContent).Groups("Title").ToString") wird eigentlich erst der/das RegEx gestartet.
      "httpContent" steht für den Text der nach den oben angegebenen Zeichen durchsucht werden soll. "Title" steht für die Variable in der der Text gespeichert wurde(wie oben genannt). Wenn wir beim RegEx deklarieren anstatt "Title", "test" geschreiben hätten, müssten wir also auch hier "Title" in "test" ändern.



      Autor auslesen:

      VB.NET-Quellcode

      1. Dim AutorRegEx As New Regex("'VIDEO_USERNAME': '(?<Autor>(.*))',")
      2. Dim Autor As String
      3. Autor = AutorRegEx.Match(httpContent).Groups("Autor").ToString



      Die gleiche Erläuterung wie beim Titel. In diesem Fall liegt aber der Autor des Videos in diesem Format vor:

      Quellcode

      1. 'VIDEO_USERNAME': '*Autor des Videos*',")


      Dementsprechend muss man natürlich auch im RegEx den String ändern nachdem gesucht werden soll.


      Aufrufe auslesen:

      VB.NET-Quellcode

      1. Dim ViewRegEx As New Regex("<strong class=""watch-view-count"">(?<Views>(.*))</strong><br>Aufrufe")
      2. Dim Views As String
      3. Views = ViewRegEx.Match(httpContent).Groups("Views").ToString


      Hier liegt die Anzahl der Aufrufe in diesem Format vor:

      Quellcode

      1. <strong class=""watch-view-count"">*Anzahl aufrufe*</strong><br>Aufrufe




      Anzahl Bewertungen auslesen:

      VB.NET-Quellcode

      1. Dim RateNum As New Regex("<div class=""action-bar-ratings-stats yt-uix-tooltip"" title=""(?<Like>(.*))"">")
      2. Dim RateNums As String
      3. RateNums = RateNum.Match(httpContent).Groups("Like").ToString



      Hier liegt die Anzahl der Bewertungen so vor:

      Quellcode

      1. <div class=""action-bar-ratings-stats yt-uix-tooltip"" title=""*Anzahl der Leute die es mögen oder nicht*"">




      Video Download:

      Alles bis hier hin war ja eigentlich noch ganz einfach wenn man weiß wonach man suchen muss :P
      Der Download des Videos ist eigentlich auch ganz simpel wenn man weiß wie sich der Downloadlink zusammen setzt.

      In diesem Beispiel wird das Videos als .mp4 gedownloadet.

      Der Downloadlink zu einem Video setzt sich aus 3 verschiedenen Teilen zusammen:

      Eine bestimmte URL von YouTube, die ID des Videos und die Variable "t".


      Diese bestimmte URL von YouTube ist diese :

      Quellcode

      1. http://www.youtube.com/get_video?fmt=18&video_id=


      An diese URL muss man die ID des Video ran hängen und die Variable "t". An die ID kommt man ziemlich schnell:

      Sie steht in jeder URL zu einem Video hinter "v=". Also ist es sehr einfach diese gerauszubekommen:

      VB.NET-Quellcode

      1. Dim URL as String = "Link zum Video"
      2. URL = Url.Replace ("http://www.youtube.com/watch?v=","")


      Schon hat man die ID des Videos. Man kann diese natürlich auch wie die anderen Informationen über RegEx auslesen aber mit Replace geht es einfacher und schneller.


      Jetzt müssen wir noch die Variable "t" auslesen:

      VB.NET-Quellcode

      1. Dim tRegEx As New Regex("""t"": ""(?<t>(.*)) """)
      2. Dim t as String
      3. t = (Mid$(tRegEx.Match(httpContent).Groups("t").ToString,1,46))



      Ihr seht, dass fasst alles gleich ist wie bei den anderen. Nur jetzt kommt beim speichern des Textes noch ein "Mid$" dazu.
      Das "Mid$" steht dort, damit man nur die Variable "t" angezeigt bekommt. Ohne das "Mid$" bekommt man nen haufen Quelltext zurückgeliefert,
      den man eigentlich nicht braucht. Das "Mid$" schneidet auch einfach nur alle Buchstaben bzw. Zeichen ab, die nicht in dem Bereich von zeichen 1 bis 46
      sind.


      Jetzt haben wir alle sachen die wir brauchen um das Video zu downloaden. Also nur noch zusammen setzen:

      VB.NET-Quellcode

      1. Dim DownloadURL as String = "http://www.youtube.com/get_video?fmt=18&video_id=" & ID & "&t=" & t


      Jetzt einfach nur noch nen Webclient machen und download ;)


      Bei diesem Link wird das Video als .mp4 gedownloadet. Allerdings kann man ganz einfach den Dateitypen ändern.
      Der erste Teil des Links sieht wie folgt aus:

      youtube.com/get_video?fmt=18&video_id="

      Ihr seht, dass am in der mitte/ am ende ein "fmt=18" steht. Wenn man diese zahl ändern (also in diesem Fall "18"), bekommt man das Video in einem anderem Format. Folgende Formate gibt es bei YouTube(Danke technobase ;)):

      "fmt=5" = .flv Format
      "fmt=22" = .mp4 in HD (setzt vorraus, dass das Video auch in HD vorhanden ist)
      "fmt=17" = .3gp








      So, das wars jetzt :)

      ich hoffe es hat euch ein bischen geholfen. Wenn ihr Fragen oder Anregungen habt dann könnt ihr sie hier posten!



      Grüsse,

      viperkill



      ACHTUNG! Durch die Umstellung des Youtube Layouts, funktionieren manche abfragen nicht mehr. Ich werde mich so bald wie möglich hinsetzten und den Sourcecode updaten.

      EDIT: Alle Abfragen gehen wieder! Nur die zusammen setzung des YouTube Downloadlinks will noch nich :P



      P.S.: Wer Rechtschreibfehler findet, darf sie behalten :rolleyes:


      EDIT: Habe jetzt im Anhang ein Beispiel Projekt "rangehängt" :thumbsup:
      Dateien

      Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „viperkill“ ()

      Hallo,
      Ich bekomme beim starten immer einen Fehler:

      Spoiler anzeigen
      Fehler beim Erstellen des Formulars. Weitere Informationen finden Sie in Exception.InnerException. Fehler: Ungültiger URI: Das URI-Format konnte nicht bestimmt werden..


      Das ist mein Code:

      Spoiler anzeigen

      VB.NET-Quellcode

      1. Imports System.Net
      2. Imports System.IO
      3. Imports System.Text.RegularExpressions
      4. Public Class Form1
      5. Dim URL As String = "Link zum Video"
      6. Dim tRegEx As New Regex("""t"": ""(?<t>(.*)) """)
      7. Dim t As String
      8. Dim Request As HttpWebRequest = HttpWebRequest.Create("URL")
      9. Dim Response As HttpWebResponse = Request.GetResponse()
      10. Dim reader As StreamReader = New StreamReader(Response.GetResponseStream)
      11. Dim httpContent As String
      12. Dim TitleRegEx As New Regex("title=""(?<Title>(.*))"" />")
      13. Dim title As String
      14. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
      15. httpContent = reader.ReadToEnd
      16. title = TitleRegEx.Match(httpContent).Groups("Title").ToString
      17. Label1.Text = title
      18. End Sub
      19. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      20. t = (Mid$(tRegEx.Match(httpContent).Groups("t").ToString, 1, 46))
      21. URL = URL.Replace("http://www.youtube.com/watch?v=", "")
      22. End Sub
      23. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
      24. Dim DownloadURL As String = "http://www.youtube.com/watch?v=4RE_WRsxi5w"
      25. Dim web As New WebClient
      26. web.DownloadFile(URL, My.Computer.FileSystem.SpecialDirectories.Desktop & "/Video1.avi")
      27. End Sub
      28. End Class

      Hi,

      das kommt wenn an der URL was nicht passt. Ich glaube , du hast vergessen dem String "URL" vorher einen Video Link zu zuweisen(finde ich zumindest nicht im quelltext). Versuch mal im Form Load sub "URL" ein Link zu nen Brei zu geben


      Grüße,

      viperkill
      Spoiler anzeigen

      VB.NET-Quellcode

      1. Imports System.Net
      2. Imports System.IO
      3. Imports System.Text.RegularExpressions
      4. Public Class Form1
      5. Dim URL As String = "Link zum Video"
      6. Dim tRegEx As New Regex("""t"": ""(?<t>(.*)) """)
      7. Dim t As String
      8. Dim Request As HttpWebRequest = HttpWebRequest.Create("URL")
      9. Dim Response As HttpWebResponse = Request.GetResponse()
      10. Dim reader As StreamReader = New StreamReader(Response.GetResponseStream)
      11. Dim httpContent As String
      12. Dim TitleRegEx As New Regex("title=""(?<Title>(.*))"" />")
      13. Dim title As String
      14. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
      15. URL = "http://www.youtube.com/watch?v=4RE_WRsxi5w"
      16. Dim DownloadURL As String = "http://www.youtube.com/watch?v=4RE_WRsxi5w"
      17. httpContent = reader.ReadToEnd
      18. title = TitleRegEx.Match(httpContent).Groups("Title").ToString
      19. Label1.Text = title
      20. End Sub
      21. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      22. t = (Mid$(tRegEx.Match(httpContent).Groups("t").ToString, 1, 46))
      23. URL = URL.Replace("http://www.youtube.com/watch?v=", "")
      24. End Sub
      25. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
      26. Dim web As New WebClient
      27. web.DownloadFile(URL, My.Computer.FileSystem.SpecialDirectories.Desktop & "/Video1.avi")
      28. End Sub
      29. End Class


      Habs jetzt so aber funktioniert immer nohc nnicht :thumbdown:
      Hi,

      Versuchs mal damit:

      VB.NET-Quellcode

      1. Imports System.Net
      2. Imports System.IO
      3. Imports System.Text.RegularExpressions
      4. Public Class Form1
      5. Dim URL As String = "Link zum Video"
      6. Dim tRegEx As New Regex("""t"": ""(?<t>(.*)) """)
      7. Dim t As String
      8. Dim TitleRegEx As New Regex("title=""(?<Title>(.*))"" />")
      9. Dim title As String
      10. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
      11. URL = "http://www.youtube.com/watch?v=4RE_WRsxi5w"
      12. Dim DownloadURL As String = "http://www.youtube.com/watch?v=4RE_WRsxi5w"
      13. Dim Request As HttpWebRequest = HttpWebRequest.Create("URL")
      14. Dim Response As HttpWebResponse = Request.GetResponse()
      15. Dim reader As StreamReader = New StreamReader(Response.GetResponseStream)
      16. Dim httpContent As String
      17. httpContent = reader.ReadToEnd
      18. title = TitleRegEx.Match(httpContent).Groups("Title").ToString
      19. Label1.Text = title
      20. End Sub
      21. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      22. t = (Mid$(tRegEx.Match(httpContent).Groups("t").ToString, 1, 46))
      23. URL = URL.Replace("http://www.youtube.com/watch?v=", "")
      24. End Sub
      25. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
      26. Dim web As New WebClient
      27. web.DownloadFile(URL, My.Computer.FileSystem.SpecialDirectories.Desktop & "/Video1.avi")
      28. End Sub
      29. End Class
      Hmmm... Ich werd gleich mal wenn ich wieder am pc bin ein Beispiel Projekt hochladen. Muss nur mal gucken ob ich das heut noch schaffe


      Grüße,

      viperkill

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „viperkill“ ()

      Er hat ja gesagt, dass er schaut ob er "heute" noch Zeit hat.

      Ich habs auch schon etwas versucht... Bekomme es auch nicht hin.
      Meine neue Homepage: pkern.at
      Wetter bei mir zu Haus:



      Ich bin momentan dran, einen Youtube Downloader zu programmieren. Vielen Danke für deinen Source, er hat mir sehr geholfen ;)
      Wie man sieht benutze ich keine Listview. Das Auslesen der Informationen klappt bestens.

      Du hast geschrieben:

      VB.NET-Quellcode

      1. Dim t As String = ListView1.FocusedItem.Tag


      und ich hab keine Ahnung wie ich das umschreiben soll, ich benutze keine Listview. Der Youtube-Link wird in die Textbox eingeben.

      Ich bin gerade am Verzweifeln :D Ich komme nicht an die Variable "t" ran.
      Hi,

      du hast "t" ja mit diesem Code ausgelesen:

      VB.NET-Quellcode

      1. Dim tRegEx As New Regex("""t"": ""(?<t>(.*)) """)
      2. Dim t as String
      3. t = (Mid$(tRegEx.Match(httpContent).Groups("t").ToString,1,46))


      Das t wird jetzt in den Tag des items gespeichert. Da du aber kein listview hast, kannst dir das sparen und einfach das "t" aus dem Code nehmen. Also einfach dein Code mit dem hier ersetzten.

      Grüße,

      viperkill

      VB.NET-Quellcode

      1. Private Sub ButtonDownload_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonDownload.Click
      2. Dim ZielDatei As String ZielDatei = My.Computer.FileSystem.SpecialDirectories.Desktop & "\YouTubeVideo.mp4"
      3. Dim ID As String = TextBox1.Text ID = ID.Replace("http://www.youtube.com/watch?v=", "")
      4. Dim DownloadURL As String DownloadURL = "http://www.youtube.com/get_video?fmt=18&video_id=" & ID & "&t="
      5. ProgressBar1.Minimum = 0 ProgressBar1.Maximum = 100 HttpClient.DownloadFileAsync(New Uri(DownloadURL), (ZielDatei))


      Das ist nun mein Download-Code, habe die Variable "t" entfernt, aber er lädt nichts herunter.
      Die Datei wird zwar erstellt, hat aber nur 0kb.
      @Snow:
      Die Datei wird zwar erstellt, hat aber nur 0kb.
      Versuchs doch mal mit dem Einzelschritt-Debugger(Hotkey: F8) und überprüfe, ob die Variablen auch die richtigen Werte enthalten.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Sakeco“ ()