videos.insert
dari project API yang tidak terverifikasi
yang dibuat setelah 28 Juli 2020 akan dibatasi ke mode tampilan pribadi. Untuk mencabut pembatasan ini,
setiap project API harus melakukan
audit untuk memverifikasi kepatuhan terhadap
Persyaratan Layanan. Lihat
Histori Revisi API untuk
mengetahui detail selengkapnya.
Mengupload video ke YouTube dan secara opsional menetapkan metadata video.
Metode ini mendukung upload media. File yang diupload harus sesuai dengan batasan berikut:
- Ukuran file maksimum: 256 GB
- Jenis MIME Media yang Diterima:
video/*
,application/octet-stream
Dampak kuota: Panggilan ke metode ini memiliki biaya kuota sebesar 1.600 unit.
Kasus penggunaan umum
Permintaan
Permintaan HTTP
POST https://www.googleapis.com/upload/youtube/v3/videos
Otorisasi
Permintaan ini memerlukan otorisasi dengan setidaknya salah satu cakupan berikut (baca selengkapnya tentang autentikasi dan otorisasi).
Cakupan |
---|
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 |
Parameter
Tabel berikut mencantumkan parameter yang didukung kueri ini. Semua parameter yang tercantum adalah parameter kueri.
Parameter | ||
---|---|---|
Parameter yang diperlukan | ||
part |
string Parameter part memiliki dua tujuan dalam operasi ini. Bagian ini mengidentifikasi properti yang akan ditetapkan oleh operasi tulis serta properti yang akan disertakan dalam respons API.Perhatikan bahwa tidak semua bagian berisi properti yang dapat ditetapkan saat menyisipkan atau memperbarui video. Misalnya, objek statistics mengenkapsulasi statistik yang dihitung YouTube untuk video dan tidak berisi nilai yang dapat Anda tetapkan atau ubah. Jika nilai parameter menentukan part yang tidak berisi nilai yang dapat diubah, part tersebut akan tetap disertakan dalam respons API.Daftar berikut berisi nama part yang dapat Anda sertakan dalam nilai parameter:
|
|
Parameter opsional | ||
notifySubscribers |
boolean Parameter notifySubscribers menunjukkan apakah YouTube harus mengirim notifikasi tentang video baru kepada pengguna yang subscribe ke channel video tersebut. Nilai parameter True menunjukkan bahwa subscriber akan diberi tahu tentang video yang baru diupload. Namun, pemilik channel yang mengupload banyak video mungkin lebih memilih untuk menetapkan nilai ke False agar tidak mengirim notifikasi tentang setiap video baru kepada subscriber channel. Nilai defaultnya adalah True . |
|
onBehalfOfContentOwner |
string Parameter ini hanya dapat digunakan dalam permintaan yang diotorisasi dengan benar. Catatan: Parameter ini ditujukan secara eksklusif untuk partner konten YouTube. Parameter onBehalfOfContentOwner menunjukkan bahwa kredensial otorisasi permintaan mengidentifikasi pengguna CMS YouTube yang bertindak atas nama pemilik konten yang ditentukan dalam nilai parameter. Parameter ini ditujukan untuk partner konten YouTube yang memiliki dan mengelola banyak channel YouTube yang berbeda. Fitur ini memungkinkan pemilik konten melakukan autentikasi satu kali dan mendapatkan akses ke semua data video dan channel mereka, tanpa harus memberikan kredensial autentikasi untuk setiap channel. Akun CMS yang digunakan pengguna untuk melakukan autentikasi harus ditautkan ke pemilik konten YouTube yang ditentukan. |
|
onBehalfOfContentOwnerChannel |
string Parameter ini hanya dapat digunakan dalam permintaan yang diotorisasi dengan benar. Parameter ini hanya dapat digunakan dalam permintaan yang diotorisasi dengan benar. Catatan: Parameter ini ditujukan secara eksklusif untuk partner konten YouTube. Parameter onBehalfOfContentOwnerChannel menentukan ID channel YouTube dari channel tempat video ditambahkan. Parameter ini diperlukan saat permintaan menentukan nilai untuk parameter onBehalfOfContentOwner , dan hanya dapat digunakan bersama parameter tersebut. Selain itu, permintaan harus diotorisasi menggunakan akun CMS yang ditautkan ke pemilik konten yang ditentukan oleh parameter onBehalfOfContentOwner . Terakhir, channel yang ditentukan oleh nilai parameter onBehalfOfContentOwnerChannel harus ditautkan ke pemilik konten yang ditentukan oleh parameter onBehalfOfContentOwner .Parameter ini ditujukan untuk partner konten YouTube yang memiliki dan mengelola banyak channel YouTube yang berbeda. Dengan fitur ini, pemilik konten dapat melakukan autentikasi satu kali dan melakukan tindakan atas nama channel yang ditentukan dalam nilai parameter, tanpa harus memberikan kredensial autentikasi untuk setiap channel terpisah. |
Isi permintaan
Berikan resource video dalam isi permintaan. Untuk resource tersebut:
-
Anda dapat menetapkan nilai untuk properti berikut:
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
status.containsSyntheticMedia
recordingDetails.recordingDate
Respons
Jika berhasil, metode ini akan menampilkan resource video dalam isi respons.
Contoh
Catatan: Contoh kode berikut mungkin tidak merepresentasikan semua bahasa pemrograman yang didukung. Lihat dokumentasi library klien untuk mengetahui daftar bahasa yang didukung.
Go
Contoh kode ini memanggil metodevideos.insert
API untuk mengupload video ke channel
yang terkait dengan permintaan.
Contoh ini menggunakan library klien 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
Contoh kode berikut memanggil metodevideos.insert
API untuk mengupload video ke channel
yang terkait dengan permintaan.
Contoh ini menggunakan library klien.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
Contoh ini memanggil metodevideos.insert
API untuk mengupload video ke saluran
yang terkait dengan permintaan.
Contoh ini menggunakan library klien 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
Error
Tabel berikut mengidentifikasi pesan error yang dapat ditampilkan API sebagai respons terhadap panggilan ke metode ini. Lihat dokumentasi pesan error untuk mengetahui detail selengkapnya.
Jenis error | Detail error | Deskripsi |
---|---|---|
badRequest (400) |
defaultLanguageNotSet |
Permintaan tersebut mencoba menambahkan detail video yang dilokalkan tanpa menentukan bahasa default detail video. |
badRequest (400) |
invalidCategoryId |
Properti snippet.categoryId mencantumkan ID kategori yang tidak valid. Gunakan metode videoCategories.list untuk mengambil kategori yang didukung. |
badRequest (400) |
invalidDescription |
Metadata permintaan menentukan deskripsi video yang tidak valid. |
badRequest (400) |
invalidFilename |
Nama file video yang ditentukan dalam header Slug tidak valid. |
badRequest (400) |
invalidPublishAt |
Metadata permintaan menentukan waktu publikasi terjadwal yang tidak valid. |
badRequest (400) |
invalidRecordingDetails |
Objek recordingDetails dalam metadata permintaan menentukan detail perekaman yang tidak valid. |
badRequest (400) |
invalidTags |
Metadata permintaan menentukan kata kunci video yang tidak valid. |
badRequest (400) |
invalidTitle |
Metadata permintaan menentukan judul video yang tidak valid atau kosong. |
badRequest (400) |
invalidVideoGameRating |
Metadata permintaan menentukan rating video game yang tidak valid. |
badRequest (400) |
invalidVideoMetadata |
Metadata permintaan tidak valid. |
badRequest (400) |
mediaBodyRequired |
Permintaan tidak menyertakan konten video. |
badRequest (400) |
uploadLimitExceeded |
Pengguna telah melampaui jumlah video yang dapat mereka upload. |
forbidden (403) |
forbidden |
|
forbidden (403) |
forbiddenLicenseSetting |
Permintaan tersebut mencoba menetapkan lisensi yang tidak valid untuk video. |
forbidden (403) |
forbiddenPrivacySetting |
Permintaan tersebut mencoba menetapkan setelan privasi yang tidak valid untuk video. |
Cobalah!
Gunakan APIs Explorer untuk memanggil API ini dan melihat permintaan serta respons API.