videos.insert
จากโปรเจ็กต์ API ที่ไม่ได้รับการยืนยันซึ่งสร้างหลังจากวันที่ 28 กรกฎาคม 2020 จะจํากัดเฉพาะโหมดการดูส่วนตัว หากต้องการยกเลิกข้อจํากัดนี้ โปรเจ็กต์ API แต่ละรายการต้องดําเนินการตรวจสอบเพื่อยืนยันการปฏิบัติตามข้อกําหนดในการให้บริการ โปรดดูรายละเอียดเพิ่มเติมที่ประวัติการแก้ไข API
อัปโหลดวิดีโอไปยัง YouTube และเลือกตั้งค่าข้อมูลเมตาของวิดีโอ
วิธีนี้รองรับการอัปโหลดสื่อ ไฟล์ที่อัปโหลดต้องสอดคล้องกับข้อจํากัดต่อไปนี้
- ขนาดไฟล์สูงสุด:256 GB
- ประเภท MIME ของสื่อที่ยอมรับ:
video/*
,application/octet-stream
ผลกระทบจากโควต้า: การเรียกใช้วิธีการนี้มีต้นทุนโควต้า 1,600 หน่วย
กรณีการใช้งานทั่วไป
ส่งคำขอ
คำขอ HTTP
POST https://www.googleapis.com/upload/youtube/v3/videos
การให้สิทธิ์
คําขอนี้ต้องมีการให้สิทธิ์กับขอบเขตต่อไปนี้อย่างน้อย 1 ขอบเขต (อ่านเพิ่มเติมเกี่ยวกับการตรวจสอบสิทธิ์และการให้สิทธิ์)
ขอบเขต |
---|
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 มีจุดประสงค์ 2 ประการในการดําเนินการนี้ รายงานนี้ระบุพร็อพเพอร์ตี้ที่การดําเนินการเขียนจะตั้งค่า รวมถึงพร็อพเพอร์ตี้ที่การตอบกลับ API จะรวมอยู่ด้วยโปรดทราบว่าบางพร็อพเพอร์ตี้ไม่มีพร็อพเพอร์ตี้ที่ตั้งค่าได้เมื่อแทรกหรืออัปเดตวิดีโอ ตัวอย่างเช่น ออบเจ็กต์ statistics จะสรุปสถิติที่ YouTube คํานวณสําหรับวิดีโอและไม่ระบุค่าที่คุณตั้งค่าหรือแก้ไขได้ หากค่าพารามิเตอร์ระบุ part ที่ไม่มีค่าที่เปลี่ยนแปลง part จะยังคงรวมอยู่ในการตอบกลับ APIรายการต่อไปนี้มีชื่อ part ที่คุณใส่ไว้ในค่าพารามิเตอร์ได้
|
|
พารามิเตอร์ที่ไม่บังคับ | ||
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 ต่างๆ จํานวนมาก ช่วยให้เจ้าของเนื้อหาตรวจสอบสิทธิ์ได้ 1 ครั้งและดําเนินการในนามของช่องที่ระบุไว้ในค่าพารามิเตอร์ โดยไม่ต้องระบุข้อมูลเข้าสู่ระบบของแต่ละช่อง |
เนื้อหาของคำขอ
ระบุทรัพยากรวิดีโอในส่วนเนื้อหาของคําขอ สําหรับทรัพยากรดังกล่าว ให้ทําดังนี้
-
คุณตั้งค่าพร็อพเพอร์ตี้เหล่านี้ได้
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
คำตอบ
หากใช้วิธีนี้ วิธีนี้จะแสดงทรัพยากรวิดีโอในส่วนเนื้อหาของการตอบกลับ
ตัวอย่าง
หมายเหตุ: ตัวอย่างโค้ดต่อไปนี้อาจไม่แสดงภาษาโปรแกรมที่รองรับทั้งหมด โปรดดูรายชื่อภาษาที่รองรับในเอกสารประกอบเกี่ยวกับไลบรารีของไคลเอ็นต์
Go
ตัวอย่างโค้ดนี้เรียกใช้เมธอด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
ของ API เพื่ออัปโหลดวิดีโอไปยังช่องที่เชื่อมโยงกับคําขอ
ตัวอย่างนี้ใช้ไลบรารีของไคลเอ็นต์ .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