Commit 2999170
committed
feat(player): immersive fullscreen player with in-video audio, quality, and subtitles
Redesigns playback as a pure immersive surface — the video fills the
viewport on black with every control inside the stage, and the player
best-effort enters fullscreen and locks landscape on open (silently
falling back to the tab-fill layout where the browser disallows it).
The old modal chrome (header, title row, side episode list) is gone;
EpisodeList is deleted and the episode switcher now lives in the
player as a searchable overlay panel.
New in-video capabilities:
- Settings panel with Quality / Speed / Audio / Subtitles tabs.
Quality and Audio lead with hub-based entries derived from the
movie's linkList — one entry per advertised resolution
(480p/720p/1080p) or per audio language (multi-language WEB-DLs) —
and fall back to manifest levels/tracks when the stream is a plain
HLS rendition. Switching re-resolves the stream from that hub with
failure memory, so a dead link is skipped on retry; the winning
hub is matched against the original stream to preselect the active
option. Original language is tagged and leads the Audio menu.
- External caption registration: providers attach subtitle tracks
(vtt/srt/ass/json) to stream sources; subtitleTracksFrom normalizes
the wildly varying provider shapes and registers them as Vidstack
text tracks, with a dedicated Subtitles shortcut button and
no-stacking track switching.
- Transport-cluster prev/next episode buttons (disabled at list
boundaries) plus Shift+P / Shift+N keyboard shortcuts.
- Safe-area aware top/bottom bars (env(safe-area-inset-*)) and a
portrait rotate hint that auto-dismisses.
Wiring and state:
- App resolves and carries audioLanguages/hubQualities through the
player/loading -> playing -> error cycle so menus stay populated
while a switch is in flight, and re-derives them when a fallback
hub takes over after sources are exhausted.
- Reducer player states carry the new optional audio/quality fields.
- DetailModal drops its old quality/season picker (superseded by the
in-player settings) and gains dialog semantics: role=dialog,
aria-modal, labelled by title, focus moved inside on open, Escape
to close.1 parent 0e5daf8 commit 2999170
9 files changed
Lines changed: 927 additions & 264 deletions
File tree
- src
- components
- features/player
- layout
- lib
- api
- state
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
6 | | - | |
| 6 | + | |
7 | 7 | | |
8 | 8 | | |
9 | | - | |
| 9 | + | |
10 | 10 | | |
11 | 11 | | |
12 | | - | |
13 | 12 | | |
14 | 13 | | |
15 | 14 | | |
| |||
19 | 18 | | |
20 | 19 | | |
21 | 20 | | |
22 | | - | |
23 | 21 | | |
24 | 22 | | |
25 | 23 | | |
| |||
31 | 29 | | |
32 | 30 | | |
33 | 31 | | |
34 | | - | |
35 | 32 | | |
36 | 33 | | |
37 | 34 | | |
| |||
48 | 45 | | |
49 | 46 | | |
50 | 47 | | |
51 | | - | |
52 | | - | |
53 | | - | |
54 | | - | |
55 | | - | |
56 | | - | |
57 | | - | |
58 | | - | |
59 | | - | |
60 | | - | |
61 | | - | |
62 | 48 | | |
63 | 49 | | |
64 | 50 | | |
65 | 51 | | |
66 | 52 | | |
67 | 53 | | |
68 | | - | |
69 | | - | |
70 | | - | |
71 | | - | |
72 | | - | |
73 | | - | |
74 | | - | |
75 | | - | |
76 | | - | |
77 | | - | |
78 | | - | |
79 | 54 | | |
80 | 55 | | |
81 | 56 | | |
| |||
87 | 62 | | |
88 | 63 | | |
89 | 64 | | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
90 | 79 | | |
91 | 80 | | |
92 | 81 | | |
| |||
95 | 84 | | |
96 | 85 | | |
97 | 86 | | |
98 | | - | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
99 | 93 | | |
100 | 94 | | |
101 | 95 | | |
| |||
190 | 184 | | |
191 | 185 | | |
192 | 186 | | |
193 | | - | |
| 187 | + | |
194 | 188 | | |
195 | 189 | | |
196 | 190 | | |
197 | 191 | | |
198 | 192 | | |
199 | 193 | | |
200 | | - | |
| 194 | + | |
201 | 195 | | |
202 | 196 | | |
203 | 197 | | |
| |||
256 | 250 | | |
257 | 251 | | |
258 | 252 | | |
259 | | - | |
260 | | - | |
261 | | - | |
262 | | - | |
263 | | - | |
264 | | - | |
265 | | - | |
266 | | - | |
267 | | - | |
268 | | - | |
269 | | - | |
270 | | - | |
271 | | - | |
272 | | - | |
273 | | - | |
274 | | - | |
275 | | - | |
276 | | - | |
277 | | - | |
278 | | - | |
279 | | - | |
280 | | - | |
281 | | - | |
282 | | - | |
283 | | - | |
284 | | - | |
285 | | - | |
286 | | - | |
287 | | - | |
288 | | - | |
289 | | - | |
290 | | - | |
291 | | - | |
292 | | - | |
293 | | - | |
294 | | - | |
295 | | - | |
296 | | - | |
297 | 253 | | |
298 | 254 | | |
299 | 255 | | |
| |||
This file was deleted.
0 commit comments