ভিডিও সাজেশনের জন্য SDK-এর সাথে যুক্ত থাকুন

এই নির্দেশিকাটিতে বিকাশকারীদের তাদের প্রস্তাবিত ভিডিও সামগ্রী সংহত করার নির্দেশাবলী রয়েছে, এনগেজ SDK ব্যবহার করে, টিভি, মোবাইল এবং ট্যাবলেটের মতো Google সারফেস জুড়ে সুপারিশের অভিজ্ঞতাগুলি পূরণ করতে৷

একটি UI গ্রুপিং-এ একাধিক অ্যাপ থেকে সিনেমা এবং টিভি শো দেখানোর জন্য প্রস্তাবনা ক্লাস্টার ব্যবহার করে। প্রতিটি বিকাশকারী অংশীদার প্রতিটি সুপারিশ ক্লাস্টারে সর্বাধিক 25টি সত্তা সম্প্রচার করতে পারে এবং প্রতি অনুরোধে সর্বাধিক 7টি সুপারিশ ক্লাস্টার থাকতে পারে।

প্রাক কাজ

আপনি শুরু করার আগে, নিম্নলিখিত পদক্ষেপগুলি সম্পূর্ণ করুন। 1. এই ইন্টিগ্রেশনের জন্য আপনার অ্যাপের লক্ষ্য API স্তর 19 বা উচ্চতর যাচাই করুন।

  1. আপনার অ্যাপে com.google.android.engage লাইব্রেরি যোগ করুন।

    ইন্টিগ্রেশনে ব্যবহার করার জন্য আলাদা SDK আছে: একটি মোবাইল অ্যাপের জন্য এবং একটি টিভি অ্যাপের জন্য।

    মোবাইলের জন্য

    
      dependencies {
        implementation 'com.google.android.engage:engage-core:1.5.5
      }
    

    টিভির জন্য

    
      dependencies {
        implementation 'com.google.android.engage:engage-tv:1.0.2
      }
    
  2. AndroidManifest.xml ফাইলে প্রডাকশনে এনগেজ পরিষেবা পরিবেশ সেট করুন।

    মোবাইল apk এর জন্য

    
    <meta-data
          android:name="com.google.android.engage.service.ENV"
          android:value="PRODUCTION">
    </meta-data>
    

    টিভি apk এর জন্য

    
    <meta-data
        android:name="com.google.android.engage.service.ENV"
        android:value="PRODUCTION">
    </meta-data>
    
  3. একটি ফোরগ্রাউন্ড পরিষেবাতে প্রকাশনা চালান।

  4. প্রতিদিন সর্বাধিক একবার সুপারিশের ডেটা প্রকাশ করুন, যেকোনো একটি দ্বারা ট্রিগার করা হয়

    1. ব্যবহারকারীর দিনের প্রথম লগইন। ( বা )
    2. যখন ব্যবহারকারী অ্যাপ্লিকেশনটির সাথে ইন্টারেক্টিভ শুরু করে।

ইন্টিগ্রেশন

AppEngagePublishClient সুপারিশ ক্লাস্টার প্রকাশ করে। একটি সুপারিশ বস্তু প্রকাশ করতে publishRecommendationClusters পদ্ধতি ব্যবহার করুন।

পরিষেবাটি ইন্টিগ্রেশনের জন্য উপলব্ধ কিনা তা পরীক্ষা করতে isServiceAvailable() 2 ব্যবহার করুন।

val client = AppEngagePublishClient(context)

client.isServiceAvailable().addOnCompleteListener { task ->
  if (task.isSuccessful) {
  // Handle IPC call success
    if(task.result) {
      // Service is available on the device, proceed with content publish
      // calls.
      client.publishRecommendationClusters(recommendationRequest)
    } else {
      // Service is not available
    }
  } else {
    // The IPC call itself fails, proceed with error handling logic here,
    // such as retry.
  }
}

সুপারিশ ক্লাস্টার এবং একটি প্রকাশ অনুরোধ

ক্লাস্টার হল সত্তার যৌক্তিক গ্রুপিং। নিম্নলিখিত কোড উদাহরণগুলি ব্যাখ্যা করে যে কীভাবে আপনার পছন্দের উপর ভিত্তি করে ক্লাস্টারগুলি তৈরি করবেন এবং কীভাবে সমস্ত ক্লাস্টারগুলির জন্য একটি প্রকাশনার অনুরোধ তৈরি করবেন৷

// cluster for popular movies
val recommendationCluster1 = RecommendationCluster
  .Builder()
  .addEntity(movie)
  .addEntity(tvShow)
  .setTitle("Popular Movies")
  .build()

// cluster for top searches
val recommendationCluster2 = RecommendationCluster
  .Builder()
  .addEntity(movie)
  .addEntity(tvShow)
  .setTitle("Top Searches")
  .build()

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

একটি অ্যাকাউন্ট প্রোফাইল তৈরি করুন

Google TV-তে ব্যক্তিগতকৃত অভিজ্ঞতার অনুমতি দিতে, অ্যাকাউন্ট এবং প্রোফাইল তথ্য প্রদান করুন। প্রদান করতে AccountProfile ব্যবহার করুন:

  1. অ্যাকাউন্ট আইডি: একটি অনন্য শনাক্তকারী যা আপনার অ্যাপ্লিকেশনের মধ্যে ব্যবহারকারীর অ্যাকাউন্টের প্রতিনিধিত্ব করে। এটি প্রকৃত অ্যাকাউন্ট আইডি বা উপযুক্তভাবে অস্পষ্ট সংস্করণ হতে পারে।
  2. প্রোফাইল আইডি (ঐচ্ছিক): যদি আপনার অ্যাপ্লিকেশনটি একটি অ্যাকাউন্টের মধ্যে একাধিক প্রোফাইল সমর্থন করে, তবে নির্দিষ্ট ব্যবহারকারী প্রোফাইলের জন্য একটি অনন্য শনাক্তকারী প্রদান করুন।
  3. লোকেল (ঐচ্ছিক): আপনি ঐচ্ছিকভাবে ব্যবহারকারীর পছন্দের ভাষা প্রদান করতে পারেন। আপনি RecommendationRequestMediaActionFeedEntity পাঠালে এই ক্ষেত্রটি উপযোগী।
// If app only supports account
val accountProfile = AccountProfile.Builder()
  .setAccountId("account_id")
  .build();

// If app supports both account and profile
val accountProfile = AccountProfile.Builder()
  .setAccountId("account_id")
  .setProfileId("profile_id")
  .build();

// set Locale
val accountProfile = AccountProfile.Builder()
  .setAccountId("account_id")
  .setProfileId("profile_id")
  .setLocale("en-US")
  .build();

যখন পরিষেবাটি অনুরোধটি গ্রহণ করে, নিম্নলিখিত ক্রিয়াগুলি একটি লেনদেনের মধ্যে ঘটে:

  • বিকাশকারী অংশীদার থেকে বিদ্যমান RecommendationsCluster ডেটা সরানো হয়েছে৷
  • অনুরোধের ডেটা পার্স করা হয় এবং আপডেট করা RecommendationsCluster এ সংরক্ষণ করা হয়। একটি ত্রুটির ক্ষেত্রে, সম্পূর্ণ অনুরোধ প্রত্যাখ্যান করা হয় এবং বিদ্যমান অবস্থা বজায় রাখা হয়।

ক্রস-ডিভাইস সিঙ্ক

SyncAcrossDevices পতাকা নিয়ন্ত্রণ করে যে ব্যবহারকারীর সুপারিশের ক্লাস্টার ডেটা Google TV-এর সাথে ভাগ করা হয় এবং টিভি, ফোন, ট্যাবলেটের মতো তাদের ডিভাইস জুড়ে উপলব্ধ। সুপারিশ কাজ করার জন্য, এটি সত্য সেট করা আবশ্যক.

মিডিয়া অ্যাপ্লিকেশনটিকে ক্রস-ডিভাইস সিঙ্কিং সক্ষম বা অক্ষম করতে একটি স্পষ্ট সেটিং প্রদান করতে হবে৷ ব্যবহারকারীর সুবিধাগুলি ব্যাখ্যা করুন এবং ব্যবহারকারীর পছন্দ একবার সংরক্ষণ করুন এবং সেই অনুযায়ী publishRecommendations অনুরোধে এটি প্রয়োগ করুন। ক্রস-ডিভাইস বৈশিষ্ট্য থেকে সর্বাধিক পেতে, যাচাই অ্যাপ ব্যবহারকারীর সম্মতি প্রাপ্ত করে এবং SyncAcrossDevices true সক্ষম করে।

