title: How to upload to a specific YouTube channel of the same account? (YouTube Data API)
body: <p>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</p>
  
  <p>I'm using a script almost identical to the video upload sample script:</p>
  
  <p><a href="https://developers.google.com/youtube/v3/code_samples/php?hl=en#upload_a_video" rel="nofollow noreferrer">https://developers.google.com/youtube/v3/code_samples/php?hl=en#upload_a_video</a></p>
  
  <pre><code>&lt;?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 &lt;https://console.developers.google.com/&gt;
   * For more information about using OAuth 2.0 to access Google APIs, please see:
   * &lt;https://developers.google.com/youtube/v3/guides/authentication&gt;
   * 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-&gt;setClientId($OAUTH2_CLIENT_ID);
  $client-&gt;setClientSecret($OAUTH2_CLIENT_SECRET);
  $client-&gt;setScopes('https://www.googleapis.com/auth/youtube');
  $redirect = filter_var('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'],
      FILTER_SANITIZE_URL);
  $client-&gt;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-&gt;authenticate($_GET['code']);
    $_SESSION['token'] = $client-&gt;getAccessToken();
    header('Location: ' . $redirect);
  }
  
  if (isset($_SESSION['token'])) {
    $client-&gt;setAccessToken($_SESSION['token']);
  }
  
  // Check to ensure that the access token was successfully acquired.
  if ($client-&gt;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-&gt;setTitle("Test title");
      $snippet-&gt;setDescription("Test description");
      $snippet-&gt;setTags(array("tag1", "tag2"));
  
      // Numeric video category. See
      // https://developers.google.com/youtube/v3/docs/videoCategories/list 
      $snippet-&gt;setCategoryId("22");
  
      // Set the video's status to "public". Valid statuses are "public",
      // "private" and "unlisted".
      $status = new Google_Service_YouTube_VideoStatus();
      $status-&gt;privacyStatus = "public";
  
      // Associate the snippet and status objects with a new video resource.
      $video = new Google_Service_YouTube_Video();
      $video-&gt;setSnippet($snippet);
      $video-&gt;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 -&gt;execute(); instead of making the API call immediately.
      $client-&gt;setDefer(true);
  
      // Create a request for the API's videos.insert method to create and upload the video.
      $insertRequest = $youtube-&gt;videos-&gt;insert("status,snippet", $video);
  
      // Create a MediaFileUpload object for resumable uploads.
      $media = new Google_Http_MediaFileUpload(
          $client,
          $insertRequest,
          'video/*',
          null,
          true,
          $chunkSizeBytes
      );
      $media-&gt;setFileSize(filesize($videoPath));
  
  
      // Read the media file and upload it chunk by chunk.
      $status = false;
      $handle = fopen($videoPath, "rb");
      while (!$status &amp;&amp; !feof($handle)) {
        $chunk = fread($handle, $chunkSizeBytes);
        $status = $media-&gt;nextChunk($chunk);
      }
  
      fclose($handle);
  
      // If you want to make other calls after the file upload, set setDefer back to false
      $client-&gt;setDefer(false);
  
  
      $htmlBody .= "&lt;h3&gt;Video Uploaded&lt;/h3&gt;&lt;ul&gt;";
      $htmlBody .= sprintf('&lt;li&gt;%s (%s)&lt;/li&gt;',
          $status['snippet']['title'],
          $status['id']);
  
      $htmlBody .= '&lt;/ul&gt;';
  
    } catch (Google_Service_Exception $e) {
      $htmlBody .= sprintf('&lt;p&gt;A service error occurred: &lt;code&gt;%s&lt;/code&gt;&lt;/p&gt;',
          htmlspecialchars($e-&gt;getMessage()));
    } catch (Google_Exception $e) {
      $htmlBody .= sprintf('&lt;p&gt;An client error occurred: &lt;code&gt;%s&lt;/code&gt;&lt;/p&gt;',
          htmlspecialchars($e-&gt;getMessage()));
    }
  
    $_SESSION['token'] = $client-&gt;getAccessToken();
  } else {
    // If the user hasn't authorized the app, initiate the OAuth flow
    $state = mt_rand();
    $client-&gt;setState($state);
    $_SESSION['state'] = $state;
  
    $authUrl = $client-&gt;createAuthUrl();
    $htmlBody = &lt;&lt;&lt;END
    &lt;h3&gt;Authorization Required&lt;/h3&gt;
    &lt;p&gt;You need to &lt;a href="$authUrl"&gt;authorize access&lt;/a&gt; before proceeding.&lt;p&gt;
  END;
  }
  ?&gt;
  
  &lt;!doctype html&gt;
  &lt;html&gt;
  &lt;head&gt;
  &lt;title&gt;Video Uploaded&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;?=$htmlBody?&gt;
  &lt;/body&gt;
  &lt;/html&gt;
  </code></pre>
  
  <p>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</p>
  
  <p><a href="https://i.stack.imgur.com/ZYdY2.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/ZYdY2.png" alt="enter image description here"></a></p>