Compare commits

...

1211 Commits

Author SHA1 Message Date
Jellyfin Release Bot
f4b8aa0ed4 Bump version to 10.10.7
Some checks failed
Push & Release 🌍 / Automation 🎛️ (push) Has been cancelled
Push & Release 🌍 / Unstable release 🚀⚠️ (push) Has been cancelled
Push & Release 🌍 / Quality checks 👌🧪 (push) Has been cancelled
Push & Release 🌍 / GitHub CodeQL 🔬 (push) Has been cancelled
Push & Release 🌍 / Deploy 🚀 (push) Has been cancelled
2025-04-05 15:14:58 -04:00
rlauuzo
2413566327 Fix skip button not displaying correctly with OSD (#6583) 2025-04-03 10:32:50 -04:00
Bill Thornton
c3c598e1f4 Merge pull request #6510 from dmitrylyzo/fix-focus
Fix re-focusing on pause button when displaying OSD
2025-03-25 16:04:53 -04:00
Bill Thornton
78a8642d4a Merge pull request #6661 from dmitrylyzo/tizen-version 2025-03-25 10:53:18 -04:00
Dmitry Lyzo
76911509bc Fix parsing minor version of Tizen 2025-03-25 15:16:17 +03:00
Dmitry Lyzo
fb47403b72 Fix re-focusing on pause button when displaying OSD
When focus is debounced, `document.activeElement` is not updated
immediately, and someone (skipsegment.ts) might read it too early.

Remove focus debounce to immediately update `document.activeElement`.

This (undebounced focus) seems to work in webOS 1.2, webOS 5,
Firefox 134, Chrome 132. So the timeout was probably for
Internet Explorer.
2025-03-24 14:00:45 +03:00
Dmitry Lyzo
2ab61b6d7b Add container for skip button to make it focusable
FocusManager.isCurrentlyFocusableInternal doesn't work with
fixed elements.
2025-03-24 12:09:57 +03:00
Bill Thornton
16a084b009 Merge pull request #6570 from nielsvanvelzen/plugin-page-name
Fix catalog plugin page not setting page title
2025-02-25 13:50:18 -05:00
Niels van Velzen
489731863b Fix catalog plugin page not setting page title 2025-02-25 17:30:51 +01:00
Jellyfin Release Bot
c335a3024e Bump version to 10.10.6 2025-02-16 16:55:44 -05:00
Bill Thornton
d3054985a5 Merge pull request #6509 from dmitrylyzo/fix-nav-regression 2025-02-09 06:28:48 +00:00
Dmitry Lyzo
0f598073a8 Fix navigation for emby-select element
Regression 84563176a1
If we prevent default action, keyboard navigation won't work.
2025-02-02 21:49:45 +03:00
Bill Thornton
5d8ab6a99b Merge pull request #6496 from dmitrylyzo/skip-prevented-keyboard-event 2025-01-31 10:18:30 -05:00
Dmitry Lyzo
84563176a1 Skip prevented keyboard event 2025-01-31 01:52:37 +03:00
Bill Thornton
4793223f5d Merge pull request #6396 from Kevinjil/fix-mediasourceid
Remove invalid item id usage as media source id
2025-01-29 14:41:03 -05:00
Kevin Jilissen
8f64beec30 Remove invalid item id usage as media source id
Looking at the change history, an ` || item.Id` was introduced in
4c31742cc5 to query for the item, but
this workaround is only needed for track selection in some cases and
breaks playback in others. Only apply it when a track is selected.
2025-01-28 18:08:29 +01:00
Jellyfin Release Bot
e8e4ff0ca9 Bump version to 10.10.5 2025-01-25 14:14:30 -05:00
Bill Thornton
9b3fc622c9 Merge pull request #6462 from dmitrylyzo/fix-target-fps 2025-01-22 19:49:55 -05:00
Jellyfin Release Bot
8994299490 Bump version to 10.10.4 2025-01-21 21:20:14 -05:00
Dmitry Lyzo
36aa4dcd88 Use reference framerate as sampling rate (target FPS) for SubtitlesOctopus 2025-01-21 22:43:37 +03:00
Dmitry Lyzo
2f6781a7c2 Use average framerate as sampling rate (target FPS) for SubtitlesOctopus 2025-01-21 13:31:00 +03:00
Bill Thornton
7a07a79b12 Merge pull request #6453 from thornbill/fix-player-inset 2025-01-18 02:45:30 -05:00
Bill Thornton
88cc991fa5 Remove safe area padding on youtube container 2025-01-17 17:58:38 -05:00
Bill Thornton
8710de09d4 Merge pull request #6450 from thornbill/fix-menu-expand 2025-01-17 16:43:48 -05:00
Bill Thornton
14ff6474f3 Remove safe area padding on video container 2025-01-16 15:29:51 -05:00
Bill Thornton
bfa53b57f4 Fix menu closing when expanding section 2025-01-16 11:50:02 -05:00
rlauuzo
4f17cebc02 Prevent Focus Loss When Skip Button is Pressed (#6413)
* Prevent Focus Loss When Skip Button is Pressed

* Implement the suggested changes

* Update index.js

* Ensures focus shifts to the pause button

* Apply suggested changes

---------

Co-authored-by: rlauu <46294892+rlauu@users.noreply.github.com>
2025-01-13 10:55:08 -05:00
Bill Thornton
700e72b409 Merge pull request #6433 from thornbill/fix-home-tabs-crash 2025-01-09 22:10:55 -05:00
dantesbr
cc011feffb Fix focus loss on popups in Samsung Tizen 8 Smart TVs (#6408) 2025-01-09 20:32:42 -05:00
Bill Thornton
d4b55ec67a Merge pull request #6425 from bernarden/bugfix/6422-unsupported-max-css-function-in-chrome-76 2025-01-09 20:29:14 -05:00
Bill Thornton
d1aa2f3685 Fix main tab manager crash in experimental layout 2025-01-09 17:11:20 -05:00
Victor Usoltsev
321822c57f Fix css fallback of max function in chrome 76. 2025-01-08 18:28:30 +13:00
Bill Thornton
e1deddcba1 Merge pull request #6421 from viown/fix-metadata-outer-click
Fix metadata dialog backdrop click to exit
2025-01-03 16:49:01 -05:00
Bill Thornton
b797ca4e1e Merge pull request #6352 from viown/fix-parental-control-select
Fix maximum allowed parental rating not showing up
2025-01-03 14:37:50 -05:00
Bill Thornton
74a209ed63 Merge pull request #6324 from carsso/fix-spinner-direction
Fix spinner direction (should be clockwise) in @keyframes spin
2025-01-03 13:56:26 -05:00
viown
a553ef54f6 Fix metadata outer click 2025-01-02 13:45:35 +03:00
Bill Thornton
5b4cfbf410 Merge pull request #6362 from nyanmisaka/sw-tonemap-by-default 2024-12-29 15:32:47 -05:00
Bill Thornton
e15d700d40 Merge pull request #6317 from dmitrylyzo/tizen8-no-secondary-audio 2024-12-29 15:29:37 -05:00
Bill Thornton
3d20694109 Merge pull request #6388 from viown/fix-profile-refresh 2024-12-29 15:24:31 -05:00
Bill Thornton
469abcc517 Merge pull request #6373 from gnattu/fix-safari-opus-stereo 2024-12-29 14:24:51 -05:00
viown
26df03b64c Enable TV Support for 'Ask to Skip' (#6295) 2024-12-29 14:21:06 -05:00
gnattu
8f7974d5c6 Remove redundant channel limit 2024-12-22 01:58:56 +08:00
viown
206f70cf34 Fix async route page refresh 2024-12-15 14:07:22 +03:00
gnattu
92caea08af Prevent opus more than 2 channels being remux on Safari
Safari only supports stereo Opus, which requires a similar workaround as we are applying on WebOS for FLAC.
2024-12-11 14:50:57 +08:00
nyanmisaka
a3872ffa25 Enable software tone-mapping by default
Signed-off-by: nyanmisaka <nst7999610810@gmail.com>
2024-12-03 22:19:15 +08:00
viown
63834e164a Remove redundant check 2024-11-28 22:48:26 +03:00
viown
9e4e3b0106 Fix maximum allowed parental rating not showing up 2024-11-27 23:00:25 +03:00
Dmitry Lyzo
a91e44828b Don't use AudioTrack API on Tizen 8+ 2024-11-27 15:21:40 +03:00
Bill Thornton
92e8821003 Merge pull request #6338 from solidsnake1298/tdp-embedded-checkbox 2024-11-23 23:02:22 -05:00
Germain Carré
306390179b Fixing spinner direction (should be clockwise) and removing duplicate animation @keyframes spin 2024-11-23 15:37:03 +01:00
TheDreadPirate
4fb33badef Correcting type for Prefer embedded episode info checkbox 2024-11-22 14:12:32 -05:00
Bill Thornton
1496542381 Merge pull request #6329 from nielsvanvelzen/fix-lyric-sort 2024-11-19 19:03:34 -05:00
Niels van Velzen
e22187247b Fix changing lyric fetcher order not changeable in library options 2024-11-19 22:23:46 +01:00
Jellyfin Release Bot
b95dad4ba2 Bump version to 10.10.3 2024-11-18 22:38:44 -05:00
Bill Thornton
298399802a Merge pull request #6326 from thornbill/10.10.3-translations
Backport translations for 10.10.3
2024-11-18 16:05:28 -05:00
burghy86
53a91227d7 Translated using Weblate (Italian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/it/
2024-11-18 15:41:34 -05:00
koreapyj
d5ccc0ea37 Translated using Weblate (Korean)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ko/
2024-11-18 15:41:34 -05:00
koreapyj
c190f7b770 Translated using Weblate (Korean)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ko/
2024-11-18 15:41:34 -05:00
Jellyfin Release Bot
d69468a95a Bump version to 10.10.2 2024-11-16 14:59:27 -05:00
Joshua M. Boniface
0c61dff5c5 Merge pull request #6321 from thornbill/10.10.2-translations
Backport translations for 10.10.2 again
2024-11-16 13:26:32 -05:00
Jamoliddin Rakhmonberdiev
5479d18082 Translated using Weblate (Uzbek)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/uz/
2024-11-15 12:40:36 -05:00
Jamoliddin Rakhmonberdiev
e13668530d Translated using Weblate (Uzbek)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/uz/
2024-11-15 12:40:36 -05:00
NickSkier
32d7a962ff Translated using Weblate (Russian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ru/
2024-11-15 12:40:36 -05:00
Johan Dixelius
f01b45fb04 Translated using Weblate (Swedish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sv/
2024-11-15 12:40:36 -05:00
GolanGitHub
38d9b6b528 Translated using Weblate (Spanish (Argentina))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_AR/
2024-11-15 12:40:36 -05:00
Simon-Pierre Corriveau
77ebe19f40 Translated using Weblate (French (Canada))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr_CA/
2024-11-15 12:40:35 -05:00
nextlooper42
6095248f6e Translated using Weblate (Slovak)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sk/
2024-11-15 12:40:35 -05:00
George Vella
5725554085 Translated using Weblate (Maltese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/mt/
2024-11-15 12:40:35 -05:00
koreapyj
b98d74de33 Translated using Weblate (Korean)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ko/
2024-11-15 12:40:35 -05:00
l00d3r
bfceb43602 Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/et/
2024-11-15 12:40:35 -05:00
Blackspirits
e54b19e2d4 Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_PT/
2024-11-15 12:40:35 -05:00
darkabella
2d459c75dc Translated using Weblate (Catalan)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ca/
2024-11-15 12:40:35 -05:00
Aindriú Mac Giolla Eoin
8a2789e316 Translated using Weblate (Irish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ga/
2024-11-15 12:40:35 -05:00
Aindriú Mac Giolla Eoin
99edacc08d Translated using Weblate (Irish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ga/
2024-11-15 12:40:35 -05:00
koreapyj
377c0e3bdb Translated using Weblate (Korean)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ko/
2024-11-15 12:40:35 -05:00
Bill Thornton
d56ff77308 Merge pull request #6311 from thornbill/10.10.2-translations 2024-11-10 09:44:37 -05:00
MisterCry
6391ccac1b Translated using Weblate (French)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/
2024-11-10 02:33:15 -05:00
Kristian
08f7477813 Translated using Weblate (Croatian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hr/
2024-11-10 02:33:15 -05:00
Frederik Palmø
2f7e751359 Translated using Weblate (Danish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/da/
2024-11-10 02:33:15 -05:00
Rainer Geiger
8a569d3692 Translated using Weblate (German)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/
2024-11-10 02:33:15 -05:00
Jose Riha
df79405af0 Translated using Weblate (Slovak)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sk/
2024-11-10 02:33:15 -05:00
Quang Minh Nguyen
be2c8a0afc Translated using Weblate (Vietnamese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/vi/
2024-11-10 02:33:15 -05:00
Kamran Imami
6c588dcb8f Translated using Weblate (Persian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fa/
2024-11-10 02:33:15 -05:00
electreo
00c7999ad4 Translated using Weblate (Bulgarian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/bg/
2024-11-10 02:33:15 -05:00
Kristyan Petrov Georgiev
1cdda2f8f6 Translated using Weblate (Bulgarian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/bg/
2024-11-10 02:33:15 -05:00
saleem0915
ef42d9c8b4 Translated using Weblate (Japanese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ja/
2024-11-10 02:33:15 -05:00
Andi Chandler
8acc33705c Translated using Weblate (English (United Kingdom))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/en_GB/
2024-11-10 02:33:15 -05:00
kimpig
7769137bff Translated using Weblate (Korean)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ko/
2024-11-10 02:33:15 -05:00
Rafael Morine
5728b5e5d4 Translated using Weblate (Russian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ru/
2024-11-10 02:33:15 -05:00
p0358
13318e805f Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/
2024-11-10 02:33:15 -05:00
Nyanmisaka
132c6ca858 Translated using Weblate (Chinese (Simplified Han script))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2024-11-10 02:33:15 -05:00
stanol
f8e109bbc3 Translated using Weblate (Ukrainian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/uk/
2024-11-10 02:33:15 -05:00
Frederik Palmø
1562606b28 Translated using Weblate (Danish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/da/
2024-11-10 02:33:15 -05:00
Roi Gabay
9fa5e438d9 Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/
2024-11-10 02:33:15 -05:00
Lukáš Kucharczyk
b683becaf7 Translated using Weblate (Czech)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/
2024-11-10 02:33:15 -05:00
Robin Lavigne
9cbab78cc1 Translated using Weblate (French)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/
2024-11-10 02:33:15 -05:00
Tomi
05e5aa744d Translated using Weblate (Finnish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fi/
2024-11-10 02:33:15 -05:00
hoanghuy309
2e4986c497 Translated using Weblate (Vietnamese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/vi/
2024-11-10 02:33:15 -05:00
Kityn
c42d7b3f5d Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/
2024-11-10 02:33:15 -05:00
Justin
c60a0190ff Translated using Weblate (German)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/
2024-11-10 02:33:15 -05:00
hoanghuy309
b7bbadb2df Translated using Weblate (Vietnamese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/vi/
2024-11-10 02:33:15 -05:00
Frostslayer
837884c337 Translated using Weblate (Portuguese (Brazil))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_BR/
2024-11-10 02:33:15 -05:00
Bas
3143a08a33 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-11-10 02:33:15 -05:00
Roi Gabay
bdcf6186ce Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/
2024-11-10 02:33:15 -05:00
Roi Gabay
3d9d1f5ae3 Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/
2024-11-10 02:33:15 -05:00
Roi Gabay
bd0c43d6c8 Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/
2024-11-10 02:33:15 -05:00
Roi Gabay
c5934d08de Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/
2024-11-10 02:33:15 -05:00
Roi Gabay
dec3d2ac19 Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/
2024-11-10 02:33:15 -05:00
Roi Gabay
25354caf8f Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/
2024-11-10 02:33:15 -05:00
jh
3897704a40 Translated using Weblate (Danish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/da/
2024-11-10 02:33:15 -05:00
Bill Thornton
133273a3e8 Merge pull request #6303 from Arcus92/pgs-clear-fix 2024-11-07 15:18:07 -05:00
David Schulte
67996d3a96 Updated dependency libpgs to v0.8.1. Fixed incomplete subtitle clearing. 2024-11-07 20:01:14 +01:00
Bill Thornton
048d3f1e2c Merge pull request #6298 from viown/fix-pdf-display
Fix large PDF Display
2024-11-05 10:39:48 -05:00
viown
e8f9bfcf57 Fix PDF Display 2024-11-04 20:27:43 +03:00
Bill Thornton
22ae941a9a Merge pull request #6291 from Arcus92/pgs-fix-position
Update dependency libpgs to v0.8.0
2024-11-04 12:24:10 -05:00
Bill Thornton
5c55e458dd Merge pull request #6297 from thornbill/include-theme-images
Fix missing theme images
2024-11-04 11:04:39 -05:00
Bill Thornton
f35893d0a1 Fix missing theme images 2024-11-04 10:25:36 -05:00
Jellyfin Release Bot
2f2844c33f Bump version to 10.10.1 2024-11-03 10:57:49 -05:00
Bill Thornton
026893e78b Merge pull request #6285 from thornbill/10.10.1-translations 2024-11-03 10:30:12 -05:00
David Schulte
1ab22fc258 Updated dependency libpgs to v0.8.0. Fixed subtitle positioning, implemented custom aspect-ratio and cropping. 2024-11-03 12:54:28 +01:00
viown
ed3671a536 Always show enabled filters (#6286) 2024-11-01 17:22:14 -04:00
Roi Gabay
f43402d284 Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/
2024-11-01 14:21:30 -04:00
Roi Gabay
bfd1e9123a Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/
2024-11-01 14:21:30 -04:00
Roi Gabay
13e6766e09 Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/
2024-11-01 14:21:30 -04:00
Blackspirits
ca45ddfd18 Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt/
2024-11-01 14:21:30 -04:00
Blackspirits
02f9d28423 Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_PT/
2024-11-01 14:21:30 -04:00
Bas
3c287626f2 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-11-01 14:21:30 -04:00
millallo
a1b78b3557 Translated using Weblate (Italian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/it/
2024-11-01 14:21:30 -04:00
Andi Chandler
ef68930e52 Translated using Weblate (English (United Kingdom))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/en_GB/
2024-11-01 14:21:30 -04:00
Roi Gabay
4e18e36fa0 Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/
2024-11-01 14:21:30 -04:00
Roi Gabay
cee58c742e Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/
2024-11-01 14:21:30 -04:00
Roi Gabay
caa677b643 Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/
2024-11-01 14:21:30 -04:00
Gabriel Santana
9ab418c69d Translated using Weblate (Portuguese (Brazil))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_BR/
2024-11-01 14:21:30 -04:00
Roi Gabay
d037fc12c3 Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/
2024-11-01 14:21:30 -04:00
Spiros Vita
281298b55d Translated using Weblate (Greek)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/el/
2024-11-01 14:21:30 -04:00
Daniel
cafbd93ecd Translated using Weblate (German)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/
2024-11-01 14:21:30 -04:00
Roi Gabay
6f24b334f9 Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/
2024-11-01 14:21:30 -04:00
Roi Gabay
9c18db984c Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/
2024-11-01 14:21:30 -04:00
Blackspirits
30871d0a21 Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt/
2024-11-01 14:21:30 -04:00
Blackspirits
bd98a7ae15 Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_PT/
2024-11-01 14:21:30 -04:00
Roi Gabay
be5a12a263 Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/
2024-11-01 14:21:30 -04:00
Blackspirits
35dd9a1970 Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt/
2024-11-01 14:21:30 -04:00
Blackspirits
0271bf4c82 Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_PT/
2024-11-01 14:21:30 -04:00
Frostslayer
2b80c59ab7 Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt/
2024-11-01 14:21:30 -04:00
Frostslayer
928663c3e8 Translated using Weblate (Portuguese (Brazil))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_BR/
2024-11-01 14:21:30 -04:00
Antonios
ae76e82f7d Translated using Weblate (Greek)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/el/
2024-11-01 14:21:30 -04:00
Blackspirits
e69dcbfa03 Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt/
2024-11-01 14:21:30 -04:00
Blackspirits
66e641199e Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_PT/
2024-11-01 14:21:29 -04:00
gendelo3
c54a203128 Translated using Weblate (German)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/
2024-11-01 14:21:29 -04:00
Blackspirits
5a9b511a16 Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt/
2024-11-01 14:21:29 -04:00
Blackspirits
b012884a8e Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_PT/
2024-11-01 14:21:29 -04:00
millallo
ef24aa319f Translated using Weblate (Italian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/it/
2024-11-01 14:21:29 -04:00
hoanghuy309
828a49f6bd Translated using Weblate (Vietnamese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/vi/
2024-11-01 14:21:29 -04:00
Frederik Palmø
81fdf371f1 Translated using Weblate (Danish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/da/
2024-11-01 14:21:29 -04:00
Frederik Palmø
f3ffd327fc Translated using Weblate (Danish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/da/
2024-11-01 14:21:29 -04:00
Lukáš Kucharczyk
43c9f853e3 Translated using Weblate (Czech)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/
2024-11-01 14:21:29 -04:00
NOV
965182e538 Translated using Weblate (French)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/
2024-11-01 14:21:29 -04:00
Andrejs
a6307eb8c8 Translated using Weblate (Latvian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/lv/
2024-11-01 14:21:29 -04:00
queeup
7de923ba74 Translated using Weblate (Turkish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/tr/
2024-11-01 14:21:29 -04:00
Bill Thornton
c5cc093fba Merge pull request #6284 from thornbill/exclude-files
Exclude unneeded files from build output
2024-11-01 14:20:12 -04:00
Marissa
6d37cfcd1b Fix missing transcoding speed info (#6199)
* Fix missing transcoding speed info https://github.com/jellyfin/jellyfin-web/issues/6198

* Use ReferenceFrameRate by default

---------

Co-authored-by: Bill Thornton <thornbill@users.noreply.github.com>
2024-11-01 14:19:31 -04:00
Bill Thornton
9ff9f05a26 Merge pull request #6276 from thornbill/plugin-categories
Update plugin category labels
2024-11-01 14:19:05 -04:00
Bill Thornton
2ed3965197 Merge pull request #6278 from dmitrylyzo/fix-tizen-secondary-subtitles
Fix displaying secondary subtitles on Tizen 5
2024-11-01 11:56:02 -04:00
Bill Thornton
ad8868a996 Merge pull request #6274 from viown/make-filtering-local
Make filtering local to each device
2024-11-01 11:54:50 -04:00
Bill Thornton
1761dd1cfc Exclude unneeded files from build output 2024-11-01 10:33:09 -04:00
Bill Thornton
d365dd1b98 Merge pull request #6282 from viown/add-hash-to-filenames
Add content hash to CSS files
2024-11-01 10:31:18 -04:00
Bill Thornton
05de692675 Update plugin category labels 2024-11-01 10:02:19 -04:00
viown
89b5e44870 Add content hash to CSS files 2024-11-01 11:35:25 +03:00
Dmitry Lyzo
be324cca22 Fix displaying secondary subtitles on Tizen 5 2024-10-31 11:18:33 +03:00
rlauuzo
3311a1407f Show Skip Button When 'Next Video Info Overlay' is Disabled (#6258)
* Show Skip Button When 'Next Video Info Overlay' is Disabled

* Update skipsegment.ts

* Apply Suggestions

Co-authored-by: Bill Thornton <thornbill@users.noreply.github.com>

* Apply Suggestions

Co-authored-by: Bill Thornton <thornbill@users.noreply.github.com>

---------

Co-authored-by: rlauu <46294892+rlauu@users.noreply.github.com>
Co-authored-by: Bill Thornton <thornbill@users.noreply.github.com>
2024-10-30 13:18:33 -04:00
viown
d4eae7bde6 Add missing episode filter settings 2024-10-30 18:50:48 +03:00
viown
c0a9f8b544 Make filtering local to device 2024-10-29 21:28:50 +03:00
viown
18ea570ea1 Save filtering and sort fields only 2024-10-29 12:07:18 +03:00
Bill Thornton
7ccc494a5b Merge pull request #6266 from viown/make-ask-to-skip-default
Make ask to skip the default for 'Intro' and 'Outro' segments
2024-10-28 12:56:35 -04:00
Bill Thornton
71ab6fea5d Merge pull request #6265 from thornbill/safe-plugin-dates
Add support for plugin revisions with bad timestamps
2024-10-28 12:53:08 -04:00
viown
acde0685b5 Use a constant for defaults 2024-10-28 17:36:10 +03:00
Bill Thornton
3062f0f38c Add support for plugin revisions with bad timestamps 2024-10-28 10:12:33 -04:00
viown
37be617523 Make 'ask to skip' the default for intro and outro segments 2024-10-28 17:12:07 +03:00
viown
6f7ece6592 Remove letter filter from loadQuerySettings 2024-10-28 14:51:57 +03:00
viown
ae5afd9ea7 Don't persist letter filter when querying 2024-10-28 14:35:08 +03:00
Jellyfin Release Bot
d4d84d0a18 Bump version to 10.10.0 2024-10-26 13:32:54 -04:00
Blackspirits
31b89b375c Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt/
2024-10-26 06:41:38 -04:00
stanol
8720e02f8f Translated using Weblate (Ukrainian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/uk/
2024-10-26 06:41:38 -04:00
nextlooper42
9ea33d21a6 Translated using Weblate (Slovak)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sk/
2024-10-26 06:41:37 -04:00
Blackspirits
d7ee1e55fa Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_PT/
2024-10-26 06:41:37 -04:00
Blackspirits
7d88cf4688 Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt/
2024-10-26 04:41:37 -04:00
Blackspirits
8c5e31f3e0 Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_PT/
2024-10-26 04:41:37 -04:00
Lukáš Kucharczyk
c4363dd27b Translated using Weblate (Czech)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/
2024-10-26 04:41:37 -04:00
Blackspirits
d920bd7c8a Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt/
2024-10-26 02:41:38 -04:00
hoanghuy309
cec009ca94 Translated using Weblate (Vietnamese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/vi/
2024-10-26 02:41:38 -04:00
Blackspirits
5d50060333 Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_PT/
2024-10-26 02:41:37 -04:00
Kityn
a2f2b52106 Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/
2024-10-26 02:41:37 -04:00
felix920506
18a9983ac8 Translated using Weblate (Chinese (Traditional Han script))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant/
2024-10-25 20:41:38 -04:00
Nyanmisaka
b890956a3a Translated using Weblate (Chinese (Simplified Han script))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2024-10-25 20:41:38 -04:00
Bas
d272efd865 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-10-25 20:41:37 -04:00
Bill Thornton
207318c302 Merge pull request #6247 from jellyfin/renovate/jellyfin-sdk-0.x
Update dependency @jellyfin/sdk to v0.0.0-unstable.202410250501
2024-10-25 17:20:08 -04:00
Bill Thornton
3fb114372c Merge pull request #6246 from jellyfin/renovate/ci-deps
Update CI dependencies
2024-10-25 17:19:07 -04:00
Bill Thornton
fa1934a124 Merge pull request #6196 from viown/prompt-to-skip
Add 'ask to skip' to media segments
2024-10-25 17:18:30 -04:00
viown
8cc23f2882 Remove undefined MediaSegmentType 2024-10-25 21:01:23 +03:00
viown
d8db0ba226 Remove check for outro 2024-10-25 20:58:37 +03:00
Frostslayer
6ae494e07d Translated using Weblate (Portuguese (Brazil))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_BR/
2024-10-25 13:41:37 -04:00
George (Georgios) Vasilakis
6ed7d02eeb Translated using Weblate (Greek)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/el/
2024-10-25 13:41:37 -04:00
Bas
1bfa279735 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-10-25 10:41:37 -04:00
Rafael Morine
2e1eb5396c Translated using Weblate (Russian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ru/
2024-10-25 06:41:37 -04:00
renovate[bot]
c2918cacb1 Update dependency @jellyfin/sdk to v0.0.0-unstable.202410250501 2024-10-25 06:09:58 +00:00
hoanghuy309
0a75c18151 Translated using Weblate (Vietnamese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/vi/
2024-10-25 01:41:37 -04:00
Frostslayer
7255df6b08 Translated using Weblate (Portuguese (Brazil))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_BR/
2024-10-24 17:41:37 -04:00
Bill Thornton
3823cc2b76 Merge pull request #6252 from thornbill/fix-metadata-dashboard-label
Fix drawer label for the dashboard metadata page
2024-10-24 17:01:13 -04:00
Bill Thornton
005fcec49c Fix drawer label for the dashboard metadata page 2024-10-24 16:17:34 -04:00
Bill Thornton
de87916c36 Merge pull request #6244 from thornbill/fix-playing-parts 2024-10-24 13:34:14 -04:00
renovate[bot]
0f6ecd2514 Update CI dependencies 2024-10-24 17:08:14 +00:00
Aldair Guzmán
a9586d412e Translated using Weblate (Spanish (Latin America))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_419/
2024-10-24 11:41:37 -04:00
Aldair Guzmán
f0ec0b8462 Translated using Weblate (Spanish (Latin America))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_419/
2024-10-24 07:41:36 -04:00
viown
11e4549b48 Use PlayerEvent constant 2024-10-24 12:37:38 +03:00
viown
459d0d7d9a Merge branch 'master' into prompt-to-skip 2024-10-24 12:34:55 +03:00
viown
87f2acaf40 Fix import 2024-10-24 12:34:52 +03:00
Bill Thornton
571b28099e Fix unhandled promises 2024-10-24 01:35:04 -04:00
Bill Thornton
1e45729850 Merge pull request #6241 from jellyfin/renovate/jellyfin-sdk-0.x 2024-10-23 19:38:27 -04:00
Bill Thornton
6530d2d7d8 Fix playing episodes when additional parts exist 2024-10-23 17:13:16 -04:00
Bill Thornton
9f8905989f Merge pull request #6243 from jellyfin/renovate/ci-deps 2024-10-23 12:20:16 -04:00
renovate[bot]
50d8c727f5 Update actions/checkout action to v4.2.2 2024-10-23 15:41:48 +00:00
stanol
68ffb211ae Translated using Weblate (Ukrainian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/uk/
2024-10-23 06:41:37 -04:00
John Doe
2b10b6c74b Translated using Weblate (Finnish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fi/
2024-10-23 06:41:37 -04:00
renovate[bot]
64efe8e0ca Update dependency @jellyfin/sdk to v0.0.0-unstable.202410230556 2024-10-23 08:24:53 +00:00
Bill Thornton
ddc26d30d6 Merge pull request #6233 from jellyfin/renovate/jellyfin-sdk-0.x 2024-10-22 17:11:48 -04:00
Bill Thornton
7dfdd7c9c1 Merge pull request #6238 from jellyfin/renovate/ci-deps 2024-10-22 16:58:16 -04:00
Bill Thornton
b807aaf148 Merge pull request #6240 from thornbill/fix-nonstandard-tag-label 2024-10-22 16:47:07 -04:00
Bill Thornton
68413a09f0 Merge pull request #6239 from thornbill/video-osd-cleanup 2024-10-22 16:46:38 -04:00
Bill Thornton
f8f1ef0ae5 Fix capitalization of PreferNonstandardArtistsTag label 2024-10-22 16:38:48 -04:00
Bill Thornton
865046e668 Use async/await when getting playlist 2024-10-22 16:34:25 -04:00
Bill Thornton
a2e0f52297 Fix for niels OCD 2024-10-22 16:22:50 -04:00
Bill Thornton
f2b8c5e489 Fix order for 1hitsong OCD 2024-10-22 16:08:31 -04:00
Bill Thornton
29309bc4b8 Unhide next/prev track buttons if playlist has more items 2024-10-22 15:43:15 -04:00
Bas
f9b70339d6 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-10-22 15:41:36 -04:00
Bill Thornton
a72dd37ef0 Hide favorite button from osd on small screens 2024-10-22 15:41:24 -04:00
renovate[bot]
33fde51677 Update github/codeql-action action to v3.27.0 2024-10-22 18:33:26 +00:00
nicito
b40f68db12 Translated using Weblate (Bulgarian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/bg/
2024-10-22 11:41:37 -04:00
renovate[bot]
561e593990 Update dependency @jellyfin/sdk to v0.0.0-unstable.202410220501 2024-10-22 06:10:36 +00:00
Bill Thornton
d60a6182ca Merge pull request #6236 from jellyfin/renovate/ci-deps 2024-10-21 22:42:03 -04:00
Bill Thornton
ead56660c4 Merge pull request #6234 from jellyfin/renovate/vitest 2024-10-21 22:16:08 -04:00
renovate[bot]
db47fa11eb Update actions/dependency-review-action action to v4.3.5 2024-10-22 00:43:13 +00:00
Bas
ca2c37c04e Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-10-21 14:41:36 -04:00
Blackspirits
2493e34fa0 Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt/
2024-10-21 11:41:37 -04:00
Blackspirits
263830109a Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_PT/
2024-10-21 11:41:36 -04:00
renovate[bot]
6d74cf44a2 Update Vitest to v2.1.3 2024-10-21 14:56:59 +00:00
Tyler
a0b70bbf22 Translated using Weblate (Afrikaans)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/af/
2024-10-21 08:32:49 -04:00
Roi Gabay
a7cf87f1b3 Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/
2024-10-20 17:41:36 -04:00
Bill Thornton
c2a37cfd58 Merge pull request #6230 from jellyfin/renovate/jellyfin-sdk-0.x 2024-10-20 15:31:59 -04:00
Bill Thornton
38ab2c168b Merge pull request #6231 from gnattu/fix-parental-tags 2024-10-20 15:31:02 -04:00
gnattu
e17d50f438 Cleanup functions 2024-10-20 23:28:18 +08:00
gnattu
a1acb57ce1 Fix lint 2024-10-20 22:59:23 +08:00
gnattu
5b687f6a7d Unbind event listeners when unmounting 2024-10-20 22:56:17 +08:00
Jonas Vendel
669ac28d88 Translated using Weblate (Swedish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sv/
2024-10-20 10:41:36 -04:00
gnattu
bb17d58536 Use daysofweek and hours as key
This is better and any sane person should not set multiple schdules to be exactly the same
2024-10-20 22:39:50 +08:00
gnattu
95e935aede Fix lint 2024-10-20 22:28:03 +08:00
gnattu
3ae148f193 Use index as key for access schedule
Unfortuenately, the key is never populated in accessSchedule.js which cannot use that as a key for a list
2024-10-20 22:26:30 +08:00
gnattu
0ad0a6162b Add libraryMenu as dep 2024-10-20 22:21:36 +08:00
gnattu
d9786d4d24 Unset button style 2024-10-20 22:20:59 +08:00
gnattu
84f7cf1997 Use button 2024-10-20 22:17:50 +08:00
gnattu
7eda53f795 Use anchor for onClick 2024-10-20 22:15:26 +08:00
gnattu
88f9c3d31b Don’t use FIXME 2024-10-20 21:54:49 +08:00
gnattu
956f9bf7e4 Fix tags and schedule edit for parental control 2024-10-20 21:40:55 +08:00
Andrejs
568b5f607f Translated using Weblate (Latvian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/lv/
2024-10-20 07:41:36 -04:00
renovate[bot]
90b41c8389 Update dependency @jellyfin/sdk to v0.0.0-unstable.202410200501 2024-10-20 07:02:57 +00:00
Bill Thornton
1ed7ce8cd3 Merge pull request #6224 from viown/fix-undefined-sub-stream-index 2024-10-20 03:01:58 -04:00
BlueMöhre
5e5b3ab019 Use "Save" in Metadata Editor and remove "SaveChanges". (#6212) 2024-10-20 02:56:23 -04:00
Roi Gabay
078b188d0e Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/
2024-10-20 02:41:36 -04:00
Bill Thornton
ddba3130e0 Merge pull request #6135 from abdulmueid/vidaa-disable-hevc 2024-10-19 16:44:58 -04:00
Blackspirits
3f247b27d6 Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt/
2024-10-19 14:41:38 -04:00
AfmanS
e0c45956e7 Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_PT/
2024-10-19 14:41:37 -04:00
Blackspirits
27cff85aaa Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_PT/
2024-10-19 14:41:37 -04:00
Bill Thornton
a59865a2a7 Merge pull request #6226 from jellyfin/renovate/react 2024-10-19 13:44:53 -04:00
Bill Thornton
3595a1d059 Merge pull request #6181 from jellyfin/renovate/tanstack-query-monorepo 2024-10-19 13:42:09 -04:00
Bill Thornton
c6bf8929ec Merge pull request #6228 from jellyfin/renovate/jellyfin-sdk-0.x 2024-10-19 13:41:02 -04:00
viown
9b269296fe Use UpNextDialog for outro segments 2024-10-19 20:36:44 +03:00
Bill Thornton
05e138e1c0 Merge pull request #6180 from jellyfin/renovate/webpack 2024-10-19 13:34:26 -04:00
Bill Thornton
c3d3008af4 Merge pull request #6220 from jellyfin/renovate/postcss 2024-10-19 13:32:52 -04:00
renovate[bot]
665ccfac7f Update dependency @jellyfin/sdk to v0.0.0-unstable.202410191409 2024-10-19 17:29:37 +00:00
Bill Thornton
e66391888e Merge pull request #6227 from jellyfin/renovate/sass 2024-10-19 13:28:59 -04:00
Blackspirits
6c02aaab2b Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt/
2024-10-19 13:23:28 -04:00
Blackspirits
e0d2b19ed2 Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_PT/
2024-10-19 13:23:28 -04:00
AfmanS
9180465d56 Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_PT/
2024-10-19 13:23:28 -04:00
renovate[bot]
386562fec8 Update Sass to v1.79.5 2024-10-19 17:22:41 +00:00
Bill Thornton
a860b3a239 Merge pull request #6194 from jellyfin/renovate/material-ui-monorepo 2024-10-19 13:21:53 -04:00
viown
7ad7f07b7c Do nothing if there is 1 second left 2024-10-19 20:11:10 +03:00
viown
64b9ab2a19 Keep button for 8 seconds 2024-10-19 20:11:10 +03:00
viown
198d4b157c Rename to ask to skip 2024-10-19 20:11:10 +03:00
viown
0008f89267 Fix OSD event after player reset 2024-10-19 20:11:10 +03:00
viown
dfff2efefc Don't show prompt when segment <3s 2024-10-19 20:11:10 +03:00
viown
0fb38c6894 Add 'prompt to skip' to media segments 2024-10-19 20:11:10 +03:00
Abdul Mueid
316542c100 Vidaa OS web browser reports it supports HEVC but playback is glitchy. Tested on 2 models (U7 & U8). This commit disables HEVC on Vidaa OS browser profile and uses transcoding instead to play HEVC files.
With MKV disabled and hlsInTs, hevc videos work properly by remuxing on Hisense Vidaa OS. Tested on model 55U7QF.

Removed force disabling hevc as it is no longer required with hlsInTs
2024-10-19 13:07:56 -04:00
HiPotionQ8
effa74356b Translated using Weblate (Arabic)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ar/
2024-10-19 11:41:36 -04:00
renovate[bot]
0fa454aef3 Update React 2024-10-19 14:34:06 +00:00
Bill Thornton
2a2aa28583 Merge pull request #6225 from jellyfin/renovate/ci-deps 2024-10-19 10:33:20 -04:00
HiPotionQ8
ba4be06e00 Translated using Weblate (Arabic)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ar/
2024-10-19 10:13:19 -04:00
renovate[bot]
24d361fc7f Update CatChen/eslint-suggestion-action action to v4.1.7 2024-10-19 14:10:18 +00:00
Bill Thornton
01effc25d8 Merge pull request #6217 from jellyfin/renovate/jellyfin-sdk-0.x 2024-10-19 10:09:51 -04:00
renovate[bot]
eef48ddbad Update tanstack-query monorepo to v5.59.13 2024-10-19 11:36:00 +00:00
Bill Thornton
a8715d0181 Merge pull request #6223 from thornbill/strict-mode-strikes-again 2024-10-19 07:35:25 -04:00
viown
05ce167c77 Fix undefined subtitle stream index 2024-10-19 13:25:07 +03:00
Bas
9746bdfa60 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-10-19 05:41:37 -04:00
Roi Gabay
ceb0e8c7b0 Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/
2024-10-19 05:41:37 -04:00
renovate[bot]
9c4d22b0a1 Update dependency @jellyfin/sdk to v0.0.0-unstable.202410190501 2024-10-19 07:30:45 +00:00
Bill Thornton
7abe0270b4 Do not use strict mode for view manager pages 2024-10-19 01:48:25 -04:00
Bill Thornton
d330f93bae Revert "Add hack to prevent rerendering legacy views in development"
This reverts commit 4d9ad8381f.
2024-10-19 01:32:35 -04:00
Blackspirits
b6dcda1473 Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt/
2024-10-18 18:41:36 -04:00
Blackspirits
397a61d6e3 Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_PT/
2024-10-18 18:41:36 -04:00
Blackspirits
3fd62046bd Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt/
2024-10-18 16:41:37 -04:00
Blackspirits
1854493813 Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_PT/
2024-10-18 16:41:36 -04:00
Blackspirits
44fec34265 Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt/
2024-10-18 14:41:36 -04:00
Blackspirits
43d79cfade Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_PT/
2024-10-18 14:41:36 -04:00
Blackspirits
23c72ab8d4 Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt/
2024-10-18 12:41:37 -04:00
Blackspirits
f2be380859 Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_PT/
2024-10-18 12:41:37 -04:00
JP
4d63921116 Translated using Weblate (Lithuanian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/lt/
2024-10-18 12:41:36 -04:00
JP
e14f0ad0bb Translated using Weblate (Lithuanian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/lt/
2024-10-18 09:41:36 -04:00
Roi Gabay
8260a0b14a Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/
2024-10-18 09:41:36 -04:00
renovate[bot]
41f09edc84 Update dependency @mui/x-date-pickers to v7.20.0 2024-10-18 09:28:44 +00:00
renovate[bot]
6b115a0425 Update dependency webpack to v5.95.0 2024-10-17 20:36:13 +00:00
renovate[bot]
d875fe0729 Update dependency postcss-preset-env to v10.0.7 2024-10-17 20:35:44 +00:00
Bill Thornton
d3fc3689c1 Merge pull request #6205 from thornbill/no-rerender-hack
Add hack to prevent rerendering legacy views in development
2024-10-17 16:34:37 -04:00
無情天
8b67b3a67d Translated using Weblate (Chinese (Simplified Han script))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2024-10-17 14:41:36 -04:00
Bill Thornton
a43999d9c8 Merge pull request #6218 from jellyfin/renovate/babel
Update Babel to v7.25.8
2024-10-17 13:44:21 -04:00
renovate[bot]
cdb027405a Update Babel to v7.25.8 2024-10-17 13:54:23 +00:00
gendelo3
443f341cdc Translated using Weblate (German)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/
2024-10-17 06:41:36 -04:00
CGMads
6fb588129c Translated using Weblate (Danish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/da/
2024-10-17 04:41:36 -04:00
CGMads
d140962b95 Translated using Weblate (Danish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/da/
2024-10-17 03:04:07 -04:00
Bill Thornton
a5e45f6cab Merge pull request #6215 from thornbill/remove-osd-ratings 2024-10-17 02:29:30 -04:00
Bill Thornton
cd78bbd92f Merge pull request #6214 from thornbill/download-item 2024-10-17 02:28:31 -04:00
Bill Thornton
13c0dc0ea6 Remove ratings from video osd 2024-10-17 02:08:36 -04:00
Bill Thornton
0d2652ce58 Add base item to download params 2024-10-17 01:41:13 -04:00
AeRo
8b3a02c727 Fix queue when playing on remote device (partial) (#3381) 2024-10-16 21:27:10 -04:00
Highlandword9
2564902573 Translated using Weblate (English (United Kingdom))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/en_GB/
2024-10-16 13:41:36 -04:00
dickta
1e589303fe Translated using Weblate (Hungarian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hu/
2024-10-16 11:41:36 -04:00
Highlandword9
2a8f502ea7 Translated using Weblate (English (United Kingdom))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/en_GB/
2024-10-16 11:41:36 -04:00
Bill Thornton
9439d6e413 Merge pull request #6209 from jellyfin/renovate/jellyfin-sdk-0.x 2024-10-16 07:47:32 -04:00
Roi Gabay
6b57b1fd18 Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/
2024-10-16 06:08:36 -04:00
renovate[bot]
5059f71fcc Update dependency @jellyfin/sdk to v0.0.0-unstable.202410160502 2024-10-16 08:25:41 +00:00
Bill Thornton
3171523fa1 Merge pull request #6208 from jellyfin/renovate/typescript 2024-10-16 00:04:54 -04:00
Bill Thornton
db37ceda36 Merge pull request #6207 from jellyfin/renovate/hls.js-1.x 2024-10-16 00:04:29 -04:00
renovate[bot]
c40be076f1 Update dependency typescript to v5.6.3 2024-10-16 00:58:34 +00:00
renovate[bot]
8676ebaf9a Update dependency hls.js to v1.5.16 2024-10-16 00:58:11 +00:00
Bill Thornton
c4038debc9 Merge pull request #6195 from jellyfin/renovate/thollander-actions-comment-pull-request-3.x 2024-10-15 17:20:50 -04:00
Bill Thornton
810e3f2dd2 Update comment action variable names 2024-10-15 16:53:40 -04:00
Bill Thornton
6d6b35e36b Merge pull request #6206 from thornbill/seriously-10.6
Remove check for pre-10.6 server version
2024-10-15 16:46:00 -04:00
Bill Thornton
97aa442353 Remove check for pre-10.6 server version 2024-10-15 16:28:32 -04:00
Raphaël TISON
a133a33a00 Add unit tests for utils (#5412)
* add unit tests for Card utils

* add unit tests for DateFnsLocale utils

* fix lint

* add unit tests for Events utils

* fix lint

* fix lint
2024-10-15 16:22:10 -04:00
Bas
f57c089ae2 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-10-15 13:41:36 -04:00
Bill Thornton
4d9ad8381f Add hack to prevent rerendering legacy views in development 2024-10-15 11:44:14 -04:00
Bill Thornton
13e868212c Merge pull request #6204 from jellyfin/renovate/jellyfin-sdk-0.x 2024-10-15 09:04:03 -04:00
renovate[bot]
1eb5667d0e Update dependency @jellyfin/sdk to v0.0.0-unstable.202410150501 2024-10-15 10:43:38 +00:00
Bill Thornton
50dd1fb855 Merge pull request #6203 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v3.26.13
2024-10-14 16:44:30 -04:00
Bill Thornton
d12fcf7d32 Merge pull request #6100 from grafixeyehero/Refactoring-Section-Container
Refactoring Section Container
2024-10-14 16:16:34 -04:00
grafixeyehero
47995ae9a1 apply suggestion
Co-authored-by: Bill Thornton <thornbill@users.noreply.github.com>
2024-10-14 16:03:55 -04:00
grafixeyehero
12995545b9 Refactoring Section Container 2024-10-14 16:03:55 -04:00
renovate[bot]
949df873d1 Update github/codeql-action action to v3.26.13 2024-10-14 18:05:27 +00:00
Bill Thornton
c3e253d98d Merge pull request #6202 from jellyfin/renovate/jellyfin-sdk-0.x
Update dependency @jellyfin/sdk to v0.0.0-unstable.202410140501
2024-10-14 14:05:03 -04:00
renovate[bot]
7c9d56f0f8 Update dependency @jellyfin/sdk to v0.0.0-unstable.202410140501 2024-10-14 17:45:52 +00:00
Bill Thornton
fbb8687629 Merge pull request #6201 from thornbill/dompurify-2
Rollback to dompurify v2 for legacy support
2024-10-14 13:45:08 -04:00
Bill Thornton
016fc1fdba Disable dompurify major updates from renovate 2024-10-14 13:20:52 -04:00
Habibur Rahman
d9ad1bdd5e Translated using Weblate (Bengali (Bangladesh))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/bn_BD/
2024-10-14 12:41:36 -04:00
Bill Thornton
33663d4b73 Rollback to dompurify v2 for legacy support 2024-10-14 12:29:15 -04:00
Nyanmisaka
81d50e73e5 Translated using Weblate (Chinese (Simplified Han script))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2024-10-14 09:41:36 -04:00
Bill Thornton
b34eb711f5 Merge pull request #6197 from nyanmisaka/fix-txtQsvDevice 2024-10-14 07:50:08 -04:00
Nyanmisaka
3165736e3e Translated using Weblate (Chinese (Simplified Han script))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2024-10-14 07:41:36 -04:00
Anders
39ec804a5a Translated using Weblate (Danish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/da/
2024-10-14 05:41:36 -04:00
nyanmisaka
14fbd12f7d Fix incorrect 'required' attribute in txtQsvDevice
fixes a0b944b

Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2024-10-14 17:34:06 +08:00
Nyanmisaka
c4d0c428fb Translated using Weblate (Chinese (Simplified Han script))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2024-10-14 03:41:37 -04:00
Kityn
5de953347c Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/
2024-10-14 03:41:36 -04:00
Lukáš Kucharczyk
bbc5bf5a2d Translated using Weblate (Czech)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/
2024-10-14 03:41:36 -04:00
Bas
25cc8fdba8 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-10-14 01:41:36 -04:00
nextlooper42
82d963bd84 Translated using Weblate (Slovak)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sk/
2024-10-13 19:41:36 -04:00
NOV
a2f1024a58 Translated using Weblate (French)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/
2024-10-13 19:41:36 -04:00
renovate[bot]
1bcdd71a26 Update thollander/actions-comment-pull-request action to v3 2024-10-13 20:54:53 +00:00
Roi Gabay
f30a449ed6 Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/
2024-10-13 16:54:30 -04:00
NOV
653b607000 Translated using Weblate (French)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/
2024-10-13 16:54:30 -04:00
Bill Thornton
b6c194f321 Merge pull request #6192 from jellyfin/renovate/postcss
Update dependency postcss-preset-env to v10.0.6
2024-10-13 16:54:27 -04:00
Bill Thornton
f683339ea2 Merge pull request #6193 from jellyfin/renovate/linters
Update Linters
2024-10-13 16:53:06 -04:00
Bill Thornton
9c405e9360 Merge pull request #6184 from thornbill/playlist-editor
Add playlist editing
2024-10-13 16:50:49 -04:00
Bill Thornton
3ad0fb02e4 Move validation checks earlier 2024-10-13 16:41:25 -04:00
Mateusz
941f0e72a4 Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/
2024-10-13 16:38:05 -04:00
NOV
97040a8324 Translated using Weblate (French)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/
2024-10-13 16:38:05 -04:00
Bill Thornton
a7185ed750 Merge pull request #6157 from thornbill/media-segment-actions
Add media segment skipping
2024-10-13 16:38:01 -04:00
renovate[bot]
a06a837339 Update Linters 2024-10-13 17:01:19 +00:00
renovate[bot]
855e8a4aec Update dependency postcss-preset-env to v10.0.6 2024-10-13 16:59:34 +00:00
Bill Thornton
5b4a527358 Merge pull request #6186 from jellyfin/renovate/jellyfin-sdk-0.x 2024-10-13 12:59:13 -04:00
Bill Thornton
c82f49c882 Merge pull request #6084 from jellyfin/renovate/ci-deps 2024-10-13 12:58:42 -04:00
nextlooper42
af20470b4a Translated using Weblate (Slovak)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sk/
2024-10-13 12:41:36 -04:00
Bill Thornton
a37388b2e3 Prevent blank playlist names 2024-10-13 12:36:08 -04:00
Bill Thornton
363171b56d Add playlist editing 2024-10-13 12:36:08 -04:00
Bill Thornton
9a192c7e5c Merge pull request #6191 from jellyfin/ci-fix 2024-10-13 12:34:52 -04:00
Fernando Fernández
7f59551d51 Fix incorrect commit input 2024-10-13 18:22:22 +02:00
renovate[bot]
faddb0d3ff Update CI dependencies 2024-10-13 16:04:51 +00:00
Bill Thornton
fbe04ea0a5 Merge pull request #6063 from ferferga/ci-rework
Securize CI, reusable workflows, simplifications
2024-10-13 12:04:13 -04:00
Nyanmisaka
164986dbcf Translated using Weblate (Chinese (Simplified Han script))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2024-10-13 09:41:36 -04:00
Kityn
05a78ef92b Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/
2024-10-13 05:41:36 -04:00
Bas
5713b38b98 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-10-13 05:41:36 -04:00
Martin
7e4921f1dc Fix blurry pdf player rendering for all viewport sizes (#6182) 2024-10-13 04:24:08 -04:00
Bill Thornton
a0b944b299 Merge pull request #6004 from evanjarrett/qsv-renderdevice 2024-10-13 04:16:47 -04:00
Bill Thornton
aef9482824 Prevent skipping when seeking back to segment 2024-10-13 03:42:45 -04:00
renovate[bot]
9e431c57c1 Update dependency @jellyfin/sdk to v0.0.0-unstable.202410130501 2024-10-13 07:12:36 +00:00
Bill Thornton
9942fb7856 Apply suggestions from code review
Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com>
2024-10-13 01:29:36 -04:00
Andrew Siegman
a118fa0f63 Translated using Weblate (French (Canada))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr_CA/
2024-10-12 21:41:36 -04:00
Andrew Siegman
f6585414b2 Translated using Weblate (French)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/
2024-10-12 20:01:17 -04:00
Justin
b6b398282c Translated using Weblate (German)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/
2024-10-12 20:01:17 -04:00
hoanghuy309
5fb4944912 Translated using Weblate (Vietnamese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/vi/
2024-10-12 11:41:36 -04:00
BryanHuas
ce0c8da0e6 Translated using Weblate (Spanish (Mexico))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_MX/
2024-10-12 11:41:36 -04:00
r00tl34k
59505fa305 Translated using Weblate (Spanish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es/
2024-10-11 23:41:36 -04:00
Roi Gabay
cc09a88a2a Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/
2024-10-11 14:41:36 -04:00
Roi Gabay
125e27563d Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/
2024-10-11 12:41:36 -04:00
Andi Chandler
603296ef7b Translated using Weblate (English (United Kingdom))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/en_GB/
2024-10-11 12:41:36 -04:00
millallo
a26cdbba7a Translated using Weblate (Italian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/it/
2024-10-11 09:41:36 -04:00
nextlooper42
c698153a65 Translated using Weblate (Slovak)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sk/
2024-10-11 05:41:36 -04:00
l00d3r
8def27a0f0 Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/et/
2024-10-11 03:53:51 -04:00
Lukáš Kucharczyk
3ff6283c09 Translated using Weblate (Czech)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/
2024-10-11 02:41:36 -04:00
Nyanmisaka
c190b1a1df Translated using Weblate (Chinese (Simplified Han script))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2024-10-10 22:41:36 -04:00
Bas
1f4cd65763 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-10-10 22:41:36 -04:00
Kityn
3f8738990d Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/
2024-10-10 18:41:36 -04:00
trawzified
f7f44acee5 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-10-10 18:41:36 -04:00
Evan Jarrett
a452d6302d update with a more detailed help message 2024-10-10 17:15:42 -05:00
Evan Jarrett
a6d95020d9 add ability to select QSV device in the UI 2024-10-10 17:15:39 -05:00
Scott McKenzie
9536a37213 Add examples to LabelPublishedServerUriHelp string (#6163) 2024-10-10 20:42:51 +00:00
Manuel Weber
67283befbe Translated using Weblate (German)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/
2024-10-10 16:41:36 -04:00
viown
230925e159 Only connect to ServerConnections once (#6150)
* Only connect to ServerConnections once

* Fix initial login after wizard completion

* Fix login when refreshing login or select server page
2024-10-10 16:36:32 -04:00
Andi Chandler
176ebec6e2 Translated using Weblate (English (United Kingdom))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/en_GB/
2024-10-10 13:33:57 -04:00
Bill Thornton
24fee38903 Merge pull request #6183 from thornbill/metadata-manager-menu 2024-10-10 13:33:53 -04:00
Bill Thornton
f81e404c7b Merge pull request #6187 from thornbill/metadata-manager-padding 2024-10-10 13:32:44 -04:00
Bill Thornton
2235d162e7 Fix padding issues in the metadata manager 2024-10-10 10:59:00 -04:00
ilias-la
a5fb893fd8 Translated using Weblate (Greek)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/el/
2024-10-10 10:41:36 -04:00
Bill Thornton
5ffc9c7618 Update drawer label for metadata manager 2024-10-10 10:26:23 -04:00
BromTeque
4740cd156f Translated using Weblate (Norwegian Bokmål)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nb_NO/
2024-10-10 07:41:36 -04:00
nextlooper42
1e1bf3a1bf Translated using Weblate (Slovak)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sk/
2024-10-10 04:41:36 -04:00
Lukáš Kucharczyk
6caa21fe30 Translated using Weblate (Czech)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/
2024-10-10 04:41:36 -04:00
Bill Thornton
a67acc475a Merge pull request #6179 from jellyfin/renovate/linters 2024-10-09 19:23:37 -04:00
Kityn
dc89c2de6b Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/
2024-10-09 18:41:36 -04:00
Matheo
3827fe177f Translated using Weblate (French)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/
2024-10-09 18:41:35 -04:00
Fernando Fernández
7820a52609 Update with upstream changes 2024-10-09 22:16:59 +00:00
Fernando Fernández
d1f8742ce7 Remove unnecessary whitespace
Co-authored-by: Bill Thornton <thornbill@users.noreply.github.com>
2024-10-09 22:16:59 +00:00
Fernando Fernández
e673037a54 Securize CI, reusable workflows, simplifications 2024-10-09 22:16:59 +00:00
Bill Thornton
7c4962de80 Skip skipping if skip is short 2024-10-09 17:07:33 -04:00
Bill Thornton
9aeb64e347 Add tests for segment utils 2024-10-09 17:07:33 -04:00
Bill Thornton
b93450098a Add media segment manager 2024-10-09 17:07:33 -04:00
Bill Thornton
809dba510a Add media segment action settings 2024-10-09 17:06:10 -04:00
Nyanmisaka
c6b4d41535 Translated using Weblate (Chinese (Simplified Han script))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2024-10-09 15:41:36 -04:00
Bas
03ad81744f Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-10-09 15:41:36 -04:00
Bas
0d449a23ee Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-10-09 14:31:04 -04:00
Bill Thornton
52d4919df4 Merge pull request #5906 from gnattu/burn-subtitle-transcoding 2024-10-09 14:15:18 -04:00
Bill Thornton
b9a72a32c3 Merge pull request #6178 from jellyfin/renovate/vitest 2024-10-09 14:11:13 -04:00
Bill Thornton
38d095b3f3 Merge pull request #6168 from viown/fix-ui-freeze 2024-10-09 14:08:43 -04:00
renovate[bot]
2eae71ca63 Update dependency eslint-plugin-react to v7.37.1 2024-10-09 17:20:50 +00:00
renovate[bot]
aa13049355 Update Vitest to v2.1.2 2024-10-09 17:20:07 +00:00
Bill Thornton
4c24d6d37a Merge pull request #6177 from jellyfin/renovate/babel
Update Babel to v7.25.7
2024-10-09 13:18:36 -04:00
viown
fb2d4487f3 Fix UI freeze when opening same path 2024-10-09 20:15:00 +03:00
Kityn
c23d576c28 Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/
2024-10-09 12:41:36 -04:00
Bas
880fb3c201 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-10-09 12:41:36 -04:00
Bill Thornton
f00cc176e8 Merge pull request #6146 from jellyfin/renovate/react
Update dependency @types/react to v18.3.11
2024-10-09 12:40:29 -04:00
Bill Thornton
0790f97650 Merge pull request #6176 from jellyfin/renovate/sass
Update Sass to v1.79.4
2024-10-09 12:38:09 -04:00
renovate[bot]
6c386793ca Update Babel to v7.25.7 2024-10-09 16:37:40 +00:00
Bill Thornton
23c0566068 Merge pull request #6175 from jellyfin/renovate/jellyfin-sdk-0.x
Update dependency @jellyfin/sdk to v0.0.0-unstable.202410090502
2024-10-09 12:36:41 -04:00
Bill Thornton
67ebfb72bb Merge pull request #6138 from jellyfin/renovate/postcss
Update dependency postcss-preset-env to v10.0.5
2024-10-09 12:35:36 -04:00
Bill Thornton
b1472a0c7c Merge pull request #6136 from jellyfin/renovate/jsdom-25.x
Update dependency jsdom to v25.0.1
2024-10-09 12:32:59 -04:00
renovate[bot]
6c3ea5a4b7 Update dependency @types/react to v18.3.11 2024-10-09 16:30:53 +00:00
renovate[bot]
a7672eb338 Update Sass to v1.79.4 2024-10-09 16:30:28 +00:00
viown
c131ff9c3e Fix creating & deleting access schedules (#6133)
* Fix deleting & creating access schedules

* Remove unnecessary splice

* Add missing semicolon

* Correct check

* Add userId to dependency

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-10-09 11:07:35 -04:00
Ethan Messinger-Arns
0cc2b0698a Add option to control how long the screensaver takes to start (#6165)
* Added option to control how long the screensaver takes to start

* ESLint fixes

* Requested pull request fixes

* Alphabetized the translation string placement

* Simplified getter
2024-10-09 10:45:19 -04:00
renovate[bot]
cd5aff50cc Update dependency @jellyfin/sdk to v0.0.0-unstable.202410090502 2024-10-09 14:44:57 +00:00
Matías Eduardo Allende Pino
40d9f43049 Translated using Weblate (Spanish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es/
2024-10-09 09:41:35 -04:00
Bill Thornton
6f5c8c8cfc Merge pull request #6172 from thornbill/fix-playback-subscriber-bind 2024-10-09 08:49:30 -04:00
Roi Gabay
1cfaf1e7b7 Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/
2024-10-08 19:41:36 -04:00
gnattu
da4265eb46 Merge branch 'master' into burn-subtitle-transcoding 2024-10-09 06:53:18 +08:00
Bill Thornton
2545f30fbc Merge pull request #6173 from jellyfin/renovate/jellyfin-sdk-0.x 2024-10-08 18:45:25 -04:00
renovate[bot]
2ca5a60e90 Update dependency @jellyfin/sdk to v0.0.0-unstable.202410080502 2024-10-08 21:46:31 +00:00
Bill Thornton
3a6aaf2c8b Merge pull request #6148 from nielsvanvelzen/fix-no-device-options
Fix editing device info when there are no options yet
2024-10-08 17:13:07 -04:00
Bill Thornton
0344889641 Merge pull request #6134 from viown/fix-error-on-profile-page-refresh
Fix crash on several pages
2024-10-08 17:10:20 -04:00
Bill Thornton
a5427e8585 Merge pull request #6166 from viown/fix-livetv-playback
Fix LiveTV Playback
2024-10-08 12:52:44 -04:00
Bill Thornton
49433cd640 Fix playback subscriber callback binding 2024-10-08 12:49:42 -04:00
viown
07316cf870 Update playbackmanager.js
Co-authored-by: Bill Thornton <thornbill@users.noreply.github.com>
2024-10-08 19:19:38 +03:00
viown
c2c5228c06 Update playbackmanager.js
Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com>
2024-10-08 16:27:46 +03:00
Balázs Meskó
a3df9bd637 Translated using Weblate (Hungarian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hu/
2024-10-08 08:41:36 -04:00
Anders
213047dc29 Translated using Weblate (Danish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/da/
2024-10-08 06:41:36 -04:00
viown
ca4763512f Explicitly check for Live TV 2024-10-08 10:58:02 +03:00
rushmash
60c2f7366f Translated using Weblate (Belarusian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/be/
2024-10-06 16:41:35 -04:00
hoanghuy309
708226763a Translated using Weblate (Vietnamese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/vi/
2024-10-06 12:41:35 -04:00
stanol
81cf8df5c9 Translated using Weblate (Ukrainian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/uk/
2024-10-06 10:41:35 -04:00
Nico
24c8a2220f Translated using Weblate (French)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/
2024-10-05 14:41:35 -04:00
nextlooper42
c1df20f6ec Translated using Weblate (Slovak)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sk/
2024-10-05 07:41:35 -04:00
viown
95e23875f4 Only specify mediaSourceId if index changed 2024-10-05 10:28:02 +03:00
viown
c54db604d9 Fix LiveTV Playback 2024-10-05 08:47:03 +03:00
Roi Gabay
3a33ed9ffc Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/
2024-10-04 18:41:35 -04:00
Mylan1173
f1a6bfe111 Translated using Weblate (Hungarian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hu/
2024-10-04 06:41:35 -04:00
Lukáš Kucharczyk
7504daba70 Translated using Weblate (Czech)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/
2024-10-04 04:41:35 -04:00
Andi Chandler
077e9181d3 Translated using Weblate (English (United Kingdom))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/en_GB/
2024-10-03 21:41:35 -04:00
Daniel
9875194da6 Translated using Weblate (Finnish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fi/
2024-10-03 15:41:35 -04:00
Kityn
1fc1dc1e65 Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/
2024-10-03 02:41:35 -04:00
皇甫朝云
d2e9a8b6b3 Translated using Weblate (Chinese (Simplified Han script))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2024-10-02 21:41:35 -04:00
Bill Thornton
d5f2977216 Merge pull request #6156 from jellyfin/renovate/jellyfin-sdk-0.x 2024-10-02 10:23:00 -04:00
renovate[bot]
d301f323ac Update dependency @jellyfin/sdk to v0.0.0-unstable.202410020501 2024-10-02 14:16:23 +00:00
皇甫朝云
e3cec31682 Translated using Weblate (Chinese (Simplified Han script))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2024-10-02 09:41:36 -04:00
Bas
00844cee03 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-10-02 09:41:35 -04:00
Bill Thornton
5d23cdaffa Merge pull request #6155 from thornbill/fix-renovate-minimum-age 2024-10-02 08:57:57 -04:00
Bill Thornton
ef7642a369 Merge pull request #6142 from gnattu/only-add-node-when-enabled-normalization 2024-10-02 08:06:51 -04:00
Bill Thornton
f1e5b409e7 Fix minimum release age type in renovate config 2024-10-02 07:57:58 -04:00
BromTeque
b7a32c6aee Translated using Weblate (Norwegian Bokmål)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nb_NO/
2024-10-02 07:41:35 -04:00
Bill Thornton
93a38b0497 Merge pull request #6152 from thornbill/renovate-sdk 2024-10-02 07:20:03 -04:00
Bill Thornton
443b5cf895 Use renovate for unstable sdk updates 2024-10-02 02:07:24 -04:00
Bill Thornton
ed54e318c9 Merge pull request #6149 from thornbill/playback-subscriber
Add playback subscriber abstraction
2024-10-01 16:07:25 -04:00
Bill Thornton
6a6766f998 Change NOTE to TODO 2024-10-01 16:00:48 -04:00
stanol
f4687e1157 Translated using Weblate (Ukrainian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/uk/
2024-10-01 15:41:35 -04:00
Bill Thornton
8acf8fb550 Mark event handler maps as readonly 2024-10-01 14:01:54 -04:00
Bill Thornton
26f7f281cd Add playback subscriber abstraction 2024-10-01 13:41:40 -04:00
hoanghuy309
5888962e3f Translated using Weblate (Vietnamese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/vi/
2024-10-01 13:41:35 -04:00
Niels van Velzen
7fe4c5c63f Fix editing device info when there are no options yet 2024-10-01 18:50:44 +02:00
Andi Chandler
2442dc6b52 Translated using Weblate (English (United Kingdom))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/en_GB/
2024-10-01 07:41:35 -04:00
gnattu
24c30dc96d Handle addGainElement failure
Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com>
2024-10-01 18:25:09 +08:00
gnattu
75d21a8140 Fix lint
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-10-01 17:18:26 +08:00
gnattu
6b52358b57 Remove commented code 2024-10-01 17:13:52 +08:00
gnattu
0dbde71241 Only add gain node when normalization enabled 2024-10-01 17:03:45 +08:00
Léon
aac5fe2f49 Translated using Weblate (French)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/
2024-10-01 00:41:35 -04:00
Théo Guerre
5e58df6fe2 Translated using Weblate (French)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/
2024-09-30 13:41:35 -04:00
nextlooper42
171dc09373 Translated using Weblate (Slovak)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sk/
2024-09-30 11:41:35 -04:00
Théo Guerre
c7f494d7b9 Translated using Weblate (French)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/
2024-09-30 11:41:35 -04:00
Bill Thornton
84363a850a Merge pull request #6140 from nyanmisaka/fix-LoginAttemptsBeforeLockout 2024-09-30 10:13:26 -04:00
nyanmisaka
f341b11c96 Fix the broken LoginAttemptsBeforeLockout
fixes a typo made in be891c3

Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2024-09-30 22:02:54 +08:00
nextlooper42
b291b4ff73 Translated using Weblate (Slovak)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sk/
2024-09-30 09:41:36 -04:00
Balázs Meskó
2aaf520378 Translated using Weblate (Hungarian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hu/
2024-09-30 09:41:35 -04:00
Théo Guerre
43f8a3f50c Translated using Weblate (French)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/
2024-09-30 09:41:35 -04:00
nextlooper42
0728bad222 Translated using Weblate (Slovak)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sk/
2024-09-30 07:41:35 -04:00
l00d3r
acd6780769 Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/et/
2024-09-30 05:41:35 -04:00
millallo
ff256abb27 Translated using Weblate (Italian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/it/
2024-09-30 05:41:35 -04:00
Lukáš Kucharczyk
8f952c4bf5 Translated using Weblate (Czech)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/
2024-09-30 03:41:35 -04:00
felix920506
87e37557dd Translated using Weblate (Chinese (Traditional Han script))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant/
2024-09-29 22:41:35 -04:00
Nyanmisaka
f88a7ccfde Translated using Weblate (Chinese (Simplified Han script))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2024-09-29 15:41:35 -04:00
felix920506
c05550daf8 Translated using Weblate (Chinese (Traditional Han script))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant/
2024-09-29 13:41:35 -04:00
renovate[bot]
f8f729ceef Update dependency postcss-preset-env to v10.0.5 2024-09-29 16:39:02 +00:00
Kityn
055baa4efa Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/
2024-09-29 07:41:35 -04:00
Bas
1114b19b00 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-09-29 03:41:35 -04:00
renovate[bot]
563126dc1d Update dependency jsdom to v25.0.1 2024-09-29 06:27:06 +00:00
Bill Thornton
24b413c849 Merge pull request #5991 from lostb1t/feature/displayordercollection 2024-09-29 02:25:54 -04:00
Fahim Murshed
7a0e3b7df7 Translated using Weblate (Bengali (Bangladesh))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/bn_BD/
2024-09-28 19:41:35 -04:00
lostb1t
f7c2a273e3 Add translations string for DateMosified 2024-09-28 18:26:22 +02:00
lostb1t
6afd7a3d98 Use DateModifed for label 2024-09-28 16:36:01 +02:00
viown
c4e8764900 Remove LibraryMenu import 2024-09-28 15:00:55 +03:00
viown
1752d0bf1a Fix additional pages 2024-09-28 14:57:45 +03:00
viown
52477f04e1 Fix refresh on profle page 2024-09-28 14:44:13 +03:00
Andreas Lundin
bddb631b08 Translated using Weblate (Swedish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sv/
2024-09-28 06:41:35 -04:00
Nyanmisaka
a5035baaf7 Translated using Weblate (Chinese (Simplified Han script))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2024-09-28 04:41:35 -04:00
Bas
290207bdb7 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-09-28 04:41:35 -04:00
Kityn
46f0307d6e Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/
2024-09-28 02:41:35 -04:00
Bill Thornton
2ca1eae7f6 Merge pull request #6130 from jellyfin/renovate/sass-1.x 2024-09-27 23:53:15 -04:00
Bill Thornton
42b3de4cdb Merge pull request #6131 from jellyfin/renovate/sass-embedded-1.x 2024-09-27 23:52:23 -04:00
renovate[bot]
fd465f1688 Update dependency sass to v1.79.3 2024-09-28 03:49:34 +00:00
Bill Thornton
20c44c24ff Merge pull request #6129 from jellyfin/renovate/webpack 2024-09-27 23:48:48 -04:00
Bill Thornton
f405602bd0 Merge pull request #6039 from grafixeyehero/Add-details-react-view
Add detail view buttons
2024-09-27 23:47:14 -04:00
renovate[bot]
0945097208 Update dependency sass-embedded to v1.79.3 2024-09-28 00:56:50 +00:00
Max Bruch
0780bc360b Translated using Weblate (German)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/
2024-09-27 15:41:35 -04:00
renovate[bot]
0c1616fd4e Update dependency sass-loader to v16.0.2 2024-09-27 17:03:55 +00:00
Bill Thornton
e83edd3766 Merge pull request #6128 from jellyfin/renovate/material-ui-monorepo 2024-09-27 08:09:28 -04:00
Bill Thornton
8249f93eea Merge pull request #6123 from jellyfin/renovate/postcss 2024-09-27 08:06:29 -04:00
Bill Thornton
928d3302ff Merge pull request #6125 from jellyfin/renovate/sass-embedded-1.x 2024-09-27 08:05:30 -04:00
renovate[bot]
3fcf53d655 Update dependency @mui/x-date-pickers to v7.18.0 2024-09-27 12:04:44 +00:00
Bill Thornton
f1a0f34151 Merge pull request #6124 from jellyfin/renovate/sass-1.x 2024-09-27 08:03:55 -04:00
Bill Thornton
6f2ebda25e Merge pull request #6112 from viown/fix-incorrect-index-on-next-track 2024-09-27 07:56:56 -04:00
viown
4c31742cc5 Fix incorrect audio & subtitle index on next track 2024-09-27 13:49:43 +03:00
Janes Resnik
d4cc33f0ee Translated using Weblate (German)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/
2024-09-27 06:41:35 -04:00
Janes Resnik
83e59ec229 Translated using Weblate (German)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/
2024-09-27 03:41:35 -04:00
Bill Thornton
c5bebf7c59 Merge pull request #6111 from davidmurdoch/fix-movies-shuffle 2024-09-27 01:40:52 -04:00
renovate[bot]
f4e2402fbc Update dependency sass-embedded to v1.79.2 2024-09-27 04:33:27 +00:00
Bill Thornton
de4c2c007f Merge pull request #6122 from jellyfin/renovate/react 2024-09-27 00:32:40 -04:00
renovate[bot]
15fc00cf43 Update dependency sass to v1.79.2 2024-09-27 00:35:17 +00:00
BromTeque
f2b9f8e9f7 Translated using Weblate (Norwegian Bokmål)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nb_NO/
2024-09-26 17:41:35 -04:00
David Murdoch
ce4aded654 Update src/controllers/movies/movies.js
Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com>
2024-09-26 16:15:18 -04:00
renovate[bot]
b32290c92d Update dependency postcss to v8.4.47 2024-09-26 19:49:45 +00:00
renovate[bot]
6b14f2531b Update dependency @types/react to v18.3.8 2024-09-26 19:49:34 +00:00
Bill Thornton
4b6a8d2eb9 Merge pull request #6120 from jellyfin/update-jf-sdk 2024-09-26 08:18:39 -04:00
jellyfin-bot
5eeb29ae97 Update @jellyfin/sdk to 0.0.0-unstable.202409260501 2024-09-26 07:05:37 +00:00
Bill Thornton
97d4f94d6f Merge pull request #6115 from jellyfin/renovate/sass-embedded-1.x 2024-09-25 18:15:07 -04:00
David Murdoch
bb78451102 Update src/controllers/movies/movies.js
Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com>
2024-09-25 13:49:41 -04:00
David Murdoch
f52ac7a96d Limit number of results returned since we only use 1 2024-09-25 13:48:34 -04:00
David Murdoch
74c735dbd0 Fix movies Shuffle button 2024-09-25 13:48:34 -04:00
Blackspirits
ec75d31a64 Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt/
2024-09-25 12:55:32 -04:00
Blackspirits
6272091fdd Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_PT/
2024-09-25 12:55:32 -04:00
renovate[bot]
68596089e6 Update dependency sass-embedded to v1.79.1 2024-09-25 16:30:04 +00:00
Bill Thornton
902e0d2d1f Merge pull request #6114 from jellyfin/renovate/sass-1.x 2024-09-25 12:28:16 -04:00
Bill Thornton
719188a9fa Merge pull request #6118 from jellyfin/renovate/npm-postcss-vulnerability 2024-09-25 12:27:04 -04:00
renovate[bot]
318166b40c Update dependency postcss to v8.4.42 [SECURITY] 2024-09-25 14:55:41 +00:00
Bill Thornton
9e1c78fe7b Merge pull request #6117 from jellyfin/renovate/npm-postcss-vulnerability 2024-09-25 10:54:54 -04:00
Bill Thornton
bf20f3cc51 Merge pull request #6116 from jellyfin/update-jf-sdk 2024-09-25 10:36:16 -04:00
renovate[bot]
20d903906b Update dependency postcss to v8.4.41 [SECURITY] 2024-09-25 14:28:14 +00:00
jellyfin-bot
47e2730bc4 Update @jellyfin/sdk to 0.0.0-unstable.202409250605 2024-09-25 07:13:15 +00:00
renovate[bot]
6b2441ac85 Update dependency sass to v1.79.1 2024-09-25 01:29:13 +00:00
Andi Chandler
f6d62f0dec Translated using Weblate (English (United Kingdom))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/en_GB/
2024-09-24 17:56:16 -04:00
Bill Thornton
dd2cf5572e Merge pull request #6109 from jellyfin/update-jf-sdk
Update @jellyfin/sdk to 0.0.0-unstable.202409240640
2024-09-24 12:05:48 -04:00
Bill Thornton
3a2f8816f0 Merge pull request #6110 from jellyfin/renovate/react
Update dependency @types/react to v18.3.7
2024-09-24 11:59:50 -04:00
Bill Thornton
e0f313ed89 Merge pull request #6108 from jellyfin/dependabot/npm_and_yarn/rollup-4.22.4
Bump rollup from 4.21.3 to 4.22.4
2024-09-24 11:59:08 -04:00
Bill Thornton
29642e0aa9 Fix DeviceInfo to DeviceInfoDto type change 2024-09-24 11:57:53 -04:00
stanol
157c90090d Translated using Weblate (Ukrainian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/uk/
2024-09-24 09:14:52 -04:00
stanol
d7a85e7e2a Translated using Weblate (Ukrainian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/uk/
2024-09-24 08:54:48 -04:00
renovate[bot]
28d13a5177 Update dependency @types/react to v18.3.7 2024-09-24 10:30:42 +00:00
朱涛
6543606b16 Translated using Weblate (Chinese (Simplified Han script))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2024-09-24 04:44:11 -04:00
朱涛
697c083176 Translated using Weblate (Chinese (Simplified Han script))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2024-09-24 04:22:56 -04:00
jellyfin-bot
9474a483ce Update @jellyfin/sdk to 0.0.0-unstable.202409240640 2024-09-24 07:05:31 +00:00
Kityn
e25e7fc8e5 Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/
2024-09-24 01:42:34 -04:00
dependabot[bot]
8d710e08ea Bump rollup from 4.21.3 to 4.22.4
Bumps [rollup](https://github.com/rollup/rollup) from 4.21.3 to 4.22.4.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.21.3...v4.22.4)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-24 05:02:14 +00:00
hoanghuy309
abd38b7795 Translated using Weblate (Vietnamese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/vi/
2024-09-23 22:42:34 -04:00
grafixeyehero
c5bbd5bca9 apply suggestion
Co-authored-by: Bill Thornton <thornbill@users.noreply.github.com>
2024-09-24 04:15:12 +03:00
Jonas Anderberg
27173e90ae Translated using Weblate (Swedish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sv/
2024-09-23 17:41:35 -04:00
Thomas Schwery
2a63186fcb Translated using Weblate (French)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/
2024-09-23 17:41:35 -04:00
Bill Thornton
659f2876fc Merge pull request #6107 from jellyfin/renovate/jellyfin-libass-wasm-4.x 2024-09-23 17:15:39 -04:00
Jonas Anderberg
6487a00b70 Translated using Weblate (Swedish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sv/
2024-09-23 15:31:57 -04:00
renovate[bot]
e5c7aa8802 Update dependency @jellyfin/libass-wasm to v4.2.3 2024-09-23 18:29:06 +00:00
Bill Thornton
bbac44ba7b Merge pull request #6106 from jellyfin/renovate/linters
Update dependency eslint to v8.57.1
2024-09-23 14:25:12 -04:00
Bill Thornton
3ec8b87ff8 Merge pull request #6105 from jellyfin/renovate/webpack
Update dependency babel-loader to v9.2.1
2024-09-23 14:24:00 -04:00
Bill Thornton
00c01a2d37 Merge pull request #6104 from jellyfin/renovate/react
Update dependency @types/react to v18.3.6
2024-09-23 14:23:11 -04:00
Bill Thornton
823e18499e Merge pull request #6028 from thornbill/expand-drawer-section
Update behavior of expanding drawer sections
2024-09-23 13:39:45 -04:00
Bas
af1ec35c9e Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-09-23 13:21:36 -04:00
Bill Thornton
e3383946b9 Update behavior of expanding drawer sections 2024-09-23 13:12:12 -04:00
Bill Thornton
a2676c25ce Merge pull request #5869 from gnattu/custom-audio-tag
Add non-standard multi-value audio tag support
2024-09-23 12:31:01 -04:00
renovate[bot]
b122fc92a2 Update dependency babel-loader to v9.2.1 2024-09-23 16:29:13 +00:00
renovate[bot]
4cdda6048c Update dependency eslint to v8.57.1 2024-09-23 16:28:57 +00:00
Bill Thornton
3a414a2da3 Merge pull request #5226 from terite/terite-emby-linkbutton
use LinkButton instead of dangerouslySetInnerHTML
2024-09-23 12:27:37 -04:00
Bill Thornton
76bde38e22 Remove unused imports 2024-09-23 12:09:25 -04:00
Bill Thornton
fbbc8a85f3 Revert search suggestion layout change 2024-09-23 12:01:38 -04:00
Bill Thornton
e3fd25cfbd Fix broken import 2024-09-23 12:00:22 -04:00
David Stensland
30bce48c23 use LinkButton in SectionTitleContainer 2024-09-23 11:57:41 -04:00
David Stensland
7011d09b4b use LinkButton in SearchSuggestions 2024-09-23 11:57:15 -04:00
David Stensland
10419dcd48 remove unnecessary escapeHTML in UserCardBox 2024-09-23 11:47:14 -04:00
David Stensland
6eb6d75797 use LinkButton in UserCardBox 2024-09-23 11:47:14 -04:00
David Stensland
b27b559d21 replace LinkEditUserPreferences with LinkButton 2024-09-23 11:47:14 -04:00
Bromteque
68a515c54e Translated using Weblate (Norwegian Bokmål)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nb_NO/
2024-09-23 09:33:45 -04:00
Bromteque
ca2d4592b1 Translated using Weblate (Norwegian Bokmål)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nb_NO/
2024-09-23 08:36:54 -04:00
Bromteque
0244f200fd Translated using Weblate (Norwegian Bokmål)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nb_NO/
2024-09-23 08:34:46 -04:00
Bromteque
f4a13efed7 Translated using Weblate (Norwegian Bokmål)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nb_NO/
2024-09-23 07:56:12 -04:00
renovate[bot]
f85c14e13d Update dependency @types/react to v18.3.6 2024-09-23 10:17:50 +00:00
l00d3r
b05b444b38 Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/et/
2024-09-23 02:40:51 -04:00
Nyanmisaka
ef936ccfb3 Translated using Weblate (Chinese (Simplified Han script))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2024-09-22 16:24:32 -04:00
firebird76
15fa3cd03c Translated using Weblate (German)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/
2024-09-22 16:24:32 -04:00
hoanghuy309
8db562bf5a Translated using Weblate (Vietnamese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/vi/
2024-09-22 15:06:50 -04:00
hoanghuy309
161b11cb79 Translated using Weblate (Vietnamese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/vi/
2024-09-22 14:11:10 -04:00
Andi Chandler
6ad7de3211 Translated using Weblate (English (United Kingdom))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/en_GB/
2024-09-22 06:55:42 -04:00
l00d3r
4278046e77 Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/et/
2024-09-22 03:38:11 -04:00
millallo
9dc397c4ce Translated using Weblate (Italian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/it/
2024-09-22 03:38:11 -04:00
l00d3r
9b65a5e33d Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/et/
2024-09-22 03:08:20 -04:00
l00d3r
8d8e54cfb9 Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/et/
2024-09-22 03:05:06 -04:00
l00d3r
19704d9b17 Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/et/
2024-09-22 02:46:38 -04:00
Nyanmisaka
9cfaa19433 Translated using Weblate (Chinese (Simplified Han script))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2024-09-22 02:46:38 -04:00
Bill Thornton
f381255035 Merge pull request #6095 from nyanmisaka/patch-1 2024-09-22 01:21:19 -04:00
gnattu
f05b90ce1a Fix unnecessary optional chaining
Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com>
2024-09-22 13:16:52 +08:00
Kityn
c64bfcaa27 Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/
2024-09-22 01:16:23 -04:00
gnattu
fb1b9b15bb fix lint
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-09-22 05:50:10 +08:00
gnattu
43e4c2a517 Better comment 2024-09-22 05:47:50 +08:00
gnattu
1216305992 Refactor sessionPromise 2024-09-22 05:46:54 +08:00
gnattu
fc9485c49d Remove more Promise.Resolve 2024-09-22 05:04:19 +08:00
Bill Thornton
23ee5e62a7 Merge pull request #6082 from thornbill/mixed-icon 2024-09-21 13:58:04 -04:00
gnattu
e4c20df5ae Remove redundant Promise.resolve 2024-09-22 00:41:33 +08:00
gnattu
040b2d4901 Fix Lint
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-09-22 00:39:24 +08:00
gnattu
2d12aec9b4 Only load subtitle when direct play/remux 2024-09-22 00:36:29 +08:00
Bill Thornton
570f26579f Merge pull request #6099 from nielsvanvelzen/more-sections 2024-09-21 10:44:13 -04:00
l00d3r
6fe3e1814f Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/et/
2024-09-21 10:14:06 -04:00
l00d3r
a7032e9eae Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/et/
2024-09-21 09:44:49 -04:00
Niels van Velzen
a269dcbc10 Increase amount of home sections from 7 to 10 2024-09-21 15:32:13 +02:00
l00d3r
2d5b0eacff Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/et/
2024-09-21 09:09:08 -04:00
l00d3r
a8f160f195 Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/et/
2024-09-21 09:06:37 -04:00
l00d3r
2725b924b7 Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/et/
2024-09-21 09:02:20 -04:00
l00d3r
3872f6b2a7 Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/et/
2024-09-21 08:56:31 -04:00
l00d3r
823b8d3e34 Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/et/
2024-09-21 08:30:26 -04:00
l00d3r
15d0530266 Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/et/
2024-09-21 08:15:15 -04:00
Ignacio Diaz
2ca2b921c1 Translated using Weblate (Spanish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es/
2024-09-21 07:08:13 -04:00
Nyanmisaka
8d11c09846 Translated using Weblate (Chinese (Simplified Han script))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2024-09-21 03:20:29 -04:00
Bas
e2737f5b15 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-09-21 03:20:29 -04:00
David Stensland
0d90ac39f1 use LinkButton in dashboard/users/SectionTabs 2024-09-21 03:03:01 -04:00
David Stensland
32f835c865 fix LinkButton to prevent default 2024-09-21 02:53:25 -04:00
Bill Thornton
07fe5adc1c Merge pull request #6094 from jellyfin/renovate/typescript
Update dependency typescript to v5.6.2
2024-09-21 02:41:58 -04:00
Bill Thornton
6eeee4f295 Merge pull request #6097 from jellyfin/renovate/tanstack-query-monorepo
Update tanstack-query monorepo to v5.56.2
2024-09-21 02:40:37 -04:00
Bill Thornton
b2b26b9b6f Merge pull request #6092 from jellyfin/renovate/material-ui-monorepo
Update dependency @mui/x-date-pickers to v7.17.0
2024-09-21 02:38:45 -04:00
Bill Thornton
60e3ee2c44 Merge pull request #6091 from jellyfin/renovate/swiper-11.x
Update dependency swiper to v11.1.14
2024-09-21 02:37:06 -04:00
Bill Thornton
6181713817 Merge pull request #6044 from nyanmisaka/update-rkmpp-trickplay
Update string for RKMPP support in Trickplay
2024-09-21 02:35:42 -04:00
renovate[bot]
ccf11ac6ea Update dependency typescript to v5.6.2 2024-09-21 06:35:18 +00:00
Bill Thornton
8ea687ee03 Merge pull request #6089 from jellyfin/renovate/vitest
Update Vitest to v2.1.1
2024-09-21 02:34:02 -04:00
renovate[bot]
0b30df2a26 Update tanstack-query monorepo to v5.56.2 2024-09-21 06:29:34 +00:00
Bill Thornton
c186a0a70d Merge pull request #6088 from jellyfin/renovate/fonts
Update Fonts to v5.1.0
2024-09-21 02:28:48 -04:00
Bill Thornton
0c729d347b Merge pull request #6090 from dmitrylyzo/tizen-dovi
Allow Dolby Vision fallback layer on Tizen 3+
2024-09-21 02:22:46 -04:00
Bill Thornton
46c6fd4b85 Always use default item icon 2024-09-21 02:14:07 -04:00
nyanmisaka
663e48a7a9 Fix more default values
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2024-09-21 14:07:13 +08:00
Bill Thornton
56eeda2ced Merge pull request #6096 from theguymadmax/add-year-to-collection 2024-09-21 01:12:10 -04:00
Kityn
9924f6c82c Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/
2024-09-21 01:08:45 -04:00
Bas
791581bfc2 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-09-20 18:41:35 -04:00
Dmitry Lyzo
aa4004a1be Allow Dolby Vision fallback layer on Tizen 3+ 2024-09-21 01:35:39 +03:00
Bill Thornton
c2aca253f5 Merge pull request #5955 from mprasil/master 2024-09-20 18:29:37 -04:00
Bill Thornton
576dcd85a1 Merge pull request #5990 from scampower3/allow-season-episode-original-title-edit 2024-09-20 17:36:28 -04:00
Bill Thornton
04dbfd30e5 Merge pull request #6027 from viown/fix-double-select
Fix double click to uncheck in multi-select menu
2024-09-20 17:26:41 -04:00
Bas
fb5a7f359c Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-09-20 16:53:37 -04:00
viown
b5a252e104 missing newline 2024-09-20 16:24:26 -04:00
viown
fb0d1f8a8c Fix double click to de-select 2024-09-20 16:24:26 -04:00
Bill Thornton
f0b50db2ad Merge pull request #6018 from viown/fix-device-name
Prefer custom device name in device access list
2024-09-20 16:14:17 -04:00
gnattu
0dbd659bc4 Fix localization 2024-09-21 04:10:47 +08:00
gnattu
e48321a2c4 Add option to always burn in subtitles if transcoding is triggered 2024-09-21 04:10:46 +08:00
viown
9716578f05 fix merge conflict 2024-09-20 16:09:25 -04:00
Bill Thornton
ef6d9c7241 Merge pull request #5976 from GodTamIt/ff-hdr
Support HDR in Firefox for macOS
2024-09-20 16:04:48 -04:00
Nyanmisaka
f57bda5e02 Fix the hidden software tonemap options
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2024-09-21 04:01:09 +08:00
Bill Thornton
6d0f0e85a6 Merge pull request #5688 from Arcus92/native-pgs
Add support for native PGS subtitle rendering without transcoding
2024-09-20 15:55:30 -04:00
theguymadmax
3afa85c218 Show year for movies in collection 2024-09-20 15:53:44 -04:00
Bill Thornton
2617ad783f Merge pull request #6065 from viown/fix-special-episodes-not-played
Fix season play button not including specials
2024-09-20 15:51:23 -04:00
viown
07cb21f13f Fix season play button not playing specials 2024-09-20 15:08:58 -04:00
Bill Thornton
9d8f19f76a Merge pull request #6036 from viown/fix-autocast-hopefully
Fix autocast listener
2024-09-20 15:07:24 -04:00
viown
7b1535073b add log message 2024-09-20 15:01:34 -04:00
viown
5396e3c95c fix merge conflict 2024-09-20 15:01:34 -04:00
Bill Thornton
c33ee1b381 Merge pull request #6081 from nyanmisaka/hevc-rext-hwdec-options
Add HEVC RExt HW decoding options
2024-09-20 14:57:35 -04:00
Bill Thornton
5e17cbe505 Merge pull request #6071 from gnattu/bitrate-control
Separate bitrate control from resolution
2024-09-20 14:55:51 -04:00
Bill Thornton
37c8370d57 Merge pull request #6070 from dmitrylyzo/fix-hotkeys
Make hotkeys strict and prevent default actions for handled ones
2024-09-20 14:47:33 -04:00
Bill Thornton
67b569cc26 Merge pull request #6073 from gnattu/allow-vp9-remux-chrome-firefox
Allow VP9 remuxing for Chrome and Firefox
2024-09-20 14:41:56 -04:00
Bill Thornton
610cbdcee9 Merge pull request #6080 from dmitrylyzo/discard-chrome-safari
Discard `chrome` and `safari` on Tizen and webOS
2024-09-20 14:40:58 -04:00
Bill Thornton
9f1bccb0f2 Merge pull request #6046 from dmitrylyzo/fix-focus
Fix focus indication on tags, artist and album
2024-09-20 14:38:09 -04:00
Bas
02a89369ff Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-09-20 14:09:49 -04:00
LJQ
f624fa1065 Use full path for imports 2024-09-21 02:00:16 +08:00
Bill Thornton
0e94a5aa3f Merge pull request #5881 from jellyfin/lyrics-library-options
Add lyric fetcher settings to library options
2024-09-20 13:55:12 -04:00
Bill Thornton
dafaf4a967 Merge pull request #6029 from nyanmisaka/dovi-profile10
Add support for DoVi Profile 10
2024-09-20 13:45:52 -04:00
renovate[bot]
f67b34b117 Update Vitest to v2.1.1 2024-09-20 17:07:23 +00:00
renovate[bot]
0aab2e0f3f Update dependency @mui/x-date-pickers to v7.17.0 2024-09-20 14:05:19 +00:00
Lukáš Kucharczyk
e8286bc9d9 Translated using Weblate (Czech)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/
2024-09-20 04:14:52 -04:00
renovate[bot]
3bd6d4bbd4 Update dependency swiper to v11.1.14 2024-09-20 00:28:38 +00:00
Christopher Tam
362e4c160b Make boolean logic more readable 2024-09-19 19:00:46 -04:00
Christopher Tam
e4fc8e811a Support HDR in Firefox for macOS
Firefox 100 introduced HDR playback:
  * https://www.mozilla.org/en-US/firefox/100.0/releasenotes/

This patches the issue where HDR detection is broken for HDR videos in
VP9 (video codec) in an MP4 container:
  * https://bugzilla.mozilla.org/show_bug.cgi?id=1915265
2024-09-19 19:00:46 -04:00
renovate[bot]
0964ef0d02 Update Fonts to v5.1.0 2024-09-19 21:32:42 +00:00
Bill Thornton
bbbbd0c4f5 Merge pull request #6085 from jellyfin/renovate/jstree-3.x
Update dependency jstree to v3.3.17
2024-09-19 16:31:20 -04:00
Bill Thornton
981c5ef221 Merge pull request #6087 from jellyfin/renovate/react
Update dependency react-router-dom to v6.26.2
2024-09-19 16:29:13 -04:00
Bill Thornton
986338d8af Merge pull request #6086 from jellyfin/renovate/postcss
Update dependency postcss-preset-env to v10.0.3
2024-09-19 16:24:02 -04:00
Bill Thornton
d355ba9aad Merge pull request #6083 from jellyfin/dependabot/npm_and_yarn/vite-5.4.6
Bump vite from 5.3.5 to 5.4.6
2024-09-19 16:20:59 -04:00
Bill Thornton
9b8386d051 Merge pull request #6064 from jellyfin/renovate/material-react-table-2.x
Update dependency material-react-table to v2.13.3
2024-09-19 16:19:02 -04:00
Bill Thornton
3510130608 Merge pull request #6062 from jellyfin/renovate/cssnano-7.x
Update dependency cssnano to v7.0.6
2024-09-19 16:17:33 -04:00
renovate[bot]
aaf92a53dd Update dependency react-router-dom to v6.26.2 2024-09-19 20:15:29 +00:00
Bill Thornton
f0829ed3e6 Merge pull request #6053 from jellyfin/renovate/sass-embedded-1.x
Update dependency sass-embedded to v1.78.0
2024-09-19 16:14:07 -04:00
renovate[bot]
00734e3d5c Update dependency postcss-preset-env to v10.0.3 2024-09-19 20:13:30 +00:00
Bill Thornton
9d34d5948f Merge pull request #6052 from jellyfin/renovate/sass-1.x
Update dependency sass to v1.78.0
2024-09-19 16:12:14 -04:00
Bas
49ec33b325 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-09-19 10:41:35 -04:00
renovate[bot]
56aa4f02a9 Update dependency jstree to v3.3.17 2024-09-19 14:32:04 +00:00
Bill Thornton
78b08d9cb1 Merge pull request #6051 from jellyfin/renovate/webpack
Update dependency webpack-dev-server to v5.1.0
2024-09-19 10:30:52 -04:00
Bill Thornton
d62089e908 Merge pull request #6047 from jellyfin/renovate/linters
Update Linters
2024-09-19 10:26:59 -04:00
Bill Thornton
15087bf5db Update eslint react 2024-09-19 10:08:39 -04:00
Bill Thornton
7b9e97ce6c Fix eslint comment dependency 2024-09-19 09:58:41 -04:00
stanol
42dba13cb4 Translated using Weblate (Ukrainian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/uk/
2024-09-19 09:32:12 -04:00
Chris Lee
a63128409c Translated using Weblate (Norwegian Bokmål)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nb_NO/
2024-09-19 09:32:12 -04:00
stanol
60f1b711c3 Translated using Weblate (Ukrainian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/uk/
2024-09-19 09:13:51 -04:00
renovate[bot]
848e49eb48 Update Linters 2024-09-19 09:11:27 +00:00
Andi Chandler
db31bac43c Translated using Weblate (English (United Kingdom))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/en_GB/
2024-09-18 20:41:35 -04:00
無情天
1edb3ab1ca Translated using Weblate (Chinese (Simplified))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2024-09-18 16:41:35 -04:00
Bill Thornton
2426342511 Merge pull request #6037 from jellyfin/renovate/tanstack-query-monorepo
Update tanstack-query monorepo to v5.55.4
2024-09-18 15:40:42 -04:00
Bill Thornton
2abc648dcf Fix default icon handling and add tests 2024-09-18 15:31:15 -04:00
David Schulte
e560d37f99 Added PGS support for browsers legacy browsers without OffscreenCanvas or Worker support like webOS 1.2 by updating libpgs. 2024-09-18 19:18:12 +02:00
David Schulte
da0a255bcc Apply suggestions from code review
Removed extra line breaks and using `classList.toggle` instead of `add` and `remove` to simplify code.

Co-authored-by: Bill Thornton <thornbill@users.noreply.github.com>
2024-09-18 19:18:12 +02:00
David Schulte
8753f84335 Added client setting to enable experimental Pgs subtitle renderer. 2024-09-18 19:18:12 +02:00
Balázs Meskó
bed6db28ef Translated using Weblate (Hungarian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hu/
2024-09-18 12:41:34 -04:00
Ignacio Diaz
ed5a31b0fb Translated using Weblate (Spanish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es/
2024-09-18 09:41:34 -04:00
Bas
7ee6f9a2c0 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-09-18 05:41:35 -04:00
nyanmisaka
ee7879cf76 Hide RExt and 10bit check for VideoToolbox
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2024-09-18 16:04:21 +08:00
nyanmisaka
c775769dce Enable 12bit for VideoToolbox
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2024-09-18 14:51:44 +08:00
Kityn
52c482ed98 Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/
2024-09-18 02:41:35 -04:00
Bas
3e348f94e6 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-09-18 02:41:35 -04:00
Bill Thornton
e08db55a52 Merge pull request #5950 from gnattu/localization-VideoCodecTagNotSupported 2024-09-17 22:29:26 -04:00
Bill Thornton
cd14a6bcff Use consistent icon names
Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com>
2024-09-17 17:33:44 -04:00
Bill Thornton
414ae94312 Normalize item icons 2024-09-17 16:40:19 -04:00
dependabot[bot]
8dcb78141d Bump vite from 5.3.5 to 5.4.6
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.3.5 to 5.4.6.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.6/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.6/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-17 19:59:41 +00:00
Bill Thornton
3e494a14d9 Update mixed and collection libraries 2024-09-17 12:39:40 -04:00
Chris Lee
1564c93fbc Translated using Weblate (Norwegian Bokmål)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nb_NO/
2024-09-17 11:41:35 -04:00
grafixeyehero
44ee208768 Backport pull request #6041 from jellyfin-web/release-10.9.z
Fix list view item undefined

Original-merge: 6cae5c2646

Merged-by: thornbill <thornbill@users.noreply.github.com>

Backported-by: thornbill <thornbill@users.noreply.github.com>
2024-09-17 10:40:40 -04:00
nyanmisaka
0a10676649 Add HEVC RExt HW decoding options
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2024-09-17 19:48:46 +08:00
Dmitry Lyzo
393db341a6 Discard chrome and safari on Tizen and webOS 2024-09-17 13:08:44 +03:00
Chris Lee
0ae080a150 Translated using Weblate (Norwegian Bokmål)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nb_NO/
2024-09-17 05:41:35 -04:00
gnattu
d9d2f8d0be Cleanup removed function 2024-09-17 17:05:18 +08:00
gnattu
020dad8867 Increase reference bitrate for high efficiency codecs 2024-09-17 17:01:42 +08:00
gnattu
33a5533b11 Remove unused functions 2024-09-17 12:25:06 +08:00
Chris Lee
e5df4dd56b Translated using Weblate (Norwegian Bokmål)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nb_NO/
2024-09-16 09:41:35 -04:00
renovate[bot]
f5343add06 Update tanstack-query monorepo to v5.55.4 2024-09-16 07:37:01 +00:00
Bill Thornton
818f90d05c Merge pull request #6043 from gnattu/fix-enum-transcode
Change encoding preset and play stats for server change
2024-09-16 00:24:16 -04:00
Filipe Motta
1bd6e96e27 Translated using Weblate (Portuguese (Brazil))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_BR/
2024-09-15 20:41:34 -04:00
stanol
fb7889e05e Translated using Weblate (Ukrainian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/uk/
2024-09-15 16:41:34 -04:00
Nyanmisaka
19a91de079 Translated using Weblate (Chinese (Simplified))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2024-09-15 13:41:35 -04:00
millallo
d761c946f0 Translated using Weblate (Italian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/it/
2024-09-15 13:41:34 -04:00
Bas
1743356420 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-09-15 11:41:34 -04:00
Kityn
156e4ba5c3 Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/
2024-09-15 09:41:34 -04:00
sand14
76fd9da5e8 Translated using Weblate (Romanian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ro/
2024-09-14 21:41:34 -04:00
Bas
685e4efc34 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-09-14 19:41:34 -04:00
Bill Thornton
e388dbe339 Merge pull request #6068 from thornbill/no-more-redirects 2024-09-14 16:52:12 -04:00
Bill Thornton
6984d1a26d Merge pull request #5978 from gnattu/add-more-livetv-tuner-options 2024-09-14 16:51:53 -04:00
Bill Thornton
51738621f6 Merge pull request #5635 from Shadowghost/enhance-trickplay 2024-09-14 16:51:18 -04:00
gnattu
b2dc11b231 Allow VP9 remuxing for chrome and firefox
Have tested with HLS.js on those clients and works well in fMP4 container
2024-09-14 18:03:19 +08:00
gnattu
2f297971d7 Merge branch 'fork/bitrate-control' 2024-09-14 17:55:26 +08:00
gnattu
28552b2d1a Use pop instead of minBy 2024-09-14 17:55:13 +08:00
gnattu
994118b899 Apply suggestions from code review
Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com>
2024-09-14 17:42:41 +08:00
gnattu
2bb60e2241 Fix lint 2024-09-14 17:09:03 +08:00
gnattu
16a1416521 Code cleanup 2024-09-14 17:06:37 +08:00
gnattu
4c3095412b Separate bitrate control from resolution 2024-09-14 16:46:02 +08:00
Facu
48e45cf52c Translated using Weblate (Spanish (Argentina))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_AR/
2024-09-14 01:41:34 -04:00
Sebastião josé
5def65a118 Translated using Weblate (Portuguese (Brazil))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_BR/
2024-09-13 20:41:34 -04:00
Dmitry Lyzo
edfae1f1b8 Fix focus indication on artist and album
`emby-button` class is used as a flag for `EmbyButton.createdCallback`.
2024-09-14 02:53:14 +03:00
Dmitry Lyzo
61c58d8cb0 Fix focus indication on tags
`emby-button` class is used as a flag for `EmbyButton.createdCallback`.
2024-09-14 02:53:14 +03:00
Dmitry Lyzo
3025e9bf48 Ignore modified hotkeys 2024-09-14 02:03:38 +03:00
Dmitry Lyzo
b2676c1633 Prevent more default actions for hotkeys 2024-09-14 02:01:10 +03:00
Dmitry Lyzo
4c68f500d9 Use keydown event to get actual modifiers 2024-09-14 02:01:09 +03:00
Dmitry Lyzo
d20c617d30 Quit immediately if not ready 2024-09-14 02:00:55 +03:00
Hunter Austin
de71d1ef46 Prevent default actions for hotkeys 2024-09-14 01:37:01 +03:00
David Schulte
c5d3b081cf Updated libpgs to add web-worker support for PGS rendering. 2024-09-13 22:45:13 +02:00
David Schulte
a6732739c5 Respecting local burn-in subtitle setting when checking for PGS support. 2024-09-13 22:45:03 +02:00
David Schulte
febc67f04d Added time offset support for PGS subtitles. 2024-09-13 22:45:01 +02:00
David Schulte
e9aedc3305 Added native PGS (graphical subtitle) rendering for external streams. 2024-09-13 22:44:47 +02:00
xwr
9184f06d79 Translated using Weblate (Galician)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/gl/
2024-09-13 14:41:34 -04:00
Bill Thornton
e9464b2c6b Remove broken redirects 2024-09-13 10:17:29 -04:00
gnattu
ee2b5b9035 Don't allow 0 as bitrate
Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com>
2024-09-13 12:15:54 +08:00
annorberg98
47363822a3 Translated using Weblate (Swedish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sv/
2024-09-12 16:41:34 -04:00
longan
9438dcbb4c Translated using Weblate (Chinese (Simplified))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2024-09-12 02:41:34 -04:00
renovate[bot]
a493ac8546 Update dependency material-react-table to v2.13.3 2024-09-12 03:50:44 +00:00
gnattu
2a522f795f Fix none hwaccel 2024-09-12 10:52:46 +08:00
Mirito
7eb70445e0 Translated using Weblate (Italian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/it/
2024-09-11 16:41:34 -04:00
Terrorwolf
1fe90b51ef Translated using Weblate (German)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/
2024-09-11 16:41:34 -04:00
renovate[bot]
fc0d62f4e7 Update dependency cssnano to v7.0.6 2024-09-11 17:51:40 +00:00
Bill Thornton
335870aa26 Merge pull request #6060 from thornbill/cb7-support
Add support for cbt and cb7 books
2024-09-11 13:51:05 -04:00
Bill Thornton
da6e3d1dda Add support for cbt and cb7 books 2024-09-11 12:54:52 -04:00
Bill Thornton
462d5ac245 Merge pull request #6061 from thornbill/fix-dl-artifact-action
Use correct artifact download action
2024-09-11 12:54:09 -04:00
Bill Thornton
407d470594 Use correct artifact download action 2024-09-11 12:48:46 -04:00
Bill Thornton
cdf0fced8d Merge pull request #6059 from thornbill/babel-cleanup
Cleanup babel plugins
2024-09-11 11:50:12 -04:00
Bill Thornton
d53a41abb6 Cleanup babel plugins 2024-09-11 10:29:30 -04:00
Bill Thornton
ff6cda47e1 Merge pull request #6038 from jellyfin/renovate/libarchive.js-2.x
Update dependency libarchive.js to v2
2024-09-11 10:23:56 -04:00
Bill Thornton
bec74d2949 Fix libarchive bundling 2024-09-11 10:20:11 -04:00
renovate[bot]
304b649d51 Update dependency sass-embedded to v1.78.0 2024-09-11 01:54:07 +00:00
renovate[bot]
18c8a30109 Update dependency sass to v1.78.0 2024-09-11 01:53:51 +00:00
felix920506
5daaf89f74 Translated using Weblate (Chinese (Traditional))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant/
2024-09-10 19:41:34 -04:00
queeup
15dbf563de Translated using Weblate (Turkish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/tr/
2024-09-10 17:41:35 -04:00
Andi Chandler
9d1160b745 Translated using Weblate (English (United Kingdom))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/en_GB/
2024-09-10 17:41:34 -04:00
renovate[bot]
7f334b09db Update dependency webpack-dev-server to v5.1.0 2024-09-10 20:21:53 +00:00
queeup
adeb2dcfbe Translated using Weblate (Turkish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/tr/
2024-09-10 15:41:34 -04:00
Bas
96d49946c9 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-09-10 15:41:34 -04:00
stanol
a77731789d Translated using Weblate (Ukrainian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/uk/
2024-09-10 12:41:34 -04:00
Nyanmisaka
0bcdc985ed Translated using Weblate (Chinese (Simplified))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2024-09-10 10:41:34 -04:00
mario
1fb2d77629 Translated using Weblate (German)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/
2024-09-10 10:41:34 -04:00
Lukáš Kucharczyk
87e197b465 Translated using Weblate (Czech)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/
2024-09-10 06:41:34 -04:00
Kityn
23e624bd8e Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/
2024-09-10 04:41:34 -04:00
gnattu
10a8dead0c Fix i18n after rebasing 2024-09-10 10:44:26 +08:00
grafixeyehero
1c18fa8fb2 apply suggestion
Co-authored-by: dmitrylyzo <56478732+dmitrylyzo@users.noreply.github.com>
2024-09-10 04:46:48 +03:00
Shadowghost
848d2dbc36 Fixup 2024-09-09 21:02:50 +02:00
Bas
94491fcdfa Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-09-09 14:41:34 -04:00
gnattu
cd3ef93a6c Use classList.toggle 2024-09-10 02:38:06 +08:00
gnattu
20360b5786 Make Live TV compatibility profiles customizable 2024-09-10 02:38:05 +08:00
Bill Thornton
a014f2775e Fix wasm paths 2024-09-09 14:03:17 -04:00
Bill Thornton
143fac6ac6 Merge pull request #6042 from jellyfin/renovate/sortablejs-1.x
Update dependency sortablejs to v1.15.3
2024-09-09 13:56:28 -04:00
Cody Robibero
6c39c5d9b8 Apply suggestions from code review
Co-authored-by: Bill Thornton <thornbill@users.noreply.github.com>
2024-09-09 11:53:52 -06:00
Shadowghost
cec6dd14ff Apply review suggestions 2024-09-09 19:08:43 +02:00
Shadowghost
83f9307a2c Enhance trickplay 2024-09-09 19:05:55 +02:00
Bill Thornton
8720589ac8 Merge pull request #5986 from gnattu/add-audio-compatability-options
Add audio options to workaround compatability problems
2024-09-09 12:54:43 -04:00
nyanmisaka
944df7b433 Update string for RKMPP support in Trickplay
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2024-09-09 21:09:34 +08:00
Lea3D
c498259bec Translated using Weblate (German)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/
2024-09-09 08:41:34 -04:00
gnattu
db972f84dc Hide hardware acceleration type in playstats 2024-09-09 16:41:02 +08:00
gnattu
49ae4c3f40 FIx auto preset in enum 2024-09-09 16:40:48 +08:00
Tokogc
6deffc3503 Translated using Weblate (Spanish (Latin America))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_419/
2024-09-08 20:41:34 -04:00
Federico Abella
0239a6faa3 Translated using Weblate (Spanish (Argentina))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_AR/
2024-09-08 20:41:34 -04:00
grafixeyehero
49b0ba3071 apply suggestion
Co-authored-by: dmitrylyzo <56478732+dmitrylyzo@users.noreply.github.com>
2024-09-09 02:30:21 +03:00
renovate[bot]
6a65a08480 Update dependency sortablejs to v1.15.3 2024-09-08 23:10:58 +00:00
Nyanmisaka
a207a305a2 Translated using Weblate (Chinese (Simplified))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2024-09-08 17:41:34 -04:00
Jolter
a203857a4c Translated using Weblate (Swedish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sv/
2024-09-08 17:41:34 -04:00
Nyanmisaka
10d615c4d0 Apply suggestions from code review
Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com>
2024-09-09 04:33:39 +08:00
grafixeyehero
690b1fbed5 Add detail view buttons 2024-09-08 20:15:20 +03:00
grafixeyehero
f7fcf44f94 Add global Api hooks 2024-09-08 20:12:37 +03:00
renovate[bot]
23f2861c89 Update dependency libarchive.js to v2 2024-09-08 14:59:32 +00:00
Bill Thornton
2b51931a5f Merge pull request #5999 from jellyfin/renovate/babel 2024-09-08 10:52:26 -04:00
renovate[bot]
d8c37a5230 Update Babel to v7.25.4 2024-09-08 14:43:27 +00:00
Bill Thornton
a09d8e23b9 Merge pull request #5973 from jellyfin/renovate/core-js-3.x 2024-09-08 10:41:48 -04:00
Bill Thornton
d2f65ef423 Merge pull request #5979 from jellyfin/renovate/emotion-monorepo 2024-09-08 10:37:42 -04:00
Bill Thornton
21f2b1023b Merge pull request #5980 from jellyfin/renovate/swiper-11.x 2024-09-08 10:28:20 -04:00
Bill Thornton
741cf30a97 Merge pull request #6014 from jellyfin/renovate/jsdom-25.x 2024-09-08 10:25:11 -04:00
renovate[bot]
cf6e64fa1a Update dependency swiper to v11.1.12 2024-09-08 14:22:47 +00:00
Bill Thornton
d344d0e23f Merge pull request #6030 from jellyfin/renovate/react 2024-09-08 10:22:11 -04:00
gnattu
f6efaaf379 Move Normalization to AudioAdvanced Section 2024-09-08 22:14:20 +08:00
gnattu
e810ec3cd9 Add audio options to workaround compatability problems 2024-09-08 22:14:19 +08:00
Bill Thornton
62afe95038 Merge pull request #6033 from jellyfin/renovate/material-ui-monorepo 2024-09-08 10:10:52 -04:00
Lukáš Kucharczyk
d4467424a0 Translated using Weblate (Czech)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/
2024-09-08 06:41:34 -04:00
Nguyễn Hữu Duy
e647562dd1 Translated using Weblate (Vietnamese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/vi/
2024-09-08 04:41:34 -04:00
Bill Thornton
e006d546bf Merge pull request #6035 from jellyfin/renovate/peter-evans-create-pull-request-7.x 2024-09-08 03:45:23 -04:00
Bill Thornton
b6aba44c57 Merge pull request #6032 from jellyfin/renovate/linters 2024-09-08 03:42:44 -04:00
Bill Thornton
4cf21e36bb Merge pull request #6031 from jellyfin/renovate/material-react-table-2.x 2024-09-08 03:39:29 -04:00
renovate[bot]
249d99e991 Update dependency jsdom to v25 2024-09-08 07:37:03 +00:00
renovate[bot]
f797aa3457 Update peter-evans/create-pull-request action to v7 2024-09-08 07:35:31 +00:00
renovate[bot]
ecb0502d67 Update dependency @mui/x-date-pickers to v7.15.0 2024-09-08 07:34:16 +00:00
renovate[bot]
35dd0ce82e Update Linters 2024-09-08 07:33:59 +00:00
Bill Thornton
9b98cb0147 Merge pull request #5967 from jellyfin/renovate/webpack 2024-09-08 03:33:48 -04:00
renovate[bot]
a94b6b8c66 Update dependency material-react-table to v2.13.2 2024-09-08 07:33:08 +00:00
Bill Thornton
e06a2ce78d Merge pull request #5974 from jellyfin/renovate/tanstack-query-monorepo 2024-09-08 03:32:59 -04:00
renovate[bot]
1da4d73449 Update dependency core-js to v3.38.1 2024-09-08 07:32:36 +00:00
renovate[bot]
06703fe338 Update dependency @types/react to v18.3.5 2024-09-08 07:32:20 +00:00
renovate[bot]
23d37a2c5b Update dependency @emotion/react to v11.13.3 2024-09-08 07:32:07 +00:00
renovate[bot]
209d1a2529 Update Webpack 2024-09-08 07:30:09 +00:00
Bill Thornton
8d958298df Merge pull request #5981 from jellyfin/renovate/npm-webpack-vulnerability 2024-09-08 03:27:22 -04:00
Bill Thornton
3e26d4100f Merge pull request #6017 from jellyfin/update-jf-sdk 2024-09-08 03:25:36 -04:00
jellyfin-bot
ebc53f06eb Update @jellyfin/sdk to 0.0.0-unstable.202409080303 2024-09-08 07:05:24 +00:00
Kityn
5e2d6b7475 Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/
2024-09-08 02:41:34 -04:00
yuygfgg
e5c3d553d5 Translated using Weblate (Chinese (Simplified))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2024-09-07 23:41:34 -04:00
Bas
6fc7df46c2 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-09-07 23:41:34 -04:00
Bill Thornton
b37766e273 Merge pull request #6024 from thornbill/no-app-router 2024-09-07 21:57:55 -04:00
Bill Thornton
ee29a98aef Merge pull request #6020 from thornbill/tag-list-view 2024-09-07 21:57:22 -04:00
Bill Thornton
c80e0fde0c Merge pull request #5901 from gnattu/safari-hi10p 2024-09-07 21:53:01 -04:00
tcely
2aabb13640 Backport pull request #6016 from jellyfin-web/release-10.9.z
Show slideshow controls when touched

Original-merge: 2682098f61

Merged-by: thornbill <thornbill@users.noreply.github.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-09-07 18:07:37 -04:00
thornbill
3709b99d33 Backport pull request #6015 from jellyfin-web/release-10.9.z
Fix touch events in experimental video player

Original-merge: 6b1352a855

Merged-by: thornbill <thornbill@users.noreply.github.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-09-07 18:07:36 -04:00
thornbill
67201033c6 Backport pull request #6013 from jellyfin-web/release-10.9.z
Fix autocast when already connected

Original-merge: a1721ddd17

Merged-by: thornbill <thornbill@users.noreply.github.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-09-07 18:07:35 -04:00
thornbill
5b1ab478c1 Backport pull request #6012 from jellyfin-web/release-10.9.z
Hide studios for collections and playlists

Original-merge: 7d30057c37

Merged-by: thornbill <thornbill@users.noreply.github.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-09-07 18:07:33 -04:00
thornbill
819537da0f Backport pull request #6011 from jellyfin-web/release-10.9.z
Fix network mode for localhost server

Original-merge: b9925ebf73

Merged-by: thornbill <thornbill@users.noreply.github.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-09-07 18:07:32 -04:00
nyanmisaka
5eb91ea398 Backport pull request #5983 from jellyfin-web/release-10.9.z
Fix overly strict dovi level testing

Original-merge: 2ebf0c9fe4

Merged-by: thornbill <thornbill@users.noreply.github.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-09-07 18:07:31 -04:00
dmitrylyzo
5e33b983a5 Backport pull request #5972 from jellyfin-web/release-10.9.z
Apply Maximum Allowed Audio Channels to DirectPlay

Original-merge: 20ea6041a7

Merged-by: thornbill <thornbill@users.noreply.github.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-09-07 18:07:30 -04:00
viown
cf9af1f392 Backport pull request #5949 from jellyfin-web/release-10.9.z
Fix play all & shuffle not working on genres

Original-merge: ef00d439b1

Merged-by: thornbill <thornbill@users.noreply.github.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-09-07 18:07:29 -04:00
fabriciodeuner
d0a749b76c Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt/
2024-09-07 13:41:35 -04:00
fabriciodeuner
091307bc5e Translated using Weblate (Portuguese (Brazil))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_BR/
2024-09-07 13:41:34 -04:00
Lukáš Kucharczyk
49c2a0f08c Translated using Weblate (Czech)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/
2024-09-07 13:41:34 -04:00
bene toffix
c7f8af39f7 Translated using Weblate (Catalan)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ca/
2024-09-07 11:41:34 -04:00
nyanmisaka
6660f57d98 Add support for DoVi Profile 10
Profile 10 spec covers DoVi video with and without the fallback layer.

For now, once a device reports support for dav1.10, it is assumed that
the device supports them all.

Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2024-09-07 22:21:39 +08:00
Jolter
708b1654d2 Translated using Weblate (Swedish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sv/
2024-09-07 08:41:34 -04:00
Bas
b7e56578ed Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-09-07 05:41:34 -04:00
Bill Thornton
ce182d286b Remove unused context variable 2024-09-07 01:54:55 -04:00
Bill Thornton
4bcbf65d1f Merge pull request #5997 from dmitrylyzo/fix-legacy-devtools
Fix @tanstack/query-devtools on legacy browsers
2024-09-06 12:22:38 -04:00
Bill Thornton
99b2bd4f6e Remove app router routing 2024-09-06 11:41:58 -04:00
stanol
d532b9419c Translated using Weblate (Ukrainian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/uk/
2024-09-06 08:41:34 -04:00
renovate[bot]
eec2db6abd Update tanstack-query monorepo to v5.53.1 2024-09-06 10:52:38 +00:00
Bas
a805e0b042 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-09-06 04:41:34 -04:00
Nyanmisaka
b3b6b01619 Translated using Weblate (Chinese (Simplified))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2024-09-05 19:41:34 -04:00
Jesus Lopez Reynosa
8d662ddb87 Translated using Weblate (Spanish (Mexico))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_MX/
2024-09-05 19:41:34 -04:00
Kityn
c85fb80618 Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/
2024-09-05 14:41:34 -04:00
Andreas Hantschel
b3e92b606f Translated using Weblate (German)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/
2024-09-05 14:41:34 -04:00
Dmitry Lyzo
0fbfda882d Don't use devtools on the TV as the navigation is weird 2024-09-05 21:21:59 +03:00
Dmitry Lyzo
ea27750d7d Fix @tanstack/query-devtools on legacy browsers 2024-09-05 21:21:59 +03:00
Bill Thornton
c1cfe7c2e9 Merge pull request #6023 from gnattu/update-sw-tonemap-i18n
Update software tonemap help text to mention dovi
2024-09-05 12:23:46 -04:00
MattiaPell
a709c624b2 Translated using Weblate (Italian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/it/
2024-09-05 06:41:34 -04:00
Bill Thornton
f4a872d780 Merge pull request #6001 from thornbill/table-filters 2024-09-05 00:03:34 -04:00
gnattu
b1c853c06a Update software tonemap help text to mention dovi 2024-09-05 08:59:17 +08:00
Victor Sueiro
0580e13dc8 Translated using Weblate (Spanish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es/
2024-09-04 19:41:34 -04:00
RobotFK
9d6e266cf8 Translated using Weblate (German)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/
2024-09-04 14:41:34 -04:00
Cody Robibero
96e49dadd4 set default values for getting the list of ordered plugins 2024-09-04 11:28:58 -06:00
Bill Thornton
a1f5788c9a Merge pull request #6003 from grafixeyehero/Fix-library-tabs-translate
Fix library tabs translate on experimental layout
2024-09-04 13:07:19 -04:00
LJQ
c02b1e651f Apply suggestion 2024-09-05 01:06:26 +08:00
Bill Thornton
e528847b7c Merge pull request #5938 from grafixeyehero/Add-SecondaryMediaInfo&Stats
Add Secondary Media Info & Media Info Stats
2024-09-04 12:25:52 -04:00
Bill Thornton
b11f4fa4b1 Add tag type for list view 2024-09-04 11:55:18 -04:00
無情天
f9617f6409 Translated using Weblate (Chinese (Simplified))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2024-09-04 09:41:34 -04:00
Andi Chandler
ef7018c3e5 Translated using Weblate (English (United Kingdom))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/en_GB/
2024-09-04 09:41:33 -04:00
Bill Thornton
d01cfa498b Add tag support to list view 2024-09-04 08:39:10 -04:00
stanol
f591296bfe Translated using Weblate (Ukrainian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/uk/
2024-09-04 06:41:33 -04:00
Kityn
ed4a70494c Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/
2024-09-04 02:41:34 -04:00
Lukáš Kucharczyk
d4d6119a9d Translated using Weblate (Czech)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/
2024-09-04 02:41:34 -04:00
Bill Thornton
c8db463868 Merge pull request #5987 from gnattu/limit-opus-to-safari17
Limit opus support to Safari 17
2024-09-03 16:45:51 -04:00
Bill Thornton
d4784bd089 Merge pull request #5985 from gnattu/new-tonemap-modes
Add new tonemap mode options
2024-09-03 16:42:42 -04:00
renovate[bot]
eaba08c229 Update dependency webpack to v5.94.0 [SECURITY] 2024-09-03 20:06:55 +00:00
Bill Thornton
4077ee3009 Merge pull request #5996 from jellyfin/update-jf-sdk 2024-09-03 16:06:08 -04:00
Cody Robibero
00e002faeb Add lyric fetcher settings to library options 2024-09-03 15:59:15 -04:00
Bill Thornton
722010a960 Merge pull request #5966 from p0358/patch-hidden-tasks-error
Fix hidden scheduled task progress updates causing errors
2024-09-03 15:56:53 -04:00
Bill Thornton
411fff219c Merge pull request #5893 from Narfinger/master
Show error when library ids are invalid
2024-09-03 15:51:17 -04:00
venkata nadha reddy
6bee8694a2 Include The Name Of The TV Show while displaying Episodes In Playlists. (#5778)
* Include The Name Of The TV Show while displaying Episodes In Playlists.

* Include The Name Of The TV Show while displaying Episodes In Collections.

* Undoing Carbuilder changes.

* Undoing itemHelper changes

* change in playlistViewer using showParentTitle
2024-09-03 15:47:30 -04:00
stanol
78fba289f2 Translated using Weblate (Ukrainian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/uk/
2024-09-03 14:41:33 -04:00
Skycro
3ecfda5292 Translated using Weblate (German)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/
2024-09-03 11:41:34 -04:00
Jonas Jensen
e13cd21924 Translated using Weblate (Danish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/da/
2024-09-03 11:41:33 -04:00
Bill Thornton
24129e0e98 Merge pull request #5995 from jwaresoft/5968-create-library-modal-disappears-no-library
Fix create library crashing when no path specified
2024-09-03 09:42:26 -04:00
Facu
d5a50e6eb0 Translated using Weblate (Spanish (Latin America))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_419/
2024-09-03 04:41:33 -04:00
jellyfin-bot
736da16ecd Update @jellyfin/sdk to 0.0.0-unstable.202409030501 2024-09-03 07:05:34 +00:00
Vilhelm Prytz
54c1f05a41 Translated using Weblate (Swedish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sv/
2024-09-03 02:41:33 -04:00
Nikhit Kumar
34b535a83d Translated using Weblate (Malayalam)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ml/
2024-09-02 13:41:33 -04:00
Bill Thornton
1b1a9c93db Merge pull request #5994 from jellyfin/renovate/ci-deps 2024-09-02 01:51:43 -04:00
renovate[bot]
ea42a6c58f Update CI dependencies 2024-09-02 01:07:48 +00:00
Pierre Bidet
f259c6911d Translated using Weblate (French)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/
2024-09-01 09:41:34 -04:00
uxdesignerhector
ec04ae9be2 Translated using Weblate (Spanish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es/
2024-09-01 09:41:33 -04:00
Josh Hood
718faac423 Translated using Weblate (Cornish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/kw/
2024-08-31 02:41:33 -04:00
Tushar Joshi
0997ef3f4e Translated using Weblate (Gujarati)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/gu/
2024-08-31 02:41:33 -04:00
Josh Hood
770d7dfe98 Translated using Weblate (Cornish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/kw/
2024-08-30 17:41:33 -04:00
Martin Clüwer Slåtsve
03590e0f8f Translated using Weblate (Norwegian Bokmål)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nb_NO/
2024-08-30 17:41:33 -04:00
grafixeyehero
395a51cfa0 Fix tabs translate on experimental layout 2024-08-30 23:05:22 +03:00
Josh Hood
76ccfb0df9 Translated using Weblate (Cornish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/kw/
2024-08-30 14:41:33 -04:00
Josh Hood
957c1d09d0 Added translation using Weblate (Cornish) 2024-08-30 13:35:56 -04:00
Bill Thornton
1a939fe473 Add level and user filters 2024-08-30 12:04:40 -04:00
Bill Thornton
07bb315bb3 Add date filter to activity table 2024-08-30 10:13:19 -04:00
Bill Thornton
aaa116d218 Merge pull request #5763 from jellyfin/renovate/material-ui-monorepo 2024-08-30 09:02:05 -04:00
renovate[bot]
0558c77fc3 Update material-ui monorepo to v5.16.7 2024-08-30 12:41:58 +00:00
Bill Thornton
7c3270725e Merge pull request #5970 from thornbill/material-react-table 2024-08-30 08:40:54 -04:00
Lukáš Kucharczyk
e5bb45d7be Translated using Weblate (Czech)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/
2024-08-30 06:41:33 -04:00
Andi Chandler
e0641ee97f Translated using Weblate (English (United Kingdom))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/en_GB/
2024-08-29 18:41:33 -04:00
jwaresoft
1669b0aee8 5968: move prevent default to top to prevent modal from crashing with promise 2024-08-29 12:23:47 -07:00
Nyanmisaka
2a7edf12fb Translated using Weblate (Chinese (Simplified))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2024-08-29 14:41:33 -04:00
Louis Engell
c0e0f98cce Translated using Weblate (Danish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/da/
2024-08-29 14:41:33 -04:00
hoanghuy309
85988fcd50 Translated using Weblate (Vietnamese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/vi/
2024-08-29 12:41:33 -04:00
Humam
4880efe824 Translated using Weblate (Arabic)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ar/
2024-08-29 12:41:33 -04:00
Bill Thornton
ff18bedca7 Fix column visibility toggles 2024-08-29 11:20:44 -04:00
Kityn
968696b2a0 Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/
2024-08-29 09:41:33 -04:00
Bas
6d092ce204 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-08-29 09:41:33 -04:00
Bill Thornton
31e54c05ad Merge pull request #5988 from jellyfin/renovate/hls.js-1.x 2024-08-29 09:04:18 -04:00
Bill Thornton
2fa1a3b355 Merge pull request #5989 from jellyfin/update-jf-sdk 2024-08-29 08:05:09 -04:00
Bill Thornton
bfc37b4171 Refactor LogLevelCell 2024-08-29 07:59:01 -04:00
Bill Thornton
10662fc013 Merge pull request #5992 from nyanmisaka/show-rotation-mediainfo 2024-08-29 07:41:53 -04:00
millallo
5cd3c528eb Translated using Weblate (Italian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/it/
2024-08-29 07:41:33 -04:00
nyanmisaka
00876950d1 Adjust the order of transcoding fps and speed ratio
This item corresponds to `TranscodingInfo.Framerate`, so put speed ratio at the end.

Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2024-08-29 16:08:34 +08:00
nyanmisaka
0127a3c660 Show video rotation in mediainfo
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2024-08-29 16:03:36 +08:00
lostbit
a077fd21cc Add default choice to collection display order 2024-08-29 09:54:12 +02:00
LJQ
e34c10644e Rm Trailing spaces 2024-08-29 15:19:48 +08:00
LJQ
8d8362158c restore newline 2024-08-29 15:15:44 +08:00
LJQ
872d71df3d Allow editing of original title for Season and Episode items 2024-08-29 15:14:57 +08:00
jellyfin-bot
25eceaecd9 Update @jellyfin/sdk to 0.0.0-unstable.202408290501 2024-08-29 07:06:13 +00:00
Tushar Joshi
91d3a9b161 Translated using Weblate (Gujarati)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/gu/
2024-08-29 02:41:33 -04:00
Nguyen Thanh
0cc6f9e71d Translated using Weblate (Vietnamese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/vi/
2024-08-29 02:41:33 -04:00
renovate[bot]
ab72232968 Update dependency hls.js to v1.5.15 2024-08-29 05:07:20 +00:00
gnattu
79bea95557 Limit opus support to Safari 17 2024-08-29 10:24:11 +08:00
gnattu
15174b90e5 Add new tonemap mode options 2024-08-29 08:21:09 +08:00
無情天
86acd74617 Translated using Weblate (Chinese (Simplified))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2024-08-28 19:41:33 -04:00
Bill Thornton
2cb2c97fe9 Merge pull request #5984 from thornbill/refactor-settings-hook
Add user settings context
2024-08-28 17:36:27 -04:00
Bill Thornton
aef4a42f8e Add user settings hook 2024-08-28 16:30:02 -04:00
PaneradFisk
4905ec09ae Translated using Weblate (Swedish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sv/
2024-08-28 14:41:33 -04:00
Fedor M
b92059a5be Translated using Weblate (Russian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ru/
2024-08-28 12:41:33 -04:00
Bill Thornton
af834e4071 Merge pull request #5975 from jellyfin/renovate/react
Update dependency @types/react to v18.3.4
2024-08-28 11:00:22 -04:00
Bill Thornton
fa0f420250 Merge pull request #5977 from jellyfin/update-jf-sdk
Update @jellyfin/sdk to 0.0.0-unstable.202408280502
2024-08-28 10:59:29 -04:00
jalmartonsau
9189b2d144 Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/et/
2024-08-28 08:41:33 -04:00
stanol
29bbd5d772 Translated using Weblate (Ukrainian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/uk/
2024-08-28 08:41:33 -04:00
jellyfin-bot
f5bf795f1f Update @jellyfin/sdk to 0.0.0-unstable.202408280502 2024-08-28 07:05:13 +00:00
Tushar Joshi
a4721b1203 Translated using Weblate (Gujarati)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/gu/
2024-08-28 02:41:35 -04:00
Kityn
df2af17a90 Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/
2024-08-28 02:41:34 -04:00
Bas
683c6a7c98 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-08-28 02:41:34 -04:00
Lukáš Kucharczyk
82d41b0836 Translated using Weblate (Czech)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/
2024-08-28 02:41:33 -04:00
Tushar Joshi
e9d15a6f4b Added translation using Weblate (Gujarati) 2024-08-28 01:13:42 -04:00
felix920506
5644b9d6ca Change "Last Seen" to "Last Logged In" to reduce confusion when translating (#5953) 2024-08-27 22:40:17 -04:00
Fedor M
8f0c6275c5 Translated using Weblate (Russian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ru/
2024-08-27 21:41:33 -04:00
Bas
5d51048ed4 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-08-27 18:41:33 -04:00
p0358
edbf5962f8 Fix hidden scheduled task progress updates causing errors 2024-08-27 23:42:44 +02:00
Bill Thornton
9c2b6d5e69 Merge pull request #5604 from scampower3/reset-metadata
Add button to reset metadata in metadata editor
2024-08-27 16:54:08 -04:00
renovate[bot]
287bd48923 Update dependency @types/react to v18.3.4 2024-08-27 20:40:11 +00:00
Bill Thornton
9b436be72f Fix hook file extensions 2024-08-27 12:41:47 -04:00
Bill Thornton
ef20060e81 Remove @mui/x-data-grid dependency 2024-08-27 12:41:47 -04:00
Bill Thornton
cb906678e6 Refactor cell components 2024-08-27 12:41:47 -04:00
Bill Thornton
c7ed7ed48f Fix activity log hooks 2024-08-27 12:41:47 -04:00
Bill Thornton
694ba9718d Migrate to material react table 2024-08-27 12:41:47 -04:00
Bill Thornton
6b4ad3717f Merge pull request #5727 from bu3alwa/refactor-activity-dashboard
Refactor activity page to use react query requests
2024-08-27 09:07:27 -04:00
Bill Thornton
9960826c9c Merge pull request #5971 from jellyfin/update-jf-sdk 2024-08-27 08:53:58 -04:00
jellyfin-bot
0b0696cdfc Update @jellyfin/sdk to 0.0.0-unstable.202408270502 2024-08-27 07:05:01 +00:00
Narfinger
fb82c25358 Update src/strings/en-us.json
Co-authored-by: Bill Thornton <thornbill@users.noreply.github.com>
2024-08-27 10:35:47 +09:00
Bill Thornton
d32a431cab Merge pull request #5964 from jellyfin/renovate/tanstack-query-monorepo 2024-08-26 08:48:48 -04:00
LJQ
3b7d159749 Add suggestions 2024-08-26 19:50:04 +08:00
renovate[bot]
92a25b2364 Update tanstack-query monorepo to v5.51.24 2024-08-26 11:18:05 +00:00
Bill Thornton
8b463b71ea Merge pull request #5962 from jellyfin/update-jf-sdk 2024-08-26 07:16:36 -04:00
Nyanmisaka
698eb9f08f Translated using Weblate (Chinese (Simplified))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2024-08-26 06:41:33 -04:00
jellyfin-bot
44989be588 Update @jellyfin/sdk to 0.0.0-unstable.202408260501 2024-08-26 07:05:45 +00:00
toryacode
9a24c2fbd1 Translated using Weblate (Russian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ru/
2024-08-25 15:41:33 -04:00
Bill Thornton
3256c179c0 Merge pull request #5954 from jellyfin/update-jf-sdk 2024-08-25 14:50:07 -04:00
Bill Thornton
59c5a5a41c Merge pull request #5957 from jellyfin/renovate/postcss 2024-08-25 14:49:39 -04:00
renovate[bot]
6733d606eb Update dependency postcss-preset-env to v10.0.2 2024-08-25 18:33:42 +00:00
gnattu
03eb42a8cf Reorder safari hi10p profile before normal profile 2024-08-26 00:12:37 +08:00
Miroslav Prasil
fd18c3e600 Support for Home and Search media keys in TV mode
The remote I have has some extra "media" buttons besides the already
supported playback controls.

This adds support for "Find" button to navigate to search page and
"BrowserHome" button to navigate back to main screen.

Adding these to the `NavigationKeys` only enables functionality for TV
mode which I think is pretty reasonable constraint - on actual desktop
people might prefer to use these keys to control the browser rather than
Jellyfin interface.
2024-08-25 10:46:43 +00:00
Wen
14fd036f93 Translated using Weblate (French)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/
2024-08-25 06:41:33 -04:00
Justin
27c7324692 Translated using Weblate (German)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/
2024-08-25 06:41:33 -04:00
aky
f1aae0e9ae Translated using Weblate (Korean)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ko/
2024-08-25 04:41:33 -04:00
jellyfin-bot
3e79184255 Update @jellyfin/sdk to 0.0.0-unstable.202408250502 2024-08-25 07:05:00 +00:00
gnattu
286f9ab4e0 Backport pull request #5923 from jellyfin-web/release-10.9.z
Fix safari volume being reset when track changed

Original-merge: 6a8f21e462

Merged-by: thornbill <thornbill@users.noreply.github.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-08-25 02:47:28 -04:00
gnattu
cceb1a5935 Backport pull request #5920 from jellyfin-web/release-10.9.z
Fix Safari volume control

Original-merge: 90236c25ee

Merged-by: thornbill <thornbill@users.noreply.github.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-08-25 02:47:25 -04:00
viown
9a3cba06d1 Backport pull request #5915 from jellyfin-web/release-10.9.z
Fix incorrect initial play icon in remote control section

Original-merge: 8bc954468a

Merged-by: thornbill <thornbill@users.noreply.github.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-08-25 02:47:23 -04:00
viown
dc8f9586c4 Backport pull request #5817 from jellyfin-web/release-10.9.z
Fix undefined serverId in Person card

Original-merge: d47023855e

Merged-by: thornbill <thornbill@users.noreply.github.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-08-25 02:47:21 -04:00
felix920506
51d2cc19b8 Translated using Weblate (Chinese (Traditional))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant/
2024-08-24 16:41:33 -04:00
Daniel
50d84f665c Translated using Weblate (German)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/
2024-08-24 16:41:32 -04:00
stanol
258404f5a5 Translated using Weblate (Ukrainian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/uk/
2024-08-24 11:41:33 -04:00
Fedor M
25e7e700db Translated using Weblate (Russian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ru/
2024-08-24 11:41:33 -04:00
Bill Thornton
50cb39ae68 Merge pull request #5952 from jellyfin/update-jf-sdk 2024-08-24 10:30:35 -04:00
S. Blind
6a566889cf Translated using Weblate (Finnish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fi/
2024-08-24 06:41:33 -04:00
Lukáš Kucharczyk
831a0c751e Translated using Weblate (Czech)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/
2024-08-24 06:41:33 -04:00
jellyfin-bot
dc752a0b52 Update @jellyfin/sdk to 0.0.0-unstable.202408240501 2024-08-24 07:05:17 +00:00
Bill Thornton
808ef42aff Merge pull request #5951 from jellyfin/renovate/ci-deps 2024-08-24 00:46:45 -04:00
renovate[bot]
e340336c18 Update github/codeql-action action to v3.26.5 2024-08-24 02:44:21 +00:00
grafixeyehero
b681e5a1c8 Removed unused prop 2024-08-24 04:31:25 +03:00
gnattu
e498c77e51 Add localization entry for VideoCodecTagNotSupported 2024-08-24 07:46:56 +08:00
Kityn
d595456f3d Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/
2024-08-23 19:41:33 -04:00
Andi Chandler
cc29ab15cb Translated using Weblate (English (United Kingdom))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/en_GB/
2024-08-23 19:41:33 -04:00
Bas
94e1f5e01f Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-08-23 16:41:32 -04:00
Bill Thornton
e20b2595bb Merge pull request #5948 from thornbill/refactor-display-prefs 2024-08-23 14:55:28 -04:00
Bas
3a54cb2f94 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-08-23 14:30:32 -04:00
gnattu
4f630eeb26 Enable software tonemapping options (#5784)
* Enable software tonemappin options

* Remove debugging log

* Apply suggestions from code review

Co-authored-by: Bill Thornton <thornbill@users.noreply.github.com>

* use "camelCase" for CSS classes

* use toggle for switching

* no comments

---------

Co-authored-by: Bill Thornton <thornbill@users.noreply.github.com>
2024-08-23 14:30:28 -04:00
DrWarpMan
5bd61d82a3 Fix redirect after deleting item (#5930)
* Fix redirect after deleting item

Redirects to the parent of an item instead of homepage after deleting the item

* Revert "Fix redirect after deleting item"

This reverts commit 6e36915f5e510ca3dc67a0a713322baec2ec159e.

* Fix redirect after deleting item

Redirects to the parent of an item instead of homepage
after deleting the item
2024-08-23 14:17:59 -04:00
Bill Thornton
18ddf4956a Merge pull request #5944 from jellyfin/renovate/major-postcss
Update dependency postcss-preset-env to v10
2024-08-23 13:28:56 -04:00
Bill Thornton
a649b1233e Merge pull request #5151 from kevgrig/movetotopbottom
Add move to top and bottom context menu options
2024-08-23 13:24:13 -04:00
Bill Thornton
dd8b9e4bc1 Merge pull request #5800 from gnattu/trickplay-KeyFrameOnlyExtraction
Add trickplay key frame only extraction option
2024-08-23 13:19:48 -04:00
Bill Thornton
9f1bd7759d Refactor experimental display preferences structure 2024-08-23 13:03:30 -04:00
Bill Thornton
cba03b0356 Merge pull request #5947 from jellyfin/update-jf-sdk 2024-08-23 08:02:12 -04:00
Ovidiu Popa
43f994a813 Translated using Weblate (Romanian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ro/
2024-08-23 07:41:32 -04:00
jellyfin-bot
2ef2e382fb Update @jellyfin/sdk to 0.0.0-unstable.202408230502 2024-08-23 07:06:14 +00:00
psparro
cdec8246b2 Translated using Weblate (Hindi)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hi/
2024-08-23 00:41:32 -04:00
Kevin G
40074c6433 Fix playlist item count variable name
Signed-off-by: Kevin G <kevin@myplaceonline.com>
2024-08-22 16:56:38 -04:00
Kevin G
f3ca76e418 Add move to top and bottom context menu options
After adding an item to a playlist, I often want to move it to
the top and it's tedious to drag and drop if the playlist is large.
This adds 'Move to Top' and 'Move to Bottom' options to a playlist
item context menu.
2024-08-22 16:56:38 -04:00
Bill Thornton
a872bce1cf Merge pull request #5946 from jellyfin/renovate/react 2024-08-22 16:31:58 -04:00
stanol
98d3b97404 Translated using Weblate (Ukrainian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/uk/
2024-08-22 14:41:32 -04:00
renovate[bot]
fc6499ea4b Update dependency react-router-dom to v6.26.1 2024-08-22 16:58:11 +00:00
Martin Just
7acb8d2c14 Translated using Weblate (German)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/
2024-08-22 10:41:32 -04:00
Bill Thornton
dfdfb5d6ae Merge pull request #5945 from jellyfin/update-jf-sdk 2024-08-22 09:29:55 -04:00
jellyfin-bot
d7e566d0ae Update @jellyfin/sdk to 0.0.0-unstable.202408220501 2024-08-22 07:06:24 +00:00
hoanghuy309
31ca7c48a5 Translated using Weblate (Vietnamese)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/vi/
2024-08-22 02:41:33 -04:00
Kityn
7a0cdeb377 Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/
2024-08-22 02:41:33 -04:00
Lukáš Kucharczyk
c4eebbe796 Translated using Weblate (Czech)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/
2024-08-22 02:41:32 -04:00
Bill Thornton
1e432c4fba Merge pull request #5943 from jellyfin/renovate/core-js-3.x 2024-08-22 00:25:14 -04:00
renovate[bot]
39d867ae59 Update dependency postcss-preset-env to v10 2024-08-22 04:05:52 +00:00
renovate[bot]
48bbd83ba7 Update dependency core-js to v3.38.0 2024-08-22 04:05:30 +00:00
Bill Thornton
5fe6ffb9f6 Merge pull request #5866 from jellyfin/renovate/babel 2024-08-22 00:04:16 -04:00
Bill Thornton
68f8ea4813 Merge pull request #5867 from jellyfin/renovate/major-webpack 2024-08-21 23:45:15 -04:00
Bill Thornton
a89b550933 Merge pull request #5864 from jellyfin/renovate/swiper-11.x 2024-08-21 23:43:34 -04:00
Adam
82702d61a5 Translated using Weblate (English (United Kingdom))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/en_GB/
2024-08-21 23:41:32 -04:00
renovate[bot]
192272064a Update dependency sass-loader to v16 2024-08-22 03:31:52 +00:00
renovate[bot]
bb5f182879 Update Babel 2024-08-22 03:31:36 +00:00
renovate[bot]
4a7f3998b7 Update dependency swiper to v11.1.9 2024-08-22 03:31:18 +00:00
Bill Thornton
4528fead30 Merge pull request #5902 from jellyfin/renovate/autoprefixer-10.x 2024-08-21 23:28:45 -04:00
Bill Thornton
81c44d0d3e Merge pull request #5941 from jellyfin/renovate/hls.js-1.x 2024-08-21 23:27:25 -04:00
Bill Thornton
03d92be22c Merge pull request #5942 from jellyfin/renovate/ci-deps 2024-08-21 23:25:07 -04:00
renovate[bot]
fc20c645e0 Update github/codeql-action action to v3.26.4 2024-08-22 03:03:24 +00:00
renovate[bot]
aab11ff52b Update dependency hls.js to v1.5.14 2024-08-22 03:03:16 +00:00
renovate[bot]
f2cdfded74 Update dependency autoprefixer to v10.4.20 2024-08-22 03:03:00 +00:00
Bill Thornton
6ba8e1410c Merge pull request #5940 from jellyfin/renovate/cssnano-7.x 2024-08-21 23:01:36 -04:00
Bill Thornton
4c7a2b0104 Merge pull request #5939 from jellyfin/renovate/fonts 2024-08-21 22:57:47 -04:00
Bill Thornton
c1570bf3d2 Merge pull request #5887 from jellyfin/renovate/react-hook-resize-observer-2.x 2024-08-21 22:53:27 -04:00
renovate[bot]
ac1081ed8f Update dependency cssnano to v7.0.5 2024-08-22 02:46:24 +00:00
Bill Thornton
6f3603982a Merge pull request #5903 from jellyfin/renovate/react 2024-08-21 22:45:01 -04:00
renovate[bot]
3470cd70aa Update dependency @react-hook/resize-observer to v2.0.2 2024-08-22 02:44:36 +00:00
renovate[bot]
bfa0c5d648 Update dependency @fontsource/noto-sans-jp to v5.0.20 2024-08-22 02:44:18 +00:00
Bill Thornton
23b7e725f1 Merge pull request #5863 from jellyfin/renovate/tanstack-query-monorepo 2024-08-21 22:43:08 -04:00
renovate[bot]
5725634482 Update dependency react-router-dom to v6.26.0 2024-08-22 02:33:59 +00:00
renovate[bot]
90942fbc6c Update tanstack-query monorepo to v5.51.23 2024-08-22 02:33:39 +00:00
bu3alwa
710fe641e2 refactor activity page to use react query requests
Co-authored-by: Bill Thornton <thornbill@users.noreply.github.com>
2024-08-21 19:24:20 -04:00
grafixeyehero
106392b9cb Add Media Info Stats 2024-08-22 01:04:18 +03:00
grafixeyehero
82d70763bb Add Secondary Media Info 2024-08-22 01:01:59 +03:00
grafixeyehero
fabfb9b173 Add more options for PrimaryMediaInfo 2024-08-22 00:50:43 +03:00
無情天
8940456509 Translated using Weblate (Chinese (Simplified))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2024-08-21 17:41:32 -04:00
Bill Thornton
634b10d3c3 Merge pull request #5922 from jellyfin/dependabot/npm_and_yarn/axios-1.7.4 2024-08-21 17:34:27 -04:00
Bas
c5b5b5b479 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-08-21 14:41:32 -04:00
grafixeyehero
a3eff3c0ae Update PrimaryMediaInfo option naming 2024-08-21 21:37:06 +03:00
dependabot[bot]
819892220e Bump axios from 1.6.1 to 1.7.4
Bumps [axios](https://github.com/axios/axios) from 1.6.1 to 1.7.4.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.6.1...v1.7.4)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-21 17:33:59 +00:00
Bill Thornton
b3bda59ee9 Merge pull request #5926 from jellyfin/update-jf-sdk 2024-08-21 13:32:12 -04:00
Bill Thornton
125fc00e26 Merge pull request #5937 from thornbill/activity-table-size
Limit activity table to screen size
2024-08-21 13:13:31 -04:00
grafixeyehero
979c4b49e4 Fix action for live tv schedule in experimental layout (#5934)
* Fix action for live tv schedule

* Fix indentation

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

---------

Co-authored-by: Bill Thornton <thornbill@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-08-21 13:08:43 -04:00
Bill Thornton
302ea0b6b0 Merge pull request #5904 from GabrielGavrilov/master
Add empty password save error message
2024-08-21 13:01:42 -04:00
Bill Thornton
222527e9b7 Limit activity table to screen size 2024-08-21 12:52:45 -04:00
Bill Thornton
d232494a89 Merge pull request #5932 from grafixeyehero/Add-ItemDtoQueryResult-ItemStatus
Add shared ItemStatus and ItemDtoQueryResult Type
2024-08-21 11:41:48 -04:00
Bill Thornton
a52e63c7d2 Merge pull request #5933 from jwaresoft/5862-add-optional-dep-sass-loader
Add optional dependency for sass-embedded
2024-08-21 11:18:40 -04:00
Bill Thornton
afd28016e1 Merge pull request #5935 from thornbill/eslint-stylistic
Migrate to stylistic eslint rules
2024-08-21 10:59:54 -04:00
Lukáš Kucharczyk
c467e86f9b Translated using Weblate (Czech)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/
2024-08-21 06:41:32 -04:00
jellyfin-bot
07372de734 Update @jellyfin/sdk to 0.0.0-unstable.202408210501 2024-08-21 07:05:08 +00:00
Bill Thornton
8a6f33fff8 Fix eslint errors 2024-08-21 02:54:09 -04:00
Bill Thornton
018d8d3f83 Migrate to stylistic eslint plugin 2024-08-21 02:52:39 -04:00
jwaresoft
7a5c9dabdb add optional dependency for sass-loader, build package-lock 2024-08-20 18:36:39 -07:00
grafixeyehero
5fbc417e3b Add shared ItemStatus and ItemDtoQueryResult Type 2024-08-21 03:31:21 +03:00
queeup
656799cce7 Translated using Weblate (Turkish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/tr/
2024-08-20 19:41:33 -04:00
Kityn
03389923d3 Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/
2024-08-20 19:41:32 -04:00
Bill Thornton
c9105dcad4 Merge pull request #5871 from gnattu/better-safari-profile
Better codec profile for Safari  with 10.10 features
2024-08-20 17:19:28 -04:00
gnattu
6195e11922 Use else if just in case safari changed behavior in future 2024-08-21 04:50:18 +08:00
Bill Thornton
31fbc08269 Merge pull request #5717 from grafixeyehero/Add-filter-status-Indicator-legacy
Add filter status indicator
2024-08-20 16:45:52 -04:00
grafixeyehero
f323203012 apply suggestion
Co-authored-by: Bill Thornton <thornbill@users.noreply.github.com>
2024-08-20 23:36:42 +03:00
Bill Thornton
3e8592e29e Merge pull request #5850 from grafixeyehero/move-reusable-component
Move reusable Text Lines component to common file
2024-08-20 16:31:17 -04:00
grafixeyehero
d2aa788579 apply suggestion
Co-authored-by: Bill Thornton <thornbill@users.noreply.github.com>
2024-08-20 23:20:23 +03:00
Bas
0bc9dc005d Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2024-08-20 15:12:03 -04:00
Gabriel Gavrilov
a25e29161b Move import to top 2024-08-20 13:07:17 -06:00
Gabriel Gavrilov
e7230ab9c6 Add suggestion
Co-authored-by: Bill Thornton <thornbill@users.noreply.github.com>
2024-08-20 13:05:45 -06:00
Bill Thornton
86a23009de Merge pull request #5405 from scampower3/edit-lyrics
Add Lyrics Editor for Admin users only
2024-08-20 14:53:18 -04:00
JQ
8d728ca9d4 Update src/components/lyricsuploader/lyricsuploader.js
Co-authored-by: Bill Thornton <thornbill@users.noreply.github.com>
2024-08-20 14:46:26 -04:00
JQ
64c59e2f2a Update src/components/lyricseditor/lyricseditor.js
Co-authored-by: Bill Thornton <thornbill@users.noreply.github.com>
2024-08-20 14:46:26 -04:00
JQ
0a80cbc891 Update src/components/lyricseditor/lyricseditor.js
Co-authored-by: Bill Thornton <thornbill@users.noreply.github.com>
2024-08-20 14:46:26 -04:00
LJQ
5d8d6fdb28 Add suggested changes 2024-08-20 14:46:26 -04:00
LJQ
ab0df4dcf0 Update to use getLyricsApi 2024-08-20 14:46:26 -04:00
LJQ
f6b9104cc2 fix for when lyric.Start is 0 2024-08-20 14:46:26 -04:00
LJQ
8a61ff890f If possible display lyrics in lrc format 2024-08-20 14:46:26 -04:00
LJQ
648e8ff2a6 Preliminary Lyrics Editor 2024-08-20 14:46:26 -04:00
Drew Daniels
12ba71781e Add .nvmrc (#5842)
* add .nvmrc file

* update node version

* Revert "update node version"

This reverts commit 6044676f46160f8abba1010034e94c44496feb82.
2024-08-20 12:24:17 -04:00
dredstone1
fd6104c858 Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/
2024-08-20 06:41:32 -04:00
Yuchen
52bac129e5 Translated using Weblate (Chinese (Traditional))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant/
2024-08-20 03:41:32 -04:00
Narfinger
d5778538a0 Incorporate suggestion in mediaLibraryEditor.js
Co-authored-by: Bill Thornton <thornbill@users.noreply.github.com>
2024-08-19 15:35:45 +09:00
x3kim
111e2aea71 Translated using Weblate (German)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/
2024-08-19 01:41:32 -04:00
queeup
7488d766fa Translated using Weblate (Turkish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/tr/
2024-08-18 18:41:32 -04:00
ZebastianBjorkqvist
6594db22a9 Translated using Weblate (Swedish)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sv/
2024-08-18 18:41:32 -04:00
a0193143
8296d5ac10 Translated using Weblate (Chinese (Traditional))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant/
2024-08-18 12:41:32 -04:00
ja49619
d4419f2dc2 Translated using Weblate (Russian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ru/
2024-08-18 12:41:32 -04:00
Bill Thornton
8f0fd26582 Merge pull request #5925 from thornbill/home-resume-error 2024-08-18 10:56:54 -04:00
ja49619
8c7ed0fd36 Translated using Weblate (Russian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ru/
2024-08-18 10:41:32 -04:00
ja49619
3e5b346b32 Translated using Weblate (Russian)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ru/
2024-08-18 06:41:32 -04:00
Lukáš Kucharczyk
55bb02ef03 Translated using Weblate (Czech)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/
2024-08-18 03:41:32 -04:00
Bill Thornton
3173a43afe Merge pull request #5924 from thornbill/sass-warnings
Fix sass rule order warning
2024-08-18 03:06:25 -04:00
Bill Thornton
942c1e01dc Fix home section resume error 2024-08-18 01:29:49 -04:00
Bill Thornton
407c880b02 Fix sass rule order warning 2024-08-18 00:27:57 -04:00
gnattu
6e0ad2ed1b Override mp3 remux container (#5914)
* Override mp3 remux container

The server generally filters out invalid containers for HLS in most cases. However, MP3 is a special case because, while it is technically possible and allowed as a codec for fMP4 on the server side, most browsers do not support it. Override the remux container to force MPEG-TS for MP3. The server will still direct play MP3 in an MP3 container. This is useful for supporting universal containers like MKA.

* Fix lint

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-08-17 19:20:08 -04:00
Bill Thornton
45d72f16cc Merge pull request #5921 from jellyfin/update-jf-sdk 2024-08-17 06:53:28 -04:00
jellyfin-bot
2bb7232daa Update @jellyfin/sdk to 0.0.0-unstable.202408170501 2024-08-17 07:05:07 +00:00
Peter Santos
1da9b548ac Replace existence check with optional chaining (#5742) 2024-08-17 02:58:01 -04:00
無情天
cc22fbc042 Translated using Weblate (Chinese (Simplified))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2024-08-16 23:41:32 -04:00
grafixeyehero
5d2b614865 Add btnFilter-wrapper to fix hover styling
Co-authored-by: Bill Thornton <thornbill@users.noreply.github.com>
2024-08-17 01:55:30 +03:00
grafixeyehero
f6a29d868a use toggle class 2024-08-17 01:14:32 +03:00
grafixeyehero
7074d41a56 Fix save library filter state 2024-08-17 01:14:30 +03:00
grafixeyehero
c779035a75 Add Filter Status Indicator 2024-08-17 01:14:28 +03:00
bene toffix
d3f72ff0cb Translated using Weblate (Catalan)
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ca/
2024-08-16 17:41:32 -04:00
Andi Chandler
79236796df Translated using Weblate (English (United Kingdom))
Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/en_GB/
2024-08-16 13:41:32 -04:00
Bill Thornton
a00c68d49a Merge pull request #5193 from carlo-colombo/subtitle-offset-keybinding 2024-08-16 11:52:12 -04:00
Bill Thornton
92e5d692ea Add uppercase variants
Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com>
2024-08-16 11:06:26 -04:00
LJQ
4c7a77ce7b Add reset to en-us.json 2024-08-15 15:10:12 +00:00
LJQ
7ae1d560f3 Add button to reset metadata in metadata editor 2024-08-15 15:10:12 +00:00
Gabriel Gavrilov
7810ff464b Merge branch 'master' into master 2024-08-13 12:11:39 -06:00
Gabriel Gavrilov
51ef450be9 Merge branch 'master' into master 2024-08-13 07:42:37 -06:00
Gabriel Gavrilov
9c6f45824a Merge branch 'master' into master 2024-08-11 13:14:47 -06:00
Gabriel Gavrilov
9c7148e07f Fix ESLint issues 2024-08-10 23:15:37 -06:00
Gabriel Gavrilov
f4d3ccfcaf Add empty password save error message 2024-08-10 22:49:58 -06:00
gnattu
dec593d37e use fldEnableHi10p 2024-08-10 21:52:16 +08:00
gnattu
fbc9719120 Merge branch 'fork/safari-hi10p' 2024-08-10 21:01:54 +08:00
gnattu
0ed16a04b2 Add user-configurable switch for hi10p on safari 2024-08-10 21:00:48 +08:00
Narfinger
71afc176b0 Use alert for error message of invalid ItemId 2024-08-10 19:25:53 +09:00
gnattu
66e5ce330f Fix lint
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-08-10 17:51:44 +08:00
gnattu
62b44d218c Add support for H264 High 10 Profile on Safari 2024-08-10 17:33:59 +08:00
Narfinger
8bdae2381c Show error message when ItemIds are invalid instead of infinitely spinning 2024-08-08 14:12:25 +09:00
grafixeyehero
b9b963cca8 Move reusable TextLines component to common file 2024-08-08 04:25:05 +03:00
gnattu
9fb0c4473c PascalCase in string key for uniformity
Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com>
2024-08-04 19:07:03 +08:00
gnattu
31b6a43a85 Fix filtering for setter and getter 2024-08-04 15:31:52 +08:00
gnattu
f6c8af1095 Make labels translatable 2024-08-04 15:31:43 +08:00
gnattu
0e985c2ffe fix lint 2024-08-04 14:18:42 +08:00
gnattu
a386512def Better codec profile for Safari with 10.10 features
This uses the new VP9 remuxing and audio remuxing features to reduce transcoding on Safari, also removed some problematic direct play profiles.

- Add opus profile for Safari
- Add VP9 remuxing profile for Safari
- Remove Vorbis profile on non-webm container for Safari
- Remove direct VP9 playback in mp4 container for iOS Safari
2024-08-04 13:55:05 +08:00
gnattu
524ede412b Add non-standard multi-value audio tag support 2024-08-04 12:54:39 +08:00
gnattu
1ba945c905 Update help text to reflect new server behavior 2024-07-23 11:35:40 +08:00
gnattu
0850a1555b Merge branch 'origin/master' 2024-07-18 11:29:27 +08:00
gnattu
9c18cd13b4 Add KeyFrameOnlyExtraction option to trckplay panel 2024-07-16 23:36:42 +08:00
gnattu
2ba0ebf171 Add VideoToolbox in LabelTrickplayAccelEncodingHelp 2024-07-16 23:02:04 +08:00
Carlo Colombo
0e3f6fa77b subtitles offset keybinding 2024-06-26 17:16:26 +02:00
363 changed files with 21930 additions and 8957 deletions

View File

@@ -5,7 +5,6 @@
"not": [
"./dist/libraries/pdf.worker.js",
"./dist/libraries/worker-bundle.js",
"./dist/libraries/wasm-gen/libarchive.js",
"./dist/serviceworker.js"
]
}

View File

@@ -1,4 +1,5 @@
node_modules
coverage
dist
.idea
.vscode

View File

@@ -4,10 +4,10 @@ module.exports = {
root: true,
parser: '@typescript-eslint/parser',
plugins: [
'@stylistic',
'@typescript-eslint',
'react',
'import',
'eslint-comments',
'sonarjs'
],
env: {
@@ -20,23 +20,14 @@ module.exports = {
'eslint:recommended',
'plugin:react/recommended',
'plugin:import/errors',
'plugin:eslint-comments/recommended',
'plugin:@eslint-community/eslint-comments/recommended',
'plugin:compat/recommended',
'plugin:sonarjs/recommended'
],
rules: {
'array-callback-return': ['error', { 'checkForEach': true }],
'block-spacing': ['error'],
'brace-style': ['error', '1tbs', { 'allowSingleLine': true }],
'comma-dangle': ['error', 'never'],
'comma-spacing': ['error'],
'curly': ['error', 'multi-line', 'consistent'],
'default-case-last': ['error'],
'eol-last': ['error'],
'indent': ['error', 4, { 'SwitchCase': 1 }],
'jsx-quotes': ['error', 'prefer-single'],
'keyword-spacing': ['error'],
'max-statements-per-line': ['error'],
'max-params': ['error', 7],
'new-cap': [
'error',
@@ -48,10 +39,7 @@ module.exports = {
'no-duplicate-imports': ['error'],
'no-empty-function': ['error'],
'no-extend-native': ['error'],
'no-floating-decimal': ['error'],
'no-lonely-if': ['error'],
'no-multi-spaces': ['error'],
'no-multiple-empty-lines': ['error', { 'max': 1 }],
'no-nested-ternary': ['error'],
'no-redeclare': ['off'],
'@typescript-eslint/no-redeclare': ['error', { builtinGlobals: false }],
@@ -62,7 +50,6 @@ module.exports = {
'no-shadow': ['off'],
'@typescript-eslint/no-shadow': ['error'],
'no-throw-literal': ['error'],
'no-trailing-spaces': ['error'],
'no-undef-init': ['error'],
'no-unneeded-ternary': ['error'],
'no-unused-expressions': ['off'],
@@ -74,19 +61,12 @@ module.exports = {
'no-var': ['error'],
'no-void': ['error', { 'allowAsStatement': true }],
'no-warning-comments': ['warn', { 'terms': ['fixme', 'hack', 'xxx'] }],
'object-curly-spacing': ['error', 'always'],
'one-var': ['error', 'never'],
'operator-linebreak': ['error', 'before', { overrides: { '?': 'after', ':': 'after', '=': 'after' } }],
'padded-blocks': ['error', 'never'],
'prefer-const': ['error', { 'destructuring': 'all' }],
'prefer-promise-reject-errors': ['warn', { 'allowEmptyReject': true }],
'@typescript-eslint/prefer-for-of': ['error'],
'@typescript-eslint/prefer-optional-chain': ['error'],
'quotes': ['error', 'single', { 'avoidEscape': true, 'allowTemplateLiterals': false }],
'radix': ['error'],
'@typescript-eslint/semi': ['error'],
'space-before-blocks': ['error'],
'space-infix-ops': 'error',
'yoda': 'error',
'react/jsx-filename-extension': ['error', { 'extensions': ['.jsx', '.tsx'] }],
@@ -98,7 +78,28 @@ module.exports = {
'sonarjs/no-inverted-boolean-check': ['error'],
// TODO: Enable the following rules and fix issues
'sonarjs/cognitive-complexity': ['off'],
'sonarjs/no-duplicate-string': ['off']
'sonarjs/no-duplicate-string': ['off'],
'@stylistic/block-spacing': ['error'],
'@stylistic/brace-style': ['error', '1tbs', { 'allowSingleLine': true }],
'@stylistic/comma-dangle': ['error', 'never'],
'@stylistic/comma-spacing': ['error'],
'@stylistic/eol-last': ['error'],
'@stylistic/indent': ['error', 4, { 'SwitchCase': 1 }],
'@stylistic/jsx-quotes': ['error', 'prefer-single'],
'@stylistic/keyword-spacing': ['error'],
'@stylistic/max-statements-per-line': ['error'],
'@stylistic/no-floating-decimal': ['error'],
'@stylistic/no-multi-spaces': ['error'],
'@stylistic/no-multiple-empty-lines': ['error', { 'max': 1 }],
'@stylistic/no-trailing-spaces': ['error'],
'@stylistic/object-curly-spacing': ['error', 'always'],
'@stylistic/operator-linebreak': ['error', 'before', { overrides: { '?': 'after', ':': 'after', '=': 'after' } }],
'@stylistic/padded-blocks': ['error', 'never'],
'@stylistic/quotes': ['error', 'single', { 'avoidEscape': true, 'allowTemplateLiterals': false }],
'@stylistic/semi': ['error'],
'@stylistic/space-before-blocks': ['error'],
'@stylistic/space-infix-ops': ['error']
},
settings: {
react: {
@@ -284,7 +285,7 @@ module.exports = {
'eslint:recommended',
'plugin:import/typescript',
'plugin:@typescript-eslint/recommended',
'plugin:eslint-comments/recommended',
'plugin:@eslint-community/eslint-comments/recommended',
'plugin:react/recommended',
'plugin:react-hooks/recommended',
'plugin:jsx-a11y/recommended'

14
.github/renovate.json vendored
View File

@@ -2,7 +2,19 @@
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"github>jellyfin/.github//renovate-presets/nodejs",
":semanticCommitsDisabled",
":dependencyDashboard"
],
"packageRules": [
{
"matchPackageNames": [ "@jellyfin/sdk" ],
"followTag": "unstable",
"minimumReleaseAge": null,
"schedule": [ "after 7:00 am" ]
},
{
"matchPackageNames": ["dompurify"],
"matchUpdateTypes": ["major"],
"enabled": false
}
]
}

View File

@@ -1,20 +1,12 @@
name: Automation
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
name: Automation 🎛️
on:
push:
branches:
- master
pull_request_target:
workflow_call:
jobs:
conflicts:
name: Merge conflict labeling
name: Merge conflict labeling 🏷️
runs-on: ubuntu-latest
if: ${{ github.repository == 'jellyfin/jellyfin-web' }}
steps:
- uses: eps1lon/actions-label-merge-conflict@1b1b1fcde06a9b3d089f3464c96417961dde1168 # v3.0.2
with:

40
.github/workflows/__codeql.yml vendored Normal file
View File

@@ -0,0 +1,40 @@
name: GitHub CodeQL 🔬
on:
workflow_call:
inputs:
commit:
required: true
type: string
jobs:
analyze:
name: Analyze ${{ matrix.language }} 🔬
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
language:
- javascript-typescript
steps:
- name: Checkout repository ⬇️
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
ref: ${{ inputs.commit }}
show-progress: false
- name: Initialize CodeQL 🛠️
uses: github/codeql-action/init@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0
with:
queries: security-and-quality
languages: ${{ matrix.language }}
- name: Autobuild 📦
uses: github/codeql-action/autobuild@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0
- name: Perform CodeQL Analysis 🧪
uses: github/codeql-action/analyze@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0
with:
category: '/language:${{matrix.language}}'

59
.github/workflows/__deploy.yml vendored Normal file
View File

@@ -0,0 +1,59 @@
name: Deploy 🏗️
on:
workflow_call:
inputs:
branch:
required: true
type: string
commit:
required: false
type: string
comment:
required: false
type: boolean
artifact_name:
required: false
type: string
default: frontend
jobs:
cf-pages:
name: CloudFlare Pages 📃
runs-on: ubuntu-latest
environment:
name: ${{ inputs.branch == 'master' && 'Production' || 'Preview' }}
url: ${{ steps.cf.outputs.deployment-url }}
outputs:
url: ${{ steps.cf.outputs.deployment-url }}
steps:
- name: Download workflow artifact ⬇️
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
with:
name: ${{ inputs.artifact_name }}
path: dist
- name: Publish to Cloudflare Pages 📃
uses: cloudflare/wrangler-action@b2a0191ce60d21388e1a8dcc968b4e9966f938e1 # v3.11.0
id: cf
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
command: pages deploy dist --project-name=jellyfin-web --branch=${{ inputs.branch }}
compose-comment:
name: Compose and push comment 📝
# Always run so the comment is composed for the workflow summary
if: ${{ always() }}
uses: ./.github/workflows/__job_messages.yml
secrets: inherit
needs:
- cf-pages
with:
branch: ${{ inputs.branch }}
commit: ${{ inputs.commit }}
preview_url: ${{ needs.cf-pages.outputs.url }}
in_progress: false
comment: ${{ inputs.comment }}

65
.github/workflows/__job_messages.yml vendored Normal file
View File

@@ -0,0 +1,65 @@
name: Job messages ⚙️
on:
workflow_call:
inputs:
branch:
required: false
type: string
commit:
required: true
type: string
preview_url:
required: false
type: string
in_progress:
required: true
type: boolean
comment:
required: false
type: boolean
marker:
description: Hidden marker to detect PR comments composed by the bot
required: false
type: string
default: "CFPages-deployment"
jobs:
cf_pages_msg:
name: CloudFlare Pages deployment 📃🚀
runs-on: ubuntu-latest
steps:
- name: Compose message 📃
if: ${{ always() }}
id: compose
env:
COMMIT: ${{ inputs.commit }}
PREVIEW_URL: ${{ inputs.preview_url != '' && (inputs.branch != 'master' && inputs.preview_url || format('https://jellyfin-web.pages.dev ({0})', inputs.preview_url)) || 'Not available' }}
DEPLOY_STATUS: ${{ inputs.in_progress && '🔄 Deploying...' || (inputs.preview_url != '' && '✅ Deployed!' || '❌ Failure. Check workflow logs for details') }}
DEPLOYMENT_TYPE: ${{ inputs.branch != 'master' && '🔀 Preview' || '⚙️ Production' }}
WORKFLOW_RUN: ${{ !inputs.in_progress && format('**[View build logs](https://github.com/{0}/actions/runs/{1})**', github.repository, github.run_id) || '' }}
# EOF is needed for multiline environment variables in a GitHub Actions context
run: |
echo "## Cloudflare Pages deployment" > $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "| **Latest commit** | <code>${COMMIT::7}</code> |" >> $GITHUB_STEP_SUMMARY
echo "|------------------------- |:----------------------------: |" >> $GITHUB_STEP_SUMMARY
echo "| **Status** | $DEPLOY_STATUS |" >> $GITHUB_STEP_SUMMARY
echo "| **Preview URL** | $PREVIEW_URL |" >> $GITHUB_STEP_SUMMARY
echo "| **Type** | $DEPLOYMENT_TYPE |" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "$WORKFLOW_RUN" >> $GITHUB_STEP_SUMMARY
COMPOSED_MSG=$(cat $GITHUB_STEP_SUMMARY)
echo "msg<<EOF" >> $GITHUB_ENV
echo "$COMPOSED_MSG" >> $GITHUB_ENV
echo "EOF" >> $GITHUB_ENV
- name: Push comment to Pull Request 🔼
uses: thollander/actions-comment-pull-request@e2c37e53a7d2227b61585343765f73a9ca57eda9 # v3.0.0
if: ${{ inputs.comment && steps.compose.conclusion == 'success' }}
with:
github-token: ${{ secrets.JF_BOT_TOKEN }}
message: ${{ env.msg }}
comment-tag: ${{ inputs.marker }}

45
.github/workflows/__package.yml vendored Normal file
View File

@@ -0,0 +1,45 @@
name: Packaging 📦
on:
workflow_call:
inputs:
commit:
required: false
type: string
jobs:
run-build-prod:
name: Run production build 🏗️
runs-on: ubuntu-latest
steps:
- name: Check out Git repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
ref: ${{ inputs.commit || github.sha }}
- name: Setup node environment
uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0
with:
node-version: 20
cache: npm
check-latest: true
- name: Install Node.js dependencies
run: npm ci --no-audit
- name: Run a production build
env:
JELLYFIN_VERSION: ${{ inputs.commit || github.sha }}
run: npm run build:production
- name: Update config.json for testing
run: |
jq '.multiserver=true | .servers=["https://demo.jellyfin.org/unstable"]' dist/config.json > dist/config.tmp.json
mv dist/config.tmp.json dist/config.json
- name: Upload artifact
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3
with:
name: frontend
path: dist

61
.github/workflows/__quality_checks.yml vendored Normal file
View File

@@ -0,0 +1,61 @@
name: Quality checks 👌🧪
on:
workflow_call:
inputs:
commit:
required: true
type: string
workflow_dispatch:
jobs:
dependency-review:
name: Vulnerable dependencies 🔎
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
ref: ${{ inputs.commit }}
show-progress: false
- name: Scan
uses: actions/dependency-review-action@a6993e2c61fd5dc440b409aa1d6904921c5e1894 # v4.3.5
with:
## Workaround from https://github.com/actions/dependency-review-action/issues/456
## TODO: Remove when necessary
base-ref: ${{ github.event.pull_request.base.sha || 'master' }}
head-ref: ${{ github.event.pull_request.head.sha || github.ref }}
quality:
name: Run ${{ matrix.command }} 🕵️‍♂️
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
command:
- build:es-check
- lint
- stylelint
- build:check
- test
steps:
- name: Checkout ⬇️
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
ref: ${{ inputs.commit }}
show-progress: false
- name: Setup node environment ⚙️
uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0
with:
node-version: 20
cache: npm
check-latest: true
- name: Install dependencies 📦
run: npm ci --no-audit
- name: Run ${{ matrix.command }} ⚙️
run: npm run ${{ matrix.command }}

View File

@@ -1,129 +0,0 @@
name: Build
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
on:
push:
branches: [ master, release* ]
pull_request_target:
branches: [ master, release* ]
workflow_dispatch:
jobs:
run-build-prod:
name: Run production build
runs-on: ubuntu-latest
steps:
- name: Check out Git repository
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
with:
ref: ${{ github.event.pull_request.head.sha || github.sha }}
- name: Setup node environment
uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3
with:
node-version: 20
check-latest: true
cache: npm
- name: Install Node.js dependencies
run: npm ci --no-audit
- name: Run a production build
env:
JELLYFIN_VERSION: ${{ github.event.pull_request.head.sha || github.sha }}
run: npm run build:production
- name: Update config.json for testing
run: |
jq '.multiserver=true | .servers=["https://demo.jellyfin.org/unstable"]' dist/config.json > dist/config.tmp.json
mv dist/config.tmp.json dist/config.json
- name: Upload artifact
uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6
with:
name: jellyfin-web__prod
path: dist
publish:
name: Deploy to Cloudflare Pages
runs-on: ubuntu-latest
if: ${{ github.repository == 'jellyfin/jellyfin-web' }}
needs:
- run-build-prod
permissions:
contents: read
deployments: write
steps:
- name: Add comment
uses: thollander/actions-comment-pull-request@fabd468d3a1a0b97feee5f6b9e499eab0dd903f6 # v2.5.0
if: ${{ github.event_name == 'pull_request_target' }}
with:
GITHUB_TOKEN: ${{ secrets.JF_BOT_TOKEN }}
message: |
## Cloudflare Pages deployment
| **Latest commit** | <code>${{ github.event.pull_request.head.sha || github.sha }}</code> |
|-------------------|:-:|
| **Status** | 🔄 Deploying... |
| **Preview URL** | Not available |
| **Type** | 🔀 Preview |
pr_number: ${{ github.event.pull_request.number }}
comment_tag: CFPages-deployment
mode: recreate
- name: Download workflow artifact
uses: dawidd6/action-download-artifact@09f2f74827fd3a8607589e5ad7f9398816f540fe # v3.1.4
with:
name: jellyfin-web__prod
path: dist
- name: Publish to Cloudflare
id: cf
uses: cloudflare/wrangler-action@f84a562284fc78278ff9052435d9526f9c718361 # v3.7.0
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
command: pages deploy dist --project-name=jellyfin-web --branch=${{
(github.event_name != 'pull_request_target' || github.event.pull_request.head.repo.full_name == github.repository)
&& (github.event.pull_request.head.ref || github.ref_name)
|| format('{0}/{1}', github.event.pull_request.head.repo.full_name, github.event.pull_request.head.ref)
}} --commit-hash=${{ github.event.pull_request.head.sha || github.sha }}
- name: Update status comment (Success)
if: ${{ github.event_name == 'pull_request_target' && success() }}
uses: thollander/actions-comment-pull-request@fabd468d3a1a0b97feee5f6b9e499eab0dd903f6 # v2.5.0
with:
GITHUB_TOKEN: ${{ secrets.JF_BOT_TOKEN }}
message: |
## Cloudflare Pages deployment
| **Latest commit** | <code>${{ github.event.pull_request.head.sha || github.sha }}</code> |
|-------------------|:-:|
| **Status** | ✅ Deployed! |
| **Preview URL** | ${{ steps.cf.outputs.deployment-url != '' && steps.cf.outputs.deployment-url || 'Not available' }} |
| **Type** | 🔀 Preview |
pr_number: ${{ github.event.pull_request.number }}
comment_tag: CFPages-deployment
mode: recreate
- name: Update status comment (Failure)
if: ${{ github.event_name == 'pull_request_target' && failure() }}
uses: thollander/actions-comment-pull-request@fabd468d3a1a0b97feee5f6b9e499eab0dd903f6 # v2.5.0
with:
GITHUB_TOKEN: ${{ secrets.JF_BOT_TOKEN }}
message: |
## Cloudflare Pages deployment
| **Latest commit** | <code>${{ github.event.pull_request.head.sha || github.sha }}</code> |
|-------------------|:-:|
| **Status** | ❌ Failure. Check workflow logs for details |
| **Preview URL** | Not available |
| **Type** | 🔀 Preview |
pr_number: ${{ github.event.pull_request.number }}
comment_tag: CFPages-deployment
mode: recreate

View File

@@ -1,34 +0,0 @@
name: CodeQL
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
on:
push:
branches: [ master, release* ]
pull_request:
branches: [ master, release* ]
schedule:
- cron: '30 7 * * 6'
jobs:
codeql:
name: Run CodeQL
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
- name: Initialize CodeQL
uses: github/codeql-action/init@eb055d739abdc2e8de2e5f4ba1a8b246daa779aa # v3.26.0
with:
languages: javascript
queries: +security-extended
- name: Autobuild
uses: github/codeql-action/autobuild@eb055d739abdc2e8de2e5f4ba1a8b246daa779aa # v3.26.0
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@eb055d739abdc2e8de2e5f4ba1a8b246daa779aa # v3.26.0

View File

@@ -1,36 +0,0 @@
name: Commands
on:
issue_comment:
types:
- created
- edited
jobs:
rebase:
name: Rebase
if: github.event.issue.pull_request != '' && contains(github.event.comment.body, '@jellyfin-bot rebase') && github.event.comment.author_association == 'MEMBER'
runs-on: ubuntu-latest
steps:
- name: Notify as seen
uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4.0.0
with:
token: ${{ secrets.JF_BOT_TOKEN }}
comment-id: ${{ github.event.comment.id }}
reactions: '+1'
- name: Checkout the latest code
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
with:
token: ${{ secrets.JF_BOT_TOKEN }}
fetch-depth: 0
- name: Automatic Rebase
uses: cirrus-actions/rebase@b87d48154a87a85666003575337e27b8cd65f691 # 1.8
env:
GITHUB_TOKEN: ${{ secrets.JF_BOT_TOKEN }}
- name: Comment on failure
if: failure()
uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4.0.0
with:
token: ${{ secrets.JF_BOT_TOKEN }}
issue-number: ${{ github.event.issue.number }}
body: |
I'm sorry @${{ github.event.comment.user.login }}, I'm afraid I can't do that.

View File

@@ -1,36 +0,0 @@
name: PR suggestions
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.id || github.run_id }}
cancel-in-progress: true
on:
pull_request_target:
branches: [ master, release* ]
jobs:
run-eslint:
name: Run eslint suggestions
runs-on: ubuntu-latest
steps:
- name: Check out Git repository
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: Setup node environment
uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3
with:
node-version: 20
check-latest: true
cache: npm
- name: Install Node.js dependencies
run: npm ci --no-audit
- name: Run eslint
if: ${{ github.repository == 'jellyfin/jellyfin-web' }}
uses: CatChen/eslint-suggestion-action@bc82950fa97bb3e46d9cca16a8bf2ad3e3c010fc # v4.1.5
with:
github-token: ${{ secrets.GITHUB_TOKEN }}

100
.github/workflows/pull_request.yml vendored Normal file
View File

@@ -0,0 +1,100 @@
name: Pull Request 📥
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
cancel-in-progress: true
on:
pull_request_target:
branches:
- master
- release*
paths-ignore:
- '**/*.md'
merge_group:
jobs:
push-comment:
name: Create comments ✍️
if: ${{ always() && !cancelled() && github.repository == 'jellyfin/jellyfin-web' }}
uses: ./.github/workflows/__job_messages.yml
secrets: inherit
with:
commit: ${{ github.event.pull_request.head.sha }}
in_progress: true
comment: true
build:
name: Build 🏗️
if: ${{ always() && !cancelled() }}
uses: ./.github/workflows/__package.yml
with:
commit: ${{ github.event.pull_request.head.sha }}
automation:
name: Automation 🎛️
if: ${{ github.repository == 'jellyfin/jellyfin-web' }}
uses: ./.github/workflows/__automation.yml
secrets: inherit
quality_checks:
name: Quality checks 👌🧪
if: ${{ always() && !cancelled() }}
uses: ./.github/workflows/__quality_checks.yml
permissions: {}
with:
commit: ${{ github.event.pull_request.head.sha }}
codeql:
name: GitHub CodeQL 🔬
if: ${{ always() && !cancelled() }}
uses: ./.github/workflows/__codeql.yml
permissions:
actions: read
contents: read
security-events: write
with:
commit: ${{ github.event.pull_request.head.sha }}
deploy:
name: Deploy 🚀
uses: ./.github/workflows/__deploy.yml
if: ${{ always() && !cancelled() && needs.build.result == 'success' && github.repository == 'jellyfin/jellyfin-web' }}
needs:
- push-comment
- build
permissions:
contents: read
deployments: write
secrets: inherit
with:
# If the PR is from the master branch of a fork, append the fork's name to the branch name
branch: ${{ github.event.pull_request.head.repo.full_name != github.repository && github.event.pull_request.head.ref == 'master' && format('{0}/{1}', github.event.pull_request.head.repo.full_name, github.event.pull_request.head.ref) || github.event.pull_request.head.ref }}
comment: true
commit: ${{ github.event.pull_request.head.sha }}
run-eslint:
name: Run eslint suggestions
if: ${{ github.repository == 'jellyfin/jellyfin-web' }}
runs-on: ubuntu-latest
steps:
- name: Check out Git repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: Setup node environment
uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0
with:
node-version: 20
cache: npm
check-latest: true
- name: Install Node.js dependencies
run: npm ci --no-audit
- name: Run eslint
uses: CatChen/eslint-suggestion-action@9c12109c4943f26f0676b71c9c10e456748872cf # v4.1.7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}

58
.github/workflows/push.yml vendored Normal file
View File

@@ -0,0 +1,58 @@
name: Push & Release 🌍
concurrency:
group: ${{ github.workflow }}-${{ github.event_name == 'push' && github.ref }}
cancel-in-progress: true
on:
push:
branches:
- master
- release*
paths-ignore:
- '**/*.md'
jobs:
automation:
name: Automation 🎛️
if: ${{ github.repository == 'jellyfin/jellyfin-web' }}
uses: ./.github/workflows/__automation.yml
secrets: inherit
main:
name: 'Unstable release 🚀⚠️'
uses: ./.github/workflows/__package.yml
with:
commit: ${{ github.sha }}
quality_checks:
name: Quality checks 👌🧪
if: ${{ always() && !cancelled() }}
uses: ./.github/workflows/__quality_checks.yml
permissions: {}
with:
commit: ${{ github.sha }}
codeql:
name: GitHub CodeQL 🔬
uses: ./.github/workflows/__codeql.yml
permissions:
actions: read
contents: read
security-events: write
with:
commit: ${{ github.sha }}
deploy:
name: Deploy 🚀
if: ${{ github.repository == 'jellyfin/jellyfin-web' }}
uses: ./.github/workflows/__deploy.yml
needs:
- main
permissions:
contents: read
deployments: write
secrets: inherit
with:
branch: ${{ github.ref_name }}
comment:

View File

@@ -1,123 +0,0 @@
name: Quality checks
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
on:
push:
branches: [ master, release* ]
pull_request:
branches: [ master, release* ]
jobs:
run-escheck:
name: Run es-check
runs-on: ubuntu-latest
steps:
- name: Check out Git repository
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
- name: Setup node environment
uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3
with:
node-version: 20
check-latest: true
cache: npm
- name: Install Node.js dependencies
run: npm ci --no-audit
- name: Run a production build
run: npm run build:production
- name: Run es-check
run: npm run escheck
run-eslint:
name: Run eslint
runs-on: ubuntu-latest
steps:
- name: Check out Git repository
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
- name: Setup node environment
uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3
with:
node-version: 20
check-latest: true
cache: npm
- name: Install Node.js dependencies
run: npm ci --no-audit
- name: Run eslint
run: npx eslint --quiet "."
run-stylelint:
name: Run stylelint
runs-on: ubuntu-latest
steps:
- name: Check out Git repository
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
- name: Setup node environment
uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3
with:
node-version: 20
check-latest: true
cache: npm
- name: Set up stylelint matcher
uses: xt0rted/stylelint-problem-matcher@34db1b874c0452909f0696aedef70b723870a583 # tag=v1
- name: Install Node.js dependencies
run: npm ci --no-audit
- name: Run stylelint
run: npm run stylelint
run-tsc:
name: Run TypeScript build check
runs-on: ubuntu-latest
steps:
- name: Check out Git repository
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
- name: Setup node environment
uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3
with:
node-version: 20
check-latest: true
cache: npm
- name: Install Node.js dependencies
run: npm ci --no-audit
- name: Run tsc
run: npm run build:check
run-test:
name: Run tests
runs-on: ubuntu-latest
steps:
- name: Check out Git repository
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
- name: Setup node environment
uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3
with:
node-version: 20
check-latest: true
cache: npm
- name: Install Node.js dependencies
run: npm ci --no-audit
- name: Run test suite
run: npm run test

View File

@@ -1,10 +1,9 @@
name: Stale Check
name: Scheduled tasks 🕑
on:
schedule:
- cron: '30 1 * * *'
workflow_dispatch:
permissions:
issues: write
pull-requests: write

View File

@@ -1,52 +0,0 @@
name: Update the Jellyfin SDK
on:
schedule:
- cron: '0 7 * * *'
workflow_dispatch:
concurrency:
group: unstable-sdk-pr
cancel-in-progress: true
jobs:
update:
runs-on: ubuntu-latest
if: ${{ github.repository == 'jellyfin/jellyfin-web' }}
steps:
- name: Check out Git repository
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
with:
ref: master
token: ${{ secrets.JF_BOT_TOKEN }}
- name: Set up Node.js
uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3
with:
node-version: 20
check-latest: true
cache: npm
- name: Install latest unstable SDK
run: |
npm i --save @jellyfin/sdk@unstable
VERSION=$(jq -r '.dependencies["@jellyfin/sdk"]' package.json)
echo "JF_SDK_VERSION=${VERSION}" >> $GITHUB_ENV
- name: Open a pull request
uses: peter-evans/create-pull-request@c5a7806660adbe173f04e3e038b0ccdcd758773c # v6.1.0
with:
token: ${{ secrets.JF_BOT_TOKEN }}
commit-message: Update @jellyfin/sdk to ${{env.JF_SDK_VERSION}}
committer: jellyfin-bot <team@jellyfin.org>
author: jellyfin-bot <team@jellyfin.org>
branch: update-jf-sdk
delete-branch: true
title: Update @jellyfin/sdk to ${{env.JF_SDK_VERSION}}
body: |
**Changes**
Updates to the latest unstable @jellyfin/sdk build
labels: |
dependencies
npm

1
.nvmrc Normal file
View File

@@ -0,0 +1 @@
20

View File

@@ -92,6 +92,7 @@
- [Venkat Karasani](https://github.com/venkat-karasani)
- [Connor Smith](https://github.com/ConnorS1110)
- [iFraan](https://github.com/iFraan)
- [Ali](https://github.com/bu3alwa)
## Emby Contributors

View File

@@ -15,8 +15,5 @@ module.exports = {
'@babel/preset-react'
],
plugins: [
'@babel/plugin-transform-class-properties',
'@babel/plugin-transform-private-methods',
'babel-plugin-dynamic-import-polyfill'
]
};

12355
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,58 +1,56 @@
{
"name": "jellyfin-web",
"version": "10.10.0",
"version": "10.10.7",
"description": "Web interface for Jellyfin",
"repository": "https://github.com/jellyfin/jellyfin-web",
"license": "GPL-2.0-or-later",
"devDependencies": {
"@babel/core": "7.24.9",
"@babel/plugin-transform-class-properties": "7.24.7",
"@babel/plugin-transform-modules-umd": "7.24.7",
"@babel/plugin-transform-private-methods": "7.24.7",
"@babel/preset-env": "7.24.8",
"@babel/preset-react": "7.24.7",
"@babel/core": "7.25.8",
"@babel/plugin-transform-modules-umd": "7.25.7",
"@babel/preset-env": "7.25.8",
"@babel/preset-react": "7.25.7",
"@eslint-community/eslint-plugin-eslint-comments": "4.4.0",
"@stylistic/eslint-plugin": "2.9.0",
"@types/dompurify": "3.0.5",
"@types/escape-html": "1.0.4",
"@types/loadable__component": "5.13.9",
"@types/lodash-es": "4.17.12",
"@types/markdown-it": "14.1.2",
"@types/react": "18.3.3",
"@types/react-dom": "18.3.0",
"@types/react": "18.3.11",
"@types/react-dom": "18.3.1",
"@types/sortablejs": "1.15.8",
"@typescript-eslint/eslint-plugin": "5.62.0",
"@typescript-eslint/parser": "5.62.0",
"@uupaa/dynamic-import-polyfill": "1.0.2",
"@vitest/coverage-v8": "2.0.5",
"autoprefixer": "10.4.19",
"babel-loader": "9.1.3",
"babel-plugin-dynamic-import-polyfill": "1.0.0",
"@vitest/coverage-v8": "2.1.3",
"autoprefixer": "10.4.20",
"babel-loader": "9.2.1",
"clean-webpack-plugin": "4.0.0",
"confusing-browser-globals": "1.0.11",
"copy-webpack-plugin": "12.0.2",
"cross-env": "7.0.3",
"css-loader": "7.1.2",
"cssnano": "7.0.4",
"cssnano": "7.0.6",
"es-check": "7.2.1",
"eslint": "8.57.0",
"eslint": "8.57.1",
"eslint-plugin-compat": "4.2.0",
"eslint-plugin-eslint-comments": "3.2.0",
"eslint-plugin-import": "2.29.1",
"eslint-plugin-jsx-a11y": "6.9.0",
"eslint-plugin-react": "7.35.0",
"eslint-plugin-import": "2.31.0",
"eslint-plugin-jsx-a11y": "6.10.0",
"eslint-plugin-react": "7.37.1",
"eslint-plugin-react-hooks": "4.6.2",
"eslint-plugin-sonarjs": "0.25.1",
"expose-loader": "5.0.0",
"fork-ts-checker-webpack-plugin": "9.0.2",
"html-loader": "5.1.0",
"html-webpack-plugin": "5.6.0",
"jsdom": "24.1.1",
"mini-css-extract-plugin": "2.9.0",
"postcss": "8.4.40",
"jsdom": "25.0.1",
"mini-css-extract-plugin": "2.9.1",
"postcss": "8.4.47",
"postcss-loader": "8.1.1",
"postcss-preset-env": "9.6.0",
"postcss-preset-env": "10.0.7",
"postcss-scss": "4.0.9",
"sass": "1.77.8",
"sass-loader": "15.0.0",
"sass": "1.79.5",
"sass-loader": "16.0.2",
"source-map-loader": "5.0.0",
"speed-measure-webpack-plugin": "1.5.0",
"style-loader": "4.0.0",
@@ -62,70 +60,75 @@
"stylelint-order": "6.0.4",
"stylelint-scss": "5.3.2",
"ts-loader": "9.5.1",
"typescript": "5.5.4",
"vitest": "2.0.5",
"webpack": "5.93.0",
"typescript": "5.6.3",
"vitest": "2.1.3",
"webpack": "5.95.0",
"webpack-bundle-analyzer": "4.10.2",
"webpack-cli": "5.1.4",
"webpack-dev-server": "5.0.4",
"webpack-dev-server": "5.1.0",
"webpack-merge": "6.0.1",
"worker-loader": "3.0.8"
},
"dependencies": {
"@emotion/react": "11.13.0",
"@emotion/react": "11.13.3",
"@emotion/styled": "11.13.0",
"@fontsource/noto-sans": "5.0.22",
"@fontsource/noto-sans-hk": "5.0.20",
"@fontsource/noto-sans-jp": "5.0.19",
"@fontsource/noto-sans-kr": "5.0.19",
"@fontsource/noto-sans-sc": "5.0.20",
"@fontsource/noto-sans-tc": "5.0.20",
"@jellyfin/libass-wasm": "4.2.2",
"@jellyfin/sdk": "0.0.0-unstable.202408050429",
"@mui/icons-material": "5.15.19",
"@mui/material": "5.15.19",
"@mui/x-data-grid": "7.6.1",
"@react-hook/resize-observer": "2.0.1",
"@tanstack/react-query": "5.51.11",
"@tanstack/react-query-devtools": "5.51.11",
"@fontsource/noto-sans": "5.1.0",
"@fontsource/noto-sans-hk": "5.1.0",
"@fontsource/noto-sans-jp": "5.1.0",
"@fontsource/noto-sans-kr": "5.1.0",
"@fontsource/noto-sans-sc": "5.1.0",
"@fontsource/noto-sans-tc": "5.1.0",
"@jellyfin/libass-wasm": "4.2.3",
"@jellyfin/sdk": "0.0.0-unstable.202410250501",
"@mui/icons-material": "5.16.7",
"@mui/material": "5.16.7",
"@mui/x-date-pickers": "7.20.0",
"@react-hook/resize-observer": "2.0.2",
"@tanstack/react-query": "5.59.13",
"@tanstack/react-query-devtools": "5.59.13",
"@types/react-lazy-load-image-component": "1.6.4",
"abortcontroller-polyfill": "1.7.5",
"blurhash": "2.0.5",
"classlist.js": "https://github.com/eligrey/classList.js/archive/1.2.20180112.tar.gz",
"classnames": "2.5.1",
"core-js": "3.37.1",
"core-js": "3.38.1",
"date-fns": "2.30.0",
"dompurify": "3.0.1",
"dompurify": "2.5.7",
"epubjs": "0.3.93",
"escape-html": "1.0.3",
"fast-text-encoding": "1.0.6",
"flv.js": "1.6.2",
"headroom.js": "0.12.0",
"history": "5.3.0",
"hls.js": "1.5.13",
"hls.js": "1.5.16",
"intersection-observer": "0.12.2",
"jellyfin-apiclient": "1.11.0",
"jquery": "3.7.1",
"jstree": "3.3.16",
"libarchive.js": "1.3.0",
"jstree": "3.3.17",
"libarchive.js": "2.0.2",
"libpgs": "0.8.1",
"lodash-es": "4.17.21",
"markdown-it": "14.1.0",
"material-design-icons-iconfont": "6.7.0",
"material-react-table": "2.13.3",
"native-promise-only": "0.8.1",
"pdfjs-dist": "3.11.174",
"react": "18.3.1",
"react-blurhash": "0.3.0",
"react-dom": "18.3.1",
"react-lazy-load-image-component": "1.6.2",
"react-router-dom": "6.25.1",
"react-router-dom": "6.27.0",
"resize-observer-polyfill": "1.5.1",
"screenfull": "6.0.2",
"sortablejs": "1.15.2",
"swiper": "11.1.7",
"sortablejs": "1.15.3",
"swiper": "11.1.14",
"usehooks-ts": "3.1.0",
"webcomponents.js": "0.7.24",
"whatwg-fetch": "3.6.20"
},
"optionalDependencies": {
"sass-embedded": "1.79.5"
},
"browserslist": [
"last 2 Firefox versions",
"last 2 Chrome versions",
@@ -149,6 +152,7 @@
"build:development": "webpack --config webpack.dev.js",
"build:production": "cross-env NODE_ENV=\"production\" webpack --config webpack.prod.js",
"build:check": "tsc --noEmit",
"build:es-check": "npm run build:production && npm run escheck",
"escheck": "es-check",
"lint": "eslint \"./\"",
"test": "vitest --watch=false --config vite.config.ts",

View File

@@ -3,19 +3,28 @@ import { ReactQueryDevtools } from '@tanstack/react-query-devtools';
import React from 'react';
import { ApiProvider } from 'hooks/useApi';
import { UserSettingsProvider } from 'hooks/useUserSettings';
import { WebConfigProvider } from 'hooks/useWebConfig';
import browser from 'scripts/browser';
import { queryClient } from 'utils/query/queryClient';
import RootAppRouter from 'RootAppRouter';
const useReactQueryDevtools = window.Proxy // '@tanstack/query-devtools' requires 'Proxy', which cannot be polyfilled for legacy browsers
&& !browser.tv; // Don't use devtools on the TV as the navigation is weird
const RootApp = () => (
<QueryClientProvider client={queryClient}>
<ApiProvider>
<WebConfigProvider>
<RootAppRouter />
</WebConfigProvider>
<UserSettingsProvider>
<WebConfigProvider>
<RootAppRouter />
</WebConfigProvider>
</UserSettingsProvider>
</ApiProvider>
<ReactQueryDevtools initialIsOpen={false} />
{useReactQueryDevtools && (
<ReactQueryDevtools initialIsOpen={false} />
)}
</QueryClientProvider>
);

View File

@@ -12,6 +12,7 @@ import { EXPERIMENTAL_APP_ROUTES } from 'apps/experimental/routes/routes';
import { STABLE_APP_ROUTES } from 'apps/stable/routes/routes';
import AppHeader from 'components/AppHeader';
import Backdrop from 'components/Backdrop';
import BangRedirect from 'components/router/BangRedirect';
import { createRouterHistory } from 'components/router/routerHistory';
import UserThemeProvider from 'themes/UserThemeProvider';
@@ -23,7 +24,11 @@ const router = createHashRouter([
element: <RootAppLayout />,
children: [
...(isExperimentalLayout ? EXPERIMENTAL_APP_ROUTES : STABLE_APP_ROUTES),
...DASHBOARD_APP_ROUTES
...DASHBOARD_APP_ROUTES,
{
path: '!/*',
Component: BangRedirect
}
]
}
]);

6
src/apiclient.d.ts vendored
View File

@@ -182,7 +182,7 @@ declare module 'jellyfin-apiclient' {
getPluginConfiguration(id: string): Promise<any>;
getPublicSystemInfo(): Promise<PublicSystemInfo>;
getPublicUsers(): Promise<UserDto[]>;
getQuickConnect(verb: string): Promise<void|boolean|number|QuickConnectResult|QuickConnectState>;
getQuickConnect(verb: string): Promise<void | boolean | number | QuickConnectResult | QuickConnectState>;
getReadySyncItems(deviceId: string): Promise<any>;
getRecordingFolders(userId: string): Promise<BaseItemDtoQueryResult>;
getRegistrationInfo(feature: string): Promise<any>;
@@ -308,7 +308,7 @@ declare module 'jellyfin-apiclient' {
class AppStore {
constructor();
getItem(name: string): string|null;
getItem(name: string): string | null;
removeItem(name: string): void;
setItem(name: string, value: string): void;
}
@@ -329,7 +329,7 @@ declare module 'jellyfin-apiclient' {
connectToServer(server: any, options?: any): Promise<any>;
connectToServers(servers: any[], options?: any): Promise<any>;
deleteServer(serverId: string): Promise<void>;
getApiClient(item: BaseItemDto|string): ApiClient;
getApiClient(item: BaseItemDto | string): ApiClient;
getApiClients(): ApiClient[];
getAvailableServers(): any[];
getOrCreateApiClient(serverId: string): ApiClient;

View File

@@ -2,7 +2,9 @@ import AppBar from '@mui/material/AppBar';
import Box from '@mui/material/Box';
import { type Theme } from '@mui/material/styles';
import useMediaQuery from '@mui/material/useMediaQuery';
import React, { FC, useCallback, useEffect, useState } from 'react';
import { LocalizationProvider } from '@mui/x-date-pickers';
import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns';
import React, { FC, StrictMode, useCallback, useEffect, useState } from 'react';
import { Outlet, useLocation } from 'react-router-dom';
import AppBody from 'components/AppBody';
@@ -10,6 +12,7 @@ import AppToolbar from 'components/toolbar/AppToolbar';
import ElevationScroll from 'components/ElevationScroll';
import { DRAWER_WIDTH } from 'components/ResponsiveDrawer';
import { useApi } from 'hooks/useApi';
import { useLocale } from 'hooks/useLocale';
import AppTabs from './components/AppTabs';
import AppDrawer from './components/drawer/AppDrawer';
@@ -23,6 +26,7 @@ export const Component: FC = () => {
const [ isDrawerActive, setIsDrawerActive ] = useState(false);
const location = useLocation();
const { user } = useApi();
const { dateFnsLocale } = useLocale();
const isMediumScreen = useMediaQuery((t: Theme) => t.breakpoints.up('md'));
const isDrawerAvailable = Boolean(user)
@@ -43,52 +47,56 @@ export const Component: FC = () => {
}, []);
return (
<Box sx={{ display: 'flex' }}>
<ElevationScroll elevate={false}>
<AppBar
position='fixed'
<LocalizationProvider dateAdapter={AdapterDateFns} adapterLocale={dateFnsLocale}>
<Box sx={{ display: 'flex' }}>
<StrictMode>
<ElevationScroll elevate={false}>
<AppBar
position='fixed'
sx={{
width: {
xs: '100%',
md: isDrawerAvailable ? `calc(100% - ${DRAWER_WIDTH}px)` : '100%'
},
ml: {
xs: 0,
md: isDrawerAvailable ? DRAWER_WIDTH : 0
}
}}
>
<AppToolbar
isDrawerAvailable={!isMediumScreen && isDrawerAvailable}
isDrawerOpen={isDrawerOpen}
onDrawerButtonClick={onToggleDrawer}
>
<AppTabs isDrawerOpen={isDrawerOpen} />
</AppToolbar>
</AppBar>
</ElevationScroll>
{
isDrawerAvailable && (
<AppDrawer
open={isDrawerOpen}
onClose={onToggleDrawer}
onOpen={onToggleDrawer}
/>
)
}
</StrictMode>
<Box
component='main'
sx={{
width: {
xs: '100%',
md: isDrawerAvailable ? `calc(100% - ${DRAWER_WIDTH}px)` : '100%'
},
ml: {
xs: 0,
md: isDrawerAvailable ? DRAWER_WIDTH : 0
}
width: '100%',
flexGrow: 1
}}
>
<AppToolbar
isDrawerAvailable={!isMediumScreen && isDrawerAvailable}
isDrawerOpen={isDrawerOpen}
onDrawerButtonClick={onToggleDrawer}
>
<AppTabs isDrawerOpen={isDrawerOpen} />
</AppToolbar>
</AppBar>
</ElevationScroll>
{
isDrawerAvailable && (
<AppDrawer
open={isDrawerOpen}
onClose={onToggleDrawer}
onOpen={onToggleDrawer}
/>
)
}
<Box
component='main'
sx={{
width: '100%',
flexGrow: 1
}}
>
<AppBody>
<Outlet />
</AppBody>
<AppBody>
<Outlet />
</AppBody>
</Box>
</Box>
</Box>
</LocalizationProvider>
);
};

View File

@@ -9,7 +9,7 @@ $drawer-width: 240px;
// Fix dashboard pages layout to work with drawer
.dashboardDocument {
.mainAnimatedPage {
.mainAnimatedPage:not(.metadataEditorPage) {
@media all and (min-width: $mui-bp-md) {
left: $drawer-width;
}
@@ -31,4 +31,8 @@ $drawer-width: 240px;
padding-top: 3.25rem;
}
}
.metadataEditorPage {
padding-top: 3.25rem !important;
}
}

View File

@@ -1,17 +0,0 @@
import React, { type RefAttributes } from 'react';
import { Link } from 'react-router-dom';
import { GridActionsCellItem, type GridActionsCellItemProps } from '@mui/x-data-grid';
type GridActionsCellLinkProps = { to: string } & GridActionsCellItemProps & RefAttributes<HTMLButtonElement>;
/**
* Link component to use in mui's data-grid action column due to a current bug with passing props to custom link components.
* @see https://github.com/mui/mui-x/issues/4654
*/
const GridActionsCellLink = ({ to, ...props }: GridActionsCellLinkProps) => (
<Link to={to}>
<GridActionsCellItem {...props} />
</Link>
);
export default GridActionsCellLink;

View File

@@ -2,10 +2,11 @@ import { Dashboard, ExpandLess, ExpandMore, LibraryAdd, People, PlayCircle, Sett
import Collapse from '@mui/material/Collapse';
import List from '@mui/material/List';
import ListItem from '@mui/material/ListItem';
import ListItemButton from '@mui/material/ListItemButton/ListItemButton';
import ListItemIcon from '@mui/material/ListItemIcon';
import ListItemText from '@mui/material/ListItemText';
import ListSubheader from '@mui/material/ListSubheader';
import React from 'react';
import React, { type MouseEvent, useCallback, useState } from 'react';
import { useLocation } from 'react-router-dom';
import ListItemLink from 'components/ListItemLink';
@@ -28,8 +29,20 @@ const PLAYBACK_PATHS = [
const ServerDrawerSection = () => {
const location = useLocation();
const isLibrarySectionOpen = LIBRARY_PATHS.includes(location.pathname);
const isPlaybackSectionOpen = PLAYBACK_PATHS.includes(location.pathname);
const [ isLibrarySectionOpen, setIsLibrarySectionOpen ] = useState(LIBRARY_PATHS.includes(location.pathname));
const [ isPlaybackSectionOpen, setIsPlaybackSectionOpen ] = useState(PLAYBACK_PATHS.includes(location.pathname));
const onLibrarySectionClick = useCallback((e: MouseEvent) => {
e.preventDefault();
e.stopPropagation();
setIsLibrarySectionOpen(isOpen => !isOpen);
}, []);
const onPlaybackSectionClick = useCallback((e: MouseEvent) => {
e.preventDefault();
e.stopPropagation();
setIsPlaybackSectionOpen(isOpen => !isOpen);
}, []);
return (
<List
@@ -65,13 +78,13 @@ const ServerDrawerSection = () => {
</ListItemLink>
</ListItem>
<ListItem disablePadding>
<ListItemLink to='/dashboard/libraries' selected={false}>
<ListItemButton onClick={onLibrarySectionClick}>
<ListItemIcon>
<LibraryAdd />
</ListItemIcon>
<ListItemText primary={globalize.translate('HeaderLibraries')} />
{isLibrarySectionOpen ? <ExpandLess /> : <ExpandMore />}
</ListItemLink>
</ListItemButton>
</ListItem>
<Collapse in={isLibrarySectionOpen} timeout='auto' unmountOnExit>
<List component='div' disablePadding>
@@ -82,7 +95,7 @@ const ServerDrawerSection = () => {
<ListItemText inset primary={globalize.translate('Display')} />
</ListItemLink>
<ListItemLink to='/dashboard/libraries/metadata' sx={{ pl: 4 }}>
<ListItemText inset primary={globalize.translate('Metadata')} />
<ListItemText inset primary={globalize.translate('LabelMetadata')} />
</ListItemLink>
<ListItemLink to='/dashboard/libraries/nfo' sx={{ pl: 4 }}>
<ListItemText inset primary={globalize.translate('TabNfoSettings')} />
@@ -90,13 +103,13 @@ const ServerDrawerSection = () => {
</List>
</Collapse>
<ListItem disablePadding>
<ListItemLink to='/dashboard/playback/transcoding' selected={false}>
<ListItemButton onClick={onPlaybackSectionClick}>
<ListItemIcon>
<PlayCircle />
</ListItemIcon>
<ListItemText primary={globalize.translate('TitlePlayback')} />
{isPlaybackSectionOpen ? <ExpandLess /> : <ExpandMore />}
</ListItemLink>
</ListItemButton>
</ListItem>
<Collapse in={isPlaybackSectionOpen} timeout='auto' unmountOnExit>
<List component='div' disablePadding>

View File

@@ -0,0 +1,36 @@
import type { ActivityLogApiGetLogEntriesRequest } from '@jellyfin/sdk/lib/generated-client';
import type { AxiosRequestConfig } from 'axios';
import type { Api } from '@jellyfin/sdk';
import { getActivityLogApi } from '@jellyfin/sdk/lib/utils/api/activity-log-api';
import { useQuery } from '@tanstack/react-query';
import { useApi } from 'hooks/useApi';
const fetchLogEntries = async (
api?: Api,
requestParams?: ActivityLogApiGetLogEntriesRequest,
options?: AxiosRequestConfig
) => {
if (!api) {
console.warn('[fetchLogEntries] No API instance available');
return;
}
const response = await getActivityLogApi(api).getLogEntries(requestParams, {
signal: options?.signal
});
return response.data;
};
export const useLogEntires = (
requestParams: ActivityLogApiGetLogEntriesRequest
) => {
const { api } = useApi();
return useQuery({
queryKey: ['LogEntries', requestParams],
queryFn: ({ signal }) =>
fetchLogEntries(api, requestParams, { signal }),
enabled: !!api
});
};

View File

@@ -0,0 +1,22 @@
import IconButton from '@mui/material/IconButton/IconButton';
import PermMedia from '@mui/icons-material/PermMedia';
import React, { type FC } from 'react';
import { Link } from 'react-router-dom';
import type { ActivityLogEntryCell } from 'apps/dashboard/features/activity/types/ActivityLogEntryCell';
import globalize from 'lib/globalize';
const ActionsCell: FC<ActivityLogEntryCell> = ({ row }) => (
row.original.ItemId ? (
<IconButton
size='large'
title={globalize.translate('LabelMediaDetails')}
component={Link}
to={`/details?id=${row.original.ItemId}`}
>
<PermMedia fontSize='inherit' />
</IconButton>
) : undefined
);
export default ActionsCell;

View File

@@ -0,0 +1,14 @@
import type { LogLevel } from '@jellyfin/sdk/lib/generated-client/models/log-level';
import React, { type FC } from 'react';
import { ActivityLogEntryCell } from '../types/ActivityLogEntryCell';
import LogLevelChip from './LogLevelChip';
const LogLevelCell: FC<ActivityLogEntryCell> = ({ cell }) => {
const level = cell.getValue<LogLevel | undefined>();
return level ? (
<LogLevelChip level={level} />
) : undefined;
};
export default LogLevelCell;

View File

@@ -1,12 +1,14 @@
import type { ActivityLogEntry } from '@jellyfin/sdk/lib/generated-client/models/activity-log-entry';
import Info from '@mui/icons-material/Info';
import Box from '@mui/material/Box';
import ClickAwayListener from '@mui/material/ClickAwayListener';
import IconButton from '@mui/material/IconButton';
import Tooltip from '@mui/material/Tooltip';
import React, { FC, useCallback, useState } from 'react';
import React, { type FC, useCallback, useState } from 'react';
const OverviewCell: FC<ActivityLogEntry> = ({ Overview, ShortOverview }) => {
import type { ActivityLogEntryCell } from '../types/ActivityLogEntryCell';
const OverviewCell: FC<ActivityLogEntryCell> = ({ row }) => {
const { ShortOverview, Overview } = row.original;
const displayValue = ShortOverview ?? Overview;
const [ open, setOpen ] = useState(false);

View File

@@ -0,0 +1,27 @@
import type { UserDto } from '@jellyfin/sdk/lib/generated-client/models/user-dto';
import IconButton from '@mui/material/IconButton/IconButton';
import React, { type FC } from 'react';
import { Link } from 'react-router-dom';
import UserAvatar from 'components/UserAvatar';
interface UserAvatarButtonProps {
user?: UserDto
}
const UserAvatarButton: FC<UserAvatarButtonProps> = ({ user }) => (
user?.Id ? (
<IconButton
size='large'
color='inherit'
sx={{ padding: 0 }}
title={user.Name || undefined}
component={Link}
to={`/dashboard/users/profile?userId=${user.Id}`}
>
<UserAvatar user={user} />
</IconButton>
) : undefined
);
export default UserAvatarButton;

View File

@@ -0,0 +1,7 @@
import type { ActivityLogEntry } from '@jellyfin/sdk/lib/generated-client/models/activity-log-entry';
import type { MRT_Cell, MRT_Row } from 'material-react-table';
export interface ActivityLogEntryCell {
cell: MRT_Cell<ActivityLogEntry>
row: MRT_Row<ActivityLogEntry>
}

View File

@@ -9,7 +9,7 @@ import Stack from '@mui/material/Stack/Stack';
import React, { type FC } from 'react';
import MarkdownBox from 'components/MarkdownBox';
import { parseISO8601Date, toLocaleString } from 'scripts/datetime';
import { getDisplayDateTime } from 'scripts/datetime';
import globalize from 'lib/globalize';
import type { PluginDetails } from '../types/PluginDetails';
@@ -32,7 +32,7 @@ const PluginRevisions: FC<PluginRevisionsProps> = ({
{version.version}
{version.timestamp && (<>
&nbsp;&mdash;&nbsp;
{toLocaleString(parseISO8601Date(version.timestamp))}
{getDisplayDateTime(version.timestamp)}
</>)}
</AccordionSummary>
<AccordionDetails>

View File

@@ -0,0 +1,15 @@
/** A mapping of category names used by the plugin repository to translation keys. */
export const CATEGORY_LABELS = {
Administration: 'HeaderAdmin',
Anime: 'Anime',
Authentication: 'LabelAuthProvider', // Legacy
Books: 'Books',
Channel: 'Channels', // Unused?
General: 'General',
LiveTV: 'LiveTV',
Metadata: 'LabelMetadata', // Legacy
MoviesAndShows: 'MoviesAndShows',
Music: 'TabMusic',
Subtitles: 'Subtitles',
Other: 'Other'
};

View File

@@ -1,35 +0,0 @@
import type { Redirect } from 'components/router/Redirect';
export const REDIRECTS: Redirect[] = [
{ from: 'apikeys.html', to: '/dashboard/keys' },
{ from: 'availableplugins.html', to: '/dashboard/plugins/catalog' },
{ from: 'dashboard.html', to: '/dashboard' },
{ from: 'dashboardgeneral.html', to: '/dashboard/settings' },
{ from: 'device.html', to: '/dashboard/devices/edit' },
{ from: 'devices.html', to: '/dashboard/devices' },
{ from: 'edititemmetadata.html', to: '/metadata' },
{ from: 'encodingsettings.html', to: '/dashboard/playback/transcoding' },
{ from: 'installedplugins.html', to: '/dashboard/plugins' },
{ from: 'library.html', to: '/dashboard/libraries' },
{ from: 'librarydisplay.html', to: '/dashboard/libraries/display' },
{ from: 'livetvguideprovider.html', to: '/dashboard/livetv/guide' },
{ from: 'livetvsettings.html', to: '/dashboard/recordings' },
{ from: 'livetvstatus.html', to: '/dashboard/livetv' },
{ from: 'livetvtuner.html', to: '/dashboard/livetv/tuner' },
{ from: 'log.html', to: '/dashboard/logs' },
{ from: 'metadataimages.html', to: '/dashboard/libraries/metadata' },
{ from: 'metadatanfo.html', to: '/dashboard/libraries/nfo' },
{ from: 'networking.html', to: '/dashboard/networking' },
{ from: 'playbackconfiguration.html', to: '/dashboard/playback/resume' },
{ from: 'repositories.html', to: '/dashboard/plugins/repositories' },
{ from: 'scheduledtask.html', to: '/dashboard/tasks/edit' },
{ from: 'scheduledtasks.html', to: '/dashboard/tasks' },
{ from: 'serveractivity.html', to: '/dashboard/activity' },
{ from: 'streamingsettings.html', to: '/dashboard/playback/streaming' },
{ from: 'useredit.html', to: '/dashboard/users/profile' },
{ from: 'userlibraryaccess.html', to: '/dashboard/users/access' },
{ from: 'usernew.html', to: '/dashboard/users/add' },
{ from: 'userparentalcontrol.html', to: '/dashboard/users/parentalcontrol' },
{ from: 'userpassword.html', to: '/dashboard/users/password' },
{ from: 'userprofiles.html', to: '/dashboard/users' }
];

View File

@@ -1,35 +1,35 @@
import React, { useCallback, useEffect, useState } from 'react';
import { getActivityLogApi } from '@jellyfin/sdk/lib/utils/api/activity-log-api';
import { getUserApi } from '@jellyfin/sdk/lib/utils/api/user-api';
import React, { useCallback, useEffect, useMemo, useState } from 'react';
import type { ActivityLogEntry } from '@jellyfin/sdk/lib/generated-client/models/activity-log-entry';
import { LogLevel } from '@jellyfin/sdk/lib/generated-client/models/log-level';
import type { UserDto } from '@jellyfin/sdk/lib/generated-client/models/user-dto';
import PermMedia from '@mui/icons-material/PermMedia';
import Box from '@mui/material/Box';
import IconButton from '@mui/material/IconButton';
import ToggleButton from '@mui/material/ToggleButton';
import ToggleButtonGroup from '@mui/material/ToggleButtonGroup';
import Typography from '@mui/material/Typography';
import { DataGrid, type GridColDef } from '@mui/x-data-grid';
import { Link, useSearchParams } from 'react-router-dom';
import { type MRT_ColumnDef, MaterialReactTable, useMaterialReactTable } from 'material-react-table';
import { useSearchParams } from 'react-router-dom';
import { useLogEntires } from 'apps/dashboard/features/activity/api/useLogEntries';
import ActionsCell from 'apps/dashboard/features/activity/components/ActionsCell';
import LogLevelCell from 'apps/dashboard/features/activity/components/LogLevelCell';
import OverviewCell from 'apps/dashboard/features/activity/components/OverviewCell';
import UserAvatarButton from 'apps/dashboard/features/activity/components/UserAvatarButton';
import type { ActivityLogEntryCell } from 'apps/dashboard/features/activity/types/ActivityLogEntryCell';
import Page from 'components/Page';
import UserAvatar from 'components/UserAvatar';
import { useApi } from 'hooks/useApi';
import { parseISO8601Date, toLocaleDateString, toLocaleTimeString } from 'scripts/datetime';
import { useUsers } from 'hooks/useUsers';
import { parseISO8601Date, toLocaleString } from 'scripts/datetime';
import globalize from 'lib/globalize';
import { toBoolean } from 'utils/string';
import LogLevelChip from '../components/activityTable/LogLevelChip';
import OverviewCell from '../components/activityTable/OverviewCell';
import GridActionsCellLink from '../components/dataGrid/GridActionsCellLink';
type UsersRecords = Record<string, UserDto>;
const DEFAULT_PAGE_SIZE = 25;
const VIEW_PARAM = 'useractivity';
const enum ActivityView {
All,
User,
System
All = 'All',
User = 'User',
System = 'System'
}
const getActivityView = (param: string | null) => {
@@ -38,114 +38,125 @@ const getActivityView = (param: string | null) => {
return ActivityView.System;
};
const getRowId = (row: ActivityLogEntry) => row.Id ?? -1;
const getUserCell = (users: UsersRecords) => function UserCell({ row }: ActivityLogEntryCell) {
return (
<UserAvatarButton user={row.original.UserId && users[row.original.UserId] || undefined} />
);
};
const Activity = () => {
const { api } = useApi();
const [ searchParams, setSearchParams ] = useSearchParams();
const [ activityView, setActivityView ] = useState(
getActivityView(searchParams.get(VIEW_PARAM)));
const [ isLoading, setIsLoading ] = useState(true);
const [ paginationModel, setPaginationModel ] = useState({
page: 0,
const [ pagination, setPagination ] = useState({
pageIndex: 0,
pageSize: DEFAULT_PAGE_SIZE
});
const [ rowCount, setRowCount ] = useState(0);
const [ rows, setRows ] = useState<ActivityLogEntry[]>([]);
const [ users, setUsers ] = useState<Record<string, UserDto>>({});
const userColDef: GridColDef[] = activityView !== ActivityView.System ? [
const { data: usersData, isLoading: isUsersLoading } = useUsers();
const users: UsersRecords = useMemo(() => {
if (!usersData) return {};
return usersData.reduce<UsersRecords>((acc, user) => {
const userId = user.Id;
if (!userId) return acc;
return {
...acc,
[userId]: user
};
}, {});
}, [ usersData ]);
const userNames = useMemo(() => {
const names: string[] = [];
usersData?.forEach(user => {
if (user.Name) names.push(user.Name);
});
return names;
}, [ usersData ]);
const UserCell = getUserCell(users);
const activityParams = useMemo(() => ({
startIndex: pagination.pageIndex * pagination.pageSize,
limit: pagination.pageSize,
hasUserId: activityView !== ActivityView.All ? activityView === ActivityView.User : undefined
}), [activityView, pagination.pageIndex, pagination.pageSize]);
const { data: logEntries, isLoading: isLogEntriesLoading } = useLogEntires(activityParams);
const isLoading = isUsersLoading || isLogEntriesLoading;
const userColumn: MRT_ColumnDef<ActivityLogEntry>[] = useMemo(() =>
(activityView === ActivityView.System) ? [] : [{
id: 'User',
accessorFn: row => row.UserId && users[row.UserId]?.Name,
header: globalize.translate('LabelUser'),
size: 75,
Cell: UserCell,
enableResizing: false,
muiTableBodyCellProps: {
align: 'center'
},
filterVariant: 'multi-select',
filterSelectOptions: userNames
}], [ activityView, userNames, users, UserCell ]);
const columns = useMemo<MRT_ColumnDef<ActivityLogEntry>[]>(() => [
{
field: 'User',
headerName: globalize.translate('LabelUser'),
width: 60,
valueGetter: ( value, row ) => users[row.UserId]?.Name,
renderCell: ({ row }) => (
<IconButton
size='large'
color='inherit'
sx={{ padding: 0 }}
title={users[row.UserId]?.Name ?? undefined}
component={Link}
to={`/dashboard/users/profile?userId=${row.UserId}`}
>
<UserAvatar user={users[row.UserId]} />
</IconButton>
)
id: 'Date',
accessorFn: row => parseISO8601Date(row.Date),
header: globalize.translate('LabelTime'),
size: 160,
Cell: ({ cell }) => toLocaleString(cell.getValue<Date>()),
filterVariant: 'datetime-range'
},
{
accessorKey: 'Severity',
header: globalize.translate('LabelLevel'),
size: 90,
Cell: LogLevelCell,
enableResizing: false,
muiTableBodyCellProps: {
align: 'center'
},
filterVariant: 'multi-select',
filterSelectOptions: Object.values(LogLevel).map(level => globalize.translate(`LogLevel.${level}`))
},
...userColumn,
{
accessorKey: 'Name',
header: globalize.translate('LabelName'),
size: 270
},
{
id: 'Overview',
accessorFn: row => row.ShortOverview || row.Overview,
header: globalize.translate('LabelOverview'),
size: 170,
Cell: OverviewCell
},
{
accessorKey: 'Type',
header: globalize.translate('LabelType'),
size: 150
},
{
id: 'Actions',
accessorFn: row => row.ItemId,
header: '',
size: 60,
Cell: ActionsCell,
enableColumnActions: false,
enableColumnFilter: false,
enableResizing: false,
enableSorting: false
}
] : [];
const columns: GridColDef[] = [
{
field: 'Date',
headerName: globalize.translate('LabelDate'),
width: 90,
type: 'date',
valueGetter: ( value ) => parseISO8601Date(value),
valueFormatter: ( value ) => toLocaleDateString(value)
},
{
field: 'Time',
headerName: globalize.translate('LabelTime'),
width: 100,
type: 'dateTime',
valueGetter: ( value, row ) => parseISO8601Date(row.Date),
valueFormatter: ( value ) => toLocaleTimeString(value)
},
{
field: 'Severity',
headerName: globalize.translate('LabelLevel'),
width: 110,
renderCell: ({ value }) => (
value ? (
<LogLevelChip level={value} />
) : undefined
)
},
...userColDef,
{
field: 'Name',
headerName: globalize.translate('LabelName'),
width: 300
},
{
field: 'Overview',
headerName: globalize.translate('LabelOverview'),
width: 200,
valueGetter: ( value, row ) => row.ShortOverview ?? row.Overview,
renderCell: ({ row }) => (
<OverviewCell {...row} />
)
},
{
field: 'Type',
headerName: globalize.translate('LabelType'),
width: 180
},
{
field: 'actions',
type: 'actions',
width: 50,
getActions: ({ row }) => {
const actions = [];
if (row.ItemId) {
actions.push(
<GridActionsCellLink
size='large'
icon={<PermMedia />}
label={globalize.translate('LabelMediaDetails')}
title={globalize.translate('LabelMediaDetails')}
to={`/details?id=${row.ItemId}`}
/>
);
}
return actions;
}
}
];
], [ userColumn ]);
const onViewChange = useCallback((_e: React.MouseEvent<HTMLElement, MouseEvent>, newView: ActivityView | null) => {
if (newView !== null) {
@@ -153,58 +164,6 @@ const Activity = () => {
}
}, []);
useEffect(() => {
if (api) {
const fetchUsers = async () => {
const { data } = await getUserApi(api).getUsers();
const usersById: Record<string, UserDto> = {};
data.forEach(user => {
if (user.Id) {
usersById[user.Id] = user;
}
});
setUsers(usersById);
};
fetchUsers()
.catch(err => {
console.error('[activity] failed to fetch users', err);
});
}
}, [ api ]);
useEffect(() => {
if (api) {
const fetchActivity = async () => {
const params: {
startIndex: number,
limit: number,
hasUserId?: boolean
} = {
startIndex: paginationModel.page * paginationModel.pageSize,
limit: paginationModel.pageSize
};
if (activityView !== ActivityView.All) {
params.hasUserId = activityView === ActivityView.User;
}
const { data } = await getActivityLogApi(api)
.getLogEntries(params);
setRowCount(data.TotalRecordCount ?? 0);
setRows(data.Items ?? []);
setIsLoading(false);
};
setIsLoading(true);
fetchActivity()
.catch(err => {
console.error('[activity] failed to fetch activity log entries', err);
});
}
}, [ activityView, api, paginationModel ]);
useEffect(() => {
const currentViewParam = getActivityView(searchParams.get(VIEW_PARAM));
if (currentViewParam !== activityView) {
@@ -217,56 +176,83 @@ const Activity = () => {
}
}, [ activityView, searchParams, setSearchParams ]);
const table = useMaterialReactTable({
columns,
data: logEntries?.Items || [],
// Enable custom features
enableColumnPinning: true,
enableColumnResizing: true,
// Sticky header/footer
enableStickyFooter: true,
enableStickyHeader: true,
muiTableContainerProps: {
sx: {
maxHeight: 'calc(100% - 7rem)' // 2 x 3.5rem for header and footer
}
},
// State
initialState: {
density: 'compact'
},
state: {
isLoading,
pagination
},
// Server pagination
manualPagination: true,
onPaginationChange: setPagination,
rowCount: logEntries?.TotalRecordCount || 0,
// Custom toolbar contents
renderTopToolbarCustomActions: () => (
<ToggleButtonGroup
size='small'
value={activityView}
onChange={onViewChange}
exclusive
>
<ToggleButton value={ActivityView.All}>
{globalize.translate('All')}
</ToggleButton>
<ToggleButton value={ActivityView.User}>
{globalize.translate('LabelUser')}
</ToggleButton>
<ToggleButton value={ActivityView.System}>
{globalize.translate('LabelSystem')}
</ToggleButton>
</ToggleButtonGroup>
)
});
return (
<Page
id='serverActivityPage'
title={globalize.translate('HeaderActivity')}
className='mainAnimatedPage type-interior'
>
<div className='content-primary'>
<Box
className='content-primary'
sx={{
display: 'flex',
flexDirection: 'column',
height: '100%'
}}
>
<Box
sx={{
display: 'flex',
alignItems: 'baseline',
marginY: 2
marginBottom: 1
}}
>
<Box sx={{ flexGrow: 1 }}>
<Typography variant='h2'>
{globalize.translate('HeaderActivity')}
</Typography>
</Box>
<ToggleButtonGroup
value={activityView}
onChange={onViewChange}
exclusive
>
<ToggleButton value={ActivityView.All}>
{globalize.translate('All')}
</ToggleButton>
<ToggleButton value={ActivityView.User}>
{globalize.translate('LabelUser')}
</ToggleButton>
<ToggleButton value={ActivityView.System}>
{globalize.translate('LabelSystem')}
</ToggleButton>
</ToggleButtonGroup>
<Typography variant='h2'>
{globalize.translate('HeaderActivity')}
</Typography>
</Box>
<DataGrid
columns={columns}
rows={rows}
pageSizeOptions={[ 10, 25, 50, 100 ]}
paginationMode='server'
paginationModel={paginationModel}
onPaginationModelChange={setPaginationModel}
rowCount={rowCount}
getRowId={getRowId}
loading={isLoading}
sx={{
minHeight: 500
}}
/>
</div>
<MaterialReactTable table={table} />
</Box>
</Page>
);
};

View File

@@ -33,6 +33,7 @@ const PlaybackTrickplay: FC = () => {
(page.querySelector('.chkEnableHwAcceleration') as HTMLInputElement).checked = options?.EnableHwAcceleration || false;
(page.querySelector('.chkEnableHwEncoding') as HTMLInputElement).checked = options?.EnableHwEncoding || false;
(page.querySelector('.chkEnableKeyFrameOnlyExtraction') as HTMLInputElement).checked = options?.EnableKeyFrameOnlyExtraction || false;
(page.querySelector('#selectScanBehavior') as HTMLSelectElement).value = (options?.ScanBehavior || TrickplayScanBehavior.NonBlocking);
(page.querySelector('#selectProcessPriority') as HTMLSelectElement).value = (options?.ProcessPriority || ProcessPriorityClass.Normal);
(page.querySelector('#txtInterval') as HTMLInputElement).value = options?.Interval?.toString() || '10000';
@@ -79,6 +80,7 @@ const PlaybackTrickplay: FC = () => {
const options = config.TrickplayOptions;
options.EnableHwAcceleration = (page.querySelector('.chkEnableHwAcceleration') as HTMLInputElement).checked;
options.EnableHwEncoding = (page.querySelector('.chkEnableHwEncoding') as HTMLInputElement).checked;
options.EnableKeyFrameOnlyExtraction = (page.querySelector('.chkEnableKeyFrameOnlyExtraction') as HTMLInputElement).checked;
options.ScanBehavior = (page.querySelector('#selectScanBehavior') as HTMLSelectElement).value as TrickplayScanBehavior;
options.ProcessPriority = (page.querySelector('#selectProcessPriority') as HTMLSelectElement).value as ProcessPriorityClass;
options.Interval = Math.max(1, parseInt((page.querySelector('#txtInterval') as HTMLInputElement).value || '10000', 10));
@@ -170,6 +172,17 @@ const PlaybackTrickplay: FC = () => {
</div>
</div>
</div>
<div className='checkboxContainer checkboxContainer-withDescription'>
<CheckBoxElement
className='chkEnableKeyFrameOnlyExtraction'
title='LabelTrickplayKeyFrameOnlyExtraction'
/>
<div className='fieldDescription checkboxFieldDescription'>
<div className='fieldDescription'>
{globalize.translate('LabelTrickplayKeyFrameOnlyExtractionHelp')}
</div>
</div>
</div>
<div className='verticalSection'>
<div className='selectContainer fldSelectScanBehavior'>

View File

@@ -304,6 +304,7 @@ const PluginPage: FC = () => {
return (
<Page
id='addPluginPage'
title={pluginDetails?.name || pluginName}
className='mainAnimatedPage type-interior'
>
<Container className='content-primary'>

View File

@@ -1,9 +1,8 @@
import type { BaseItemDto, DeviceInfo, UserDto } from '@jellyfin/sdk/lib/generated-client';
import React, { useCallback, useEffect, useState, useRef } from 'react';
import type { BaseItemDto, DeviceInfoDto, UserDto } from '@jellyfin/sdk/lib/generated-client';
import React, { useCallback, useEffect, useState, useRef, useMemo } from 'react';
import { useSearchParams } from 'react-router-dom';
import loading from '../../../../components/loading/loading';
import libraryMenu from '../../../../scripts/libraryMenu';
import globalize from '../../../../lib/globalize';
import toast from '../../../../components/toast/toast';
import SectionTabs from '../../../../components/dashboard/users/SectionTabs';
@@ -17,6 +16,7 @@ type ItemsArr = {
Name?: string | null;
Id?: string | null;
AppName?: string | null;
CustomName?: string | null;
checkedAttribute?: string
};
@@ -27,6 +27,7 @@ const UserLibraryAccess = () => {
const [channelsItems, setChannelsItems] = useState<ItemsArr[]>([]);
const [mediaFoldersItems, setMediaFoldersItems] = useState<ItemsArr[]>([]);
const [devicesItems, setDevicesItems] = useState<ItemsArr[]>([]);
const libraryMenu = useMemo(async () => ((await import('../../../../scripts/libraryMenu')).default), []);
const element = useRef<HTMLDivElement>(null);
@@ -95,7 +96,7 @@ const UserLibraryAccess = () => {
triggerChange(chkEnableAllChannels);
}, []);
const loadDevices = useCallback((user: UserDto, devices: DeviceInfo[]) => {
const loadDevices = useCallback((user: UserDto, devices: DeviceInfoDto[]) => {
const page = element.current;
if (!page) {
@@ -112,6 +113,7 @@ const UserLibraryAccess = () => {
Id: device.Id,
Name: device.Name,
AppName: device.AppName,
CustomName: device.CustomName,
checkedAttribute: checkedAttribute
});
}
@@ -129,9 +131,9 @@ const UserLibraryAccess = () => {
}
}, []);
const loadUser = useCallback((user: UserDto, mediaFolders: BaseItemDto[], channels: BaseItemDto[], devices: DeviceInfo[]) => {
const loadUser = useCallback((user: UserDto, mediaFolders: BaseItemDto[], channels: BaseItemDto[], devices: DeviceInfoDto[]) => {
setUserName(user.Name || '');
libraryMenu.setTitle(user.Name);
void libraryMenu.then(menu => menu.setTitle(user.Name));
loadChannels(user, channels);
loadMediaFolders(user, mediaFolders);
loadDevices(user, devices);
@@ -307,7 +309,7 @@ const UserLibraryAccess = () => {
key={Item.Id}
className='chkDevice'
itemId={Item.Id}
itemName={Item.Name}
itemName={Item.CustomName || Item.Name}
itemAppName={Item.AppName}
itemCheckedAttribute={Item.checkedAttribute}
/>

View File

@@ -2,11 +2,10 @@ import type { AccessSchedule, ParentalRating, UserDto } from '@jellyfin/sdk/lib/
import { UnratedItem } from '@jellyfin/sdk/lib/generated-client/models/unrated-item';
import { DynamicDayOfWeek } from '@jellyfin/sdk/lib/generated-client/models/dynamic-day-of-week';
import escapeHTML from 'escape-html';
import React, { useCallback, useEffect, useState, useRef } from 'react';
import React, { useCallback, useEffect, useState, useRef, useMemo } from 'react';
import { useSearchParams } from 'react-router-dom';
import globalize from '../../../../lib/globalize';
import LibraryMenu from '../../../../scripts/libraryMenu';
import AccessScheduleList from '../../../../components/dashboard/users/AccessScheduleList';
import TagList from '../../../../components/dashboard/users/TagList';
import ButtonElement from '../../../../elements/ButtonElement';
@@ -66,9 +65,11 @@ const UserParentalControl = () => {
const [ userName, setUserName ] = useState('');
const [ parentalRatings, setParentalRatings ] = useState<ParentalRating[]>([]);
const [ unratedItems, setUnratedItems ] = useState<UnratedNamedItem[]>([]);
const [ maxParentalRating, setMaxParentalRating ] = useState<string>();
const [ accessSchedules, setAccessSchedules ] = useState<AccessSchedule[]>([]);
const [ allowedTags, setAllowedTags ] = useState<string[]>([]);
const [ blockedTags, setBlockedTags ] = useState<string[]>([]);
const libraryMenu = useMemo(async () => ((await import('../../../../scripts/libraryMenu')).default), []);
const element = useRef<HTMLDivElement>(null);
@@ -146,70 +147,6 @@ const UserParentalControl = () => {
blockUnratedItems.dispatchEvent(new CustomEvent('create'));
}, []);
const loadAllowedTags = useCallback((tags: string[]) => {
const page = element.current;
if (!page) {
console.error('[userparentalcontrol] Unexpected null page reference');
return;
}
setAllowedTags(tags);
const allowedTagsElem = page.querySelector('.allowedTags') as HTMLDivElement;
for (const btnDeleteTag of allowedTagsElem.querySelectorAll('.btnDeleteTag')) {
btnDeleteTag.addEventListener('click', function () {
const tag = btnDeleteTag.getAttribute('data-tag');
const newTags = tags.filter(t => t !== tag);
loadAllowedTags(newTags);
});
}
}, []);
const loadBlockedTags = useCallback((tags: string[]) => {
const page = element.current;
if (!page) {
console.error('[userparentalcontrol] Unexpected null page reference');
return;
}
setBlockedTags(tags);
const blockedTagsElem = page.querySelector('.blockedTags') as HTMLDivElement;
for (const btnDeleteTag of blockedTagsElem.querySelectorAll('.btnDeleteTag')) {
btnDeleteTag.addEventListener('click', function () {
const tag = btnDeleteTag.getAttribute('data-tag');
const newTags = tags.filter(t => t !== tag);
loadBlockedTags(newTags);
});
}
}, []);
const renderAccessSchedule = useCallback((schedules: AccessSchedule[]) => {
const page = element.current;
if (!page) {
console.error('[userparentalcontrol] Unexpected null page reference');
return;
}
setAccessSchedules(schedules);
const accessScheduleList = page.querySelector('.accessScheduleList') as HTMLDivElement;
for (const btnDelete of accessScheduleList.querySelectorAll('.btnDelete')) {
btnDelete.addEventListener('click', function () {
const index = parseInt(btnDelete.getAttribute('data-index') ?? '0', 10);
schedules.splice(index, 1);
const newindex = schedules.filter((_, i) => i != index);
renderAccessSchedule(newindex);
});
}
}, []);
const loadUser = useCallback((user: UserDto, allParentalRatings: ParentalRating[]) => {
const page = element.current;
@@ -219,32 +156,30 @@ const UserParentalControl = () => {
}
setUserName(user.Name || '');
LibraryMenu.setTitle(user.Name);
void libraryMenu.then(menu => menu.setTitle(user.Name));
loadUnratedItems(user);
loadAllowedTags(user.Policy?.AllowedTags || []);
loadBlockedTags(user.Policy?.BlockedTags || []);
setAllowedTags(user.Policy?.AllowedTags || []);
setBlockedTags(user.Policy?.BlockedTags || []);
populateRatings(allParentalRatings);
let ratingValue = '';
if (user.Policy?.MaxParentalRating) {
allParentalRatings.forEach(rating => {
if (rating.Value && user.Policy?.MaxParentalRating && user.Policy.MaxParentalRating >= rating.Value) {
ratingValue = `${rating.Value}`;
}
});
}
allParentalRatings.forEach(rating => {
if (rating.Value != null && user.Policy?.MaxParentalRating != null && user.Policy.MaxParentalRating >= rating.Value) {
ratingValue = `${rating.Value}`;
}
});
(page.querySelector('#selectMaxParentalRating') as HTMLSelectElement).value = String(ratingValue);
setMaxParentalRating(ratingValue);
if (user.Policy?.IsAdministrator) {
(page.querySelector('.accessScheduleSection') as HTMLDivElement).classList.add('hide');
} else {
(page.querySelector('.accessScheduleSection') as HTMLDivElement).classList.remove('hide');
}
renderAccessSchedule(user.Policy?.AccessSchedules || []);
setAccessSchedules(user.Policy?.AccessSchedules || []);
loading.hide();
}, [loadAllowedTags, loadBlockedTags, loadUnratedItems, populateRatings, renderAccessSchedule]);
}, [libraryMenu, setAllowedTags, setBlockedTags, loadUnratedItems, populateRatings]);
const loadData = useCallback(() => {
if (!userId) {
@@ -285,7 +220,7 @@ const UserParentalControl = () => {
}
schedules[index] = updatedSchedule;
renderAccessSchedule(schedules);
setAccessSchedules(schedules);
}).catch(() => {
// access schedule closed
});
@@ -318,7 +253,7 @@ const UserParentalControl = () => {
if (tags.indexOf(value) == -1) {
tags.push(value);
loadAllowedTags(tags);
setAllowedTags(tags);
}
}).catch(() => {
// prompt closed
@@ -339,7 +274,7 @@ const UserParentalControl = () => {
if (tags.indexOf(value) == -1) {
tags.push(value);
loadBlockedTags(tags);
setBlockedTags(tags);
}
}).catch(() => {
// prompt closed
@@ -370,7 +305,8 @@ const UserParentalControl = () => {
return false;
};
(page.querySelector('#btnAddSchedule') as HTMLButtonElement).addEventListener('click', function () {
// The following is still hacky and should migrate to pure react implementation for callbacks in the future
const accessSchedulesPopupCallback = function () {
showSchedulePopup({
Id: 0,
UserId: '',
@@ -378,28 +314,57 @@ const UserParentalControl = () => {
StartHour: 0,
EndHour: 0
}, -1);
});
(page.querySelector('#btnAddAllowedTag') as HTMLButtonElement).addEventListener('click', function () {
showAllowedTagPopup();
});
(page.querySelector('#btnAddBlockedTag') as HTMLButtonElement).addEventListener('click', function () {
showBlockedTagPopup();
});
};
(page.querySelector('#btnAddSchedule') as HTMLButtonElement).addEventListener('click', accessSchedulesPopupCallback);
(page.querySelector('#btnAddAllowedTag') as HTMLButtonElement).addEventListener('click', showAllowedTagPopup);
(page.querySelector('#btnAddBlockedTag') as HTMLButtonElement).addEventListener('click', showBlockedTagPopup);
(page.querySelector('.userParentalControlForm') as HTMLFormElement).addEventListener('submit', onSubmit);
}, [loadAllowedTags, loadBlockedTags, loadData, renderAccessSchedule]);
return () => {
(page.querySelector('#btnAddSchedule') as HTMLButtonElement).removeEventListener('click', accessSchedulesPopupCallback);
(page.querySelector('#btnAddAllowedTag') as HTMLButtonElement).removeEventListener('click', showAllowedTagPopup);
(page.querySelector('#btnAddBlockedTag') as HTMLButtonElement).removeEventListener('click', showBlockedTagPopup);
(page.querySelector('.userParentalControlForm') as HTMLFormElement).removeEventListener('submit', onSubmit);
};
}, [setAllowedTags, setBlockedTags, loadData, userId]);
useEffect(() => {
const page = element.current;
if (!page) {
console.error('[userparentalcontrol] Unexpected null page reference');
return;
}
(page.querySelector('#selectMaxParentalRating') as HTMLSelectElement).value = String(maxParentalRating);
}, [maxParentalRating, parentalRatings]);
const optionMaxParentalRating = () => {
let content = '';
content += '<option value=\'\'></option>';
for (const rating of parentalRatings) {
content += `<option value='${rating.Value}'>${escapeHTML(rating.Name)}</option>`;
if (rating.Value != null) {
content += `<option value='${rating.Value}'>${escapeHTML(rating.Name)}</option>`;
}
}
return content;
};
const removeAllowedTagsCallback = useCallback((tag: string) => {
const newTags = allowedTags.filter(t => t !== tag);
setAllowedTags(newTags);
}, [allowedTags, setAllowedTags]);
const removeBlockedTagsTagsCallback = useCallback((tag: string) => {
const newTags = blockedTags.filter(t => t !== tag);
setBlockedTags(newTags);
}, [blockedTags, setBlockedTags]);
const removeScheduleCallback = useCallback((index: number) => {
const newSchedules = accessSchedules.filter((_e, i) => i != index);
setAccessSchedules(newSchedules);
}, [accessSchedules, setAccessSchedules]);
return (
<Page
id='userParentalControlPage'
@@ -464,6 +429,7 @@ const UserParentalControl = () => {
key={tag}
tag={tag}
tagType='allowedTag'
removeTagCallback={removeAllowedTagsCallback}
/>;
})}
</div>
@@ -488,6 +454,7 @@ const UserParentalControl = () => {
key={tag}
tag={tag}
tagType='blockedTag'
removeTagCallback={removeBlockedTagsTagsCallback}
/>;
})}
</div>
@@ -506,11 +473,12 @@ const UserParentalControl = () => {
<div className='accessScheduleList paperList'>
{accessSchedules.map((accessSchedule, index) => {
return <AccessScheduleList
key={accessSchedule.Id}
key={`${accessSchedule.DayOfWeek}${accessSchedule.StartHour}${accessSchedule.EndHour}`}
index={index}
DayOfWeek={accessSchedule.DayOfWeek}
StartHour={accessSchedule.StartHour}
EndHour={accessSchedule.EndHour}
removeScheduleCallback={removeScheduleCallback}
/>;
})}
</div>

View File

@@ -1,15 +1,14 @@
import type { BaseItemDto, NameIdPair, SyncPlayUserAccessType, UserDto } from '@jellyfin/sdk/lib/generated-client';
import escapeHTML from 'escape-html';
import React, { useCallback, useEffect, useState, useRef } from 'react';
import React, { useCallback, useEffect, useState, useRef, useMemo } from 'react';
import { useSearchParams } from 'react-router-dom';
import Dashboard from '../../../../utils/dashboard';
import globalize from '../../../../lib/globalize';
import LibraryMenu from '../../../../scripts/libraryMenu';
import ButtonElement from '../../../../elements/ButtonElement';
import CheckBoxElement from '../../../../elements/CheckBoxElement';
import InputElement from '../../../../elements/InputElement';
import LinkEditUserPreferences from '../../../../components/dashboard/users/LinkEditUserPreferences';
import LinkButton from '../../../../elements/emby-button/LinkButton';
import SectionTitleContainer from '../../../../elements/SectionTitleContainer';
import SectionTabs from '../../../../components/dashboard/users/SectionTabs';
import loading from '../../../../components/loading/loading';
@@ -38,10 +37,11 @@ function onSaveComplete() {
const UserEdit = () => {
const [ searchParams ] = useSearchParams();
const userId = searchParams.get('userId');
const [ userName, setUserName ] = useState('');
const [ userDto, setUserDto ] = useState<UserDto>();
const [ deleteFoldersAccess, setDeleteFoldersAccess ] = useState<ResetProvider[]>([]);
const [ authProviders, setAuthProviders ] = useState<NameIdPair[]>([]);
const [ passwordResetProviders, setPasswordResetProviders ] = useState<NameIdPair[]>([]);
const libraryMenu = useMemo(async () => ((await import('../../../../scripts/libraryMenu')).default), []);
const [ authenticationProviderId, setAuthenticationProviderId ] = useState('');
const [ passwordResetProviderId, setPasswordResetProviderId ] = useState('');
@@ -147,10 +147,9 @@ const UserEdit = () => {
txtUserName.disabled = false;
txtUserName.removeAttribute('disabled');
const lnkEditUserPreferences = page.querySelector('.lnkEditUserPreferences') as HTMLDivElement;
lnkEditUserPreferences.setAttribute('href', 'mypreferencesmenu.html?userId=' + user.Id);
LibraryMenu.setTitle(user.Name);
setUserName(user.Name || '');
void libraryMenu.then(menu => menu.setTitle(user.Name));
setUserDto(user);
(page.querySelector('#txtUserName') as HTMLInputElement).value = user.Name || '';
(page.querySelector('.chkIsAdmin') as HTMLInputElement).checked = !!user.Policy?.IsAdministrator;
(page.querySelector('.chkDisabled') as HTMLInputElement).checked = !!user.Policy?.IsDisabled;
@@ -170,11 +169,9 @@ const UserEdit = () => {
(page.querySelector('.chkRemoteAccess') as HTMLInputElement).checked = user.Policy?.EnableRemoteAccess == null || user.Policy?.EnableRemoteAccess;
(page.querySelector('#txtRemoteClientBitrateLimit') as HTMLInputElement).value = user.Policy?.RemoteClientBitrateLimit && user.Policy?.RemoteClientBitrateLimit > 0 ?
(user.Policy?.RemoteClientBitrateLimit / 1e6).toLocaleString(undefined, { maximumFractionDigits: 6 }) : '';
(page.querySelector('#txtLoginAttemptsBeforeLockout') as HTMLInputElement).value = String(user.Policy?.MaxActiveSessions) || '0';
(page.querySelector('#txtMaxActiveSessions') as HTMLInputElement).value = String(user.Policy?.SyncPlayAccess) || '0';
if (window.ApiClient.isMinServerVersion('10.6.0')) {
(page.querySelector('#selectSyncPlayAccess') as HTMLSelectElement).value = String(user.Policy?.SyncPlayAccess);
}
(page.querySelector('#txtLoginAttemptsBeforeLockout') as HTMLInputElement).value = String(user.Policy?.LoginAttemptsBeforeLockout) || '-1';
(page.querySelector('#txtMaxActiveSessions') as HTMLInputElement).value = String(user.Policy?.MaxActiveSessions) || '0';
(page.querySelector('#selectSyncPlayAccess') as HTMLSelectElement).value = String(user.Policy?.SyncPlayAccess);
loading.hide();
}, [loadAuthProviders, loadPasswordResetProviders, loadDeleteFolders ]);
@@ -292,7 +289,7 @@ const UserEdit = () => {
<div ref={element} className='content-primary'>
<div className='verticalSection'>
<SectionTitleContainer
title={userName}
title={userDto?.Name || ''}
url='https://jellyfin.org/docs/general/server/users/'
/>
</div>
@@ -302,10 +299,9 @@ const UserEdit = () => {
className='lnkEditUserPreferencesContainer'
style={{ paddingBottom: '1em' }}
>
<LinkEditUserPreferences
className= 'lnkEditUserPreferences button-link'
title= 'ButtonEditOtherUserPreferences'
/>
<LinkButton className='lnkEditUserPreferences button-link' href={userDto?.Id ? `mypreferencesmenu.html?userId=${userDto.Id}` : undefined}>
{globalize.translate('ButtonEditOtherUserPreferences')}
</LinkButton>
</div>
<form className='editUserProfileForm'>
<div className='disabledUserBanner hide'>

View File

@@ -1,4 +1,4 @@
import React, { useCallback, useState } from 'react';
import React, { StrictMode, useCallback, useState } from 'react';
import AppBar from '@mui/material/AppBar';
import Box from '@mui/material/Box';
import { type Theme } from '@mui/material/styles';
@@ -29,38 +29,40 @@ export const Component = () => {
}, [ isDrawerActive, setIsDrawerActive ]);
return (
<Box sx={{ position: 'relative', display: 'flex' }}>
<ElevationScroll elevate={false}>
<AppBar
position='fixed'
sx={{
width: {
xs: '100%',
md: isDrawerAvailable ? `calc(100% - ${DRAWER_WIDTH}px)` : '100%'
},
ml: {
xs: 0,
md: isDrawerAvailable ? DRAWER_WIDTH : 0
}
}}
>
<AppToolbar
isDrawerAvailable={!isMediumScreen && isDrawerAvailable}
isDrawerOpen={isDrawerOpen}
onDrawerButtonClick={onToggleDrawer}
/>
</AppBar>
</ElevationScroll>
<Box sx={{ position: 'relative', display: 'flex', height: '100%' }}>
<StrictMode>
<ElevationScroll elevate={false}>
<AppBar
position='fixed'
sx={{
width: {
xs: '100%',
md: isDrawerAvailable ? `calc(100% - ${DRAWER_WIDTH}px)` : '100%'
},
ml: {
xs: 0,
md: isDrawerAvailable ? DRAWER_WIDTH : 0
}
}}
>
<AppToolbar
isDrawerAvailable={!isMediumScreen && isDrawerAvailable}
isDrawerOpen={isDrawerOpen}
onDrawerButtonClick={onToggleDrawer}
/>
</AppBar>
</ElevationScroll>
{
isDrawerAvailable && (
<AppDrawer
open={isDrawerOpen}
onClose={onToggleDrawer}
onOpen={onToggleDrawer}
/>
)
}
{
isDrawerAvailable && (
<AppDrawer
open={isDrawerOpen}
onClose={onToggleDrawer}
onOpen={onToggleDrawer}
/>
)
}
</StrictMode>
<Box
component='main'

View File

@@ -7,6 +7,10 @@ $mui-bp-xl: 1536px;
$drawer-width: 240px;
#reactRoot {
height: 100%;
}
// Fix main pages layout to work with drawer
.mainAnimatedPage {
@media all and (min-width: $mui-bp-md) {

View File

@@ -1,4 +1,5 @@
import type { BaseItemDto } from '@jellyfin/sdk/lib/generated-client';
import { CollectionType } from '@jellyfin/sdk/lib/generated-client/models/collection-type';
import Movie from '@mui/icons-material/Movie';
import MusicNote from '@mui/icons-material/MusicNote';
import Photo from '@mui/icons-material/Photo';
@@ -7,11 +8,11 @@ import Tv from '@mui/icons-material/Tv';
import Theaters from '@mui/icons-material/Theaters';
import MusicVideo from '@mui/icons-material/MusicVideo';
import Book from '@mui/icons-material/Book';
import Collections from '@mui/icons-material/Collections';
import Queue from '@mui/icons-material/Queue';
import Quiz from '@mui/icons-material/Quiz';
import VideoLibrary from '@mui/icons-material/VideoLibrary';
import Folder from '@mui/icons-material/Folder';
import React, { FC } from 'react';
import { CollectionType } from '@jellyfin/sdk/lib/generated-client/models/collection-type';
interface LibraryIconProps {
item: BaseItemDto
@@ -39,9 +40,11 @@ const LibraryIcon: FC<LibraryIconProps> = ({
case CollectionType.Books:
return <Book />;
case CollectionType.Boxsets:
return <Collections />;
return <VideoLibrary />;
case CollectionType.Playlists:
return <Queue />;
case undefined:
return <Quiz />;
default:
return <Folder />;
}

View File

@@ -2,7 +2,7 @@ import type { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models/bas
import type { CollectionType } from '@jellyfin/sdk/lib/generated-client/models/collection-type';
import React, { FC } from 'react';
import { useGetGenres } from 'hooks/useFetchItems';
import globalize from 'lib/globalize';
import NoItemsMessage from 'components/common/NoItemsMessage';
import Loading from 'components/loading/LoadingComponent';
import GenresSectionContainer from './GenresSectionContainer';
import type { ParentId } from 'types/library';
@@ -25,27 +25,18 @@ const GenresItemsContainer: FC<GenresItemsContainerProps> = ({
}
if (!genresResult?.Items?.length) {
return (
<div className='noItemsMessage centerMessage'>
<h1>{globalize.translate('MessageNothingHere')}</h1>
<p>{globalize.translate('MessageNoGenresAvailable')}</p>
</div>
);
return <NoItemsMessage message='MessageNoGenresAvailable' />;
}
return (
<>
{genresResult.Items.map((genre) => (
<GenresSectionContainer
key={genre.Id}
collectionType={collectionType}
parentId={parentId}
itemType={itemType}
genre={genre}
/>
))}
</>
);
return genresResult.Items.map((genre) => (
<GenresSectionContainer
key={genre.Id}
collectionType={collectionType}
parentId={parentId}
itemType={itemType}
genre={genre}
/>
));
};
export default GenresItemsContainer;

View File

@@ -1,4 +1,3 @@
import type { BaseItemDto } from '@jellyfin/sdk/lib/generated-client';
import { CollectionType } from '@jellyfin/sdk/lib/generated-client/models/collection-type';
import { ItemFields } from '@jellyfin/sdk/lib/generated-client/models/item-fields';
import { ImageType } from '@jellyfin/sdk/lib/generated-client/models/image-type';
@@ -9,15 +8,16 @@ import React, { type FC } from 'react';
import { useGetItems } from 'hooks/useFetchItems';
import Loading from 'components/loading/LoadingComponent';
import { appRouter } from 'components/router/appRouter';
import SectionContainer from './SectionContainer';
import SectionContainer from 'components/common/SectionContainer';
import { CardShape } from 'utils/card';
import type { ParentId } from 'types/library';
import type { ItemDto } from 'types/base/models/item-dto';
interface GenresSectionContainerProps {
parentId: ParentId;
collectionType: CollectionType | undefined;
itemType: BaseItemKind[];
genre: BaseItemDto;
genre: ItemDto;
}
const GenresSectionContainer: FC<GenresSectionContainerProps> = ({
@@ -47,7 +47,7 @@ const GenresSectionContainer: FC<GenresSectionContainerProps> = ({
const { isLoading, data: itemsResult } = useGetItems(getParametersOptions());
const getRouteUrl = (item: BaseItemDto) => {
const getRouteUrl = (item: ItemDto) => {
return appRouter.getRouteUrl(item, {
context: collectionType,
parentId: parentId
@@ -59,9 +59,12 @@ const GenresSectionContainer: FC<GenresSectionContainerProps> = ({
}
return <SectionContainer
sectionTitle={genre.Name || ''}
items={itemsResult?.Items || []}
url={getRouteUrl(genre)}
key={genre.Name}
sectionHeaderProps={{
title: genre.Name || '',
url: getRouteUrl(genre)
}}
items={itemsResult?.Items}
cardOptions={{
scalable: true,
overlayPlayButton: true,

View File

@@ -92,7 +92,7 @@ const ItemsView: FC<ItemsViewProps> = ({
listOptions.showParentTitle = true;
listOptions.action = 'playallfromhere';
listOptions.smallIcon = true;
listOptions.artist = true;
listOptions.showArtist = true;
listOptions.addToListButton = true;
} else if (viewType === LibraryTab.Albums) {
listOptions.sortBy = libraryViewSettings.SortBy;
@@ -181,7 +181,7 @@ const ItemsView: FC<ItemsViewProps> = ({
const getItems = useCallback(() => {
if (!itemsResult?.Items?.length) {
return <NoItemsMessage noItemsMessage={noItemsMessage} />;
return <NoItemsMessage message={noItemsMessage} />;
}
if (libraryViewSettings.ViewMode === ViewMode.ListView) {

View File

@@ -1,4 +1,3 @@
import type { BaseItemDto, SeriesTimerInfoDto } from '@jellyfin/sdk/lib/generated-client';
import React, { FC, useCallback } from 'react';
import { IconButton } from '@mui/material';
import PlayArrowIcon from '@mui/icons-material/PlayArrow';
@@ -8,10 +7,11 @@ import globalize from 'lib/globalize';
import { getFiltersQuery } from 'utils/items';
import { LibraryViewSettings } from 'types/library';
import { LibraryTab } from 'types/libraryTab';
import type { ItemDto } from 'types/base/models/item-dto';
interface PlayAllButtonProps {
item: BaseItemDto | null | undefined;
items: BaseItemDto[] | SeriesTimerInfoDto[];
item: ItemDto | undefined;
items: ItemDto[];
viewType: LibraryTab;
hasFilters: boolean;
libraryViewSettings: LibraryViewSettings
@@ -27,10 +27,12 @@ const PlayAllButton: FC<PlayAllButtonProps> = ({ item, items, viewType, hasFilte
SortBy: [libraryViewSettings.SortBy],
SortOrder: [libraryViewSettings.SortOrder]
}
}).catch(err => {
console.error('[PlayAllButton] failed to play', err);
});
} else {
playbackManager.play({
items: items,
items,
autoplay: true,
queryOptions: {
ParentId: item?.Id ?? undefined,
@@ -38,7 +40,8 @@ const PlayAllButton: FC<PlayAllButtonProps> = ({ item, items, viewType, hasFilte
SortBy: [libraryViewSettings.SortBy],
SortOrder: [libraryViewSettings.SortOrder]
}
}).catch(err => {
console.error('[PlayAllButton] failed to play', err);
});
}
}, [hasFilters, item, items, libraryViewSettings, viewType]);

View File

@@ -3,7 +3,8 @@ import { useGetProgramsSectionsWithItems, useGetTimers } from 'hooks/useFetchIte
import { appRouter } from 'components/router/appRouter';
import globalize from 'lib/globalize';
import Loading from 'components/loading/LoadingComponent';
import SectionContainer from './SectionContainer';
import NoItemsMessage from 'components/common/NoItemsMessage';
import SectionContainer from 'components/common/SectionContainer';
import { CardShape } from 'utils/card';
import type { ParentId } from 'types/library';
import type { Section, SectionType } from 'types/sections';
@@ -30,14 +31,7 @@ const ProgramsSectionView: FC<ProgramsSectionViewProps> = ({
}
if (!sectionsWithItems?.length && !upcomingRecordings?.length) {
return (
<div className='noItemsMessage centerMessage'>
<h1>{globalize.translate('MessageNothingHere')}</h1>
<p>
{globalize.translate('MessageNoItemsAvailable')}
</p>
</div>
);
return <NoItemsMessage />;
}
const getRouteUrl = (section: Section) => {
@@ -58,23 +52,33 @@ const ProgramsSectionView: FC<ProgramsSectionViewProps> = ({
{sectionsWithItems?.map(({ section, items }) => (
<SectionContainer
key={section.type}
sectionTitle={globalize.translate(section.name)}
items={items ?? []}
url={getRouteUrl(section)}
reloadItems={refetch}
sectionHeaderProps={{
title: globalize.translate(section.name),
url: getRouteUrl(section)
}}
itemsContainerProps={{
queryKey: ['ProgramSectionWithItems'],
reloadItems: refetch
}}
items={items}
cardOptions={{
...section.cardOptions,
queryKey: ['ProgramSectionWithItems']
}}
/>
))}
{upcomingRecordings?.map((group) => (
<SectionContainer
key={group.name}
sectionTitle={group.name}
items={group.timerInfo ?? []}
sectionHeaderProps={{
title: group.name
}}
itemsContainerProps={{
queryKey: ['Timers'],
reloadItems: refetch
}}
items={group.timerInfo}
cardOptions={{
queryKey: ['Timers'],
shape: CardShape.BackdropOverflow,

View File

@@ -1,14 +1,14 @@
import type { BaseItemDto, SeriesTimerInfoDto } from '@jellyfin/sdk/lib/generated-client';
import React, { FC, useCallback } from 'react';
import { IconButton } from '@mui/material';
import QueueIcon from '@mui/icons-material/Queue';
import { playbackManager } from 'components/playback/playbackmanager';
import globalize from 'lib/globalize';
import type { ItemDto } from 'types/base/models/item-dto';
interface QueueButtonProps {
item: BaseItemDto | undefined
items: BaseItemDto[] | SeriesTimerInfoDto[];
item: ItemDto | undefined
items: ItemDto[];
hasFilters: boolean;
}
@@ -17,10 +17,14 @@ const QueueButton: FC<QueueButtonProps> = ({ item, items, hasFilters }) => {
if (item && !hasFilters) {
playbackManager.queue({
items: [item]
}).catch(err => {
console.error('[QueueButton] failed to add to queue', err);
});
} else {
playbackManager.queue({
items: items
items
}).catch(err => {
console.error('[QueueButton] failed to add to queue', err);
});
}
}, [hasFilters, item, items]);

View File

@@ -1,65 +0,0 @@
import type { BaseItemDto, TimerInfoDto } from '@jellyfin/sdk/lib/generated-client';
import React, { FC } from 'react';
import ItemsContainer from 'elements/emby-itemscontainer/ItemsContainer';
import Scroller from 'elements/emby-scroller/Scroller';
import LinkButton from 'elements/emby-button/LinkButton';
import Cards from 'components/cardbuilder/Card/Cards';
import type { CardOptions } from 'types/cardOptions';
interface SectionContainerProps {
url?: string;
sectionTitle: string;
items: BaseItemDto[] | TimerInfoDto[];
cardOptions: CardOptions;
reloadItems?: () => void;
}
const SectionContainer: FC<SectionContainerProps> = ({
sectionTitle,
url,
items,
cardOptions,
reloadItems
}) => {
return (
<div className='verticalSection'>
<div className='sectionTitleContainer sectionTitleContainer-cards padded-left'>
{url && items.length > 5 ? (
<LinkButton
className='more button-flat button-flat-mini sectionTitleTextButton btnMoreFromGenre'
href={url}
>
<h2 className='sectionTitle sectionTitle-cards'>
{sectionTitle}
</h2>
<span
className='material-icons chevron_right'
aria-hidden='true'
></span>
</LinkButton>
) : (
<h2 className='sectionTitle sectionTitle-cards'>
{sectionTitle}
</h2>
)}
</div>
<Scroller
className='padded-top-focusscale padded-bottom-focusscale'
isMouseWheelEnabled={false}
isCenterFocusEnabled={true}
>
<ItemsContainer
className='itemsContainer scrollSlider focuscontainer-x'
reloadItems={reloadItems}
queryKey={cardOptions.queryKey}
>
<Cards items={items} cardOptions={cardOptions} />
</ItemsContainer>
</Scroller>
</div>
);
};
export default SectionContainer;

View File

@@ -1,4 +1,3 @@
import type { BaseItemDto, SeriesTimerInfoDto } from '@jellyfin/sdk/lib/generated-client';
import { ItemSortBy } from '@jellyfin/sdk/lib/models/api/item-sort-by';
import React, { FC, useCallback } from 'react';
import { IconButton } from '@mui/material';
@@ -9,10 +8,11 @@ import globalize from 'lib/globalize';
import { getFiltersQuery } from 'utils/items';
import { LibraryViewSettings } from 'types/library';
import { LibraryTab } from 'types/libraryTab';
import type { ItemDto } from 'types/base/models/item-dto';
interface ShuffleButtonProps {
item: BaseItemDto | null | undefined;
items: BaseItemDto[] | SeriesTimerInfoDto[];
item: ItemDto | undefined;
items: ItemDto[];
viewType: LibraryTab
hasFilters: boolean;
libraryViewSettings: LibraryViewSettings
@@ -24,13 +24,15 @@ const ShuffleButton: FC<ShuffleButtonProps> = ({ item, items, viewType, hasFilte
playbackManager.shuffle(item);
} else {
playbackManager.play({
items: items,
items,
autoplay: true,
queryOptions: {
ParentId: item?.Id ?? undefined,
...getFiltersQuery(viewType, libraryViewSettings),
SortBy: [ItemSortBy.Random]
}
}).catch(err => {
console.error('[ShuffleButton] failed to play', err);
});
}
}, [hasFilters, item, items, libraryViewSettings, viewType]);

View File

@@ -1,7 +1,5 @@
import {
type RecommendationDto,
RecommendationType
} from '@jellyfin/sdk/lib/generated-client';
import type { RecommendationDto } from '@jellyfin/sdk/lib/generated-client/models/recommendation-dto';
import { RecommendationType } from '@jellyfin/sdk/lib/generated-client/models/recommendation-type';
import React, { type FC } from 'react';
import {
useGetMovieRecommendations,
@@ -10,10 +8,12 @@ import {
import { appRouter } from 'components/router/appRouter';
import globalize from 'lib/globalize';
import Loading from 'components/loading/LoadingComponent';
import SectionContainer from './SectionContainer';
import NoItemsMessage from 'components/common/NoItemsMessage';
import SectionContainer from '../../../../components/common/SectionContainer';
import { CardShape } from 'utils/card';
import type { ParentId } from 'types/library';
import type { Section, SectionType } from 'types/sections';
import type { ItemDto } from 'types/base/models/item-dto';
interface SuggestionsSectionViewProps {
parentId: ParentId;
@@ -39,12 +39,7 @@ const SuggestionsSectionView: FC<SuggestionsSectionViewProps> = ({
}
if (!sectionsWithItems?.length && !movieRecommendationsItems?.length) {
return (
<div className='noItemsMessage centerMessage'>
<h1>{globalize.translate('MessageNothingHere')}</h1>
<p>{globalize.translate('MessageNoItemsAvailable')}</p>
</div>
);
return <NoItemsMessage />;
}
const getRouteUrl = (section: Section) => {
@@ -97,9 +92,14 @@ const SuggestionsSectionView: FC<SuggestionsSectionViewProps> = ({
{sectionsWithItems?.map(({ section, items }) => (
<SectionContainer
key={section.type}
sectionTitle={globalize.translate(section.name)}
items={items ?? []}
url={getRouteUrl(section)}
sectionHeaderProps={{
title: globalize.translate(section.name),
url: getRouteUrl(section)
}}
itemsContainerProps={{
queryKey: ['SuggestionSectionWithItems']
}}
items={items}
cardOptions={{
...section.cardOptions,
queryKey: ['SuggestionSectionWithItems'],
@@ -115,8 +115,13 @@ const SuggestionsSectionView: FC<SuggestionsSectionViewProps> = ({
<SectionContainer
// eslint-disable-next-line react/no-array-index-key
key={`${recommendation.CategoryId}-${index}`} // use a unique id return value may have duplicate id
sectionTitle={getRecommendationTittle(recommendation)}
items={recommendation.Items ?? []}
sectionHeaderProps={{
title: getRecommendationTittle(recommendation)
}}
itemsContainerProps={{
queryKey: ['MovieRecommendations']
}}
items={recommendation.Items as ItemDto[]}
cardOptions={{
queryKey: ['MovieRecommendations'],
shape: CardShape.PortraitOverflow,

View File

@@ -1,49 +1,44 @@
import React, { type FC } from 'react';
import Box from '@mui/material/Box';
import { useGetGroupsUpcomingEpisodes } from 'hooks/useFetchItems';
import Loading from 'components/loading/LoadingComponent';
import globalize from 'lib/globalize';
import SectionContainer from './SectionContainer';
import NoItemsMessage from 'components/common/NoItemsMessage';
import SectionContainer from 'components/common/SectionContainer';
import { CardShape } from 'utils/card';
import type { LibraryViewProps } from 'types/library';
const UpcomingView: FC<LibraryViewProps> = ({ parentId }) => {
const { isLoading, data: groupsUpcomingEpisodes } = useGetGroupsUpcomingEpisodes(parentId);
const { isLoading, data: groupsUpcomingEpisodes } =
useGetGroupsUpcomingEpisodes(parentId);
if (isLoading) return <Loading />;
return (
<Box>
{!groupsUpcomingEpisodes?.length ? (
<div className='noItemsMessage centerMessage'>
<h1>{globalize.translate('MessageNothingHere')}</h1>
<p>
{globalize.translate(
'MessagePleaseEnsureInternetMetadata'
)}
</p>
</div>
) : (
groupsUpcomingEpisodes?.map((group) => (
<SectionContainer
key={group.name}
sectionTitle={group.name}
items={group.items ?? []}
cardOptions={{
shape: CardShape.BackdropOverflow,
showLocationTypeIndicator: false,
showParentTitle: true,
preferThumb: true,
lazy: true,
showDetailsMenu: true,
missingIndicator: false,
cardLayout: false
}}
/>
))
)}
</Box>
);
if (!groupsUpcomingEpisodes?.length) {
return <NoItemsMessage message='MessagePleaseEnsureInternetMetadata' />;
}
return groupsUpcomingEpisodes?.map((group) => (
<SectionContainer
key={group.name}
sectionHeaderProps={{
title: group.name
}}
itemsContainerProps={{
queryKey: ['GroupsUpcomingEpisodes']
}}
items={group.items}
cardOptions={{
shape: CardShape.BackdropOverflow,
showLocationTypeIndicator: false,
showParentTitle: true,
preferThumb: true,
lazy: true,
showDetailsMenu: true,
missingIndicator: false,
cardLayout: false,
queryKey: ['GroupsUpcomingEpisodes']
}}
/>
));
};
export default UpcomingView;

View File

@@ -8,6 +8,7 @@ import { Route, Routes } from 'react-router-dom';
import TabRoutes from './tabRoutes';
import useCurrentTab from 'hooks/useCurrentTab';
import globalize from 'lib/globalize';
interface AppTabsParams {
isDrawerOpen: boolean
@@ -66,7 +67,7 @@ const AppTabs: FC<AppTabsParams> = ({
route.tabs.map(({ index, label }) => (
<Tab
key={`${route.path}-tab-${index}`}
label={label}
label={globalize.translate(label)}
data-tab-index={`${index}`}
onClick={onTabClick}
/>

View File

@@ -1,4 +1,3 @@
import globalize from 'lib/globalize';
import * as userSettings from 'scripts/settings/userSettings';
import { LibraryTab } from 'types/libraryTab';
@@ -41,33 +40,33 @@ const TabRoutes: TabRoute[] = [
tabs: [
{
index: 0,
label: globalize.translate('Programs'),
label: 'Programs',
value: LibraryTab.Programs,
isDefault: true
},
{
index: 1,
label: globalize.translate('Guide'),
label: 'Guide',
value: LibraryTab.Guide
},
{
index: 2,
label: globalize.translate('Channels'),
label: 'Channels',
value: LibraryTab.Channels
},
{
index: 3,
label: globalize.translate('Recordings'),
label: 'Recordings',
value: LibraryTab.Recordings
},
{
index: 4,
label: globalize.translate('Schedule'),
label: 'Schedule',
value: LibraryTab.Schedule
},
{
index: 5,
label: globalize.translate('Series'),
label: 'Series',
value: LibraryTab.SeriesTimers
}
]
@@ -77,33 +76,33 @@ const TabRoutes: TabRoute[] = [
tabs: [
{
index: 0,
label: globalize.translate('Movies'),
label: 'Movies',
value: LibraryTab.Movies,
isDefault: true
},
{
index: 1,
label: globalize.translate('Suggestions'),
label: 'Suggestions',
value: LibraryTab.Suggestions
},
{
index: 2,
label: globalize.translate('Trailers'),
label: 'Trailers',
value: LibraryTab.Trailers
},
{
index: 3,
label: globalize.translate('Favorites'),
label: 'Favorites',
value: LibraryTab.Favorites
},
{
index: 4,
label: globalize.translate('Collections'),
label: 'Collections',
value: LibraryTab.Collections
},
{
index: 5,
label: globalize.translate('Genres'),
label: 'Genres',
value: LibraryTab.Genres
}
]
@@ -113,38 +112,38 @@ const TabRoutes: TabRoute[] = [
tabs: [
{
index: 0,
label: globalize.translate('Albums'),
label: 'Albums',
value: LibraryTab.Albums,
isDefault: true
},
{
index: 1,
label: globalize.translate('Suggestions'),
label: 'Suggestions',
value: LibraryTab.Suggestions
},
{
index: 2,
label: globalize.translate('HeaderAlbumArtists'),
label: 'HeaderAlbumArtists',
value: LibraryTab.AlbumArtists
},
{
index: 3,
label: globalize.translate('Artists'),
label: 'Artists',
value: LibraryTab.Artists
},
{
index: 4,
label: globalize.translate('Playlists'),
label: 'Playlists',
value: LibraryTab.Playlists
},
{
index: 5,
label: globalize.translate('Songs'),
label: 'Songs',
value: LibraryTab.Songs
},
{
index: 6,
label: globalize.translate('Genres'),
label: 'Genres',
value: LibraryTab.Genres
}
]
@@ -154,33 +153,33 @@ const TabRoutes: TabRoute[] = [
tabs: [
{
index: 0,
label: globalize.translate('Shows'),
label: 'Shows',
value: LibraryTab.Series,
isDefault: true
},
{
index: 1,
label: globalize.translate('Suggestions'),
label: 'Suggestions',
value: LibraryTab.Suggestions
},
{
index: 2,
label: globalize.translate('TabUpcoming'),
label: 'TabUpcoming',
value: LibraryTab.Upcoming
},
{
index: 3,
label: globalize.translate('Genres'),
label: 'Genres',
value: LibraryTab.Genres
},
{
index: 4,
label: globalize.translate('TabNetworks'),
label: 'TabNetworks',
value: LibraryTab.Networks
},
{
index: 5,
label: globalize.translate('Episodes'),
label: 'Episodes',
value: LibraryTab.Episodes
}
]
@@ -190,19 +189,19 @@ const TabRoutes: TabRoute[] = [
tabs: [
{
index: 0,
label: globalize.translate('Photos'),
label: 'Photos',
value: LibraryTab.Photos,
isDefault: true
},
{
index: 1,
label: globalize.translate('HeaderPhotoAlbums'),
label: 'HeaderPhotoAlbums',
value: LibraryTab.PhotoAlbums,
isDefault: true
},
{
index: 2,
label: globalize.translate('HeaderVideos'),
label: 'HeaderVideos',
value: LibraryTab.Videos
}
]

View File

@@ -0,0 +1,68 @@
import React, { FC, useCallback } from 'react';
import { useNavigate } from 'react-router-dom';
import { IconButton } from '@mui/material';
import DeleteIcon from '@mui/icons-material/Delete';
import { useCancelSeriesTimer } from 'hooks/api/liveTvHooks';
import globalize from 'lib/globalize';
import loading from 'components/loading/loading';
import toast from 'components/toast/toast';
import confirm from 'components/confirm/confirm';
interface CancelSeriesTimerButtonProps {
itemId: string;
}
const CancelSeriesTimerButton: FC<CancelSeriesTimerButtonProps> = ({
itemId
}) => {
const navigate = useNavigate();
const cancelSeriesTimer = useCancelSeriesTimer();
const onCancelSeriesTimerClick = useCallback(() => {
confirm({
text: globalize.translate('MessageConfirmRecordingCancellation'),
primary: 'delete',
confirmText: globalize.translate('HeaderCancelSeries'),
cancelText: globalize.translate('HeaderKeepSeries')
})
.then(function () {
loading.show();
cancelSeriesTimer.mutate(
{
timerId: itemId
},
{
onSuccess: async () => {
toast(globalize.translate('SeriesCancelled'));
loading.hide();
navigate('/livetv.html');
},
onError: (err: unknown) => {
loading.hide();
toast(globalize.translate('MessageCancelSeriesTimerError'));
console.error(
'[cancelSeriesTimer] failed to cancel series timer',
err
);
}
}
);
})
.catch(() => {
// confirm dialog closed
});
}, [cancelSeriesTimer, navigate, itemId]);
return (
<IconButton
className='button-flat btnCancelSeriesTimer'
title={globalize.translate('CancelSeries')}
onClick={onCancelSeriesTimerClick}
>
<DeleteIcon />
</IconButton>
);
};
export default CancelSeriesTimerButton;

View File

@@ -0,0 +1,60 @@
import React, { FC, useCallback } from 'react';
import { IconButton } from '@mui/material';
import StopIcon from '@mui/icons-material/Stop';
import { useQueryClient } from '@tanstack/react-query';
import { useCancelTimer } from 'hooks/api/liveTvHooks';
import globalize from 'lib/globalize';
import loading from 'components/loading/loading';
import toast from 'components/toast/toast';
interface CancelTimerButtonProps {
timerId: string;
queryKey?: string[];
}
const CancelTimerButton: FC<CancelTimerButtonProps> = ({
timerId,
queryKey
}) => {
const queryClient = useQueryClient();
const cancelTimer = useCancelTimer();
const onCancelTimerClick = useCallback(() => {
loading.show();
cancelTimer.mutate(
{
timerId: timerId
},
{
onSuccess: async () => {
toast(globalize.translate('RecordingCancelled'));
loading.hide();
await queryClient.invalidateQueries({
queryKey
});
},
onError: (err: unknown) => {
loading.hide();
toast(globalize.translate('MessageCancelTimerError'));
console.error(
'[cancelTimer] failed to cancel timer',
err
);
}
}
);
}, [cancelTimer, queryClient, queryKey, timerId]);
return (
<IconButton
className='button-flat btnCancelTimer'
title={globalize.translate('StopRecording')}
onClick={onCancelTimerClick}
>
<StopIcon />
</IconButton>
);
};
export default CancelTimerButton;

View File

@@ -0,0 +1,42 @@
import React, { FC, useCallback } from 'react';
import { IconButton } from '@mui/material';
import FileDownloadIcon from '@mui/icons-material/FileDownload';
import { useGetDownload } from 'hooks/api/libraryHooks';
import globalize from 'lib/globalize';
import { download } from 'scripts/fileDownloader';
import type { NullableString } from 'types/base/common/shared/types';
interface DownloadButtonProps {
itemId: string;
itemServerId: NullableString,
itemName: NullableString,
itemPath: NullableString,
}
const DownloadButton: FC<DownloadButtonProps> = ({ itemId, itemServerId, itemName, itemPath }) => {
const { data: downloadHref } = useGetDownload({ itemId });
const onDownloadClick = useCallback(async () => {
download([
{
url: downloadHref,
itemId: itemId,
serverId: itemServerId,
title: itemName,
filename: itemPath?.replace(/^.*[\\/]/, '')
}
]);
}, [downloadHref, itemId, itemName, itemPath, itemServerId]);
return (
<IconButton
className='button-flat btnDownload'
title={globalize.translate('Download')}
onClick={onDownloadClick}
>
<FileDownloadIcon />
</IconButton>
);
};
export default DownloadButton;

View File

@@ -0,0 +1,28 @@
import React, { FC, useCallback } from 'react';
import { IconButton } from '@mui/material';
import ExploreIcon from '@mui/icons-material/Explore';
import { playbackManager } from 'components/playback/playbackmanager';
import globalize from 'lib/globalize';
import type { ItemDto } from 'types/base/models/item-dto';
interface InstantMixButtonProps {
item?: ItemDto;
}
const InstantMixButton: FC<InstantMixButtonProps> = ({ item }) => {
const onInstantMixClick = useCallback(() => {
playbackManager.instantMix(item);
}, [item]);
return (
<IconButton
className='button-flat btnInstantMix'
title={globalize.translate('HeaderInstantMix')}
onClick={onInstantMixClick}
>
<ExploreIcon />
</IconButton>
);
};
export default InstantMixButton;

View File

@@ -0,0 +1,229 @@
import React, { FC, useCallback, useEffect, useMemo, useState } from 'react';
import { IconButton } from '@mui/material';
import MoreVertIcon from '@mui/icons-material/MoreVert';
import { useQueryClient } from '@tanstack/react-query';
import { useApi } from 'hooks/useApi';
import { useGetItemByType } from '../../hooks/api/useGetItemByType';
import globalize from 'lib/globalize';
import itemContextMenu from 'components/itemContextMenu';
import { playbackManager } from 'components/playback/playbackmanager';
import { appRouter } from 'components/router/appRouter';
import { ItemKind } from 'types/base/models/item-kind';
import type { NullableString } from 'types/base/common/shared/types';
import type { ItemDto } from 'types/base/models/item-dto';
interface PlayAllFromHereOptions {
item: ItemDto;
items: ItemDto[];
serverId: NullableString;
queue?: boolean;
}
function playAllFromHere(opts: PlayAllFromHereOptions) {
const { item, items, serverId, queue } = opts;
const ids = [];
let foundCard = false;
let startIndex;
for (let i = 0, length = items?.length; i < length; i++) {
if (items[i] === item) {
foundCard = true;
startIndex = i;
}
if (foundCard || !queue) {
ids.push(items[i].Id);
}
}
if (!ids.length) {
return Promise.resolve();
}
if (queue) {
return playbackManager.queue({
ids,
serverId
});
} else {
return playbackManager.play({
ids,
serverId,
startIndex
});
}
}
export interface ContextMenuOpts {
open?: boolean;
play?: boolean;
playAllFromHere?: boolean;
queueAllFromHere?: boolean;
cancelTimer?: boolean;
record?: boolean;
deleteItem?: boolean;
shuffle?: boolean;
instantMix?: boolean;
share?: boolean;
stopPlayback?: boolean;
clearQueue?: boolean;
queue?: boolean;
playlist?: boolean;
edit?: boolean;
editImages?: boolean;
editSubtitles?: boolean;
identify?: boolean;
moremediainfo?: boolean;
openAlbum?: boolean;
openArtist?: boolean;
openLyrics?: boolean;
}
interface MoreCommandsButtonProps {
itemType: ItemKind;
selectedItemId?: string;
itemId?: string;
items?: ItemDto[] | null;
collectionId?: NullableString;
playlistId?: NullableString;
canEditPlaylist?: boolean;
itemPlaylistItemId?: NullableString;
contextMenuOpts?: ContextMenuOpts;
queryKey?: string[];
}
const MoreCommandsButton: FC<MoreCommandsButtonProps> = ({
itemType,
selectedItemId,
itemId,
collectionId,
playlistId,
canEditPlaylist,
itemPlaylistItemId,
contextMenuOpts,
items,
queryKey
}) => {
const { user } = useApi();
const queryClient = useQueryClient();
const { data: item } = useGetItemByType({
itemType,
itemId: selectedItemId || itemId || ''
});
const parentId = item?.SeasonId || item?.SeriesId || item?.ParentId;
const [ hasCommands, setHasCommands ] = useState(false);
const playlistItem = useMemo(() => {
let PlaylistItemId: string | null = null;
let PlaylistIndex = -1;
let PlaylistItemCount = 0;
if (playlistId) {
PlaylistItemId = itemPlaylistItemId || null;
if (items?.length) {
PlaylistItemCount = items.length;
PlaylistIndex = items.findIndex(listItem => listItem.PlaylistItemId === PlaylistItemId);
}
}
return { PlaylistItemId, PlaylistIndex, PlaylistItemCount };
}, [itemPlaylistItemId, items, playlistId]);
const defaultMenuOptions = useMemo(() => {
return {
item: {
...item,
...playlistItem
},
user: user,
play: true,
queue: true,
playAllFromHere: item?.Type === ItemKind.Season || !item?.IsFolder,
queueAllFromHere: !item?.IsFolder,
canEditPlaylist: canEditPlaylist,
playlistId: playlistId,
collectionId: collectionId,
...contextMenuOpts
};
}, [canEditPlaylist, collectionId, contextMenuOpts, item, playlistId, playlistItem, user]);
const onMoreCommandsClick = useCallback(
async (e: React.MouseEvent<HTMLElement>) => {
itemContextMenu
.show({
...defaultMenuOptions,
positionTo: e.currentTarget
})
.then(async function (result) {
if (result.command === 'playallfromhere') {
console.log('handleItemClick', {
item,
items: items || [],
serverId: item?.ServerId
});
playAllFromHere({
item: item || {},
items: items || [],
serverId: item?.ServerId
}).catch(err => {
console.error('[MoreCommandsButton] failed to play', err);
});
} else if (result.command === 'queueallfromhere') {
playAllFromHere({
item: item || {},
items: items || [],
serverId: item?.ServerId,
queue: true
}).catch(err => {
console.error('[MoreCommandsButton] failed to play', err);
});
} else if (result.deleted) {
if (result?.itemId !== itemId) {
await queryClient.invalidateQueries({
queryKey
});
} else if (parentId) {
appRouter.showItem(parentId, item?.ServerId);
} else {
await appRouter.goHome();
}
} else if (result.updated) {
await queryClient.invalidateQueries({
queryKey
});
}
})
.catch(() => {
/* no-op */
});
},
[defaultMenuOptions, item, itemId, items, parentId, queryClient, queryKey]
);
useEffect(() => {
const getCommands = async () => {
const commands = await itemContextMenu.getCommands(defaultMenuOptions);
setHasCommands(commands.length > 0);
};
void getCommands();
}, [ defaultMenuOptions ]);
if (item && hasCommands) {
return (
<IconButton
className='button-flat btnMoreCommands'
title={globalize.translate('ButtonMore')}
onClick={onMoreCommandsClick}
>
<MoreVertIcon />
</IconButton>
);
}
return null;
};
export default MoreCommandsButton;

View File

@@ -0,0 +1,91 @@
import React, { FC, useCallback, useMemo } from 'react';
import { IconButton } from '@mui/material';
import PlayArrowIcon from '@mui/icons-material/PlayArrow';
import ReplayIcon from '@mui/icons-material/Replay';
import { useQueryClient } from '@tanstack/react-query';
import { useApi } from 'hooks/useApi';
import { getChannelQuery } from 'hooks/api/liveTvHooks/useGetChannel';
import globalize from 'lib/globalize';
import { playbackManager } from 'components/playback/playbackmanager';
import type { ItemDto } from 'types/base/models/item-dto';
import { ItemKind } from 'types/base/models/item-kind';
import itemHelper from 'components/itemHelper';
interface PlayOrResumeButtonProps {
item: ItemDto;
isResumable?: boolean;
selectedMediaSourceId?: string | null;
selectedAudioTrack?: number;
selectedSubtitleTrack?: number;
}
const PlayOrResumeButton: FC<PlayOrResumeButtonProps> = ({
item,
isResumable,
selectedMediaSourceId,
selectedAudioTrack,
selectedSubtitleTrack
}) => {
const apiContext = useApi();
const queryClient = useQueryClient();
const playOptions = useMemo(() => {
if (itemHelper.supportsMediaSourceSelection(item)) {
return {
startPositionTicks:
item.UserData && isResumable ?
item.UserData.PlaybackPositionTicks :
0,
mediaSourceId: selectedMediaSourceId,
audioStreamIndex: selectedAudioTrack || null,
subtitleStreamIndex: selectedSubtitleTrack
};
}
}, [
item,
isResumable,
selectedMediaSourceId,
selectedAudioTrack,
selectedSubtitleTrack
]);
const onPlayClick = useCallback(async () => {
if (item.Type === ItemKind.Program && item.ChannelId) {
const channel = await queryClient.fetchQuery(
getChannelQuery(apiContext, {
channelId: item.ChannelId
})
);
playbackManager.play({
items: [channel]
}).catch(err => {
console.error('[PlayOrResumeButton] failed to play', err);
});
return;
}
playbackManager.play({
items: [item],
...playOptions
}).catch(err => {
console.error('[PlayOrResumeButton] failed to play', err);
});
}, [apiContext, item, playOptions, queryClient]);
return (
<IconButton
className='button-flat btnPlayOrResume'
data-action={isResumable ? 'resume' : 'play'}
title={
isResumable ?
globalize.translate('ButtonResume') :
globalize.translate('Play')
}
onClick={onPlayClick}
>
{isResumable ? <ReplayIcon /> : <PlayArrowIcon />}
</IconButton>
);
};
export default PlayOrResumeButton;

View File

@@ -0,0 +1,28 @@
import React, { FC, useCallback } from 'react';
import { IconButton } from '@mui/material';
import TheatersIcon from '@mui/icons-material/Theaters';
import { playbackManager } from 'components/playback/playbackmanager';
import globalize from 'lib/globalize';
import type { ItemDto } from 'types/base/models/item-dto';
interface PlayTrailerButtonProps {
item?: ItemDto;
}
const PlayTrailerButton: FC<PlayTrailerButtonProps> = ({ item }) => {
const onPlayTrailerClick = useCallback(async () => {
await playbackManager.playTrailers(item);
}, [item]);
return (
<IconButton
className='button-flat btnPlayTrailer'
title={globalize.translate('ButtonTrailer')}
onClick={onPlayTrailerClick}
>
<TheatersIcon />
</IconButton>
);
};
export default PlayTrailerButton;

View File

@@ -0,0 +1,29 @@
import React, { FC, useCallback } from 'react';
import { IconButton } from '@mui/material';
import ShuffleIcon from '@mui/icons-material/Shuffle';
import { playbackManager } from 'components/playback/playbackmanager';
import globalize from 'lib/globalize';
import type { ItemDto } from 'types/base/models/item-dto';
interface ShuffleButtonProps {
item: ItemDto;
}
const ShuffleButton: FC<ShuffleButtonProps> = ({ item }) => {
const shuffle = useCallback(() => {
playbackManager.shuffle(item);
}, [item]);
return (
<IconButton
title={globalize.translate('Shuffle')}
className='button-flat btnShuffle'
onClick={shuffle}
>
<ShuffleIcon />
</IconButton>
);
};
export default ShuffleButton;

View File

@@ -0,0 +1,68 @@
import React, { FC, useCallback } from 'react';
import { IconButton } from '@mui/material';
import CallSplitIcon from '@mui/icons-material/CallSplit';
import { useQueryClient } from '@tanstack/react-query';
import { useDeleteAlternateSources } from 'hooks/api/videosHooks';
import globalize from 'lib/globalize';
import confirm from 'components/confirm/confirm';
import loading from 'components/loading/loading';
import toast from 'components/toast/toast';
interface SplitVersionsButtonProps {
paramId: string;
queryKey?: string[];
}
const SplitVersionsButton: FC<SplitVersionsButtonProps> = ({
paramId,
queryKey
}) => {
const queryClient = useQueryClient();
const deleteAlternateSources = useDeleteAlternateSources();
const splitVersions = useCallback(() => {
confirm({
title: globalize.translate('HeaderSplitMediaApart'),
text: globalize.translate('MessageConfirmSplitMediaSources')
})
.then(function () {
loading.show();
deleteAlternateSources.mutate(
{
itemId: paramId
},
{
onSuccess: async () => {
loading.hide();
await queryClient.invalidateQueries({
queryKey
});
},
onError: (err: unknown) => {
loading.hide();
toast(globalize.translate('MessageSplitVersionsError'));
console.error(
'[splitVersions] failed to split versions',
err
);
}
}
);
})
.catch(() => {
// confirm dialog closed
});
}, [deleteAlternateSources, paramId, queryClient, queryKey]);
return (
<IconButton
className='button-flat btnSplitVersions'
title={globalize.translate('ButtonSplit')}
onClick={splitVersions}
>
<CallSplitIcon />
</IconButton>
);
};
export default SplitVersionsButton;

View File

@@ -0,0 +1,62 @@
import type { AxiosRequestConfig } from 'axios';
import { getUserLibraryApi } from '@jellyfin/sdk/lib/utils/api/user-library-api';
import { getLiveTvApi } from '@jellyfin/sdk/lib/utils/api/live-tv-api';
import { useQuery } from '@tanstack/react-query';
import { type JellyfinApiContext, useApi } from 'hooks/useApi';
import type { ItemDto } from 'types/base/models/item-dto';
import { ItemKind } from 'types/base/models/item-kind';
const getItemByType = async (
apiContext: JellyfinApiContext,
itemType: ItemKind,
itemId: string,
options?: AxiosRequestConfig
) => {
const { api, user } = apiContext;
if (!api) throw new Error('[getItemByType] No API instance available');
if (!user?.Id) throw new Error('[getItemByType] No User ID provided');
let response;
switch (itemType) {
case ItemKind.Timer: {
response = await getLiveTvApi(api).getTimer(
{ timerId: itemId },
options
);
break;
}
case ItemKind.SeriesTimer:
response = await getLiveTvApi(api).getSeriesTimer(
{ timerId: itemId },
options
);
break;
default: {
response = await getUserLibraryApi(api).getItem(
{ userId: user.Id, itemId },
options
);
break;
}
}
return response.data as ItemDto;
};
interface UseGetItemByTypeProps {
itemType: ItemKind;
itemId: string;
}
export const useGetItemByType = ({
itemType,
itemId
}: UseGetItemByTypeProps) => {
const apiContext = useApi();
return useQuery({
queryKey: ['ItemByType', { itemType, itemId }],
queryFn: ({ signal }) =>
getItemByType(apiContext, itemType, itemId, { signal }),
enabled: !!apiContext.api && !!apiContext.user?.Id && !!itemId
});
};

View File

@@ -15,8 +15,8 @@ import { useApi } from 'hooks/useApi';
import { useThemes } from 'hooks/useThemes';
import globalize from 'lib/globalize';
import { DisplaySettingsValues } from './types';
import { useScreensavers } from './hooks/useScreensavers';
import { useScreensavers } from '../hooks/useScreensavers';
import type { DisplaySettingsValues } from '../types/displaySettingsValues';
interface DisplayPreferencesProps {
onChange: (event: SelectChangeEvent | React.SyntheticEvent) => void;

View File

@@ -7,7 +7,8 @@ import Typography from '@mui/material/Typography';
import React from 'react';
import globalize from 'lib/globalize';
import { DisplaySettingsValues } from './types';
import type { DisplaySettingsValues } from '../types/displaySettingsValues';
interface ItemDetailPreferencesProps {
onChange: (event: React.SyntheticEvent) => void;

View File

@@ -8,7 +8,8 @@ import Typography from '@mui/material/Typography';
import React from 'react';
import globalize from 'lib/globalize';
import { DisplaySettingsValues } from './types';
import type { DisplaySettingsValues } from '../types/displaySettingsValues';
interface LibraryPreferencesProps {
onChange: (event: React.SyntheticEvent) => void;

View File

@@ -8,11 +8,12 @@ import Stack from '@mui/material/Stack';
import Typography from '@mui/material/Typography';
import React from 'react';
import { DATE_LOCALE_OPTIONS, LANGUAGE_OPTIONS } from 'apps/experimental/features/preferences/constants/locales';
import { appHost } from 'components/apphost';
import datetime from 'scripts/datetime';
import globalize from 'lib/globalize';
import { DATE_LOCALE_OPTIONS, LANGUAGE_OPTIONS } from './constants';
import { DisplaySettingsValues } from './types';
import type { DisplaySettingsValues } from '../types/displaySettingsValues';
interface LocalizationPreferencesProps {
onChange: (event: SelectChangeEvent) => void;

View File

@@ -8,7 +8,8 @@ import Typography from '@mui/material/Typography';
import React from 'react';
import globalize from 'lib/globalize';
import { DisplaySettingsValues } from './types';
import type { DisplaySettingsValues } from '../types/displaySettingsValues';
interface NextUpPreferencesProps {
onChange: (event: React.SyntheticEvent) => void;

View File

@@ -3,7 +3,8 @@ import { useSearchParams } from 'react-router-dom';
import toast from 'components/toast/toast';
import globalize from 'lib/globalize';
import { DisplaySettingsValues } from '../types';
import type { DisplaySettingsValues } from '../types/displaySettingsValues';
import { useDisplaySettings } from './useDisplaySettings';
type UpdateField = {

View File

@@ -1,4 +1,4 @@
import { UserDto } from '@jellyfin/sdk/lib/generated-client';
import type { UserDto } from '@jellyfin/sdk/lib/generated-client';
import { ApiClient } from 'jellyfin-apiclient';
import { useCallback, useEffect, useState } from 'react';
@@ -7,10 +7,11 @@ import layoutManager from 'components/layoutManager';
import { useApi } from 'hooks/useApi';
import themeManager from 'scripts/themeManager';
import { currentSettings, UserSettings } from 'scripts/settings/userSettings';
import { DisplaySettingsValues } from '../types';
import type { DisplaySettingsValues } from '../types/displaySettingsValues';
interface UseDisplaySettingsParams {
userId?: string | null;
userId?: string | null;
}
export function useDisplaySettings({ userId }: UseDisplaySettingsParams) {

View File

@@ -5,6 +5,8 @@ import globalize from '../../../lib/globalize';
import { clearBackdrop } from '../../../components/backdrop/backdrop';
import layoutManager from '../../../components/layoutManager';
import Page from '../../../components/Page';
import { EventType } from 'types/eventType';
import Events from 'utils/events';
import '../../../elements/emby-tabs/emby-tabs';
import '../../../elements/emby-button/emby-button';
@@ -32,6 +34,8 @@ const Home = () => {
const mainTabsManager = useMemo(() => import('../../../components/maintabsmanager'), []);
const tabController = useRef<ControllerProps | null>();
const tabControllers = useMemo<ControllerProps[]>(() => [], []);
const documentRef = useRef<Document>(document);
const element = useRef<HTMLDivElement>(null);
const setTitle = async () => {
@@ -122,7 +126,7 @@ const Home = () => {
} else if (currentTabController?.onResume) {
currentTabController.onResume({});
}
(document.querySelector('.skinHeader') as HTMLDivElement).classList.add('noHomeButtonHeader');
(documentRef.current.querySelector('.skinHeader') as HTMLDivElement).classList.add('noHomeButtonHeader');
}, [ initialTabIndex, mainTabsManager ]);
const onPause = useCallback(() => {
@@ -130,17 +134,32 @@ const Home = () => {
if (currentTabController?.onPause) {
currentTabController.onPause();
}
(document.querySelector('.skinHeader') as HTMLDivElement).classList.remove('noHomeButtonHeader');
(documentRef.current.querySelector('.skinHeader') as HTMLDivElement).classList.remove('noHomeButtonHeader');
}, []);
useEffect(() => {
const renderHome = useCallback(() => {
void onSetTabs();
void onResume();
}, [ onResume, onSetTabs ]);
useEffect(() => {
if (documentRef.current?.querySelector('.headerTabs')) {
renderHome();
}
return () => {
onPause();
};
}, [ onPause, onResume, onSetTabs ]);
}, [onPause, renderHome]);
useEffect(() => {
const doc = documentRef.current;
if (doc) Events.on(doc, EventType.HEADER_RENDERED, renderHome);
return () => {
if (doc) Events.off(doc, EventType.HEADER_RENDERED, renderHome);
};
}, [ renderHome ]);
return (
<div ref={element}>

View File

@@ -1,12 +1,9 @@
import React from 'react';
import { Navigate, RouteObject } from 'react-router-dom';
import { REDIRECTS } from 'apps/dashboard/routes/_redirects';
import ConnectionRequired from 'components/ConnectionRequired';
import { toAsyncPageRoute } from 'components/router/AsyncRoute';
import BangRedirect from 'components/router/BangRedirect';
import { toViewManagerPageRoute } from 'components/router/LegacyRoute';
import { toRedirectRoute } from 'components/router/Redirect';
import ErrorBoundary from 'components/router/ErrorBoundary';
import { ASYNC_USER_ROUTES } from './asyncRoutes';
@@ -38,13 +35,5 @@ export const EXPERIMENTAL_APP_ROUTES: RouteObject[] = [
{ index: true, element: <Navigate replace to='/home.html' /> },
...LEGACY_PUBLIC_ROUTES.map(toViewManagerPageRoute)
]
},
{
path: '!/*',
Component: BangRedirect
},
/* Redirects for old paths */
...REDIRECTS.map(toRedirectRoute)
}
];

View File

@@ -3,16 +3,16 @@ import { SelectChangeEvent } from '@mui/material/Select';
import Stack from '@mui/material/Stack';
import React, { useCallback } from 'react';
import { DisplayPreferences } from 'apps/experimental/features/preferences/components/DisplayPreferences';
import { ItemDetailPreferences } from 'apps/experimental/features/preferences/components/ItemDetailPreferences';
import { LibraryPreferences } from 'apps/experimental/features/preferences/components/LibraryPreferences';
import { useDisplaySettingForm } from 'apps/experimental/features/preferences/hooks/useDisplaySettingForm';
import { LocalizationPreferences } from 'apps/experimental/features/preferences/components/LocalizationPreferences';
import { NextUpPreferences } from 'apps/experimental/features/preferences/components/NextUpPreferences';
import type { DisplaySettingsValues } from 'apps/experimental/features/preferences/types/displaySettingsValues';
import LoadingComponent from 'components/loading/LoadingComponent';
import Page from 'components/Page';
import globalize from 'lib/globalize';
import { DisplayPreferences } from './DisplayPreferences';
import { ItemDetailPreferences } from './ItemDetailPreferences';
import { LibraryPreferences } from './LibraryPreferences';
import { LocalizationPreferences } from './LocalizationPreferences';
import { NextUpPreferences } from './NextUpPreferences';
import { useDisplaySettingForm } from './hooks/useDisplaySettingForm';
import { DisplaySettingsValues } from './types';
import LoadingComponent from 'components/loading/LoadingComponent';
export default function UserDisplayPreferences() {
const {

View File

@@ -0,0 +1,8 @@
/**
* Actions that are triggered for media segments.
*/
export enum MediaSegmentAction {
None = 'None',
AskToSkip = 'AskToSkip',
Skip = 'Skip'
}

View File

@@ -0,0 +1,14 @@
/**
* Events triggered by PlaybackManager.
*/
export enum PlaybackManagerEvent {
Pairing = 'pairing',
Paired = 'paired',
PairError = 'pairerror',
PlaybackCancelled = 'playbackcancelled',
PlaybackError = 'playbackerror',
PlaybackStart = 'playbackstart',
PlaybackStop = 'playbackstop',
PlayerChange = 'playerchange',
ReportPlayback = 'reportplayback'
}

View File

@@ -0,0 +1,24 @@
/**
* Events triggered by media player plugins.
* TODO: This list is incomplete
*/
export enum PlayerEvent {
Error = 'error',
FullscreenChange = 'fullscreenchange',
ItemStarted = 'itemstarted',
ItemStopped = 'itemstopped',
MediaStreamsChange = 'mediastreamschange',
Pause = 'pause',
PlaybackStart = 'playbackstart',
PlaybackStop = 'playbackstop',
PlaylistItemAdd = 'playlistitemadd',
PlaylistItemMove = 'playlistitemmove',
PlaylistItemRemove = 'playlistitemremove',
PromptSkip = 'promptskip',
RepeatModeChange = 'repeatmodechange',
ShuffleModeChange = 'shufflequeuemodechange',
Stopped = 'stopped',
TimeUpdate = 'timeupdate',
Unpause = 'unpause',
VolumeChange = 'volumechange'
}

View File

@@ -0,0 +1,33 @@
import type { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto';
import type { MediaSourceInfo } from '@jellyfin/sdk/lib/generated-client/models/media-source-info';
import type { MediaType } from '@jellyfin/sdk/lib/generated-client/models/media-type';
import type { StreamInfo } from './streamInfo';
export interface ManagedPlayerStopInfo {
item: BaseItemDto
mediaSource: MediaSourceInfo
nextItem?: BaseItemDto | null
nextMediaType?: MediaType | null
positionMs?: number
}
export interface MovedItem {
newIndex: number
playlistItemId: string
}
export type PlayerErrorCode = string;
export interface PlayerStopInfo {
src?: URL | BaseItemDto
}
export interface PlayerError {
streamInfo?: StreamInfo
type: MediaError | string
}
export interface RemovedItems {
playlistItemIds: string[]
}

View File

@@ -0,0 +1,34 @@
import type { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto';
import type { MediaSourceInfo } from '@jellyfin/sdk/lib/generated-client/models/media-source-info';
import type { MediaType } from '@jellyfin/sdk/lib/generated-client/models/media-type';
import type { PlayMethod } from '@jellyfin/sdk/lib/generated-client/models/play-method';
export interface StreamInfo {
ended?: boolean
fullscreen?: boolean
item?: BaseItemDto
lastMediaInfoQuery?: number
liveStreamId?: string
mediaSource?: MediaSourceInfo
mediaType?: MediaType
mimeType?: string
playMethod?: PlayMethod
playSessionId?: string
playbackStartTimeTicks?: number
playerStartPositionTicks?: number
resetSubtitleOffset?: boolean
started?: boolean
textTracks?: TrackInfo[]
title?: string
tracks?: TrackInfo[]
transcodingOffsetTicks?: number
url?: string
}
interface TrackInfo {
url: string
language: string
isDefault: boolean
index: number
format: string
}

View File

@@ -0,0 +1,145 @@
import type { Api } from '@jellyfin/sdk/lib/api';
import type { MediaSegmentDto } from '@jellyfin/sdk/lib/generated-client/models/media-segment-dto';
import { MediaSegmentType } from '@jellyfin/sdk/lib/generated-client/models/media-segment-type';
import { MediaSegmentsApi } from '@jellyfin/sdk/lib/generated-client/api/media-segments-api';
import type { PlaybackManager } from 'components/playback/playbackmanager';
import ServerConnections from 'components/ServerConnections';
import { TICKS_PER_MILLISECOND, TICKS_PER_SECOND } from 'constants/time';
import { currentSettings as userSettings } from 'scripts/settings/userSettings';
import type { PlayerState } from 'types/playbackStopInfo';
import type { Event } from 'utils/events';
import { toApi } from 'utils/jellyfin-apiclient/compat';
import { getMediaSegmentAction } from './mediaSegmentSettings';
import { findCurrentSegment } from './mediaSegments';
import { PlaybackSubscriber } from './playbackSubscriber';
import { MediaSegmentAction } from '../constants/mediaSegmentAction';
class MediaSegmentManager extends PlaybackSubscriber {
private hasSegments = false;
private isLastSegmentIgnored = false;
private lastSegmentIndex = 0;
private lastTime = -1;
private mediaSegmentTypeActions: Record<Partial<MediaSegmentType>, MediaSegmentAction> | undefined;
private mediaSegments: MediaSegmentDto[] = [];
private async fetchMediaSegments(api: Api, itemId: string, includeSegmentTypes: MediaSegmentType[]) {
// FIXME: Replace with SDK getMediaSegmentsApi function when available in stable
const mediaSegmentsApi = new MediaSegmentsApi(api.configuration, undefined, api.axiosInstance);
try {
const { data: mediaSegments } = await mediaSegmentsApi.getItemSegments({ itemId, includeSegmentTypes });
this.mediaSegments = mediaSegments.Items || [];
} catch (err) {
console.error('[MediaSegmentManager] failed to fetch segments', err);
this.mediaSegments = [];
}
}
skipSegment(mediaSegment: MediaSegmentDto) {
// Ignore segment if playback progress has passed the segment's start time
if (mediaSegment.StartTicks !== undefined && this.lastTime > mediaSegment.StartTicks) {
console.info('[MediaSegmentManager] ignoring skipping segment that has been seeked back into', mediaSegment);
this.isLastSegmentIgnored = true;
} else if (mediaSegment.EndTicks) {
// If there is an end time, seek to it
// Do not skip if duration < 1s to avoid slow stream changes
if (mediaSegment.StartTicks && mediaSegment.EndTicks - mediaSegment.StartTicks < TICKS_PER_SECOND) {
console.info('[MediaSegmentManager] ignoring skipping segment with duration <1s', mediaSegment);
this.isLastSegmentIgnored = true;
return;
}
console.debug('[MediaSegmentManager] skipping to %s ms', mediaSegment.EndTicks / TICKS_PER_MILLISECOND);
this.playbackManager.seek(mediaSegment.EndTicks, this.player);
} else {
// If there is no end time, skip to the next track
console.debug('[MediaSegmentManager] skipping to next item in queue');
this.playbackManager.nextTrack(this.player);
}
}
promptToSkip(mediaSegment: MediaSegmentDto) {
if (mediaSegment.StartTicks && mediaSegment.EndTicks
&& mediaSegment.EndTicks - mediaSegment.StartTicks < TICKS_PER_SECOND * 3) {
console.info('[MediaSegmentManager] ignoring segment prompt with duration <3s', mediaSegment);
this.isLastSegmentIgnored = true;
return;
}
this.playbackManager.promptToSkip(mediaSegment);
}
private performAction(mediaSegment: MediaSegmentDto) {
if (!this.mediaSegmentTypeActions || !mediaSegment.Type || !this.mediaSegmentTypeActions[mediaSegment.Type]) {
console.error('[MediaSegmentManager] segment type missing from action map', mediaSegment, this.mediaSegmentTypeActions);
return;
}
const action = this.mediaSegmentTypeActions[mediaSegment.Type];
if (action === MediaSegmentAction.Skip) {
this.skipSegment(mediaSegment);
} else if (action === MediaSegmentAction.AskToSkip) {
this.promptToSkip(mediaSegment);
}
}
onPlayerPlaybackStart(_e: Event, state: PlayerState) {
this.isLastSegmentIgnored = false;
this.lastSegmentIndex = 0;
this.lastTime = -1;
this.hasSegments = !!state.MediaSource?.HasSegments;
const itemId = state.MediaSource?.Id;
const serverId = state.NowPlayingItem?.ServerId || ServerConnections.currentApiClient()?.serverId();
if (!this.hasSegments || !serverId || !itemId) return;
// Get the user settings for media segment actions
this.mediaSegmentTypeActions = Object.values(MediaSegmentType)
.map(type => ({
type,
action: getMediaSegmentAction(userSettings, type)
}))
.filter(({ action }) => !!action && action !== MediaSegmentAction.None)
.reduce((acc, { type, action }) => {
if (action) acc[type] = action;
return acc;
}, {} as Record<Partial<MediaSegmentType>, MediaSegmentAction>);
if (!Object.keys(this.mediaSegmentTypeActions).length) {
console.info('[MediaSegmentManager] user has no media segment actions enabled');
return;
}
const api = toApi(ServerConnections.getApiClient(serverId));
void this.fetchMediaSegments(
api,
itemId,
Object.keys(this.mediaSegmentTypeActions).map(t => t as keyof typeof MediaSegmentType));
}
onPlayerTimeUpdate() {
if (this.hasSegments && this.mediaSegments.length) {
const time = this.playbackManager.currentTime(this.player) * TICKS_PER_MILLISECOND;
const currentSegmentDetails = findCurrentSegment(this.mediaSegments, time, this.lastSegmentIndex);
if (
// The current time falls within a segment
currentSegmentDetails
// and the last segment is not ignored or the segment index has changed
&& (!this.isLastSegmentIgnored || this.lastSegmentIndex !== currentSegmentDetails.index)
) {
console.debug(
'[MediaSegmentManager] found %s segment at %s ms',
currentSegmentDetails.segment.Type,
time / TICKS_PER_MILLISECOND,
currentSegmentDetails);
this.isLastSegmentIgnored = false;
this.performAction(currentSegmentDetails.segment);
this.lastSegmentIndex = currentSegmentDetails.index;
}
this.lastTime = time;
}
}
}
export const bindMediaSegmentManager = (playbackManager: PlaybackManager) => new MediaSegmentManager(playbackManager);

View File

@@ -0,0 +1,20 @@
import { MediaSegmentType } from '@jellyfin/sdk/lib/generated-client/models/media-segment-type';
import { UserSettings } from 'scripts/settings/userSettings';
import { MediaSegmentAction } from '../constants/mediaSegmentAction';
const PREFIX = 'segmentTypeAction';
const DEFAULT_ACTIONS: Partial<Record<MediaSegmentType, MediaSegmentAction>> = {
[MediaSegmentType.Intro]: MediaSegmentAction.AskToSkip,
[MediaSegmentType.Outro]: MediaSegmentAction.AskToSkip
};
export const getId = (type: MediaSegmentType) => `${PREFIX}__${type}`;
export function getMediaSegmentAction(userSettings: UserSettings, type: MediaSegmentType): MediaSegmentAction {
const action = userSettings.get(getId(type), false);
const defaultAction = DEFAULT_ACTIONS[type] || MediaSegmentAction.None;
return action ? action as MediaSegmentAction : defaultAction;
}

View File

@@ -0,0 +1,68 @@
import type { MediaSegmentDto } from '@jellyfin/sdk/lib/generated-client/models/media-segment-dto';
import { MediaSegmentType } from '@jellyfin/sdk/lib/generated-client/models/media-segment-type';
import { describe, expect, it } from 'vitest';
import { findCurrentSegment } from './mediaSegments';
const TEST_SEGMENTS: MediaSegmentDto[] = [
{
Id: 'intro',
Type: MediaSegmentType.Intro,
StartTicks: 0,
EndTicks: 10
},
{
Id: 'preview',
Type: MediaSegmentType.Preview,
StartTicks: 20,
EndTicks: 30
},
{
Id: 'recap',
Type: MediaSegmentType.Recap,
StartTicks: 30,
EndTicks: 40
},
{
Id: 'commercial',
Type: MediaSegmentType.Commercial,
StartTicks: 40,
EndTicks: 50
},
{
Id: 'outro',
Type: MediaSegmentType.Outro,
StartTicks: 50,
EndTicks: 60
}
];
describe('findCurrentSegment()', () => {
it('Should return the current segment', () => {
let segmentDetails = findCurrentSegment(TEST_SEGMENTS, 23);
expect(segmentDetails).toBeDefined();
expect(segmentDetails?.index).toBe(1);
expect(segmentDetails?.segment?.Id).toBe('preview');
segmentDetails = findCurrentSegment(TEST_SEGMENTS, 5, 1);
expect(segmentDetails).toBeDefined();
expect(segmentDetails?.index).toBe(0);
expect(segmentDetails?.segment?.Id).toBe('intro');
segmentDetails = findCurrentSegment(TEST_SEGMENTS, 42, 3);
expect(segmentDetails).toBeDefined();
expect(segmentDetails?.index).toBe(3);
expect(segmentDetails?.segment?.Id).toBe('commercial');
});
it('Should return undefined if not in a segment', () => {
let segmentDetails = findCurrentSegment(TEST_SEGMENTS, 16);
expect(segmentDetails).toBeUndefined();
segmentDetails = findCurrentSegment(TEST_SEGMENTS, 10, 1);
expect(segmentDetails).toBeUndefined();
segmentDetails = findCurrentSegment(TEST_SEGMENTS, 100);
expect(segmentDetails).toBeUndefined();
});
});

View File

@@ -0,0 +1,41 @@
import type { MediaSegmentDto } from '@jellyfin/sdk/lib/generated-client/models/media-segment-dto';
const isBeforeSegment = (segment: MediaSegmentDto, time: number, direction: number) => {
if (direction === -1) {
return (
typeof segment.EndTicks !== 'undefined'
&& segment.EndTicks <= time
);
}
return (
typeof segment.StartTicks !== 'undefined'
&& segment.StartTicks > time
);
};
export const isInSegment = (segment: MediaSegmentDto, time: number) => (
typeof segment.StartTicks !== 'undefined'
&& segment.StartTicks <= time
&& (typeof segment.EndTicks === 'undefined' || segment.EndTicks > time)
);
export const findCurrentSegment = (segments: MediaSegmentDto[], time: number, lastIndex = 0) => {
const lastSegment = segments[lastIndex];
if (isInSegment(lastSegment, time)) {
return { index: lastIndex, segment: lastSegment };
}
let direction = 1;
if (lastIndex > 0 && lastSegment.StartTicks && lastSegment.StartTicks > time) {
direction = -1;
}
for (
let index = lastIndex, segment = segments[index];
index >= 0 && index < segments.length;
index += direction, segment = segments[index]
) {
if (isBeforeSegment(segment, time, direction)) return;
if (isInSegment(segment, time)) return { index, segment };
}
};

View File

@@ -0,0 +1,104 @@
import type { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto';
import type { MediaSourceInfo } from '@jellyfin/sdk/lib/generated-client/models/media-source-info';
import type { PlaybackManager } from 'components/playback/playbackmanager';
import type { MediaError } from 'types/mediaError';
import type { PlayTarget } from 'types/playTarget';
import type { PlaybackStopInfo, PlayerState } from 'types/playbackStopInfo';
import type { Plugin } from 'types/plugin';
import Events, { type Event } from 'utils/events';
import { PlaybackManagerEvent } from '../constants/playbackManagerEvent';
import { PlayerEvent } from '../constants/playerEvent';
import type { ManagedPlayerStopInfo, MovedItem, PlayerError, PlayerErrorCode, PlayerStopInfo, RemovedItems } from '../types/callbacks';
import type { MediaSegmentDto } from '@jellyfin/sdk/lib/generated-client/models/media-segment-dto';
export interface PlaybackSubscriber {
onPlaybackCancelled?(e: Event): void
onPlaybackError?(e: Event, errorType: MediaError): void
onPlaybackStart?(e: Event, player: Plugin, state: PlayerState): void
onPlaybackStop?(e: Event, info: PlaybackStopInfo): void
onPlayerChange?(e: Event, player: Plugin, target: PlayTarget, previousPlayer: Plugin): void
onPromptSkip?(e: Event, mediaSegment: MediaSegmentDto): void
onPlayerError?(e: Event, error: PlayerError): void
onPlayerFullscreenChange?(e: Event): void
onPlayerItemStarted?(e: Event, item?: BaseItemDto, mediaSource?: MediaSourceInfo): void
onPlayerItemStopped?(e: Event, info: ManagedPlayerStopInfo): void
onPlayerMediaStreamsChange?(e: Event): void
onPlayerPause?(e: Event): void
onPlayerPlaybackStart?(e: Event, state: PlayerState): void
onPlayerPlaybackStop?(e: Event, state: PlayerState): void
onPlayerPlaylistItemAdd?(e: Event): void
onPlayerPlaylistItemMove?(e: Event, item: MovedItem): void
onPlayerPlaylistItemRemove?(e: Event, items?: RemovedItems): void
onPlayerRepeatModeChange?(e: Event): void
onPlayerShuffleModeChange?(e: Event): void
onPlayerStopped?(e: Event, info?: PlayerStopInfo | PlayerErrorCode): void
onPlayerTimeUpdate?(e: Event): void
onPlayerUnpause?(e: Event): void
onPlayerVolumeChange?(e: Event): void
onReportPlayback?(e: Event, isServerItem: boolean): void
}
export abstract class PlaybackSubscriber {
protected player: Plugin | undefined;
private readonly playbackManagerEvents = {
[PlaybackManagerEvent.PlaybackCancelled]: this.onPlaybackCancelled?.bind(this),
[PlaybackManagerEvent.PlaybackError]: this.onPlaybackError?.bind(this),
[PlaybackManagerEvent.PlaybackStart]: this.onPlaybackStart?.bind(this),
[PlaybackManagerEvent.PlaybackStop]: this.onPlaybackStop?.bind(this),
[PlaybackManagerEvent.PlayerChange]: this.onPlayerChange?.bind(this),
[PlaybackManagerEvent.ReportPlayback]: this.onReportPlayback?.bind(this)
};
private readonly playerEvents = {
[PlayerEvent.Error]: this.onPlayerError?.bind(this),
[PlayerEvent.FullscreenChange]: this.onPlayerFullscreenChange?.bind(this),
[PlayerEvent.ItemStarted]: this.onPlayerItemStarted?.bind(this),
[PlayerEvent.ItemStopped]: this.onPlayerItemStopped?.bind(this),
[PlayerEvent.MediaStreamsChange]: this.onPlayerMediaStreamsChange?.bind(this),
[PlayerEvent.Pause]: this.onPlayerPause?.bind(this),
[PlayerEvent.PlaybackStart]: this.onPlayerPlaybackStart?.bind(this),
[PlayerEvent.PlaybackStop]: this.onPlayerPlaybackStop?.bind(this),
[PlayerEvent.PlaylistItemAdd]: this.onPlayerPlaylistItemAdd?.bind(this),
[PlayerEvent.PlaylistItemMove]: this.onPlayerPlaylistItemMove?.bind(this),
[PlayerEvent.PlaylistItemRemove]: this.onPlayerPlaylistItemRemove?.bind(this),
[PlayerEvent.PromptSkip]: this.onPromptSkip?.bind(this),
[PlayerEvent.RepeatModeChange]: this.onPlayerRepeatModeChange?.bind(this),
[PlayerEvent.ShuffleModeChange]: this.onPlayerShuffleModeChange?.bind(this),
[PlayerEvent.Stopped]: this.onPlayerStopped?.bind(this),
[PlayerEvent.TimeUpdate]: this.onPlayerTimeUpdate?.bind(this),
[PlayerEvent.Unpause]: this.onPlayerUnpause?.bind(this),
[PlayerEvent.VolumeChange]: this.onPlayerVolumeChange?.bind(this)
};
constructor(
protected readonly playbackManager: PlaybackManager
) {
Object.entries(this.playbackManagerEvents).forEach(([event, handler]) => {
if (handler) Events.on(playbackManager, event, handler);
});
this.bindPlayerEvents();
Events.on(playbackManager, PlaybackManagerEvent.PlayerChange, this.bindPlayerEvents.bind(this));
}
private bindPlayerEvents() {
const newPlayer = this.playbackManager.getCurrentPlayer();
if (this.player === newPlayer) return;
if (this.player) {
Object.entries(this.playerEvents).forEach(([event, handler]) => {
if (handler) Events.off(this.player, event, handler);
});
}
this.player = newPlayer;
if (!this.player) return;
Object.entries(this.playerEvents).forEach(([event, handler]) => {
if (handler) Events.on(this.player, event, handler);
});
}
}

View File

@@ -1,5 +0,0 @@
import type { Redirect } from 'components/router/Redirect';
export const REDIRECTS: Redirect[] = [
{ from: 'mypreferencesquickconnect.html', to: '/quickconnect' }
];

View File

@@ -4,15 +4,12 @@ import React from 'react';
import ConnectionRequired from 'components/ConnectionRequired';
import { toAsyncPageRoute } from 'components/router/AsyncRoute';
import { toViewManagerPageRoute } from 'components/router/LegacyRoute';
import { toRedirectRoute } from 'components/router/Redirect';
import ErrorBoundary from 'components/router/ErrorBoundary';
import AppLayout from '../AppLayout';
import { REDIRECTS } from './_redirects';
import { ASYNC_USER_ROUTES } from './asyncRoutes';
import { LEGACY_PUBLIC_ROUTES, LEGACY_USER_ROUTES } from './legacyRoutes';
import BangRedirect from 'components/router/BangRedirect';
export const STABLE_APP_ROUTES: RouteObject[] = [
{
@@ -33,13 +30,5 @@ export const STABLE_APP_ROUTES: RouteObject[] = [
{ index: true, element: <Navigate replace to='/home.html' /> },
...LEGACY_PUBLIC_ROUTES.map(toViewManagerPageRoute)
]
},
{
path: '!/*',
Component: BangRedirect
},
/* Redirects for old paths */
...REDIRECTS.map(toRedirectRoute)
}
];

View File

@@ -1,11 +1,10 @@
import type { UserDto } from '@jellyfin/sdk/lib/generated-client';
import { ImageType } from '@jellyfin/sdk/lib/generated-client/models/image-type';
import React, { FunctionComponent, useEffect, useState, useRef, useCallback } from 'react';
import React, { FunctionComponent, useEffect, useState, useRef, useCallback, useMemo } from 'react';
import { useSearchParams } from 'react-router-dom';
import Dashboard from '../../../../utils/dashboard';
import globalize from '../../../../lib/globalize';
import LibraryMenu from '../../../../scripts/libraryMenu';
import { appHost } from '../../../../components/apphost';
import confirm from '../../../../components/confirm/confirm';
import ButtonElement from '../../../../elements/ButtonElement';
@@ -18,6 +17,7 @@ const UserProfile: FunctionComponent = () => {
const [ searchParams ] = useSearchParams();
const userId = searchParams.get('userId');
const [ userName, setUserName ] = useState('');
const libraryMenu = useMemo(async () => ((await import('../../../../scripts/libraryMenu')).default), []);
const element = useRef<HTMLDivElement>(null);
@@ -41,7 +41,7 @@ const UserProfile: FunctionComponent = () => {
}
setUserName(user.Name);
LibraryMenu.setTitle(user.Name);
void libraryMenu.then(menu => menu.setTitle(user.Name));
let imageUrl = 'assets/img/avatar.png';
if (user.PrimaryImageTag) {

View File

@@ -3,7 +3,6 @@ import { Outlet, useLocation, useNavigate } from 'react-router-dom';
import type { ConnectResponse } from 'jellyfin-apiclient';
import alert from './alert';
import { appRouter } from './router/appRouter';
import Loading from './loading/LoadingComponent';
import ServerConnections from './ServerConnections';
import globalize from '../lib/globalize';
@@ -149,24 +148,27 @@ const ConnectionRequired: FunctionComponent<ConnectionRequiredProps> = ({
}, [bounce, isAdminRequired, isUserRequired]);
useEffect(() => {
// TODO: appRouter will call appHost.exit() if navigating back when you are already at the default route.
// This case will need to be handled elsewhere before appRouter can be killed.
// Check connection status on initial page load
const firstConnection = appRouter.firstConnectionResult;
appRouter.firstConnectionResult = null;
const apiClient = ServerConnections.currentApiClient();
const connection = Promise.resolve(ServerConnections.firstConnection ? null : ServerConnections.connect());
connection.then(firstConnection => {
console.debug('[ConnectionRequired] connection state', firstConnection?.State);
ServerConnections.firstConnection = true;
if (firstConnection && firstConnection.State !== ConnectionState.SignedIn) {
handleIncompleteWizard(firstConnection)
.catch(err => {
console.error('[ConnectionRequired] failed to start wizard', err);
});
} else {
validateUserAccess()
.catch(err => {
console.error('[ConnectionRequired] failed to validate user access', err);
});
}
if (firstConnection && firstConnection.State !== ConnectionState.SignedIn && !apiClient?.isLoggedIn()) {
handleIncompleteWizard(firstConnection)
.catch(err => {
console.error('[ConnectionRequired] could not start wizard', err);
});
} else {
validateUserAccess()
.catch(err => {
console.error('[ConnectionRequired] could not validate user access', err);
});
}
}).catch(err => {
console.error('[ConnectionRequired] failed to connect', err);
});
}, [handleIncompleteWizard, validateUserAccess]);
if (isLoading) {

View File

@@ -33,6 +33,7 @@ class ServerConnections extends ConnectionManager {
constructor() {
super(...arguments);
this.localApiClient = null;
this.firstConnection = null;
// Set the apiclient minimum version to match the SDK
this._minServerVersion = MINIMUM_VERSION;

Some files were not shown because too many files have changed in this diff Show More