ভিডিও আবিষ্কারের ডেটা মুছুন

স্ট্যান্ডার্ড 60-দিন ধরে রাখার সময়ের আগে Google TV সার্ভার থেকে ব্যবহারকারীর ডেটা ম্যানুয়ালি মুছতে, client.deleteClusters() পদ্ধতি ব্যবহার করুন। অনুরোধ পাওয়ার পরে, পরিষেবাটি অ্যাকাউন্ট প্রোফাইলের জন্য বা পুরো অ্যাকাউন্টের জন্য বিদ্যমান ভিডিও আবিষ্কারের সমস্ত ডেটা মুছে দেয়।

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()
)

সত্তা তৈরি করুন

প্রতিটি আইটেমের প্রকারের প্রতিনিধিত্ব করার জন্য SDK বিভিন্ন সত্তাকে সংজ্ঞায়িত করেছে। নিম্নলিখিত সংস্থাগুলি সুপারিশ ক্লাস্টারের জন্য সমর্থিত:

  1. MediaActionFeedEntity
  2. MovieEntity
  3. TvShowEntity

বর্ণনা

প্রতিটি সত্তার জন্য একটি সংক্ষিপ্ত বিবরণ প্রদান করুন; এই বিবরণটি প্রদর্শিত হবে যখন ব্যবহারকারীরা সত্তার উপর ঘোরায়, তাদের অতিরিক্ত বিবরণ প্রদান করে।

প্ল্যাটফর্ম নির্দিষ্ট প্লেব্যাক ইউআরআই

প্রতিটি সমর্থিত প্ল্যাটফর্মের জন্য প্লেব্যাক URI তৈরি করুন: Android TV, Android বা iOS। এটি সিস্টেমটিকে সংশ্লিষ্ট প্ল্যাটফর্মে ভিডিও প্লেব্যাকের জন্য উপযুক্ত URI নির্বাচন করতে দেয়।

বিরল ক্ষেত্রে যখন প্লেব্যাক ইউআরআই সমস্ত প্ল্যাটফর্মের জন্য অভিন্ন, প্রতিটি প্ল্যাটফর্মের জন্য এটি পুনরাবৃত্তি করুন।

// 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()

পোস্টার ছবি

পোস্টার ইমেজ একটি URI এবং পিক্সেল মাত্রা প্রয়োজন (উচ্চতা এবং প্রস্থ)। একাধিক পোস্টার ইমেজ প্রদান করে বিভিন্ন ফর্ম ফ্যাক্টরকে লক্ষ্য করুন, কিন্তু "প্রস্তাবিত" সত্তার সঠিক প্রদর্শনের জন্য, বিশেষ করে Google-এর এন্টারটেইনমেন্ট স্পেস-এর মধ্যে সমস্ত ছবি একটি 16:9 অনুপাত এবং ন্যূনতম 200 পিক্সেলের উচ্চতা বজায় রাখুন৷ 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-এর সাথে একত্রিত করে থাকেন, তাহলে আপনাকে মুভি বা টিভি শো-এর জন্য আলাদা সত্তা তৈরি করতে হবে না এবং পরিবর্তে আপনি একটি MediaActionFeed সত্তা তৈরি করতে পারেন যাতে প্রয়োজনীয় ক্ষেত্র DataFeedElementId অন্তর্ভুক্ত থাকে। এই আইডিটি অবশ্যই অনন্য হতে হবে এবং মিডিয়া অ্যাকশন ফিডের আইডির সাথে অবশ্যই মিলতে হবে কারণ এটি ইনজেস্ট করা ফিড সামগ্রী সনাক্ত করতে এবং মিডিয়া সামগ্রীর সন্ধান করতে সহায়তা করে৷

val id = "dataFeedEleemntId"

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()

এই পদক্ষেপগুলি বাস্তবায়নের মাধ্যমে, বিকাশকারীরা সফলভাবে Google TV-তে ভিডিও সামগ্রীর সুপারিশগুলিকে একীভূত করতে পারে, ব্যবহারকারীর আবিষ্কার এবং ব্যস্ততা বৃদ্ধি করে, তাদের সমস্ত ডিভাইস জুড়ে ব্যবহারকারীদের জন্য একটি সামঞ্জস্যপূর্ণ এবং ব্যক্তিগতকৃত দেখার অভিজ্ঞতা প্রদান করে৷