Android TV-তে 'দেখা চালিয়ে যান' ফিচার ইন্টিগ্রেট করা

Engage SDK ব্যবহার করে আপনার Android TV অ্যাপে কীভাবে 'দেখা চালিয়ে যান' ফিচার ইন্টিগ্রেট করবেন তা এই গাইডে কভার করা হয়েছে।

প্রি-ওয়ার্ক

শুরু করার নির্দেশিকায় কাজের আগে সংক্রান্ত নির্দেশাবলী সম্পূর্ণ করুন।

ইন্টিগ্রেশন

এন্টিটি তৈরি করুন

প্রতিটি আইটেমের ধরন দেখানোর জন্য SDK-তে বিভিন্ন এন্টিটি সংজ্ঞায়িত করা আছে। কন্টিনিউয়েশন ক্লাস্টার নিম্নলিখিত এন্টিটি সাপোর্ট করে:

  1. MovieEntity
  2. TvEpisodeEntity
  3. LiveStreamingVideoEntity
  4. VideoClipEntity

এইসব এন্টিটির জন্য প্ল্যাটফর্ম-নির্দিষ্ট 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 ও পিক্সেল ডাইমেনশন (উচ্চতা ও প্রস্থ) প্রয়োজন। একাধিক পোস্টার ইমেজ প্রদান করে বিভিন্ন ফর্ম ফ্যাক্টরকে টার্গেট করুন, তবে যাচাই করুন যে সব ইমেজ ১৬:৯ অ্যাস্পেক্ট রেশিও এবং ন্যূনতম ২০০ পিক্সেল উচ্চতা বজায় রাখছে যাতে "দেখা চালিয়ে যান" এন্টিটি সঠিকভাবে দেখানো যায়, বিশেষ করে Google-এর Entertainment Space-এর মধ্যে। ২০০ পিক্সেলের কম উচ্চতার ছবি দেখানো নাও হতে পারে।

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

এই উদাহরণে দেখানো হয়েছে যে কীভাবে প্রয়োজনীয় সব ফিল্ড সহ MovieEntity তৈরি করতে হয়:

val movieEntity = MovieEntity.Builder()
   .setWatchNextType(WatchNextType.TYPE_CONTINUE)
   .setName("Movie name")
   .addPlatformSpecificPlaybackUris(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
   .setDurationMillis(72000000)
   // Suppose last playback offset is 1 hour, 36000000 in milliseconds
   .setLastPlayBackPositionTimeMillis(36000000)
   .setCallToActionText("Resume")
   .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)
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

এই উদাহরণে দেখানো হয়েছে কীভাবে প্রয়োজনীয় সব ফিল্ড সহ TvEpisodeEntity তৈরি করতে হয়:

