I have tried two methods to upload large files on YouTube but none of them works, each has its own issues, my aim is to find a correct answer to upload large files.
First Method:
It chunks the large files into different parts, and rather than sending them separately and upload them at once it uploads them separately. So at the end I have a long list of unloadable different parts of the file on Youtube rather than a single file.
Code of method 1
if ($client->getAccessToken()) {
$videoPath = "path/to/foo.mp4";
$snippet = new Google_VideoSnippet();
$snippet->setTitle("Test title2");
$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);
$chunkSizeBytes = 1 * 1024 * 1024;
$media = new Google_MediaFileUpload('video/mp4', null, true, $chunkSizeBytes);
$media->setFileSize(filesize($videoPath));
$result = $youtube->videos->insert("status,snippet", $video,
array('mediaUpload' => $media));
$status = false;
$handle = fopen($videoPath, "rb");
while (!$status && !feof($handle)) {
$chunk = fread($handle, $chunkSizeBytes);
$uploadStatus = $media->nextChunk($result, $chunk);
}
fclose($handle);
}
I found this question which its answer code is similar to google_mediaFileupload but I am not sure how to use it.
Second method
I am also trying to use resumable upload to upload them but when I use the following code it runs into following error:
Code of method 2
<?php
require_once 'google-api-php-client/src/Google_Client.php';
require_once 'google-api-php-client/src/contrib/Google_YouTubeService.php';
require_once 'google-api-php-client/src/service/Google_MediaFileUpload.php';
session_start();
$client = new Google_Client();
$client->setApplicationName('Google+ PHP Starter Application');
$client->setClientId('My Client ID');
$client->setClientSecret('My secret code');
$client->setRedirectUri('http://localhost:8888/mymediaapp2/uploadvideo.php');
$client->setDeveloperKey('My developer key');
$client->setScopes("https://www.googleapis.com/auth/youtube.upload");
$youTubeService = new Google_YoutubeService($client);
if (isset($_GET['code'])) {
$client->authenticate();
$_SESSION['token'] = $client->getAccessToken();
$redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL));
}
if (isset($_SESSION['token'])) {
$client->setAccessToken($_SESSION['token']);
}
if ($client->getAccessToken()) {
echo "here";
$json = $client->getAccessToken();
$jsonIterator = new RecursiveIteratorIterator(
new RecursiveArrayIterator(json_decode($json, TRUE)),
RecursiveIteratorIterator::SELF_FIRST);
$myvar = "";
foreach ($jsonIterator as $key => $val) {
if($key == "access_token")
echo "val is" .$val;
}
$service_url = 'https://www.googleapis.com/upload/youtube/v3/videos?
uploadType=resumable&part=snippet,status';
$c = curl_init($service_url);
$curl_post_data = array(
"Authorization" => $val,
"Content-Length" => '255',
"Content-Type" => 'application/json; charset=UTF-8',
"X-Upload-Content-Length" => '30000',
"X-Upload-Content-Type" => 'video/mov'
);
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
curl_setopt($c, CURLOPT_POST, true);
curl_setopt($c, CURLOPT_POSTFIELDS, $curl_post_data);
$curl_resp = curl_exec($c);
curl_close($c);
echo $curl_resp;
}else {
$authUrl = $client->createAuthUrl();
print "<a href='$authUrl'>upload</a>";
}
?>
Error of method 2
{ "error": { "errors": [ { "domain": "global", "reason": "required", "message": "Login
Required", "locationType": "header", "location": "Authorization" } ], "code": 401,
"message":
"Login Required" } }
Please note, I have given 50 bounty to one of the answers for solving one of the issues of the code. Although the problem is not completely solved yet.