Skip to content

feat(youtube): block YouTube ads (player data pruning + player fallback) - #14

Merged
AbrahamOP merged 2 commits into
mainfrom
feat/youtube-adblocking
Sep 13, 2026
Merged

AbrahamOP merged 2 commits into
mainfrom
feat/youtube-adblocking

Conversation

@AbrahamOP

Copy link
Copy Markdown
Owner

Empilée sur #13. Une fois #13 mergée, GitHub la redirige automatiquement vers main.

Fusionne les deux propositions YouTube, #10 de @PoPoGH et #11, en gardant le meilleur de chacune.

Comment

  1. youtube-inject.js (world MAIN, document_start) : retire playerAds, adPlacements, adSlots et adBreakHeartbeatParams des données du lecteur, qui ne programme donc jamais la pub. Sources couvertes :
  2. Enregistrement dynamique (chrome.scripting) : le script en world MAIN ne peut pas lire le stockage. background.js ne l'enregistre donc que si la protection est active, et exclut les domaines de la liste blanche. Pause, OFF et liste blanche s'appliquent ainsi dès le premier script de la page, sans course. Les appels sont sérialisés, sinon on obtient une erreur Duplicate script ID, reproduite en test.
  3. youtube.js (isolé, toutes les frames, youtube-nocookie compris) : filet de sécurité si une pub démarre quand même. Il la masque, coupe le son, l'avance à la fin et clique « Passer ». Deux garde-fous repris de feat(youtube): block video ads via API interception + auto-skip #10 : une avance par source, et 150 ms de délai après un changement de source, pour ne jamais envoyer la vraie vidéo à la fin. Il rétablit ensuite le son qu'il a lui-même coupé. Les emplacements pub (masthead, fil, bannières) suivent le réglage « Nettoyage visuel ».
  4. Règles : youtube.com/api/stats/ads, /pagead/, /ptracking. Les autres hôtes doubleclick de feat(youtube): block video ads via API interception + auto-skip #10 sont déjà couverts par la règle 1.

Nouvelle permission scripting. Elle n'ajoute pas d'avertissement, puisque les permissions d'hôte <all_urls> sont déjà là.

Tests

  • Banc CDP sur Chromium 152 avec un faux YouTube : 25/25. Couvre la purge (page, fetch, Request, XHR texte et JSON, réponses hors API intactes), les règles DNR, le masquage, la pub avancée, coupée et masquée, la vraie vidéo ni avancée ni muette, la pause et la reprise, la liste blanche avec exclusion, la rafale de changements sans doublon et l'absence d'erreur console.
  • Vrai youtube.com, Despacito et Gangnam Style, témoin sans extension contre GoaBlockAD :
champs pub dans ytInitialPlayerResponse lecture message anti-bloqueur
sans extension 1 OK non
GoaBlockAD 0 OK non

À valider à la main dans un vrai Chrome : pré-roll et mid-roll sur plusieurs vidéos, Shorts, YouTube Music, embed youtube-nocookie.

Merges the two YouTube approaches from #10 and #11:

- youtube-inject.js (MAIN world, document_start): removes playerAds,
  adPlacements, adSlots and adBreakHeartbeatParams from the player
  response embedded in the page (ytInitialPlayerResponse, missed so far
  on a direct /watch load) and from youtubei player/next/reel responses
  (fetch, incl. Request objects, and XHR text/json). The player never
  schedules the ad.
- It can't read extension storage, so background.js registers it with
  chrome.scripting only while protection is active and excludes
  allow-listed domains: pause, off and allow list apply from the first
  script of the page. Registration is serialized to avoid duplicate ids.
- youtube.js (isolated, all frames incl. youtube-nocookie): fallback
  when an ad still starts. Hides and mutes it, fast-forwards it with a
  per-source guard and a grace period after a source change so the real
  video is never sent to its end, clicks skip, restores the sound it
  muted. Ad slots (masthead, feed, banners) follow the cosmetic setting.
- rules: youtube.com/api/stats/ads, /pagead/, /ptracking (other
  doubleclick hosts are already covered by rule 1).
- CI: syntax-check both scripts and the runtime-registered file.

Closes #10, closes #11.

Co-authored-by: PoPoGH <quentinlorente2502@gmail.com>
Base automatically changed from fix/whitelist-pause-counter-filters to main September 13, 2026 10:27
@AbrahamOP
AbrahamOP changed the base branch from fix/whitelist-pause-counter-filters to main September 13, 2026 10:27
@AbrahamOP
AbrahamOP merged commit b2d5f9d into main Sep 13, 2026
1 check passed
@AbrahamOP
AbrahamOP deleted the feat/youtube-adblocking branch September 13, 2026 10:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant