Skip to content

v0.2.3

Choose a tag to compare

@alithw alithw released this 14 Oct 11:45
· 2 commits to main since this release

⭐ Enjoying crystal-clear studio music on YouTube? If this little extension makes your daily listening sessions happier, please consider dropping a shiny Star on GitHub — it truly means the world and keeps this project going! ♪

YTSpoofingStream v0.2.3

The v0.2.3 release (commit 667384a) resolves YouTube player UI volume control responsiveness, eliminates track-end autoplay replay glitches, fixes SABR/UMP micro-gap buffering stalls, and adds full native player loop support.

1. Restored Native Player Volume & Mute Controls (passedProbe Guard)

  • Detached Probe Shield: Fixed YouTube's internal audio capability probe (passedProbe) executed on detached DOM elements (r = Vj()). YouTube runs capability assertions on off-DOM elements (!this.isConnected). Intercepting descriptor getters/setters on disconnected elements previously caused YouTube to mark the browser as incapable of volume adjustment, permanently disabling the volume slider (aria-disabled="true") and hiding the drag handle.
  • Selective Prototype Routing: Added if (!this.isConnected) return descVolume.get.call(this); and descMuted.get.call(this) guards on HTMLMediaElement.prototype.volume and muted. YouTube's native probe passes naturally (passedProbe: true), fully restoring the native player volume slider, drag handle, and mute/unmute buttons.

2. Clean Autoplay Track-End Transitions (No Replay Glitch)

  • Eliminated 1–1.5s Track Restart: Fixed the annoying track-ending glitch where a completed video rewound to 0:00 and replayed the intro for 1–1.5s before advancing to the next video.
  • Root Cause & Resolution:
    • Previously, when a song finished, the <video> element was left playing while <audio> paused. The <video> fired play/playing events, resetting _trackEnded = false. The watchdog saw <video> playing while <audio> was paused and called audio.play(), which per HTML5 spec rewound <audio> to 0:00, and drift resync rewound <video> to 0:00.
    • Enforced immediate synchronous video.pause() and audio.pause() at track end (currentTime >= duration - 0.8s).
    • Added a strict guard in onVideoEvent('play'): If currentTime >= duration - 0.8s, _trackEnded = true is never cleared and both elements remain paused.
    • Added a reliable fallback transition in checkSyncWatchdog: Holds playback paused and cleanly dispatches player.nextVideo() after a 2.5s delay (1.0s in playlist) if YouTube's native Autonav does not trigger immediately.

3. SABR / UMP Stream Micro-Gap & Duplicate Fetch Resilience (UmpMseController774)

  • Micro-Gap Buffer Stall Recovery: Fixed audio freezes around WebM cluster / chunk boundaries where audio stopped progressing (audio.currentTime stalled > 2.5s) while video continued ahead. The watchdog now automatically jumps the micro-gap (audio.currentTime = video.currentTime), resuming seamless playback without dropped connections.
  • Segment Deduplication: Prevented re-appending duplicate segments into the MediaSource SourceBuffer (lastAppendedSeq === seg.seq) and removed destructive lastAppendedSeq = -1 resets on seeks, eliminating infinite reconnection loops and buffer thrashing.

4. Native Player Loop & Single-Track Repeat Support

  • Loop Mode Detection: Added StudioEngine774.isLoopActive(), which inspects video.loop, movie_player.getLoopVideo(), and single-track playlist repeat modes (singleVideoLoop).
  • Seamless 0:00 Loop Playback: When Loop mode is enabled, reaching the end of the track smoothly rewinds both Opus 774 audio and native video to 0:00 and resumes playback without triggering premature Autonav or pausing.

5. Version Bumps & Documentation Sync

  • Synchronized version string to v0.2.3 across manifest.json, src/bridge.js, src/popup.html, src/popup.js, and all 6 language locale dictionaries (locales/*.json).
  • Updated English (README.md) and Vietnamese (README-vi.md) documentation with v0.2.3 badges, architecture diagrams, and release highlights.

Full Changelog: v0.2.2...v0.2.3