Videos: insert

Загружает видео на YouTube и при необходимости задает метаданные.

Этот метод поддерживает загрузку медиафайлов. Загружаемые файлы должны соответствовать следующим требованиям:

  • Максимальный размер файла: 256 ГБ.
  • Допустимые MIME-типы медиаконтента: video/*, application/octet-stream.

Влияние на квоту: 100 вызовов в день. Вызов этого метода расходует 1 единицу квоты на загрузку видео.

Примеры использования

Запрос

HTTP-запрос

POST https://www.googleapis.com/upload/youtube/v3/videos

Авторизация

Для выполнения этого запроса требуется авторизация как минимум в одной из следующих областей доступа. Подробнее…

Область действия
https://www.googleapis.com/auth/youtube.upload
https://www.googleapis.com/auth/youtube
https://www.googleapis.com/auth/youtubepartner
https://www.googleapis.com/auth/youtube.force-ssl

Параметры

В таблице ниже перечислены параметры, которые поддерживает этот запрос. Все перечисленные параметры являются параметрами запроса.

Параметры
Обязательные параметры
part string
Параметр part используется в этой операции в двух целях. Он определяет свойства, которые будут заданы операцией записи, а также свойства, которые будут включены в ответ API.

Обратите внимание, что не все части содержат свойства, которые можно задать при вставке или обновлении видео. Например, объект statistics содержит статистику, которую YouTube рассчитывает для видео, и не содержит значений, которые вы можете задать или изменить. Если значение параметра указывает на part, который не содержит изменяемых значений, этот part все равно будет включен в ответ API.

В следующем списке приведены названия part, которые можно включить в значение параметра:
  • brandPartner
  • contentDetails
  • fileDetails
  • id
  • liveStreamingDetails
  • localizations
  • paidProductPlacementDetails
  • player
  • processingDetails
  • recordingDetails
  • snippet
  • statistics
  • status
  • suggestions
  • topicDetails
Необязательные параметры
notifySubscribers boolean
Параметр notifySubscribers указывает, нужно ли отправлять уведомление о новом видео пользователям, которые подписаны на канал. Значение параметра True указывает, что подписчики будут получать уведомления о новых видео. Однако если вы загружаете много видео, то можете установить значение False, чтобы не отправлять подписчикам уведомления о каждом новом ролике. Значение по умолчанию: True.
onBehalfOfContentOwner string
Этот параметр можно использовать только в авторизованном запросе. Примечание. Этот параметр предназначен исключительно для партнеров YouTube по контенту.

Параметр onBehalfOfContentOwner указывает, что учетные данные авторизации запроса идентифицируют пользователя системы управления контентом YouTube, который действует от имени владельца контента, указанного в значении параметра. Этот параметр предназначен для партнеров YouTube, которые владеют несколькими каналами и управляют ими. Владельцы контента могут пройти аутентификацию один раз и получить доступ к данным всех своих видео и каналов. Аккаунт CMS, с помощью которого пользователь проходит аутентификацию, должен быть связан с указанным владельцем контента YouTube.
onBehalfOfContentOwnerChannel string
Этот параметр можно использовать только в авторизованном запросе. Этот параметр можно использовать только в авторизованном запросе. Примечание. Этот параметр предназначен исключительно для партнеров YouTube, создающих контент.

Параметр onBehalfOfContentOwnerChannel указывает идентификатор канала YouTube, на который добавляется видео. Этот параметр обязателен, если в запросе указано значение параметра onBehalfOfContentOwner, и может использоваться только вместе с ним. Кроме того, запрос должен быть авторизован с помощью аккаунта CMS, связанного с владельцем контента, который указан в параметре onBehalfOfContentOwner. Наконец, канал, который указывает значение параметра onBehalfOfContentOwnerChannel, должен быть связан с владельцем контента, который указывает параметр onBehalfOfContentOwner.

Этот параметр предназначен для партнеров YouTube по контенту, которые владеют множеством каналов YouTube и управляют ими. Владельцы контента могут пройти аутентификацию один раз и выполнять действия от имени канала, указанного в значении параметра, без необходимости предоставлять учетные данные для каждого канала отдельно.

Тело запроса

Укажите ресурс видео в теле запроса. Для этого ресурса:

  • Вы можете задать значения для следующих свойств:

    • snippet.title
    • snippet.description
    • snippet.tags[]
    • snippet.categoryId
    • snippet.defaultLanguage
    • localizations.(key)
    • localizations.(key).title
    • localizations.(key).description
    • status.embeddable
    • status.license
    • status.privacyStatus. Если вы не укажете значение для этого свойства, по умолчанию будет задан статус доступа public. Для некоторых загрузок по умолчанию может быть выбрана лицензия "private" в зависимости от настроек аккаунта автора, как описано в Справочном центре YouTube. Видео, загруженные из неподтвержденных проектов API, не ограничиваются частным режимом просмотра.
    • status.publicStatsViewable
    • status.publishAt
    • status.selfDeclaredMadeForKids
    • status.containsSyntheticMedia
    • recordingDetails.recordingDate

Ответ

В случае успеха этот метод возвращает в теле ответа ресурс video.

Примеры

Примечание. Приведенные ниже примеры кода могут не охватывать все поддерживаемые языки программирования. Список поддерживаемых языков можно найти в документации по клиентским библиотекам.

Проложить маршрут

В этом примере кода вызывается метод videos.insert API, чтобы загрузить видео на канал, связанный с запросом.

В этом примере используется клиентская библиотека Go.

package main

import (
	"flag"
	"fmt"
	"log"
	"os"
	"strings"

	"google.golang.org/api/youtube/v3"
)

var (
	filename    = flag.String("filename", "", "Name of video file to upload")
	title       = flag.String("title", "Test Title", "Video title")
	description = flag.String("description", "Test Description", "Video description")
	category    = flag.String("category", "22", "Video category")
	keywords    = flag.String("keywords", "", "Comma separated list of video keywords")
	privacy     = flag.String("privacy", "unlisted", "Video privacy status")
)

func main() {
	flag.Parse()

	if *filename == "" {
		log.Fatalf("You must provide a filename of a video file to upload")
	}

	client := getClient(youtube.YoutubeUploadScope)

	service, err := youtube.New(client)
	if err != nil {
		log.Fatalf("Error creating YouTube client: %v", err)
	}

	upload := &youtube.Video{
		Snippet: &youtube.VideoSnippet{
			Title:       *title,
			Description: *description,
			CategoryId:  *category,
		},
		Status: &youtube.VideoStatus{PrivacyStatus: *privacy},
	}

	// The API returns a 400 Bad Request response if tags is an empty string.
	if strings.Trim(*keywords, "") != "" {
		upload.Snippet.Tags = strings.Split(*keywords, ",")
	}

	call := service.Videos.Insert("snippet,status", upload)

	file, err := os.Open(*filename)
	defer file.Close()
	if err != nil {
		log.Fatalf("Error opening %v: %v", *filename, err)
	}

	response, err := call.Media(file).Do()
	handleError(err, "")
	fmt.Printf("Upload successful! Video ID: %v\n", response.Id)
}

.NET

В приведенном ниже примере кода вызывается метод videos.insert, который загружает видео на канал, связанный с запросом.

В этом примере используется клиентская библиотека.NET.

using System;
using System.IO;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;

using Google.Apis.Auth.OAuth2;
using Google.Apis.Services;
using Google.Apis.Upload;
using Google.Apis.Util.Store;
using Google.Apis.YouTube.v3;
using Google.Apis.YouTube.v3.Data;

namespace Google.Apis.YouTube.Samples
{
  /// <summary>
  /// YouTube Data API v3 sample: upload a video.
  /// Relies on the Google APIs Client Library for .NET, v1.7.0 or higher.
  /// See https://developers.google.com/api-client-library/dotnet/get_started
  /// </summary>
  internal class UploadVideo
  {
    [STAThread]
    static void Main(string[] args)
    {
      Console.WriteLine("YouTube Data API: Upload Video");
      Console.WriteLine("==============================");

      try
      {
        new UploadVideo().Run().Wait();
      }
      catch (AggregateException ex)
      {
        foreach (var e in ex.InnerExceptions)
        {
          Console.WriteLine("Error: " + e.Message);
        }
      }

      Console.WriteLine("Press any key to continue...");
      Console.ReadKey();
    }

    private async Task Run()
    {
      UserCredential credential;
      using (var stream = new FileStream("client_secrets.json", FileMode.Open, FileAccess.Read))
      {
        credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
            GoogleClientSecrets.Load(stream).Secrets,
            // This OAuth 2.0 access scope allows an application to upload files to the
            // authenticated user's YouTube channel, but doesn't allow other types of access.
            new[] { YouTubeService.Scope.YoutubeUpload },
            "user",
            CancellationToken.None
        );
      }

      var youtubeService = new YouTubeService(new BaseClientService.Initializer()
      {
        HttpClientInitializer = credential,
        ApplicationName = Assembly.GetExecutingAssembly().GetName().Name
      });

      var video = new Video();
      video.Snippet = new VideoSnippet();
      video.Snippet.Title = "Default Video Title";
      video.Snippet.Description = "Default Video Description";
      video.Snippet.Tags = new string[] { "tag1", "tag2" };
      video.Snippet.CategoryId = "22"; // See https://developers.google.com/youtube/v3/docs/videoCategories/list
      video.Status = new VideoStatus();
      video.Status.PrivacyStatus = "unlisted"; // or "private" or "public"
      var filePath = @"REPLACE_ME.mp4"; // Replace with path to actual movie file.

      using (var fileStream = new FileStream(filePath, FileMode.Open))
      {
        var videosInsertRequest = youtubeService.Videos.Insert(video, "snippet,status", fileStream, "video/*");
        videosInsertRequest.ProgressChanged += videosInsertRequest_ProgressChanged;
        videosInsertRequest.ResponseReceived += videosInsertRequest_ResponseReceived;

        await videosInsertRequest.UploadAsync();
      }
    }

    void videosInsertRequest_ProgressChanged(Google.Apis.Upload.IUploadProgress progress)
    {
      switch (progress.Status)
      {
        case UploadStatus.Uploading:
          Console.WriteLine("{0} bytes sent.", progress.BytesSent);
          break;

        case UploadStatus.Failed:
          Console.WriteLine("An error prevented the upload from completing.\n{0}", progress.Exception);
          break;
      }
    }

    void videosInsertRequest_ResponseReceived(Video video)
    {
      Console.WriteLine("Video id '{0}' was successfully uploaded.", video.Id);
    }
  }
}

Ruby

В этом примере вызывается метод videos.insert API, чтобы загрузить видео на канал, связанный с запросом.

В этом примере используется клиентская библиотека Ruby.

#!/usr/bin/ruby

require 'rubygems'
gem 'google-api-client', '>0.7'
require 'google/api_client'
require 'google/api_client/client_secrets'
require 'google/api_client/auth/file_storage'
require 'google/api_client/auth/installed_app'
require 'trollop'

# A limited OAuth 2 access scope that allows for uploading files, but not other
# types of account access.
YOUTUBE_UPLOAD_SCOPE = 'https://www.googleapis.com/auth/youtube.upload'
YOUTUBE_API_SERVICE_NAME = 'youtube'
YOUTUBE_API_VERSION = 'v3'

def get_authenticated_service
  client = Google::APIClient.new(
    :application_name => $PROGRAM_NAME,
    :application_version => '1.0.0'
  )
  youtube = client.discovered_api(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION)

  file_storage = Google::APIClient::FileStorage.new("#{$PROGRAM_NAME}-oauth2.json")
  if file_storage.authorization.nil?
    client_secrets = Google::APIClient::ClientSecrets.load
    flow = Google::APIClient::InstalledAppFlow.new(
      :client_id => client_secrets.client_id,
      :client_secret => client_secrets.client_secret,
      :scope => [YOUTUBE_UPLOAD_SCOPE]
    )
    client.authorization = flow.authorize(file_storage)
  else
    client.authorization = file_storage.authorization
  end

  return client, youtube
end

def main
  opts = Trollop::options do
    opt :file, 'Video file to upload', :type => String
    opt :title, 'Video title', :default => 'Test Title', :type => String
    opt :description, 'Video description',
          :default => 'Test Description', :type => String
    opt :category_id, 'Numeric video category. See https://developers.google.com/youtube/v3/docs/videoCategories/list',
          :default => 22, :type => :int
    opt :keywords, 'Video keywords, comma-separated',
          :default => '', :type => String
    opt :privacy_status, 'Video privacy status: public, private, or unlisted',
          :default => 'public', :type => String
  end

  if opts[:file].nil? or not File.file?(opts[:file])
    Trollop::die :file, 'does not exist'
  end

  client, youtube = get_authenticated_service

  begin
    body = {
      :snippet => {
        :title => opts[:title],
        :description => opts[:description],
        :tags => opts[:keywords].split(','),
        :categoryId => opts[:category_id],
      },
      :status => {
        :privacyStatus => opts[:privacy_status]
      }
    }

    videos_insert_response = client.execute!(
      :api_method => youtube.videos.insert,
      :body_object => body,
      :media => Google::APIClient::UploadIO.new(opts[:file], 'video/*'),
      :parameters => {
        :uploadType => 'resumable',
        :part => body.keys.join(',')
      }
    )

    videos_insert_response.resumable_upload.send_all(client)

    puts "Video id '#{videos_insert_response.data.id}' was successfully uploaded."
  rescue Google::APIClient::TransmissionError => e
    puts e.result.body
  end
end

main

Ошибки

В таблице ниже перечислены сообщения об ошибках, которые API может возвращать в ответ на вызов этого метода. Подробную информацию можно найти в документации по сообщениям об ошибках.

Тип ошибки Сведения об ошибке Описание
badRequest (400) defaultLanguageNotSet В запросе указаны локализованные сведения о видео, но не указан язык по умолчанию.
badRequest (400) invalidCategoryId В свойстве snippet.categoryId указан недопустимый идентификатор категории. Чтобы получить список поддерживаемых категорий, используйте метод videoCategories.list.
badRequest (400) invalidDescription В метаданных запроса указано недопустимое описание видео.
badRequest (400) invalidFilename Указанное в заголовке Slug название видеофайла недопустимо.
badRequest (400) invalidPublishAt В метаданных запроса указано недопустимое время запланированной публикации.
badRequest (400) invalidRecordingDetails Объект recordingDetails в метаданных запроса содержит недопустимые сведения о записи.
badRequest (400) invalidTags В метаданных запроса указаны недопустимые ключевые слова для видео.
badRequest (400) invalidTitle В метаданных запроса указано недопустимое или пустое название видео.
badRequest (400) invalidVideoGameRating В метаданных запроса указан недопустимый возрастной рейтинг видеоигры.
badRequest (400) invalidVideoMetadata Недействительные метаданные запроса.
badRequest (400) mediaBodyRequired В запросе нет видеоконтента.
badRequest (400) uploadLimitExceeded Пользователь превысил лимит на количество загружаемых видео.
forbidden (403) forbidden
forbidden (403) forbiddenLicenseSetting В запросе предпринята попытка установить для видео недопустимую лицензию.
forbidden (403) forbiddenPrivacySetting В запросе указаны недопустимые настройки конфиденциальности для видео.

Попробовать

Используйте APIs Explorer, чтобы вызвать этот API и посмотреть запрос к API и ответ.