videos.insert
من مشاريع واجهة برمجة التطبيقات التي لم يتم إثبات ملكيتها والتي تم إنشاؤها بعد 28 تموز (يوليو) 2020 سيتم حصرها في وضع العرض الخاص. لرفع هذا القيد،
على كل مشروع في واجهة برمجة التطبيقات إجراء تدقيق للتحقّق من الامتثال
لبنود الخدمة. يُرجى الاطّلاع على سجلّ النُسخ السابقة لواجهة برمجة التطبيقات للحصول على مزيد من التفاصيل.
يحمّل فيديو إلى 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 غرضين في هذه العملية. وتحدّد الخصائص التي سيتم ضبطها في عملية الكتابة، فضلاً عن الخصائص التي ستتضمنها استجابة واجهة برمجة التطبيقات.يُرجى ملاحظة أنه لا تحتوي جميع الأجزاء على خصائص يمكن ضبطها عند إدراج فيديو أو تعديله. على سبيل المثال، يتضمّن الكائن statistics إحصاءات تحتسبها منصة YouTube لفيديو معيّن ولا يحتوي على قيم يمكنك ضبطها أو تعديلها. في حال تحديد قيمة المَعلمة part التي لا تحتوي على قيم متبادلة، سيستمر تضمين part في استجابة واجهة برمجة التطبيقات.تحتوي القائمة التالية على أسماء part التي يمكنك تضمينها في قيمة المَعلمة:
|
|
المعلّمات الاختيارية | ||
notifySubscribers |
boolean تشير المعلمة notifySubscribers إلى ما إذا كان على YouTube إرسال إشعار بشأن الفيديو الجديد إلى المستخدمين الذين يشتركون في قناة الفيديو. تشير قيمة المعلمة True إلى أنه سيتم إشعار المشتركين بالفيديوهات التي تم تحميلها مؤخرًا. ومع ذلك، قد يفضل مالك القناة الذي يحمِّل العديد من الفيديوهات ضبط القيمة على False لتجنُّب إرسال إشعار عن كل فيديو جديد إلى المشتركين في القناة. القيمة التلقائية هي True . |
|
onBehalfOfContentOwner |
string لا يمكن استخدام هذه المعلّمة إلا في طلب مفوَّض بشكلٍ سليم. ملاحظة: هذه المعلمة مخصصة حصريًا لشركاء محتوى YouTube. تشير المعلمة onBehalfOfContentOwner إلى أن بيانات اعتماد تفويض الطلب تحدد مستخدم YouTube CMS الذي يتصرف نيابةً عن مالك المحتوى المحدد في قيمة المعلمة. هذه المعلمة مخصصة لشركاء محتوى YouTube الذين يملكون ويديرون العديد من قنوات YouTube المختلفة. تتيح هذه الميزة لمالكي المحتوى المصادقة مرة واحدة والوصول إلى كل بيانات الفيديو والقناة بدون الحاجة إلى تقديم بيانات اعتماد المصادقة لكل قناة على حدة. يجب ربط حساب نظام إدارة المحتوى الذي يصادق المستخدم عليه بمالك محتوى 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
لتحميل فيديو إلى القناة المرتبطة بالطلب.
يستخدم هذا المثال مكتبة برامج 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
لواجهة برمجة التطبيقات لتحميل فيديو إلى القناة المرتبطة بالطلب.
يستخدم هذا المثال مكتبة عميل 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
في واجهة برمجة التطبيقات لتحميل فيديو إلى القناة المرتبطة بالطلب.
يستخدم هذا المثال مكتبة عملاء 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
الأخطاء
يحدد الجدول التالي رسائل الخطأ التي يمكن أن تعرضها واجهة برمجة التطبيقات ردًا على استدعاء لهذه الطريقة. يرجى الاطلاع على وثائق رسالة الخطأ لمزيد من التفاصيل.
نوع الخطأ | تفاصيل الخطأ | الوصف |
---|---|---|
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 لاستدعاء واجهة برمجة التطبيقات هذه والاطّلاع على طلب واجهة برمجة التطبيقات والاستجابة له.