2 poin oleh GN⁺ 2025-06-21 | Belum ada komentar. | Bagikan ke WhatsApp
  • YouTube sedang melakukan A/B test terhadap cara memberi pengguna pemblokir iklan jeda sebelum video dimulai yang tampak seperti buffering palsu, alih-alih menayangkan iklan
  • Jeda ini diimplementasikan sebagai backoff pada streaming SABR; InnerTube memberi respons pada permintaan /videoplayback konten pertama agar menunggu selama 80% dari durasi iklan
  • Pengguna yang tidak memblokir iklan hampir tidak merasakan jeda yang sama karena pemuatan konten berjalan saat iklan diputar, meski ada backoff yang sama
  • Jika isInlinePlaybackNoAd disetel ke true, InnerTube tidak menyajikan iklan sehingga backoff pada stream GVS juga hilang; daftar filter default uBlock Origin menyertakan bypass terkait
  • Dalam sebagian eksperimen, YouTube mengganggu hook filter dengan locker script yang mengunci objek global seperti JSON.stringify; di Chromium, ini dibypass dengan hook pada Object.assign

Titik munculnya buffering palsu

  • Dalam beberapa bulan terakhir, YouTube melakukan A/B test terhadap langkah anti-pemblokiran iklan baru
  • Salah satu langkah yang diamati adalah buffering palsu yang hanya muncul saat video dimulai
    • Tidak terjadi di tengah video
    • Durasi jedanya adalah 80% dari durasi iklan yang seharusnya ditonton
    • Meski menggunakan pemblokir iklan, waktu tetap lebih hemat daripada menonton seluruh iklan
  • Contohnya sebagai berikut
    • Jika ada iklan 15 detik, terjadi backoff 12 detik
    • Jika ada iklan 6 detik yang tidak bisa dilewati bersama iklan 15 detik, terjadi backoff 16,8 detik

Peran InnerTube, GVS, dan SABR

  • InnerTube adalah API internal yang digunakan klien web dan aplikasi mobile YouTube untuk mengambil informasi video dan data detail
  • GVS adalah Google Video Services yang menyediakan stream video untuk YouTube, Google Drive, dan Google Photos
    • Untuk melakukan streaming video dari GVS, URL /videoplayback harus diperoleh dari InnerTube atau API internal Drive/Photos
    • URL GVS ditandatangani dan biasanya memiliki masa berlaku 6 jam, sehingga tidak dapat dibuat langsung
    • ISP dapat menempatkan server Google Global Cache di infrastrukturnya sendiri, sehingga trafik YouTube dapat disajikan tanpa keluar dari jaringan ISP
    • GGC hanya menyajikan video YouTube publik atau sebagian publik; video YouTube privat serta video Drive/Photos selalu disajikan dari data center Google
  • Klien web YouTube awalnya melakukan streaming dengan menentukan rentang video yang diperlukan melalui parameter query pada URL GVS
  • Kemudian YouTube menggunakan SABR
    • SABR adalah Server ABR, yaitu protokol biner proprietary YouTube untuk adaptive bitrate sisi server
    • Dirancang untuk lebih baik menghindari buffering dibanding format terbuka seperti MPEG-DASH
    • Alih-alih server mengirim data video/audio ke klien, server dapat mengirim backoff yang meminta klien menunggu beberapa waktu lalu mencoba lagi

Backoff diterapkan terlepas dari penilaian pemblokiran iklan

  • Buffering palsu terjadi ketika InnerTube menyediakan stream GVS yang menyertakan backoff sebesar 80% durasi iklan pada permintaan /videoplayback konten pertama
    • Targetnya bukan stream iklan, melainkan stream video konten
    • Stream iklan dan konten tetap terpisah
    • Ini bukan server-side ad insertion, dan eksperimen server-side ad insertion YouTube berjalan secara terpisah
  • Dialog “Experiencing interruptions” kemungkinan terpicu oleh backoff GVS yang panjang
  • Jika termasuk target A/B test, backoff ini selalu terjadi terlepas dari apakah YouTube menilai pengguna sebagai pengguna pemblokir iklan atau tidak
    • Jika iklan tidak diblokir, klien web memuat video konten saat iklan diputar
    • Perbedaan yang dirasakan pengguna adalah buffering video konten baru dimulai setelah iklan berjalan 80%
  • Klaim online bahwa YouTube membuat penggunaan CPU pengguna pemblokir iklan melonjak dan merusak komputer tidak benar
    • YouTube tidak menggunakan CPU saat menunggu backoff berakhir
    • Bahkan jika penantian diimplementasikan sebagai spinloop, penggunaan satu core secara maksimal selama kurang dari 30 detik tidak akan merusak CPU

