Meningkatkan Interaksi di Tonton Berikutnya untuk Film/Episode TV di Android TV

1. Pengantar

Tonton Berikutnya

Saluran Tonton Berikutnya adalah baris yang muncul di layar utama Android TV dengan video untuk ditonton berikutnya oleh pengguna. Bergantung pada versi sistem, baris Tonton Berikutnya mungkin disebut "Mainkan Berikutnya" atau "Teruskan menonton".

b0ca4ea7c72ba8f6.png

Sistem akan membuat dan menyimpan saluran ini. Setiap item dalam saluran ini disebut program. Aplikasi Anda dapat menambahkan/memperbarui/menghapus program ke saluran Tonton Berikutnya, seperti konten yang berhenti ditonton pengguna di pertengahan jalan atau yang menunjukkan interaksi pengguna (seperti episode berikutnya dalam sebuah serial atau season berikutnya dari sebuah acara).

Konsep

Saluran Tonton Berikutnya memberikan cara bagi aplikasi Anda untuk mendorong interaksi kembali dengan pengguna.

Anda dapat menambahkan/memperbarui/menghapus konten yang sudah menunjukkan interaksi pengguna ke saluran Tonton Berikutnya. Konten dapat berupa video yang belum tuntas atau episode/serial berikutnya yang Anda sarankan, dll.

Aplikasi juga dapat menghapus episode setelah ditonton dan menambahkan episode berikutnya dari season baru serial tersebut.

Ada empat jenis kasus penggunaan untuk saluran Tonton Berikutnya:

  • Melanjutkan menonton video yang belum selesai ditonton pengguna.
  • Menyarankan video berikutnya untuk ditonton. Misalnya, jika pengguna selesai menonton episode 1, Anda dapat menyarankan episode 2.
  • Memunculkan episode baru dari serial yang sedang ditonton pengguna.
  • Mempertahankan daftar tontonan video menarik yang ditambahkan oleh pengguna.

Codelab ini menampilkan cara untuk menyertakan video di saluran Tonton Berikutnya saat pengguna menjedanya. Codelab ini juga membahas cara menghapus video dari Tonton Berikutnya saat diputar hingga akhir dan cara menambahkan episode berikutnya jika tersedia.

Codelab ini tidak membahas kasus penggunaan Tonton Berikutnya untuk daftar tontonan dan episode yang baru dirilis.

Tonton Berikutnya untuk Film dan Episode TV

Saluran Tonton Berikutnya adalah fitur yang sangat penting di layar utama Android TV. Fitur ini membantu pengguna mengikuti film dan acara TV yang belum tuntas ditonton. Hal ini terutama penting bagi pengguna yang menonton episode TV karena Serial TV biasanya memiliki banyak episode dan pengguna akan meneruskan menonton dari bagian yang mereka tinggalkan.

Bayangkan saat pengguna kembali dan duduk di depan TV untuk memutuskan episode yang akan ditonton. Dengan Tonton Berikutnya, aplikasi Anda memungkinkan pengguna melanjutkan episode TV dari bagian yang terakhir mereka tonton langsung dari layar utama. Hal ini akan meningkatkan interaksi kembali pengguna, yang menguntungkan aplikasi dan pengguna.

Codelab ini akan memandu Anda memahami aplikasi referensi TV, menunjukkan cara menangani berbagai kasus untuk saluran Tonton Berikutnya, dan menjelaskan pedoman kualitas Google tentang fitur Tonton Berikutnya. Codelab ini berfokus pada penanganan episode TV secara khusus, tetapi Anda dapat menerapkan aturan serupa untuk film.

Ketersediaan

Kode dalam codelab ini berfungsi pada perangkat Android TV, termasuk yang menjalankan pengalaman Google TV.

Yang akan Anda build

Dalam codelab ini, Anda akan menambahkan, menghapus, dan memperbarui saluran Tonton Berikutnya untuk film/episode TV. Aplikasi Anda akan:

  • Menerapkan kasus penggunaan yang berbeda untuk menangani film
  • Menerapkan kasus penggunaan yang berbeda untuk menangani episode TV

Yang akan Anda pelajari

  • Pedoman kualitas Google untuk Tonton Berikutnya

Yang akan Anda butuhkan

  • Pengetahuan dasar tentang pengembangan aplikasi Android
  • Android Studio 4.1+, Anda dapat mendownloadnya di sini

2. Mempersiapkan

Meng-clone project awal

Anda dapat mendownload kode sumber dari repositori GitHub:

git clone https://github.com/android/codelab-watchnext-for-movie-tv-episodes.git

Atau Anda dapat mendownloadnya langsung dari link di bawah.

Buka Android Studio dan klik File > Open dari panel menu atau Open an Existing Android Studio Project dari layar selamat datang, lalu pilih folder yang baru saja di-clone.

8271a7b581390845.png

Memahami project awal

34641bc2c9f71f0f.png

