Domanda PHP: upload di didascalie API v3 di YouTube con flag di sincronizzazione


Nelle ultime due settimane i miei collaboratori e me hanno lavorato per cercare di ottenere didascalie sui video dei nostri clienti su YouTube tramite l'API v3. Dopo circa una settimana siamo finalmente riusciti a caricare le didascalie, ma YouTube ci ha fornito questo messaggio nell'interfaccia utente "Tieni traccia dei contenuti non elaborati" e non mostra le didascalie che carichiamo. Tuttavia, possiamo scaricare il formato originale che è stato caricato; quindi sappiamo che il file è stato caricato con successo.

Siamo anche riusciti a far funzionare il flag di sincronizzazione che dice a YouTube di scorrere la trascrizione e impostare i tempi per il video ma, in realtà, non funziona. Torna a dirci che è in fase di sincronizzazione ma quando andiamo all'interfaccia utente per il video mostra solo il nome della traccia di sottotitoli e ci dà il messaggio "Tieni traccia dei contenuti non elaborati.". Abbiamo esaurito tutte le ore che abbiamo avuto e ora stiamo lavorando al nostro tempo per risolvere questo problema, ma ancora senza fortuna.

Qualcuno si è imbattuto in questo problema prima? Se sì, cosa sei riuscito a fare per farlo funzionare?

Pubblicherò uno snippet del mio codice qui sotto che mostra la porzione di caricamento del nostro script.

# 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);
$captionSnippet->setIsDraft( true );

# Create a caption with snippet.
$caption = new Google_Service_YouTube_Caption();
$caption->setSnippet($captionSnippet);

// Setting the defer flag to true tells the client to return a request which can be called
$client->setDefer(false);

// Get the file content's of the uploaded file
$file = file_get_contents( $captionFile['tmp_name'] );

// Create a request for the API's captions.insert method to create and upload a caption.
$insertRequest = $youtube->captions->insert("snippet", $caption, array( 
  'sync' => true, 
  'data' => $file, 
  'mimeType' => 'application/octet-stream', 
  'uploadType' => 'multipart' )  
); 

echo '<pre>'; print_r( $insertRequest ); echo '</pre>';

// // Read the caption file and upload it chunk by chunk.
$status = $insertRequest;
fclose($handle);

// If you want to make other calls after the file upload, set setDefer back to false
$client->setDefer(false);

Grazie,
Tyler Steinhaus


15
2017-07-14 14:00


origine


risposte:


Hai provato a realizzare ciò che desideri utilizzando le funzioni che Google ha pubblicato da solo?

Di seguito tratto da 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>';
}

5
2017-07-25 08:28



Sono stato in grado di riprodurre questo problema e ho trovato una possibile soluzione. La chiave era il contenuto del file di sottotitoli caricato. Il suggerimento era dove dice la documentazione:

Il parametro di sincronizzazione indica se YouTube deve sincronizzare automaticamente il file di sottotitoli con la traccia audio del video. Se si imposta il valore su true, YouTube ignorerà tutti i codici temporali contenuti nel file di sottotitoli caricati e genererà nuovi codici temporali per le didascalie.

Dovresti impostare il sync parametro a true se stai caricando una trascrizione, che non ha codici temporali, o se sospetti che i codici temporali nel tuo file non siano corretti e desideri che YouTube tenti di correggerli.

Il tweak che ha funzionato per me è stato quello di aggiungere alcuni codici temporali fittizi che sapevo essere errati e impostati 'sync' => 'true', in modo che il servizio YouTube li corregga. Ad esempio, ecco il .sbv file che ha fatto NON lavoro:

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

Quando ho usato questo file ho ottenuto lo stesso errore che hai fatto, ad es. Track content is not processed, ma quando l'ho cambiato a questo ha funzionato:

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

Quando ho scaricato l'elaborato .sbv file da YouTube assomigliava a questo:

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

Concesso, ho solo provato questo per un MOLTO video banalee non penso che abbiano fatto un ottimo lavoro con i tempi, ma si spera che aumenterà per funzionare con il tuo sistema.


3
2017-08-06 00:18