वीडियो के सुझाव पाने के लिए Engage SDK

book_path: /distribute/other-docs/_book.yaml project_path: /distribute/other-docs/_project.yaml

इस गाइड में, डेवलपर के लिए निर्देश दिए गए हैं. इनमें बताया गया है कि Engage SDK का इस्तेमाल करके, सुझाए गए वीडियो कॉन्टेंट को कैसे इंटिग्रेट किया जा सकता है. इससे, Google के अलग-अलग प्लैटफ़ॉर्म पर कॉन्टेंट के सुझाव दिखाए जा सकते हैं. जैसे, टीवी, फ़ोन, और टैबलेट.

सुझाव देने की सुविधा, सुझाव वाला क्लस्टर का इस्तेमाल करके, एक ही यूज़र इंटरफ़ेस (यूआई) ग्रुपिंग में, कई ऐप्लिकेशन से फ़िल्में और टीवी शो दिखाती है. हर डेवलपर पार्टनर, सुझावों के हर क्लस्टर में ज़्यादा से ज़्यादा 25 इकाइयां ब्रॉडकास्ट कर सकता है. साथ ही, हर अनुरोध में ज़्यादा से ज़्यादा सात सुझाव वाले क्लस्टर हो सकते हैं.

सेशन की तैयारी

शुरुआती निर्देशों की गाइड में दिए गए पहले से किए जाने वाले काम के निर्देशों को पूरा करें.

  1. फ़ोरग्राउंड सेवा पर पब्लिश करने की प्रोसेस पूरी करना.
  2. सुझावों का डेटा, दिन में ज़्यादा से ज़्यादा एक बार पब्लिश करें. यह डेटा इनमें से किसी एक के ट्रिगर होने पर पब्लिश किया जाता है:
    • उपयोगकर्ता का दिन का पहला लॉगिन. (या)
    • जब उपयोगकर्ता ऐप्लिकेशन के साथ इंटरैक्ट करना शुरू करता है.

SDK टूल इंटिग्रेशन

AppEngagePublishClient सुझाव क्लस्टर को पब्लिश करता है. सुझाव ऑब्जेक्ट पब्लिश करने के लिए, publishRecommendationClusters तरीके का इस्तेमाल करें.

शुरुआती निर्देशों की गाइड में बताए गए तरीके से, क्लाइंट को शुरू करें और सेवा की उपलब्धता की जांच करें.

client.publishRecommendationClusters(recommendationRequest)

सुझाव वाले क्लस्टर को अपसर्ट किया जा रहा है

क्लस्टर, इकाइयों का लॉजिकल ग्रुप होता है. कोड के इन उदाहरणों में बताया गया है कि अपनी पसंद के हिसाब से क्लस्टर कैसे बनाए जाते हैं. साथ ही, पब्लिश करने का अनुरोध कैसे किया जाता है और सभी क्लस्टर को कैसे अपसर्ट किया जाता है.

RecommendationClusterType से यह तय होता है कि क्लस्टर कैसे दिखेगा.

// cluster for popular movies
val recommendationCluster1 = RecommendationCluster
  .Builder()
  .addEntity(movie1)
  .addEntity(movie2)
  .addEntity(movie3)
  .addEntity(movie4)
  .addEntity(tvShow)
  // This cluster is meant to be used as an individual provider row
  .setRecommendationClusterType(TYPE_PROVIDER_ROW)
  .setTitle("Popular Movies")
  .build()

// cluster for live TV programs
val recommendationCluster2 = RecommendationCluster
  .Builder()
  .addEntity(liveTvProgramEntity1)
  .addEntity(liveTvProgramEntity2)
  .addEntity(liveTvProgramEntity3)
  .addEntity(liveTvProgramEntity4)
  .addEntity(liveTvProgramEntity5)
 // This cluster is meant to be used as an individual provider row
  .setRecommendationClusterType(TYPE_PROVIDER_ROW)
  .setTitle("Popular Live TV Programs")
  .build()

// creating a publishing request
val recommendationRequest = PublishRecommendationClustersRequest
  .Builder()
  .setSyncAcrossDevices(true)
  .setAccountProfile(accountProfile)
  .addRecommendationCluster(recommendationCluster1)
  .addRecommendationCluster(recommendationCluster2)
  .build()