Ada empat langkah dalam project. Di setiap langkah, Anda akan menambahkan kode berdasarkan petunjuk di bagian terkait. Setelah menyelesaikan satu bagian, Anda dapat membandingkan kode Anda dengan kode dalam step_x_completed.

Demi kemudahan, kami telah menambahkan kode dasar tertentu untuk daftar video dan exoplayer untuk menonton konten di dalam aplikasi. Tindakan ini akan membuat kerangka dasar aplikasi TV, yang berada di luar cakupan codelab ini.

Tujuan kita di sini adalah untuk mempelajari cara menambahkan/menghapus/memperbarui video yang belum dan sudah selesai ditonton ke saluran Tonton Berikutnya dan menghasilkan interaksi kembali untuk aplikasi kita.

Berikut adalah komponen utama dalam aplikasi:

  • FileVideoRepository adalah class untuk memuat dan membuat kueri metadata video.
  • PlaybackFragment adalah fragmen pemutaran video.
  • WatchNextPlaybackStateListener adalah pemroses perubahan status pemutaran; kode ini memproses peristiwa pemutaran dan memicu operasi terkait.
  • WatchNextWorker adalah pekerja yang bertanggung jawab untuk memperbarui saluran Tonton Berikutnya.
  • WatchNextHelper adalah class bantuan yang menyederhanakan penanganan saluran Tonton Berikutnya.

Codelab ini menggunakan data media dalam res/raw/api.json untuk mengisi entri Tonton Berikutnya.

Menjalankan project awal

Jalankan step_1. Jika Anda mengalami masalah, lihat dokumentasi tentang cara memulai.

  1. Hubungkan Android TV atau mulai emulator.
  1. Pilih konfigurasi step_1, pilih perangkat Android Anda, lalu tekan tombol run di panel menu. 249ea91a556fbd61.png
  2. Anda akan melihat outline aplikasi TV sederhana dengan empat koleksi video yang mirip dengan screenshot di bawah ini.
  3. Buka layar utama aplikasi dan pahami aplikasi referensi TV-nya. Ada empat kategori video:
  4. Klip Supercharged
  5. Klip Lain-Lain
  6. Beverly Hillbillies: beberapa episode TV dari dua season TV yang berbeda;
  7. Film Charlie Chaplin.
  8. Klik dan tonton salah satu episode TV dalam kategori Beverly Hillbillies. Codelab ini akan memberi tahu Anda cara menambahkan episode TV ini ke program Tonton Berikutnya

d7b51de54f4a1199.png

Yang telah Anda pelajari

Dalam pengantar ini, Anda telah mempelajari tentang:

  • Struktur kode dan class utama yang digunakan dalam codelab ini.
  • Cara menyiapkan dan menjalankan aplikasi contoh.

Apa selanjutnya?

Pedoman kualitas Tonton Berikutnya

3. Memahami pedoman kualitas Tonton Berikutnya

Untuk memberikan pengalaman layar utama yang lebih baik, semua aplikasi yang menambahkan konten ke Tonton Berikutnya harus berperilaku konsisten.

Secara khusus, ada skenario yang perlu dibahas oleh developer untuk episode TV. Google telah merangkum daftar pedoman kualitas untuk Tonton Berikutnya yang harus diikuti guna memastikan kualitas saluran Tonton Berikutnya.

Cara membuat fitur Tonton Berikutnya yang memenuhi standar kualitas Google

Saat Google mengevaluasi fitur Tonton Berikutnya, poin berikut akan diverifikasi

  1. Program ini ditambahkan ke Tonton Berikutnya saat dijeda/dihentikan
  2. Aplikasi dapat melanjutkan pemutaran dari entri Tonton Berikutnya
  3. Aplikasi memperbarui posisi pemutaran di Tonton Berikutnya secara tepat waktu
  4. Program ini dihapus dari Tonton Berikutnya setelah pemutaran selesai
  5. Episode berikutnya ditambahkan saat episode saat ini selesai
  6. Aplikasi tidak menambahkan konten yang belum menunjukkan interaksi dengan pengguna ke Tonton Berikutnya
  7. Mengirim semua konten yang belum tuntas ke Tonton Berikutnya
  8. Aplikasi menetapkan metadata yang benar dan lengkap, mis. nomor season/episode
  9. Aplikasi tidak menambahkan beberapa episode untuk Serial TV yang sama

