এই নির্দেশিকায় আলোচনা করা হয়েছে কীভাবে Engage SDK ব্যবহার করে আপনার Android TV অ্যাপে Continue Watching ফিচারটি যুক্ত করা যায়।
প্রাক-কাজ
'Getting Started' গাইডে দেওয়া প্রাক-কাজের নির্দেশাবলী সম্পূর্ণ করুন।
একীকরণ
সত্তা তৈরি করুন
এসডিকে প্রতিটি আইটেমের ধরনকে উপস্থাপন করার জন্য বিভিন্ন এনটিটি সংজ্ঞায়িত করেছে। কন্টিনিউয়েশন ক্লাস্টার নিম্নলিখিত এনটিটিগুলোকে সমর্থন করে:
এই সত্তাগুলোর জন্য প্ল্যাটফর্ম-নির্দিষ্ট URI এবং পোস্টার চিত্র উল্লেখ করুন।
এছাড়াও, যদি আগে থেকে তৈরি না করে থাকেন, তাহলে প্রতিটি প্ল্যাটফর্মের—যেমন অ্যান্ড্রয়েড টিভি, অ্যান্ড্রয়েড বা আইওএস—জন্য প্লেব্যাক ইউআরআই তৈরি করুন। ফলে যখন কোনো ব্যবহারকারী প্রতিটি প্ল্যাটফর্মে দেখা চালিয়ে যাবেন, তখন অ্যাপটি ভিডিও কন্টেন্টটি চালানোর জন্য একটি নির্দিষ্ট প্লেব্যাক ইউআরআই ব্যবহার করবে।
// Required. Set this when you want continue watching 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()
// Required. Set this when you want continue watching entities to show up on
// Google TV Android app, Entertainment Space, Playstore Widget
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 continue watching 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)
পোস্টার ইমেজের জন্য একটি URI এবং পিক্সেল ডাইমেনশন (উচ্চতা ও প্রস্থ) প্রয়োজন। বিভিন্ন ফর্ম ফ্যাক্টরের জন্য একাধিক পোস্টার ইমেজ দিন, কিন্তু যাচাই করে নিন যে "Continue Watching" এনটিটিটির সঠিক প্রদর্শনের জন্য, বিশেষ করে গুগলের এন্টারটেইনমেন্ট স্পেস-এর মধ্যে, সব ইমেজের অ্যাস্পেক্ট রেশিও ১৬:৯ এবং ন্যূনতম উচ্চতা ২০০ পিক্সেল রয়েছে। ২০০ পিক্সেলের কম উচ্চতার ইমেজ দেখানো নাও হতে পারে।
val images = Arrays.asList(
Image.Builder()
.setImageUri(Uri.parse("http://www.example.com/entity_image1.png"))
.setImageHeightInPixel(300)
.setImageWidthInPixel(169)
.build(),
Image.Builder()
.setImageUri(Uri.parse("http://www.example.com/entity_image2.png"))
.setImageHeightInPixel(640)
.setImageWidthInPixel(360)
.build()
// Consider adding other images for different form factors
)
মুভিএন্টিটি
এই উদাহরণটি দেখায় কিভাবে সমস্ত প্রয়োজনীয় ফিল্ড সহ একটি MovieEntity তৈরি করতে হয়:
val movieEntity = MovieEntity.Builder()
.setWatchNextType(WatchNextType.TYPE_CONTINUE)
.setName("Movie name")
.addPlatformSpecificPlaybackUri(platformSpecificPlaybackUris)
.addPosterImages(images)
// Timestamp in millis for sample last engagement time 12/1/2023 00:00:00
.setLastEngagementTimeMillis(1701388800000)
// Suppose the duration is 2 hours, it is 72000000 in milliseconds
.setDurationMills(72000000)
// Suppose last playback offset is 1 hour, 36000000 in milliseconds
.setLastPlayBackPositionTimeMillis(36000000)
.setCallToActionText("Resume")
.addTag("Action")
.build()
ধরণ এবং কন্টেন্ট রেটিং-এর মতো বিবরণ প্রদান করলে গুগল টিভি আপনার কন্টেন্টকে আরও গতিশীল উপায়ে প্রদর্শন করতে এবং সঠিক দর্শকদের কাছে পৌঁছে দিতে সক্ষম হয়।
val genres = Arrays.asList("Action", "Science fiction")
val rating1 = RatingSystem.Builder().setAgencyName("MPAA").setRating("PG-13").build()
val contentRatings = Arrays.asList(rating1)
val movieEntity = MovieEntity.Builder()
...
.addGenres(genres)
.addContentRatings(contentRatings)
.build()
আপনি যদি কোনো সংক্ষিপ্ত মেয়াদকাল নির্দিষ্ট না করেন, তবে এনটিটিগুলো স্বয়ংক্রিয়ভাবে ৬০ দিনের জন্য উপলব্ধ থাকে। শুধুমাত্র তখনই একটি কাস্টম মেয়াদকাল নির্ধারণ করুন, যখন এই নির্ধারিত সময়ের আগেই এনটিটিটি অপসারণ করার প্রয়োজন হয়।
// Set the expiration time to be now plus 30 days in milliseconds
val expirationTime = DisplayTimeWindow.Builder()
.setEndTimestampMillis(now().toMillis()+2592000000).build()
val movieEntity = MovieEntity.Builder()
...
.addAvailabilityTimeWindow(expirationTime)
.build()
টিভিএপিসোডএন্টিটি
এই উদাহরণটি দেখায় কিভাবে সমস্ত প্রয়োজনীয় ফিল্ড সহ একটি TvEpisodeEntity তৈরি করতে হয়:
val tvEpisodeEntity = TvEpisodeEntity.Builder()
.setWatchNextType(WatchNextType.TYPE_CONTINUE)
.setName("Episode name")
.addPlatformSpecificPlaybackUri(platformSpecificPlaybackUris)
.addPosterImages(images)
// Timestamp in millis for sample last engagement time 12/1/2023 00:00:00
.setLastEngagementTimeMillis(1701388800000)
.setDurationMills(72000000) // 2 hours in milliseconds
// 45 minutes and 15 seconds in milliseconds is 2715000
.setLastPlayBackPositionTimeMillis(2715000)
.setEpisodeNumber("2")
.setSeasonNumber("1")
.setShowTitle("Title of the show")
.setCallToActionText("Resume")
.addTag("Comedy")
.build()
এপিসোড নম্বর স্ট্রিং (যেমন "2" ) এবং সিজন নম্বর স্ট্রিং (যেমন "1" ) 'continue watching' কার্ডে প্রদর্শিত হওয়ার আগে সঠিক রূপে বিস্তারিত করা হবে। মনে রাখবেন, এগুলো অবশ্যই একটি সংখ্যাসূচক স্ট্রিং হতে হবে; "e2", "episode 2", "s1" বা "season 1" লিখবেন না।
যদি কোনো নির্দিষ্ট টিভি শো-এর একটিমাত্র সিজন থাকে, তাহলে সিজন নম্বর হিসেবে ১ সেট করুন।
গুগল টিভিতে দর্শকরা যাতে আপনার কন্টেন্ট খুঁজে পাওয়ার সম্ভাবনা বাড়াতে পারে, সেজন্য জেনার, কন্টেন্ট রেটিং এবং উপলব্ধতার সময়সীমার মতো অতিরিক্ত ডেটা প্রদান করার কথা বিবেচনা করুন, কারণ এই বিবরণগুলো ডিসপ্লে এবং ফিল্টারিং অপশনগুলোকে আরও উন্নত করতে পারে।
val genres = Arrays.asList("Action", "Science fiction")
val rating1 = RatingSystem.Builder().setAgencyName("MPAA").setRating("PG-13").build()
val contentRatings = Arrays.asList(rating1)
val tvEpisodeEntity = TvEpisodeEntity.Builder()
...
.addGenres(genres)
.addContentRatings(contentRatings)
.setSeasonTitle("Season Title")
.setShowTitle("Show Title")
.build()
ভিডিওক্লিপএন্টিটি
প্রয়োজনীয় সকল ফিল্ড সহ একটি VideoClipEntity তৈরি করার উদাহরণ এখানে দেওয়া হলো।
VideoClipEntity ব্যবহারকারীর তৈরি করা একটি ক্লিপকে, যেমন একটি ইউটিউব ভিডিও, উপস্থাপন করে।
val videoClipEntity = VideoClipEntity.Builder()
.setPlaybackUri(Uri.parse("https://www.example.com/uri_for_current_platform"))
.setWatchNextType(WatchNextType.TYPE_CONTINUE)
.setName("Video clip name")
.addPlatformSpecificPlaybackUri(platformSpecificPlaybackUris)
.addPosterImages(images)
// Timestamp in millis for sample last engagement time 12/1/2023 00:00:00
.setLastEngagementTimeMillis(1701388800000)
.setDurationMills(600000) //10 minutes in milliseconds
.setLastPlayBackPositionTimeMillis(300000) //5 minutes in milliseconds
.addContentRating(contentRating)
.setCallToActionText("Resume")
.addTag("Vlog")
.build()
আপনি ঐচ্ছিকভাবে নির্মাতা, নির্মাতার ছবি, মিলিসেকেন্ডে তৈরির সময়, অথবা উপলব্ধতার সময়সীমা নির্ধারণ করতে পারেন।
লাইভস্ট্রিমিংভিডিওসত্তা
প্রয়োজনীয় সকল ফিল্ড সহ একটি LiveStreamingVideoEntity তৈরি করার উদাহরণ এখানে দেওয়া হলো।
val liveStreamingVideoEntity = LiveStreamingVideoEntity.Builder()
.setPlaybackUri(Uri.parse("https://www.example.com/uri_for_current_platform"))
.setWatchNextType(WatchNextType.TYPE_CONTINUE)
.setName("Live streaming name")
.addPlatformSpecificPlaybackUri(platformSpecificPlaybackUris)
.addPosterImages(images)
// Timestamp in millis for sample last engagement time 12/1/2023 00:00:00
.setLastEngagementTimeMillis(1701388800000)
.setDurationMills(72000000) //2 hours in milliseconds
.setLastPlayBackPositionTimeMillis(36000000) //1 hour in milliseconds
.addContentRating(contentRating)
.setCallToActionText("Resume")
.addTag("Live")
.build()
ঐচ্ছিকভাবে, আপনি লাইভ স্ট্রিমিং সত্তার জন্য শুরুর সময়, সম্প্রচারক, সম্প্রচারকের আইকন বা উপলব্ধতার সময়সীমা নির্ধারণ করতে পারেন।
বৈশিষ্ট্য এবং প্রয়োজনীয়তা সম্পর্কে বিস্তারিত তথ্যের জন্য এপিআই রেফারেন্স দেখুন।
ধারাবাহিকতা ক্লাস্টার ডেটা সরবরাহ করুন
AppEngagePublishClient কন্টিনিউয়েশন ক্লাস্টার পাবলিশ করার দায়িত্বে থাকে। একটি ContinuationCluster অবজেক্ট পাবলিশ করার জন্য আপনি publishContinuationCluste মেথডটি ব্যবহার করেন।
গেটিং স্টার্টেড গাইডে বর্ণিত পদ্ধতি অনুযায়ী ক্লায়েন্ট ইনিশিয়ালাইজ করুন এবং সার্ভিসের প্রাপ্যতা যাচাই করে নিন।
client.publishContinuationCluster(
PublishContinuationClusterRequest
.Builder()
.setContinuationCluster(
ContinuationCluster.Builder()
.setAccountProfile(accountProfile)
.addEntity(movieEntity1)
.addEntity(movieEntity2)
.addEntity(tvEpisodeEntity1)
.addEntity(tvEpisodeEntity2)
.setSyncAcrossDevices(true)
.build()
)
.build()
)
যখন পরিষেবাটি অনুরোধটি গ্রহণ করে, তখন একটি লেনদেনের মধ্যে নিম্নলিখিত পদক্ষেপগুলি সম্পন্ন হয়:
- ডেভেলপার পার্টনারের বিদ্যমান
ContinuationClusterডেটা মুছে ফেলা হয়েছে। - অনুরোধ থেকে প্রাপ্ত ডেটা পার্স করে আপডেট করা
ContinuationClusterএ সংরক্ষণ করা হয়।
কোনো ত্রুটির ক্ষেত্রে, সম্পূর্ণ অনুরোধটি প্রত্যাখ্যান করা হয় এবং বিদ্যমান অবস্থা বজায় রাখা হয়।
পাবলিশ এপিআইগুলো হলো আপসার্ট এপিআই; এটি বিদ্যমান কন্টেন্ট প্রতিস্থাপন করে। কন্টিনিউয়েশন ক্লাস্টারে কোনো নির্দিষ্ট এনটিটি আপডেট করার প্রয়োজন হলে, আপনাকে সমস্ত এনটিটি পুনরায় পাবলিশ করতে হবে।
ধারাবাহিক ক্লাস্টার ডেটা শুধুমাত্র প্রাপ্তবয়স্ক অ্যাকাউন্টগুলোর জন্যই প্রদান করা উচিত। অ্যাকাউন্ট প্রোফাইলটি কোনো প্রাপ্তবয়স্কের হলেই কেবল তা প্রকাশ করুন।
ডিভাইস জুড়ে সিঙ্কিং
setSyncAcrossDevices নিয়ন্ত্রণ করে যে একজন ব্যবহারকারীর ContinuationCluster ডেটা টিভি, ফোন, ট্যাবলেট ইত্যাদির মতো বিভিন্ন ডিভাইসের মধ্যে সিঙ্ক্রোনাইজ হবে কিনা। ডিফল্টরূপে ক্রস-ডিভাইস সিঙ্কিং নিষ্ক্রিয় থাকে।
মানসমূহ:
-
true: নির্বিঘ্ন দেখার অভিজ্ঞতার জন্য কন্টিনিউয়েশন ক্লাস্টার ডেটা ব্যবহারকারীর সমস্ত ডিভাইসে শেয়ার করা হয়। সেরা ক্রস-ডিভাইস অভিজ্ঞতার জন্য আমরা এই বিকল্পটি জোরালোভাবে সুপারিশ করি। -
false: কন্টিনিউয়েশন ক্লাস্টার ডেটা বর্তমান ডিভাইসের জন্য সীমাবদ্ধ।
এছাড়াও, ডিভাইসগুলোর মধ্যে কন্টেন্ট সিঙ্ক্রোনাইজ করার জন্য আপনাকে অবশ্যই একটি অ্যাকাউন্ট আইডি সহ একটি AccountProfile প্রদান করতে হবে। অ্যাকাউন্ট প্রোফাইল তৈরি করুন দেখুন।
সম্মতি গ্রহণ করুন
মিডিয়া অ্যাপ্লিকেশনটিতে ক্রস-ডিভাইস সিঙ্কিং চালু বা বন্ধ করার জন্য একটি সুস্পষ্ট সেটিং অবশ্যই থাকতে হবে। ব্যবহারকারীকে এর সুবিধাগুলো ব্যাখ্যা করুন এবং ব্যবহারকারীর পছন্দ একবার সংরক্ষণ করে সেই অনুযায়ী publishContinuationCluster এ তা প্রয়োগ করুন।
// Example to allow cross device syncing.
client.publishContinuationCluster(
PublishContinuationClusterRequest
.Builder()
.setContinuationCluster(
ContinuationCluster.Builder()
.setAccountProfile(accountProfile)
.setSyncAcrossDevices(true)
.build()
)
.build()
)
আমাদের ক্রস-ডিভাইস ফিচারের সর্বোচ্চ সুবিধা পেতে, অ্যাপটি যেন ব্যবহারকারীর সম্মতি নেয় তা নিশ্চিত করুন এবং SyncAcrossDevices true তে এনাবল করুন। এটি ডিভাইস জুড়ে কন্টেন্টকে নির্বিঘ্নে সিঙ্ক হতে দেয়, যার ফলে ব্যবহারকারীর অভিজ্ঞতা আরও ভালো হয় এবং এনগেজমেন্ট বাড়ে। উদাহরণস্বরূপ, একজন পার্টনার যিনি এটি প্রয়োগ করেছিলেন, তিনি 'continue watching' ক্লিকে ৪০% বৃদ্ধি দেখেছিলেন, কারণ তার কন্টেন্ট একাধিক ডিভাইসে প্রদর্শিত হচ্ছিল।
Engage ডেটা মুছে ফেলুন
সাধারণ ৬০-দিনের ডেটা সংরক্ষণের মেয়াদের আগে গুগল টিভি সার্ভার থেকে কোনো ব্যবহারকারীর ডেটা ম্যানুয়ালি মুছে ফেলার জন্য, deleteClusters মেথডটি ব্যবহার করুন। অনুরোধটি পাওয়ার পর, পরিষেবাটি অ্যাকাউন্ট প্রোফাইলের অথবা সম্পূর্ণ অ্যাকাউন্টের সমস্ত বিদ্যমান Engage ডেটা মুছে ফেলবে।
` DeleteReason enum-টি ডেটা মুছে ফেলার কারণ নির্ধারণ করে। নিচের কোডটি লগআউটের সময় 'continue watching' ডেটা মুছে ফেলে।
// If the user logs out from your media app, you must make the following call
// to remove continue watching data from the current google TV device,
// otherwise, the continue watching data will persist on the current
// google TV device until 60 days later.
client.deleteClusters(
DeleteClustersRequest.Builder()
.setAccountProfile(AccountProfile())
.setReason(DeleteReason.DELETE_REASON_USER_LOG_OUT)
.setSyncAcrossDevices(true)
.build()
)
পরীক্ষা
Engage SDK ইন্টিগ্রেশনটি সঠিকভাবে কাজ করছে কিনা তা যাচাই করতে ভেরিফিকেশন অ্যাপটি ব্যবহার করুন।
পাবলিশ এপিআই কল করার পর, ভেরিফিকেশন অ্যাপটি চেক করে নিশ্চিত করুন যে আপনার ডেটা সঠিকভাবে পাবলিশ হচ্ছে। আপনার কন্টিনিউয়েশন ক্লাস্টারটি অ্যাপের ইন্টারফেসে একটি স্বতন্ত্র সারি হিসেবে প্রদর্শিত হবে।
- আপনার অ্যাপে এই অ্যাকশনগুলো পরীক্ষা করুন:
- সাইন ইন করুন।
- প্রোফাইলগুলির মধ্যে পরিবর্তন করুন (যদি প্রযোজ্য হয়)।
- একটি ভিডিও শুরু করুন, তারপর থামান, অথবা হোম পেজে ফিরে যান।
- ভিডিও চলার সময় অ্যাপটি বন্ধ করুন।
- 'পর্যবেক্ষণ চালিয়ে যান' সারি থেকে একটি আইটেম সরান (যদি সমর্থিত হয়)।
- প্রতিটি অ্যাকশনের পরে, নিশ্চিত করুন যে আপনার অ্যাপটি
publishContinuationClustersAPI-টি কল করেছে এবং ডেটা ভেরিফিকেশন অ্যাপে সঠিকভাবে প্রদর্শিত হচ্ছে। যাচাইকরণ অ্যাপটি সঠিকভাবে বাস্তবায়িত সত্তাগুলোর জন্য একটি সবুজ "সব ঠিক আছে" টিক চিহ্ন দেখায়।

চিত্র ১. যাচাইকরণ অ্যাপের সাফল্য যাচাইকরণ অ্যাপটি যেকোনো সমস্যাযুক্ত সত্তাকে চিহ্নিত করবে।

চিত্র ২. যাচাইকরণ অ্যাপের ত্রুটি ত্রুটিযুক্ত সত্তাগুলোর সমস্যা সমাধান করতে, আপনার টিভি রিমোট ব্যবহার করে ভেরিফিকেশন অ্যাপে সত্তাটি নির্বাচন করে ক্লিক করুন। নির্দিষ্ট সমস্যাগুলো আপনার পর্যালোচনার জন্য প্রদর্শিত হবে এবং লাল রঙে হাইলাইট করা হবে (নিচের উদাহরণ দেখুন)।

চিত্র ৩. যাচাইকরণ অ্যাপের ত্রুটির বিবরণ