এই গাইডে ডেভেলপারদের জন্য নির্দেশাবলী রয়েছে যাতে তারা Engage SDK ব্যবহার করে তাদের সাজেস্ট করা ভিডিও কন্টেন্ট ইন্টিগ্রেট করতে পারেন, যাতে টিভি, মোবাইল এবং ট্যাবলেটের মতো Google সারফেস জুড়ে সাজেস্ট করা অভিজ্ঞতা প্রদান করা যায়।
সাজেশন সাজেশন ক্লাস্টার ব্যবহার করে সিনেমা ও টিভি শো দেখায়, একাধিক অ্যাপ থেকে একটি UI গ্রুপিংয়ে। প্রতিটি ডেভেলপার পার্টনার প্রতিটি সাজেশন ক্লাস্টারে সর্বাধিক ২৫টি এন্টিটি ব্রডকাস্ট করতে পারবেন এবং প্রতিটি অনুরোধে সর্বাধিক ৭টি সাজেশন ক্লাস্টার থাকতে পারে।
প্রি-ওয়ার্ক
শুরু করার নির্দেশিকায় কাজের আগে সংক্রান্ত নির্দেশাবলী সম্পূর্ণ করুন।
- ফোরগ্রাউন্ড সার্ভিসে প্রকাশনা এক্সিকিউট করুন।
- সাজেশন সংক্রান্ত ডেটা দিনে সর্বাধিক একবার প্রকাশ করুন, যা নিম্নলিখিত যেকোনও একটির মাধ্যমে ট্রিগার করা হয়
- দিনের মধ্যে ব্যবহারকারীর প্রথম লগ-ইন। (অথবা)
- ব্যবহারকারী যখন অ্যাপ্লিকেশনের সাথে ইন্টার্যাক্ট করা শুরু করেন।
ইন্টিগ্রেশন
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-এর সাথে শেয়ার করা হয়েছে কিনা এবং টিভি, ফোন,
ট্যাবলেটের মতো তার ডিভাইস জুড়ে উপলভ্য কিনা। সাজেশন কাজ করার জন্য, এটি অবশ্যই true-তে সেট করতে হবে।
সম্মতি নেওয়া
মিডিয়া অ্যাপ্লিকেশনকে ক্রস-ডিভাইস সিঙ্ক চালু বা বন্ধ করার জন্য একটি স্পষ্ট সেটিং প্রদান করতে হবে। ব্যবহারকারীকে সুবিধাগুলি ব্যাখ্যা করুন এবং ব্যবহারকারীর পছন্দ একবার স্টোর করুন এবং সেই অনুযায়ী publishRecommendations অনুরোধে এটি প্রয়োগ করুন। ক্রস-ডিভাইস ফিচার থেকে সবচেয়ে বেশি সুবিধা পেতে, অ্যাপ ব্যবহারকারীর সম্মতি পেয়েছে কিনা তা যাচাই করুন এবং SyncAcrossDevices থেকে true চালু করুন।
Engage ডেটা মুছে দিন
স্ট্যান্ডার্ড ৬০ দিনের রিটেনশন পিরিয়ডের আগে Google TV সার্ভার থেকে কোনও ব্যবহারকারীর ডেটা ম্যানুয়ালি মুছে দিতে, client.deleteClusters() পদ্ধতি ব্যবহার করুন। অনুরোধ
পাওয়ার পরে, পরিষেবাটি অ্যাকাউন্ট প্রোফাইল বা সম্পূর্ণ অ্যাকাউন্টের জন্য আগে থেকে থাকা সব Engage
ডেটা মুছে দেয়।
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(
DeleteClustersRequest.Builder()
.setAccountProfile(accountProfile)
.setDeleteReason(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(
DeleteClustersRequest.Builder()
.setAccountProfile(accountProfile)
.setDeleteReason(DeleteReason.DELETE_REASON_LOSS_OF_CONSENT)
.build()
)
এন্টিটি তৈরি করুন
প্রতিটি আইটেমের ধরন দেখানোর জন্য SDK-তে বিভিন্ন এন্টিটি সংজ্ঞায়িত করা আছে। সাজেশন ক্লাস্টারের জন্য নিম্নলিখিত এনটিটি কাজ করে:
বিবরণ দিন
প্রতিটি এন্টিটির জন্য একটি সংক্ষিপ্ত বিবরণ প্রদান করুন; ব্যবহারকারীরা এন্টিটির উপর মাউস নিয়ে গেলে এই বিবরণটি দেখানো হবে, যা তাদের অতিরিক্ত বিবরণ প্রদান করবে।
কল টু অ্যাকশন টেক্সট
প্রতিটি এন্টিটির জন্য একটি ঐচ্ছিক কল টু অ্যাকশন টেক্সট প্রদান করুন। ব্যবহারকারীকে এনগেজ হতে উৎসাহিত করার জন্য এই টেক্সট দেখানো হবে।
ট্যাগ
প্রতিটি এন্টিটির জন্য ট্যাগ তালিকা প্রদান করুন। ট্যাগ ব্যবহার করে শ্রেণীবিভাগ ও ফিল্টার করা যায়।
প্ল্যাটফর্ম নির্দিষ্ট প্লেব্যাক URI
কাজ করে এমন প্রতিটি প্ল্যাটফর্মের জন্য প্লেব্যাক URI তৈরি করুন: Android TV, Android বা iOS। এটি সিস্টেমকে সংশ্লিষ্ট প্ল্যাটফর্মে ভিডিও প্লেব্যাকের জন্য উপযুক্ত URI বেছে নিতে অনুমতি দেয়।
খুব কম ক্ষেত্রে, সব প্ল্যাটফর্মের জন্য প্লেব্যাক 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 = RatingSystem
.Builder()
.setAgencyName("MPAA")
.setRating("PG-13")
.build()
পোস্টার ছবি
পোস্টার ছবির জন্য URI ও পিক্সেল ডাইমেনশন (উচ্চতা ও প্রস্থ) প্রয়োজন। একাধিক পোস্টার ইমেজ প্রদান করে বিভিন্ন ফর্ম ফ্যাক্টরকে টার্গেট করুন, তবে যাচাই করুন যে সব ছবি ১৬:৯ অ্যাস্পেক্ট রেশিও এবং ন্যূনতম ২০০ পিক্সেল উচ্চতা বজায় রাখছে যাতে "সাজেশন" এন্টিটি সঠিকভাবে দেখানো যায়, বিশেষ করে Google-এর Entertainment Space-এর মধ্যে। ২০০ পিক্সেলের কম উচ্চতার ছবি দেখানো নাও হতে পারে।
val image1 = Image.Builder()
.setImageUri(Uri.parse("http://www.example.com/entity_image1.png"))
.setImageHeightInPixel(300)
.setImageWidthInPixel(169)
.build()
val image2 = 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
.Builder()
.addSimilarWatchedTitleName("Movie or TV Show Title")
.addSimilarWatchedTitleName("Movie or TV Show Title")
.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 userLikedTitle = RecommendationReasonUserLikedTitle
.Builder()
.setLikedTitleName("Movie or TV Show Title")
.build()
val generic = RecommendationReasonGeneric.Builder().build()
ডিসপ্লে টাইম উইন্ডো
কোনও এন্টিটি যদি সীমিত সময়ের জন্য উপলভ্য থাকে, তাহলে কাস্টম মেয়াদ শেষ হওয়ার সময় সেট করুন। মেয়াদ শেষ হওয়ার নির্দিষ্ট সময় না থাকলে, এন্টিটির মেয়াদ অটোমেটিক শেষ হয়ে যাবে এবং ৬০ দিন পরে মুছে যাবে। তাই, শুধুমাত্র তখনই মেয়াদ শেষ হওয়ার সময় সেট করুন যখন এন্টিটির মেয়াদ তাড়াতাড়ি শেষ করতে হবে। এই ধরনের একাধিক উপলভ্যতার উইন্ডো নির্দিষ্ট করুন।
val window1 = DisplayTimeWindow
.Builder()
.setStartTimestampMillis(now() + 1.days.toMillis())
.setEndTimestampMillis(now() + 30.days.toMillis())
.build()
val window2 = DisplayTimeWindow
.Builder()
.setEndTimestampMillis(now() + 30.days.toMillis())
.build()
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.")
.addPlatformSpecificPlaybackUris(platformSpecificPlaybackUris)
.addPosterImages(images)
// Suppose the duration is 2 hours, it is 72000000 in milliseconds
.setDurationMillis(72000000)
.setCallToActionText("Watch Now")
.addTag("Action")
.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.")
.addPlatformSpecificPlaybackUris(platformSpecificPlaybackUris)
.addPosterImages(images)
.setCallToActionText("Watch Now")
.addTag("Drama")
.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)
.setCallToActionText("Watch Now")
.addTag("Action")
.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
.addPlatformSpecificPlaybackUris(channelPlaybackUris)
.setLogoImage(logoImage)
.setCallToActionText("Watch Now")
.addTag("News")
.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
.addPlatformSpecificPlaybackUris(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
.build()
)
.addPosterImage(programImage)
.setCallToActionText("Watch Now")
.addTag("Sports")
.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()