Berikut adalah penjelasan setiap persyaratan kualitas

  1. Program ini ditambahkan ke Tonton Berikutnya saat dijeda/dihentikan.
  • Aplikasi harus menambahkan film dan acara TV tradisional ke baris Tonton Berikutnya saat pemutaran tidak selesai
  1. Aplikasi dapat melanjutkan pemutaran dari entri Tonton Berikutnya.
  • Konten yang ditambahkan ke saluran Tonton Berikutnya akan melanjutkan pemutaran dari posisi pemutaran terakhir; video akan memulai pemutaran segera setelah konten dimuat
  1. Aplikasi memperbarui posisi pemutaran di Tonton Berikutnya secara tepat waktu.
  • Aplikasi harus terus melacak progres pemutaran dan memperbarui program Tonton Berikutnya ke posisi pemutaran terbaru setelah pengguna keluar dari video
  1. Program ini dihapus dari Tonton Berikutnya setelah pemutaran selesai.
  • Aplikasi seharusnya tidak bermasalah dan melakukan pembersihan sendiri. Baris Tonton Berikutnya adalah baris bersama untuk semua aplikasi dan kami ingin memastikan konten di baris tersebut akurat untuk mempertahankan kepercayaan pengguna
  1. Episode berikutnya ditambahkan saat episode saat ini selesai.
  • Bila pengguna menonton Serial TV, aplikasi akan mempermudah pengguna untuk terus menontonnya dengan menambahkan episode berikutnya dari serial tersebut ke baris Tonton Berikutnya
  1. Aplikasi tidak menambahkan konten yang belum menunjukkan interaksi dengan pengguna ke Tonton Berikutnya.
  • Menurut pedoman Tonton Berikutnya, aplikasi hanya boleh menambahkan film atau episode TV ke saluran Tonton Berikutnya jika pengguna 'mulai' menontonnya
  • Sebaiknya jangan tambahkan cuplikan atau klip video pendek ke saluran Tonton Berikutnya. Hal ini karena ada sedikit sekali peluang interaksi kembali di cuplikan atau klip video pendek tersebut
  1. Kirim semua konten yang belum tuntas ke Tonton Berikutnya.
  • Penyedia tidak boleh membatasi jumlah kartu yang mereka kirim ke Tonton Berikutnya. Jika pengguna memiliki konten yang belum tuntas, penyedia harus mengirimnya ke baris Tonton Berikutnya
  1. Aplikasi menetapkan metadata yang benar dan lengkap.
  • Pastikan metadata yang terkait dengan episode sudah benar
  • Nomor episode, nomor season, dan judul harus akurat
  • Status progres harus proporsional dengan jumlah yang ditonton
  • Gambar episode atau serial harus ada di kartu
  1. Aplikasi harus menghindari penambahan beberapa episode untuk Serial TV yang sama.
  • Aplikasi harus menyimpan maksimum satu entri Tonton Berikutnya untuk setiap Serial TV; jika pengguna menonton separuh dari dua episode yang berbeda, Tonton Berikutnya hanya akan menampilkan episode yang baru-baru ini ditonton

Persyaratan kualitas ini akan membantu aplikasi Anda memberikan pengalaman pengguna yang luar biasa di Tonton Berikutnya.

Oke, mari kita mulai membuat fitur Tonton Berikutnya dengan mempertimbangkan pedoman kualitas ini.

Yang telah Anda pelajari

Dalam bagian ini, Anda telah mempelajari tentang:

  • Persyaratan kualitas Tonton Berikutnya

Apa selanjutnya?

Menambahkan episode yang belum tuntas ke saluran Tonton Berikutnya

4. Menambahkan konten yang belum tuntas ke Tonton Berikutnya

Kita akan memulai dari fungsi dasar: Menambahkan episode yang belum tuntas ke Tonton Berikutnya.

Codelab ini akan memandu Anda dalam membuat WatchNextProgram, mengisi metadata yang benar untuk episode tersebut, seperti nomor episode, nomor season, dan jenis video, dll. Entri Tonton Berikutnya dapat diperbarui untuk memastikannya sesuai dengan posisi pemutaran terbaru pengguna, sehingga pengguna dapat melanjutkan pemutaran dengan mengklik program.

Hal-hal berikut akan dibahas di bagian ini:

  • Program ini ditambahkan ke Tonton Berikutnya saat dijeda/dihentikan.
  • Aplikasi dapat melanjutkan pemutaran dari entri Tonton Berikutnya.
  • Aplikasi memperbarui posisi pemutaran di Tonton Berikutnya secara tepat waktu.
  • Aplikasi menetapkan metadata yang benar dan lengkap.

Menambahkan video yang belum tuntas - perbedaan antara film dan episode

Prosedur untuk menambahkan film dan episode ke saluran Tonton Berikutnya sangat mirip. Satu-satunya perbedaan adalah metadata yang berbeda untuk setiap film dan episode.

Misalnya, untuk episode, kami memiliki metode metadata khusus di WatchNextProgram.Builder, seperti setEpisodeNumber, setSeasonNumber(),, setSeasonTitle(), dan setEpisodeTitle()

Menambahkan video (film/episode) yang belum tuntas ke Saluran Tonton Berikutnya

Untuk menambahkan video yang belum tuntas ke saluran Tonton Berikutnya, developer dapat menggunakan WatchNextProgram.Builder untuk membuat instance WatchNextProgram dan memanggil PreviewChannelHelper.publishWatchNextProgram untuk memublikasikannya ke saluran Tonton Berikutnya.

