Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Daten eines YouTube Videos/Playlist auslesen per SimpleXML

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Daten eines YouTube Videos/Playlist auslesen per SimpleXML

    Hallo,

    ich bin momentan dabei, ein Video-System für die Website eines Freundes zu Programmieren. Dazu habe ich ein Skript, welches die Playlists eines bestimmten YouTube Users in eine MySQL Tabelle schreibt. Nun möchte ich noch die in diesen Playlists befindlichen Videos auch in eine MySQL Tabelle schreiben. Die Videos werden mithilfe einer ID den Playlists zugeordnet. (Nachfolgend im Skript heissen die Playlists 'Kategorien')

    PHP-Code:
    //UPDATE PLAYLISTS
        
    $query "SELECT * FROM categorys";
        
    $result mysql_query($query);
        while(
    $data mysql_fetch_array($result)) {
            
    $act_cat $data['category_id'];
            
    $act_cat_name $data['category_name'];
            
    $playlist_link $data['playlist_link'];
            
    $playlist str_replace("http://www.youtube.com/playlist?list=PL"""$playlist_link);
            
    $url "http://gdata.youtube.com/feeds/api/playlists/$playlist?v=2";
            if ( 
    $url ) {
            
    $num_items 200;
            
    $rss fetch_rss$url );
            
    $items array_slice($rss->items0,$num_items);
            }
            
            echo 
    "PLAYLIST ID: ".$playlist."<br>";
            echo 
    "CATEGORY NAME: ".$act_cat_name."<br><br>";

            echo 
    "<ul id='feed'>";
            foreach (
    $items as $item) {
                
    $href $item['link'];
                
    $title $item['title'];
                
    //GET LINK
                    
    $xml simplexml_load_file("http://gdata.youtube.com/feeds/api/playlists/".$playlist); 
                        
    $media $xml->entry->children('media'true);
                        
    $vid_Link $media->group[0]->player[0];
                        
    $vid_Link str_replace ("http://www.youtube.com/watch?v="""$vid_Link);
                        
    $vid_Link str_replace ("\&amp\;feature=youtube_gdata_player"""$vid_link);
                    
    $reallink "http://www.youtube.com/watch?v=".$vid_link;
                
    //GET VIDEO TITLE
                    
    $xml simplexml_load_file("http://gdata.youtube.com/feeds/videos?q=".$vid_link); 
                        
    $vidtitle $xml->entry[0]->title[0]; 
                    echo 
    "VIDTITLE=".$vidtitle."<br><br>VIDLINK=".$vid_link."<br><br>";
                
    //CHECK FOR EXIST OF THE VID
                
    $query "SELECT * FROM videolist WHERE category='$act_cat' AND reallink='$reallink'";
                
    $read mysql_query($query);
                if(
    mysql_num_rows($read)==1) {
                    echo 
    "Das Video \"$vidtitle\" mit der YouTube-ID $vid_link EXISTIERT<br><br>";
                } else { 
                    echo 
    "Das Video \"$vidtitle\" mit der YouTube-ID $vid_link existiert NICHT und wird nun erstellt<br><br>";
                    
    $entry "INSERT INTO videolist (video_name, reallink, category) VALUES ('$vidtitle','$reallink', '$act_cat')";
                    
    $enter mysql_query($entry);
                    echo 
    "Das Video \"$vidtitle\" wurde erstellt.<br><br>";
                }
            }
            echo 
    "</ul>";
        } 
    Daraus erhalte ich diese Ausgabe:

    Code:
    PLAYLIST ID: 1F9A947A658B88AB
    CATEGORY NAME: Counter Strike Global Offensive
    
        VIDTITLE=ADELE - Skyfall
    
        VIDLINK=
    
        Das Video "ADELE - Skyfall" mit der YouTube-ID existiert NICHT und wird nun erstellt
    
        Das Video "ADELE - Skyfall" wurde erstellt.
    
        VIDTITLE=ADELE - Skyfall
    
        VIDLINK=
    
        Das Video "ADELE - Skyfall" mit der YouTube-ID existiert NICHT und wird nun erstellt
    
        Das Video "ADELE - Skyfall" wurde erstellt.
    
    PLAYLIST ID: B74E3690F754C03A
    CATEGORY NAME: Battlefild 3 Multyplayer
    
    PLAYLIST ID: D9C809BB6428F74B
    CATEGORY NAME: A-X-L-P Special
    In der Tabelle "Categorys" sind alle Angaben bei 'CATEGORY NAME'.

    Die Playlist "Counter Strike Global Offensive" enthält jedoch nicht 2 mal "Adele - Skyfall" sondern (in der Reihenfolge):

    Counter Strike global Ofensive[HD][Englisch]Sniper Montage!
    Counter Strike Global Ofensive Gameplay[HD] a littel sniper montage!

    Was ist hier falsch? Und wieso wird zufällig irgendein Video ausgewählt?

    Danke im Voraus
    Ben

  • #2
    Also wenn man den Link im Browser eingibt kommt das richtige Ergebnis an. (Also bei der Playlistabfrage)
    Schau mal, ob du die YoutubeId richtig extrahiert hast.

    Kommentar


    • #3
      Die YouTube ID kann ich, wie ich gelesen habe, so nicht extrahieren. Sie liegt nämlich in einem Tag namens <media&#58;player>. Da dies ein "child" ist, stand irgendwo, ich sollte folgendes machen:
      PHP-Code:
      $feed simplexml_load_file('http://www.sitepoint.com/recent.rdf');
      foreach (
      $feed->item as $item) {
        
      $ns_dc $item->children('http://purl.org/dc/elements/1.1/');
        echo 
      $ns_dc->date;

      Dies würde aber nicht direkt funktionieren. Jedes Video aus der Playlist liegt in einem <entry>-Tag. Mit der foreach-Schleife gehe ich ja aber schon einen Eintrag nach dem anderen durch. Also müsste ich mit jedem Durchlauf der Schleife den nächsten <entry> Tag ansprechen. Am Ende der Schleife würde dann halt immer so etwas stehen:
      PHP-Code:
      $durchlauf $durchlauf 1
      SimpleXML müsste dann immer den Entry-Tag benutzen, der in $durchlauf angegeben ist.

      Kommentar


      • #4
        Ich schalge vor du suchst dir mal ne Referenz zu simple_xml und ließt dich mal in die Materie ein.

        Alles nur zu übernehmen ist immer gefährlich, weil man auch Fehler dabei nicht erkennt, die durch ungünstige Zusammnkünften von Codeschnipseln auftreten.

        Lass dir doch einfach mal die ID ausgeben, die raus gekommen ist und vergleiche sie mit der die er finden soll.

        Kommentar


        • #5
          Ok, eine Referenz werde ich mir (durch)lesen. Und übrigens: Die ID sollte eigentlich bei
          Code:
          VIDLINK=
          in der Ausgabe erscheinen. Da
          PHP-Code:
          echo "VIDTITLE=".$vidtitle."<br><br>VIDLINK=".$vid_link."<br><br>"
          ja soweit richtig sein müsste, schließe ich daraus, das einfach kein Video-Link ausgelesen wurde. Woher dann die Willkürlichen Videos herkommen, weiß ich selber nicht.
          Heute war die Ausgabe nämlich (bei gleichem Code):
          Code:
          PLAYLIST ID: 1F9A947A658B88AB
          CATEGORY NAME: Counter Strike Global Offensive
          
              VIDTITLE=Martyn Ashton - Road Bike Party
          
              VIDLINK=
          
              Das Video "Martyn Ashton - Road Bike Party" mit der YouTube-ID existiert NICHT und wird nun erstellt
          
              Das Video "Martyn Ashton - Road Bike Party" wurde erstellt.
          
              VIDTITLE=Martyn Ashton - Road Bike Party
          
              VIDLINK=
          
              Das Video "Martyn Ashton - Road Bike Party" mit der YouTube-ID existiert NICHT und wird nun erstellt
          
              Das Video "Martyn Ashton - Road Bike Party" wurde erstellt.
          
          PLAYLIST ID: B74E3690F754C03A
          CATEGORY NAME: Battlefild 3 Multyplayer
          
          PLAYLIST ID: D9C809BB6428F74B
          CATEGORY NAME: A-X-L-P Special
          Merkwürdig.

          Kommentar


          • #6
            Das da zufällge Videos kommen dürfte ein Google-Feature sein, wenn man leere Querys absendet. (vielleicht kommt da auch je das Video des Tages)
            Auf jeden Fall solltest du dir mal simple_xml aneignen und die Fehlerausgabe einschalten, ich vermute mal, dass da sogar schon Warnungen oder zumindest Hinweise kommen müssten.
            Schau dir auch mal folgenden Quelltext mit einem XML-Editor an:
            http://gdata.youtube.com/feeds/api/p...9A947A658B88AB

            print_r($xml) wäre sicherlich auch mal hilfreich.

            Kommentar


            • #7
              Das mit dem XML-Editor ist logisch, habe ich auch schon gemacht und mir einen Überblick verschafft. Demnach müsste ich folgenden Teil abrufen:
              Code:
              feed > entry (gibt es natürlich 2 mal, wegen 2 Videos) > media:group > media:title
              Dein Vorschlag:
              PHP-Code:
              print_r($xml); 
              hat mir natürlich einen riesigen Text gebracht. Dort liegen aber Die Videonamen einfach so:
              Code:
              [title] => Counter Strike global Ofensive [HD] [Englisch] Sniper Montage!
              [title] => Counter Strike Global Ofensive Gameplay[HD] a littel sniper montage!
              Damit umzugehen ist wirklich nicht einfach (anscheinend gehört es schon zum Fortgeschrittenen SimpleXML)
              Schonmal Danke für deine bisherige Hilfe.

              EDIT:
              Habe soeben herausgefunden, das print_r sowieso alle Namespaces ignoriert.

              Kommentar


              • #8
                Also ich würde dir mal empfehlen einige Grundlagen zum Umgang mit Objekten anzulesen.
                Ich habe allein aus der recht schönen Ausgabe von print_r() (Genau lesen, dann erkennst du was Objekte, was Arrays und was Attribute sind.) mal ein kurzes Skript gebastelt, was nur die Titel und den Link hervorbringt:
                PHP-Code:
                <?php
                error_reporting
                (E_ALL);
                $playlist '1F9A947A658B88AB';
                $xml simplexml_load_file("http://gdata.youtube.com/feeds/api/playlists/".$playlist);
                foreach(
                $xml->entry as $ent){
                    echo 
                'Titel:'.$ent->title."<br/>\n";
                    
                $attributes $ent->link[0]->attributes();
                    
                //    echo '<pre>'.print_r($ent->link[0], true).'</pre>';
                    
                echo 'Link:'.$attributes['href']."<br/>\n";
                }
                //echo '<pre>'.print_r($xml, true).'</pre>';

                ?>
                PS: Falls du mal die Kommentare entfernst siehst du wie ich mich langsam hin gearbeitet habe.

                Kommentar


                • #9
                  Teste es gleich mal. Vielleicht verstehe ich dann ein bisschen mehr

                  EDIT:
                  Habe es jetzt getestet. Funktioniert ja wunderbar! Als nächste versuche ich jetzt ohne foreach() Schleife auszukommen, da mein Skript (siehe erster Beitrag) bereits mit einer foreach() Schleife die Einzelnen Playlists durchgehe

                  Kommentar


                  • #10
                    PHP-Code:
                    $playlist '1F9A947A658B88AB'// example playlist

                    /**
                     *  Youtube baseURL for playlist feeds
                     **/
                    $baseurl 'http://gdata.youtube.com/feeds/api/playlists/';

                    /**
                     *  load playlist
                     **/
                    $xmlObj simplexml_load_file($baseurl.$playlist);

                    /**
                     *  register media namespace
                     **/
                    foreach ( $xmlObj->getDocNamespaces() as $ns => $uri ) {
                        if ( 
                    $ns === 'media' ) {
                            
                    $xmlObj->registerXPathNamespace($ns$uri);
                        }
                    }

                    /**
                     *  register root-namespace as 'atom'
                     **/
                    $xmlObj->registerXPathNamespace('atom''http://www.w3.org/2005/Atom');

                    $entries $xmlObj->xpath('atom:entry/*/media:player');

                    foreach ( 
                    $entries as $current ) {
                        
                    /**
                         *  extract YVID
                         **/

                        
                    $yvid parse_url($current['url']);
                        
                    $yvid explode('&'$yvid['query']);

                        
                    $data array_map(function($in) { return explode('='$in); }, $yvid);

                        
                    $yvid = array();
                        foreach ( 
                    $data as $tok ) {
                            
                    $yvid$tok[0] ] = $tok[1];
                        }

                        unset(
                    $data);

                        
                    /**
                         *  show YVID
                         **/
                        
                    if ( !isset($yvid['v']) ) {
                            echo 
                    'YVID: not found'.PHP_EOL;
                            continue;
                        }

                        echo 
                    'YVID: '.$yvid['v'].PHP_EOL;

                    results:
                    Code:
                    YVID: alXFjGFL1Lo
                    YVID: wjhR1msKui4

                    Kommentar


                    • #11
                      Zitat von ChrisvA Beitrag anzeigen
                      Ich habe allein aus der recht schönen Ausgabe von print_r() (Genau lesen, dann erkennst du was Objekte, was Arrays und was Attribute sind.) mal ein kurzes Skript gebastelt, was nur die Titel und den Link hervorbringt:
                      PHP-Code:
                      <?php
                      error_reporting
                      (E_ALL);
                      $playlist '1F9A947A658B88AB';
                      $xml simplexml_load_file("http://gdata.youtube.com/feeds/api/playlists/".$playlist);
                      foreach(
                      $xml->entry as $ent){
                          echo 
                      'Titel:'.$ent->title."<br/>\n";
                          
                      $attributes $ent->link[0]->attributes();
                          
                      //    echo '<pre>'.print_r($ent->link[0], true).'</pre>';
                          
                      echo 'Link:'.$attributes['href']."<br/>\n";
                      }
                      //echo '<pre>'.print_r($xml, true).'</pre>';

                      ?>
                      Super! Danke! Mit einer kleinen Änderung davon hat alles was ich wollte super funktioniert! Hier noch mal mein "Endergebnis":
                      PHP-Code:
                      <?php
                      //UPDATE PLAYLISTS
                          
                      $query "SELECT * FROM categorys";
                          
                      $result mysql_query($query);
                          while(
                      $data mysql_fetch_array($result)) {
                              
                      $act_cat $data['category_id'];
                              
                      $act_cat_name $data['category_name'];
                              
                      $playlist_link $data['playlist_link'];
                              
                      $playlist str_replace("http://www.youtube.com/playlist?list=PL"""$playlist_link);
                              
                              echo 
                      "PLAYLIST ID: ".$playlist."<br>";
                              echo 
                      "CATEGORY NAME: ".$act_cat_name."<br><br>";

                              echo 
                      "<ul id='feed'>";

                                  
                      $href $item['link'];
                                  
                      $title $item['title'];
                                  
                      //GET LINK
                                      
                      error_reporting(E_ALL);
                                      
                      $xml simplexml_load_file("http://gdata.youtube.com/feeds/api/playlists/".$playlist);
                                      foreach(
                      $xml->entry as $ent){
                                          
                      $vidtitle $ent->title;
                                          
                      $attributes $ent->link[0]->attributes();
                                          
                      //    echo '<pre>'.print_r($ent->link[0], true).'</pre>';
                                          
                      $vid_link $attributes['href'];
                                          
                      $vid_link str_replace ("http://www.youtube.com/watch?v="""$vid_link);
                                          
                      $vid_link str_replace ("&feature=youtube_gdata"""$vid_link);
                                          
                      $reallink "http://www.youtube.com/watch?v=".$vid_link;
                                          echo 
                      "Videoname: ".$vidtitle."<br>Videolink: ".$vid_link."<br><br>";
                                          
                      //print_r($xml);
                                          //CHECK FOR EXIST OF THE VID
                                          
                      $query "SELECT * FROM videolist WHERE category='$act_cat' AND reallink='$reallink'";
                                          
                      $read mysql_query($query);
                                          if(
                      mysql_num_rows($read)==1) {
                                              echo 
                      "Das Video \"$vidtitle\" mit der YouTube-ID $vid_link EXISTIERT<br><br>";
                                          } else { 
                                              echo 
                      "Das Video \"$vidtitle\" mit der YouTube-ID $vid_link existiert NICHT und wird nun erstellt<br><br>";
                                              
                      $entry "INSERT INTO videolist (videoname, reallink, category) VALUES ('$vidtitle','$reallink', '$act_cat')";
                                              
                      $enter mysql_query($entry);
                                              echo 
                      "Das Video \"$vidtitle\" wurde erstellt.<br><br>";
                                          }
                                      echo 
                      "</ul>";
                                      }
                                      
                      //echo '<pre>'.print_r($xml, true).'</pre>';
                          
                      }
                          
                      ?>
                      Die Ausgabe davon war dann das erste Mal natürlich:
                      Code:
                          
                      PLAYLIST ID: 1F9A947A658B88AB
                      CATEGORY NAME: Counter Strike Global Offensive
                      
                      Videoname: Counter Strike global Ofensive[HD][Englisch]Sniper Montage!
                      Videolink: alXFjGFL1Lo
                      
                      Das Video "Counter Strike global Ofensive[HD][Englisch]Sniper Montage!" mit der YouTube-ID alXFjGFL1Lo existiert NICHT und wird nun erstellt
                      
                      Das Video "Counter Strike global Ofensive[HD][Englisch]Sniper Montage!" wurde erstellt.
                      
                      Videoname: Counter Strike Global Ofensive Gameplay[HD] a littel sniper montage!
                      Videolink: wjhR1msKui4
                      
                      Das Video "Counter Strike Global Ofensive Gameplay[HD] a littel sniper montage!" mit der YouTube-ID wjhR1msKui4 existiert NICHT und wird nun erstellt
                      
                      Das Video "Counter Strike Global Ofensive Gameplay[HD] a littel sniper montage!" wurde erstellt.
                      
                      PLAYLIST ID: B74E3690F754C03A
                      CATEGORY NAME: Battlefild 3 Multyplayer
                      
                      PLAYLIST ID: D9C809BB6428F74B
                      CATEGORY NAME: A-X-L-P Special
                      Und das zweite Mal (auch logisch):
                      Code:
                          
                      PLAYLIST ID: 1F9A947A658B88AB
                      CATEGORY NAME: Counter Strike Global Offensive
                      
                      Videoname: Counter Strike global Ofensive[HD][Englisch]Sniper Montage!
                      Videolink: alXFjGFL1Lo
                      
                      Das Video "Counter Strike global Ofensive[HD][Englisch]Sniper Montage!" mit der YouTube-ID alXFjGFL1Lo EXISTIERT
                      
                      Videoname: Counter Strike Global Ofensive Gameplay[HD] a littel sniper montage!
                      Videolink: wjhR1msKui4
                      
                      Das Video "Counter Strike Global Ofensive Gameplay[HD] a littel sniper montage!" mit der YouTube-ID wjhR1msKui4 EXISTIERT
                      
                      PLAYLIST ID: B74E3690F754C03A
                      CATEGORY NAME: Battlefild 3 Multyplayer
                      
                      PLAYLIST ID: D9C809BB6428F74B
                      CATEGORY NAME: A-X-L-P Special
                      Jetzt muss ich nur noch ein paar Designanpassungen vornehmen und alles ist gut! Vielen Dank noch einmal!

                      Kommentar

                      Lädt...
                      X