YouTube'a video yükler ve isteğe bağlı olarak videonun meta verilerini ayarlar.
Bu yöntem, medya yüklemeyi destekler. Yüklenen dosyalar aşağıdaki kısıtlamalara uygun olmalıdır:
- Maksimum dosya boyutu: 256 GB
- Kabul edilen medya MIME türleri:
video/*,application/octet-stream
Kota etkisi: Günlük 100 çağrı. Bu yönteme yapılan bir çağrının, Video Yüklemeleri kota grubunda 1 birim kota maliyeti vardır.
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 kapsamların en az biriyle yetkilendirme yapılması 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 tüm parametreler sorgu parametreleridir.
| Parametreler | ||
|---|---|---|
| Gerekli parametreler | ||
part |
stringpart parametresi bu işlemde iki amaca hizmet eder. Yazma işleminin ayarlayacağı özelliklerin yanı sıra API yanıtının içereceği özellikleri tanımlar.Tüm bölümlerin, video eklerken veya güncellerken ayarlanabilecek özellikler içermediğini unutmayın. Örneğin, statistics nesnesi YouTube'un bir video için hesapladığı istatistikleri kapsar ve ayarlayabileceğiniz veya değiştirebileceğiniz değerler içermez. Parametre değeri, değiştirilebilir değerler içermeyen bir part belirtiyorsa bu part, API yanıtına dahil edilir.Aşağıdaki listede, parametre değerine dahil edebileceğiniz part adları yer almaktadır:
|
|
| İsteğe bağlı parametreler | ||
notifySubscribers |
booleannotifySubscribers parametresi, YouTube'un videonun kanalına abone olan kullanıcılara yeni video hakkında bildirim gönderip göndermeyeceğini belirtir. True parametre değeri, abonelerin yeni yüklenen videolar hakkında bilgilendirileceğini gösterir. Ancak çok sayıda video yükleyen bir kanal sahibi, kanalın abonelerine her yeni video hakkında bildirim göndermemek için değeri False olarak ayarlamayı tercih edebilir. Varsayılan değer: True. |
|
onBehalfOfContentOwner |
stringBu parametre yalnızca uygun şekilde yetkilendirilmiş bir istekte kullanılabilir. Not: Bu parametre yalnızca YouTube içerik iş ortakları için tasarlanmıştır. onBehalfOfContentOwner parametresi, isteğin yetkilendirme kimlik bilgilerinin, parametre değerinde belirtilen içerik sahibi adına hareket eden bir YouTube İçerik Yönetim Sistemi kullanıcısını tanımladığını gösterir. Bu parametre, birçok farklı YouTube kanalının sahibi olan ve bunları yöneten YouTube içerik iş ortakları için tasarlanmıştır. Bu sayede içerik sahipleri, her kanal için ayrı ayrı kimlik doğrulama bilgileri girmek zorunda kalmadan tek bir kimlik doğrulama işlemiyle tüm video ve kanal verilerine erişebilir. Kullanıcının kimlik doğrulaması için kullandığı CMS hesabı, belirtilen YouTube içerik sahibine bağlı olmalıdır. |
|
onBehalfOfContentOwnerChannel |
stringBu parametre yalnızca doğru şekilde yetkilendirilmiş bir istekte kullanılabilir. Bu parametre yalnızca doğru şekilde yetkilendirilmiş 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 istekte onBehalfOfContentOwner parametresi için değer belirtildiğinde gereklidir ve yalnızca bu parametreyle birlikte kullanılabilir. Ayrıca, istek, onBehalfOfContentOwner parametresinin belirttiği içerik sahibine bağlı bir İçerik Yönetim Sistemi hesabı kullanılarak yetkilendirilmelidir. Son olarak, onBehalfOfContentOwnerChannel parametre değerinin belirttiği kanal, onBehalfOfContentOwner parametresinin belirttiği içerik sahibine bağlı olmalıdır.Bu parametre, birçok farklı YouTube kanalının sahibi olan ve bunları yöneten YouTube içerik iş ortakları için tasarlanmıştır. İçerik sahiplerinin bir kez kimlik doğrulaması yapmasına ve her bir kanal için kimlik doğrulama bilgileri sağlamak zorunda kalmadan, parametre değerinde belirtilen kanal adına işlem yapmasına olanak tanır. |
|
İstek metni
İstek gövdesinde bir video kaynağı sağlayın. Bu kaynak için:
-
Bu özellikler için değerler ayarlayabilirsiniz:
snippet.titlesnippet.descriptionsnippet.tags[]snippet.categoryIdsnippet.defaultLanguagelocalizations.(key)localizations.(key).titlelocalizations.(key).descriptionstatus.embeddablestatus.licensestatus.privacyStatus: Bu özellik için bir değer belirtmezseniz yüklenen videonun gizlilik durumu varsayılan olarakpublicolur. YouTube Yardım Merkezi'nde açıklandığı üzere, içerik üretici hesap ayarlarına bağlı olarak belirli yüklemeler varsayılan olarakprivateşeklinde ayarlanabilir. Doğrulanmamış API projelerinden yüklenen videolar, gizli görüntüleme moduyla kısıtlanmaz.status.publicStatsViewablestatus.publishAtstatus.selfDeclaredMadeForKidsstatus.containsSyntheticMediarecordingDetails.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 kapsamayabilir. Desteklenen dillerin listesi için istemci kitaplıkları dokümanlarına bakın.
Go
Bu kod örneği, istek ile ilişkili kanala video yüklemek için API'ninvideos.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 video yüklemek için API'ninvideos.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 video yüklemek için API'ninvideos.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 bir çağrıya yanıt olarak döndürebileceği hata mesajları belirtilmektedir. Daha fazla bilgi için lütfen hata mesajı belgelerine 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 verilerinde geçersiz bir planlanmış yayınlanma zamanı belirtiliyor. |
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 verilerinde geçersiz veya boş bir video başlığı belirtiliyor. |
badRequest (400) |
invalidVideoGameRating |
İstek meta verileri geçersiz bir video oyunu derecelendirmesi belirtiyor. |
badRequest (400) |
invalidVideoMetadata |
İstek meta verileri geçersiz. |
badRequest (400) |
mediaBodyRequired |
İstek, 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ği ile yanıtını görmek için APIs Explorer kullanın.