YouTube पर वीडियो अपलोड करता है और वीडियो का मेटाडेटा सेट करता है. हालांकि, मेटाडेटा सेट करना ज़रूरी नहीं है.
इस तरीके से मीडिया अपलोड किया जा सकता है. अपलोड की गई फ़ाइलों को इन शर्तों के मुताबिक होना चाहिए:
- फ़ाइल का ज़्यादा से ज़्यादा साइज़: 256 जीबी
- स्वीकार किए जाने वाले मीडिया एमआईएमई टाइप:
video/*,application/octet-stream
कोटा पर असर: हर दिन 100 कॉल. इस तरीके को कॉल करने पर, वीडियो अपलोड करने के कोटे के बकेट में 1 यूनिट की कोटा लागत लगती है.
इस्तेमाल के सामान्य उदाहरण
अनुरोध
एचटीटीपी अनुरोध
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 |
booleannotifySubscribers पैरामीटर से पता चलता है कि YouTube को वीडियो के चैनल की सदस्यता लेने वाले उपयोगकर्ताओं को नए वीडियो के बारे में सूचना भेजनी चाहिए या नहीं. True पैरामीटर वैल्यू से पता चलता है कि सदस्यों को, नए वीडियो अपलोड होने की सूचना दी जाएगी. हालांकि, अगर कोई चैनल मालिक कई वीडियो अपलोड कर रहा है, तो वह इस वैल्यू को False पर सेट कर सकता है. इससे चैनल के सदस्यों को हर नए वीडियो की सूचना नहीं भेजी जाएगी. डिफ़ॉल्ट वैल्यू True है. |
|
onBehalfOfContentOwner |
stringइस पैरामीटर का इस्तेमाल सिर्फ़ सही तरीके से अनुमति वाले अनुरोध में किया जा सकता है. ध्यान दें: यह पैरामीटर सिर्फ़ YouTube के कॉन्टेंट पार्टनर के लिए है. onBehalfOfContentOwner पैरामीटर से पता चलता है कि अनुरोध के अनुमति क्रेडेंशियल, YouTube सीएमएस के उस उपयोगकर्ता की पहचान करते हैं जो पैरामीटर वैल्यू में बताए गए कॉन्टेंट के मालिक की ओर से काम कर रहा है. यह पैरामीटर, YouTube कॉन्टेंट पार्टनर के लिए है. ये पार्टनर, कई YouTube चैनलों का मालिकाना हक रखते हैं और उन्हें मैनेज करते हैं. इसकी मदद से, कॉन्टेंट के मालिक एक बार पुष्टि करके अपने सभी वीडियो और चैनल का डेटा ऐक्सेस कर सकते हैं. इसके लिए, उन्हें हर चैनल के लिए पुष्टि करने वाले क्रेडेंशियल देने की ज़रूरत नहीं होती. उपयोगकर्ता जिस सीएमएस खाते से पुष्टि करता है वह YouTube कॉन्टेंट के मालिकाना हक वाले खाते से लिंक होना चाहिए. |
|
onBehalfOfContentOwnerChannel |
stringइस पैरामीटर का इस्तेमाल सिर्फ़ अनुमति वाले अनुरोध में किया जा सकता है. इस पैरामीटर का इस्तेमाल सिर्फ़ अनुमति वाले अनुरोध में किया जा सकता है. ध्यान दें: यह पैरामीटर सिर्फ़ YouTube के कॉन्टेंट पार्टनर के लिए है. onBehalfOfContentOwnerChannel पैरामीटर से, उस चैनल के YouTube चैनल आईडी की जानकारी मिलती है जिसमें वीडियो जोड़ा जा रहा है. जब कोई अनुरोध onBehalfOfContentOwner पैरामीटर के लिए कोई वैल्यू तय करता है, तब इस पैरामीटर की ज़रूरत होती है. साथ ही, इसका इस्तेमाल सिर्फ़ उस पैरामीटर के साथ किया जा सकता है. इसके अलावा, अनुरोध को उस कॉन्टेंट मैनेजमेंट सिस्टम खाते से अनुमति मिलनी चाहिए जो कॉन्टेंट के मालिक से जुड़ा हो. कॉन्टेंट के मालिक की जानकारी, onBehalfOfContentOwner पैरामीटर से मिलती है. आखिर में, onBehalfOfContentOwnerChannel पैरामीटर की वैल्यू से तय होने वाला चैनल, उस कॉन्टेंट के मालिक से लिंक होना चाहिए जिसे onBehalfOfContentOwner पैरामीटर तय करता है.यह पैरामीटर, YouTube के उन कॉन्टेंट पार्टनर के लिए है जो कई अलग-अलग YouTube चैनलों के मालिक हैं और उन्हें मैनेज करते हैं. इससे कॉन्टेंट के मालिकों को एक बार पुष्टि करने और पैरामीटर वैल्यू में बताए गए चैनल की ओर से कार्रवाइयां करने की सुविधा मिलती है. इसके लिए, उन्हें हर चैनल के लिए पुष्टि करने वाले क्रेडेंशियल देने की ज़रूरत नहीं होती. |
|
अनुरोध का मुख्य भाग
अनुरोध के मुख्य हिस्से में वीडियो संसाधन दें. उस संसाधन के लिए:
-
इन प्रॉपर्टी के लिए वैल्यू सेट की जा सकती हैं:
snippet.titlesnippet.descriptionsnippet.tags[]snippet.categoryIdsnippet.defaultLanguagelocalizations.(key)localizations.(key).titlelocalizations.(key).descriptionstatus.embeddablestatus.licensestatus.privacyStatus: अगर आपने इस प्रॉपर्टी के लिए कोई वैल्यू नहीं दी है, तो अपलोड किए गए वीडियो की निजता की स्थिति डिफ़ॉल्ट रूप सेpublicपर सेट हो जाती है. क्रिएटर के खाते की सेटिंग के आधार पर, कुछ वीडियो डिफ़ॉल्ट रूप सेprivateके तौर पर सेट हो सकते हैं. इसके बारे में YouTube सहायता केंद्र पर बताया गया है. बिना पुष्टि वाले एपीआई प्रोजेक्ट से अपलोड किए गए वीडियो, सिर्फ़ निजी तौर पर देखने के मोड तक सीमित नहीं हैं.status.publicStatsViewablestatus.publishAtstatus.selfDeclaredMadeForKidsstatus.containsSyntheticMediarecordingDetails.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 का इस्तेमाल करें. साथ ही, एपीआई अनुरोध और रिस्पॉन्स देखें.