Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to upload to a specific YouTube channel of the same account? (YouTube Data API)

Tags:

I am managing a Google account and it has a YouTube channel connected to a Google+ profile, and a YouTube channel connected to a Google+ page. Using a OAuth key of this account, I want to upload videos to the "page"'s channel, so far I've only managed with the "profile"'s channel. The "page" channel has our company name and logo, so I don't want it to be a personal (at least appear to be) "profile"'s channel

I'm using a script almost identical to the video upload sample script:

https://developers.google.com/youtube/v3/code_samples/php?hl=en#upload_a_video

<?php

// Call set_include_path() as needed to point to your client library.
require_once 'Google/Client.php';
require_once 'Google/Service/YouTube.php';
session_start();

/*
 * You can acquire an OAuth 2.0 client ID and client secret from the
 * Google Developers Console <https://console.developers.google.com/>
 * For more information about using OAuth 2.0 to access Google APIs, please see:
 * <https://developers.google.com/youtube/v3/guides/authentication>
 * Please ensure that you have enabled the YouTube Data API for your project.
 */
$OAUTH2_CLIENT_ID = 'REPLACE_ME';
$OAUTH2_CLIENT_SECRET = 'REPLACE_ME';

$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 = "/path/to/file.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;
}
?>

<!doctype html>
<html>
<head>
<title>Video Uploaded</title>
</head>
<body>
  <?=$htmlBody?>
</body>
</html>

As mentioned, the script works for the channel that was connected to the "profile" .. I've since deleted this as it was just for testing. I want to upload videos instead to the other Google+ "page"'s channel which is also owned by this account. So far I've tried setting the desired channel as the default of this account, but do I need to actually move the channel to the Google+ "profile"? .. unless I can specify channel in the above script? If I move the channel, will it retain the channel's name though? I don't want anything about the channel to change (name, logo). From what I see it will change the channel name (see image) which is not ideal, I just want to upload to this channel - that's all

enter image description here

like image 625
Martyn Avatar asked Jan 12 '16 09:01

Martyn


People also ask

Can I upload same content on two YouTube channels?

You can't merge or link separate YouTube channels or automatically transfer data from one channel to another. But you can manually re-upload your videos to a different channel that you manage. Watch time and other metrics will start over for any new uploads. Download your videos from your own channel.

Can I upload same video on my YouTube channels?

If you manage to upload the same video on two YouTube channels, the second video will be flagged as duplicate content and you might even get your channel removed. However, in reality, the Content ID system put in place should prevent you from uploading it in the first place.

Can we upload video to multiple channels on YouTube?

We can upload video to only those channels which credentials (API keys) we have. We can’t upload video to others channel on YouTube. Yes I have channels credentials (API keys) but I want to upload videos from multiple user in same channel.

How to upload videos to YouTube using YouTube API?

Uploading video using the YouTube API requires you to create an access token. An access token is nothing but an identifier of your YouTube account. But, the access token expires after some time passes. The expired access token throws the error of ‘Unauthorized access’.

What is YouTube and how to use it?

YouTube is the number one video-sharing platform in the world. The YouTube platform allows us to host our videos. This saves us a lot of server space and one can easily embed the video from YouTube on their website. Anyone can upload the video on YouTube. You just need to create your YouTube account and upload the video.

Is it possible to upload a video from YouTube using PHP?

Yes, it is possible. In this article, we study how to use the YouTube API to upload a video using PHP. To get started with the YouTube API, you need a Google Account. Once you have a Google account register your application and get the API keys. Below are the steps to register an application and get your API keys.


1 Answers

Checkout this:

https://developers.google.com/youtube/v3/docs/videos/insert

And notice the onBehalfOfContentOwner and the onBehalfOfContentOwnerChannel parameters for the request, i think this is what you need.

This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.

like image 68
Oswald Avatar answered Sep 29 '22 16:09

Oswald