A minimal Chrome extension that loops a specified time range on YouTube and lets you slow down playback for shadowing / language practice.
Sibling project of netflix-loop — same UX, simpler internals (no DRM bridge needed).
- Floating panel on any YouTube watch page (top-right, dim until hovered)
- Set a start/end time, click Loop — the player jumps back to start whenever it reaches end
- ● button next to each input grabs the current playback time (no typing)
- Time inputs accept any of:
1:23,1:23:45, or raw seconds (83) - Playback speed: 5 presets (
0.5 / 0.75 / 1× / 1.25 / 1.5) plus a fine-adjust row — click−/+for ±0.05 steps, or type a custom value in the input (range0.25–2.00, e.g.0.85). Pitch preserved. - Loop range and speed are remembered per video (keyed by
?v=ID) - Manually dragging the timeline outside the loop range turns the loop off (so you can scrub freely)
- Ad-aware: skips loop logic and mark buttons during ads (checks
#movie_player.ad-showing); showsAd playing…in the readout - Survives video changes (re-binds via
MutationObserver) - Works in fullscreen (panel re-parents into the fullscreen element)
- Open
chrome://extensions - Enable Developer mode (top right)
- Click Load unpacked and select this folder
- Open any YouTube video — the panel appears in the top-right corner
To update after editing source: hit the refresh icon on the extension card in chrome://extensions, then reload the YouTube tab.
- Play your video, scrub to the moment you want to loop from
- Click ● next to Start to mark the current time
- Scrub to the end of the segment, click ● next to End
- Click Loop OFF to toggle it on
- Pick a speed preset (e.g.
0.75) for slow shadowing - Click ⤴ to jump back to the start manually any time
Drag the timeline outside the marked range to disable the loop and watch normally.
| File | What it does |
|---|---|
manifest.json |
Manifest V3; injects on all youtube.com pages |
content.js |
Builds the panel, handles loop logic, ad detection, persistence |
content.css |
Panel styling (dark with YouTube red accent) |
- Why simpler than Netflix Loop? YouTube doesn't gate
<video>.currentTimewrites behind DRM, so we can seek directly without bridging into a MAIN-world script. - Loop boundary precision is ~±0.25s (
timeupdate~4Hz). Plenty for normal use. - Only
/watch?v=...URLs are supported. Shorts and embeds are out of scope. - Permissions:
storageandhost_permissionsforyoutube.com. No analytics, no network calls.