- 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.