Videos: insert

Все видео, загруженные через конечную точку videos.insert из непроверенных проектов API, созданных после 28 июля 2020 г., будут ограничены режимом приватного просмотра. Чтобы снять это ограничение, каждый проект API должен пройти аудит на соответствие Условиям обслуживания . Дополнительные сведения см. в истории изменений API .

Загружает видео на YouTube и дополнительно устанавливает метаданные видео.

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

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

Влияние квоты: вызов этого метода имеет стоимость квоты 1600 единиц.

Общие варианты использования

Запрос

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 , которые можно включить в значение параметра:
  • contentDetails
  • fileDetails
  • id
  • liveStreamingDetails
  • localizations
  • player
  • processingDetails
  • recordingDetails
  • snippet
  • statistics
  • status
  • suggestions
  • topicDetails
Дополнительные параметры
notifySubscribers boolean
Параметр notifySubscribers указывает, должен ли YouTube отправлять уведомление о новом видео пользователям, подписавшимся на канал видео. Значение параметра True указывает, что подписчики будут уведомлены о новых загруженных видео. Однако владелец канала, который загружает много видео, может предпочесть установить значение False , чтобы не отправлять уведомление о каждом новом видео подписчикам канала. Значение по умолчанию — True .
onBehalfOfContentOwner string
Этот параметр можно использовать только в правильно авторизованном запросе . Примечание. Этот параметр предназначен исключительно для контент-партнеров YouTube.

Параметр onBehalfOfContentOwner указывает, что учетные данные авторизации запроса идентифицируют пользователя CMS YouTube, который действует от имени владельца контента, указанного в значении параметра. Этот параметр предназначен для контент-партнеров 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
    • status.publicStatsViewable
    • status.publishAt
    • status.selfDeclaredMadeForKids
    • recordingDetails.locationDescription ( устарело )
    • recordingDetails.location.latitude ( устарело )
    • recordingDetails.location.longitude ( устарело )
    • recordingDetails.recordingDate

Ответ

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

Примеры

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

Идти

Этот пример кода вызывает метод 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)
}

.СЕТЬ

В следующем примере кода вызывается метод API 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);
    }
  }
}

Рубин

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

В этом примере используется клиентская библиотека 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.