PHP: YouTube v3 API Captions Upload with Sync Flag PHP: YouTube v3 API Captions Upload with Sync Flag php php

PHP: YouTube v3 API Captions Upload with Sync Flag


Have you tried to achieve what you want using the functions Google have posted themselves?

Below taken from https://developers.google.com/youtube/v3/code_samples/php

/** * Uploads a caption track in draft status that matches the API request parameters. * (captions.insert) * * @param Google_Service_YouTube $youtube YouTube service object. * @param Google_Client $client Google client. * @param $videoId the YouTube video ID of the video for which the API should *  return caption tracks. * @param $captionLanguage language of the caption track. * @param $captionName name of the caption track. * @param $captionFile caption track binary file. * @param $htmlBody html body. */function uploadCaption(Google_Service_YouTube $youtube, Google_Client $client, $videoId,    $captionFile, $captionName, $captionLanguage, &$htmlBody) {    # Insert a video caption.    # Create a caption snippet with video id, language, name and draft status.    $captionSnippet = new Google_Service_YouTube_CaptionSnippet();    $captionSnippet->setVideoId($videoId);    $captionSnippet->setLanguage($captionLanguage);    $captionSnippet->setName($captionName);    # Create a caption with snippet.    $caption = new Google_Service_YouTube_Caption();    $caption->setSnippet($captionSnippet);    // 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 captions.insert method to create and upload a caption.    $insertRequest = $youtube->captions->insert("snippet", $caption);    // Create a MediaFileUpload object for resumable uploads.    $media = new Google_Http_MediaFileUpload(        $client,        $insertRequest,        '*/*',        null,        true,        $chunkSizeBytes    );    $media->setFileSize(filesize($captionFile));    // Read the caption file and upload it chunk by chunk.    $status = false;    $handle = fopen($captionFile, "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 .= "<h2>Inserted video caption track for</h2><ul>";    $captionSnippet = $status['snippet'];    $htmlBody .= sprintf('<li>%s(%s) in %s language, %s status.</li>',        $captionSnippet['name'], $status['id'], $captionSnippet['language'],        $captionSnippet['status']);    $htmlBody .= '</ul>';}


I was able to reproduce this problem, and found a possible fix. The key was the content of the uploaded caption file. The hint was where it says in the documentation:

The sync parameter indicates whether YouTube should automatically synchronize the caption file with the audio track of the video. If you set the value to true, YouTube will disregard any time codes that are in the uploaded caption file and generate new time codes for the captions.

You should set the sync parameter to true if you are uploading a transcript, which has no time codes, or if you suspect the time codes in your file are incorrect and want YouTube to try to fix them.

The tweak that made it work for me was to add in some dummy time codes that I knew were incorrect, and set 'sync' => 'true', so that the YouTube service would correct them. For example, here is the .sbv file that did NOT work:

This is a sample video to test the YouTube API captioning system.

When I used this file I got the same error you did, i.e. Track content is not processed, but when I changed it to this it worked:

00:00:00,00:00:00This is a sample video to test the YouTube API captioning system.

When I downloaded the processed .sbv file from YouTube it looked like this:

0:00:00.000,0:00:04.266This is a sample video to test the YouTubeAPI captioning system.

Granted, I only tried this for a VERY trivial video, and I don't think they did a very good job with the timings, but hopefully it will scale up to work with your system.