Pertama, buat instance Builder WatchNextProgram dan setel semua metadata untuk mendeskripsikan video.

Dengan menelusuri metode setBuilderMetadata dalam PlayNextHelper.kt di step_1, salin dan tempel kode berikut di antara komentar "Step 1.1 - Set video metadata for WatchNextProgram.".

WatchNextHelper.kt

builder.setType(type)
   .setWatchNextType(watchNextType)
   .setLastPlaybackPositionMillis(watchPosition)
   .setLastEngagementTimeUtcMillis(System.currentTimeMillis())
   .setTitle(video.name)
   .setDurationMillis(duration.toMillis().toInt())
   .setPreviewVideoUri(Uri.parse(video.videoUri))
   .setDescription(video.description)
   .setPosterArtUri(Uri.parse(video.thumbnailUri))
   // Intent uri used to deep link video when the user clicks on watch next item.
   .setIntentUri(Uri.parse(video.uri))
   .setInternalProviderId(video.id)
   // Use the contentId to recognize the same content across different channels.
   .setContentId(video.id)

if (type == TYPE_TV_EPISODE) {
   builder.setEpisodeNumber(video.episodeNumber.toInt())
       .setSeasonNumber(video.seasonNumber.toInt())
       // User TV series name and season number to generate a fake season name.
       .setSeasonTitle(context.getString(
           R.string.season, video.category, video.seasonNumber))
       // Use the name of the video as the episode name.
       .setEpisodeTitle(video.name)
       // Use TV series name as the tile, in this sample,
       // we use category as a fake TV series.
       .setTitle(video.category)
}

Baca seluruh kode di langkah 1.1 dan cobalah memahami alasan kami menyetel metadata ini.

  1. setLastPlaybackPositionMillis() dan setDurationMillis() membantu menunjukkan progres pemutaran yang benar dan memperbaruinya saat pengguna berinteraksi dengan video.
  2. setLastEngagementTimeUtcMillis() menyetel stempel waktu saat pengguna menonton video ini, yang membantu saluran Tonton Berikutnya untuk memprioritaskan entri.

Menambahkan film yang belum tuntas ke Tonton Berikutnya

Kita dapat menggunakan WATCH_NEXT_TYPE_NEXT untuk menambahkan film yang belum tuntas ke Saluran Tonton Berikutnya.

Menyetel metadata film: judul dan deskripsi

Untuk film, setel judul dan deskripsi serta atribut lainnya, sehingga pengguna tahu bahwa mereka menonton konten yang benar tanpa harus mengklik video.

builder.setType(type)
   .setWatchNextType(watchNextType)
   .setLastPlaybackPositionMillis(watchPosition)
   .setLastEngagementTimeUtcMillis(System.currentTimeMillis())
   .setTitle(video.name)
   .setDurationMillis(duration.toMillis().toInt())
   .setPreviewVideoUri(Uri.parse(video.videoUri))
   .setDescription(video.description)
   .setPosterArtUri(Uri.parse(video.thumbnailUri))
...

Screenshot contoh untuk film.

99a21ecd22268f2d.png

Menambahkan episode yang belum tuntas ke Tonton Berikutnya

Ada empat jenis yang dapat Anda gunakan untuk setWatchNextType(). Gunakan WATCH_NEXT_TYPE_CONTINUE untuk episode TV yang belum tuntas dan WATCH_NEXT_TYPE_NEXT untuk episode berikutnya.

Menyetel metadata episode: nomor/judul episode dan season

Untuk episode TV, setel nomor episode dan nomor season, sehingga pengguna tahu bahwa mereka menonton episode yang benar tanpa harus mengklik video.

if (type == TYPE_TV_EPISODE) {
   Builder.setType(PreviewPrograms.TYPE_EPISODE)
       .setEpisodeNumber(video.episodeNumber.toInt())
       .setSeasonNumber(video.seasonNumber.toInt())
       // Use TV series name and season number to generate a fake season name.
       .setSeasonTitle(context.getString(
           R.string.season, video.category, video.seasonNumber))
       // Use the name of the video as the episode name.
       .setEpisodeTitle(video.name)
       // Use TV series name as the tile, in this sample,
       // we use category as a fake TV series.
       .setTitle(video.category)
}

SeasonTitle, EpisodeTitle, dan Title harus disetel dengan benar. Setiap episode memiliki judulnya sendiri untuk mendeskripsikan konten dalam episode tersebut. Kita dapat menggunakannya untuk EpisodeTitle. Gunakan judul Serial TV untuk atribut judul acara TV, sehingga pengguna mengetahui acara TV yang memiliki episode tersebut. Jika Anda memiliki judul season, gunakan untuk SeasonTitle. Sebagai gantinya, Anda dapat menggunakan kombinasi nama serial dan nomor season, mis. <Nama Serial TV> season <nomor season>.