val tvEpisodeEntity = TvEpisodeEntity.Builder()
    .setWatchNextType(WatchNextType.TYPE_CONTINUE)
    .setName("Episode name")
    .addPlatformSpecificPlaybackUris(platformSpecificPlaybackUris)
    .addPosterImages(images)
    // Timestamp in millis for sample last engagement time 12/1/2023 00:00:00
    .setLastEngagementTimeMillis(1701388800000)
    .setDurationMillis(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") 'দেখতে থাকুন' কার্ডে দেখানোর আগে সঠিক ফর্মে বড় করে দেখানো হবে। মনে রাখবেন যে এগুলি সংখ্যাসূচক স্ট্রিং হতে হবে, "e2" বা "episode 2" বা "s1" বা "season 1" লিখবেন না।

কোনও নির্দিষ্ট টিভি শোয়ের একটিই সিজন থাকলে, সিজন নম্বর ১ হিসেবে সেট করুন।

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 tvEpisodeEntity = TvEpisodeEntity.Builder()
    ...
    .addGenres(genres)
    .addContentRatings(contentRatings)
    .setSeasonTitle("Season Title")
    .setShowTitle("Show Title")
    .build()

VideoClipEntity

প্রয়োজনীয় সব ফিল্ড সহ VideoClipEntity তৈরি করার একটি উদাহরণ এখানে দেওয়া হল।

VideoClipEntity YouTube ভিডিওর মতো ব্যবহারকারীর তৈরি করা ক্লিপকে দেখায়।

val videoClipEntity = VideoClipEntity.Builder()
    .setPlayBackUri(Uri.parse("https://www.example.com/uri_for_current_platform"))
    .setWatchNextType(WatchNextType.TYPE_CONTINUE)
    .setName("Video clip name")
    .addPlatformSpecificPlaybackUris(platformSpecificPlaybackUris)
    .addPosterImages(images)
    // Timestamp in millis for sample last engagement time 12/1/2023 00:00:00
    .setLastEngagementTimeMillis(1701388800000)
    .setDurationMillis(600000) //10 minutes in milliseconds
    .setLastPlayBackPositionTimeMillis(300000) //5 minutes in milliseconds
    .setCallToActionText("Resume")
    .addTag("Vlog")
    .build()

আপনি চাইলে ক্রিয়েটর, ক্রিয়েটর ইমেজ, মিলিসেকেন্ডে তৈরি করার সময়, বা উপলভ্যতার সময়সীমা সেট করতে পারেন।

LiveStreamingVideoEntity

এখানে প্রয়োজনীয় সব ফিল্ড সহ LiveStreamingVideoEntity তৈরি করার উদাহরণ দেওয়া হল।

val liveStreamingVideoEntity = LiveStreamingVideoEntity.Builder()
    .setPlayBackUri(Uri.parse("https://www.example.com/uri_for_current_platform"))
    .setWatchNextType(WatchNextType.TYPE_CONTINUE)
    .setName("Live streaming name")
    .addPlatformSpecificPlaybackUris(platformSpecificPlaybackUris)
    .addPosterImages(images)
    // Timestamp in millis for sample last engagement time 12/1/2023 00:00:00
    .setLastEngagementTimeMillis(1701388800000)
    .setLastPlayBackPositionTimeMillis(36000000) //1 hour in milliseconds
    .addContentRating(contentRating)
    .setCallToActionText("Resume")
    .addTag("Live")
    .build()

বিকল্প হিসেবে, আপনি লাইভ স্ট্রিমিং এন্টিটির জন্য শুরুর সময়, ব্রডকাস্টার, ব্রডকাস্টার আইকন বা উপলভ্যতার সময়সীমা সেট করতে পারেন।

অ্যাট্রিবিউট ও প্রয়োজনীয়তা সম্পর্কে বিস্তারিত তথ্য পেতে, API রেফারেন্স দেখুন।

কন্টিনিউয়েশন ক্লাস্টার ডেটা প্রদান করুন

AppEngagePublishClient কন্টিনিউয়েশন ক্লাস্টার প্রকাশ করার জন্য দায়বদ্ধ। আপনি publishContinuationCluster পদ্ধতি ব্যবহার করে ContinuationCluster অবজেক্ট প্রকাশ করেন।

শুরু করার নির্দেশিকা-তে যেমন বলা আছে সেই অনুযায়ী ক্লায়েন্ট শুরু করা এবং পরিষেবার উপলভ্যতা চেক করার বিষয়টি নিশ্চিত করুন।

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; এটি আগে থেকে থাকা কন্টেন্টকে পরিবর্তন করে। কন্টিনিউয়েশন ক্লাস্টারে নির্দিষ্ট কোনও এন্টিটি আপডেট করতে হলে, আপনাকে সব এন্টিটি আবার প্রকাশ করতে হবে।

কন্টিনিউয়েশন ক্লাস্টার ডেটা শুধুমাত্র প্রাপ্তবয়স্কদের অ্যাকাউন্টের জন্য প্রদান করা উচিত। অ্যাকাউন্ট প্রোফাইলটি কোনও প্রাপ্তবয়স্ক ব্যক্তির হলে তবেই প্রকাশ করুন।

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

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 চালু করুন। এর ফলে কন্টেন্ট বিভিন্ন ডিভাইস জুড়ে নির্বিঘ্নে সিঙ্ক করা যায়, যার ফলে ব্যবহারকারীর অভিজ্ঞতা আরও ভালো হয় এবং এনগেজমেন্ট বাড়ে। যেমন, এটি প্রয়োগ করার পরে একজন পার্টনারের "দেখা চালিয়ে যান" বোতামে ক্লিক করার হার ৪০% বেড়ে গেছে, কারণ তার কন্টেন্ট একাধিক ডিভাইসে দেখানো হয়েছে।

Engage ডেটা মুছে দিন

স্ট্যান্ডার্ড ৬০ দিনের রিটেনশন পিরিয়ডের আগে Google TV সার্ভার থেকে কোনও ব্যবহারকারীর ডেটা ম্যানুয়ালি মুছে দিতে, deleteClusters পদ্ধতি ব্যবহার করুন। অনুরোধ পাওয়ার পরে, পরিষেবাটি অ্যাকাউন্ট প্রোফাইল বা সম্পূর্ণ অ্যাকাউন্টের জন্য আগে থেকে থাকা সব Engage ডেটা মুছে দেবে।

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)
        .setDeleteReason(DeleteReason.DELETE_REASON_USER_LOG_OUT)
        .setSyncAcrossDevices(true)
        .build()
)

পরীক্ষা করা

Engage SDK ইন্টিগ্রেশন সঠিকভাবে কাজ করছে কিনা তা যাচাই করতে যাচাইকরণ অ্যাপ ব্যবহার করুন।

আপনি প্রকাশনা API চালু করার পরে, যাচাইকরণ অ্যাপ চেক করে কনফার্ম করুন যে আপনার ডেটা সঠিকভাবে প্রকাশিত হচ্ছে। আপনার কন্টিনিউয়েশন ক্লাস্টার অ্যাপের ইন্টারফেসে একটি স্বতন্ত্র সারি হিসেবে দেখানো উচিত।

  • আপনার অ্যাপে এইসব অ্যাকশন পরীক্ষা করুন:
    • সাইন-ইন করুন।
    • প্রোফাইল পরিবর্তন করুন(প্রযোজ্য হলে)।
    • ভিডিও শুরু করে পজ করুন অথবা হোমপেজে ফিরে যান।
    • ভিডিও প্লেব্যাক চলাকালীন অ্যাপ বন্ধ করুন।
    • "দেখা চালিয়ে যান" সারি থেকে কোনও আইটেম সরিয়ে দিন (যদি কাজ করে)।
  • প্রতিটি অ্যাকশনের পরে, আপনার অ্যাপ যে publishContinuationClusters API কল করেছে এবং যাচাইকরণ অ্যাপে ডেটা সঠিকভাবে দেখানো হয়েছে তা কনফার্ম করুন।
  • সঠিকভাবে প্রয়োগ করা এন্টিটির জন্য যাচাইকরণ অ্যাপ সবুজ রঙের "সব ঠিক আছে" টিক চিহ্ন দেখায়।

    যাচাইকরণ অ্যাপের সফলতার স্ক্রিনশট
    ছবি ১. যাচাইকরণ অ্যাপ সফল হয়েছে
  • যাচাইকরণ অ্যাপ যেকোনও সমস্যাজনক এন্টিটি ফ্ল্যাগ করবে।

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

    যাচাইকরণ অ্যাপ সংক্রান্ত সমস্যার বিবরণ
    ছবি ৩. যাচাইকরণ অ্যাপ সংক্রান্ত সমস্যার বিবরণ