जब सेवा को अनुरोध मिलता है, तो एक ही लेन-देन में ये कार्रवाइयां होती हैं:

  • डेवलपर पार्टनर से मिला मौजूदा RecommendationsCluster डेटा हटा दिया जाता है.
  • अनुरोध से मिले डेटा को पार्स करके, अपडेट किए गए RecommendationsCluster में सेव किया जाता है. गड़बड़ी होने पर, पूरे अनुरोध को अस्वीकार कर दिया जाता है और मौजूदा स्थिति बनी रहती है.

अलग-अलग डिवाइसों पर सिंक करने की सुविधा

SyncAcrossDevices फ़्लैग से यह कंट्रोल किया जाता है कि किसी व्यक्ति के लिए सुझावों के क्लस्टर का डेटा, Google TV के साथ शेयर किया जाए या नहीं. साथ ही, यह भी कंट्रोल किया जाता है कि यह डेटा, टीवी, फ़ोन, और टैबलेट जैसे उसके सभी डिवाइसों पर उपलब्ध हो या नहीं. सुझाव के काम करने के लिए, इसे सही पर सेट किया जाना चाहिए.

मीडिया ऐप्लिकेशन में, क्रॉस-डिवाइस सिंक करने की सुविधा को चालू या बंद करने के लिए, साफ़ तौर पर सेटिंग दी जानी चाहिए. उपयोगकर्ता को फ़ायदों के बारे में बताएं. साथ ही, उपयोगकर्ता की प्राथमिकता को एक बार सेव करें और publishRecommendations अनुरोध में उसी के मुताबिक लागू करें. क्रॉस-डिवाइस सुविधा का ज़्यादा से ज़्यादा फ़ायदा पाने के लिए, पुष्टि करें कि ऐप्लिकेशन को उपयोगकर्ता की सहमति मिली हो और उसने SyncAcrossDevices को true के लिए चालू किया हो.

वीडियो डिस्कवरी का डेटा मिटाना

अगर आपको उपयोगकर्ता के डेटा को Google TV सर्वर से मैन्युअल तरीके से मिटाना है, तो client.deleteClusters() तरीके का इस्तेमाल करें. ऐसा, डेटा के रखरखाव की 60 दिनों की स्टैंडर्ड अवधि से पहले किया जा सकता है. अनुरोध मिलने पर, सेवा खाते की प्रोफ़ाइल या पूरे खाते के लिए, वीडियो डिस्कवरी से जुड़ा मौजूदा डेटा मिटा देती है.

DeleteReason enum, डेटा मिटाने की वजह के बारे में बताता है. नीचे दिए गए कोड से, लॉग आउट करने पर सुझाव हट जाते हैं.

// If the user logs out from your media app, you must make the following call
// to remove recommendations data from the current Google TV device, otherwise,
// the recommendations data persists on the current Google TV device until 60
// days later.
client.deleteClusters(
  new DeleteClustersRequest.Builder()
    .setAccountProfile(AccountProfile())
    .setReason(DeleteReason.DELETE_REASON_USER_LOG_OUT)
    .build()
)

// If the user revokes the consent to share data with Google TV, you must make
// the following call to remove recommendations data from all current Google TV
// devices. Otherwise, the recommendations data persists until 60 days later.
client.deleteClusters(
  new DeleteClustersRequest.Builder()
    .setAccountProfile(AccountProfile())
    .setReason(DeleteReason.DELETE_REASON_LOSS_OF_CONSENT)
    .build()
)

इकाइयां बनाना

एसडीके ने हर आइटम टाइप को दिखाने के लिए अलग-अलग इकाइयां तय की हैं. सुझाव क्लस्टर के लिए, यहां दी गई इकाइयां इस्तेमाल की जा सकती हैं:

  1. MediaActionFeedEntity
  2. MovieEntity
  3. TvShowEntity
  4. LiveTvChannelEntity
  5. LiveTvProgramEntity

ब्यौरे देना

हर इकाई के लिए कम शब्दों में जानकारी दें. यह जानकारी तब दिखेगी, जब उपयोगकर्ता इकाई पर कर्सर घुमाएंगे. इससे उन्हें ज़्यादा जानकारी मिलेगी.

प्लैटफ़ॉर्म के हिसाब से प्लेबैक यूआरआई

Android TV, Android या iOS जैसे सभी प्लैटफ़ॉर्म के लिए, वीडियो चलाने के यूआरआई बनाएं. इससे सिस्टम को, वीडियो चलाने के लिए सही यूआरआई चुनने में मदद मिलती है.