Screenshot contoh sebuah episode.

658c430b13bcb3a6.png

Melanjutkan Pemutaran

setLastPlaybackPositionMillis(watchPosition) digunakan untuk meneruskan waktu saat pengguna keluar dari film/episode; progres ini akan ditampilkan di kartu Tonton Berikutnya. Di aplikasi referensi TV, kode menggunakan WatchProgressDatabase untuk melacak progres pemutaran setiap video. Hal ini memungkinkan pengguna untuk melanjutkan menonton dari titik sebelumnya, bagaimanapun cara mereka menavigasi ke video.

Menurut pedoman pemutaran Tindakan Menonton, episode akan segera mulai diputar setelah konten video dimuat. Informasi Serial TV tidak perlu ditampilkan lagi karena pengguna sudah mulai menontonnya.

Selanjutnya, panggil PreviewChannelHelper.publishWatchNextProgram untuk memublikasikannya ke saluran Tonton Berikutnya. Telusuri "Step 1.2" di file yang sama, lalu tempelkan kode berikut:

WatchNextHelper.kt

try {
   programId = PreviewChannelHelper(context)
       .publishWatchNextProgram(updatedProgram)
   Timber.v("Added New program to Watch Next row: ${updatedProgram.title}")
} catch (exc: IllegalArgumentException) {
   Timber.e(
       exc, "Unable to add program to Watch Next row. ${exc.localizedMessage}"
   )
   exc.printStackTrace()
}

Me-refresh Progres Pemutaran

Jika kartu Tonton Berikutnya sudah ada di saluran Tonton Berikutnya, aplikasi harus terus memperbaruinya jika pengguna menonton lebih banyak video, sehingga kartu tersebut akan mencerminkan progres tontonan terbaru.

Saat memperbarui WatchNextProgram, gunakan class builder yang sama untuk membuat WatchNextProgram dan panggil updateWatchNextProgram PreviewChannelHelper untuk memperbarui entri yang ada. Tempelkan kode berikut ke dalam "Step 1.3" di WatchNextHelper.kt.

WatchNextHelper.kt

programId = existingProgram.id
PreviewChannelHelper(context).updateWatchNextProgram(updatedProgram, programId)

Memeriksa hasil Anda

Periksa kodenya, bandingkan perubahan Anda dengan sumber pada step_1_completed, jalankan step_1_completed, lalu tonton bagian episode. Verifikasikan apakah episode tersebut telah ditambahkan ke saluran Tonton Berikutnya.

Validasi

  • ✅ BERHASIL: Program ini ditambahkan ke Tonton Berikutnya saat dijeda/dihentikan
  • ✅ BERHASIL: Aplikasi dapat melanjutkan pemutaran dari entri Tonton Berikutnya
  • ✅ BERHASIL: Aplikasi memperbarui posisi pemutaran di Tonton Berikutnya secara tepat waktu
  • ✅ BERHASIL: Aplikasi menetapkan metadata yang benar dan lengkap
  • ✅ BERHASIL: Mengirim semua konten yang belum tuntas ke Tonton Berikutnya
  • ❗ GAGAL: Program dihapus dari Tonton Berikutnya setelah pemutaran selesai
  • ❗ GAGAL: Episode berikutnya ditambahkan saat episode saat ini selesai
  • ❗ GAGAL: Aplikasi tidak menambahkan konten yang belum menunjukkan interaksi dengan pengguna ke Tonton Berikutnya
  • ❗ GAGAL: Aplikasi tidak menambahkan beberapa episode untuk Serial TV yang sama

Yang telah Anda pelajari

Di bagian ini, Anda telah mempelajari cara:

  • Membuat WatchNextProgram
  • Memasukkan atau memperbarui WatchNextProgram di saluran Tonton Berikutnya
  • Memperbarui progres pemutaran
  • Melanjutkan pemutaran
  • Menyetel metadata yang benar untuk episode TV

Apa selanjutnya?

Menambahkan episode yang belum tuntas ke saluran Tonton Berikutnya

5. Menghapus konten (Film/Episode) dari Tonton Berikutnya saat pemutaran selesai

Kartu di saluran Tonton Berikutnya diurutkan berdasarkan waktu interaksi terakhir. Video dengan interaksi terbaru ditempatkan di bagian depan saluran. Aplikasi harus menghapus program dari saluran Tonton Berikutnya setelah pengguna selesai menontonnya dan mempromosikan konten yang lebih relevan kepada pengguna.

Developer perlu memantau progres pemutaran video. Setelah pengguna selesai menonton video, aplikasi harus menghapusnya dari saluran Tonton Berikutnya.

Catatan: Logika yang sama dapat digunakan untuk menghapus film atau episode dari saluran Tonton Berikutnya.

Menghapus WatchNextProgram

