YouTube - 阻止自动播放缩略图预览和频道预告片

在所有YouTube页面上阻止缩略图悬停预览(WebP和视频)并停止频道预告片(视频+音频)。保留进度条、播放按钮和静态图像。无需登录或权限,页面加载时运行。

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         YouTube - Block Autoplay Preview Thumbnail & Channel Trailer
// @name:ar      يوتيوب - حظر معاينة التشغيل التلقائي للصور المصغرة وتريلر القناة
// @name:bg      YouTube - Блокиране на Автоматичен Преглед на Миниатюри и Трейлър на Канал
// @name:ca      YouTube - Bloqueja Previsualització de Reproducció Automàtica de Miniatures i Tràiler del Canal
// @name:cs      YouTube - Blokování Automatického Náhledu Miniatur a Traileru Kanálu
// @name:cy      YouTube - Blocio Rhagolwg Chwarae Awtomatig Thumbnail a Threilar Sianel
// @name:da      YouTube - Blokér Autoplay-Forhåndsvisning af Miniaturer og Kanaltrailer
// @name:de      YouTube - Autoplay-Vorschau von Thumbnails und Kanaltrailer Blockieren
// @name:el      YouTube - Μπλοκάρισμα Προεπισκόπησης Αυτόματης Αναπαραγωγής Thumbnail και Τρέιλερ Καναλιού
// @name:eo      YouTube - Bloki Aŭtomatan Antaŭrigardon de Miniaturoj kaj Kanalan Antaŭfilmon
// @name:es      YouTube - Bloquear Vista Previa de Reproducción Automática de Miniaturas y Tráiler del Canal
// @name:et      YouTube - Blokeeri Autoplay Eelvaade Miniatuuride ja Kanali Treiler
// @name:eu      YouTube - Autoplay Aurrebista Thumbnail eta Kanaleko Trailerra Blokeatu
// @name:fi      YouTube - Estä Autotoiston Esikatselu Miniatuureista ja Kanavan Traileria
// @name:fr      YouTube - Bloquer Aperçu Lecture Automatique des Miniatures et Bande-annonce de Chaîne
// @name:fr-CA   YouTube - Bloquer Aperçu Lecture Automatique des Miniatures et Bande-annonce de Chaîne
// @name:gl      YouTube - Bloquear Vista Previa de Reprodución Automática de Miniaturas e Tráiler do Canal
// @name:he      YouTube - חסימת תצוגה מקדימה אוטומטית של תמונות ממוזערות וטריילר ערוץ
// @name:hi      YouTube - ऑटोप्ले थंबनेल पूर्वावलोकन और चैनल ट्रेलर ब्लॉक करें
// @name:hr      YouTube - Blokiraj Automatski Pregled Miniatura i Trailer Kanala
// @name:hu      YouTube - Autoplay Előnézet Miniatűrök és Csatorna Előzetes Blokkolása
// @name:id      YouTube - Blokir Pratinjau Putar Otomatis Thumbnail dan Trailer Saluran
// @name:is      YouTube - Blokkar Sjálfvirka Forskoðun Smámynda og Rásarstiklu
// @name:it      YouTube - Blocca Anteprima Riproduzione Automatica di Miniature e Trailer del Canale
// @name:ja      YouTube - 自動再生プレビューサムネイルとチャンネルトレーラーをブロック
// @name:ka      YouTube - ავტომატური წინასწარი ჩვენების მინიატურებისა და არხის ტრეილერის ბლოკირება
// @name:km      YouTube - ទប់ស្កាត់ការបង្ហាញជាមុនផ្ទាំងរូបភាពតូច និងវីដេអូផ្សព្វផ្សាយឆានែល
// @name:ko      YouTube - 자동 재생 미리보기 썸네일 및 채널 예고편 차단
// @name:lo      YouTube - ບລັອກການສະແດງຕົວຢ່າງອັດຕະໂນມັດຂອງຮູບຍໍ້ ແລະ ຕົວຢ່າງຊ່ອງ
// @name:lt      YouTube - Blokuoja Autoplay Peržiūrą Miniatiūrų ir Kanalo Anonsą
// @name:lv      YouTube - Bloķēt Autoplay Priekšskatījumu Miniatūrām un Kanāla Treileri
// @name:ms      YouTube - Blok Pratinjau Putar Automatik Thumbnail dan Treler Saluran
// @name:nb      YouTube - Blokker Forhåndsvisning av Autoplay Miniatyrbilder og Kanaltrailer
// @name:ne      YouTube - अटोप्ले थम्बनेल पूर्वावलोकन र च्यानल ट्रेलर ब्लक गर्नुहोस्
// @name:nl      YouTube - Blokkeer Automatische Afspeelvoorbeeld van Thumbnails en Kanaaltrailer
// @name:no      YouTube - Blokker Autoplay-Forhåndsvisning av Miniatyrer og Kanaltrailer
// @name:pl      YouTube - Blokuj Podgląd Automatycznego Odtwarzania Miniaturek i Zwiastun Kanału
// @name:pt-BR   YouTube - Bloquear Prévia de Reprodução Automática de Miniaturas e Trailer do Canal
// @name:ro      YouTube - Blochează Previzualizare Redare Automată a Miniaturilor și Trailer de Canal
// @name:ru      YouTube - Блокировать Автовоспроизведение Превью Миниатюр и Трейлер Канала
// @name:sk      YouTube - Blokovať Autoplay Náhľad Miniatúr a Ukážku Kanálu
// @name:sl      YouTube - Blokiraj Samodejni Predogled Miniaturnih Slik in Napovednik Kanala
// @name:sq      YouTube - Bllokoni Parapamjen e Riprodhimit Automatik të Thumbnail dhe Trailerin e Kanalit
// @name:sr      YouTube - Blokiraj Automatsku Reprodukciju Pregleda Miniatura i Trejler Kanala
// @name:sv      YouTube - Blockera Autoplay-Förhandsgranskning av Miniatyrer och Kanaltrailer
// @name:th      YouTube - บล็อกตัวอย่างเล่นอัตโนมัติของรูปย่อและตัวอย่างช่อง
// @name:tr      YouTube - Otomatik Oynatma Önizlemesi Thumbnail ve Kanal Fragmanını Engelle
// @name:ug      YouTube - ئاپتوماتىك كۆرۈش ئالدىن كۆرۈش كىچىك رەسىم ۋە قانال تىزىرلىقىنى چەكلەش
// @name:uk      YouTube - Блокувати Автовідтворення Попереднього Перегляду Мініатюр та Трейлер Каналу
// @name:vi      YouTube - Chặn Xem Trước Tự Động Khi Hover Thumbnail và Trailer Kênh
// @name:zh-CN   YouTube - 阻止自动播放缩略图预览和频道预告片
// @name:zh-TW   YouTube - 阻止自動播放縮圖預覽和頻道預告片
// @description         Blocks YouTube thumbnail hover previews (WebP & video) and stops channel trailers (video + audio). Keeps progress bars, play buttons, and static images. Works on all pages, no login or permissions needed, runs at document-start.
// @description:ar      يحظر معاينات الصور المصغرة عند التمرير (WebP وفيديو) ويوقف تريلرات القناة (فيديو + صوت). يحافظ على أشرطة التقدم، أزرار التشغيل، والصور الثابتة. يعمل على جميع الصفحات، بدون تسجيل دخول أو أذونات، يبدأ فور تحميل الصفحة.
// @description:bg      Блокира предварителни прегледи при навеждане на миниатюри (WebP и видео) и спира трейлърите на канали (видео + звук). Запазва лентите за напредък, бутоните за възпроизвеждане и статичните изображения. Работи на всички страници, без вход или разрешения, стартира при зареждане на страницата.
// @description:ca      Bloqueja les visualitzacions prèvies de les miniatures en passar-hi per sobre (WebP i vídeo) i atura els tràilers del canal (vídeo + àudio). Manté les barres de progrés, botons de reproducció i imatges estàtiques. Sense inici de sessió ni permisos, s’executa al carregament de la pàgina.
// @description:cs      Blokuje náhledy miniaturek při najetí myší (WebP a video) a zastavuje trailery kanálů (video + zvuk). Zachovává ukazatele postupu, tlačítka přehrávání a statické obrázky. Bez přihlášení nebo oprávnění, spouští se při načtení stránky.
// @description:cy      Yn blocio rhagolwg chwarae awtomatig ar smotynnau (WebP a fideo) ac yn stopio treialon sianel (fideo + sain). Yn cadw barrau cynnydd, botymau chwarae a delweddau statig. Yn gweithio ar bob tudalen, dim mewngofnodi na chaniatâd, yn rhedeg ar document-start.
// @description:da      Blokerer miniature-hover-forhåndsvisninger (WebP og video) og stopper kanaltrailere (video + lyd). Bevarer fremskridtsmærker, afspilningsknapper og statiske billeder. Ingen login eller tilladelser, kører ved sideindlæsning.
// @description:de      Blockiert Hover-Vorschauen von Thumbnails (WebP & Video) und stoppt Kanaltrailer (Video + Ton). Behält Fortschrittsbalken, Play-Buttons und statische Bilder bei. Kein Login oder Berechtigungen erforderlich, startet beim Seitenladen.
// @description:el      Μπλοκάρει προεπισκοπήσεις εικόνων miniature κατά το hover (WebP και βίντεο) και σταματά τρέιλερ καναλιών (βίντεο + ήχος). Διατηρεί γραμμές προόδου, κουμπιά αναπαραγωγής και στατικές εικόνες. Χωρίς σύνδεση ή άδειες, εκτελείται κατά τη φόρτωση σελίδας.
// @description:eo      Blokas miniaturojn hover antaŭrigardojn (WebP & video) kaj haltigas kanalajn antaŭfilmojn (video + sono). Konservas progresajn stangojn, ludbutonojn kaj statikajn bildojn. Sen ensaluto aŭ permesoj, lanĉiĝas ĉe ŝarĝo de paĝo.
// @description:es      Bloquea vistas previas de miniaturas al pasar el mouse (WebP y video) y detiene tráilers de canal (video + audio). Mantiene barras de progreso, botones de reproducción y imágenes estáticas. Sin inicio de sesión ni permisos, se ejecuta al cargar la página.
// @description:et      Blokeerib thumbnail-kursorilähisvaadet (WebP ja video) ja peatab kanalite treilerid (video + heli). Säilitab edenemisribad, esitusnupud ja staatilised pildid. Ilma sisselogimise või lubadeta, käivitub lehe laadimisel.
// @description:eu      Aurrebista blokeatu thumbnail hover (WebP eta bideoa) eta gelditu kanalaren trailerrak (bideoa + audioa). Mantentzen ditu aurrerapen-barrak, erreproduzitzeko botoiak eta irudi estatikoak. Saioa hasi gabe eta baimenik gabe, orria kargatzean exekutatzen da.
// @description:fi      Estää thumbnail-kohdistus-esikatselut (WebP ja video) ja pysäyttää kanavan trailerit (video + ääni). Säilyttää edistymispalkit, toistonapit ja staattiset kuvat. Ei kirjautumista tai lupia, käynnistyy sivun latautuessa.
// @description:fr      Bloque les aperçus au survol des miniatures (WebP et vidéo) et arrête les bandes-annonces de chaîne (vidéo + son). Conserve les barres de progression, boutons de lecture et images statiques. Sans connexion ni permission, s’exécute au chargement de la page.
// @description:fr-CA   Bloque les aperçus au survol des miniatures (WebP et vidéo) et arrête les bandes-annonces de chaîne (vidéo + son). Conserve les barres de progression, boutons de lecture et images statiques. Sans connexion ni permission, s’exécute au chargement de la page.
// @description:gl      Bloquea as vistas previas de miniaturas ao pasar o rato (WebP e vídeo) e detén os tráilers do canal (vídeo + son). Mantén as barras de progreso, botóns de reprodución e imaxes estáticas. Sen inicio de sesión nin permisos, execútase ao cargar a páxina.
// @description:he      חוסם תצוגות מקדימות של תמונות ממוזערות (WebP ווידאו) ועוצר טריילרים של ערוצים (וידאו + קול). שומר על סרגלי התקדמות, כפתורי ניגון ותמונות סטטיות. ללא כניסה או הרשאות, פועל בטעינת הדף.
// @description:hi      YouTube थंबनेल होवर पूर्वावलोकन (WebP और वीडियो) और चैनल ट्रेलर (वीडियो + ऑडियो) ब्लॉक करता है। प्रोग्रेस बार, प्ले बटन और स्थिर छवियां रखता है। सभी पेजों पर काम करता है, लॉगिन या अनुमति नहीं चाहिए, पेज लोड होते ही चलता है।
// @description:hr      Blokira preglede pri lebdenju na sličicama (WebP i video) i zaustavlja trailere kanala (video + zvuk). Zadržava trake napretka, tipke za reprodukciju i statične slike. Bez prijave ili dozvola, pokreće se pri učitavanju stranice.
// @description:hu      Blokkolja a miniatűr hover előnézeteket (WebP és video) és megállítja a csatorna előzeteseit (video + hang). Megtartja a folyamatjelzőket, lejátszási gombokat és statikus képeket. Bejelentkezés vagy engedély nélkül, oldal betöltésekor fut.
// @description:id      Memblokir pratinjau hover thumbnail (WebP & video) dan menghentikan trailer saluran (video + audio). Menjaga bilah kemajuan, tombol putar dan gambar statis. Tanpa login atau izin, berjalan saat halaman dimuat.
// @description:is      Blokkar sjálfvirka forskoðun á smámyndum (WebP og myndskeið) og stöðvar rásarstiklur (myndskeið + hljóð). Heldur áfram framfara stöng, spila hnöppum og kyrrstæðum myndum. Engin innskráning eða heimild, keyrir við hleðslu síðu.
// @description:it      Blocca anteprime hover su miniature (WebP e video) e ferma i trailer dei canali (video + audio). Mantiene barre di avanzamento, pulsanti play e immagini statiche. Nessun login o permessi, si avvia al caricamento della pagina.
// @description:ja      YouTubeのすべてのページでサムネイルのホバー時プレビュー(WebPおよびビデオ)とチャンネルトレーラー(ビデオ+音声)をブロックします。進捗バー、再生ボタン、静止画像を保持。ログインや権限不要、ページ読み込み時に実行。
// @description:ka      ბლოკავს მინიატურების ჰოვერ წინასწარ ჩვენებას (WebP & ვიდეო) და აჩერებს არხის ტრეილერებს (ვიდეო + ხმა). ინახავს პროგრესის ზოლებს, დაკვრის ღილაჩებს და სტატიკურ სურათებს. შესვლა ან ნებართვა არაა საჭირო, გვერდის ჩატვირთვისას მუშაობს.
// @description:km      ទប់ស្កាត់ការបង្ហាញជាមុនផ្ទាំងរូបភាពតូច (WebP និងវីដេអូ) នៅពេលរំកិលកណ្តុរ និងបញ្ឈប់វីដេអូផ្សព្វផ្សាយឆានែល (វីដេអូ + សំឡេង)។ រក្សាទុករបារវឌ្ឍនភាព ប៊ូតុងចាក់ និងរូបភាពឋិតិវន្ត។ ដំណើរការលើគ្រប់ទំព័រ មិនតម្រូវឱ្យចូលគណនី ឬសិទ្ធិ ចាប់ផ្តើមនៅពេលផ្ទុកទំព័រ។
// @description:ko      모든 YouTube 페이지에서 썸네일 호버 미리보기(WebP 및 비디오)와 채널 예고편(비디오 + 오디오)을 차단합니다. 진행 막대, 재생 버튼 및 정적 이미지를 유지합니다. 로그인이나 권한 불필요, 페이지 로드 시 실행.
// @description:lo      ບລັອກການສະແດງຕົວຢ່າງທີ່ເປີດອັດຕະໂນມັດເມື່ອວາງເມົາສ໌ (WebP ແລະ ວິດີໂອ) ແລະ ຢຸດຕົວຢ່າງຊ່ອງ (ວິດີໂອ + ສຽງ). ຮັກສາແຖບຄວາມຄືບໜ້າ, ປຸ່ມຫຼິ້ນ ແລະ ຮູບພາບຄົງທີ່. ເຮັດວຽກໃນທຸກໜ້າ, ບໍ່ຕ້ອງເຂົ້າສູ່ລະບົບ ຫຼື ອະນຸຍາດ, ເລີ່ມເຮັດວຽກຕອນທີ່ໂຫຼດໜ້າ.
// @description:lt      Blokuoja miniatiūrų užvedimo peržiūras (WebP ir vaizdo įrašus) ir sustabdo kanalų anonsus (vaizdo įrašas + garsas). Išlaiko pažangos juostas, grojimo mygtukus ir statinius vaizdus. Be prisijungimo ar leidimų, veikia puslapio įkėlimo metu.
// @description:lv      Bloķē sīktēlu pārslēgšanās priekšskatījumu (WebP un video) un aptur kanāla treilerus (video + audio). Saglabā progresa joslas, atskaņošanas pogas un statiskus attēlus. Bez pieteikšanās vai atļaujām, darbojas lapas ielādes laikā.
// @description:ms      Menghalang pratinjau hover thumbnail (WebP & video) dan menghentikan treler saluran (video + audio). Menyimpan bar kemajuan, butang main dan imej statik. Tiada log masuk atau kebenaran, dijalankan semasa halaman dimuat.
// @description:nb      Blokkerer forhåndsvisninger av miniatyrbilder ved svev (WebP og video) og stopper kanaltrailere (video + lyd). Beholder fremdriftslinjer, avspillingsknapper og statiske bilder. Ingen innlogging eller tillatelser, kjører ved sidelasting.
// @description:ne      YouTube मा थम्बनेल होभर गर्दा आउने अटोप्ले पूर्वावलोकन (WebP र भिडियो) र च्यानल ट्रेलर (भिडियो + अडियो) लाई ब्लक गर्छ। प्रोग्रेस बार, प्ले बटन र स्थिर तस्बिरहरू कायम राख्छ। सबै पेजमा काम गर्छ, लगइन वा अनुमति चाहिँदैन, पेज लोड हुने बित्तिकै चल्छ।
// @description:nl      Blokkeert hover-voorbeelden van thumbnails (WebP en video) en stopt kanaaltrailers (video + audio). Behoudt voortgangsbalken, afspeelknoppen en statische afbeeldingen. Geen login of toestemming, start bij paginalading.
// @description:no      Blokkerer forhåndsvisninger av miniatyrer ved svev (WebP og video) og stopper kanaltrailere (video + lyd). Beholder fremdriftslinjer, avspillingsknapper og statiske bilder. Ingen innlogging eller tillatelser, kjører ved sidelasting.
// @description:pl      Blokuje podglądy miniaturek przy najechaniu myszą (WebP i wideo) oraz zatrzymuje zwiastuny kanałów (wideo + dźwięk). Zachowuje paski postępu, przyciski odtwarzania i statyczne obrazy. Bez logowania i uprawnień, uruchamia się przy ładowaniu strony.
// @description:pt-BR   Bloqueia prévias de miniaturas ao passar o mouse (WebP e vídeo) e interrompe trailers de canal (vídeo + áudio). Mantém barras de progresso, botões de play e imagens estáticas. Sem login ou permissão, executa ao carregar a página.
// @description:ro      Blochează previzualizări la hover pe miniaturi (WebP și video) și oprește trailerele de canal (video + audio). Păstrează barele de progres, butoanele de redare și imaginile statice. Fără login sau permisiuni, rulează la încărcarea paginii.
// @description:ru      Блокирует превью при наведении на миниатюры (WebP и видео) и останавливает трейлеры каналов (видео + звук). Сохраняет индикаторы прогресса, кнопки воспроизведения и статические изображения. Без входа или разрешений, запускается при загрузке страницы.
// @description:sk      Blokuje náhľady miniatúr pri prechode myšou (WebP a video) a zastavuje ukážky kanálov (video + zvuk). Zachováva ukazovatele postupu, tlačidlá prehrávania a statické obrázky. Bez prihlásenia alebo povolení, spúšťa sa pri načítaní stránky.
// @description:sl      Blokira predoglede sličic ob preletu (WebP in video) in ustavi napovednike kanalov (video + zvok). Ohrani vrstice napredka, gumbe za predvajanje in statične slike. Brez prijave ali dovoljenj, zažene ob nalaganju strani.
// @description:sq      Bllokon parapamjen e hover thumbnail (WebP dhe video) dhe ndalon trailerat e kanalit (video + audio). Mbaj shirita përparimi, butona luajtjeje dhe imazhe statike. Pa hyrje ose leje, ekzekutohet gjatë ngarkimit të faqes.
// @description:sr      Blokira preglede pri lebdećem pokazivaču na sličicama (WebP i video) i zaustavlja trejlere kanala (video + zvuk). Zadržava trake napretka, dugmiće za reprodukciju i statične slike. Bez prijave ili dozvola, pokreće se pri učitavanju stranice.
// @description:sv      Blockerar förhandsgranskningar vid hovring på miniatyrer (WebP och video) och stoppar kanaltrailers (video + ljud). Behåller förloppsindikatorer, uppspelningsknappar och statiska bilder. Ingen inloggning eller behörighet, körs vid sidladdning.
// @description:th      บล็อกการแสดงตัวอย่างเล่นอัตโนมัติเมื่อเลื่อนเมาส์บนรูปย่อ (WebP และวิดีโอ) และหยุดตัวอย่างช่อง (วิดีโอ + เสียง) รักษาแถบความคืบหน้า ปุ่มเล่น และภาพนิ่ง ไม่ต้องล็อกอินหรืออนุญาต ทำงานเมื่อโหลดหน้าเว็บ
// @description:tr      Tüm YouTube sayfalarında küçük resim hover önizlemelerini (WebP ve video) ve kanal fragmanlarını (video + ses) engeller. İlerleme çubuklarını, oynat düğmelerini ve statik resimleri korur. Giriş veya izin gerekmez, sayfa yüklenirken çalışır.
// @description:ug      بارلىق YouTube بەتلىرىدە كىچىك رەسىم hover ئالدىن كۆرۈشلىرىنى (WebP & ۋىدىيو) ۋە قانال تىزىرلىقلىرىنى (ۋىدىيو + ئاۋاز) چەكلەيدۇ. ئىلگىرىلەش تارىمىقى, ئويناش كۇنۇپكىلىرى ۋە سىتاتىك رەسىملەرنى ساقلايدۇ. كىرىش ياكى ئىجازەت تەلەپ قىلمايدۇ، بەت يۈكلەنگەندە ئىجرا بولىدۇ.
// @description:uk      Блокує попередній перегляд при наведенні на мініатюри (WebP та відео) та зупиняє трейлери каналів (відео + звук). Зберігає смуги прогресу, кнопки відтворення та статичні зображення. Без входу чи дозволів, запускається при завантаженні сторінки.
// @description:vi      Chặn hiệu ứng xem trước khi hover thumbnail (ảnh động WebP & video) và dừng trailer kênh (video + âm thanh). Giữ nguyên thanh tiến độ, nút play, ảnh tĩnh. Không cần đăng nhập, không cần quyền, chạy ngay khi tải trang.
// @description:zh-CN   在所有YouTube页面上阻止缩略图悬停预览(WebP和视频)并停止频道预告片(视频+音频)。保留进度条、播放按钮和静态图像。无需登录或权限,页面加载时运行。
// @description:zh-TW   在所有YouTube頁面上阻止縮圖懸停預覽(WebP和視頻)並停止頻道預告片(視頻+音頻)。保留進度條、播放按鈕和靜態圖像。無需登錄或權限,頁面載入時執行。
// @namespace    https://greasyfork.org/users/979364-miebie-1412
// @author       miebie.1412
// @version      1.4.1
// @match        https://www.youtube.com/*
// @match        http://www.youtube.com/*
// @match        https://youtube.com/*
// @match        http://youtube.com/*
// @grant        none
// @run-at       document-start
// @license      MIT
// @homepageURL  https://greasyfork.org/users/979364-miebie-1412
// @supportURL   https://greasyfork.org/users/979364-miebie-1412
// @icon         data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABm0lEQVR4AdSWAZaCIBRFaTY2tbJsZTUra979iqECYqLWHJ4IfP67cMLhxx38NwF4Onfu1KiurfN4vQMAGd4V4HXVe23dOw+lbksP0A1MCNuwqk92mEVaUgOQOcbIOnd4AGF+BiBDa6jevXiA3Y1laIs+EkAMzn0FwEOoN+kS6uTcaSznnI8h3kvd6TK3AzeZXKRGeoSKpQzGiTcpDihV8ZIDwLCJTyvvBUrR7KKqackB/E3DXz36dqyGI1sOgPGoZM4Ruqp+SiUgycW8BTCiAqQEYjStbdYAIBMQ7AY7Q7tYtQAwTP7QGEypFoA/rosh1gJgaN+J1Arn+nMAvzOTl6w6mSsHkPTn4yK9/csPE+cA+ktDOGHpe/edSJ6OHABe3OHCi2kSSkY2FtTM4+rFvZJcUc0BMIkEXiQEijM/kAJtLKiZk1y54qyUAFjgVo+PAeA8b7XIbN4jd8AWbQA60zRQlrbiIJcd8zMAEguCq5N10t5QmONlFj0ArQ6CQX+hrFmTl/8b1NiZBgD0CAJCu1DqfXUd5CDvZIf/AQAA//8BTt4CAAAABklEQVQDALNfokFDr0z6AAAAAElFTkSuQmCC
// ==/UserScript==
(function () {
    'use strict';
    const processed = new WeakSet();
    let lastScrollY = 0;
    const style = document.createElement('style');
    style.textContent = `
        ytd-moving-thumbnail-renderer,
        .ytd-moving-thumbnail-renderer,
        .ytp-cued-thumbnail-overlay,
        .ytp-cued-thumbnail-overlay-image,
        ytd-thumbnail-overlay-loading-preview-renderer,
        .ytd-thumbnail-overlay-loading-preview-renderer,
        ytd-video-preview,
        .ytd-video-preview,
        #thumbnail-overlay-play,
        .thumbnail-overlay-play,
        #video-preview-container,
        .video-preview-container,
        ytd-channel-video-player-renderer,
        #c4-player,
        ytd-player[context*="CHANNEL_TRAILER"] {
            display: none !important;
            visibility: hidden !important;
            height: 0 !important;
            width: 0 !important;
            overflow: hidden !important;
            pointer-events: none !important;
        }
        ytd-thumbnail img,
        .ytd-thumbnail img {
            transition: none !important;
            opacity: 1 !important;
        }
        #overlays,
        .ytd-rich-item-renderer #overlays,
        ytd-thumbnail[has-inline-playback-button] #overlays,
        ytd-thumbnail-overlay-toggle-pause-renderer,
        .ytd-thumbnail-overlay-toggle-pause-renderer {
            all: unset !important;
            display: block !important;
        }
    `;
    (document.head || document.documentElement).appendChild(style);

    const blockAudio = () => {
        ['AudioContext', 'webkitAudioContext'].forEach(name => {
            if (window[name] && !window[name].prototype._blocked) {
                const AC = window[name];
                AC.prototype._blocked = true;
                const dummy = { connect: () => {}, disconnect: () => {} };
                AC.prototype.createMediaElementSource = () => dummy;
                AC.prototype.resume = () => Promise.resolve();
            }
        });
    };
    blockAudio();
    setInterval(blockAudio, 200);

    const isMainVideo = (video) => {
        return location.pathname.startsWith('/watch') &&
            (video.closest('ytd-watch-flexy') || video.closest('#ytd-player') || video.classList.contains('html5-main-video'));
    };

    const isTrailer = (el) => {
        return el.closest('ytd-channel-video-player-renderer') ||
               el.id === 'c4-player' ||
               (el.tagName === 'YTD-PLAYER' && el.getAttribute('context') && el.getAttribute('context').includes('CHANNEL_TRAILER'));
    };

    const killVideo = (video) => {
        if (!video || video._killed || isMainVideo(video)) return;
        if (video.src && video.src.startsWith('blob:')) URL.revokeObjectURL(video.src);
        video.pause();
        video.muted = true;
        video.volume = 0;
        video.currentTime = 0;
        video.src = '';
        video.removeAttribute('src');
        try { video.load(); } catch(e) {}
        video._killed = true;
    };

    const blockAll = () => {
        document.querySelectorAll('img[src*="an_webp"], video[src*="an_webp"], img[src*="video-preview"], video[src*="video-preview"]').forEach(el => {
            if (el.tagName === 'IMG') {
                el.src = el.src.replace(/an_webp\/[^&]*&/g, '').replace(/video-preview\/[^&]*&/g, '');
                el.srcset = '';
            } else if (el.tagName === 'VIDEO') {
                el.src = el.src.replace(/an_webp\/[^&]*&/g, '').replace(/video-preview\/[^&]*&/g, '');
                el.pause();
                el.currentTime = 0;
                el.removeAttribute('autoplay');
            }
        });
        if (!location.pathname.startsWith('/watch')) {
            document.querySelectorAll('video').forEach(v => {
                if (isTrailer(v)) killVideo(v);
            });
            document.querySelectorAll('ytd-channel-video-player-renderer, #c4-player, ytd-player').forEach(el => {
                if (isTrailer(el)) {
                    const vid = el.querySelector('video');
                    if (vid) killVideo(vid);
                }
            });
        }
    };

    const blockObserver = new MutationObserver(blockAll);
    blockObserver.observe(document.documentElement, {
        childList: true,
        subtree: true,
        attributes: true,
        attributeFilter: ['src', 'srcset', 'class', 'id', 'context']
    });
    blockAll();
    setInterval(blockAll, 500);

    let lastUrl = location.href;
    const navObs = new MutationObserver(() => {
        if (location.href !== lastUrl) {
            lastUrl = location.href;
            setTimeout(blockAll, 100);
        }
    });
    navObs.observe(document, { subtree: true, childList: true });

    ['pushState', 'replaceState'].forEach(m => {
        const orig = history[m];
        history[m] = function() {
            orig.apply(this, arguments);
            setTimeout(() => { if (location.href !== lastUrl) blockAll(); }, 80);
        };
    });

    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', blockAll);
    }

    function isPostImage(img) {
        if (!img || !img.src) return false;
        if (!img.src.includes('ggpht.com') && !img.src.includes('googleusercontent.com')) return false;
        const post = img.closest('ytd-backstage-post-renderer');
        if (!post) return false;
        const container = img.closest('#image-container, [id*="image"]');
        if (!container) return false;
        const rect = img.getBoundingClientRect();
        if (rect.width <= 50 && rect.height <= 50) return false;
        if (rect.width >= 1000) return false;
        if (img.closest('ytd-rich-grid-media, ytd-video-renderer')) return false;
        return true;
    }

    function freezeImage(img) {
        if (processed.has(img) || !isPostImage(img)) return;
        if (!img.complete || img.naturalWidth === 0) {
            img.addEventListener('load', () => createCanvas(img), { once: true });
            return;
        }
        createCanvas(img);
    }

    function createCanvas(img) {
        if (processed.has(img)) return;
        const canvas = document.createElement('canvas');
        const ctx = canvas.getContext('2d');
        const w = img.naturalWidth || 640;
        const h = img.naturalHeight || 480;
        if (w === 0 || h === 0) return;
        canvas.width = w;
        canvas.height = h;
        ctx.drawImage(img, 0, 0, w, h);
        const style = getComputedStyle(img);
        canvas.style.cssText = img.style.cssText;
        canvas.style.width = style.width;
        canvas.style.height = style.height;
        canvas.style.objectFit = 'cover';
        canvas.style.display = 'block';
        canvas.style.borderRadius = style.borderRadius;
        canvas.className = img.className;
        canvas.alt = img.alt;
        if (img.parentNode) {
            img.parentNode.replaceChild(canvas, img);
            processed.add(img);
            console.log('Blocked GIF:', img.src.split('/').pop().split('?')[0]);
        }
    }

    function scan(force = false) {
        document.querySelectorAll('ytd-backstage-post-renderer img').forEach(img => {
            if (force || !processed.has(img)) {
                freezeImage(img);
            }
        });
    }

    const observer = new MutationObserver(mutations => {
        let needsScan = false;
        for (const m of mutations) {
            if (m.type === 'childList' && m.addedNodes.length) needsScan = true;
            if (m.type === 'attributes' && (m.attributeName === 'src' || m.attributeName === 'srcset')) needsScan = true;
        }
        if (needsScan) scan(true);
    });
    const startObserver = () => observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['src', 'srcset'] });
    if (document.body) startObserver();
    else document.addEventListener('DOMContentLoaded', startObserver);

    const poll = setInterval(scan, 300);
    setTimeout(() => clearInterval(poll), 90000);

    document.addEventListener('click', (e) => {
        const arrow = e.target.closest('button[aria-label*="next"], button[aria-label*="previous"], [role="button"][aria-label*="slide"]');
        if (arrow && arrow.closest('ytd-backstage-post-renderer')) {
            setTimeout(() => scan(true), 150);
        }
    }, { capture: true });

    document.addEventListener('wheel', (e) => {
        const scrollingUp = e.deltaY < 0;
        if (scrollingUp && window.scrollY < lastScrollY) {
            setTimeout(() => scan(true), 100);
        }
        lastScrollY = window.scrollY;
    }, { passive: true });

    const OrigImage = window.Image;
    window.Image = function () {
        const img = new OrigImage(...arguments);
        if (img.src && (img.src.includes('ggpht.com') || img.src.includes('googleusercontent.com'))) {
            img.addEventListener('load', () => {
                if (isPostImage(img)) setTimeout(() => freezeImage(img), 20);
            }, { once: true });
        }
        return img;
    };

    setTimeout(scan, 400);
})();