Repository navigation
A copy-protected video stays in the page's own player, and the toolbar says DRM - #606
Merged
Merged
Conversation
…r says DRM On vimeo.com/863362136 (upstream #456's video, copy-protected since) FastStream took the page's player away and gave one that sat at readyState 0 behind its DRM message. The background already reads a stream's master and first variant for the length; the variant's keys now tell whether its segments are copy-protected (StreamLength.hlsProtected, by the rule the player decrypts by, Decryptable.mjs; DASH: dashProtected). - hasVideoSource opens no player when the stream the player would play is protected (the longest, as main.mjs picks: not any protected one, or the film's clear ad won the pick); the toolbar button shows "DRM" and why. - openInMpv refuses a protected stream as it refuses a Firefox VPN one, after waiting for an unread manifest; the allowlist's MPV then sends no later stream. - Two new strings in all 16 locales (glm's translations, German reworded). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…oth gates, no orphan mark From glm's reviews of #606, each checked against the code: - The badge: a frame's copy-protected video branded the tab while another frame's player opened, or played. noteProtectedVideo sets no mark while a player is there or opening, and openPlayer clears it. - StreamLengths.noteProtection: a finished read sets the mark either way, and none for a URL forgotten while it was read. - Tests for a DASH manifest read slower than the opening delay, and one read only when the player's mpv button sends it; README says "!" for mpv mode. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The glm translations of extension_toggle_label_drm and player_mpv_drm came back read in the wrong encoding: fr, ja, ko, pt_BR, ru, zh_CN and zh_TW held U+FFFD where letters were. Rewritten by hand in each locale's own words for "player"; id's "hak cipta" (copyright) is now "dilindungi dari penyalinan" (copy protection). The locale test now fails on any message with U+FFFD; it failed on these 7. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Found while testing the upstream reports you listed: #456's video, vimeo.com/863362136, is copy-protected now. FastStream took it over and gave a player that sat at readyState 0 behind "This video is copy-protected (DRM)…". Vimeo's own player plays it.
What happens now
How it is told
METHOD=SAMPLE-AES-CTRunder a Widevine and a PlayReady key (measured live).StreamLength.hlsProtectedkeeps the keys in force as hls.js does. A segment plays when its identity key is one FastStream decrypts. That isDecryptable.mjs, the ruleHLSFragmentRequester.takeOverDecryptionnow uses too. A unit test runs both on the same playlists through hls.js's own parser.EXT-X-SESSION-KEYmay name a key no variant uses.StreamPick.pick). Leaving protected streams out of the pick would have let a film's clear ad win it.Measured
DRM, tooltip as writtenTests
HLSEncryptedPlaylists: 12 playlists, the background's rule equal to the player'sStreamLength: DASH, the attribute parser, CRLF, session keysStreamLengths: Vimeo's shape, AES-128, DASH, the URL forgotten with its lengthbackgroundDetection: no player, the ad case, a DRM trailer beside a clear film, AES-128, reset on the next pagebackgroundMpv: the allowlist, the player's button for a stream not read yet, a clear streamStrings
extension_toggle_label_drmandplayer_mpv_drmin all 16 locales. glm translated them; I reworded the German.🤖 Generated with Claude Code