Untuk menghapus entri dari saluran Tonton Berikutnya, developer harus menemukan WatchNextProgram yang benar dan menggunakan URI program untuk menghapusnya dari penyedia konten. Untuk melakukannya, developer harus mencocokkan WatchNextProgram dengan entity video di database mereka sendiri. Kita dapat memanfaatkan kolom internalProviderId, menyetel ID video unik, dan menautkannya dengan salah satu entity di database developer sendiri.

Pertama, temukan WatchNextProgram yang benar dengan mencari ID video. Anda dapat mengakses internalProviderId dari WatchNextProgram. getInternalProviderId atau melalui penyedia konten WatchNextProgram, lalu menghapusnya dari saluran Tonton Berikutnya dengan URI.

Telusuri "Step 2.1", lalu salin dan tempel yang berikut:

WatchNextHelper.kt

val foundProgram = getWatchNextProgramByVideoId(video.id, context)
if (foundProgram == null) {
   Timber.e(
       "Unable to delete. No program found with videoID ${video.id}"
   )
   return null
}

// Use the found program's URI to delete it from the content resolver
return foundProgram.let {
   val programUri = TvContractCompat.buildWatchNextProgramUri(it.id)
   // delete returns the number of rows deleted.
   val deleteCount = context.contentResolver.delete(
       programUri, null, null
   )

   if (deleteCount == 1) {
       Timber.v("Content successfully removed from Watch Next")
       programUri
   } else {
       Timber.e("Content failed to be removed from Watch Next, delete count $deleteCount")
       null
   }
}

Jika Anda ingin menghapus beberapa WatchNextProgram sekaligus, sebaiknya minta operasi batch untuk mengoptimalkan kunjungan ke penyedia konten TV. Telusuri "Step 2.2", lalu salin dan tempel cuplikan kode berikut ke dalam WatchNextHelper.kt.

WatchNextHelper.kt

val foundPrograms = getWatchNextProgramByVideoIds(videos.map { it.id }, context)
val operations = foundPrograms.map {
   val programUri = TvContractCompat.buildWatchNextProgramUri(it.id)
   ContentProviderOperation.newDelete(programUri).build()
} as ArrayList<ContentProviderOperation>

val results = context.contentResolver.applyBatch(TvContractCompat.AUTHORITY, operations)

results.forEach { result ->
   if (result.count != 1) {
       Timber.e("Content failed to be removed from Watch Next: ${result.uri}")
   }
}

Menurut pedoman Tonton Berikutnya, sebuah episode harus dihapus jika pengguna tuntas menontonnya. Pengguna dianggap telah "menuntaskan" episode jika kredit akhir tayangan sudah dimulai. Jika demikian, jangan menambahkannya ke saluran Tonton Berikutnya (atau hapus jika sudah ditambahkan). Anda dapat mengetahui status ini menggunakan teknologi yang otomatis mendeteksi kredit akhir tayangan, atau menggunakan perkiraan berdasarkan durasi konten (misalnya, sisa waktu dalam satu episode kurang dari 3 menit).

Dengan melihat metode handleWatchNextForEpisodes() di WatchNextHelper.kt, Anda dapat menemukan cuplikan berikut:

WatchNextHelper.kt

video.isAfterEndCreditsPosition(watchPosition.toLong()) -> {
   removeVideoFromWatchNext(context, video)

   ...
}

Dalam codelab ini, kita menggunakan VIDEO_COMPLETED_DURATION_MAX_PERCENTAGE untuk menyimulasikan posisi adegan kredit. Anda dapat mengganti kode dalam isAfterEndCreditsPosition() dengan logika Anda sendiri.

Memeriksa hasil Anda

Periksa kodenya, bandingkan perubahan Anda dengan sumber pada step_2_completed, jalankan step_2_completed, lalu tonton episode. Verifikasikan apakah episode tersebut telah dihapus dari saluran Tonton Berikutnya setelah Anda selesai menontonnya.

Validasi

  • ✅ BERHASIL: Program ini ditambahkan ke Tonton Berikutnya saat dijeda/dihentikan
  • ✅ BERHASIL: Aplikasi dapat melanjutkan pemutaran dari entri Tonton Berikutnya
  • ✅ BERHASIL: Aplikasi memperbarui posisi pemutaran di Tonton Berikutnya secara tepat waktu
  • ✅ BERHASIL: Aplikasi menetapkan metadata yang benar dan lengkap
  • ✅ BERHASIL: Mengirim semua konten yang belum tuntas ke Tonton Berikutnya
  • ✅ BERHASIL: Program dihapus dari Tonton Berikutnya saat pemutaran selesai
  • ❗ GAGAL: Episode berikutnya ditambahkan saat episode saat ini selesai
  • ❗ GAGAL: Aplikasi tidak menambahkan konten yang belum menunjukkan interaksi dengan pengguna ke Tonton Berikutnya
  • ❗ GAGAL: Aplikasi tidak menambahkan beberapa episode untuk Serial TV yang sama