अगर ऐसा बहुत कम होता है कि सभी प्लैटफ़ॉर्म के लिए वीडियो चलाने के यूआरआई एक जैसे हों, तो हर प्लैटफ़ॉर्म के लिए इसे दोहराएं.

// Required. Set this when you want recommended entities to show up on
// Google TV
val playbackUriTv = PlatformSpecificUri
  .Builder()
  .setPlatformType(PlatformType.TYPE_ANDROID_TV)
  .setActionUri(Uri.parse("https://www.example.com/entity_uri_for_tv"))
  .build()

// Optional. Set this when you want recommended entities to show up on
// Google TV Android app
val playbackUriAndroid = PlatformSpecificUri
  .Builder()
  .setPlatformType(PlatformType.TYPE_ANDROID_MOBILE)
  .setActionUri(Uri.parse("https://www.example.com/entity_uri_for_android"))
  .build()

// Optional. Set this when you want recommended entities to show up on
// Google TV iOS app
val playbackUriIos = PlatformSpecificUri
  .Builder()
  .setPlatformType(PlatformType.TYPE_IOS)
  .setActionUri(Uri.parse("https://www.example.com/entity_uri_for_ios"))
  .build()

val platformSpecificPlaybackUris =
  Arrays.asList(playbackUriTv, playbackUriAndroid, playbackUriIos)

// Provide appropriate rating for the system.
val contentRating = new RatingSystem
  .Builder()
  .setAgencyName("MPAA")
  .setRating("PG-13")
  .build()

पोस्टर इमेज

पोस्टर इमेज के लिए, यूआरआई और पिक्सल डाइमेंशन (ऊंचाई और चौड़ाई) की ज़रूरत होती है. अलग-अलग फ़ॉर्म फ़ैक्टर को टारगेट करने के लिए, एक से ज़्यादा पोस्टर इमेज उपलब्ध कराएं. हालांकि, यह पुष्टि करें कि सभी इमेज का आसपेक्ट रेशियो 16:9 हो और उनकी ऊंचाई कम से कम 200 पिक्सल हो. इससे "सुझाव" इकाई को सही तरीके से दिखाया जा सकेगा. खास तौर पर, Google के Entertainment Space में. ऐसा हो सकता है कि 200 पिक्सल से कम ऊंचाई वाली इमेज न दिखाई जाएं.

Image image1 = new Image.Builder()
  .setImageUri(Uri.parse("http://www.example.com/entity_image1.png");)
  .setImageHeightInPixel(300)
  .setImageWidthInPixel(169)
  .build()

Image image2 = new Image.Builder()
  .setImageUri(Uri.parse("http://www.example.com/entity_image2.png");)
  .setImageHeightInPixel(640)
  .setImageWidthInPixel(360)
  .build()

// And other images for different form factors.
val images = Arrays.asList(image1, image2)

सुझाव की वजह

सुझाव देने की वजह के बारे में जानकारी दें. इसका इस्तेमाल Google TV, यह बताने के लिए कर सकता है कि किसी व्यक्ति को कोई खास फ़िल्म या टीवी शो क्यों सुझाया गया है.

//Allows us to construct reason: "Because it is top 10 on your Channel"
val topOnPartner = RecommendationReasonTopOnPartner
  .Builder()
  .setNum(10) //any valid integer value
  .build()

//Allows us to construct reason: "Because it is popular on your Channel"
val popularOnPartner = RecommendationReasonPopularOnPartner
  .Builder()
  .build()

//Allows us to construct reason: "New to your channel, or Just added"
val newOnPartner = RecommendationReasonNewOnPartner
  .Builder()
  .build()

//Allows us to construct reason: "Because you watched Star Wars"
val watchedSimilarTitles = RecommendationReasonWatchedSimilarTitles
  .addSimilarWatchedTitleName("Movie or TV Show Title")
  .addSimilarWatchedTitleName("Movie or TV Show Title")
  .Builder()
  .build()

//Allows us to construct reason: "Recommended for you by ChannelName"
val recommendedForUser = RecommendationReasonRecommendedForUser
  .Builder()
  .build()

val watchAgain = RecommendationReasonWatchAgain
  .Builder()
  .build()

val fromUserWatchList = RecommendationReasonFromUserWatchlist
  .Builder()
  .build()

