Problem mit XML To Linq bei YouTube Abfrage

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Me.Net.

    Problem mit XML To Linq bei YouTube Abfrage

    Hi Community,

    Ich bin gerade dabei mein erstes Programm, meinen YouTube Downloader zu überarbeiten.
    Eine Funktion ist dafür zuständig, Informationen anhand der ID auszulesen. Ich sende die ID an Google( Inhaber von YouTube) und bekommen folgende XML-Datei wenn ich folgende Addresse aufrufe:
    gdata.youtube.com/feeds/videos?q={ID] (für ID kommt natürlich die ID rein)

    XML-Quellcode

    1. <?xml version='1.0' encoding='UTF-8'?>
    2. <feed xmlns='http://www.w3.org/2005/Atom' xmlns:media='http://search.yahoo.com/mrss/' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:gd='http://schemas.google.com/g/2005' xmlns:yt='http://gdata.youtube.com/schemas/2007'>
    3. <id>http://gdata.youtube.com/feeds/videos</id>
    4. <updated>2012-06-07T20:09:38.642Z</updated>
    5. <category scheme='http://schemas.google.com/g/2005#kind' term='http://gdata.youtube.com/schemas/2007#video'/>
    6. <title type='text'>YouTube Videos matching query: X0dd-gKhT_k</title>
    7. <logo>http://www.youtube.com/img/pic_youtubelogo_123x63.gif</logo>
    8. <link rel='alternate' type='text/html' href='http://www.youtube.com'/>
    9. <link rel='http://schemas.google.com/g/2006#spellcorrection' type='application/atom+xml' href='http://gdata.youtube.com/feeds/videos?q=X0dd-gKhk&amp;start-index=1&amp;max-results=25&amp;oi=spell&amp;spell=1' title='X0dd-gKhk'/>
    10. <link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://gdata.youtube.com/feeds/videos'/>
    11. <link rel='http://schemas.google.com/g/2005#batch' type='application/atom+xml' href='http://gdata.youtube.com/feeds/videos/batch'/>
    12. <link rel='self' type='application/atom+xml' href='http://gdata.youtube.com/feeds/videos?q=X0dd-gKhT_k&amp;start-index=1&amp;max-results=25'/>
    13. <author>
    14. <name>YouTube</name>
    15. <uri>http://www.youtube.com/</uri>
    16. </author>
    17. <generator version='2.1' uri='http://gdata.youtube.com'>YouTube data API</generator>
    18. <openSearch:totalResults>1</openSearch:totalResults>
    19. <openSearch:startIndex>1</openSearch:startIndex>
    20. <openSearch:itemsPerPage>25</openSearch:itemsPerPage>
    21. <entry>
    22. <id>http://gdata.youtube.com/feeds/videos/X0dd-gKhT_k</id>
    23. <published>2012-05-18T14:34:06.000Z</published>
    24. <updated>2012-06-07T06:24:29.000Z</updated>
    25. <category scheme='http://schemas.google.com/g/2005#kind' term='http://gdata.youtube.com/schemas/2007#video'/>
    26. <category scheme='http://gdata.youtube.com/schemas/2007/categories.cat' term='Shows' label='Shows'/>
    27. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='ytitty'/>
    28. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='ytitti'/>
    29. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='rundshow'/>
    30. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='die'/>
    31. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='anstalt'/>
    32. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='öffentlich'/>
    33. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='rechtliche'/>
    34. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='sender'/>
    35. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='öffentlich-rechtlich'/>
    36. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='rundfunk'/>
    37. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='GEZ'/>
    38. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='ARD'/>
    39. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='ZDF'/>
    40. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='Gottschalk'/>
    41. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='BR'/>
    42. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='WDR'/>
    43. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='DDR'/>
    44. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='Kuchen'/>
    45. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='Regisseur'/>
    46. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='Kunst'/>
    47. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='Rundfunkgebühren'/>
    48. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='putzfrau'/>
    49. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='cutterin'/>
    50. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='y-titty'/>
    51. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='y-titti'/>
    52. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='abgedrehte'/>
    53. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='comedy'/>
    54. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='diejungsvonyt'/>
    55. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='diejungs'/>
    56. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='phil'/>
    57. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='tc'/>
    58. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='og'/>
    59. <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='oguz'/>
    60. <title type='text'>Reich durch Gebühren - Die Anstalt</title>
    61. <content type='html'>
    62. &lt;div style="color: #000000;font-family: Arial, Helvetica, sans-serif; font-size:12px; font-size: 12px; width: 555px;"&gt;
    63. &lt;table cellspacing="0" cellpadding="0" border="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="140" valign="top" rowspan="2"&gt;&lt;div style="border: 1px solid #999999; margin: 0px 10px 5px 0px;"&gt;&lt;a href="http://www.youtube.com/watch?v=X0dd-gKhT_k&amp;amp;feature=youtube_gdata"&gt;&lt;img alt="" src="http://i.ytimg.com/vi/X0dd-gKhT_k/0.jpg"&gt;&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;
    64. &lt;td width="256" valign="top"&gt;&lt;div style="font-size: 12px; font-weight: bold;"&gt;&lt;a style="font-size: 15px; font-weight: bold; font-decoration: none;" href="http://www.youtube.com/watch?v=X0dd-gKhT_k&amp;amp;feature=youtube_gdata"&gt;Reich durch Geb&amp;uuml;hren - Die Anstalt&lt;/a&gt;
    65. &lt;br&gt;&lt;/div&gt;
    66. &lt;div style="font-size: 12px; margin: 3px 0px;"&gt;&lt;span&gt;Reich durch Klicks. Unter diesem Titel laufen viele Fernsehreportagen &amp;uuml;ber YouTube. Wir haben den Spie&amp;szlig; umgedreht. Facebook: facebook.com Twitter: twitter.com Zu den Extras: bit.ly Zur KomKomShow: bit.ly Die Jungs von Y-Titty liefern dir jeden #FreiTittytag AbGedrehte Comedy. Werde Teil der interaktiven Sketchshow und schreib uns deine Ideen f&amp;uuml;r Songparodien, Filmverarschen oder einfach nur verr&amp;uuml;ckte Clips. Jede Woche neu auf www.y-titty.de ! Grafiken Manniac youtube.com Y-TITTY sind: Philipp Laude, Matthias Roll und Oguz Yilmaz Buch &amp;amp; Regie: Philipp Laude Produktionsleitung: Matthias Roll Kamera: Oguz Yilmaz Cast: Philipp Laude, Matthias Roll, Oguz Yilmaz, Nikolai Will, Leonie Gareis und tolle Komparsen Produktion: YT-Tainment in Kooperation mit Mediakraft Networks&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;
    67. &lt;td style="font-size: 11px; line-height: 1.4em; padding-left: 20px; padding-top: 1px;" width="146" valign="top"&gt;&lt;div&gt;&lt;span style="color: #666666; font-size: 11px;"&gt;From:&lt;/span&gt;
    68. &lt;a href="http://www.youtube.com/channel/UCzZ2N81E6ureM3slotgJfUw"&gt;YTITTY&lt;/a&gt;&lt;/div&gt;
    69. &lt;div&gt;&lt;span style="color: #666666; font-size: 11px;"&gt;Views:&lt;/span&gt;
    70. 683966&lt;/div&gt;
    71. &lt;div style="white-space: nowrap;text-align: left"&gt;&lt;img style="border: 0px none; margin: 0px; padding: 0px; vertical-align: middle; font-size: 11px;" align="top" alt="" src="http://gdata.youtube.com/static/images/icn_star_full_11x11.gif"&gt; &lt;img style="border: 0px none; margin: 0px; padding: 0px; vertical-align: middle; font-size: 11px;" align="top" alt="" src="http://gdata.youtube.com/static/images/icn_star_full_11x11.gif"&gt; &lt;img style="border: 0px none; margin: 0px; padding: 0px; vertical-align: middle; font-size: 11px;" align="top" alt="" src="http://gdata.youtube.com/static/images/icn_star_full_11x11.gif"&gt; &lt;img style="border: 0px none; margin: 0px; padding: 0px; vertical-align: middle; font-size: 11px;" align="top" alt="" src="http://gdata.youtube.com/static/images/icn_star_full_11x11.gif"&gt; &lt;img style="border: 0px none; margin: 0px; padding: 0px; vertical-align: middle; font-size: 11px;" align="top" alt="" src="http://gdata.youtube.com/static/images/icn_star_half_11x11.gif"&gt;&lt;/div&gt;
    72. &lt;div style="font-size: 11px;"&gt;12408
    73. &lt;span style="color: #666666; font-size: 11px;"&gt;ratings&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
    74. &lt;tr&gt;&lt;td&gt;&lt;span style="color: #666666; font-size: 11px;"&gt;Time:&lt;/span&gt;
    75. &lt;span style="color: #000000; font-size: 11px; font-weight: bold;"&gt;05:36&lt;/span&gt;&lt;/td&gt;
    76. &lt;td style="font-size: 11px; padding-left: 20px;"&gt;&lt;span style="color: #666666; font-size: 11px;"&gt;More in&lt;/span&gt;
    77. &lt;a href="http://www.youtube.com/videos?c=43"&gt;Shows&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
    78. </content>
    79. <link rel='alternate' type='text/html' href='http://www.youtube.com/watch?v=X0dd-gKhT_k&amp;feature=youtube_gdata'/>
    80. <link rel='http://gdata.youtube.com/schemas/2007#video.responses' type='application/atom+xml' href='http://gdata.youtube.com/feeds/videos/X0dd-gKhT_k/responses'/>
    81. <link rel='http://gdata.youtube.com/schemas/2007#video.related' type='application/atom+xml' href='http://gdata.youtube.com/feeds/videos/X0dd-gKhT_k/related'/>
    82. <link rel='http://gdata.youtube.com/schemas/2007#mobile' type='text/html' href='http://m.youtube.com/details?v=X0dd-gKhT_k'/>
    83. <link rel='self' type='application/atom+xml' href='http://gdata.youtube.com/feeds/videos/X0dd-gKhT_k'/>
    84. <author>
    85. <name>YTITTY</name>
    86. <uri>http://gdata.youtube.com/feeds/users/YTITTY</uri>
    87. </author>
    88. <gd:comments>
    89. <gd:feedLink rel='http://gdata.youtube.com/schemas/2007#comments' href='http://gdata.youtube.com/feeds/videos/X0dd-gKhT_k/comments' countHint='11603'/>
    90. </gd:comments>
    91. <yt:hd/>
    92. <media:group>
    93. <media:category label='Shows' scheme='http://gdata.youtube.com/schemas/2007/categories.cat'>Shows</media:category>
    94. <media:content url='http://www.youtube.com/v/X0dd-gKhT_k?version=3&amp;f=videos&amp;app=youtube_gdata' type='application/x-shockwave-flash' medium='video' isDefault='true' expression='full' duration='336' yt:format='5'/>
    95. <media:content url='rtsp://v6.cache1.c.youtube.com/CiILENy73wIaGQn5T6EC-l1HXxMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp' type='video/3gpp' medium='video' expression='full' duration='336' yt:format='1'/>
    96. <media:content url='rtsp://v3.cache4.c.youtube.com/CiILENy73wIaGQn5T6EC-l1HXxMYESARFEgGUgZ2aWRlb3MM/0/0/0/video.3gp' type='video/3gpp' medium='video' expression='full' duration='336' yt:format='6'/>
    97. <media:description type='plain'>Reich durch Klicks. Unter diesem Titel laufen viele Fernsehreportagen über YouTube. Wir haben den Spieß umgedreht. Facebook: facebook.com Twitter: twitter.com Zu den Extras: bit.ly Zur KomKomShow: bit.ly Die Jungs von Y-Titty liefern dir jeden #FreiTittytag AbGedrehte Comedy. Werde Teil der interaktiven Sketchshow und schreib uns deine Ideen für Songparodien, Filmverarschen oder einfach nur verrückte Clips. Jede Woche neu auf www.y-titty.de ! Grafiken Manniac youtube.com Y-TITTY sind: Philipp Laude, Matthias Roll und Oguz Yilmaz Buch &amp; Regie: Philipp Laude Produktionsleitung: Matthias Roll Kamera: Oguz Yilmaz Cast: Philipp Laude, Matthias Roll, Oguz Yilmaz, Nikolai Will, Leonie Gareis und tolle Komparsen Produktion: YT-Tainment in Kooperation mit Mediakraft Networks</media:description>
    98. <media:keywords>ytitty, ytitti, rundshow, die, anstalt, öffentlich, rechtliche, sender, öffentlich-rechtlich, rundfunk, GEZ, ARD, ZDF, Gottschalk, BR, WDR, DDR, Kuchen, Regisseur, Kunst, Rundfunkgebühren, putzfrau, cutterin, y-titty, y-titti, abgedrehte, comedy, diejungsvonyt, diejungs, phil, tc, og, oguz</media:keywords>
    99. <media:player url='http://www.youtube.com/watch?v=X0dd-gKhT_k&amp;feature=youtube_gdata_player'/>
    100. <media:thumbnail url='http://i.ytimg.com/vi/X0dd-gKhT_k/0.jpg' height='360' width='480' time='00:02:48'/>
    101. <media:thumbnail url='http://i.ytimg.com/vi/X0dd-gKhT_k/1.jpg' height='90' width='120' time='00:01:24'/>
    102. <media:thumbnail url='http://i.ytimg.com/vi/X0dd-gKhT_k/2.jpg' height='90' width='120' time='00:02:48'/>
    103. <media:thumbnail url='http://i.ytimg.com/vi/X0dd-gKhT_k/3.jpg' height='90' width='120' time='00:04:12'/>
    104. <media:title type='plain'>Reich durch Gebühren - Die Anstalt</media:title>
    105. <yt:duration seconds='336'/>
    106. </media:group>
    107. <gd:rating average='4.7475824' max='5' min='1' numRaters='12408' rel='http://schemas.google.com/g/2005#overall'/>
    108. <yt:statistics favoriteCount='822' viewCount='683966'/>
    109. </entry>
    110. </feed>


    Ich benütze folgenden Code um die Informationen auszulesen:

    VB.NET-Quellcode

    1. Dim ID As String = Console.ReadLine
    2. 'Ein XDokument Objekt, das später alle Informationen enthalten wird.
    3. Dim InfoDocument As XDocument
    4. 'Lesen der Informationen und speichern in des XML-Dokuments
    5. InfoDocument = XDocument.Load("http://gdata.youtube.com/feeds/videos?q=" + ID)
    6. Dim Author As String = InfoDocument.<feed>.<entry>.<author>.<name>.Value
    7. Console.WriteLine("Name des Autors:" + Author)
    8. Dim Description
    Was ist dein Problem? Dass in der XML-Datei nicht der eigentliche Downloadlink vorkommt?

    Den könntest du so abfragen:

    VB.NET-Quellcode

    1. String.Format("http://www.youtube.com/get_video_info?video_id={0}&asv=3&el=detailpage&hl=en_US", VideoID)
    Sorry, mein Fehler.
    Hab das vor meinen Urlaub geschrieben und habe nicht mehr danach gesehen...
    Mein Problem ist, dass ich Informationen wie Autor oder Bildlink nicht auslesen kann und keine Idee habe wieso.
    Er bringt mir ja auch keine Fehlermeldung die mir helfen könnte.

    @Infinity: Ne das hab ih schon. Ich will nur auf das kürzere Feed umsteigen für geschwindigkeit.

    Nochmals Sorry.
    Der Feed ist doch größer, als das was dir mein Link zurückliefert und den musst du sowieso für den Download link abrufen.

    Wenn du keine Fehlermeldung hast dann schreibe wenigstens, was dein bisheriges Ergebnis ist und was du eigentlich erreichen Möchtest.

    Zu deinen Fragen:
    Der Autor befindet sich im Feed zwischen "<author><name>" und "</name>", z. B. in gdata.youtube.com/feeds/videos?q=zFJiM9xbqUo

    Der Bildlink setzt sich so zusammen:

    VB.NET-Quellcode

    1. String.Format("http://i.ytimg.com/vi/{0}/default.jpg", VideoID)


    Es ist vielleicht nicht sinnvoll, das Feed mit der XDocument-Klasse zu verarbeiten, denn die kann bei einem Fehler im Dokument, der ja evtl. auftreten kann, eine Exception auslösen.
    Okay, das von mir war jetzt nicht sehr präzise.
    Also: Ich habe eine Suchfunktion. Und wenn man da einen link eingibt, soll es alle Informationen wie Name des Autors, Länge, usw. anzeigen.
    Der Link den du mir nennst kenn ich bereits. Mit umsteigen meinte ich von der YouTube Seite, die man im Browser lädt, zum Feed. Und das ist eine deutlich kürzere Version.

    Mein Problem aber ist, wie ich das XML-Dokument richtig auslese. Habe schon Tutorials von msdn angesehen, brachte mir aber nichts.

    Du sagst, ich solle es nicht mit dem XDocument Klasse machen. Wie soll ich es dann machen?
    Bitte das klasische String.Split() als letzte Option nennen!

    Aber Danke schon mal für Bildlink!
    Ich würde es nicht mit XDocument machen, weil es bei Fehlern zu nichts zu gebrauchen ist. Du könntest RegEx verwenden. In meinem Youtube Downloader verwende ich z. B. folgende, eigentlich ziemlich billige Funktion und innerhalb einer Zeichenkette von einer bestimmten Stelle bis zu einer bestimmten Stelle die Zeichen zu extrahieren:

    VB.NET-Quellcode

    1. Private Function Substring(SourceString As String, StartString As String, Optional EndString As String = Nothing, Optional StartIndex As Integer = 0, Optional DecodeHtml As Boolean = False) As String
    2. Dim BeginPos As Integer = SourceString.IndexOf(StartString, StartIndex) + StartString.Length
    3. If BeginPos < StartString.Length Then Return Nothing
    4. Dim EndPos As Integer
    5. If EndString Is Nothing Then
    6. EndPos = SourceString.Length
    7. Else
    8. EndPos = SourceString.IndexOf(EndString, BeginPos)
    9. If EndPos < 0 Then EndPos = SourceString.Length
    10. End If
    11. Dim Length As Integer = EndPos - BeginPos
    12. If DecodeHtml Then
    13. Return SourceString.Substring(BeginPos, Length)
    14. Else
    15. Return HTMLDecode(SourceString.Substring(BeginPos, Length))
    16. End If
    17. End Function


    HTMLDecode kannst du weglassen. Die Funktion arbeitet wahrscheinlich schneller, als RegEx, was wesentlich komplexer funktioniert. Du musst beachten, dass die Funktion Nothing zurückgibt, wenn nichts gefunden wurde.

    Was soll generell daran schlecht sein, die String.Split-Methode zu verwenden (mal davon abgesehen, dass ich nicht weiß, wofür du sie bei deinem speziellen Problem hier verwenden würdest)?

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

    Eigentlich wollte ich es nicht als String behandeln...
    Der Grund ist einfach: String ist schreibgeschützt, wird aber nicht so behandelt. Jedes Mal, wenn man den String verändert wird eine neue String-Instanz erstellt und der alte String wird der Garbage Collection überlassen. Es entseht bei komplexen Aufgaben ein relativ großer Header. Von der XMLReaderVariante wär deiner Meinung dann auch abzuraten, oder? Es lässt sich aber bei XMLReader ein Event einrichten der anstatt einer Exception aufgerufen wird und die fehlerhafte Zeile wird übersprungen.
    Wenn das möglich ist (wusste ich nicht), dann nimm den XmlReader.

    Dass von Strings immer neue Instanzen erstellt werden, anstatt bestehende zu verändern stimmt natürlich. Deswegen gibt es auch den StringBuilder. Aber die paar Byte, naja.
    Hab mal alles ausprobiert und mich dann für die String Variante entschieden.
    Der Code ist einfach besser lesbar.
    Das bisschen, was die XmlReader Variante schneller ist, opfere ich gern für Lesbarkeit und verständlichkeit.