Yang telah Anda pelajari

Dalam pengantar ini, Anda telah mempelajari tentang:

  • Mengidentifikasi adegan kredit episode TV
  • Menemukan WatchNextProgram berdasarkan ID video
  • Menghapus WatchNextProgram tunggal
  • Menghapus beberapa WatchNextProgram

Apa selanjutnya?

Menambahkan episode berikutnya ke saluran Tonton Berikutnya

6. Menambahkan Episode Berikutnya

Tidak seperti film, acara TV memiliki lebih dari 1 season dan banyak episode di setiap season. Jika pengguna selesai menonton satu episode, sebaiknya ganti dengan episode berikutnya, bukan hanya menghapusnya dari saluran Tonton Berikutnya. Episode berikutnya dapat berupa episode lanjutan tepat setelah episode yang ditonton di season yang sama, atau episode pertama di season berikutnya jika episode yang sudah tuntas adalah episode terakhir di season saat ini.

Saat menambahkan episode berikutnya ke saluran Tonton Berikutnya, setel jenis Tonton Berikutnya ke WATCH_NEXT_TYPE_NEXT. Ini menunjukkan bahwa episode ini bukan program yang ditonton sebelumnya, tetapi episode yang benar-benar baru yang dapat diikuti pengguna. Aplikasi harus memungkinkan pengguna menonton episode berikutnya dari awal. Telusuri "TODO: Step 3.1 - Add next episode from TV series.", lalu salin dan tempel kode berikut ke langkah 3.1:

WatchNextHelper.kt

videoRepository.getNextEpisodeInSeries(video)?.let {
       insertOrUpdateVideoToWatchNext(
           it,
           0,
           WATCH_NEXT_TYPE_NEXT,
           context
       )
       newWatchNextVideo = it
   }

Episode berikutnya diambil oleh metode getNextEpisodeInSeries().

Episode berikutnya di season yang sama

Jika season saat ini masih memiliki beberapa episode lainnya, aplikasi harus mengambil episode berikutnya yang tersedia dan menyetelnya sebagai episode berikutnya.

Episode pertama di season berikutnya

Jika pengguna telah selesai menonton season saat ini, tetapi ada season baru yang tersedia, aplikasi harus mengambil episode pertama dari season berikutnya sebagai episode berikutnya.

Episode baru dirilis

Jika tidak ada lagi episode lainnya, aplikasi tidak perlu menambahkan episode berikutnya. Namun, saat episode baru tersedia, sebaiknya kirimkan ke sisi klien, lalu tambahkan ke saluran Tonton Berikutnya. Episode baru harus menggunakan WATCH_NEXT_TYPE_NEW sebagai jenis WatchNextProgram. Solusi ini memerlukan notifikasi push server, tetapi codelab ini tidak membahasnya.

Memeriksa hasil Anda

Periksa kodenya, bandingkan perubahan Anda dengan sumber pada step_3_completed, jalankan step_3_completed, lalu tonton episode. Verifikasikan apakah episode berikutnya telah ditambahkan ke saluran Tonton Berikutnya setelah Anda selesai menontonnya.

Validasi

  • ✅ BERHASIL: Program ini ditambahkan ke Tonton Berikutnya saat dijeda/dihentikan
  • ✅ BERHASIL: Aplikasi dapat melanjutkan pemutaran dari entri Tonton Berikutnya
  • ✅ BERHASIL: Aplikasi memperbarui posisi pemutaran di Tonton Berikutnya secara tepat waktu
  • ✅ BERHASIL: Aplikasi menetapkan metadata yang benar dan lengkap
  • ✅ BERHASIL: Mengirim semua konten yang belum tuntas ke Tonton Berikutnya
  • ✅ BERHASIL: Program dihapus dari Tonton Berikutnya saat pemutaran selesai
  • ✅ BERHASIL: Episode berikutnya ditambahkan saat episode saat ini selesai
  • ❗ GAGAL: Aplikasi tidak menambahkan konten yang belum menunjukkan interaksi dengan pengguna ke Tonton Berikutnya
  • ❗ GAGAL: Aplikasi tidak menambahkan beberapa episode untuk Serial TV yang sama

Yang telah Anda pelajari

Dalam bagian ini, Anda telah mempelajari tentang:

  • Cara memilih episode berikutnya
  • Menambahkan episode berikutnya untuk Serial TV

Apa selanjutnya?

Memahami minat pengguna.

7. Memahami minat pengguna

Agar pengguna tetap fokus pada konten paling relevan di saluran Tonton Berikutnya, saat menambahkan episode TV ke saluran Tonton Berikutnya atau menghapusnya dari saluran tersebut, ada pertimbangan tambahan yang perlu diperhitungkan oleh aplikasi.

Beberapa episode dari serial yang sama

