বই_পথ: /distribute/other-docs/_book.yaml প্রকল্প_পথ: /distribute/other-docs/_project.yaml
এই নির্দেশিকাটিতে Engage SDK ব্যবহার করে আপনার Android TV অ্যাপে Continue Watching কীভাবে একীভূত করবেন তা আলোচনা করা হয়েছে।
প্রাক-কাজ
"শুরু করা" নির্দেশিকায় প্রাক-কাজের নির্দেশাবলী পূরণ করুন।
ইন্টিগ্রেশন
সত্তা তৈরি করুন
SDK প্রতিটি আইটেমের ধরণ উপস্থাপনের জন্য বিভিন্ন সত্তা সংজ্ঞায়িত করেছে। কন্টিনিউয়েশন ক্লাস্টার নিম্নলিখিত সত্তাগুলিকে সমর্থন করে:
এই সত্তাগুলির জন্য প্ল্যাটফর্ম-নির্দিষ্ট URI এবং পোস্টার চিত্রগুলি নির্দিষ্ট করুন।
এছাড়াও, প্রতিটি প্ল্যাটফর্মের জন্য প্লেব্যাক URI তৈরি করুন—যেমন Android TV, Android, অথবা iOS—যদি আপনি ইতিমধ্যেই না করে থাকেন। তাই যখন একজন ব্যবহারকারী প্রতিটি প্ল্যাটফর্মে দেখা চালিয়ে যান, তখন অ্যাপটি ভিডিও কন্টেন্ট চালানোর জন্য একটি লক্ষ্যযুক্ত প্লেব্যাক 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" সত্তার সঠিক প্রদর্শনের জন্য সমস্ত ছবির 16:9 আকৃতির অনুপাত এবং ন্যূনতম 200 পিক্সেল উচ্চতা বজায় রাখা হয়েছে কিনা তা যাচাই করুন, বিশেষ করে Google এর Entertainment Space এর মধ্যে। 200 পিক্সেলের কম উচ্চতার ছবি দেখানো যাবে না।
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)
.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)
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")
.build()
পর্ব নম্বর স্ট্রিং (যেমন "2" ), এবং সিজন নম্বর স্ট্রিং (যেমন "1" ) কে কন্টিনিউ ওয়াচিং কার্ডে প্রদর্শিত হওয়ার আগে সঠিক আকারে প্রসারিত করা হবে। মনে রাখবেন যে এগুলি একটি সংখ্যাসূচক স্ট্রিং হওয়া উচিত, "e2", অথবা "পর্ব 2", অথবা "s1" অথবা "সিজন 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)
.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)
.build()
ঐচ্ছিকভাবে, আপনি লাইভ স্ট্রিমিং সত্তার জন্য শুরুর সময়, সম্প্রচারক, সম্প্রচারক আইকন, অথবা উপলব্ধতার সময় উইন্ডো সেট করতে পারেন।
বৈশিষ্ট্য এবং প্রয়োজনীয়তা সম্পর্কে বিস্তারিত তথ্যের জন্য, API রেফারেন্স দেখুন।
কন্টিনিউয়েশন ক্লাস্টার ডেটা প্রদান করুন
Continuation ক্লাস্টার প্রকাশের জন্য 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এ সংরক্ষণ করা হয়।
কোনও ত্রুটির ক্ষেত্রে, সম্পূর্ণ অনুরোধটি প্রত্যাখ্যান করা হয় এবং বিদ্যমান অবস্থা বজায় রাখা হয়।
প্রকাশনা API গুলি হল আপসার্ট API; এটি বিদ্যমান কন্টেন্ট প্রতিস্থাপন করে। যদি আপনার কন্টিনিউয়েশন ক্লাস্টারে একটি নির্দিষ্ট সত্তা আপডেট করার প্রয়োজন হয়, তাহলে আপনাকে আবার সমস্ত সত্তা প্রকাশ করতে হবে।
কন্টিনিউয়েশন ক্লাস্টার ডেটা শুধুমাত্র প্রাপ্তবয়স্ক অ্যাকাউন্টের জন্য প্রদান করা উচিত। অ্যাকাউন্ট প্রোফাইলটি শুধুমাত্র প্রাপ্তবয়স্কদের হলেই প্রকাশ করুন।
ক্রস-ডিভাইস সিঙ্কিং
SyncAcrossDevices ফ্ল্যাগ নিয়ন্ত্রণ করে যে ব্যবহারকারীর ContinuationCluster ডেটা টিভি, ফোন, ট্যাবলেট ইত্যাদি ডিভাইসগুলিতে সিঙ্ক্রোনাইজ করা হবে কিনা। ডিফল্টরূপে ক্রস-ডিভাইস সিঙ্কিং অক্ষম থাকে।
মান:
-
true: একটি নিরবচ্ছিন্ন দেখার অভিজ্ঞতার জন্য কন্টিনিউয়েশন ক্লাস্টার ডেটা সমস্ত ব্যবহারকারীর ডিভাইসে ভাগ করা হয়। সেরা ক্রস-ডিভাইস অভিজ্ঞতার জন্য আমরা এই বিকল্পটি দৃঢ়ভাবে সুপারিশ করি। -
false: কন্টিনিউয়েশন ক্লাস্টার ডেটা বর্তমান ডিভাইসের মধ্যেই সীমাবদ্ধ।
সম্মতি নিন
মিডিয়া অ্যাপ্লিকেশনটিতে ক্রস-ডিভাইস সিঙ্কিং সক্ষম বা অক্ষম করার জন্য একটি স্পষ্ট সেটিং প্রদান করতে হবে। ব্যবহারকারীর সুবিধাগুলি ব্যাখ্যা করুন এবং ব্যবহারকারীর পছন্দ একবার সংরক্ষণ করুন এবং সেই অনুযায়ী publishContinuationCluster এ প্রয়োগ করুন।
// Example to allow cross device syncing.
client.publishContinuationCluster(
PublishContinuationClusterRequest
.Builder()
.setContinuationCluster(
ContinuationCluster.Builder()
.setAccountProfile(accountProfile)
.setSyncAcrossDevices(true)
.build()
)
.build()
)
আমাদের ক্রস-ডিভাইস বৈশিষ্ট্যটি থেকে সর্বাধিক সুবিধা পেতে, অ্যাপটি ব্যবহারকারীর সম্মতি পেয়েছে কিনা তা যাচাই করুন এবং SyncAcrossDevices কে true এ সক্ষম করুন। এটি ডিভাইসগুলির মধ্যে কন্টেন্টকে নির্বিঘ্নে সিঙ্ক করার অনুমতি দেয়, যার ফলে ব্যবহারকারীর অভিজ্ঞতা আরও ভাল হয় এবং ব্যস্ততা বৃদ্ধি পায়। উদাহরণস্বরূপ, একজন অংশীদার যিনি এটি বাস্তবায়ন করেছেন তিনি "দেখা চালিয়ে যান" ক্লিকের সংখ্যা 40% বৃদ্ধি পেয়েছেন কারণ তাদের কন্টেন্ট একাধিক ডিভাইসে প্রকাশিত হয়েছিল।
ভিডিও আবিষ্কারের ডেটা মুছুন
৬০ দিনের স্ট্যান্ডার্ড রিটেনশন পিরিয়ডের আগে গুগল টিভি সার্ভার থেকে ব্যবহারকারীর ডেটা ম্যানুয়ালি মুছে ফেলতে, deleteClusters পদ্ধতি ব্যবহার করুন। অনুরোধ পাওয়ার পর, পরিষেবাটি অ্যাকাউন্ট প্রোফাইলের জন্য অথবা সম্পূর্ণ অ্যাকাউন্টের জন্য বিদ্যমান সমস্ত ভিডিও আবিষ্কারের ডেটা মুছে ফেলবে।
DeleteReason enum ডেটা মুছে ফেলার কারণ নির্ধারণ করে। নিম্নলিখিত কোডটি লগআউটের সময় ডেটা দেখা চালিয়ে যাওয়া সরিয়ে দেয়।
// 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 ইন্টিগ্রেশন সঠিকভাবে কাজ করছে কিনা তা যাচাই করতে যাচাইকরণ অ্যাপটি ব্যবহার করুন।
প্রকাশনা API চালু করার পর, যাচাইকরণ অ্যাপটি পরীক্ষা করে নিশ্চিত করুন যে আপনার ডেটা সঠিকভাবে প্রকাশিত হচ্ছে। আপনার ধারাবাহিকতা ক্লাস্টারটি অ্যাপের ইন্টারফেসের মধ্যে একটি স্বতন্ত্র সারি হিসাবে প্রদর্শিত হওয়া উচিত।
- আপনার অ্যাপে এই ক্রিয়াগুলি পরীক্ষা করুন:
- সাইন ইন করুন।
- প্রোফাইলের মধ্যে স্যুইচ করুন (যদি প্রযোজ্য হয়)।
- একটি ভিডিও শুরু করুন, তারপর বিরতি দিন, অথবা হোম পেজে ফিরে যান।
- ভিডিও প্লেব্যাকের সময় অ্যাপটি বন্ধ করুন।
- "দেখা চালিয়ে যান" সারি থেকে একটি আইটেম সরান (যদি সমর্থিত হয়)।
- প্রতিটি অ্যাকশনের পরে, নিশ্চিত করুন যে আপনার অ্যাপটি
publishContinuationClustersAPI ব্যবহার করেছে এবং যাচাইকরণ অ্যাপে ডেটা সঠিকভাবে প্রদর্শিত হচ্ছে। যাচাইকরণ অ্যাপটি সঠিকভাবে বাস্তবায়িত সত্তার জন্য একটি সবুজ "সব ঠিক আছে" চেক চিহ্ন দেখায়।

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

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

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