Cara menghindari penyajian iklan dengan isInlinePlaybackNoAd

  • Untuk menghindari backoff, alih-alih menunggu hingga iklan yang tidak bisa dilewati selesai, iklan harus dibuat tidak disajikan sejak awal
  • Jika properti playbackContext.contentPlaybackContext.isInlinePlaybackNoAd pada permintaan player disetel ke true, InnerTube tidak menyajikan iklan
    • Jika iklan tidak disajikan, backoff juga tidak disertakan dalam stream GVS
  • Aturan filter dapat dibuat untuk menambahkan "isInlinePlaybackNoAd":true saat klien web melakukan stringify JSON untuk permintaan server
www.youtube.com##+js(trusted-replace-outbound-text, JSON.stringify, 'contentPlaybackContext":{', 'contentPlaybackContext":{"isInlinePlaybackNoAd":true,', condition, 'contentPlaybackContext')
  • Properti isInlinePlaybackNoAd dirujuk di JavaScript frontend
  • Dengan menggunakan req2proto, definisi protobuf yang digunakan pada panggilan /youtubei/v1/player dapat diekstrak untuk menemukan properti tersebut
    • Klien web YouTube berkomunikasi dengan InnerTube menggunakan JSON, tetapi API JSON ini dihasilkan dari definisi Protocol Buffers

Keterbatasan yang hanya stabil pada warm navigation

  • Cara ini hanya bekerja pada warm navigation, yaitu saat aplikasi single-page YouTube sudah dimuat lalu pengguna berpindah dengan mengeklik di dalamnya
  • Pada cold load, yaitu masuk langsung ke halaman watch, backend YouTube menyisipkan respons player langsung ke halaman sebagai ytInitialPlayerResponse
    • Karena permintaan player dibuat di backend, isInlinePlaybackNoAd tidak dapat disetel
  • Salah satu cara untuk membypass cold load adalah menghapus data awal agar permintaan player yang dapat dikendalikan dipaksa dibuat
www.youtube.com##+js(set, ytInitialData, undefined) ! bad idea, see below
www.youtube.com##+js(set, ytInitialPlayerResponse, undefined) ! bad idea!
  • Pendekatan ini memiliki efek samping besar sehingga sulit digunakan
    • Merusak livestream sepenuhnya
    • Fitur lain yang belum diuji juga bisa rusak
    • Pemutar video berkedip sesaat
    • Waktu loading halaman menjadi lebih lambat

Locker script dan bypass di Chromium

  • Filter sudah cukup berfungsi, tetapi terkadang uBlock Origin tidak dapat melakukan hook pada JSON.stringify
  • Dalam sebagian A/B test, YouTube menambahkan locker script di bagian paling awal tag <head> pada HTML frontend
    • Script ini membuat fetch, JSON, JSON.stringify, JSON.parse, Array, Array.prototype.push, Array.prototype.forEach, dan lainnya menjadi non-writable dengan Object.defineProperty
    • Ini mencegah kode setelahnya mengubah perilaku dengan Proxy
  • uBlock Origin hanya dapat mem-proxy JSON.stringify jika berjalan lebih dulu daripada locker script
  • Di Firefox, HTML filter dapat menghapus tag script tersebut dari HTML sumber sebelum halaman diparse
  • Chromium tidak mendukung API ekstensi yang diperlukan, sehingga tidak dapat ditangani dengan cara yang sama
  • Bypass saat ini menggunakan hook pada Object.assign, bukan JSON.stringify
    • Object.assign juga merupakan fungsi yang memproses body permintaan sebelum fetch
    • Ini bukan cara untuk menonaktifkan locker script itu sendiri, melainkan lebih berupa bypass
    • Karena uBO scriptlet tidak mengizinkan penggantian teks pada key objek, daftar filter menyuntikkan JavaScript
(() => {
    const e = {
        apply: (e, n, arguments) => {
            let t = Reflect.apply(e, n, arguments);
            return 3 === arguments.length && t?.body && "string" == typeof t.body && !t.body.includes(`"isInlinePlaybackNoAd":true`) && (t.body = t.body.replace(`"contentPlaybackContext":{`, `"contentPlaybackContext":{"isInlinePlaybackNoAd":true,`)), t
        }
    };
    window.Object.assign = new Proxy(window.Object.assign, e)
})();
  • Pekerjaan bypass ini dibantu oleh para maintainer uAssets

Referensi

Belum ada komentar.

Belum ada komentar.