वीडियो अपलोड करें

YouTubeVideoUploadService की मदद से, Google Ads API के ज़रिए सीधे YouTube पर वीडियो अपलोड किए जा सकते हैं. इसके बाद, इन वीडियो का इस्तेमाल अलग-अलग तरह के विज्ञापनों में वीडियो ऐसेट बनाने के लिए किया जा सकता है. जैसे, परफ़ॉर्मेंस मैक्स कैंपेन या मांग बढ़ाने में मदद करने वाले कैंपेन.

यह सेवा, वीडियो विज्ञापन बनाने के वर्कफ़्लो को आसान बनाती है. यह YouTube पर वीडियो अपलोड करने की प्रोसेस को मैनेज करती है. साथ ही, यह पक्का करती है कि वीडियो आपके खाते से सही तरीके से जुड़े हों.

मुख्य सिद्धांत

शुरू करने से पहले, यह समझना ज़रूरी है कि वीडियो अपलोड को कैसे मैनेज किया जाता है और वे किन अलग-अलग स्थितियों से गुज़र सकते हैं.

चैनल स्वामित्व

वीडियो अपलोड करते समय, YouTubeVideoUpload रिसॉर्स में मौजूद channel_id फ़ील्ड का इस्तेमाल करके, YouTube चैनल का डेस्टिनेशन तय किया जा सकता है:

  • विज्ञापन देने वाले व्यक्ति या कंपनी के मालिकाना हक वाला (ब्रैंड) चैनल: विज्ञापन देने वाले व्यक्ति या कंपनी के मालिकाना हक वाले मौजूदा YouTube चैनल का channel_id दें. यह सुविधा सिर्फ़ उपयोगकर्ता की पुष्टि करने के फ़्लो के साथ काम करती है. इसका इस्तेमाल सेवा खातों के साथ नहीं किया जा सकता.
  • Google खाते से मैनेज किया जा रहा चैनल: अगर channel_id को शामिल नहीं किया जाता है, तो वीडियो को Google Ads खाते से जुड़े Google खाते से मैनेज किए जा रहे YouTube चैनल पर अपलोड किया जाता है.

अपलोड की स्थितियां

YouTube पर वीडियो अपलोड करने की प्रोसेस को state फ़ील्ड ट्रैक करता है. YouTubeVideoUploadState enum, इन स्थितियों के बारे में बताता है:

राज्य ब्यौरा
PENDING वीडियो अपलोड किया जा रहा है.
UPLOADED वीडियो अपलोड हो गया है और YouTube इसे प्रोसेस कर रहा है.
PROCESSED वीडियो को प्रोसेस कर दिया गया है और अब इसका इस्तेमाल किया जा सकता है.
FAILED अपलोड या प्रोसेसिंग पूरी नहीं हो सकी.
REJECTED पुष्टि न होने या नीति के उल्लंघन की वजह से, वीडियो को अस्वीकार कर दिया गया.
UNAVAILABLE वीडियो की स्थिति उपलब्ध नहीं है. ऐसा हो सकता है कि इसे YouTube से हटा दिया गया हो.

निजता सेटिंग

video_privacy फ़ील्ड से यह कंट्रोल किया जाता है कि अपलोड किया गया वीडियो कौन देख सकता है. YouTubeVideoPrivacy enum में ये वैल्यू इस्तेमाल की जा सकती हैं:

  • PUBLIC: यह वीडियो YouTube पर हर किसी के लिए उपलब्ध है. (सिर्फ़ ब्रैंड चैनलों के लिए अनुमति है).
  • UNLISTED: वीडियो को खोजा नहीं जा सकता, लेकिन लिंक वाले लोग इसे देख सकते हैं. Google के मैनेज किए जा रहे चैनलों के लिए, यह डिफ़ॉल्ट और एकमात्र विकल्प है.

वीडियो अपलोड करें

वीडियो अपलोड करने के लिए, आपको CreateYouTubeVideoUpload तरीके का इस्तेमाल करके, कई हिस्सों वाला अनुरोध करना होगा. अनुरोध में, अपलोड किए जाने वाले वीडियो का मेटाडेटा और वीडियो फ़ाइल, दोनों शामिल होती हैं.

1. अपलोड शुरू करना

CreateYouTubeVideoUploadRequest बनाएं. इसमें ये जानकारी दें:

  • customer_id: आपका Google Ads ग्राहक आईडी.
  • you_tube_video_upload: यह YouTubeVideoUpload ऑब्जेक्ट है. इसमें video_title, video_description, और channel_id और video_privacy शामिल होते हैं. हालांकि, channel_id और video_privacy को शामिल करना ज़रूरी नहीं है.

अगर क्लाइंट लाइब्रेरी का इस्तेमाल किया जा रहा है, तो 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 स्थिति में पहुंच जाता है, तब आपको उसका YouTube वीडियो आईडी, YouTubeVideoUpload संसाधन के video_id फ़ील्ड में मिल सकता है.

MutateAssets के साथ YoutubeVideoAsset बनाने के लिए, इस video_id का इस्तेमाल करें. इसके अलावा, इसे सीधे तौर पर उन विज्ञापन टाइप से लिंक करें जो YouTube वीडियो के साथ काम करते हैं. इसके लिए, वीडियो आईडी का रेफ़रंस दें.

मेटाडेटा अपडेट करें

इस एपीआई के ज़रिए अपलोड किए गए वीडियो के मेटाडेटा को अपडेट किया जा सकता है. इसके लिए, UpdateYouTubeVideoUpload तरीके का इस्तेमाल करें. सिर्फ़ video_title, video_description, और video_privacy फ़ील्ड अपडेट किए जा सकते हैं.

अपलोड किए गए वीडियो हटाना

अगर आपको Google Ads API का इस्तेमाल करके अपलोड किए गए वीडियो मिटाने हैं, तो RemoveYouTubeVideoUpload तरीके का इस्तेमाल करें. इससे वीडियो, Google Ads की ऐसेट लाइब्रेरी और YouTube, दोनों से हट जाएगा.