Videos: insert

28 Temmuz 2020'den sonra oluşturulan doğrulanmamış API projelerinden videos.insert uç noktası aracılığıyla yüklenen tüm videolar, gizli görüntüleme moduyla kısıtlanacaktır. Bu kısıtlamanın kaldırılması için her API projesinin Hizmet Şartları'na uygunluğunun doğrulanması amacıyla denetimden geçmesi gerekir. Daha fazla bilgi için lütfen API Düzeltme Geçmişi'ni inceleyin.

YouTube'a bir video yükler ve isteğe bağlı olarak videonun meta verilerini ayarlar.

Bu yöntem medya yüklemeyi destekler. Yüklenen dosyalar şu kısıtlamalara uymalıdır:

  • Maksimum dosya boyutu: 256 GB
  • Kabul edilen Medya MIME türleri: video/*, application/octet-stream

Kota etkisi: Bu yönteme yapılan bir çağrının 1.600 birim kota maliyeti olur.

Yaygın kullanım alanları

İstek

HTTP isteği

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

Yetkilendirme

Bu istek için aşağıdaki kapsamlardan en az biriyle yetkilendirme gerekir (kimlik doğrulama ve yetkilendirme hakkında daha fazla bilgi edinin).

Kapsam
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

Parametreler

Aşağıdaki tabloda, bu sorgunun desteklediği parametreler listelenmiştir. Listelenen parametrelerin tümü sorgu parametreleridir.

Parametreler
Gerekli parametreler
part string
Bu işlemde part parametresi iki amaca hizmet eder. Yazma işleminin ayarlanacağı özelliklerin yanı sıra API yanıtının içereceği özellikleri de tanımlar.

Video ekleme veya güncelleme sırasında ayarlanabilecek özelliklerin tüm bölümlerde yer almadığını unutmayın. Örneğin, statistics nesnesi YouTube'un bir video için hesapladığı istatistikleri içerir ancak ayarlayabileceğiniz veya değiştirebileceğiniz değerleri içermez. Parametre değeri, değişken değerler içermeyen bir part belirtiyorsa bu part yine de API yanıtına dahil edilir.

Aşağıdaki listede, parametre değerine ekleyebileceğiniz part adları bulunmaktadır:
  • contentDetails
  • fileDetails
  • id
  • liveStreamingDetails
  • localizations
  • player
  • processingDetails
  • recordingDetails
  • snippet
  • statistics
  • status
  • suggestions
  • topicDetails
İsteğe bağlı parametreler
notifySubscribers boolean
notifySubscribers parametresi, YouTube'un videonun kanalına abone olan kullanıcılara yeni videoyla ilgili bir bildirim gönderip göndermemesi gerektiğini ifade eder. True parametre değeri, abonelere yeni yüklenen videoların bildirileceğini gösterir. Ancak çok sayıda video yükleyen bir kanal sahibi, kanalın abonelerine her yeni videoyla ilgili bildirim gönderilmesini önlemek için değeri False olarak ayarlamayı tercih edebilir. Varsayılan değer True değeridir.
onBehalfOfContentOwner string
Bu parametre yalnızca doğru şekilde yetkilendirilmiş bir istekte kullanılabilir. Not: Bu parametre yalnızca YouTube içerik iş ortaklarına yöneliktir.

onBehalfOfContentOwner parametresi, isteğin yetkilendirme kimlik bilgilerinin parametre değerinde belirtilen içerik sahibi adına hareket eden bir YouTube CMS kullanıcısını tanımladığını gösterir. Bu parametre, birçok farklı YouTube kanalına sahip olan ve bunları yöneten YouTube içerik iş ortakları için tasarlanmıştır. İçerik sahiplerinin, her kanal için kimlik doğrulama bilgileri sağlamak zorunda kalmadan bir kez kimlik doğrulaması yaparak tüm video ve kanal verilerine erişmelerine olanak tanır. Kullanıcının kimlik doğrulaması yaptığı CMS hesabı, belirtilen YouTube içerik sahibine bağlanmalıdır.
onBehalfOfContentOwnerChannel string
Bu parametre yalnızca doğru şekilde yetkilendirilmiş bir istekte kullanılabilir. Bu parametre yalnızca uygun şekilde yetkilendirilen bir istekte kullanılabilir. Not: Bu parametre yalnızca YouTube içerik iş ortakları için tasarlanmıştır.

onBehalfOfContentOwnerChannel parametresi, videonun eklendiği kanalın YouTube kanal kimliğini belirtir. Bu parametre, bir istek onBehalfOfContentOwner parametresi için bir değer belirttiğinde zorunludur ve yalnızca bu parametreyle birlikte kullanılabilir. Ayrıca istek, onBehalfOfContentOwner parametresinin belirttiği içerik sahibine bağlı bir İYS hesabı kullanılarak yetkilendirilmelidir. Son olarak, onBehalfOfContentOwnerChannel parametre değerinin belirttiği kanal, onBehalfOfContentOwner parametresinin belirttiği içerik sahibine bağlanmalıdır.

Bu parametre, birçok farklı YouTube kanalına sahip olan ve bunları yöneten YouTube içerik iş ortakları içindir. İçerik sahiplerinin, bir kez kimlik doğrulaması yaparak parametre değerinde belirtilen kanal adına her ayrı kanal için kimlik doğrulama bilgileri sağlamak zorunda kalmadan işlem gerçekleştirmesine olanak tanır.

İstek içeriği

İsteğin gövdesinde bir video kaynağı sağlayın. Söz konusu kaynak için:

  • Şu özellikler için değer ayarlayabilirsiniz:

    • 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 (kullanımdan kaldırıldı)
    • recordingDetails.location.latitude (kullanımdan kaldırıldı)
    • recordingDetails.location.longitude (kullanımdan kaldırıldı)
    • recordingDetails.recordingDate

Yanıt

Başarılı olursa bu yöntem, yanıt gövdesinde bir video kaynağı döndürür.

Örnekler

Not: Aşağıdaki kod örnekleri, desteklenen tüm programlama dillerini temsil etmeyebilir. Desteklenen dillerin listesi için istemci kitaplıkları dokümanlarına bakın.

Go

Bu kod örneği, istekle ilişkili kanala bir video yüklemek için API'nin videos.insert yöntemini çağırır.

Bu örnekte Go istemci kitaplığı kullanılmaktadır.

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

Aşağıdaki kod örneği, istekle ilişkili kanala bir video yüklemek için API'nin videos.insert yöntemini çağırır.

Bu örnekte .NET istemci kitaplığı kullanılmaktadır.

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

Bu örnek, istekle ilişkili kanala bir video yüklemek için API'nin videos.insert yöntemini çağırır.

Bu örnekte Ruby istemci kitaplığı kullanılmaktadır.

#!/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

Hatalar

Aşağıdaki tabloda, API'nin bu yönteme yapılan çağrıya yanıt olarak döndürebileceği hata mesajları tanımlanmaktadır. Daha fazla bilgi için lütfen hata mesajı dokümanlarına bakın.

Hata türü Hata ayrıntısı Açıklama
badRequest (400) defaultLanguageNotSet İstek, video ayrıntılarının varsayılan dilini belirtmeden yerelleştirilmiş video ayrıntıları eklemeye çalışıyor.
badRequest (400) invalidCategoryId snippet.categoryId özelliği, geçersiz bir kategori kimliği belirtiyor. Desteklenen kategorileri almak için videoCategories.list yöntemini kullanın.
badRequest (400) invalidDescription İstek meta verileri geçersiz bir video açıklaması belirtiyor.
badRequest (400) invalidFilename Slug başlığında belirtilen video dosya adı geçersiz.
badRequest (400) invalidPublishAt İstek meta verileri, geçersiz bir zamanlanmış yayınlama saati belirtiyor.
badRequest (400) invalidRecordingDetails İstek meta verilerindeki recordingDetails nesnesi geçersiz kayıt ayrıntıları belirtiyor.
badRequest (400) invalidTags İstek meta verileri, geçersiz video anahtar kelimeleri belirtiyor.
badRequest (400) invalidTitle İstek meta verileri geçersiz veya boş bir video başlığı belirtiyor.
badRequest (400) invalidVideoGameRating İstek meta verileri, geçersiz bir video oyunu derecelendirmesi belirtiyor.
badRequest (400) invalidVideoMetadata İstek meta verileri geçersiz.
badRequest (400) mediaBodyRequired Talep, video içeriğini içermiyor.
badRequest (400) uploadLimitExceeded Kullanıcı, yükleyebileceği video sayısını aştı.
forbidden (403) forbidden
forbidden (403) forbiddenLicenseSetting İstek, video için geçersiz bir lisans ayarlamaya çalışıyor.
forbidden (403) forbiddenPrivacySetting İstek, video için geçersiz bir gizlilik ayarı belirlemeye çalışıyor.

Deneyin.

Bu API'yi çağırmak ve API isteğini ve yanıtını görmek için APIs Explorer kullanın.