Replace the plain /youtubei/v1/player request (made through the proxy,
and therefore bound to the proxy's egress IP) with an encrypted Onesie
request using the WEB client. Onesie is proxied by YouTube's "trusted
bandaid", so the returned player response - and the server_abr_streaming_url
inside it - is not tied to our egress IP. Media is still pulled over SABR
(sabr_scheme_plugin.js); only how the player response is obtained changes.
- sabr_onesie.js: new module, window.fetchOnesiePlayerResponse(). Builds the
WEB player request, encrypts it (OnesieInnertubeRequest + OnesieRequest),
POSTs to the onesie endpoint through /proxy, parses ONESIE_HEADER/ONESIE_DATA
UMP parts, gunzips/decrypts, returns the raw player response JSON. Adapted
from googlevideo/examples/onesie-request and invidious-secret-companion's
WEB-client variant.
- sabr_helpers.js: add decryptResponse() (AES-CTR + HMAC verify), companion to
the existing encryptRequest().
- sabr_loader.js: expose window.YT so a VideoInfo can be built from the raw
onesie player response.
- sabr_player.js: in loadVideo(), fetch the player response via Onesie and wrap
it in new YT.VideoInfo(...); fall back to innertube.getInfo() on failure.
- player.ecr: load sabr_onesie.js before sabr_player.js.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Segment index parsers (mp4/webm) declared the per-segment URI array with
`var` inside the loop, so every SegmentReference's getUris() closure
captured the same function-scoped binding and returned the LAST segment's
URL. YouTube received the final segment's startTimeMs/sq for every
segment, replied with policy-only UMP (no media), and the player looped
forever on a black screen ("SABR throttled by YouTube"). Use `let`
(block-scoped, fresh per iteration) to match FreeTube's `const`.
Also scope the big centered play button styling to
`.shaka-play-button-container`; the bare `.shaka-play-button` selector
also matched the control-bar play button (48px siblings), oversizing it
to ~54px and pushing it out of alignment.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This package makes it conflict with the dependencies needed to build
Invidious (openssl, libpcre, etc). crystalline can work perfectly
without it tho, but it was added in the first place because crystalline
was trying to invoke it.
Crystal 1.21.0 now features execution contexts, they do not longer support (and recommend) the -Dpreview_mt build flag. -Dpreview_mt also worked really bad and it made Invidious to hang on high load, so it was never useful.
https://crystal-lang.org/2026/07/16/1.21.0-released/#execution-contexts
Crystal 1.21.0 now features execution contexts, they do not longer support (and recommend) the `-Dpreview_mt` build flag. It also worked really bad and it made Invidious to hang on high load.
Update Chinese (Simplified Han script) translation
Update Chinese (Simplified Han script) translation
Update Chinese (Simplified Han script) translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Update Chinese (Traditional Han script) translation
Update Chinese (Traditional Han script) translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jeff Huang <s8321414@gmail.com>
Update Swedish translation
Update Swedish translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Joel A <joeax910@student.liu.se>
Co-authored-by: bittin1ddc447d824349b2 <bittin@reimu.nl>
Update Italian translation
Update Italian translation
Update Italian translation
Update Italian translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Random <random-r@users.noreply.hosted.weblate.org>