Je suis à l'aide de l'API YouTube pour télécharger des vidéos morceau par morceau (voir le code ci-dessous). Cependant, le téléchargement échoue parfois avec de gros fichiers (+1 GO), mais pas toujours. Le téléchargement est montré pour être complète, mais seulement un couple de minutes peut être joué et le reste est tronqué. J'ai fait quelques recherches mais sans succès apparent. Ma question(s) aujourd'hui:
- Est-il possible de contacter directement dans YouTube (voir les journaux de ce qui se passe réellement)?
- Est-ce une problème de codage?
- Peut l'erreur d'être pris ou détectés via l'API (à l'heure actuelle, aucune exception n'est levée)
- Cela peut-il se passer si vous êtes le téléchargement de vidéos différentes à la fois (en parallèle, qui est) ?
- Quelqu'un d'autre a rencontré ce problème?
Toute aide/conduire dans la bonne direction est beaucoup apprécié. J'irais même jusqu'à appeler un bounty de 500 points c'est me rend fou (fait juste que...)
Annexe: Le script est exécuté en ligne de commande, par le biais d'un Gearman Serveur, avec set_time_limit(0);
ensemble. Le code de la fonction/est juste un extrait (et fonctionne très bien avec des fichiers plus petits, parfois même jusqu'à 10 GO).
EDIT: Selon aergistal et GeorgeQ les commentaires ci-dessus, j'ai changé la boucle while pour lire des morceaux directement (pas de feof()
plus) et enregistrer l'état de la base de données.
/*
Uploads one file to youtube chunk by chunk
*/
function uploadFile($dbfile) {
$client = $this->client;
$youtube = new Google_Service_YouTube($client);
$htmlBody = "";
try {
// Create a snippet with title, description, tags and category ID
// Create an asset resource and set its snippet metadata and type.
// This example sets the video's title, description, keyword tags, and
// video category.
$snippet = new Google_Service_YouTube_VideoSnippet();
$snippet->setTitle("SO Example");
// Numeric video category. See
// https://developers.google.com/youtube/v3/docs/videoCategories/list
$snippet->setCategoryId("22");
// Set the video's status to "public". Valid statuses are "public",
// "private" and "unlisted".
$status = new Google_Service_YouTube_VideoStatus();
$status->privacyStatus = "private";
// Associate the snippet and status objects with a new video resource.
$video = new Google_Service_YouTube_Video();
$video->setSnippet($snippet);
$video->setStatus($status);
// Specify the size of each chunk of data, in bytes. Set a higher value for
// reliable connection as fewer chunks lead to faster uploads. Set a lower
// value for better recovery on less reliable connections.
$chunkSizeBytes = 1 * 1024 * 1024;
// Setting the defer flag to true tells the client to return a request which can be called
// with ->execute(); instead of making the API call immediately.
$client->setDefer(true);
// Create a request for the API's videos.insert method to create and upload the video.
$insertRequest = $youtube->videos->insert("status,snippet", $video);
// Create a MediaFileUpload object for resumable uploads.
$media = new Google_Http_MediaFileUpload(
$client,
$insertRequest,
'video/*',
null,
true,
$chunkSizeBytes);
$media->setFileSize(filesize($dbfile->localfile));
// Read the media file and upload it chunk by chunk.
$status = false;
$handle = fopen($dbfile->localfile, "rb");
while (!$status && ($chunk = (fread($handle, $chunkSizeBytes))) !== FALSE) {
$status = $media->nextChunk($chunk);
$data = array("filename" => $dbfile->localfile, "status" => print_r($status, true));
$db->saveLog($data);
}
/* the old code
while (!$status && !feof($handle)) {
$chunk = fread($handle, $chunkSizeBytes);
$status = $media->nextChunk($chunk);
}
*/
fclose($handle);
// If you want to make other calls after the file upload, set setDefer back to false
$client->setDefer(false);
$log = array("success" => true, "snippet_id" => $status["id"]);
} catch (Google_ServiceException $e) {
$log = array("success" => false, "errormsg" => $e->getMessage());
} catch (Google_Exception $e) {
$log = array("success" => false, "errormsg" => $e->getMessage());
}
return $log;
}