php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
array-push und Youtube API3


 
Prominenter
03-04-2017, 18:34 
 
Hi@all

brauche mal dringend Hilfe bitte.
Versuche schon den ganzen Tage eine Liste meiner YoutubeVideos auszulesen.
Da das Ausleseergebniss über die Youtube APi auf maxResult 50 begrenzt ist muss ich das über erneuten Aufruf des Links mittel PageToken machen.
Bis hierher klappt das auch ganz gut.

Nun wollte ich die Ergebnisse in einem einzigen Array zusammenfassen um eine Gesamtliste ausgeben zu können.
Aber irgendwie funktioniert das zusammenfügen der Daten nicht, es wird mir immer nur der erste Array-Inhalt angezeigt.

Ich hoffe ich hab mich verständlich ausgedrückt.

<?php
//YouTube API v3.0

//for debugging purposes
$time_start = microtime(true);

# Link Data
$api_key = "___"; //your public access API key from google's developer console, enable youtube data api v3
$playlist_id = "___"; //replace with a youtube playlist ID, eg: PLOU2XLYxmsIJQhUeN9S2kQ-3PWzPZVZD0
$maxResults = "50"; //max JSON results
$path = getPath();
$inhalt_gesamt="";

# Link umwandeln
#$feed = json_decode(file_get_contents($path));
//Speichern der API Abfrage im JSON Format
$api = getSslPage($path);
//Umwandeln des JSON Format in einen PHP Array
$feed = json_decode($api, true);

# Info Ausgabe
echo "<b>Playlist id:</b> ".$playlist_id."<br>";
echo "<b>Max Results:</b> ".$maxResults."<br>";
echo "<b>Feed URL:</b> <a href='".$path."' target='_blank'>".$path."</a><br><br>"; //output the path used
echo "<hr>";

# Daten zusammenfassen
$inhalt_gesamt = $feed;

# Ausgabe erste Seite (0-50)
parseJSON($inhalt_gesamt);
# prüfen ob weitere Daten vorhanden
nextToken();
# Ausgabe
parseJSON($inhalt_gesamt);


# Funktion Next Page
function nextToken()
{
global $playlist_id, $api_key, $maxResults, $feed, $inhalt_gesamt;
if(isset($feed['nextPageToken']))
{
$nextToken = $feed['nextPageToken']; //get the next token
echo "<b>Next page token:</b> ".$nextToken."<br><br>";
echo "<hr>";
echo "<i>Using the next page token, we can retrieve the next set of results.</i><br><br>";
# Link zur nächsten Seite (51-100 usw.) erzeugen
$path = getPath($nextToken);
# Link umwandeln
#$feed = json_decode(file_get_contents($path));
//Speichern der API Abfrage im JSON Format
$api = getSslPage($path);
//Umwandeln des JSON Format in einen PHP Array
$feed = json_decode($api, true);
# Info Ausgabe
echo "<b>Feed URL:</b> <a href='".$path."' target='_blank'>".$path."</a><br><br>"; //output the path used
# Ausgabe
array_push($inhalt_gesamt, $feed); // ??? - funktioniert nicht ???
parseJSON($feed);
# Prüfen ob weitere Seiten vorhanden
nextToken();

# Letzte Seite
if(isset($feed['nextPageToken']))
{
//check for last page
$nextToken = $feed['nextPageToken'];
echo "<b>Next page token:</b> ".$nextToken."<br>";
}
else
{
echo "No more next page token!<br>";
}
$prevToken = $feed['prevPageToken']; //we can also retrieve a previous token
echo "<b>Previous page token:</b> ".$prevToken."<br><br>";
}
else
{
//if playlist is shorter than max results
echo "<b>Next page token doesn't exist because playlist is too short!<br>Please choose a playlist longer than your max results: </b>".$maxResults;
}
}
echo "<hr>";


# Funktion Pfad erzeugen
function getPath($nextToken = FALSE)
{
if($nextToken === FALSE)
{
//check for next page token
$nextPageToken = "";
}
else
{
$nextPageToken = "&pageToken=".$nextToken."";
}
global $playlist_id, $api_key, $maxResults;
$path = "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&maxResults=".$maxResults."&playlistId=".$playlist_id."".$nextPageToken."&key=".$api_key."";
return $path;
}

# Funktion Ausgabe
function parseJSON($feed)
{
global $maxResults;
echo "<br><br>";
for($i = 0; $i < 1000; $i++)
{
if(isset($feed['items'][$i]))
{
//if result exist
//retrieve video information
$video_title = $feed['items'][$i]['snippet']['title'];
$video_description = $feed['items'][$i]['snippet']['description'];
//output the results
echo ($i+1)." <b>Title: </b>".$video_title."<br>";
#echo "<b>Description: </b>".$video_description."<br><br>";
}
}
}

# Funktion zum Auslesen einer Datei mit cURL
function getSslPage($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}

//for debugging purposes
$time_end = microtime(true);
$time = $time_end - $time_start;
echo "<br>Loading time: ".$time;
?>

Thx@all for help

 
chorn
07-04-2017, 17:23 
 
das Script arbeitet auf jeden Fall zu viel mit globals und Funktionen ohne Rückgabewert, das ist extrem schlecht les- und wartbar. Müsste da nicht irgendwo eine Schleife sein, die so lange Ergebnisse zieht bis nichts mehr kommt? Was wird denn überhaupt an die API geschickt?

 
mermshaus
09-04-2017, 19:07 
 
Ich würde es erst mal lesbar formatieren (Einrückungstiefe von mehr als einem Space, vier wären ein guter Wert; Funktionsdeklarationen vor normalen Code schreiben und nicht dahinter) und dann Debugging betreiben.

- https://php-de.github.io/jumpto/faq/#debugging

Erster Kandidat wäre für mich nextToken.

Als Außenstehender ohne YouTube-API-Key kann man dabei nicht helfen.

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 18:31 Uhr.