Ada beberapa alasan pengguna dapat memiliki lebih dari 1 episode yang belum tuntas pada waktu tertentu. Misalnya:

  1. Serial TV tersedia dalam beberapa aplikasi atau disiarkan;
  2. Pengguna ingin mempercepat dan melewati konten tertentu;

Saluran Tonton Berikutnya memiliki entri yang sangat terbatas di layar utama. Google menyarankan agar aplikasi menyimpan maksimum satu episode dari setiap Serial TV di saluran Tonton Berikutnya. Dan itu harus merupakan episode yang terakhir ditonton pengguna.

Di class WatchNextHelper, kita menanganinya di handlePlayNextForEpisode(). Telusuri "Step 4.1", lalu salin dan tempel kode berikut ke dalam area kosong pada langkah 4.1.

WatchNextHelper.kt

newWatchNextVideo?.let { videoToKeep ->
   videoRepository.getAllVideosFromSeries(videoToKeep.seriesUri)?.let { allEpisodes ->
           filterWatchNextVideos(allEpisodes, context)
               ?.let { watchedEpisodes ->
                   removeVideosFromWatchNext(
                       context, watchedEpisodes.filter { it.id != videoToKeep.id })
               }
       }
}

Pada langkah 4.1, kita terus melacak episode yang terakhir ditonton pengguna, dengan menghapus semua episode lainnya dari Serial TV yang sama. Karena langkah tersebut menghapus beberapa episode sekaligus, kita telah membuat metode baru removeVideosFromWatchNext() untuk memanfaatkan operasi batch penyedia konten Android.

Konten dengan lebih sedikit interaksi

Menurut pedoman Tonton Berikutnya, sebuah episode hanya boleh ditambahkan ke saluran Tonton Berikutnya jika pengguna telah mulai menontonnya, dan pengguna dianggap telah "memulai" sebuah episode jika sudah menonton selama lebih dari 2 menit. Telusuri "Step 4.2", lalu salin dan tempel kode berikut ke dalam area langkah 4.2.

WatchNextHelper.kt

val durationInMilliSeconds = duration.toMillis().toInt()
// Return true if either X minutes or Y % have passed
// Following formatting spans over multiple lines to accommodate max 100 limit
val watchNextMinStartedMillis = TimeUnit.MINUTES.toMillis(WATCH_NEXT_STARTED_MIN_MINUTES)
// Check if either X minutes or Y% has passed
val hasVideoStarted =
   (currentPosition >= (durationInMilliSeconds * WATCH_NEXT_STARTED_MIN_PERCENTAGE)) or
           (currentPosition >= watchNextMinStartedMillis)
val hasVideoStartedWithValidPosition =
   ((currentPosition <= durationInMilliSeconds) and hasVideoStarted)
Timber.v(
   "Has video started: %s, duration: %s, watchPosition: %s",
   hasVideoStartedWithValidPosition,
   duration,
   currentPosition
)
return hasVideoStartedWithValidPosition

Memeriksa hasil Anda

Periksa kodenya, bandingkan perubahan Anda dengan sumber pada step_4_completed, jalankan step_4_completed, lalu tonton episode. Verifikasikan apakah:

  1. Kode menghapus episode tambahan dari Serial TV
  2. Episode ditambahkan ke saluran Tonton Berikutnya hanya jika pengguna mulai menontonnya

Validasi

  • ✅ BERHASIL: Program ini ditambahkan ke Tonton Berikutnya saat dijeda/dihentikan
  • ✅ BERHASIL: Aplikasi dapat melanjutkan pemutaran dari entri Tonton Berikutnya
  • ✅ BERHASIL: Aplikasi memperbarui posisi pemutaran di Tonton Berikutnya secara tepat waktu
  • ✅ BERHASIL: Aplikasi menetapkan metadata yang benar dan lengkap
  • ✅ BERHASIL: Mengirim semua konten yang belum tuntas ke Tonton Berikutnya
  • ✅ BERHASIL: Program dihapus dari Tonton Berikutnya saat pemutaran selesai
  • ✅ BERHASIL: Episode berikutnya ditambahkan saat episode saat ini selesai
  • ✅ BERHASIL: Aplikasi tidak menambahkan konten yang belum menunjukkan interaksi dengan pengguna ke Tonton Berikutnya
  • ✅ BERHASIL: Aplikasi tidak menambahkan beberapa episode untuk Serial TV yang sama

Yang telah Anda pelajari

Dalam bagian ini, Anda telah mempelajari tentang:

  • Menghindari penambahan beberapa episode untuk Serial TV yang sama
  • Menghindari penambahan konten yang memiliki lebih sedikit interaksi

Apa selanjutnya?

Selamat

8. Selamat

Selamat, Anda berhasil membuat Tonton Berikutnya untuk episode TV dan mempelajari semua persyaratan kualitas untuk Tonton Berikutnya.

Bagus.

Bacaan lebih lanjut

Dokumen referensi