val userLikedOnPartner = RecommendationReasonUserLikedOnPartner
  .Builder()
  .setTitleName("Movie or TV Show Title")
  .build()

val generic = RecommendationReasonGeneric.Builder().build()

टाइम विंडो दिखाना

अगर किसी इकाई को सिर्फ़ कुछ समय के लिए उपलब्ध कराना है, तो उसके लिए कस्टम समयसीमा सेट करें. समयसीमा तय न होने पर, इकाइयां 60 दिनों के बाद अपने-आप मिट जाएंगी. इसलिए, इकाइयों के खत्म होने का समय सिर्फ़ तब सेट करें, जब उन्हें जल्द ही खत्म करना हो. उपलब्धता के ऐसे कई समय स्लॉट तय करें.

val window1 = DisplayTimeWindow
  .Builder()
  .setStartTimeStampMillis(now()+ 1.days.toMillis())
  .setEndTimeStampMillis(now()+ 30.days.toMillis())

val window2 = DisplayTimeWindow
  .Builder()
  .setEndTimeStampMillis(now()+ 30.days.toMillis())

val availabilityTimeWindows: List<DisplayTimeWindow> = listof(window1,window2)

DataFeedElementId

अगर आपने Google TV के साथ अपने मीडिया कैटलॉग या मीडिया ऐक्शन फ़ीड को इंटिग्रेट किया है, तो आपको फ़िल्म या टीवी शो के लिए अलग-अलग इकाइयां बनाने की ज़रूरत नहीं है. इसके बजाय, MediaActionFeedEntity बनाया जा सकता है. इसमें DataFeedElementId फ़ील्ड शामिल होता है. यह आईडी यूनीक होना चाहिए. साथ ही, यह मीडिया ऐक्शन फ़ीड में मौजूद आईडी से मेल खाना चाहिए. इससे, फ़ीड किए गए कॉन्टेंट की पहचान करने और मीडिया कॉन्टेंट लुकअप करने में मदद मिलती है.

val id = "dataFeedElementId"

MovieEntity

यहां सभी ज़रूरी फ़ील्ड के साथ MovieEntity बनाने का उदाहरण दिया गया है:


val movieEntity = MovieEntity.Builder()
  .setName("Movie name")
  .setDescription("A sentence describing movie.")
  .addPlatformSpecificPlaybackUri(platformSpecificPlaybackUris)
  .addPosterImages(images)
  // Suppose the duration is 2 hours, it is 72000000 in milliseconds
  .setDurationMills(72000000)
  .build()

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

val genres = Arrays.asList("Action", "Science fiction");
val rating1 = RatingSystem.Builder().setAgencyName("MPAA").setRating("pg-13").build();
val contentRatings = Arrays.asList(rating1);
//Suppose release date is 11-02-2025
val releaseDate  = 1739233800000L
val movieEntity = MovieEntity.Builder()
  ...
  .addGenres(genres)
  .setReleaseDateEpochMillis(releaseDate)
  .addContentRatings(contentRatings)
  .setRecommendationReason(topOnPartner or watchedSimilarTitles)
  .addAllAvailabilityTimeWindows(availabilityTimeWindows)
  .build()

TvShowEntity

यहां सभी ज़रूरी फ़ील्ड के साथ TvShowEntity बनाने का उदाहरण दिया गया है:

val tvShowEntity = TvShowEntity.Builder()
  .setName("Show title")
  .setDescription("A sentence describing TV Show.")
  .addPlatformSpecificPlaybackUri(platformSpecificPlaybackUris)
  .addPosterImages(images)
  .build();

ज़्यादा जानकारी भी दी जा सकती है. जैसे, शैली, कॉन्टेंट रेटिंग, सुझाव देने की वजह, ऑफ़र की कीमत, सीज़न की संख्या या उपलब्धता की समयावधि. Google TV इस जानकारी का इस्तेमाल, कॉन्टेंट को बेहतर तरीके से दिखाने या फ़िल्टर करने के लिए कर सकता है.

val genres = Arrays.asList("Action", "Science fiction");
val rating1 = RatingSystem.Builder()
  .setAgencyName("MPAA")
  .setRating("pg-13")
  .build();
val price = Price.Builder()
  .setCurrentPrice("$14.99")
  .setStrikethroughPrice("$16.99")
  .build();
