如何使用Google API PHP Client Library和Youtube API V3将视频上传到YouTube?

问题描述:

试图简单地上传视频使用Google API PHP Client (latest release 1.1.6),但code in Youtube API V3不工作,并给500内部服务器错误。如何使用Google API PHP Client Library和Youtube API V3将视频上传到YouTube?

当我没有使用任何流血的beta版本时,下面的代码有什么问题,我刚刚屏蔽了3个参数,否则它被复制为Youtube API V3。发生

require_once 'google-api-php-client/src/Google/Client.php'; 
    require_once 'google-api-php-client/src/Google/Service/YouTube.php'; 

    session_start(); 

    $OAUTH2_CLIENT_ID = 'CHANGE1-0osfh0p5h80o9ol2uqtsjq5i7r1jun.apps.googleusercontent.com'; 
    $OAUTH2_CLIENT_SECRET = 'CHANGE2azMpt__VdSt9'; 

    $client = new Google_Client(); 
    $client->setClientId($OAUTH2_CLIENT_ID); 
    $client->setClientSecret($OAUTH2_CLIENT_SECRET); 
    $client->setScopes('https://www.googleapis.com/auth/youtube'); 
    $redirect = filter_var('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'], 
     FILTER_SANITIZE_URL); 
    $client->setRedirectUri($redirect); 

    // Define an object that will be used to make all API requests. 
    $youtube = new Google_Service_YouTube($client); 

    if (isset($_GET['code'])) { 
    if (strval($_SESSION['state']) !== strval($_GET['state'])) { 
     die('The session state did not match.'); 
    } 

    $client->authenticate($_GET['code']); 
    $_SESSION['token'] = $client->getAccessToken(); 
    header('Location: ' . $redirect); 
    } 

    if (isset($_SESSION['token'])) { 
    $client->setAccessToken($_SESSION['token']); 
    } 

    // Check to ensure that the access token was successfully acquired. 
    if ($client->getAccessToken()) { 
    try{ 
     // REPLACE this value with the path to the file you are uploading. 
     $videoPath = "/CHANGE3/videos/test.mp4"; 

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


     $htmlBody .= "<h3>Video Uploaded</h3><ul>"; 
     $htmlBody .= sprintf('<li>%s (%s)</li>', 
      $status['snippet']['title'], 
      $status['id']); 

     $htmlBody .= '</ul>'; 

    } catch (Google_Service_Exception $e) { 
     $htmlBody .= sprintf('<p>A service error occurred: <code>%s</code></p>', 
      htmlspecialchars($e->getMessage())); 
    } catch (Google_Exception $e) { 
     $htmlBody .= sprintf('<p>An client error occurred: <code>%s</code></p>', 
      htmlspecialchars($e->getMessage())); 
    } 

    $_SESSION['token'] = $client->getAccessToken(); 
    } else { 
    // If the user hasn't authorized the app, initiate the OAuth flow 
    $state = mt_rand(); 
    $client->setState($state); 
    $_SESSION['state'] = $state; 

    $authUrl = $client->createAuthUrl(); 
    $htmlBody = <<<END 
    <h3>Authorization Required</h3> 
    <p>You need to <a href="$authUrl">authorize access</a> before proceeding.<p> 
    END; 
    } 
    echo $htmlBody; 

服务错误:Error calling PUT https://www.googleapis.com/upload/youtube/v3/videos?part=status%2Csnippet&uploadType=resumable&upload_id=AEnB2UpXd4UQ0dt-v2_8YLzDp4KAywZQUIgUEm3Lxyv7nV_ZLAHghu6RiNE0e82xMMGx9ztQvTdYGFwvSNP5yJiOdffS0CuG-Q: (400) Failed to parse Content-Range header.

不要将其标记下方复制的非常古老和过时的问题,因为你可以看到其他的问题,甚至包括在他们的代码中不存在的文件在最新的Google API PHP Client图书馆或指的是谷歌代码项目。类似的过时问题12345

+0

你有没有注意到这一点? https://developers.google.com/youtube/v3/code_samples/php – Mijago

+0

是的我上面的代码是完全相同的代码,但它给出了错误 – XIMRX

奇怪的代码非常小的调整,解决了这个问题。

而不是仅仅使用$videoPath = "/path/to/file.mp4";使用DOCUMENT_ROOT解决了这个问题。除了那些文档代码是完美的。

$videoPath = $_SERVER["DOCUMENT_ROOT"] . "/mapapp/videos/test.mp4"; 
+0

这个'YouTube.php'文件在哪里?我无法在git中找到它! – Jackson

其他whoe恶有恶报和处理“无法解析内容Range头”

我正在寻找3天,finaly我发现我的解决方案...

我的文件是在Windows(我的网络服务器工具)上大于4GB和XAMPP只有32位,所以fopen()命令无法读取我的大文件。

我installaed apache的64位和64位PHP7通过我自己的,它走了

这时我的剧本finaly上装载大文件

794 - 07:14:15 - 832569344 
795 - 07:14:16 - 833617920 
796 - 07:14:17 - 834666496 
797 - 07:14:18 - 835715072 
798 - 07:14:19 - 836763648 
799 - 07:14:19 - 837812224 
800 - 07:14:20 - 838860800 
801 - 07:14:21 - 839909376 
802 - 07:14:22 - 840957952 
803 - 07:14:23 - 842006528 
804 - 07:14:24 - 843055104 

媒体链接804块^^没有截断nothign块:d只是上传无瑕