wake-up-neo.com

Laden Sie ein Video mit Youtube API V3 und zu YouTube hoch PHP

Ich versuche, ein Video mit PHP auf Youtube hochzuladen. Ich verwende Youtube API v3 und verwende den neuesten ausgecheckten Quellcode der Google API PHP Client-Bibliothek.
Ich verwende den auf. Angegebenen Beispielcode
https://code.google.com/p/google-api-php-client/ , um die Authentifizierung durchzuführen. Die Authentifizierung läuft gut, aber wenn ich versuche, ein Video hochzuladen, erhalte ich Google_ServiceException mit dem Fehlercode 500 und der Nachricht als null. 

Ich habe mir die folgende Frage schon einmal angesehen: Video mit php client library v3 auf youtube hochladen Die akzeptierte Antwort beschreibt jedoch nicht, wie die zu ladenden Dateien angegeben werden.
Ich habe eine ähnliche Frage gefunden Datei mit Youtube API v3 und PHP hochladen , wobei im Kommentar erwähnt wird, dass categoryId obligatorisch ist, daher habe ich versucht, die categoryId im Snippet zu setzen, aber es gibt immer noch die gleiche Ausnahme.

Ich habe auch auf den Python-Code auf der Dokumentationsseite verwiesen ( https://developers.google.com/youtube/v3/docs/videos/insert ), aber ich konnte die Funktion next_chunk im Client nicht finden Bibliothek. Ich habe jedoch versucht, eine Schleife (im Code-Snippet erwähnt) zu setzen, um den Fehlercode 500 erneut zu erhalten, aber bei allen 10 Iterationen bekomme ich den gleichen Fehler.

Folgendes ist der Code-Ausschnitt, den ich versuche:

$youTubeService = new Google_YoutubeService($client);
if ($client->getAccessToken()) {
    print "Successfully authenticated";
    $snippet = new Google_VideoSnippet();
    $snippet->setTitle = "My Demo title";
    $snippet->setDescription = "My Demo descrition";
    $snippet->setTags = array("tag1","tag2");
    $snippet->setCategoryId(23); // this was added later after refering to another question on stackoverflow

    $status = new Google_VideoStatus();
    $status->privacyStatus = "private";

    $video = new Google_Video();
    $video->setSnippet($snippet);
    $video->setStatus($status);

    $data = file_get_contents("video.mp4"); // This file is present in the same directory as the code
    $mediaUpload = new Google_MediaFileUpload("video/mp4",$data);
    $error = true;
    $i = 0;

    // I added this loop because on the sample python code on the documentation page
    // mentions we should retry if we get error codes 500,502,503,504
    $retryErrorCodes = array(500, 502, 503, 504);
    while($i < 10 && $error) {
        try{
            $ret = $youTubeService->videos->insert("status,snippet", 
                                                   $video, 
                                                   array("data" => $data));

            // tried the following as well, but even this returns error code 500,
            // $ret = $youTubeService->videos->insert("status,snippet", 
            //                                        $video, 
            //                                        array("mediaUpload" => $mediaUpload); 
            $error = false;
        } catch(Google_ServiceException $e) {
            print "Caught Google service Exception ".$e->getCode()
                  . " message is ".$e->getMessage();
            if(!in_array($e->getCode(), $retryErrorCodes)){
                break;
            }
            $i++;
        }
    }
    print "Return value is ".print_r($ret,true);

    // We're not done yet. Remember to update the cached access token.
    // Remember to replace $_SESSION with a real database or memcached.
    $_SESSION['token'] = $client->getAccessToken();
} else {
    $authUrl = $client->createAuthUrl();
    print "<a href='$authUrl'>Connect Me!</a>";
}

Ist es etwas, was ich falsch mache? 

20
jayendrap

Ich konnte den Upload mit folgendem Code zum Laufen bringen:

if($client->getAccessToken()) {
    $snippet = new Google_VideoSnippet();
    $snippet->setTitle("Test title");
    $snippet->setDescription("Test descrition");
    $snippet->setTags(array("tag1","tag2"));
    $snippet->setCategoryId("22");

    $status = new Google_VideoStatus();
    $status->privacyStatus = "private";

    $video = new Google_Video();
    $video->setSnippet($snippet);
    $video->setStatus($status);

    $error = true;
    $i = 0;

    try {
        $obj = $youTubeService->videos->insert("status,snippet", $video,
                                         array("data"=>file_get_contents("video.mp4"), 
                                        "mimeType" => "video/mp4"));
    } catch(Google_ServiceException $e) {
        print "Caught Google service Exception ".$e->getCode(). " message is ".$e->getMessage(). " <br>";
        print "Stack trace is ".$e->getTraceAsString();
    }
}
8
jayendrap

Ich weiß, das ist alt, aber hier ist die Antwort aus der Dokumentation:

    // REPLACE this value with the path to the file you are uploading.
    $videoPath = "/path/to/file.mp4";

    $snippet = new Google_Service_YouTube_VideoSnippet();
    $snippet->setTitle("Test title");
    $snippet->setDescription("Test description");
    $snippet->setTags(array("tag1", "tag2"));

    // 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 = "public";

    // 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($videoPath));


    // Read the media file and upload it chunk by chunk.
    $status = false;
    $handle = fopen($videoPath, "rb");
    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);
3
Any Day

Ich erkenne auch, dass dies alt ist, but, als ich die neueste Version von php-client von GitHub geklont habe, die ich mit der Google_Service_YouTube_Videos_Resource::insert()- Methode in Schwierigkeiten brachte. 

Ich würde ein Array mit "data" => file_get_contents($pathToVideo) und "mimeType" => "video/mp4" als Argument für die insert()- Methode übergeben, aber im Gegenzug erhielt ich (400) BadRequest.

Beim Debuggen und Lesen des Codes von Google fand ich in \Google\Service\Resource.php eine Prüfung (in Zeilen 179-180) mit einem Arrayschlüssel "uploadType", der das Google_Http_MediaFielUpload-Objekt initiieren würde.

$part = 'status,snippet';
$optParams = array(
    "data" => file_get_contents($filename),
    "uploadType" => "media",  // This was needed in my case
    "mimeType" => "video/mp4",
);
$response = $youtube->videos->insert($part, $video, $optParams);

Wenn ich mich recht erinnere, wurde mit der Version 0.6 des PHP-api das uploadType-Argument nicht benötigt. Dies kann nur für den direkten Upload-Stil gelten und nicht für den resumable -Upload, der in der Antwort von Any Day angezeigt wird.

2
Gemmu

Die Antwort wäre die Verwendung von Google_Http_MediaFileUpload über die Clientbibliotheken Google PHP .

Hier der Beispielcode: https://github.com/youtube/api-samples/blob/master/php/resumable_upload.php

0
Ibrahim Ulukaya