val contentRatings = Arrays.asList(rating1);
val seasonCount = 5;
val tvShowEntity = TvShowEntity.Builder()
  ...
  .addGenres(genres)
  .addContentRatings(contentRatings)
  .setRecommendationReason(topOnPartner or watchedSimilarTitles)
  .addAllAvailabilityTimeWindows(availabilityTimeWindows)
  .setSeasonCount(seasonCount)
  .setPrice(price)
  .build()

MediaActionFeedEntity

यहां सभी ज़रूरी फ़ील्ड के साथ MediaActionFeedEntity बनाने का उदाहरण दिया गया है:


val mediaActionFeedEntity = MediaActionFeedEntity.Builder()
  .setDataFeedElementId(id)
  .build()

इसके अलावा, ब्यौरा, सुझाव देने की वजह, और दिखाने की समयावधि जैसे अतिरिक्त डेटा की जानकारी भी दी जा सकती है. Google TV इस डेटा का इस्तेमाल, बेहतर तरीके से कॉन्टेंट दिखाने या फ़िल्टर करने के लिए कर सकता है.

val mediaActionFeedEntity = MediaActionFeedEntity.Builder()
  .setName("Movie name or TV Show name")
  .setDescription("A sentence describing an entity")
  .setRecommendationReason(topOnPartner or watchedSimilarTitles)
  .addPosterImages(images)
  .build()

LiveTvChannelEntity

यह लाइव टीवी चैनल को दिखाता है. यहां सभी ज़रूरी फ़ील्ड के साथ LiveTvChannelEntity बनाने का उदाहरण दिया गया है:

val liveTvChannelEntity = LiveTvChannelEntity.Builder()
  .setName("Channel Name")
  // ID of the live TV channel
  .setEntityId("https://www.example.com/channel/12345")
  .setDescription("A sentence describing this live TV channel.")
  // channel playback uri must contain at least PlatformType.TYPE_ANDROID_TV
  .addPlatformSpecificPlaybackUri(channelPlaybackUris)
  .addLogoImage(logoImage)
  .build()

ज़रूरी नहीं: कॉन्टेंट रेटिंग या सुझाव देने की वजह जैसे अन्य डेटा दें.

val rating1 = RatingSystem.Builder()
  .setAgencyName("MPAA")
  .setRating("pg-13")
  .build()
val contentRatings = Arrays.asList(rating1)

val liveTvChannelEntity = LiveTvChannelEntity.Builder()
  ...
  .addContentRatings(contentRatings)
  .setRecommendationReason(topOnPartner)
  .build()

LiveTvProgramEntity

यह लाइव टीवी प्रोग्राम कार्ड है. यह लाइव टीवी चैनल पर दिखाया जा रहा है या इसे दिखाने के लिए शेड्यूल किया गया है. यहां सभी ज़रूरी फ़ील्ड के साथ LiveTvProgramEntity बनाने का उदाहरण दिया गया है:

val liveTvProgramEntity = LiveTvProgramEntity.Builder()
  // First set the channel information
  .setChannelName("Channel Name")
  .setChannelId("https://www.example.com/channel/12345")
  // channel playback uri must contain at least PlatformType.TYPE_ANDROID_TV
  .addPlatformSpecificPlaybackUri(channelPlaybackUris)
  .setChannelLogoImage(channelLogoImage)
  // Then set the program or card specific information.
  .setName("Program Name")
  .setEntityId("https://www.example.com/schedule/123")
  .setDescription("Program Description")
  .addAvailabilityTimeWindow(
      DisplayTimeWindow.Builder()
        .setStartTimestampMillis(1756713600000L)// 2025-09-01T07:30:00+0000
        .setEndTimestampMillis(1756715400000L))// 2025-09-01T08:00:00+0000
  .addPosterImage(programImage)
  .build()

विकल्प के तौर पर, कॉन्टेंट की रेटिंग, शैलियां या सुझाव देने की वजह जैसा अतिरिक्त डेटा दें.

val rating1 = RatingSystem.Builder()
  .setAgencyName("MPAA")
  .setRating("pg-13")
  .build()
val contentRatings = Arrays.asList(rating1)
val genres = Arrays.asList("Action", "Science fiction")

val liveTvProgramEntity = LiveTvProgramEntity.Builder()
  ...
  .addContentRatings(contentRatings)
  .addGenres(genres)
  .setRecommendationReason(topOnPartner)
  .build()