Defects in jellyfin-vue that are broken regardless of jellyfin-web — i.e. not parity work. Parity gaps live in PARITY.md; this file is only for things that should work and don't.
Sourced from the fork owner's observed gripes during planning. Severity: high (data loss / unusable) / medium (degraded) / low (cosmetic).
| # | Bug | Symptom | Suspected cause | Likely files | Severity | Status |
|---|---|---|---|---|---|---|
| B1 | Player OSD never auto-hides | The pause/skip/settings controls overlay stays visible and never fades while video is playing | Real cause was a CSS class collision, not the timer. JOverlay (packages/ui-toolkit/src/components/JOverlay.vue line 6) hard-codes uno-opacity-100 on its root when neither hover nor scrim props are passed. pages/playback/video.vue then layered :class="{ 'uno-opacity-0': !overlay }" on the same element. Vue merges parent and child classes, so the rendered element ended up with both uno-opacity-0 and uno-opacity-100. UnoCSS atomic classes have identical specificity, so source order in the generated stylesheet decided — and uno-opacity-100 typically won, keeping the OSD visible even when the timer correctly set overlay = false. |
pages/playback/video.vue |
medium | fixed — replaced the parent's class-based opacity binding with :style="{ opacity: overlay ? 1 : 0 }"; inline styles override any colliding uno-opacity-* class. The earlier timer-state fix (8fae096f) was necessary but not sufficient; both fixes together close the bug. |
| B2 | Player bottom gradient not visible | The translucent bottom→top gradient behind the OSD doesn't render | Not a missing feature — video.vue already defines .osd-bottom with a full linear-gradient. It has regressed or is overridden |
pages/playback/video.vue (.osd-bottom / .osd-top styles) |
low | open — investigate why the existing gradient doesn't show |
| B3 | Leaving the tab restarts playback | Switching away from the tab and returning restarts the current media from the beginning, losing position | Tab visibility change likely re-triggers _currentPlaybackInfo / a source-URL recompute / media-element reload |
store/playback-manager.ts, store/player-element.ts, components/Playback/PlayerElement.vue, store/index.ts (isDocumentVisible) |
high | open |
| B4 | Video contrast/brightness looks wrong | The video image's contrast/brightness differs from jellyfin-web — looks off | Possibly an overlay tint over the media element, a CSS filter, or a colour-handling issue |
pages/playback/video.vue, components/Playback/PlayerElement.vue, theme/overlay styles |
medium | open — needs investigation |
| B5 | Theme-toggle button shows a wrong / overlapping icon | The top-right theme button renders a weird or incorrect icon | AppBar.vue binds the JIcon class as a non-mutually-exclusive object — i-mdi:weather-sunny (isAutoTheme), i-mdi:weather-night (!currentThemeIsDark) and i-mdi:brightness-auto (currentThemeIsDark) can be true simultaneously, applying two icon classes at once. Confirmed in source. |
components/Layout/AppBar/AppBar.vue |
medium | open — root cause identified |
| B6 | Connection-status button flickers on launch | The network/connection status indicator flashes in and out right after opening jellyfin-vue | The status AppBarButtonLayout is `v-if="!(remote.socket.isConnected |
isConnectedToServer)"; on launch the socket isn't connected yet and isConnectedToServeris acomputedAsync` that resolves asynchronously, so the button appears then disappears once the connection settles |
components/Layout/AppBar/AppBar.vue, store/index.ts (isConnectedToServer) |
|
| B7 | pages/settings/server.vue is not admin-guarded |
A non-admin can reach /settings/server directly and see the configuration form (writes still 403 server-side, but the form renders) |
The file is missing the <route lang="yaml">meta: admin: true</route> block every other admin page carries; without meta.admin, the global adminGuard middleware (plugins/router/middlewares/admin-pages.ts) does nothing for the route |
pages/settings/server.vue |
medium | open — discovered during SRV-2; add the route block |
- B1 vs the paused-overlay feature: while paused, the OSD staying visible is current intended behaviour. The paused-state info overlay (
PARITY.md§1.1, gripe G6) is the proper treatment of the paused case. B1 is specifically about the playing case. - B5/B6 were one gripe ("top-right buttons buggy on launch — flicker, weird icons, weird status"), split here because they are independent defects with separate root causes and separate fixes. Both are flavours of the app bar painting before async state settles.
- The
CastButtonis commented out inAppBar.vue(<!-- <cast-button /> -->), so it does not contribute to these bugs — but note it forPARITY.md§3.4: the cast capability is not merely disabled, it is unmounted. - Fixes are out of scope for the current planning pass; this file is the tracking record.