YouTubeVideoUploadService
की मदद से, Google Ads API के ज़रिए सीधे YouTube पर वीडियो अपलोड किए जा सकते हैं. इसके बाद, इन वीडियो का इस्तेमाल करके, अलग-अलग तरह के विज्ञापनों में वीडियो ऐसेट बनाई जा सकती हैं. जैसे, परफ़ॉर्मेंस मैक्स कैंपेन या मांग बढ़ाने में मदद करने वाले कैंपेन.
यह सेवा, वीडियो विज्ञापन बनाने के वर्कफ़्लो को आसान बनाती है. यह YouTube पर वीडियो अपलोड करने की प्रोसेस को मैनेज करती है. साथ ही, यह पक्का करती है कि वीडियो आपके खाते से सही तरीके से जुड़े हों.
मुख्य सिद्धांत
शुरू करने से पहले, यह समझना ज़रूरी है कि वीडियो अपलोड को कैसे मैनेज किया जाता है और वे किन-किन स्थितियों से गुज़र सकते हैं.
चैनल स्वामित्व
वीडियो अपलोड करते समय, YouTubeVideoUpload रिसॉर्स में मौजूद channel_id फ़ील्ड का इस्तेमाल करके, YouTube चैनल का डेस्टिनेशन तय किया जा सकता है:
- विज्ञापन देने वाले व्यक्ति या कंपनी के मालिकाना हक वाला (ब्रैंड) चैनल: विज्ञापन देने वाले व्यक्ति या कंपनी के मालिकाना हक वाले किसी मौजूदा YouTube चैनल का
channel_idडालें. यह सिर्फ़ उपयोगकर्ता की पुष्टि के फ़्लो के साथ काम करता है. इसका इस्तेमाल सेवा खातों के साथ नहीं किया जा सकता. - Google खाते से मैनेज किया जा रहा चैनल: अगर
channel_idको शामिल नहीं किया जाता है, तो वीडियो को Google खाते से मैनेज किए जा रहे YouTube चैनल पर अपलोड किया जाता है. यह चैनल, Google Ads खाते से जुड़ा होता है.
अपलोड की स्थितियां
YouTube वीडियो अपलोड करने की लाइफ़साइकल को state फ़ील्ड ट्रैक करता है.
YouTubeVideoUploadState
enum से इन स्थितियों के बारे में पता चलता है:
| राज्य | ब्यौरा |
|---|---|
PENDING |
वीडियो अपलोड किया जा रहा है. |
UPLOADED |
वीडियो अपलोड हो गया है और YouTube इसे प्रोसेस कर रहा है. |
PROCESSED |
वीडियो को प्रोसेस कर दिया गया है और अब इसका इस्तेमाल किया जा सकता है. |
FAILED |
अपलोड या प्रोसेस करने की प्रोसेस पूरी नहीं हो सकी. |
REJECTED |
पुष्टि करने या नीति से जुड़ी वजहों से वीडियो को अस्वीकार कर दिया गया है. |
UNAVAILABLE |
वीडियो की स्थिति उपलब्ध नहीं है. ऐसा हो सकता है कि उसे YouTube से हटा दिया गया हो. |
निजता सेटिंग
video_privacy फ़ील्ड की मदद से यह कंट्रोल किया जाता है कि अपलोड किया गया वीडियो कौन देख सकता है. YouTubeVideoPrivacy
ईनम में ये वैल्यू इस्तेमाल की जा सकती हैं:
PUBLIC: वीडियो, YouTube पर सभी के लिए उपलब्ध है. (सिर्फ़ ब्रैंड चैनलों के लिए अनुमति है).UNLISTED: वीडियो को खोजा नहीं जा सकता, लेकिन लिंक वाले लोग इसे देख सकते हैं. Google के मैनेज किए जा रहे चैनलों के लिए, यह डिफ़ॉल्ट और एकमात्र विकल्प है.
जनरेटिव कॉन्टेंट के बारे में जानकारी देना
v26 से, विज्ञापन देने वाले लोग या कंपनियां यह बता सकती हैं कि अपलोड किए गए वीडियो कॉन्टेंट में, एआई से बनाया गया या सिंथेटिक मीडिया शामिल है या नहीं. ऐसा ईयू एआई ऐक्ट जैसे नियमों के तहत किया जा सकता है.
YouTubeVideoUpload में मौजूद video_content_metadata फ़ील्ड में VideoContentMetadata शामिल है. YouTubeVideoUploadGenerativeContentDisclosure एनम का इस्तेमाल करके, इसके नेस्ट किए गए generative_content_disclosure फ़ील्ड को सेट करें:
| वैल्यू | ब्यौरा |
|---|---|
NON_GENERATIVE_CONTENT |
विज्ञापन देने वाले व्यक्ति या कंपनी ने वीडियो को एआई से जनरेट नहीं किया गया बताया है. |
GENERATIVE_CONTENT |
विज्ञापन देने वाले व्यक्ति या कंपनी ने बताया है कि वीडियो को एआई से बनाया गया है. |
वीडियो अपलोड करें
वीडियो अपलोड करने के लिए, आपको CreateYouTubeVideoUpload तरीके का इस्तेमाल करके, कई हिस्सों वाला अनुरोध करना होगा. अनुरोध में, अपलोड किए जाने वाले वीडियो का मेटाडेटा और वीडियो फ़ाइल, दोनों शामिल होती हैं.
1. अपलोड शुरू करना
CreateYouTubeVideoUploadRequest बनाएं और इनमें से कोई एक जानकारी दें:
customer_id: आपका Google Ads ग्राहक आईडी.you_tube_video_upload:YouTubeVideoUploadऑब्जेक्ट, जिसमेंvideo_title,video_description, और वैकल्पिक तौर परchannel_id,video_privacy, और v26 से शुरू होने वालेvideo_content_metadataशामिल हैं.
अगर क्लाइंट लाइब्रेरी का इस्तेमाल किया जा रहा है, तो CreateYouTubeVideoUpload तरीके को कॉल करें. इसमें अपनी वीडियो फ़ाइल पास करें. इसके बाद, वीडियो अपलोड करने की प्रोसेस को अंदरूनी तौर पर मैनेज किया जाएगा.
Java
This example is not yet available in Java; you can take a look at the other languages.
C#
YouTubeVideoUploadServiceClient ytService = client.GetService( Services.V25.YouTubeVideoUploadService); CreateYouTubeVideoUploadRequest createUploadRequest = new CreateYouTubeVideoUploadRequest() { CustomerId = customerId.ToString(), YouTubeVideoUpload = new YouTubeVideoUpload() { VideoTitle = "Test Video", VideoDescription = "Test Video Description", VideoPrivacy = YouTubeVideoPrivacy.Unlisted } }; string videoUploadResourceName; using (FileStream stream = File.OpenRead(videoFilePath)) { ResumableUploadSession<CreateYouTubeVideoUploadRequest, CreateYouTubeVideoUploadResponse> session = ytService.CreateYouTubeVideoUpload(); CreateYouTubeVideoUploadResponse response = session.BeginUploadAsync(createUploadRequest, stream).Result; videoUploadResourceName = response.ResourceName; Console.WriteLine($"Created YouTube video upload: {videoUploadResourceName}"); }
PHP
$youTubeVideoUploadServiceClient = $googleAdsClient->getYouTubeVideoUploadServiceClient(); $youTubeVideoUpload = new YouTubeVideoUpload([ 'video_title' => 'Test Video', 'video_description' => 'Test Video Description', 'video_privacy' => YouTubeVideoPrivacy::UNLISTED ]); $createYouTubeVideoUploadRequest = CreateYouTubeVideoUploadRequest::build( $customerId, $youTubeVideoUpload ); /** @var ResumableUpload $resumableUpload */ $resumableUpload = $youTubeVideoUploadServiceClient->createYouTubeVideoUpload( $createYouTubeVideoUploadRequest ); $stream = Utils::streamFor(fopen($videoFilePath, 'rb')); /** @var CreateYouTubeVideoUploadResponse $response */ $response = $resumableUpload->startUpload($stream); $videoUploadResourceName = $response->getResourceName(); printf("Created YouTube video upload: '%s'%s", $videoUploadResourceName, PHP_EOL);
Python
yt_service: YouTubeVideoUploadServiceClient = client.get_service( "YouTubeVideoUploadService" ) create_upload_request: CreateYouTubeVideoUploadRequest = ( youtube_video_upload_service.CreateYouTubeVideoUploadRequest() ) create_upload_request.customer_id = customer_id create_upload_request.you_tube_video_upload.video_title = "Test Video" create_upload_request.you_tube_video_upload.video_description = ( "Test Video Description" ) create_upload_request.you_tube_video_upload.video_privacy = ( client.enums.YouTubeVideoPrivacyEnum.UNLISTED ) video_upload_resource_name: str with open(video_file_path, "rb") as stream: response: CreateYouTubeVideoUploadResponse = ( yt_service.create_you_tube_video_upload( stream=stream, request=create_upload_request, retry=None, ) ) video_upload_resource_name = response.resource_name print(f"Created YouTube video upload: {video_upload_resource_name}")
Ruby
This example is not yet available in Ruby; you can take a look at the other languages.
Perl
This example is not yet available in Perl; you can take a look at the other languages.
curl
# # Use the --i curl parameter to capture response headers in the $RESPONSE # variable. FILE_SIZE=$(wc -c < "${VIDEO_FILE_NAME}" | tr -d '\r') RESPONSE=$(curl -i -f -v -s --request POST \ "https://googleads.googleapis.com/resumable/upload/v${API_VERSION}/customers/${CUSTOMER_ID}/youTubeVideoUploads:create" \ --header "Content-Type: application/json" \ --header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \ --header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \ --header "X-Goog-Upload-Protocol: resumable" \ --header "X-Goog-Upload-Command: start" \ --header "X-Goog-Upload-Header-Content-Length: ${FILE_SIZE}" \ --data @- <<EOF { "customer_id": "${CUSTOMER_ID}", "you_tube_video_upload": { "video_title": "${VIDEO_TITLE}", "video_description": "${VIDEO_DESCRIPTION}", "video_privacy": "UNLISTED" } } EOF ) # Extract the value of the "x-goog-upload-url" header from the HTTP response. UPLOAD_URL=$(echo "${RESPONSE}" \ | grep -i '^x-goog-upload-url' \ | awk '{print $2}' \ | tr -d '\r') CHUNK_SIZE=$(echo "${RESPONSE}" \ | grep -i '^x-goog-upload-chunk-granularity' \ | awk '{print $2}' \ | tr -d '\r')
अगर REST का इस्तेमाल किया जा रहा है, तो यहां दिए गए सेक्शन में वीडियो अपलोड करने का तरीका बताया गया है.
2. वीडियो अपलोड करें
CreateYouTubeVideoUpload तरीके के लिए REST अनुरोध भेजने पर, जवाब में वह यूआरएल शामिल होता है जिसका इस्तेमाल x-goog-upload-url एचटीटीपी रिस्पॉन्स हेडर में वीडियो बाइट अपलोड करने के लिए किया जाता है. साथ ही, इसमें अन्य मेटाडेटा भी शामिल होता है. जैसे, Google के स्टैंडर्ड रिज़्यूमेबल अपलोड प्रोटोकॉल के मुताबिक, चंक किए गए अपलोड के लिए हर चंक का अनुमानित साइज़.
अपलोड किए जाने वाले वीडियो का साइज़ भी पहले से तय किया जा सकता है. इसके लिए, प्रोसेस शुरू करते समय x-goog-upload-header-content-length एचटीटीपी अनुरोध हेडर का इस्तेमाल करें.
वीडियो अपलोड करने के प्रोटोकॉल में इस्तेमाल किए गए एचटीटीपी हेडर की पूरी जानकारी के लिए, यहां दिए गए कोड का उदाहरण देखें:
# Take the first ${CHUNK_SIZE} bytes of the video file and upload them. head -c ${CHUNK_SIZE} ${VIDEO_FILE_NAME} | curl -i -v -X PUT "${UPLOAD_URL}" \ --header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \ --header "X-Goog-Upload-Offset: 0" \ --header "X-Goog-Upload-Command: upload" \ --header "Content-Length: ${CHUNK_SIZE}" \ --data-binary @- # Query the status of the upload. QUERY_RESPONSE=$(curl -i -s -X POST "${UPLOAD_URL}" \ --header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \ --header "X-Goog-Upload-Command: query") # Extract the value of the "x-goog-upload-size-received" header from the HTTP # response. UPLOADED_BYTES=$(echo "${QUERY_RESPONSE}" \ | grep -i '^x-goog-upload-size-received' \ | awk '{print $2}' \ | tr -d '\r') echo "Uploaded ${UPLOADED_BYTES} bytes." REMAINING_BYTES=$((FILE_SIZE - UPLOADED_BYTES)) echo "${REMAINING_BYTES} bytes remaining to upload." FINALIZE_RESPONSE=$(tail -c ${REMAINING_BYTES} ${VIDEO_FILE_NAME} | curl -v -X PUT "${UPLOAD_URL}" \ --header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \ --header "X-Goog-Upload-Offset: ${UPLOADED_BYTES}" \ --header "X-Goog-Upload-Command: upload, finalize" \ --data-binary @-) UPLOADED_VIDEO_RESOURCE_NAME=$(echo $FINALIZE_RESPONSE | jq -r '.resourceName')
3. वीडियो अपलोड होने की स्थिति का पता लगाना
वीडियो अपलोड करना शुरू करने के बाद, GAQL का इस्तेमाल करके you_tube_video_upload संसाधन से क्वेरी करके, वीडियो की स्थिति का पता लगाया जा सकता है:
Java
This example is not yet available in Java; you can take a look at the other languages.
C#
// Retrieve the metadata of the newly uploaded video. string query = $@" SELECT you_tube_video_upload.resource_name, you_tube_video_upload.video_id, you_tube_video_upload.state FROM you_tube_video_upload WHERE you_tube_video_upload.resource_name = '{videoUploadResourceName}'"; GoogleAdsServiceClient gaService = client.GetService( Services.V25.GoogleAdsService); gaService.SearchStream(customerId.ToString(), query, delegate (SearchGoogleAdsStreamResponse resp) { foreach (GoogleAdsRow row in resp.Results) { Console.WriteLine( $"Video with ID {row.YouTubeVideoUpload.VideoId} was found in " + $"state {row.YouTubeVideoUpload.State}."); } } );
PHP
// Retrieve the metadata of the newly uploaded video. $query = sprintf( "SELECT you_tube_video_upload.resource_name, " . "you_tube_video_upload.video_id, " . "you_tube_video_upload.state " . "FROM you_tube_video_upload " . "WHERE you_tube_video_upload.resource_name = '%s'", $videoUploadResourceName ); $googleAdsServiceClient = $googleAdsClient->getGoogleAdsServiceClient(); $stream = $googleAdsServiceClient->searchStream( SearchGoogleAdsStreamRequest::build($customerId, $query) ); foreach ($stream->iterateAllElements() as $googleAdsRow) { /** @var GoogleAdsRow $googleAdsRow */ printf( "Video with ID '%s' was found in state '%s'.%s", $googleAdsRow->getYouTubeVideoUpload()->getVideoId(), YouTubeVideoUploadState::name($googleAdsRow->getYouTubeVideoUpload()->getState()), PHP_EOL ); }
Python
# Retrieve the metadata of the newly uploaded video. query: str = f""" SELECT you_tube_video_upload.resource_name, you_tube_video_upload.video_id, you_tube_video_upload.state FROM you_tube_video_upload WHERE you_tube_video_upload.resource_name = '{video_upload_resource_name}'""" ga_service: GoogleAdsServiceClient = client.get_service("GoogleAdsService") stream: Iterator[SearchGoogleAdsStreamResponse] = ga_service.search_stream( customer_id=customer_id, query=query ) for row in itertools.chain.from_iterable(batch.results for batch in stream): video = row.you_tube_video_upload print( f"Video with ID {row.you_tube_video_upload.video_id} was found in state {row.you_tube_video_upload.state}." )
Ruby
This example is not yet available in Ruby; you can take a look at the other languages.
Perl
This example is not yet available in Perl; you can take a look at the other languages.
curl
curl -i -v -X POST \ "https://qa-prod-googleads.sandbox.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/googleAds:search" \ --header "Content-Type: application/json" \ --header "Developer-Token: ${DEVELOPER_TOKEN}" \ --header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \ --header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \ --data @- <<EOF { "query": "SELECT you_tube_video_upload.resource_name, you_tube_video_upload.video_id, you_tube_video_upload.state FROM you_tube_video_upload WHERE you_tube_video_upload.resource_name = '$UPLOADED_VIDEO_RESOURCE_NAME'" } EOF
अपलोड प्रबंधित करें
वीडियो अपलोड होने के बाद, उसका इस्तेमाल वीडियो ऐसेट के तौर पर किया जा सकता है.
अपलोड किए गए वीडियो का इस्तेमाल करना
वीडियो के PROCESSED स्थिति में पहुंचने के बाद, आपको YouTubeVideoUpload संसाधन के video_id फ़ील्ड में उसका YouTube वीडियो आईडी मिल सकता है.
इस video_id का इस्तेमाल करके, MutateAssets के साथ YoutubeVideoAsset बनाएं या वीडियो आईडी का रेफ़रंस देकर, इसे सीधे तौर पर उन विज्ञापन टाइप से लिंक करें जो YouTube वीडियो के साथ काम करते हैं.
मेटाडेटा अपडेट करें
इस एपीआई के ज़रिए अपलोड किए गए वीडियो के मेटाडेटा को अपडेट किया जा सकता है. इसके लिए, UpdateYouTubeVideoUpload तरीके का इस्तेमाल करें. सिर्फ़ video_title, video_description, और video_privacy फ़ील्ड अपडेट किए जा सकते हैं.
अपलोड किए गए वीडियो हटाना
अगर आपको Google Ads API की मदद से अपलोड किए गए वीडियो मिटाने हैं, तो RemoveYouTubeVideoUpload तरीके का इस्तेमाल करें. इससे वीडियो को Google Ads की ऐसेट लाइब्रेरी और YouTube, दोनों से हटा दिया जाएगा.