Compare commits

...

4073 Commits

Author SHA1 Message Date
Cody Robibero 904699ba21 Merge pull request #17709 from Shadowghost/fix-people-task-perist
Persist the refresh stamp so the people task stops redoing its work
2026-08-25 19:10:44 -04:00
Cody Robibero f682c22b08 Merge pull request #17715 from Shadowghost/fix-people-cleanup
Delete credits nothing maps to and bound item-by-name folder names
2026-08-25 18:28:52 -04:00
Cody Robibero a68793d08a Merge pull request #17716 from Shadowghost/tmdb-aggregate-cast
Build a TMDb series cast from the aggregated credits
2026-08-25 18:26:50 -04:00
Cody Robibero e79e2cba27 Merge pull request #17714 from Shadowghost/fix-localized-view-ids
Stop deriving user view ids from their localized name
2026-08-25 18:26:09 -04:00
Cody Robibero f3298eee69 Merge pull request #17713 from LTe/fix/sort-isplayed-series
Fix IsPlayed and IsUnplayed sorting for shows and collections
2026-08-25 18:24:46 -04:00
Cody Robibero 88df882061 Merge pull request #17710 from Shadowghost/fix-omdb-people
Fix OMDB People handling
2026-08-25 18:23:42 -04:00
Cody Robibero 118940fff8 Merge pull request #17711 from Shadowghost/fix-image-logging
Say which image and item failed instead of logging a blank path
2026-08-25 18:22:02 -04:00
Shadowghost 79c37bfcd5 Build a TMDb series cast from the aggregated credits 2026-08-25 21:06:51 +02:00
Shadowghost a81b90f570 Fix tests 2026-08-25 21:03:51 +02:00
Shadowghost 1d24c1df17 Keep an OMDb credit whole when its annotation holds a comma 2026-08-25 20:43:44 +02:00
Shadowghost 4147a83b93 Handle generational suffixes 2026-08-25 20:42:41 +02:00
Shadowghost 6978dfc294 Delete a credit once no item maps to it any more 2026-08-25 20:31:30 +02:00
Shadowghost 8c0775e941 Bind the folder name an item-by-name entity resolves to 2026-08-25 20:31:09 +02:00
Piotr Niełacny 5e621d0e3f Order IsPlayed and IsUnplayed by the played state the filter reports
Ordering mapped both keys to the item's own stored UserData row. Folders do not
have one: a series, season or box set counts as played when no descendant is
left unplayed, which is what the isPlayed filter and the DTO both report. A
mixed library therefore sorted every series and box set into the unplayed group,
and a query could filter and sort by two different notions of "played".

Extract the filter's predicate into BuildIsPlayedFilter and route both sort keys
through it so the two cannot drift apart again.
2026-08-25 15:19:38 +02:00
Shadowghost 38093e2952 Fix test 2026-08-24 22:27:11 +02:00
Shadowghost 3fafdbc281 Say which image and item failed instead of logging a blank path 2026-08-24 22:12:57 +02:00
Shadowghost 9cc47c4fd6 Persist the refresh stamp so the people task stops redoing its work 2026-08-24 21:57:14 +02:00
Shadowghost 4c524f033f Fix OMDB People handling 2026-08-24 21:56:31 +02:00
Bond-009 422b2bb3d9 Update dependency UTF.Unknown to 2.7.0 (#17697)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-24 19:07:33 +02:00
Vitalijus 971be1b658 Translated using Weblate (Lithuanian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/lt/
2026-08-23 21:54:28 +00:00
Cody Robibero 1cc698a30b Merge pull request #17702 from Shadowghost/fix-person-metadata-refresh
Fix person metadata not being fetched on demand or by the people task
2026-08-23 17:38:19 -04:00
Shadowghost 4cd24a19d4 Use FullRefresh 2026-08-23 14:35:13 +02:00
Cody Robibero af8e19b169 Merge pull request #17693 from Shadowghost/fix-series-merging
Fix series merging leaking across libraries and under-counting merged children
2026-08-23 08:20:29 -04:00
Cody Robibero 75ae31895f Merge pull request #17619 from Shadowghost/fix-metadata-language-fallback
Fix English metadata blocking localized providers ranked below it
2026-08-23 08:20:20 -04:00
Karan Singh BHardwaj 484291b0c1 Translated using Weblate (Hindi)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hi/
2026-08-23 11:23:04 +00:00
chiphead2332 e8927bc300 Translated using Weblate (Portuguese (Brazil))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt_BR/
2026-08-23 11:23:03 +00:00
DeaDvey 7758beba99 Translated using Weblate (English (United Kingdom))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/en_GB/
2026-08-23 09:45:51 +00:00
Shadowghost 090b610eb1 Fix person metadata not being fetched on demand or by the people task 2026-08-23 09:27:26 +02:00
Koralski 19235909fe Translated using Weblate (Bulgarian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/bg/
2026-08-23 07:26:27 +00:00
krvi c3ed1407ca Translated using Weblate (Faroese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fo/
2026-08-22 17:14:15 +00:00
krvi 0b7b53a9fd Translated using Weblate (Faroese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fo/
2026-08-22 16:11:17 +00:00
Shadowghost 284c6f00db Merge remote-tracking branch 'upstream/master' into fix-metadata-language-fallback 2026-08-22 17:31:04 +02:00
Shadowghost ea2c794cb2 Adapt to master 2026-08-22 17:22:41 +02:00
Shadowghost e1af8dce05 Merge remote-tracking branch 'upstream/master' into fix-series-merging 2026-08-22 17:18:01 +02:00
Cody Robibero 0d02638e82 Merge pull request #17700 from Shadowghost/better-people-resolution
Look up people by item via the credit map instead of a full scan
2026-08-22 08:50:42 -04:00
Cody Robibero 682c45090c Merge pull request #17698 from Shadowghost/unbreak-breakOnNonKeyFrames-dlna
Mark breakOnNonKeyFrames as XMLIgnore
2026-08-22 08:50:00 -04:00
Cody Robibero b2ba726635 Merge pull request #17691 from Shadowghost/fix-top-parent-fallback
Fall back to the ancestor filter when a view has no top parents
2026-08-22 08:49:39 -04:00
Cody Robibero 49112163eb Merge pull request #17584 from Shadowghost/safeguard-invalid-provider-ids
Safeguard against invalid provider ids
2026-08-22 08:49:07 -04:00
Cody Robibero 0d4cbb999b Merge pull request #17607 from Shadowghost/optimize-db-helper-memory
Optimize query helper memory
2026-08-22 08:45:42 -04:00
Cody Robibero c04f11bd76 Merge pull request #17685 from jellyfin/GHSA-wwwm-px48-fpvq-v12
Fix GHSA-wwwm-px48-fpvq
2026-08-22 08:43:07 -04:00
Cody Robibero 6617a27de3 Merge pull request #17682 from theguymadmax/hdhomerun-directplay
Allow direct play for HDHomeRun Live TV tuners
2026-08-22 08:42:57 -04:00
Cody Robibero 4477f41857 Merge pull request #17678 from theguymadmax/fix-mixed-latest-items
Fix latest items for mixed libraries
2026-08-22 08:42:38 -04:00
Shadowghost 20b4a59281 Look up people by item via the credit map instead of a full scan 2026-08-22 11:22:31 +02:00
Shadowghost 42c70fba63 Additional fixes
Co-Authored-By: Cody Robibero <cody@robibe.ro>
2026-08-22 08:50:14 +02:00
Shadowghost 8e8cf57025 Mark breakOnNonKeyFrames as XMLIgnore 2026-08-22 07:43:48 +02:00
Shadowghost 587f06dccc Multiple fixes and improvements
Co-Authored-By: Cody Robibero <cody@robibe.ro>
2026-08-22 07:42:56 +02:00
Shadowghost 7ad5ff6aa7 Merge remote-tracking branch 'upstream/master' into optimize-db-helper-memory
# Conflicts:
#	src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/JellyfinDbModelSnapshot.cs
2026-08-22 07:01:58 +02:00
renovate[bot] a5880c8622 Update dependency UTF.Unknown to 2.7.0 2026-08-22 03:30:29 +00:00
Shadowghost 335d97d868 Use WhereOneOrMany 2026-08-21 22:59:39 +02:00
Shadowghost 8e80677bdd Fix series merging leaking across libraries and under-counting merged children 2026-08-21 22:48:47 +02:00
Shadowghost 4df580f0e8 Fall back to the ancestor filter when a view has no top parents 2026-08-21 20:40:52 +02:00
Joel Sprouse 9fa0533506 Translated using Weblate (English (United Kingdom))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/en_GB/
2026-08-21 17:18:51 +00:00
Cody Robibero 9ba91d4583 Normalize fix, apply in more places 2026-08-20 18:10:50 -04:00
Shadowghost a8da0664a3 Fix GHSA-wwwm-px48-fpvq
# Conflicts:
#	MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs
2026-08-20 17:51:42 -04:00
Gabriel Popa d6bcad3b59 Translated using Weblate (Romanian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ro/
2026-08-20 21:36:09 +00:00
theguymadmax 40fbe4a771 Allow direct play for HDHomeRun tuners 2026-08-20 15:25:37 -04:00
therealhampus 678975fbd7 Translated using Weblate (Swedish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/sv/
2026-08-20 16:35:33 +00:00
Tim Eisele fb50b4df8b Stop user updates from orphaning permission and preference rows (#17645)
* Stop user updates from orphaning permission and preference rows

* Make UserId non-nullable

* Remove unnecessary ToList

* Update Jellyfin.Server.Implementations/Users/UserManager.cs

Co-authored-by: Claus Vium <cvium@users.noreply.github.com>

---------

Co-authored-by: Claus Vium <cvium@users.noreply.github.com>
2026-08-20 18:35:26 +02:00
Jacky He c70933a23f Translated using Weblate (Chinese (Traditional Han script))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant/
2026-08-20 02:51:23 +00:00
Jacky He ad9056c8fc Translated using Weblate (Chinese (Traditional Han script, Hong Kong))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant_HK/
2026-08-20 02:51:22 +00:00
Jacky He 77988e51b6 Translated using Weblate (Chinese (Simplified Han script))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hans/
2026-08-20 02:51:21 +00:00
theguymadmax 80fe8c67e9 Fix latest items for mixed libraries 2026-08-19 18:34:21 -04:00
Blackspirits 4029de92a1 Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt/
2026-08-19 22:08:08 +00:00
krvi 19d919f8be Translated using Weblate (Faroese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fo/
2026-08-19 16:33:14 +00:00
Blackspirits ef01d88912 Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt_PT/
2026-08-19 16:33:14 +00:00
Shadowghost bd085665d6 Merge remote-tracking branch 'upstream/master' into safeguard-invalid-provider-ids 2026-08-19 16:13:29 +02:00
Ömür Ege Kiraz f586fc063f Translated using Weblate (Turkish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/tr/
2026-08-19 13:29:15 +00:00
MakeMike 17221057bc Translated using Weblate (Armenian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hy/
2026-08-19 08:00:16 +00:00
Cody Robibero 04b77ca801 Merge pull request #17670 from Shadowghost/harden-musicbrainz
More resilient MusicBrainz lookup
2026-08-18 19:28:22 -04:00
Blackspirits b11734d955 Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt_PT/
2026-08-18 22:07:07 +00:00
Cody Robibero 4a659fb30c Merge pull request #17631 from itsb/fix/confirmed-resume-position-master
Use client-reported position for idle playback cleanup
2026-08-18 17:12:00 -04:00
MoonsvnLyn c203da245d Fix Cheesegeezer GitHub URL typo in CONTRIBUTORS (#17659) 2026-08-18 22:36:32 +02:00
deepak r 0f36c4a200 Translated using Weblate (Tamil)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ta/
2026-08-18 18:36:57 +00:00
Jonathan Biton c4dec76b9c Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/he/
2026-08-18 18:36:57 +00:00
m0g3r 46be43ad24 Prevent orphaned user permissions and preferences (#17643)
Prevent orphaned user permissions and preferences
2026-08-18 18:16:48 +02:00
Bond-009 3fe35fcbc1 Merge pull request #17665 from jellyfin/renovate/microsoft
Update Microsoft to 5.9.0
2026-08-18 17:29:29 +02:00
Shadowghost 43cdbe856a More resilient MusicBrainz lookup 2026-08-18 11:07:31 +02:00
Cody Robibero 72405bb146 Merge pull request #17658 from martin-77/fix/child-count-sql-variable-limit
Fix SQLite variable limit in child count batches
2026-08-17 18:18:29 -04:00
renovate[bot] 2bb281ad4c Update Microsoft to 5.9.0 2026-08-17 19:07:58 +00:00
aleksantero a2ab2fe340 Translated using Weblate (Finnish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fi/
2026-08-17 17:56:58 +00:00
Blackspirits 7df3c09760 Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt/
2026-08-17 08:10:11 +00:00
Blackspirits d26d3f4967 Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt_PT/
2026-08-17 08:10:10 +00:00
Blackspirits 8718c00a5d Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt/
2026-08-17 07:55:04 +00:00
Blackspirits 0c68b190bc Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt_PT/
2026-08-17 07:55:04 +00:00
Thadah D. Denyse 2c26ae6724 Translated using Weblate (Basque)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/eu/
2026-08-17 07:49:17 +00:00
Emanuel Lopes 300c277816 Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt_PT/
2026-08-17 07:49:17 +00:00
nenadsuperzmaj 69b21ddc0e Translated using Weblate (Serbian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/sr/
2026-08-17 07:16:19 +00:00
Gallyam Biktashev 90a0e9d962 Translated using Weblate (Russian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ru/
2026-08-17 07:16:18 +00:00
martin-77 c539ee7e81 Fix SQLite variable limit in child count batches 2026-08-17 01:43:10 +02:00
Cody Robibero f97b7b120d Merge pull request #17655 from martin-77/fix/playlist-sql-variable-limits
Fix large playlist persistence with WhereOneOrMany
2026-08-16 18:53:43 -04:00
martin-77 7c148c3c7c Fix large playlist persistence 2026-08-16 21:30:37 +02:00
Bond-009 4fe980f25b Merge pull request #17614 from jellyfin/renovate/dotnet-monorepo
Update dependency dotnet-ef to v10.0.11
2026-08-16 16:51:32 +02:00
itsb f0c5370e27 Preserve unknown idle playback position 2026-08-16 09:09:18 -05:00
Andrea Baitelli 5f14c12c89 Translated using Weblate (Italian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/it/
2026-08-16 13:18:01 +00:00
Andrea Baitelli 49c78d4624 Translated using Weblate (Italian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/it/
2026-08-16 13:13:05 +00:00
Pedro Fonseca 1b698db422 Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt_PT/
2026-08-16 12:59:23 +00:00
Bond-009 97d3e2cba6 Merge pull request #17638 from jellyfin/renovate/microsoft
Update dependency Microsoft.NET.Test.Sdk to 18.9.0
2026-08-16 14:19:31 +02:00
Bond-009 4680d00d2e Merge pull request #17630 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v4.37.7
2026-08-16 13:48:16 +02:00
Ulrik 30c2603911 Translated using Weblate (Danish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/da/
2026-08-16 04:22:54 +00:00
Vitalijus a74246a000 Translated using Weblate (Lithuanian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/lt/
2026-08-15 20:59:10 +00:00
KecskeTech 1e04187b52 Translated using Weblate (Hungarian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hu/
2026-08-15 16:36:20 +00:00
itsb 499e64b1c3 Use client-reported position for idle playback cleanup 2026-08-14 23:31:39 -05:00
krvi 916c3c9cc3 Translated using Weblate (Faroese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fo/
2026-08-15 01:00:08 +00:00
VeryUsual f70e0563ee Translated using Weblate (Esperanto)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/eo/
2026-08-15 01:00:07 +00:00
AlaronAndes d2f517a858 Translated using Weblate (Albanian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/sq/
2026-08-15 01:00:07 +00:00
dodog 0ae4a70e1c Translated using Weblate (Slovak)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/sk/
2026-08-15 01:00:06 +00:00
Cody Robibero e80fc120bf Merge pull request #17636 from st7105/fix/clean-web-dl-release-tag
Recognize WEB-DL release tags in video names
2026-08-14 08:29:37 -04:00
Cody Robibero 6982ba99ce Merge branch 'master' into fix/clean-web-dl-release-tag 2026-08-14 07:11:04 -04:00
renovate[bot] 8cb7297e27 Update dependency Microsoft.NET.Test.Sdk to 18.9.0 2026-08-14 11:07:01 +00:00
renovate[bot] 95d95de6f1 Update github/codeql-action action to v4.37.7 2026-08-14 11:06:54 +00:00
renovate[bot] 7704346e9c Update dependency dotnet-ef to v10.0.11 2026-08-14 11:06:49 +00:00
Cody Robibero 6a021d5dae Merge pull request #17637 from IDisposable/fix/de-localization-test-error
Fix other two unit test for localization of Artists in DE
2026-08-14 07:05:50 -04:00
José Tojeiro 6ebe66c19d Translated using Weblate (Galician)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/gl/
2026-08-14 10:02:59 +00:00
Shadowghost 40a449c6f2 Count alternate versions in the media filters and align filter conditions 2026-08-14 08:46:21 +02:00
Shadowghost 06e37a7bf6 Merge remote-tracking branch 'upstream/master' into optimize-db-helper-memory 2026-08-14 08:09:38 +02:00
Shadowghost c77649d21e Skip alternate version links when resolving link parents 2026-08-14 07:39:49 +02:00
Vitalijus 8f97e690c8 Translated using Weblate (Lithuanian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/lt/
2026-08-14 04:01:38 +00:00
Marc Brooks b557dcfa45 Fix other two missing DE localization DE updates
Turns out there were two more instances of test broken by commit 21fec95b07
2026-08-13 22:31:42 -05:00
st7105 7b66b32cdf Recognize WEB-DL release tags in video names 2026-08-14 06:03:42 +03:00
Cody Robibero 7f3bbd5654 Merge pull request #17633 from IDisposable/chore/fix-de-localization-unit-test
Fix unit test for localization of Artists in DE
2026-08-13 18:37:14 -04:00
Marc Brooks a7c0c92019 Fix unit test for localization
DE localization for Artists was changed in localization commit 21fec95b07
2026-08-13 17:11:31 -05:00
Cody Robibero e1a619b79e Merge pull request #17615 from jellyfin/renovate/microsoft
Update Microsoft to 10.0.11
2026-08-13 16:27:06 -04:00
Cody Robibero 12226d2212 Merge pull request #17604 from theguymadmax/fix-FindArtists
Fix FindArtists
2026-08-13 16:26:48 -04:00
ZeroAiden ae8723026d Translated using Weblate (Malay)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ms/
2026-08-13 04:04:40 +00:00
Vitalijus a730d8a7ba Translated using Weblate (Lithuanian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/lt/
2026-08-12 23:27:15 +00:00
Psychotrickser 21fec95b07 Translated using Weblate (German)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/de/
2026-08-12 12:00:21 +00:00
Shadowghost 7e6709f023 Fix formatting 2026-08-12 08:48:42 +02:00
Shadowghost a4ff630d1f Fix English metadata blocking localized providers ranked below it 2026-08-12 08:39:00 +02:00
Shadowghost 9a07d4336b Make the media stream filter index covering 2026-08-12 08:16:09 +02:00
Shadowghost 2b5625d1c4 Resolve link owners from LinkedChildren 2026-08-12 08:16:03 +02:00
Shadowghost 9ae6ffe441 Share the SQLite fixture across the item tests 2026-08-12 08:15:55 +02:00
renovate[bot] 36fccdf6d4 Update Microsoft to 10.0.11 2026-08-12 04:43:32 +00:00
Bond-009 4e2fc33a61 Merge pull request #17551 from jellyfin/renovate/z440.atl.core-7.x
Update dependency z440.atl.core to 7.16.0
2026-08-11 18:17:55 +02:00
Shadowghost fa7fdf5884 Optimize query helper memory 2026-08-11 18:09:23 +02:00
renovate[bot] 2deb97bac3 Update dependency z440.atl.core to 7.16.0 2026-08-11 14:01:27 +00:00
theguymadmax 9220c2bd63 Fix FindArtists 2026-08-11 09:40:11 -04:00
Cody Robibero 6d501ba418 Merge pull request #17570 from Shadowghost/fix-ef-drift
Fix EF core designer drifts
2026-08-10 19:13:29 -04:00
Cody Robibero 2a8d168796 Merge pull request #17579 from Shadowghost/fix-removal-notification
Fix missing ItemRemoved events and search fallback after access filtering
2026-08-10 18:28:22 -04:00
Cody Robibero 34cc90f5e2 Merge pull request #17599 from Shadowghost/unbreak-master
Fix master build
2026-08-10 17:29:12 -04:00
Shadowghost 4e9713a032 Apply review suggestions 2026-08-10 23:10:33 +02:00
Shadowghost f82101332d Fix master build 2026-08-10 23:04:01 +02:00
Shadowghost 7b6ae06f3b Merge remote-tracking branch 'upstream/master' into safeguard-invalid-provider-ids 2026-08-10 23:03:52 +02:00
Shadowghost 26fbd1eac0 Fix master build 2026-08-10 22:46:31 +02:00
Cody Robibero 35e86416af Merge pull request #17576 from obiwantoby/perf/batch-mediasourcecount-dto
Bugfix: #17547 | Batching MediaSourceCount into one call
2026-08-10 16:15:54 -04:00
Cody Robibero c210ea87f2 Merge pull request #17597 from theguymadmax/fix-people-filtering
Fix PersonTypes not applied when filtering by person
2026-08-10 16:14:19 -04:00
Cody Robibero 4a1fcca182 Merge pull request #17582 from Shadowghost/fix-assemblies
Fix assemblies
2026-08-10 16:12:27 -04:00
Cody Robibero f5211a6722 Merge pull request #17590 from TOomaAh/fix/limit-remote-fetch-similar
fix: bound remote provider pagination
2026-08-10 16:12:11 -04:00
Cody Robibero 0b77a520fa Merge pull request #17588 from TOomaAh/fix/is-airing-filter
fix: correct IsAiring negation to exclude airing items
2026-08-10 16:11:30 -04:00
Cody Robibero d0e0e291f2 Merge pull request #17569 from vavallee/fix/17056-no-image-upscaling
Stop image endpoints from upscaling beyond the source resolution
2026-08-10 16:10:17 -04:00
Cody Robibero 82ecfde2f7 Update MediaBrowser.Controller/Drawing/ImageHelper.cs
Co-authored-by: Tim Eisele <Tim_Eisele@web.de>
2026-08-10 16:10:08 -04:00
Cody Robibero 7be16e9f74 Merge pull request #17563 from Shadowghost/cleanup-sql-helpers
Cleanup and simplify query helpers
2026-08-10 16:10:00 -04:00
theguymadmax f441c5f125 Fix PersonTypes not applied when filtering by person 2026-08-10 11:03:14 -04:00
hoanghuy309 e6e3099da9 Translated using Weblate (Vietnamese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/vi/
2026-08-10 10:46:24 +00:00
Kiki d7dd98858e Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt/
2026-08-10 10:46:24 +00:00
Dan Tsivinsky 3d3d3c26b8 Translated using Weblate (Russian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ru/
2026-08-10 10:46:23 +00:00
TOomaAh 5f3e938d09 fix: bound remote provider pagination 2026-08-09 17:18:54 +02:00
TOomaAh 3031aa91ba fix: correct IsAiring negation to exclude airing items 2026-08-09 16:28:20 +02:00
Vitalijus fb763c47bf Translated using Weblate (Lithuanian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/lt/
2026-08-08 21:55:48 +00:00
Doougfoks a65b614449 Translated using Weblate (Portuguese (Brazil))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt_BR/
2026-08-08 20:28:52 +00:00
brandon 505a6ebf8f Use WhereOneOrMany helper for the alternate version id filter
Filter the parent ids with the WhereOneOrMany query helper instead of a
raw Contains so the id list is wrapped in EF.Parameter and EF Core reuses
one compiled query plan across calls, matching how the rest of the item
queries build their id filters.
2026-08-08 15:20:39 -04:00
Shadowghost 8c4dfc0b71 Safeguard against invalid provider ids 2026-08-08 19:49:26 +02:00
brandon 10d108a1f4 Address review on MediaSourceCount batching
Rename GetItemsWithAlternateVersions to GetItemIdsWithAlternateVersions
across the interfaces and implementations since it returns ids. Return
the hashset straight from the query instead of materializing an array
first. Rename the DtoService guard to mayHaveAlternateVersions and
invert it so the computed path is the explicit case. Assert the media
source count value in the batch skip test and add a test covering an
item that is in the returned set still resolving to the correct count.
2026-08-08 12:33:11 -04:00
Shadowghost 428c0f19bc Fix bump_version script 2026-08-08 18:26:46 +02:00
Shadowghost afd91a3d9d Fix assemblies 2026-08-08 18:20:19 +02:00
queeup a0b291a463 Translated using Weblate (Turkish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/tr/
2026-08-08 16:14:51 +00:00
Thadah D. Denyse a9e4c826aa Translated using Weblate (Basque)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/eu/
2026-08-08 14:03:01 +00:00
hoanghuy309 b189813eb1 Translated using Weblate (Vietnamese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/vi/
2026-08-08 14:02:57 +00:00
queeup 7c20ea2708 Translated using Weblate (Turkish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/tr/
2026-08-08 14:02:53 +00:00
Shadowghost e63c05137a Fix missing ItemRemoved events and search fallback after access filtering 2026-08-08 10:59:37 +02:00
brandon c091ffdc6b Batch alternate version detection in DtoService to remove MediaSourceCount N+1
Browsing a page of videos with the MediaSourceCount field ran one alternate
version query per item, each opening a fresh DbContext. On a large library that
turned a single page into hundreds of sequential round trips and made the Items
endpoint take tens of seconds while holding a request thread the whole time.

Detect which videos own alternate versions once per page with a single query,
mirroring the existing people batch. Videos absent from that set have a single
media source, so the per item lookups are skipped for the common case. Behavior
is unchanged: a video with no alternates already resolved to a count of one.

Adds a regression test asserting the count resolves from the batch and the per
item lookups are never called.
2026-08-07 22:51:45 -04:00
Cody Robibero 70ffd25b50 Merge pull request #17560 from IDisposable/chore/pessimistic-reality-check
Add warning that PessimisticLockBehavior is unsafe
2026-08-07 21:43:40 -04:00
Cody Robibero 247ee406a9 Merge pull request #17571 from obiwantoby/perf/batch-people-dto
Batch people lookups when building item DTOs
2026-08-07 21:43:21 -04:00
Cody Robibero 2218f2931c Merge pull request #17492 from GOvEy1nw/fix/image-cache-overlay-key
fix(images): disambiguate progress overlay cache keys
2026-08-07 21:42:16 -04:00
Cody Robibero 6bc1c18004 Merge pull request #17541 from vdatanet/fix/byname-total-record-count
Fix by-name endpoints reporting TotalRecordCount=0 next to a populated Items array
2026-08-07 21:40:58 -04:00
Cody Robibero eee818094e Merge pull request #17525 from rlauuzo/master
Clear metadata provider cache when provider parts are registered
2026-08-07 21:40:22 -04:00
Cody Robibero 0ec7cc5f5b Merge pull request #17555 from IDisposable/fix/reorder-update-items
Delete old related info in bulk as late as possible in UpdateOrInsertItems
2026-08-07 21:40:11 -04:00
Cody Robibero 871970120d Merge pull request #17521 from Shadowghost/fix-plugin-disable
Fix disabled plugins being re-enabled on restart
2026-08-07 21:39:39 -04:00
Cody Robibero 59bef7940b Merge pull request #17559 from IDisposable/fix/optimistic-lock-behavior
Fix captured (and discarded) Execute exceptions
2026-08-07 21:39:30 -04:00
Cody Robibero 830d93e446 Merge pull request #17554 from IDisposable/fix/faster-update-items
Speed up UpdateOrInsertItems for related information
2026-08-07 21:39:10 -04:00
Cody Robibero d696cea9bc Merge pull request #17558 from IDisposable/fix/set-cache-to-private
Switch SQLite connection Cache to Private
2026-08-07 21:38:59 -04:00
queeup e83125c17c Translated using Weblate (Turkish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/tr/
2026-08-08 01:38:51 +00:00
Vitalijus c5da7db120 Translated using Weblate (Lithuanian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/lt/
2026-08-08 01:38:51 +00:00
Cody Robibero f9b7f2edf7 Merge pull request #17536 from gnattu/fix-concurrent-racing
Fix concurrent ffmpeg segment racing
2026-08-07 21:38:45 -04:00
Vitalijus 4192a4dd32 Translated using Weblate (Lithuanian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/lt/
2026-08-07 19:43:35 +00:00
Vitalijus 84ffe668d0 Translated using Weblate (Lithuanian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/lt/
2026-08-07 19:25:33 +00:00
brandon d6da6906a4 Batch people lookups when building item DTOs
GetBaseItemDtos already batch fetches user data, child counts, played counts
and artists before its per item loop, but AttachPeople still ran one GetPeople
query per item. Rendering a page of items (for example a large playlist) fired
one extra query per row.

Add GetPeopleByItems to IPeopleRepository, which reads every requested item in a
single query over the people mapping table and returns full PersonInfo (role,
type and sort order) grouped by item id. GetBaseItemDtos prefetches this once
when the People field is requested and passes it into AttachPeople, which reads
from the batch instead of querying per item. The single item GetBaseItemDto path
keeps its existing per item behaviour when no batch is supplied.

Adds a DtoService test asserting people resolve from the batch and the per item
GetPeople is never called.
2026-08-07 11:59:17 -04:00
Shadowghost b7e2d21038 Fix EF core designer drifts 2026-08-07 17:51:14 +02:00
vavallee e120b7f2dd Stop image endpoints from upscaling beyond the source resolution
ImageHelper.GetNewImageSize passed the caller-supplied width/height straight
through to SkiaEncoder.EncodeImage, which allocates an SKImageInfo of exactly
that size. Nothing bounded those values against the source image, so a request
like Items/<id>/Images/Primary?width=23100&height=23100 made the server allocate
and resample a 23100x23100 surface from, say, a 600x336 poster: the reporter
measured 100% of a core for 10-15 minutes and 6-12 GB resident per request.
The item images endpoints do not require authentication, so any caller who knows
an item id can trigger this, and varying the size by one pixel misses the cache
every time.

Add DrawingUtils.ScaleDownToFit, which scales a size down uniformly until it
fits inside a bounding box and returns it unchanged if it already does, and
apply it in GetNewImageSize against the original image dimensions. Requests
that ask for more pixels than the source now get the source resolution back,
scaled to the requested aspect ratio. Downscaling paths are untouched, and
DrawingUtils.Resize keeps its existing behaviour for the transcoding callers in
EncodingJobInfo and StreamInfo, which legitimately size video output.
ResizeFill already refused to upscale; this makes width/height consistent
with fillWidth/fillHeight.

Fixes #17056.
2026-08-07 12:33:37 -03:00
Vitalijus 6c37a6ef8b Translated using Weblate (Lithuanian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/lt/
2026-08-07 11:11:10 +00:00
Shadowghost 9162c17834 Apply review suggestions 2026-08-07 07:23:50 +02:00
Vitalijus 929834c982 Translated using Weblate (Lithuanian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/lt/
2026-08-06 19:11:07 +00:00
Shadowghost 5b3da3bcd7 Cleanup and simplify query helpers 2026-08-06 12:42:53 +02:00
Keleti Márton 4860f945a7 Translated using Weblate (Hungarian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hu/
2026-08-06 09:43:17 +00:00
simonanter 9f74fd7354 Translated using Weblate (German)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/de/
2026-08-06 09:43:16 +00:00
Marc Brooks 1c5c95ad1d Move the deletion of old related info to just before the save
This makes the deletion of BaseItemProviders, BaseItemImageInfos, and BaseItemMetadataFields happen in batch as  a contiguous block so the lock isn't held across items, just before the bulk SaveChanges.
2026-08-06 01:00:17 -05:00
Marc Brooks dd81e52f81 Add warning that PessimisticLockBehavior is unsafe
Since it uses ReaderWriterLockSlim, it gets tripped up if the transaction
is continued across an await boundary on a different thread.
2026-08-06 00:52:34 -05:00
Marc Brooks 868ad089f8 Fix captured (and discarded) Execute exceptions
Using ExecuteAndCapture (and the async version) requires something to manage the captured exception, which we don't do. Errors would be silently dropped and the writes/deletes treated as if they succeeded.
2026-08-06 00:44:51 -05:00
Marc Brooks 2a08a30982 Switch SQLite connection Cache to Private
If left at Default,  sqlite3_enable_shared_cache is process-global, so a plugin enabling it makes these connections share a cache too.
Contention then surfaces as SQLITE_LOCKED ("database table is locked"), which the busy handler does not cover,  busy_timeout is skipped and the command fails at CommandTimeout instead.
2026-08-06 00:36:01 -05:00
Marc Brooks 812c819162 Speed up search for existing item values
Replace the O(n²)  array .First scan with a dictionary lookup
2026-08-05 22:48:26 -05:00
Marc Brooks 234a49903b Use a HashSet for existing items
Makes the test O(log n)
2026-08-05 22:48:13 -05:00
Cody Robibero cd5962df50 Merge pull request #17315 from Florin-Popescu/replaygain-missing-tags
Parse ReplayGain album gain field
2026-08-05 19:04:05 -04:00
krvi 9d99164c19 Translated using Weblate (Faroese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fo/
2026-08-05 22:41:37 +00:00
Kityn 2db10787af Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pl/
2026-08-05 22:41:34 +00:00
Luis Fernando Illapa 614e5c7912 Translated using Weblate (Spanish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es/
2026-08-05 22:41:27 +00:00
Cody Robibero 17b0453cfb Merge pull request #17466 from Shadowghost/fix-byname-queries
Improve People deduplication, fix search and restrict ItemByName responses
2026-08-05 18:39:55 -04:00
Cody Robibero d5a5b56484 Merge pull request #17537 from vdatanet/fix/pcm-wav-transcode
Fix PCM audio transcoding to wav returning HTTP 500 and headerless output
2026-08-05 18:39:42 -04:00
Cody Robibero ef1ce3d6eb Merge pull request #17549 from theguymadmax/revert-livetv-channel-icon-refresh
Revert "Refresh Live TV channel icons on every guide update."
2026-08-05 18:38:51 -04:00
Cody Robibero 07fb350333 Merge pull request #17524 from Shadowghost/fix-extra-discovery
Keep folder extras with the item that owns the folder
2026-08-05 18:38:31 -04:00
theguymadmax f49a501f71 Revert "Refresh Live TV channel icons on every guide update."
This reverts commit 372c1681d8.
2026-08-05 14:02:28 -04:00
Bond-009 f6ca06e9bf Merge pull request #17507 from jellyfin/renovate/sharpcompress-0.x
Update dependency SharpCompress to 0.50.4
2026-08-05 18:07:52 +02:00
renovate[bot] ef84408199 Update dependency SharpCompress to 0.50.4 2026-08-05 15:55:11 +00:00
Luis Fernando Illapa 0db3759325 Translated using Weblate (Spanish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es/
2026-08-05 15:54:13 +00:00
rimasx df1611cf95 Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/et/
2026-08-05 15:54:13 +00:00
Dan Johansen a6d09815f2 Translated using Weblate (Danish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/da/
2026-08-05 15:54:13 +00:00
Helak 38aa870514 Translated using Weblate (Czech)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/cs/
2026-08-05 15:54:13 +00:00
Bond-009 d13c65229d Merge pull request #17493 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v4.37.6
2026-08-05 17:54:07 +02:00
Shadowghost 61e75599b3 Project the lowered person credit values once when updating people 2026-08-05 13:21:57 +02:00
Shadowghost b2485af6e9 Merge remote-tracking branch 'upstream/master' into fix-byname-queries
# Conflicts:
#	Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
2026-08-05 12:15:30 +02:00
vdatanet 4adaf7f146 Fix by-name endpoints reporting TotalRecordCount=0 next to a populated Items array
`GetItemValues` -- the shared path behind `/Artists`, `/AlbumArtists`, `/Genres`,
`/MusicGenres` and `/Studios` -- disabled the total record count whenever the
query carried no `Limit`:

    if (!filter.Limit.HasValue)
    {
        filter.EnableTotalRecordCount = false;
    }

A request without an explicit limit therefore came back with N entries in `Items`
and `TotalRecordCount = 0`. Clients that page on the reported total -- the
documented contract every other list endpoint honours -- read that as an empty
library. `/Items` and `/Persons` do not share this path and report the count
correctly, which is what makes the inconsistency visible from the outside.

Measured against master with a 62-track music library:

    GET /Artists?UserId=...              -> TotalRecordCount=0  Items=5
    GET /Artists?UserId=...&limit=100    -> TotalRecordCount=5  Items=5

Dropping the block costs nothing: `representativeIds` is materialised into a
`List<Guid>` a few lines below regardless, so `.Count` was already available and
the count is now reported from it. Callers that genuinely want to skip the count
still can -- `EnableTotalRecordCount = false` is honoured as before.

The block also mutated the caller's own query object, so a query instance reused
across calls silently lost its total after the first limitless one. That is
covered by a test as well.
2026-08-05 11:34:33 +02:00
krvi 563a00faaa Translated using Weblate (Faroese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fo/
2026-08-05 01:46:45 +00:00
krvi 5e33a2d376 Translated using Weblate (Faroese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fo/
2026-08-04 22:40:18 +00:00
Cody Robibero d9d9efc96e Merge pull request #17523 from Shadowghost/fix-resume-container-folders
Only treat series and seasons as resumable folders
2026-08-04 18:01:13 -04:00
Vitalijus dd1380e562 Translated using Weblate (Lithuanian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/lt/
2026-08-04 21:58:15 +00:00
Translation expert cfb00b58a2 Translated using Weblate (Arabic)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ar/
2026-08-04 21:58:15 +00:00
Cody Robibero 990ab18353 Merge pull request #17528 from Shadowghost/websocket-logs-debug
Degrade ForceKeepAlive logs to debug
2026-08-04 17:58:09 -04:00
vdatanet 3578e9a332 Fix PCM audio transcoding to wav returning HTTP 500 and headerless output
`GetProgressiveAudioFullCommandLine` forced the raw PCM muxer and a bogus
sample rate whenever the audio encoder was `pcm_*`, regardless of the
container the client asked for. Two separate failures came out of it:

- `-ar ` + `state.BaseRequest.AudioBitRate` used a *bitrate* as a *sample
  rate*, and `AudioBitRate` is optional. When it is absent the argument
  degrades to a bare `-ar`, ffmpeg aborts with `Expected number for ar but
  found: -ar` / `Error opening output files: Invalid argument` (exit 234)
  and the request fails with HTTP 500. Every `GET /Audio/{id}/stream.wav`
  that does not carry an explicit `AudioBitRate` hits this.
  The sample rate was already being set correctly a few lines below from
  `OutputAudioSampleRate`, so the line is dropped rather than repaired.

- `-f s16le` overrode the muxer even for a real container. A request that
  did supply a bitrate (`/Audio/{id}/universal` passes
  `MaxStreamingBitrate`) survived the first bug but produced raw headerless
  samples served under an `audio/wav` content type, so clients saw a body
  with no RIFF header. The raw muxer is now only forced when the requested
  container is actually raw PCM, which keeps the I2S/MCU route from #10321
  working.

Also drop the `containerInternal = ".pcm"` assignment in
`StreamingHelpers.GetStreamingState`: it is written after
`state.OutputContainer` has already been read from the same variable and is
never read again, so it has no effect and only obscures where the output
container comes from.

Verified against ffmpeg 8.1.2 with a 96 kHz FLAC source: before, the wav
command line exits 234; after, it produces a valid `RIFF/WAVE` 48 kHz stereo
`pcm_s16le` file, while the raw `.pcm` route still yields exactly
2 s x 48000 x 2ch x 2 B = 384000 bytes of headerless samples.
2026-08-04 19:52:29 +02:00
renovate[bot] f60cfc788b Update github/codeql-action action to v4.37.6 2026-08-04 16:41:10 +00:00
gnattu e2586eed9b Fix concurrent ffmpeg segment racing
This is a nasty one. The failure mode is:

1. Request A started FFmpeg and waited for a segment.
2. Request B requested an earlier or far away segment.
3. Jellyfin thought FFmpeg should to restart at a different position.
4. Request B killed the existing transcoding job.
5. Killing that job cancelled the same token request A was using.
6. The cancellation produced http 500 to request A.

To fix this:

we lock transcoding job state changes and segment handling per playlist, and use a thread safe counter to track how many http responses are still using each job’s segments. A job is only stopped or replaced once that counter reaches zero.
2026-08-05 00:33:42 +08:00
Shed Shedson 7fbc1ff8c0 Translated using Weblate (Icelandic)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/is/
2026-08-04 11:29:56 +00:00
Yunseo Jung 5767a3a800 Translated using Weblate (Korean)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ko/
2026-08-04 11:29:55 +00:00
Vincenzo Reale 4b51ef2c2f Translated using Weblate (Italian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/it/
2026-08-04 11:29:55 +00:00
krvi f50fc0fa86 Translated using Weblate (Faroese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fo/
2026-08-03 23:01:06 +00:00
potuzhnyj a817391f67 Translated using Weblate (Ukrainian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/uk/
2026-08-03 23:01:06 +00:00
Erik W cc877229b1 Translated using Weblate (Swedish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/sv/
2026-08-03 23:01:05 +00:00
Vitalijus a3e7024355 Translated using Weblate (Lithuanian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/lt/
2026-08-03 23:01:04 +00:00
Shadowghost d3c7aa6bd2 Fix /Persons favourites timing out by removing the correlated favourites join 2026-08-04 00:40:53 +02:00
Shadowghost 40601523e7 Degrade ForceKeepAlive logs to debug 2026-08-03 21:30:22 +02:00
krvi e3664a9561 Translated using Weblate (Faroese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fo/
2026-08-03 18:59:02 +00:00
nextlooper42 a1ed4b9001 Translated using Weblate (Slovak)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/sk/
2026-08-03 18:59:02 +00:00
Vincenzo Reale e09492de62 Translated using Weblate (Italian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/it/
2026-08-03 18:59:01 +00:00
myrad2267 d10381a0e2 Translated using Weblate (French)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fr/
2026-08-03 18:59:01 +00:00
myrad2267 9596115c45 Translated using Weblate (French (Canada))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fr_CA/
2026-08-03 18:59:00 +00:00
Translation expert ed0be243e9 Translated using Weblate (Arabic)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ar/
2026-08-03 18:58:59 +00:00
Shadowghost f502fd312e Fix test 2026-08-03 15:29:32 +02:00
rlauuzo 9d0dffe818 Clear metadata provider cache when provider parts are registered
AddParts replaces _metadataProviders but left _metadataProviderCache
holding provider arrays from the previous registration. Invalidate the
cache so repeated AddParts calls cannot serve stale providers, and give
the previously uncalled ClearMetadataProviderCache its intended caller.
2026-08-03 11:56:08 +02:00
Shadowghost 4e2089b6a1 Keep folder extras with the item that owns the folder 2026-08-03 10:50:33 +02:00
Shadowghost 55518c06ee Only treat series and seasons as resumable folders 2026-08-03 09:01:55 +02:00
Shadowghost a272efb9a2 Fix disabled plugins being re-enabled on restart 2026-08-03 08:48:09 +02:00
Robin 33a8cdfc0b Translated using Weblate (Spanish (Latin America))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es_419/
2026-08-03 06:20:33 +00:00
Robin 38c6c5b478 Translated using Weblate (Spanish (Mexico))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es_MX/
2026-08-03 06:20:32 +00:00
Robin d759df03b5 Translated using Weblate (Spanish (Argentina))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es_AR/
2026-08-03 06:20:31 +00:00
Kaz e2c1121079 Translated using Weblate (German)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/de/
2026-08-03 06:20:29 +00:00
無情天 fe3585577b Translated using Weblate (Chinese (Simplified Han script))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hans/
2026-08-03 01:53:49 +00:00
Bas b3a0611302 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2026-08-02 20:18:33 +00:00
Gargotaire c20cc766e1 Translated using Weblate (Catalan)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ca/
2026-08-02 20:18:33 +00:00
Shadowghost 8044534774 Merge remote-tracking branch 'upstream/master' into fix-byname-queries 2026-08-02 22:12:57 +02:00
Bas cac463d4c3 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2026-08-02 18:49:57 +00:00
Bas 7faa35dab4 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2026-08-02 18:49:28 +00:00
Cody Robibero 24022092ad Merge pull request #17456 from Shadowghost/fix-extras
Fix extras naming and version assignment
2026-08-02 14:25:00 -04:00
Cody Robibero e2e3094d2d Merge pull request #17512 from altqx/libbitsub
Allow client-rendered graphical subtitles during remux
2026-08-02 14:24:51 -04:00
Cody Robibero d669994bf0 Merge pull request #17503 from theguymadmax/fix-sortby-name
Use CleanName when sorting by name
2026-08-02 14:24:28 -04:00
Cody Robibero 45b8f6c4c8 Merge pull request #17486 from Shadowghost/fix-adjacent
Fix AdjacentTo being ignored on non-recursive item queries
2026-08-02 14:24:13 -04:00
Cody Robibero 044f651299 Merge pull request #17482 from Shadowghost/fix-stale-versions
Fix video version links being read from stale serialised item data instead of the LinkedChildren table
2026-08-02 14:24:05 -04:00
Cody Robibero f865910a90 Merge pull request #17298 from WizardOfYendor1/fix/livetv-published-stream-urls
Fix Live TV returning unreachable "server-local" streaming URLs to clients.
2026-08-02 14:23:49 -04:00
Cody Robibero f2360c07a3 Merge pull request #17147 from Shadowghost/tmdb-missing-episodes
Add Tmdb missing episode provider
2026-08-02 14:23:30 -04:00
Shadowghost 4c812c9ba4 Switch to opt-in 2026-08-02 18:02:57 +02:00
krvi 26261dbfe7 Translated using Weblate (Faroese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fo/
2026-08-02 01:08:15 +00:00
krvi ae90e0e52e Translated using Weblate (Faroese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fo/
2026-08-01 22:58:15 +00:00
krvi 72d0895401 Translated using Weblate (Faroese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fo/
2026-08-01 22:10:09 +00:00
Shadowghost 705368ee49 Merge remote-tracking branch 'upstream/master' into fix-byname-queries
# Conflicts:
#	src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/JellyfinDbModelSnapshot.cs
2026-08-01 21:41:16 +02:00
Shadowghost cbc2c7c323 Preserve multiple roles per person type instead of deduping credits by name and type 2026-08-01 20:35:27 +02:00
Weblate e16c8a07bd Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/
2026-08-01 18:21:52 +00:00
krvi a7a138db31 Translated using Weblate (Faroese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fo/
2026-08-01 18:21:48 +00:00
krvi 76956c0abc Translated using Weblate (Faroese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fo/
2026-08-01 17:49:28 +00:00
altqx d4376e0539 Allow client-rendered graphical subtitles during remux 2026-08-01 22:49:34 +07:00
Shadowghost b94ba9d409 Merge remote-tracking branch 'upstream/master' into tmdb-missing-episodes
# Conflicts:
#	Jellyfin.Server.Implementations/Item/BaseItemRepository.QueryBuilding.cs
2026-08-01 14:25:20 +02:00
Cody Robibero 744ca84a8b Merge pull request #17500 from theguymadmax/fix-storage-lookup
Fix storage info lookup for Windows
2026-08-01 08:18:45 -04:00
Cody Robibero c55fde25a5 Merge pull request #17501 from alchemyyy/fix/skip-sidx-fmp4-hls
Skip SIDX in fMP4 HLS segments
2026-08-01 08:07:42 -04:00
Cody Robibero 030031dcff Merge pull request #17463 from Shadowghost/fix-unplayed-filter
Fix (Un)Played filter correctness and performance
2026-08-01 08:07:05 -04:00
Cody Robibero 341c19bace Merge pull request #17460 from Shadowghost/fix-user-items
Queue person metadata refresh instead of blocking the item request and fix ItemCounts
2026-08-01 08:06:46 -04:00
Cody Robibero e3a8d209b4 Merge pull request #17455 from Shadowghost/fix-migrations
Reevaluate pending migrations after each one instead of per stage
2026-08-01 08:06:33 -04:00
Cody Robibero e816870f67 Merge pull request #17416 from Shadowghost/enable-duplicate-playlist-children
Allow duplicate LinkedChildren for Playlists
2026-08-01 08:06:02 -04:00
theguymadmax f28acc7fa1 Use CleanName when sorting by name 2026-07-31 00:34:43 -04:00
krvi b2ae39e0d9 Translated using Weblate (Faroese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fo/
2026-07-31 02:19:10 +00:00
alchemyyy 893662ba50 Skip SIDX in fMP4 HLS segments
Prevent FFmpeg's SIDX path from rewriting open-GOP boundary packet timestamps. HLS uses the media playlist for segment indexing and does not require the SIDX box.
2026-07-30 17:19:45 -07:00
theguymadmax 314004bc19 Fix storage lookup for Windows 2026-07-30 19:13:32 -04:00
GOvEy1nw 0915a61c19 fix(images): narrow cache path test seam 2026-07-30 09:20:01 +01:00
Shadowghost e123a13e38 Apply the by-name access exemption in the search candidate query 2026-07-30 09:53:44 +02:00
krvi b15d3c9ad3 Translated using Weblate (Faroese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fo/
2026-07-30 02:32:30 +00:00
GOvEy1nw 3da05330b2 fix(images): disambiguate progress overlay cache keys 2026-07-29 17:37:36 +01:00
Shadowghost 8293eb26b9 Fix playlist entries being lost on migration and library scans 2026-07-29 14:40:49 +02:00
Shadowghost d8fc0a9914 Fix AdjacentTo being ignored on non-recursive item queries 2026-07-29 13:13:44 +02:00
Shadowghost 1f4f4acb46 Fixup 2026-07-29 09:39:04 +02:00
Shadowghost d64e18b69a Fix more filter cases 2026-07-29 09:35:20 +02:00
Shadowghost 7a4271c85f Fix video version links being read from stale serialised item data instead of the LinkedChildren table 2026-07-29 07:31:27 +02:00
Paroc afb716566d Translated using Weblate (Occitan)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/oc/
2026-07-29 00:32:44 +00:00
Cody Robibero e5c68e1257 Merge pull request #17424 from Shadowghost/add-audiodb-search
Implement AudioDb artist search
2026-07-28 19:15:20 -04:00
Shadowghost a94588497c Fix Folder access filtering 2026-07-28 23:13:10 +02:00
Shadowghost 4cedbe28e3 Apply review suggestion 2026-07-28 22:18:18 +02:00
Shadowghost 9a258c089d Restrict people, genres, studios and artists to names backed by an item the user can access 2026-07-28 21:28:56 +02:00
Bond-009 9ff92f3f0d Merge pull request #17461 from jellyfin/renovate/actions-stale-11.x
Update actions/stale action to v11
2026-07-28 20:21:00 +02:00
Shadowghost 5f5c71ab75 Make the /Persons de-duplication use an index instead of grouping the table 2026-07-28 20:18:02 +02:00
Bond-009 d92e59aa72 Merge pull request #17459 from jellyfin/renovate/ci-deps
Update danielpalme/ReportGenerator-GitHub-Action action to v5.5.11
2026-07-28 20:11:33 +02:00
Bond-009 d593436281 Merge pull request #17448 from jellyfin/renovate/fscheck.xunit.v3-3.x
Update dependency FsCheck.Xunit.v3 to 3.3.4
2026-07-28 20:10:35 +02:00
Bond-009 41b8bd4459 Merge pull request #17310 from TowyTowy/fix/format3d-trailing-token
Fix 3D format detection when the tag is the last token of the path
2026-07-28 20:05:51 +02:00
Florin Popescu f6f0fed2d1 skip album ReplayGain parsing if no album or value already present 2026-07-28 19:53:50 +02:00
Florin Popescu e2adf2e2bf added null checks 2026-07-28 19:53:50 +02:00
Florin Popescu 78b535b229 parse replaygain reference loudness & album gain fields 2026-07-28 19:53:50 +02:00
David Wagener 7215950bd4 Translated using Weblate (Luxembourgish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/lb/
2026-07-28 16:27:52 +00:00
Natawan Jongnetiwisit c435f63d09 Translated using Weblate (Thai)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/th/
2026-07-28 16:27:49 +00:00
Shadowghost eed664b7d3 Fix played/unplayed filter for empty Series and BoxSets 2026-07-28 12:43:12 +02:00
David Wagener 5b550517b2 Translated using Weblate (Luxembourgish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/lb/
2026-07-28 08:36:53 +00:00
krvi e565073fd5 Translated using Weblate (Faroese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fo/
2026-07-28 08:36:53 +00:00
renovate[bot] 2b93191714 Update actions/stale action to v11 2026-07-28 03:41:28 +00:00
Shadowghost 046225654a Queue person metadata refresh instead of blocking the item request and fix ItemCounts 2026-07-27 23:09:30 +02:00
renovate[bot] 0db27d7b1b Update danielpalme/ReportGenerator-GitHub-Action action to v5.5.11 2026-07-27 20:08:23 +00:00
Shadowghost f571cd5a6a Reevaluate pending migrations after each one instead of per stage 2026-07-27 12:35:59 +02:00
Shadowghost 79a55327dc Fix extras naming and version assignment 2026-07-27 12:12:17 +02:00
Cody Robibero dbc796b0b0 Merge pull request #16409 from elio42/fix/create_library_thumbs_on_first_scan
Fix missing collection folder posters after initial scans.
2026-07-26 16:19:25 -04:00
Cody Robibero 02d8e7d828 Merge pull request #17417 from Shadowghost/series-merge-fixes
Fix series merging
2026-07-26 16:19:11 -04:00
Cody Robibero 1e4d126cb9 Merge pull request #17422 from Shadowghost/performance
Reduce correlated subqueries to improve query performance
2026-07-26 16:18:49 -04:00
Shadowghost f3a1d56c56 Use DistinctBy where possible 2026-07-26 09:56:49 +02:00
renovate[bot] 67b8684f3c Update dependency FsCheck.Xunit.v3 to 3.3.4 2026-07-26 00:07:59 +00:00
Shed Shedson b04614e18d Translated using Weblate (Icelandic)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/is/
2026-07-25 18:33:24 +00:00
Cody Robibero 689a90d275 Merge pull request #17443 from jellyfin/renovate/sharpcompress-0.x
Update dependency SharpCompress to 0.50.1
2026-07-25 14:05:03 -04:00
Shadowghost 766be1e8bb Fix favorite filter performance 2026-07-25 19:09:39 +02:00
Shadowghost f2f66606d7 Fix DatePlayed sorting performance 2026-07-25 19:09:39 +02:00
renovate[bot] 949fa4b513 Update dependency SharpCompress to 0.50.1 2026-07-25 16:53:47 +00:00
Cody Robibero 40fa2fd390 Merge pull request #17442 from Shadowghost/fix-numbers-in-episode-names
Fix hyphenated numbers in episode titles parsed as multi-episodes
2026-07-25 12:53:38 -04:00
Cody Robibero 7f26bd1091 Merge pull request #17399 from Shadowghost/fix-extra-year
Fix incorrect year on local trailers
2026-07-25 12:52:51 -04:00
Cody Robibero 86ac1aaa6b Merge branch 'master' into fix/create_library_thumbs_on_first_scan 2026-07-25 12:52:11 -04:00
Shadowghost 3c9727d36c Always inherit from owner item and add tests 2026-07-25 17:17:30 +02:00
Shadowghost 5a2809e337 Fix TmdbMissingEpisodeProvider 2026-07-25 16:25:48 +02:00
Shadowghost d1d89dfb12 Fix hyphenated numbers in episode titles parsed as multi-episodes 2026-07-25 16:21:26 +02:00
Cody Robibero 45ec0ed8b5 Merge pull request #17437 from dkanada/ogg-formats
remove ogg from video extensions since it should only be used for audio
2026-07-25 09:17:42 -04:00
Cody Robibero ebb66f6ca3 Merge pull request #17395 from paoloantinori/fix/userdata-null-user-nre-master
Avoid NRE when sorting by user-dependent keys without a user
2026-07-25 08:38:43 -04:00
krvi b85c9186ef Translated using Weblate (Faroese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fo/
2026-07-25 11:40:34 +00:00
Suyash Mittal c606102f6d Translated using Weblate (Hindi)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hi/
2026-07-25 11:40:33 +00:00
Paolo Antinori 8b70582561 Remove added comments (#17395 review) 2026-07-25 12:50:32 +02:00
dkanada b62fef3c1f remove ogg from video extensions since it should only be used for audio 2026-07-25 14:10:30 +09:00
Cody Robibero 71ab342838 Merge pull request #17423 from Shadowghost/fix-comicinfo
Skip ComicInfo parsing if none exists
2026-07-24 21:43:34 -04:00
Cody Robibero 83c4681e99 Merge pull request #17234 from Eneo-org/fix/syncplay-playqueue-index
Fix play queue index handling in SyncPlay
2026-07-24 21:35:49 -04:00
Cody Robibero 42e52f60ad Merge pull request #17402 from Shadowghost/clean-forced-sort-name
Apply cleaning logic on ForcedSortName
2026-07-24 21:34:37 -04:00
Cody Robibero 6ac64c5319 Merge pull request #17419 from rwebster85/mp4-audio-subtitle-names
Check the "name" tag for audio/subtitle probe to fix MP4 not showing correctly - Fixes issue #17418
2026-07-24 21:30:54 -04:00
Cody Robibero 83e0cfd7ee Merge pull request #17430 from jellyfin/drain-stderr
Drain stderr and stdout concurrently for encoder validation
2026-07-24 21:29:28 -04:00
Cody Robibero 700e53a807 Merge pull request #17411 from mbastian77/perf/session-manager-tolist
perf: avoid unnecessary list allocation in CheckForIdlePlayback
2026-07-24 21:28:55 -04:00
Shadowghost 4d1f90b2f7 Don't pull MusicBrainz Annotations into overview 2026-07-24 19:38:38 +02:00
gnattu d74babd8f3 Drain stderr and stdout concurrently for encoder validation
Some ffmpeg build might output extremely long traces for its banner that consume all pipe capacity and hangs the process. We have to drain both streams regardless on which one we actually read.
2026-07-24 20:01:01 +08:00
Shadowghost b7b2700425 Fix MusicBrainz Metadata fetching 2026-07-23 23:07:58 +02:00
Shadowghost 04e4505402 Fix AudioDB metadata fetching 2026-07-23 22:54:26 +02:00
Shadowghost 95330223f4 Speedup migration 2026-07-23 22:38:45 +02:00
Shadowghost f28fa563c9 Guard against blank names 2026-07-23 22:16:47 +02:00
Shadowghost d6ce6ae8b9 Skip ComicInfo parsing if none exists 2026-07-23 22:08:04 +02:00
Shadowghost 8f57f35372 Implement AudioDb artist search 2026-07-23 21:21:28 +02:00
Shadowghost 9aa79682ba Reduce correlated subqueries to improve performance 2026-07-23 20:50:06 +02:00
Shadowghost d4cddb8a5d Fix series merging 2026-07-23 14:03:13 +02:00
Shadowghost dc300fae53 Allow duplicate LinkedChildren for Playlists 2026-07-23 13:41:51 +02:00
Richard Webster 70980f09de Update contributors 2026-07-23 11:59:43 +01:00
Richard Webster ca0cf763ff Update comment 2026-07-23 11:57:34 +01:00
Richard Webster 3d4c52092e Clarify comment about MP4 track title workaround 2026-07-23 10:13:04 +01:00
mbastian77 fc0af10509 Avoid unnecessary list allocation in CheckForIdlePlayback 2026-07-23 03:25:58 +02:00
renovate[bot] 88216e0ec4 Update github/codeql-action action to v4.37.3 (#17398)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-22 19:46:55 +02:00
Richard Webster 474ae50c36 Check the "name" tag, not just "title" 2026-07-22 18:00:18 +01:00
Shadowghost 929e1936eb Apply cleaning logic on ForcedSortName 2026-07-22 08:30:29 +02:00
Shadowghost 6382563440 Prefer null checks over HasValue everywhere 2026-07-22 08:09:33 +02:00
Shadowghost 733b4ba73a Prefer null checks over HasValue 2026-07-22 08:09:15 +02:00
Paolo Antinori 5d580abb08 fix: avoid NRE when sorting by user-dependent keys without a user
A query sorted by a user-dependent key (PlayCount, IsFavoriteOrLiked,
DatePlayed, IsPlayed, IsUnplayed) but carrying no User caused a
NullReferenceException inside UserDataManager.GetUserData, surfacing as
"Failed to compare two elements in the array" (InvalidOperationException
wrapping the NRE from the LINQ sort) and 500-ing the /Items request.

Root cause: LibraryManager.GetComparer assigned comparer.User = user
without a null guard, so PlayCountComparer.GetValue called
UserDataManager.GetUserData(null, item), dereferencing user.Id.

Two-part fix:
- LibraryManager.GetComparer: when user is null and the sort key requires a
  user (IUserBaseItemComparer), substitute the SortName comparer so the
  result stays deterministic instead of 500-ing. SortName is the project's
  canonical tiebreaker (ItemsController injects it for album-by-artist).
- UserDataManager.GetUserData: ArgumentNullException.ThrowIfNull(user) as
  defense in depth (matches the existing guards on the SaveUserData
  overloads in the same file). On master this overload was rewritten to use
  ResolveUserDataRow, so the NRE dereferences user.Id rather than
  user.InternalId as on the release branch — same bug, different line.

Also fixes DateLastMediaAddedComparer being statically mis-tagged as
IUserBaseItemComparer: its GetDate is static and never reads User, so it
does not need one. Without this, the SortName fallback above would wrongly
engage for DateLastContentAdded on anonymous queries (returning SortName
order instead of date order). Re-tagged to IBaseItemComparer and dropped the
unused User/UserManager/UserDataManager properties.

Tests:
- UserDataManagerTests.GetUserData_NullUser_ThrowsArgumentNullException:
  reproduces the crash (NRE -> now ArgumentNullException). Added to master's
  existing UserDataManagerTests.
- LibraryManagerSortTests.Sort_UserDependentKey_NullUser_FallsBackToSortNameWithoutThrowing:
  Sort with a user-dependent key + null user no longer throws and returns
  items ordered by the SortName fallback (direction preserved).
- LibraryManagerSortTests.Sort_DateLastContentAdded_NullUser_OrdersByDateNotSortName:
  guards that DateLastContentAdded still sorts by date with no user (fixture
  chosen so date-desc and SortName-desc disagree, so a revert is caught).

Full Jellyfin.Server.Implementations.Tests suite: 642 passed, 0 failed.

Fixes #17393
2026-07-22 07:43:58 +02:00
Cody Robibero fc43f151a2 Merge pull request #17227 from altqx/master
Match VobSub MKS subtitle profiles by container
2026-07-21 20:47:02 -04:00
Cody Robibero 526f4051e9 Merge pull request #16980 from TheMelmacian/feature/library_specific_language_filter_values
Improve language filters to only fetch language codes that match the requested items/libraries (follow up to #9787)
2026-07-21 20:43:31 -04:00
Cody Robibero 635fd0433d Merge pull request #17370 from zerafachris/fix/item-update-null-optional-fields
fix: don't throw ArgumentNullException on partial UpdateItem payloads (#17366)
2026-07-21 18:17:22 -04:00
Cody Robibero 370170bab0 Merge pull request #17369 from Shadowghost/harden-startup-wizard
Prevent unauthenticated re-run of the startup wizard on misconfiguration
2026-07-21 18:17:08 -04:00
TheMelmacian b317af0d30 fix: remove obsolete code 2026-07-21 22:20:07 +02:00
Shadowghost ca1f7af445 Fix incorrect year on local trailers 2026-07-21 20:27:04 +02:00
Cody Robibero 65836cc844 Merge pull request #17160 from 854562/truncate-language-strings
Truncate ISO-639-2 language display names at first delimiter
2026-07-21 11:22:32 -04:00
aivarsse b4090bdcb2 Translated using Weblate (Latvian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/lv/
2026-07-21 14:35:53 +00:00
Tim Eisele ed61acc19a Fix subtitle encoding for local files (#17281)
* Fix subtitle encoding

* Add short-circuit

* Use IsTextFormat

* Update MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs

Co-authored-by: Bond-009 <bond.009@outlook.com>

---------

Co-authored-by: Bond-009 <bond.009@outlook.com>
2026-07-21 14:52:59 +02:00
Bond-009 9b9b609c83 Merge pull request #17368 from Shadowghost/security-path-traversal-fixes
Backport and extend path traversal fixes
2026-07-21 14:52:40 +02:00
Shadowghost 4cc69f4be0 Apply review suggestions 2026-07-21 14:30:55 +02:00
Bond-009 527ba2e11c Merge pull request #17367 from zerafachris/fix/backup-skip-corrupt-keyframe-data
fix: skip corrupt KeyframeData rows during full system backup
2026-07-21 13:53:47 +02:00
Bond-009 25d4e207f7 Merge pull request #17317 from jellyfin/renovate/sharpcompress-0.x
Update dependency SharpCompress to 0.50.0
2026-07-21 13:38:02 +02:00
Bond-009 7a269987d2 Merge pull request #17391 from jellyfin/renovate/ci-deps
Update actions/checkout action to v7.0.1
2026-07-21 13:36:21 +02:00
Bond-009 081944d358 Merge pull request #17376 from mbastian77/docs/model-enums-xml-docs
Add XML docs to small model enums and remove CS1591 suppressions
2026-07-21 13:13:06 +02:00
zerafachris 299810a4a9 fix: use build output directory for backup test temp root to avoid low free-space failures on Windows CI runners
BackupServiceTests rooted its temp directory under Path.GetTempPath(), which
on GitHub-hosted windows-latest runners resolves to the constrained system C:
drive. BackupService.CreateBackupAsync requires 5GiB free at the backup path
before starting, and the C: drive's free temp space can dip below that,
failing CreateBackupAsync_WithCorruptKeyframeDataRow_SkipsRowAndCompletesBackup
even though the fix itself is correct. Rooting the test directory under
AppContext.BaseDirectory keeps it on the same (much larger) drive as the repo
checkout on all platforms, without touching the real BackupService free-space
check.
2026-07-21 08:54:23 +02:00
zerafachris 53e58d8b1b Make ItemUpdateController.UpdateItem internal instead of reflection
Addresses review feedback from @Bond-009 on PR #17370: the test helper
InvokeUpdateItem was invoking the private UpdateItem(BaseItemDto, BaseItem)
method via reflection. Jellyfin.Api.csproj already grants
InternalsVisibleTo("Jellyfin.Api.Tests"), so the method is changed to
internal and the test now calls it directly, removing the
GetMethod/Invoke boilerplate.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-21 08:51:30 +02:00
Shadowghost b99703301f Merge remote-tracking branch 'upstream/master' into security-path-traversal-fixes
# Conflicts:
#	Jellyfin.Api/Controllers/HlsSegmentController.cs
#	Jellyfin.Api/Controllers/PluginsController.cs
2026-07-21 07:14:47 +02:00
Cody Robibero bdf263d867 Merge pull request #17377 from mbastian77/fix/person-visibility-allowed-tags
Exempt people from the allowed tags visibility check
2026-07-20 21:26:06 -04:00
Shed Shedson 9d5aedba5f Translated using Weblate (Icelandic)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/is/
2026-07-21 00:52:58 +00:00
Cody Robibero 0f88fe3c7f Merge pull request #17311 from dkanada/book-progress
extract page count from archives and PDFs
2026-07-20 20:50:25 -04:00
Cody Robibero 557b14e33e Merge branch 'master' into fix/backup-skip-corrupt-keyframe-data 2026-07-20 20:49:37 -04:00
Cody Robibero c222d370ce Merge pull request #16933 from WizardOfYendor1/fix/livetv-guide-image-optimization
Feat (fix) - Skip reprocessing program information when importing XMLTV EPG data
2026-07-20 20:17:20 -04:00
Cody Robibero 0d629591ed Remove comments about JSON error handling
Removed comments explaining error handling for malformed JSON during backup.
2026-07-20 20:15:05 -04:00
Cody Robibero 23fa02eb59 Merge pull request #17282 from TowyTowy/fix/13137-clear-profile-image
Fix profile image being impossible to clear when its in-memory key is temporary
2026-07-20 19:58:43 -04:00
Cody Robibero bea016c962 Merge pull request #17320 from TaterTechStudios/fix/item-correct-selector
Fix: Fetch the correct row matching the most up to date file
2026-07-20 19:57:28 -04:00
Cody Robibero fae1e4c556 Merge pull request #17324 from damienmeur/refactor/generic-getorderby
Make RequestHelpers.GetOrderBy generic and reuse it in ActivityLogController
2026-07-20 19:52:10 -04:00
Cody Robibero f2b9c68969 Merge pull request #17342 from LTe/fix-subtitle-conversion-race
Fix race condition in concurrent subtitle conversion
2026-07-20 19:51:44 -04:00
renovate[bot] e04ac6fd35 Update dependency SharpCompress to 0.50.0 2026-07-20 23:46:31 +00:00
renovate[bot] 25011224cf Update actions/checkout action to v7.0.1 2026-07-20 23:46:21 +00:00
Cody Robibero 191be0931e Merge pull request #17254 from sjakub/attribute_aliases
Add additional attribute aliases and improve attribute detection
2026-07-20 19:45:06 -04:00
854562 2cd2f36fe4 Extract truncation logic to helper and add tests 2026-07-20 22:00:10 +02:00
Bond-009 4f19ed5730 Merge pull request #17204 from theguymadmax/sort-seires-trailers
Sort trailers for TV Shows
2026-07-20 12:31:31 +02:00
Bond-009 5949be852a Fix SchedulesDirect image limit recognition (#17347) 2026-07-20 12:28:10 +02:00
theguymadmax ffe075650c Add TVDB provider ID support for movies (#17255)
Add TVDB provider ID support for movies
2026-07-20 12:23:20 +02:00
Bond-009 abb35571ef Merge pull request #17252 from theguymadmax/fix-alubms-and-artists
Fix artists being displayed with albums
2026-07-20 12:20:49 +02:00
Bond-009 474399683d Merge pull request #17386 from jellyfin/renovate/actions-setup-python-7.x
Update actions/setup-python action to v7
2026-07-20 12:16:40 +02:00
gnattu a238d59a07 Remove libpostproc check for ffmpeg version validation (#17384)
Remove libpostproc check for ffmpeg version validation
2026-07-20 12:16:37 +02:00
Bond-009 c779488ade Merge pull request #17382 from kaunkrishna/master
Fix linked whitespace after image badges in `README.md`
2026-07-20 12:15:54 +02:00
krvi cc44f333b6 Translated using Weblate (Faroese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fo/
2026-07-20 08:34:15 +00:00
Milo Ivir 2b6302c06e Translated using Weblate (Croatian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hr/
2026-07-20 08:34:14 +00:00
Bond-009 c3901fde56 Merge pull request #17291 from dkanada/creator-normalization
normalize common formats for creator names in OPF data
2026-07-20 08:39:19 +02:00
Bond-009 aead9c0e22 Merge pull request #17302 from ElianCodes/fix/lastlogindate-stale-entity
Keep authenticated user entity in sync with persisted login timestamps
2026-07-20 08:36:53 +02:00
Bond-009 2fd747432a Merge pull request #17304 from nyanmisaka/normalize-invalid-pts-for-trickplay
Normalize invalid PTS from containers for Trickplay generation
2026-07-20 08:36:25 +02:00
Bond-009 236db6d2f6 Merge pull request #17365 from Shadowghost/fix-resume-perf
Fix Resume query performance
2026-07-20 08:17:38 +02:00
Bond-009 181c057cb8 Merge pull request #17375 from mbastian77/docs/entities-xml-docs
Add XML docs to small entity interfaces and remove CS1591 suppressions
2026-07-20 08:17:04 +02:00
renovate[bot] 7daef156e5 Update actions/setup-python action to v7 2026-07-20 06:12:52 +00:00
KAUN f068ca3bd6 Update README.md 2026-07-19 13:24:22 +05:30
krvi 6c0eff5b39 Translated using Weblate (Faroese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fo/
2026-07-18 21:48:35 +00:00
krvi 5e946a45ee Translated using Weblate (Faroese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fo/
2026-07-18 16:27:23 +00:00
TheMelmacian 7d83779b6f fix code style 2026-07-18 17:56:38 +02:00
zerafachris 663a873e07 fix: log corrupt KeyframeData row read failures as errors, not warnings
Per review feedback from cvium: failing to read/backup an entity due to
corrupt underlying data is a significant event that should be surfaced
as an error, not silently downgraded to a warning.
2026-07-18 16:47:23 +02:00
CHO-HSUN-TE 3321a0cf09 Translated using Weblate (Chinese (Traditional Han script))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant/
2026-07-18 12:21:45 +00:00
mbastian77 5a9fb80239 Exempt people from the allowed tags visibility check 2026-07-18 14:07:52 +02:00
mbastian77 8ac2d1f7bc Add XML docs to small model enums and remove CS1591 suppressions 2026-07-18 10:08:55 +02:00
nyanmisaka 9fa9d26341 Normalize invalid PTS from containers for Trickplay generation
This change does not affect the keyframe only mode.

Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2026-07-18 15:44:34 +08:00
Bond-009 dd0b273b26 Fix Swagger UI auth docs (#12990) (#16910) 2026-07-17 23:48:04 +02:00
Marc Brooks cab108a839 Prevent ffmpeg from hanging extracting subtitles (#17297)
* Prevent ffmpeg from hanging extracting subtitles
Add `RunSubtitleExtractionProcess` to unify the external
_ffmpeg_ process handling and error management.
Add a `-nostdin` flag that prevents _ffmpeg_ from reading from
_stdin_ and blocking on an inherited stdin handle (e.g. when
Jellyfin runs as a service under NSSM), which otherwise hangs
subtitle extraction forever when _ffmpeg_ blocks on any
keyboard-interaction read until the timeout (30 minutes).
Close the redirected _stdin_ to ensure immediage EOF.
Drain the _stderr_ to a string and log it, to ensure we don't block
the _ffmpeg_ process on errors that exceed the pipe length.
Pass `-y` to _ffmpeg_ to ensure it overwrites any existing output file
without prompting for confirmation.

* Address review comments
Make sure we always drain stderr.
Make sure the timeout also honors the cancellationToken.
Make sure when we get cancelled we don't log it as a ffmpeg error.
2026-07-17 23:23:57 +02:00
Rant423 3d83e67a52 Show production companies under TV Shows' Studios (#17246)
* show production companies instead of networks

* keep both production companies and networks

* fix whitespace

* fix nullable type

* networks first, then production companies
2026-07-17 22:45:54 +02:00
Bond-009 b809d964b3 Merge pull request #17288 from nyanmisaka/ffmpeg-log-utf8
Fix potential garbled text in FFmpeg logs on Windows
2026-07-17 22:28:49 +02:00
Bond-009 96727072c8 Merge pull request #17327 from Shadowghost/remove-playbackpositionticks-mediasourceinfo
Remove PlaybackPositionTicks from MediaSourceInfo
2026-07-17 22:21:21 +02:00
Bond-009 9ec0d7c63b Merge pull request #17334 from nyanmisaka/fix-cuda-hwupload
Fix format negotiation in hybrid SW decode and CUDA tonemap pipeline
2026-07-17 22:15:49 +02:00
Bond-009 bfe0a47b32 Merge pull request #17151 from theguymadmax/fix-indentify-image
Fix Identify returning wrong images
2026-07-17 22:13:47 +02:00
Bond-009 9b5f830462 Merge pull request #17326 from theguymadmax/update-series-name
Update season and episode SeriesName when renaming a series
2026-07-17 22:06:26 +02:00
Bond-009 42f9ed76c0 Merge pull request #17280 from Shadowghost/remove-image-override-hack
Remove episode image override hack
2026-07-17 22:06:07 +02:00
Bond-009 69faa6c583 Merge pull request #17191 from IDisposable/fix/handler-path-traversal
Fix path transversal exposure in Plugins
2026-07-17 21:52:22 +02:00
WizardOfYendor1 0c7428f136 Added verbose, rambling, log warning to help users with config issues (hoping to reduce false issues reports).
Also added a test to exercise it, which is perhaps silly but convenient.
2026-07-17 14:59:46 -04:00
WizardOfYendor1 97e666c566 Append base URL if the published server URL override omits it. Fleshed out unit tests to cover that and https->http reverse proxy scenario(s). 2026-07-17 14:59:46 -04:00
zerafachris 5cd3d7ebb7 fix: don't throw ArgumentNullException on partial UpdateItem payloads (#17366)
BaseItemDto.Genres, .Tags, and .ProviderIds are plain auto-properties with
no default initializer, so they deserialize to null when a client omits
them from a partial POST /Items/{itemId} body. The OpenAPI spec documents
every BaseItemDto field as optional, but ItemUpdateController.UpdateItem
fed these three properties straight into Distinct()/Select()/ToList()
without a null check, so a request that (for example) only sets Tags
throws ArgumentNullException("source") once it reaches the unguarded
Genres line, before Tags is even processed.

Guard all three assignments with the same "if (request.X is not null)"
pattern already used for the neighboring Studios/Taglines/ProductionLocations
fields in this method, so omitted fields are left unchanged instead of
crashing the request.

Adds ItemUpdateControllerTests covering the reported repro (only Tags
supplied) and a companion case asserting existing Genres/ProviderIds are
preserved when omitted from the payload.

Signed-off-by: zerafachris <christopher.zerafa@blocklabs.io>
2026-07-17 17:20:30 +02:00
Shadowghost 62a5ded920 Prevent unauthenticated re-run of the startup wizard on misconfiguration 2026-07-17 17:14:27 +02:00
Shadowghost 21801e8ba1 Harden remaining path-construction sinks against traversal 2026-07-17 17:08:59 +02:00
Shadowghost 1a45fc82b5 Sanitize media attachment and lyric paths against traversal 2026-07-17 17:07:27 +02:00
Shadowghost 4fb779920a Sanitize ClientLog upload filename to prevent path traversal 2026-07-17 17:02:02 +02:00
zerafachris d7727224c2 Skip corrupt KeyframeData rows during full system backup
A single row with malformed KeyframeTicks JSON (e.g. a truncated array
from an interrupted write) currently aborts the entire backup, because
the try/catch in BackupService.CreateBackupAsync only wraps
serialization of an already-materialized entity, not the enumeration
itself. EF Core throws JsonReaderException from MoveNextAsync() while
materializing the corrupt row, which propagates past that catch block.

Switch to manual enumerator iteration so MoveNextAsync() failures can
be caught per-row, logged as a warning identifying the affected table,
and skipped, allowing the remaining rows and the rest of the backup to
complete.

Fixes #17216

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-17 16:44:25 +02:00
Bond-009 a96dc8bd9b Merge pull request #17354 from jellyfin/renovate/actions-setup-dotnet-6.x 2026-07-17 13:56:55 +02:00
Bond-009 d146c347b4 Merge pull request #17359 from jellyfin/renovate/ci-deps 2026-07-17 13:54:14 +02:00
Bond-009 f2dea2a3fd Merge pull request #17348 from theguymadmax/revert-includeItemTypes-in-collectionType 2026-07-17 13:53:58 +02:00
Bond-009 4d1dd42420 Merge pull request #17343 from mbastian77/docs/channels-xml-docs 2026-07-17 13:53:27 +02:00
Bond-009 8eb0ba60c1 Merge pull request #17344 from mbastian77/docs/session-model-xml-docs 2026-07-17 13:52:59 +02:00
Bond-009 2bf15d95df Merge pull request #17340 from mbastian77/docs/dlna-model-xml-docs 2026-07-17 13:52:31 +02:00
Bond-009 be2db99586 Merge pull request #17339 from mbastian77/docs/providers-lookup-info-xml-docs 2026-07-17 13:51:59 +02:00
Bond-009 37fe9df27c Merge pull request #17338 from mbastian77/docs/deviceid-xml-docs 2026-07-17 13:51:29 +02:00
Fabián Sanhueza 8759ad4d49 Translated using Weblate (Spanish (Latin America))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es_419/
2026-07-17 11:49:50 +00:00
Bond-009 051ff4cf6d Merge pull request #17337 from Shadowghost/limit-similar-items 2026-07-17 13:49:46 +02:00
theguymadmax fa4626c080 Revert setting default BaseItemKind for CollectionType 2026-07-16 18:15:54 -04:00
Enea D'Angiò d36c8ebce8 Reduce cognitive complexity of RemoveFromPlaylist 2026-07-16 21:03:29 +02:00
renovate[bot] 4cc577a72d Update github/codeql-action action to v4.37.1 2026-07-16 18:47:00 +00:00
Shadowghost cdf7ce0fc4 Fix user data batch query perf 2026-07-16 14:21:03 +02:00
Shadowghost d894a98b79 Fix tie-breaker performance 2026-07-16 14:20:42 +02:00
renovate[bot] 2b57a5725c Update actions/setup-dotnet action to v6 2026-07-16 07:02:47 +00:00
Jordan Rushing 3f96790904 Move GetUserDataBatch to use ResolveUserDataRow when item.UserData isn't preloaded 2026-07-15 16:21:42 -05:00
Shadowghost 2bac9a8f0c Fix SchedulesDirect image limit recognition 2026-07-15 17:43:27 +02:00
mbastian77 997093ae3a Add XML docs to small entity interfaces and remove CS1591 suppressions 2026-07-15 16:07:56 +02:00
mbastian77 5cbafa566d Add XML docs to small session model types and remove CS1591 suppressions 2026-07-15 16:03:56 +02:00
mbastian77 0d3cf0169e Add XML docs to small channel types and remove CS1591 suppressions 2026-07-15 16:02:12 +02:00
Piotr Niełacny 6e3c187493 Fix race condition in concurrent subtitle conversion
SubtitleEncoder.ConvertSubtitles parsed subtitles with libse's static
Subtitle.Parse, which iterates a statically cached list of shared
SubtitleFormat instances. Format parsers keep mutable per-parse state on
the instance, so concurrent subtitle requests corrupted each other's
output (cues mixed across streams and languages, truncated files) or
failed with NullReferenceException when format detection broke down and
Subtitle.Parse returned null.

Parse through the injected ISubtitleParser instead. SubtitleEditParser
instantiates a fresh format parser per call, so requests no longer share
state. Its Parse method now returns the libse Subtitle directly (the
SubtitleTrackInfo flattening was unused since the SubtitleEdit writer
rework) so the writers keep full fidelity such as ASS styling.
2026-07-15 14:55:55 +02:00
Bond-009 f8771b52ec Merge pull request #17331 from jellyfin/renovate/dotnet-monorepo 2026-07-15 12:49:34 +02:00
Bond-009 e3d610c3c5 Merge pull request #17274 from theguymadmax/fix-max-login-attempts 2026-07-15 12:42:09 +02:00
Bond-009 486ffaa6dd Merge pull request #17248 from theguymadmax/add-novel 2026-07-15 12:40:17 +02:00
mbastian77 d96d1f1119 Add XML docs to small DLNA model types and remove CS1591 suppressions 2026-07-15 12:11:11 +02:00
mbastian77 30f28456de Add XML docs to lookup info types and remove CS1591 suppressions 2026-07-15 12:08:08 +02:00
mbastian77 f8aad322cc Add XML docs to DeviceId and remove CS1591 suppression 2026-07-15 11:58:29 +02:00
Shadowghost c6545a8b68 Limit similar items to user accessible libraries 2026-07-15 11:47:59 +02:00
Bond-009 0fe9c1ce91 Merge pull request #17330 from jellyfin/renovate/microsoft 2026-07-15 11:42:52 +02:00
Bond-009 b6882c86dc Merge pull request #17250 from TaterTechStudios/feature/books-series-name-metadata 2026-07-15 07:57:57 +02:00
nyanmisaka 4503ad295c Fix format negotiation in hybrid SW decode and CUDA tonemap pipeline
The CUDA hwcontext in FFmpeg 8.1 has added support for 10bit
fully-planar formats, but few CUDA filters support them.

Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2026-07-15 13:54:45 +08:00
renovate[bot] 1a9bd2417a Update Microsoft 2026-07-14 20:11:54 +00:00
renovate[bot] 0d2f1b26b3 Update dependency dotnet-ef to v10.0.10 2026-07-14 20:11:43 +00:00
Bond-009 bc59e56ef5 Merge pull request #17266 from Shadowghost/fix-non-admin-additional-parts 2026-07-14 15:36:38 +02:00
Shadowghost b8bac71270 remove PlaybackPositionTicks from MediaSourceInfo 2026-07-14 10:05:32 +02:00
theguymadmax 6238448716 Update season and episode SeriesName when renaming a series 2026-07-13 23:08:06 -04:00
Damien Meur 56c970c2db Make RequestHelpers.GetOrderBy generic and reuse it in ActivityLogController 2026-07-14 02:57:15 +02:00
Jordan Rushing fcce108948 Fix: Fetch the correct row matching the most up to date file 2026-07-13 15:40:40 -05:00
Bond-009 cfeaef6180 Merge pull request #17306 from theguymadmax/fix-strm-sub-protocol 2026-07-13 20:14:20 +02:00
Bond-009 ebab369eac Merge pull request #17273 from theguymadmax/ratigs-numerical-score 2026-07-13 20:13:29 +02:00
TheMelmacian 2a44c35224 Apply review suggestions 2026-07-13 20:01:01 +02:00
DrummingBird1 0584a102ee Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/he/
2026-07-13 11:26:23 +00:00
theguymadmax 2aae53bc15 Apply review feedback 2026-07-12 11:54:56 -04:00
Bond-009 911044b415 Merge pull request #17287 from dkanada/audiobook-cover 2026-07-12 17:39:34 +02:00
Bond-009 b77def6883 Merge pull request #17268 from theguymadmax/fix-greece-ratings 2026-07-12 17:36:01 +02:00
Bond-009 5c48935fa8 Merge pull request #17220 from jellyfin/renovate/ci-deps 2026-07-12 17:33:36 +02:00
dkanada 9e996d612c extract page count from archives and PDFs 2026-07-12 19:46:56 +09:00
TowyTowy 5be844e1b7 Fix 3D format detection when the tag is the last token of the path
Format3DParser drops the last character of the final path token: when
IndexOfAny finds no more delimiters, the slice is taken with
'index = path.Length - 1', so e.g. "hsbs" is compared as "hsb" and
never matches any rule.

File paths are unaffected because the extension is always the final
token, but directory based media have no extension. For DVD/BluRay
folder rips (BaseVideoResolver parses the folder path via
Set3DFormat), a trailing 3D tag such as
"Gravity (2013) 3d hsbs/BDMV" is silently ignored and Video3DFormat
is never set.

This is a regression from 42a2cc174 which replaced the string.Split
based FlagParser with span slicing; the Split implementation kept the
final token intact.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 12:11:29 +02:00
theguymadmax e2d9d592bc Fix incorrect protocol used for subtitle charset detection 2026-07-11 17:33:06 -04:00
WizardOfYendor1 6f189bf2b8 Reduce GetPlaybackInfo cognitive complexity 2026-07-11 10:12:42 -04:00
Elian Van Cutsem 47f567b6f1 Keep authenticated user entity in sync with persisted login timestamps
ExecuteUpdateAsync bypasses the EF change tracker, so the user entity
returned by AuthenticateUser still carried the old LastLoginDate and
LastActivityDate. SessionManager.LogSessionActivity then saved that
stale entity in full, reverting LastLoginDate (usually to null)
milliseconds after every login. Setting the properties on the entity
keeps the follow-up save consistent and lets the 60-second activity
guard skip the redundant write during login.

Fixes #17301
2026-07-11 14:04:07 +02:00
dkanada 305160d2e4 enable audiobook image saving to local folder 2026-07-11 11:00:46 +09:00
WizardOfYendor1 f3ff7a446b Add WizardOfYendor1 to contributors 2026-07-10 20:31:14 -04:00
WizardOfYendor1 a3ec1a3712 Add Live TV published URL regression coverage 2026-07-10 20:27:10 -04:00
WizardOfYendor1 6bbd6dcd44 Resolve Live TV client stream URLs per request 2026-07-10 20:26:29 -04:00
WizardOfYendor1 ce43df6f43 Fix host and port handling for published server URI overrides 2026-07-10 14:19:08 -04:00
dkanada 2250015e78 normalize common formats for creator names in OPF data 2026-07-10 22:53:14 +09:00
renovate[bot] 933f7eea1b Update CI dependencies 2026-07-10 07:47:01 +00:00
nyanmisaka 631a314d24 Fix potential garbled text in FFmpeg logs on Windows
Explicitly set StandardErrorEncoding and StandardOutputEncoding to
Encoding.UTF8 when invoking the FFmpeg subprocess.

This prevents log encoding issues and character corruption on Windows
environments that default to non-UTF8 ANSI code pages.

This fixes garbled metadata and font names in the FFmpeg logs.

Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2026-07-10 14:46:27 +08:00
dkanada ed06fd5139 support external images for audiobooks 2026-07-10 14:19:45 +09:00
TowyTowy 2326ecdedc Fix profile image being impossible to clear when its in-memory key is temporary
ClearProfileImageAsync removed the ProfileImage instance attached to the
passed-in User, but that instance can carry a stale, never-persisted
(temporary) key because UpdateUserAsync creates the persisted image on a
separately loaded entity and never copies the generated key back.
Removing that detached entity on a fresh DbContext made EF Core throw
InvalidOperationException ('ImageInfo.Id has a temporary value'), leaving
the profile image impossible to delete or replace.

Load the tracked, persisted user and remove its actual ProfileImage,
matching the removal pattern already used in UpdateUserAsync. Adds
regression tests covering the temporary-key case and the no-image no-op
(the first fails before this change and passes after).

Fixes #13137

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 13:39:09 +02:00
Shadowghost 38813f7d42 Cleanup PreferEpisodeParentPoster) 2026-07-09 12:07:13 +02:00
Shadowghost 853922443f Remove episode image override hack 2026-07-09 11:54:18 +02:00
theguymadmax 8b826d981b Fix max login attempts 2026-07-08 23:07:57 -04:00
theguymadmax 8bf1710e07 Check numeric rating value after splitting country code 2026-07-08 20:09:49 -04:00
theguymadmax 5e42941d3b Fix Greece parental ratings 2026-07-08 12:09:38 -04:00
theguymadmax a1255bda6a Use FrozenSet 2026-07-08 11:45:16 -04:00
Shadowghost 9a2fdb3573 Fix additional parts for non-admins 2026-07-08 13:43:30 +02:00
Jakub Schmidtke 08f6627a24 Replaced string.Empty with ReadOnlySpan<char>.Empty 2026-07-08 01:40:26 +02:00
Shed Shedson 53aafcd38e Translated using Weblate (Icelandic)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/is/
2026-07-07 18:12:36 +00:00
Shed Shedson d73e65172a Translated using Weblate (Icelandic)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/is/
2026-07-07 16:33:35 +00:00
theguymadmax fff710585f Restore music collection image override 2026-07-07 10:24:18 -04:00
Jakub Schmidtke 1294990f4f Added more aliases for attributes
Adds tvdb alias for tvdbid and imdb alias for imdbid.

It also fixes an issue where tmdb alias was being ignored
if it was followed by something like "tmdbidfoo".
The same issue prevented imdb pattern matching from
working, if it was followed by something like "imdbidfoo".

It also allows for detecting the first matching occurence,
whether it was an alias or not.

Finally, it ignores attributes with values consisting of only whitespaces.
2026-07-07 15:39:09 +02:00
yuuta0331 974038e9b0 Translated using Weblate (Japanese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ja/
2026-07-07 02:20:57 +00:00
theguymadmax ab0d0d1890 Fix artists being displayed with albums 2026-07-06 22:06:34 -04:00
Jordan Rushing f3fbe5575a Allow SeriesName to be editable from Item Metadata (books) 2026-07-06 15:28:49 -05:00
theguymadmax 860cb75d58 Add Novel job mapping to the Writing department 2026-07-06 11:27:24 -04:00
Lofuuzi e31f168e9b Translated using Weblate (Chinese (Traditional Han script, Hong Kong))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant_HK/
2026-07-06 08:24:25 +00:00
Ulrik 7f5537ca47 Translated using Weblate (Danish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/da/
2026-07-06 05:12:54 +00:00
Cody Robibero a03072b617 Merge pull request #16668 from johnpc/fix/people-images-not-displayed
Fix actor images not displayed until clicked
2026-07-05 16:25:38 -04:00
Cody Robibero 31d05dbdd6 Merge pull request #17228 from Shadowghost/fix-logout-concurrency
Don't throw on logout if session does not exist
2026-07-05 16:22:45 -04:00
Cody Robibero d4faf7bd72 Merge pull request #17238 from iderex/fix/dateparse-format-provider
Use InvariantCulture when parsing machine-generated dates
2026-07-05 16:21:56 -04:00
Cody Robibero 6e728b009f Merge pull request #17044 from Shadowghost/version-model-and-handling
Fixes for multi version handling
2026-07-05 16:21:02 -04:00
Cody Robibero efd3814a7e Merge pull request #17239 from theguymadmax/ratings-separator
Fix parental rating lookup for multi-rating entries
2026-07-05 16:20:45 -04:00
Bond-009 b391cd5e9e Merge pull request #17231 from theguymadmax/fix-paths-not-being-deleted
Fix ghost entries when deleting library paths
2026-07-05 16:19:46 +02:00
Bond-009 8433773fad Allow changing capitalization of usernames (#17229)
Fixes #17195
Adds a regression test
2026-07-05 15:59:14 +02:00
Lofuuzi 381bf18161 Translated using Weblate (Chinese (Traditional Han script, Hong Kong))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant_HK/
2026-07-05 08:08:46 +00:00
Nils Lehnen f8ffccae7f Use InvariantCulture when parsing machine-generated dates
DateTime.TryParse without an IFormatProvider falls back to the current
thread culture, so the same string can parse differently (or fail)
depending on the server's locale. None of these call sites deal with
user-entered text - they parse dates that come from filenames, an
HTTP header, ffprobe metadata and values the app itself wrote to the
auth database - so InvariantCulture is the correct provider everywhere
here.

Fixes the S6580 / CA1305 warnings on these call sites.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 23:55:31 +02:00
theguymadmax 2528bc1032 Fix parental rating lookup for multi-rating entries 2026-07-04 17:53:55 -04:00
Ulrik 4b5f5d6ca3 Translated using Weblate (Danish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/da/
2026-07-04 21:25:02 +00:00
Cody Robibero e2eaacd239 Merge pull request #17222 from theguymadmax/fix-folder-view
Fix folder view
2026-07-04 10:06:44 -04:00
Cody Robibero 77d4ab9ea9 Merge pull request #17225 from jellyfin/renovate/microsoft
Update Microsoft to 5.6.0
2026-07-04 10:06:11 -04:00
Enea D'Angiò 6883cd0969 Fix play queue index handling in SyncPlay
Three index bugs in PlayQueueManager, two of which leave
PlayingItemIndex out of bounds, making every subsequent Buffering/Ready
request throw and leaving the group unusable until it empties:

- RemoveFromPlaylist did not compensate for removed items preceding the
  playing item: removing the playing item together with earlier items
  could select the wrong item or crash with an out-of-bounds index.
- Next/Previous on an empty playlist with RepeatOne/RepeatAll reported
  success or set PlayingItemIndex to 0 on an empty list, crashing
  downstream in Group and corrupting the index.
- SetPlayingItemByIndex accepted an index equal to the playlist count
  (latent off-by-one, callers currently pre-validate).
2026-07-04 11:38:05 +02:00
theguymadmax 43a152359e Fix ghost entries when deleting library paths 2026-07-03 14:12:56 -04:00
Bond_009 482cf4b8c3 Allow changing capitalization of usernames
Fixes #17195
Adds a regression test
2026-07-03 18:33:10 +02:00
Shadowghost 2b4945217a Don't throw on logout if session does not exist 2026-07-03 15:58:57 +02:00
Chamithu Mapalagama ccc1712d10 Translated using Weblate (Sinhala)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/si/
2026-07-03 03:37:35 +00:00
altqx 8622c3bfb7 Match VobSub MKS subtitle profiles by container 2026-07-03 09:30:22 +07:00
renovate[bot] 820e7b91da Update Microsoft to 5.6.0 2026-07-02 23:57:21 +00:00
theguymadmax 08ba3717ea Fix folder view 2026-07-02 14:04:20 -04:00
Enea D'Angiò 8f3eb3205d Close sessions for lost WebSockets to prevent zombie SyncPlay groups (#17079)
Close sessions for lost WebSockets to prevent zombie SyncPlay groups
2026-07-02 19:36:48 +02:00
Bond-009 379c58a48d Merge pull request #17209 from theguymadmax/update-swedish-ratings
Fix Swedish rating
2026-07-02 19:29:12 +02:00
Bond-009 28b43838dd Merge pull request #17206 from zachhide/fix/livetv-hls-null-mediasource
Fix NullReferenceException in GetStreamingState for closed live streams
2026-07-02 19:29:06 +02:00
Shadowghost 38f1d9749e Fix review comments 2026-07-02 08:49:11 +02:00
m4st3r-0day 9cc25d133d Translated using Weblate (Albanian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/sq/
2026-07-01 20:34:37 +00:00
theguymadmax 8e1b69b37f Add missing Swedish ratings 2026-06-30 16:34:05 -04:00
Bond-009 a43fd188dc Merge pull request #17175 from obrenoalvim/fix/use-leftjoin-ef10
Use Enumerable.LeftJoin for activity log user query
2026-06-30 17:49:15 +02:00
Breno Alvim f011529388 Use Enumerable.LeftJoin for activity log user query 2026-06-30 17:37:02 +02:00
zachhide 8ffb54603a Fix NullReferenceException in GetStreamingState for closed live streams
When a client polls the HLS playlist (e.g. live.m3u8) after a live stream has
been disposed because its consumer count dropped to zero,
GetLiveStreamWithDirectStreamProvider returns a null MediaSource. The live
branch of GetStreamingState then dereferenced it unconditionally, throwing a
NullReferenceException and returning HTTP 500 for every poll until the client
re-opens the stream. Guard against the null MediaSource and throw
ResourceNotFoundException so the request returns 404 instead of crashing.

Fixes #17009

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 01:13:51 -04:00
Bond-009 d3ee1e84b1 Merge pull request #17170 from Shadowghost/better-bitrates
Rework bitrate reporting
2026-06-29 18:06:14 +02:00
Bond-009 1035f6a101 Merge pull request #15954 from IDisposable/fix/books
Fix Book collections speed issues
2026-06-29 18:05:55 +02:00
theguymadmax 22792b62cb Sort trailers for TV Shows 2026-06-29 12:04:55 -04:00
John Corser ef6f342a54 Use IItemTypeLookup and QueryPartitionHelpers
Address review feedback:
- Replace typeof(Person).FullName with IItemTypeLookup.BaseItemKindNames
- Replace foreach+ToListAsync with PartitionEagerAsync for batched
  iteration with built-in progress reporting
- Check HasImage/HasOverview on the loaded domain Person object
  instead of projecting from the DB query
2026-06-28 21:44:47 -04:00
John Corser a888257c82 Project hasImage/hasOverview from DB query
Instead of re-checking image/overview on the domain object after loading,
project the values directly from the database query as part of the
anonymous type selection. This avoids redundant checks since the DB
already has this information.
2026-06-28 21:44:46 -04:00
John Corser d55f808423 Move people filtering to database query
Instead of loading all people names and checking each one in memory,
query the database directly for Person items that need refresh:
- Missing primary image OR missing overview
- Not refreshed within the last 30 days

This reduces the operation from N+1 queries (1 for all names + 1 per
person to load) to a single filtered query returning only the IDs that
need work.
2026-06-28 21:44:46 -04:00
John Corser dc92e3b0e4 Fix actor images not displayed until clicked
Move image refresh logic from PeopleValidator (which runs during library
scans) into PeopleValidationTask (the "Refresh People" scheduled task).
This keeps library scans fast while ensuring the scheduled task fetches
missing images from remote providers like TMDB.

People missing a Primary image or overview get refreshed with
MetadataRefreshMode.Default instead of ValidationOnly, with a 30-day
cooldown to avoid hammering providers for people they have no data for.

Fixes jellyfin#8103
2026-06-28 21:44:46 -04:00
Marc Brooks 95cebffa87 Add tests
Also fixed a sibling directory that matches the prefix.
2026-06-28 16:26:35 -05:00
Ricky Kimani feef2403c4 Translated using Weblate (Swahili)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/sw/
2026-06-28 10:04:42 +00:00
Bond-009 1b6342e217 Merge pull request #17131 from jellyfin/renovate/actions-checkout-7.x
Update actions/checkout action to v7
2026-06-28 11:20:09 +02:00
Bond-009 62e6cf0196 Merge pull request #17141 from jellyfin/renovate/swashbuckle-aspnetcore-monorepo
Update swashbuckle-aspnetcore monorepo to 10.2.3
2026-06-28 11:19:32 +02:00
Bond-009 8c6ee890cb Merge pull request #17167 from jellyfin/renovate/microsoft
Update dependency Microsoft.NET.Test.Sdk to 18.7.0
2026-06-28 11:19:11 +02:00
Bond-009 eee26e6fee Merge pull request #17176 from jellyfin/renovate/ci-deps
Update CI dependencies
2026-06-28 11:18:55 +02:00
Cody Robibero fb07067f8f Merge pull request #17140 from theguymadmax/clean-orphaned-people
Remove orphaned people
2026-06-27 10:24:50 -04:00
Cody Robibero a83920c5a7 Merge pull request #17162 from Shadowghost/batch-duplicate-cleanup-deletes
Batch duplicate-cleanup deletes in merge migrations
2026-06-27 10:22:11 -04:00
Cody Robibero 75d71cb73c Merge branch 'master' into clean-orphaned-people 2026-06-27 10:02:33 -04:00
Cody Robibero c158418e0b Merge pull request #17013 from dfederm/dfederm/fix-jellyfin-16899
Reject unsafe plugin package names in installer
2026-06-27 10:00:00 -04:00
Cody Robibero cbef19c313 Merge pull request #16914 from danieltutuianu/fix/livetv-channel-icon-refresh
Live TV: re-fetch channel icons on guide refresh
2026-06-27 09:52:51 -04:00
Cody Robibero fc13a7ca7d Merge pull request #17174 from obrenoalvim/fix/use-tohexstringlower
Use Convert.ToHexStringLower for Schedules Direct password hash
2026-06-27 09:48:59 -04:00
Cody Robibero ff36b1b417 Merge pull request #17154 from joshuaboniface/enhance-startup-ux
Revamp startup UI for visual style and usability
2026-06-27 09:48:42 -04:00
Cody Robibero 9ec19b8244 Merge pull request #17134 from theguymadmax/replace-embedded-lyrics
Fix embedded lyrics not updating on replace all refresh
2026-06-27 09:48:34 -04:00
Cody Robibero ed5e868a6b Merge pull request #17187 from Shadowghost/fix-localization-lookup
Fix localization lookup
2026-06-27 09:46:45 -04:00
Cody Robibero 58de9b7a99 Merge pull request #17178 from jellyfin/fix-livetv-sessions
Fix Live TV tuner not releasing
2026-06-27 09:20:00 -04:00
Cody Robibero aa037c748a Merge pull request #17188 from Shadowghost/fix-local-plugins
Fix local Comic book plugin registration
2026-06-27 09:18:00 -04:00
Cody Robibero 1efdad3443 Merge pull request #17182 from Shadowghost/vacuum-noscan
Don't run heavy DB tasks while scan is running
2026-06-27 09:14:49 -04:00
Manuel Cid f2ed842b4b Translated using Weblate (Galician)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/gl/
2026-06-27 06:45:32 +00:00
Marc Brooks 617ebf367f Fix path transversal exposure in Plugins
The request path is not validated to a valid path and could allow escaping the transcode path and downloading of any arbitrary file in GetHlsPlaylistLegacy .

GetHlsAudioSegmentLegacy and GetHlsVideoSegmentLegacy have the same issue, and are NOT behind an Authorize so they are publicly exploitable.

Added a ValidateTranscodePath that verifies that requested file paths start with the transcode path setting. Also ensure that all filename comparisons are OrdinalIgnoreCase because we might be running on a filesystem where filename-casing doesn't have to match. Switched from InvariantCulture because the underlying OS filename comparisons are always byte-wise (with case insensitivity here).

Fixed a similar issue in GetPluginImage
2026-06-26 12:05:54 -05:00
Marc Brooks 70b4589382 Fix Book collections scanning all items
Added static method GetBaseItemKindsForCollectionType in ItemsController (moved from ContentFolderImageProvider to be shared)

Added AudioBook to GetRepresentativeItemTypes for CollectionType.books for consistency

Added GetBooks to GetUserItems for CollectionType.books which gets BaseItemKind.Book and BaseItemKind.AudioBook

Move GetBaseItemKindsForCollectionType to DtoExtensions

Cleaned up the missing null checks and used new collection expressions.
Associate Person to Book and AudioBook for related items.
2026-06-26 11:25:58 -05:00
Shadowghost c2cb18a9d1 Fix local plugin registration 2026-06-26 11:42:28 +02:00
Shadowghost f398b6d08b Fix localization lookup 2026-06-26 08:20:55 +02:00
Shadowghost fa07a3abe8 Skip backups whens can is running 2026-06-26 07:34:19 +02:00
cloudharps b9db4566a7 Translated using Weblate (Korean)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ko/
2026-06-26 04:51:39 +00:00
Joshua M. Boniface d71b17fcc7 Merge pull request #17153 from joshuaboniface/fix-FixIncorrectOwnerIdRelationships
Fix too many SQL variables in DeleteItem for large batch deletes
2026-06-26 00:51:36 -04:00
renovate[bot] dff84c8490 Update CI dependencies 2026-06-26 03:42:17 +00:00
Shadowghost 5221584b06 Only process items with tmdb id 2026-06-25 20:54:05 +02:00
Shadowghost 1947296edd Don't run heavy DB tasks while scan is running 2026-06-25 19:32:36 +02:00
Shadowghost c4ace4ac95 Set TMDb id in season provider 2026-06-25 19:29:52 +02:00
Shadowghost 2fcf4084f8 Add TMDb missing episode provider 2026-06-25 19:10:38 +02:00
Joshua M. Boniface 31070e8208 Add a cancelable redirect handoff and drop the transitional migration status
When the server finishes starting, show "Jellyfin started successfully" with a
5-second "Redirecting in N…" countdown and a Cancel button instead of reloading
immediately. Cancel stops the countdown and the background refresh so the
startup output can be reviewed, and offers a "Continue to Jellyfin" button to
reload manually. The buttons use the web client's emby-button styling.

Also drop the transitional "Applying migrations" activity: it only showed
briefly while the pending migration set was read, or for the whole step when
nothing was pending, so startup now goes from "Preparing migrations" straight
into "Running migration X of Y".
2026-06-25 00:42:31 -04:00
Joshua M. Boniface 2c98ad99db Improve UX to fully match Jellyfin dashboards 2026-06-25 00:08:20 -04:00
theguymadmax e26f4a1005 Fix Live TV tuner not releasing 2026-06-24 22:30:12 -04:00
Breno Alvim e41f415594 Use Convert.ToHexStringLower for Schedules Direct password hash 2026-06-23 23:13:33 -03:00
854562 c632417dda Fix SonarCloud warnings 2026-06-23 18:32:47 +02:00
Shadowghost d090c59939 Rework bitrate reporting 2026-06-23 17:47:17 +02:00
renovate[bot] da515e94b1 Update Microsoft 2026-06-23 08:58:47 +00:00
nextlooper42 987744529a Translated using Weblate (Slovak)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/sk/
2026-06-23 08:15:55 +00:00
engineer948 917244ab1d Translated using Weblate (Azerbaijani)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/az/
2026-06-23 07:55:24 +00:00
Shadowghost af82aceadb Batch duplicate-cleanup deletes in merge migrations 2026-06-22 23:16:47 +02:00
engineer948 7f2cd5cf57 Added translation using Weblate (Azerbaijani) 2026-06-22 21:09:26 +00:00
renovate[bot] 2feb588db3 Update swashbuckle-aspnetcore monorepo to 10.2.3 2026-06-22 19:13:35 +00:00
854562 94d5326411 Truncate ISO-639-2 language display names at first delimiter
Prevents raw ISO-639-2 values (e.g. "Greek, Modern (1453-)" from cluttering the audio and subtitle display names by truncating them at the first comma or semicolon ("Greek"). Applies to MediaStreamRepository and ProbeResultNormalizer.
2026-06-22 20:25:13 +02:00
Joshua M. Boniface 58e9e3423a Remove server version from page title
This leaks additional information publicly, and is not really
necessary/useful.
2026-06-22 02:32:59 -04:00
Jensen da2b994fff Translated using Weblate (English (United States))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/en_US/
2026-06-22 06:20:06 +00:00
Jensen 7f7e4dfa40 Added translation using Weblate (English (United States)) 2026-06-22 04:52:24 +00:00
Joshua M. Boniface c257fd5004 Make the startup log a bounded, soft-refreshing scrolling viewport
Order the startup log oldest-to-newest inside a height-bounded panel that
scrolls internally and never extends past the bottom of the window. Refresh it
with a background fetch that swaps the log list in place instead of reloading
the whole page, preserving the user's scroll position and only following to the
bottom when they are already there. A full page reload now happens only on the
final transition to the running server or to the error state.
2026-06-22 00:00:38 -04:00
Joshua M. Boniface 0046adda29 Restyle the startup UI and add a generic startup activity line
Restyle the startup/migration holding page to match the Jellyfin dark theme,
with the inline wordmark logo, a gradient spinner and a recolored startup log
tree, and move the Morestachio template rendering into a reusable
StartupUiRenderer.

Add a curated, non-identifying "current activity" line to the always-visible
header (for example "Initializing server" or "Running migration X of Y"),
reported from the startup flow and the migration service so it never leaks
server details to unauthenticated clients. Move the log download into a
"Download logs" link in the log panel header, and show only the header, with
no log hints, to non-local clients.
2026-06-22 00:00:38 -04:00
Joshua M. Boniface b60c535c84 Add progress logging and batch deletion for logs
After resolving duplicates the migration deleted all items in one silent
pass (per-id GetItemById plus a single DeleteItemsUnsafeFast), which looks
hung for minutes on large libraries. Delete in batches of 500 and log
progress per batch, which also avoids one oversized delete transaction.
2026-06-21 23:31:25 -04:00
Joshua M. Boniface 069eb40ebf Fix too many SQL variables in DeleteItem for large batch deletes
The FixIncorrectOwnerIdRelationships migration deletes all duplicate
items in a single DeleteItemsUnsafeFast -> DeleteItem(ids) call. Inside
DeleteItem, the owned-extras lookup used a raw HashSet.Contains, which EF
inlines as one SQL variable per id and overflows SQLite's variable limit
on large libraries. Use WhereOneOrMany so the id set is bound as a single
json_each parameter, like the rest of the method, making bulk deletes
work for unlimited library sizes.
2026-06-21 23:03:45 -04:00
theguymadmax c49f279a27 Fix Identify returning wrong images 2026-06-21 18:22:00 -04:00
Bond-009 4e80648fd3 Merge pull request #17146 from theguymadmax/fix-identify-search
Fix Identify returning wrong results
2026-06-21 19:03:52 +02:00
Bond-009 f08a3f9fd9 Merge pull request #17090 from moontwister/fix/audio-sample-rate-non-opus-17026
Fix audio sample rate forced to 48 kHz for non-Opus codecs
2026-06-21 19:01:18 +02:00
Bond-009 083f9d291a Merge pull request #17094 from moontwister/fix/trailers-nullref-controllercontext-17065
Deprecate the redundant /Trailers endpoint
2026-06-21 19:00:23 +02:00
danne e4383493a9 Fix audio sample rate forced to 48 kHz for non-Opus codecs
GetProgressiveAudioFullCommandLine applied the libopus-only sample rate
quantization to every codec except Opus, inverting the intended guard.
A requested rate such as 44100 Hz was therefore snapped to 48000 Hz for
AAC/MP3/FLAC, while Opus (which actually requires the quantization) was
skipped entirely.

Apply the quantization only when the output codec is Opus, and pass the
requested sample rate through unchanged for all other codecs.

Fixes #17026

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 09:43:31 +02:00
theguymadmax ce58e4400e Fix Identify returning wrong results 2026-06-20 22:30:52 -04:00
Bond-009 3741d71965 Merge pull request #17116 from theguymadmax/fix-root-folder-parsing 2026-06-21 00:10:26 +02:00
Žiga Ules 11f642594d Translated using Weblate (Slovenian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/sl/
2026-06-20 12:46:03 +00:00
AfmanS 8d15529df7 Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt_PT/
2026-06-20 12:46:03 +00:00
theguymadmax 310a47c1d4 Reorder ValidatePeople 2026-06-19 23:10:32 -04:00
Shadowghost 0fb042b740 Surface the played version for resume 2026-06-19 21:51:57 +02:00
theguymadmax 24886d4849 Remove orphaned people 2026-06-19 13:28:22 -04:00
danne e75161c557 Deprecate the redundant /Trailers endpoint
GET /Trailers is a thin alias for GET /Items with includeItemTypes=Trailer;
it just forwards to the injected ItemsController. Per the PR review the agreed
direction is to deprecate it rather than keep maintaining the delegation.

Mark the action [Obsolete] so it is flagged as deprecated in the OpenAPI spec;
clients should use the GetItems operation with includeItemTypes=Trailer instead.

Re #17065
2026-06-19 07:03:58 +02:00
theguymadmax c6c72f30ec Fix embedded lyrics not updating on replace-all refresh 2026-06-18 18:14:10 -04:00
renovate[bot] 528593efbf Update actions/checkout action to v7 2026-06-18 15:50:57 +00:00
Bond-009 308981cc0d Merge pull request #14935 from JadedRain/master
Fixed "Deleting media that is still being watched in SyncPlay results in errors"
2026-06-18 17:46:33 +02:00
Bond-009 bebb7ce803 Merge pull request #17112 from theguymadmax/add-year-to-series-resolver
Fix series year lost during name parsing
2026-06-18 17:46:23 +02:00
Bond-009 1a6f019cfd Merge pull request #17121 from theguymadmax/fix-date-offset
Fix episode air date offset after initial scan
2026-06-18 17:46:07 +02:00
Bond-009 751b763838 Merge pull request #17099 from Bond-009/libraryimport
Follow native interoperability best practices
2026-06-18 17:45:55 +02:00
theguymadmax 64e02c0e28 Apply review feedback 2026-06-17 15:41:31 -04:00
Bond-009 49f8a96360 Merge pull request #17087 from dkanada/book-resolver
improve book resolution from filename
2026-06-17 20:54:49 +02:00
Bond-009 364f1e12c0 Merge pull request #17106 from Shadowghost/extend-transcoding-reason-reporting
Extend TranscodingReason reporting
2026-06-17 20:49:30 +02:00
Bond-009 ada11f5692 Always apply recursive when filters are requested (#17088) 2026-06-17 20:45:52 +02:00
Rant423 5036bf7db0 Fetch TV Shows creators from TMDB (#17107)
Fetch TV Shows creators from TMDB
2026-06-17 20:39:33 +02:00
Bond-009 1c4dea4b2c Merge pull request #17118 from jellyfin/renovate/sharpfuzz-2.x
Update dependency SharpFuzz to 2.3.0
2026-06-17 20:36:22 +02:00
Daniel Țuțuianu 1ea525a408 Merge branch 'master' into fix/livetv-channel-icon-refresh
Resolve GuideManager conflict by keeping LiveTvChannelImageHelper so
channel icons re-fetch on every guide refresh, including when the URL
is unchanged.
2026-06-17 06:16:42 +03:00
theguymadmax e525fc7c4b Fix episode air date offset after initial scan 2026-06-16 18:02:26 -04:00
Darren 3307406ac8 Translated using Weblate (Indonesian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/id/
2026-06-16 16:23:01 +00:00
Bond_009 e86b502cbc Strip null-terminator 2026-06-16 17:54:23 +02:00
Bond_009 4c228eaf63 Make sure we don't include the null terminator 2026-06-16 17:45:22 +02:00
renovate[bot] 1176c2d329 Update dependency SharpFuzz to 2.3.0 2026-06-16 11:32:11 +00:00
theguymadmax b9271eb199 Skip parsing root-level folders in SeriesResolver 2026-06-15 19:37:39 -04:00
Rohith e2433e2c79 Translated using Weblate (Kannada)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/kn/
2026-06-15 20:31:51 +00:00
Bond_009 0022508889 Add regression test 2026-06-15 21:20:06 +02:00
Bond_009 a9a02719ab Fix type of length arguments 2026-06-15 21:01:28 +02:00
Bond_009 d50205cc9f Follow native interoperability best practices
https://learn.microsoft.com/en-us/dotnet/standard/native-interop/best-practices
2026-06-15 21:01:28 +02:00
Bond-009 e4edce9a70 Merge pull request #17074 from jellyfin/renovate/sharpcompress-0.x
Update dependency SharpCompress to 0.49.1
2026-06-15 20:56:39 +02:00
Bond_009 ac92da233b await instead of returning Task 2026-06-15 20:41:30 +02:00
Bond_009 f6bb086415 fix build errors 2026-06-15 18:52:20 +02:00
renovate[bot] 9375f31bd3 Update dependency SharpCompress to 0.49.1 2026-06-15 16:28:58 +00:00
Bond-009 a0862a4cb5 Merge pull request #17109 from jellyfin/renovate/serilog.settings.configuration-10.x
Update dependency Serilog.Settings.Configuration to 10.0.1
2026-06-15 18:23:06 +02:00
Bond-009 2d8ab1e2ec Merge pull request #17089 from Bond-009/sharpcompress
Replace usage of SharpCompress
2026-06-15 18:18:49 +02:00
theguymadmax 068bbb7981 Fix series year lost during parsing 2026-06-15 11:42:17 -04:00
Shadowghost f9644f24d2 Fix tests 2026-06-15 11:42:48 +02:00
renovate[bot] 8d0003533e Update dependency Serilog.Settings.Configuration to 10.0.1 2026-06-15 08:45:54 +00:00
Shadowghost 1dd5a85080 Extend TranscodingReason reporting 2026-06-15 09:29:24 +02:00
Franco Castillo f5c3e2c65a Translated using Weblate (Spanish (Argentina))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es_AR/
2026-06-15 02:39:03 +00:00
dkanada f4bab458a2 improve book resolution from filename 2026-06-15 11:31:49 +09:00
Bond-009 8028e1d59d Merge pull request #17085 from matt-teahan/albumidsfix
Fix AlbumIds filtering by Name instead of by Id
2026-06-14 12:19:21 +02:00
Bond-009 1a9ed49083 Merge pull request #17075 from jellyfin/renovate/polly-monorepo
Update polly monorepo to 8.7.0
2026-06-14 12:13:31 +02:00
Bond-009 ab988d0e73 Merge pull request #17077 from SheaSmith/xmltv-background-images
Add support for background images and episode thumbnails from XMLTV
2026-06-14 11:06:12 +02:00
Bond-009 aa3fc60b2e Merge pull request #17072 from jellyfin/renovate/swashbuckle-aspnetcore-monorepo
Update swashbuckle-aspnetcore monorepo to 10.2.1
2026-06-13 22:21:39 +02:00
Bond_009 d8f8dbabcb Replace usage of SharpCompress
ComicImageProvider is the last user of SharpCompress after this PR
2026-06-13 22:19:30 +02:00
Matt Teahan 5df25cf688 Apply ParentId.Value suggestion
Co-authored-by: Bond-009 <bond.009@outlook.com>
2026-06-13 21:04:33 +01:00
Bond-009 047519c61a Merge pull request #17081 from Gadnief/fix/audiodb-album-description-en-fallback
Fix AudioDb album description not displayed for English (mirror of #16606)
2026-06-13 21:52:23 +02:00
renovate[bot] e198c430ae Update swashbuckle-aspnetcore monorepo to 10.2.1 2026-06-13 19:51:17 +00:00
Bond-009 3c11329256 Merge pull request #17071 from jellyfin/renovate/microsoft
Update Microsoft to 10.0.9
2026-06-13 21:50:27 +02:00
Bond-009 3d80da6cfa Merge pull request #17083 from theguymadmax/fix-key-collision
Fix duplicate key collision
2026-06-13 21:45:10 +02:00
Bond-009 db89b49752 Merge pull request #17051 from ivanjx/hydrate-eps
Assign correct season info to new episodes
2026-06-13 21:43:56 +02:00
Bond-009 21efb55db6 Merge pull request #17064 from Shadowghost/fix-clean-names-values
Fix CleanName and CleanValue refresh
2026-06-13 21:43:47 +02:00
Shadowghost a9dc8f6f74 Always apply recursive when filters are requested 2026-06-13 18:06:15 +02:00
Matt 23f8ec93ab Fix AlbumIds filtering by Name instead of by Id 2026-06-12 21:31:38 +01:00
Shadowghost a5706c2fa6 Reconcile Seasons and Episodes 2026-06-12 21:20:53 +02:00
theguymadmax d0a8445f76 Fix duplicate key collision 2026-06-12 11:44:26 -04:00
Dennis M 7e3f758bee Fix AudioDb album description not displayed when only base strDescription field is populated
TheAudioDB returns the English album description in the base strDescription
field (no language suffix). The plugin previously only read strDescriptionEN,
which is absent from the API response, so the Overview/Description field
stayed empty for English (and any other language for which no localized
strDescription<LANG> exists). Mirror the fallback already applied to
AudioDbArtistProvider in #16606 and add the missing strDescription property
to the Album DTO.

Fixes #17080
2026-06-12 12:53:45 +02:00
Shea Smith 8e2c5607ef Link up XMLTV background images and episode thumbnails with the internal program model 2026-06-12 20:39:10 +12:00
Shadowghost 4278b34fe6 Merge remote-tracking branch 'upstream/master' into version-model-and-handling 2026-06-12 08:35:39 +02:00
Shadowghost 0aeee8233b Fix performance 2026-06-12 08:35:30 +02:00
renovate[bot] 58508e60a4 Update polly monorepo to 8.7.0 2026-06-11 23:57:34 +00:00
renovate[bot] 2ede3c1342 Update Microsoft to 10.0.9 2026-06-11 09:16:21 +00:00
Andi Chandler dd42a121c4 Translated using Weblate (English (United Kingdom))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/en_GB/
2026-06-10 22:10:01 +00:00
Bond-009 5ac14f0688 Merge pull request #17058 from nyanmisaka/fix-trickplay-deint
Fix duplicate trickplay images for interlaced videos
2026-06-10 19:20:48 +02:00
Bond-009 d8acea21fb Merge pull request #16444 from dkanada/comic-providers
migrate local comic providers to server codebase
2026-06-10 19:20:20 +02:00
Bond-009 0ef94347c0 Merge pull request #17060 from jellyfin/renovate/dotnet-monorepo
Update dotnet monorepo to v10.0.9
2026-06-10 19:11:02 +02:00
Shadowghost 12f718e7bb Fix CleanName and CleanValue refresh 2026-06-10 10:09:01 +02:00
Lofuuzi 5920d8dc3c Translated using Weblate (Chinese (Traditional Han script, Hong Kong))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant_HK/
2026-06-10 07:26:21 +00:00
Shadowghost 95de28cdda Merge remote-tracking branch 'upstream/master' into version-model-and-handling 2026-06-10 08:05:03 +02:00
Shadowghost 0874a26131 Coalesce alternate-version progress onto primary in resume filter 2026-06-09 23:23:03 +02:00
renovate[bot] 25016babc1 Update dotnet monorepo to v10.0.9 2026-06-09 19:23:20 +00:00
Bond-009 eb38f462ad Merge pull request #17054 from nielsvanvelzen/pr-template
Add code assistance section to PR template
2026-06-09 21:13:53 +02:00
Elio Kuster 1bfbad2420 Fix missing collection folder posters after initial scans.
Fixes #1200
2026-06-09 20:34:24 +02:00
nyanmisaka c693047467 Fix duplicate trickplay images for interlaced videos
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2026-06-09 20:18:17 +08:00
Niels van Velzen 894ee38f68 Add code assistance section to PR template 2026-06-08 21:36:21 +02:00
Bond-009 97fd210cd3 Merge pull request #17042 from Shadowghost/linked-children-local-alternate-priority
Prefer local alternate versions when deduplicating linked children
2026-06-08 19:41:39 +02:00
Bond-009 1a786f26c1 Merge pull request #17041 from Shadowghost/media-source-handling-fixes
Media source handling fixes
2026-06-08 19:41:21 +02:00
Bond-009 007515eb73 Merge pull request #10841 from Bond-009/LiveTvImageFix
Refresh live TV channel image when remapped (alt #7843) (fixes #7834)
2026-06-08 19:40:08 +02:00
Ivan Kara 0a0060c9ca Assign correct season id and name to new episodes 2026-06-08 20:00:22 +07:00
nenadsuperzmaj 8b002e3fca Translated using Weblate (Serbian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/sr/
2026-06-08 12:26:21 +00:00
Thunderstrike116 f5cf68e979 Translated using Weblate (Greek)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/el/
2026-06-08 12:26:21 +00:00
skzeus f6ce2cedd9 Translated using Weblate (Greek)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/el/
2026-06-08 12:26:21 +00:00
Shadowghost e71914e993 Keep the queried item's media source as the playback default in MediaSourceManager 2026-06-07 23:06:48 +02:00
Shadowghost fbe522592a Include owned items when querying items endpoint 2026-06-07 23:06:48 +02:00
Shadowghost 59974490cc Fix MediaSegments for multi versions 2026-06-07 23:06:48 +02:00
Shadowghost dee63ef3f1 Fix data extraction for alternative versions 2026-06-07 23:06:48 +02:00
Shadowghost 2392e32779 Filter inaccessible alternative versions 2026-06-07 23:06:48 +02:00
Shadowghost 6c931dcdda Keep the queried item's media source as the playback default 2026-06-07 23:06:48 +02:00
Shadowghost f584759638 Drop linked alternate versions pointing at owned items in migration
(cherry picked from commit 40afd403a655ada6cfa30b577454bb766ea2099f)
2026-06-07 23:06:37 +02:00
Shadowghost fe1accc0e7 Prefer local alternate versions when deduplicating linked children
(cherry picked from commit 53f02a04ef7ff8f9d78c5f4e0924a0871b0e96fb)
2026-06-07 23:06:37 +02:00
Shadowghost fe1d8d8840 Collapse version groups to the primary version in queries 2026-06-07 23:06:14 +02:00
Shadowghost a53a533cc4 Respect user permissions in version count 2026-06-07 23:06:14 +02:00
Shadowghost 4725722b1c Make ContinueWatching and NextUp version-aware 2026-06-07 23:06:14 +02:00
Shadowghost 9ea3f45886 Make resume queries version-aware 2026-06-07 23:06:14 +02:00
Shadowghost e64cc73f88 Mark only linked alternate versions as grouped media sources 2026-06-07 23:06:14 +02:00
Shadowghost 63990d6a2d Surface extras across all versions 2026-06-07 23:06:14 +02:00
Shadowghost 09723bd123 Aggregate alternate versions via GetAllVersions 2026-06-07 23:06:14 +02:00
Shadowghost c242533f4e Add version-aware playback tracking 2026-06-07 23:06:14 +02:00
Shadowghost 507998a4e3 Derive version-aware media source names 2026-06-07 23:06:14 +02:00
Bond-009 4459147788 Merge pull request #16121 from Shadowghost/search-rebased
Implement search providers
2026-06-07 22:56:51 +02:00
Bond-009 003f01a99a Merge pull request #16520 from beateixeira04/PlaylistPrimaryImageFix
fix(dto): prefer PlaylistsFolder primary image for playlists tiles
2026-06-07 22:56:35 +02:00
Bond-009 f56670bdce Merge pull request #17043 from Shadowghost/fix-lockhelper-test-cancellationtoken
Fix xUnit1051 in UserManagerLockHelperTests
2026-06-07 22:51:22 +02:00
Tim Eisele d8d386e88a Apply suggestions from code review
Co-authored-by: Bond-009 <bond.009@outlook.com>
2026-06-07 22:07:35 +02:00
Shadowghost b4d970ae38 Fix xUnit1051 in UserManagerLockHelperTests 2026-06-07 22:04:00 +02:00
Bond-009 fa0e1b6e9a Merge pull request #17035 from theguymadmax/update-template-for-10.11.11
Update issue template version to 10.11.11
2026-06-07 20:35:40 +02:00
Bond-009 d873964297 Merge pull request #16945 from Shadowghost/scan-trickplay
Discover existing trickplay files on scan
2026-06-07 20:34:48 +02:00
JPVenson 6ccdaad0a4 Backport pull request #16944 from jellyfin/release-10.11.z
Add lockhelper for UserManager

Original-merge: 39958ad9e5

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-06-07 14:29:36 -04:00
Bond-009 ec43ea156e Merge pull request #16941 from Shadowghost/fix-external-data-pruning
Fix external data pruning on item deletion
2026-06-07 20:28:34 +02:00
Bond-009 cbf284d229 Merge pull request #17028 from Shadowghost/fix-external-sub-invalidation
Fix subtitle replacement not invalidating cache
2026-06-07 20:27:36 +02:00
Shadowghost 8aaea6ea52 Omit external trickplay directory if itme has no path 2026-06-07 14:56:31 +02:00
skzeus 3114c0a9b8 Translated using Weblate (Greek)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/el/
2026-06-07 11:40:00 +00:00
theguymadmax c9f9f30baf Update issue template version to 10.11.11 2026-06-07 02:05:22 -04:00
David Federman 0ed27bad65 Address PR comment 2026-06-06 21:55:30 -07:00
Bond-009 c8da0abf0f Merge pull request #17025 from Shadowghost/fix-playlist-visibility
Fix playlist visibility
2026-06-06 14:35:16 +02:00
Shadowghost a96824f257 Merge remote-tracking branch 'upstream/master' into fix-external-sub-invalidation 2026-06-05 23:41:05 +02:00
Bond-009 1a2db53710 Merge pull request #17024 from jellyfin/renovate/ci-deps
Update CI dependencies to v4.36.2
2026-06-05 18:30:23 +02:00
Bond-009 f4db44ffb3 Merge pull request #17019 from Shadowghost/enforce-parental
Enforce parental filtering on additional endpoints
2026-06-05 18:28:55 +02:00
Bond-009 b639166c0a Merge pull request #16998 from Bond-009/revertCodecPreference
Prefer subtitle extension over codec
2026-06-05 18:27:34 +02:00
Shadowghost efb0336369 Fix subtitle replacement not invalidating cache 2026-06-05 14:14:27 +02:00
Shadowghost 5f13afa1ce Fix playlist visibility 2026-06-04 19:08:48 +02:00
renovate[bot] 45e40d3b33 Update CI dependencies to v4.36.2 2026-06-04 16:58:38 +00:00
Bond-009 53c1c4982a Merge pull request #17018 from jellyfin/Bond-009-patch-1 2026-06-04 13:40:58 +02:00
Bond-009 21c0a35edf Merge pull request #16995 from theguymadmax/fix-flat-series
Fix season unknown for flat TV structures
2026-06-03 19:48:37 +02:00
Shadowghost 1b80da0c3d Do not set topParentId if OwnerIds are empty 2026-06-03 19:47:35 +02:00
Shadowghost 47f2b3b6d0 Enforce parental filtering on additional endpoints 2026-06-03 19:35:10 +02:00
Bond-009 857b99ce61 Improve Merge Conflict Labeler
Based on the README of the action
https://github.com/eps1lon/actions-label-merge-conflict

Filters based on activity type before starting the action
2026-06-03 19:29:25 +02:00
Bond-009 cf88058099 Merge pull request #17006 from jellyfin/renovate/ci-deps
Update CI dependencies
2026-06-03 19:18:24 +02:00
Bond-009 5ee9e79da2 Merge pull request #16915 from Shadowghost/batch-attachment-extract
Extract attachments in one ffmpeg command when dumping
2026-06-03 18:16:35 +02:00
Bond-009 5ed7798c36 Merge pull request #17007 from nyanmisaka/make-encoder-preset-non-nullable
Make EncoderPreset non nullable
2026-06-03 18:16:21 +02:00
Bond-009 b71b4cc26f Merge pull request #16999 from Shadowghost/fix-recursive
Only default recursive to true if we have includeItemTypes
2026-06-03 18:16:09 +02:00
David Federman 26a149a970 Address PR comment 2026-06-03 08:04:39 -07:00
David Federman 5104497331 Reject unsafe plugin package names in installer 2026-06-02 23:12:50 -07:00
Bond-009 7185257da5 Merge pull request #16996 from theguymadmax/Fix-movie-capacity
Fix incorrect list capacity
2026-06-02 18:38:02 +02:00
renovate[bot] d4c962f6e4 Update CI dependencies 2026-06-02 16:34:01 +00:00
Bond-009 52cf8d1ba4 Merge pull request #16994 from theguymadmax/trim-tags
Trim tags
2026-06-02 18:24:08 +02:00
nyanmisaka 081f0ef4a0 Make EncoderPreset non nullable
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2026-06-02 20:41:30 +08:00
Bond-009 53eda14dcc Merge pull request #16967 from Shadowghost/fix-recently-added-posters
Fix recently added episode links and posters
2026-06-01 21:59:06 +02:00
Bond-009 0d30a59564 Merge pull request #16991 from jellyfin/renovate/z440.atl.core-7.x
Update dependency z440.atl.core to 7.15.3
2026-06-01 21:58:41 +02:00
Shadowghost cc5fb3f1ee Only default recursive to true if we have includeItemTypes 2026-06-01 21:54:49 +02:00
Bond_009 d69de6ccc4 Prefer subtitle extension over codec 2026-06-01 20:57:59 +02:00
Bond-009 54463929d0 Write subtitles using SubtitleEdit (#16805)
* Write subtitles using SubtitleEdit

We've been using SubtitleEdit to parse since 2021
https://github.com/jellyfin/jellyfin/pull/4984

I think it's time we start using it to write too

* Clean up ConvertSubtitles

* Add JsonWriter back
2026-06-01 19:43:57 +02:00
Bond-009 ab15371d86 Merge pull request #16992 from theguymadmax/disable-legacy-auth
Re-disable legacy authorization methods by default
2026-06-01 19:43:42 +02:00
Tim Eisele c7111b7570 Only resolve symlinks on playback (#16965)
Only resolve symlinks on playback
2026-06-01 19:43:25 +02:00
theguymadmax 9ab7cc0fe9 Fix incorrect list capacity 2026-06-01 11:20:08 -04:00
theguymadmax 285fc1b9f6 Fix season unknown for flat tv structures 2026-06-01 10:40:52 -04:00
theguymadmax 5ce7170813 Trim tags 2026-05-31 21:13:34 -04:00
theguymadmax a6ae68433a Re-disable legacy authorization methods by default 2026-05-31 15:12:44 -04:00
Shadowghost bdb8250300 Fix filename 2026-05-31 20:02:00 +02:00
Bond-009 8b387c82cf Merge pull request #16259 from theguymadmax/fix-season-in-mixed-library
Fix folders being identified as seasons in mixed libraries
2026-05-31 19:18:44 +02:00
Shadowghost a2bab98c23 Merge remote-tracking branch 'upstream/master' into search-rebased 2026-05-31 18:24:26 +02:00
Arazil 9397148b20 Fix Schedules Direct API Error Codes (#16920)
* Clean up Schedules Direct error handling.

* Rename MaxImageDownloads2 to MaxImageDownloadsTrial per suggestion.

* Fix documentation.

* Fix incorrect 3XXX series codes.

* Rename SvcUnavailable to SvcOffline.

* Change 3XXX error code prefix from Svc to Service.
2026-05-31 17:22:00 +02:00
Tim Eisele 63d1af5fe7 Fix similarity (#16942)
Fix similarity
2026-05-31 17:21:15 +02:00
Bond-009 3d6d6c18f9 Merge pull request #16984 from jellyfin/renovate/swashbuckle-aspnetcore-monorepo
Update swashbuckle-aspnetcore monorepo to 10.2.0
2026-05-31 17:20:46 +02:00
Bond-009 c13af99320 Fix inaccessible artist when they exist in multiple libraries (#16977) 2026-05-31 17:20:17 +02:00
Neptune 6f0ff89bdc Add support for VobSub subtitle streams (#16552)
* Add support for VobSub subtitle streams

* update logic to determine separate extraction for VobSub subtitles

* simplify VobSub extraction logic and fix ffmpeg command

* Match `ExtractAllExtractableSubtitlesMKS` with `ExtractAllExtractableSubtitlesInternal` Matroska's VobSub option

* Add a comments clarify why MKS was used, and remove the redundant VobSub extension branch

* remove redundant VobSub format check

* fix type errors
2026-05-31 17:18:25 +02:00
Bond-009 13c6549b42 Merge pull request #16936 from IDisposable/stable-nfo
Compare old file byte-by-byte to new stream
2026-05-31 17:18:05 +02:00
Bond-009 bee53dee54 Merge pull request #16976 from PCEWLKR/investigate-remove-nowplayingqueuefullitems
Remove NowPlayingQueueFullItems from session DTOs
2026-05-31 17:17:15 +02:00
renovate[bot] 7f8e39b21e Update dependency z440.atl.core to 7.15.3 2026-05-31 10:15:42 +00:00
Bond_009 1dd02b0e30 Add JsonWriter back 2026-05-30 21:42:57 +02:00
Bond_009 2b6da44815 Clean up ConvertSubtitles 2026-05-30 21:42:19 +02:00
Bond_009 941298ee81 Write subtitles using SubtitleEdit
We've been using SubtitleEdit to parse since 2021
https://github.com/jellyfin/jellyfin/pull/4984

I think it's time we start using it to write too
2026-05-30 21:09:10 +02:00
renovate[bot] f178e3ebff Update swashbuckle-aspnetcore monorepo to 10.2.0 2026-05-30 18:49:39 +00:00
Shadowghost a479e145dc Merge remote-tracking branch 'upstream/master' into search-rebased
# Conflicts:
#	Emby.Server.Implementations/Library/LibraryManager.cs
#	Jellyfin.Server.Implementations/Item/PeopleRepository.cs
#	MediaBrowser.Controller/Library/ILibraryManager.cs
#	MediaBrowser.Controller/Persistence/IPeopleRepository.cs
2026-05-30 19:09:11 +02:00
TheMelmacian 7939f3b009 only fetch language codes for the requested library when generating filter values 2026-05-30 16:33:59 +02:00
Bond-009 99e9b2310f Merge pull request #16953 from PCEWLKR/fix-configureawait-collectioncontroller
Use ConfigureAwait(false) in CollectionController
2026-05-30 14:32:50 +02:00
theguymadmax ad4e884d18 Fix inaccessible artist when they exist in multiple libraries 2026-05-30 01:31:29 -04:00
PCEWLKR a3b2b9c07f Remove the unused NowPlayingQueueFullItems session property from session DTOs and associated references 2026-05-29 22:07:31 -04:00
Marc Brooks 5c7ee6a635 Improved resilience for fast-paths
Use fast paths only if we can TryGetBuffer on MemoryStream using segment's Array.
Reduce swap overhead for fast path B.
Avoid multiple virtcalls by memoizing the CanSeeks.
Overlap slow path stream async reads.
2026-05-29 15:54:58 -05:00
Bond-009 2a95223c67 Fix CA2007 warnings in InstallationManager (#16946)
Wrap the downloaded stream in an explicit await using block with
ConfigureAwait(false), matching the pattern already used in
LiveStreamHelper and similar callers. Also add ConfigureAwait(false)
to the ZipFile.ExtractToDirectoryAsync call.

Part of #2149
2026-05-29 20:01:20 +02:00
Sam Xie c9f71d8531 Add a collection API for Included In feature (#15516)
Add a collection API for `Included In` feature
2026-05-29 20:00:34 +02:00
Bond-009 b6e26ba3d9 Merge pull request #16177 from theguymadmax/homevideo-viewtypes
Add new viewtypes options
2026-05-29 19:54:20 +02:00
Shadowghost 5feb70f489 Fix recently added episode links and posters 2026-05-29 10:41:50 +02:00
Bond-009 0beb07c407 Merge pull request #16963 from jellyfin/Bond-009-mergeconflict 2026-05-28 23:01:33 +02:00
Marc Brooks 645ae6bb99 Use ReadAtLeastAsync to handle short-reads.
Seeks to beginning of streams if CanSeek is true.
Added remarks about stream position.
Add test coverage for short-reads.
Fix fast-path tests to actually test the fast path.
Also fix class comment.
2026-05-28 13:31:13 -05:00
Bond-009 34fc8c270c Fix Merge Conflict Labeler #2 2026-05-28 19:37:06 +02:00
Piotr Niełacny 8d544e4842 Fix A/V desync when resuming HLS with video transcode + audio copy (#16580)
Fix A/V desync when resuming HLS with video transcode + audio copy
2026-05-28 19:26:28 +02:00
Bond-009 ef9468e857 Merge pull request #16949 from jellyfin/renovate/ci-deps
Update CI dependencies
2026-05-28 19:19:23 +02:00
renovate[bot] fa3a33c04e Update CI dependencies 2026-05-28 03:41:28 +00:00
Marc Brooks 1752323296 Add unit tests for new public methods. 2026-05-27 20:18:18 -05:00
Marc Brooks f12b666cbb Remove IsStreamIdenticalAsync CanSeek requirement
Now only uses for the Length mismatch.
2026-05-27 20:13:52 -05:00
Marc Brooks aa2370e021 Use TryGetBuffer() on MemoryStreams
Also now throws if the streams are no CanSeek.
2026-05-27 19:56:36 -05:00
PCEWLKR d085eb9d87 Use ConfigureAwait(false) in CollectionController.cs to maintain consistency with the existing async pattern 2026-05-27 19:20:21 -04:00
Bond-009 2f17516d4b Merge pull request #16856 from Shadowghost/movie-recommendations
Fix movie recommendations
2026-05-27 20:59:18 +02:00
Bond-009 cbd0c5b841 Update dependency z440.atl.core to 7.14.0 (#16938)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-27 19:13:12 +02:00
Bond-009 321b83c693 Update dependency Microsoft.NET.Test.Sdk to 18.6.0 (#16943)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-27 19:13:02 +02:00
Bond-009 ecd9c9079b Merge pull request #16455 from jellyfin/renovate/skiasharp-monorepo
Update skiasharp monorepo
2026-05-27 19:12:52 +02:00
Michael Jones b555de4cea Fix CA2007 warnings in InstallationManager
Wrap the downloaded stream in an explicit await using block with
ConfigureAwait(false), matching the pattern already used in
LiveStreamHelper and similar callers. Also add ConfigureAwait(false)
to the ZipFile.ExtractToDirectoryAsync call.

Part of #2149
2026-05-26 22:24:16 -05:00
Marc Brooks c449a93372 Explicitly handle MemoryStream(s) 2026-05-26 18:12:31 -05:00
Marc Brooks 02ca63cd13 Moved IsFileIdenticalAsync & IsStreamIdenticalAsync to StreamExtensions. 2026-05-26 18:12:31 -05:00
Marc Brooks 961c6d3d54 Compare old file byte-by-byte to new stream
Don't overwrite if identical.
2026-05-26 18:12:31 -05:00
Shadowghost 9f350171c6 Discover existing trickplay files on scan 2026-05-27 00:33:31 +02:00
Bond_009 f0e01e33c4 Unpin SkiaSharp 2026-05-26 21:37:53 +02:00
Erik W 4af66c4e1a Improve OriginalLanguage normalization and inheritance (#16829)
Improve OriginalLanguage normalization and inheritance
2026-05-26 21:02:43 +02:00
Bond-009 b015d2d219 Merge pull request #16913 from nyanmisaka/fix-extradata-in-amd-hevc-vaapi-encoder
Fix inconsistent extradata generated by hevc_vaapi on AMD driver
2026-05-26 21:00:16 +02:00
renovate[bot] fdfdf34cdb Update dependency Microsoft.NET.Test.Sdk to 18.6.0 2026-05-26 18:59:55 +00:00
Bond-009 12c1711dc1 Update issue template version to 10.11.10 (#16927) 2026-05-26 20:59:43 +02:00
Bond-009 11130030d2 Backport: Fix/user manager collation (#16919)
Backport: Fix/user manager collation
2026-05-26 20:59:20 +02:00
Shadowghost a05bde53d4 Fix external data pruning on item deletion 2026-05-26 20:44:03 +02:00
renovate[bot] dd3aa04422 Update dependency z440.atl.core to 7.14.0 2026-05-26 07:28:33 +00:00
Antonio Toledo d0f1df13b2 Translated using Weblate (Spanish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es/
2026-05-26 07:26:19 +00:00
WizardOfYendor1 e1d63c0ea0 Fixed issue etag info was not being set until the 3rd time though processing due to the "isNew" condition. Etag wouldn't be saved/persistent until the 3rd time through and onward.
Without this change it's self healing after the 3rd cycle.

It also appears there may be an issue with this etag "skip if hash hasn't changed" for schedules direct functionality.... like it never will work. But out of scope here.

Also fixed Sonar gripes about code formatting
2026-05-25 20:04:45 -04:00
WizardOfYendor1 e1a16b4ec6 Add XMLTV guide content ETags 2026-05-25 20:04:21 -04:00
Bill Thornton 9fafc87bf6 Deleted translation using Weblate (English (Middle)) 2026-05-25 16:55:58 +00:00
theguymadmax 148cdef180 Update issue template version to 10.11.10 2026-05-25 10:08:02 -04:00
renovate[bot] f9eb550cbb Update skiasharp monorepo 2026-05-25 11:02:16 +00:00
Shadowghost cb9d6e9884 Add batch method for people names 2026-05-24 18:26:21 +02:00
Shadowghost 1175846120 Merge remote-tracking branch 'upstream/master' into search-rebased 2026-05-24 18:25:12 +02:00
joanluc 498d265208 Translated using Weblate (Occitan)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/oc/
2026-05-24 14:38:30 +00:00
Nitzan Selwyn 4322ee4391 Translated using Weblate (Hebrew (Israel))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/he_IL/
2026-05-24 14:38:29 +00:00
Ekaterine Papava a784733a53 Translated using Weblate (Georgian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ka/
2026-05-24 14:38:28 +00:00
Nitzan Selwyn 0b25c1483c Translated using Weblate (Hebrew (Israel))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/he_IL/
2026-05-24 10:26:23 +00:00
Ekaterine Papava 93b82ecb41 Translated using Weblate (Georgian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ka/
2026-05-24 10:26:20 +00:00
Bas 317f57803d Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2026-05-24 10:26:19 +00:00
Shadowghost e627c723e2 Extract attachments in one ffmpeg command when dumping 2026-05-23 22:41:44 +02:00
Daniel Țuțuianu 372c1681d8 Refresh Live TV channel icons on every guide update.
Guide refresh skipped channel logos once a primary image existed, so stale EPG/tuner icons never got replaced.
2026-05-23 23:29:25 +03:00
nyanmisaka 69b0b63a95 Fix inconsistent extradata generated by hevc_vaapi on AMD driver
This change is required for upstream ffmpeg 8+, because its
mp4 muxer will drop in-band PS when using codec tag hvc1.

Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2026-05-24 03:34:54 +08:00
Bond-009 31f4ce93a6 Merge pull request #16872 from psavarmattas/fix/priority-class-warning-spam
fix: suppress repeated PriorityClass warning in MediaEncoder
2026-05-23 19:22:34 +02:00
Bond-009 b615ecd704 Merge pull request #16897 from theguymadmax/update-template-for-10.11.9
Update issue template version to 10.11.9
2026-05-23 19:21:53 +02:00
Bond-009 4897cc7e2e Merge pull request #16893 from Shadowghost/fix-playlist-filter
Add support for filtering playlists by parentId
2026-05-23 19:21:29 +02:00
chasus 9569b4550d Fix Swagger UI auth docs (#12990) 2026-05-24 00:04:10 +10:00
lednurb a3849819c2 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2026-05-23 07:57:47 +00:00
Klomer 863730e647 Translated using Weblate (Breton)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/br/
2026-05-23 07:46:28 +00:00
Ekaterine Papava 26dbd86b81 Translated using Weblate (Georgian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ka/
2026-05-23 07:46:27 +00:00
someone522 17a32f055c Translated using Weblate (Uzbek)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/uz/
2026-05-23 07:46:27 +00:00
Maldark df6296bc30 Translated using Weblate (Danish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/da/
2026-05-23 07:46:26 +00:00
Bond-009 7e72bc6e9c Merge pull request #16891 from jellyfin/renovate/actions-checkout-6.x
Update actions/checkout action to v6
2026-05-22 17:23:50 +02:00
renovate[bot] aacb147f4d Update actions/checkout action to v6 2026-05-22 15:21:22 +00:00
Bond-009 6296a03342 Merge pull request #16890 from jellyfin/renovate/ci-deps
Update CI dependencies
2026-05-22 17:20:14 +02:00
renovate[bot] 8ddb485192 Update CI dependencies 2026-05-22 11:41:30 +00:00
Bond-009 400d7d83bc Merge pull request #16892 from jellyfin/Bond-009-mergeconflict 2026-05-22 13:38:57 +02:00
someone522 4ca3cd79fa Translated using Weblate (Uzbek)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/uz/
2026-05-22 06:18:56 +00:00
theguymadmax 623b1c39e5 Update issue template version to 10.11.9 2026-05-21 20:42:19 -04:00
Shadowghost 5ed3ffdb42 Use embedded query 2026-05-22 00:10:41 +02:00
theguymadmax b141b893eb Add new viewtypes 2026-05-21 16:30:30 -04:00
Shadowghost 4361e073ed Add support for filtering playlists by parentId 2026-05-21 22:21:18 +02:00
Bond-009 17e2d3bb11 Fix Merge Conflict Labeler
https://github.com/eps1lon/actions-label-merge-conflict#example-usage
2026-05-21 21:40:30 +02:00
Bond-009 e2fe5c163a Merge pull request #15250 from jakobkukla/ci-format
Add CI format check
2026-05-21 21:33:31 +02:00
Lino Silva bc8a66a351 Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt/
2026-05-21 18:49:33 +00:00
jakobkukla 0ef4f86ed7 Add CI format check 2026-05-21 20:48:43 +02:00
jakobkukla eb2cef1b7e Fix StyleCop pattern matching whitespace false-positive 2026-05-21 20:48:43 +02:00
jakobkukla 37350282cc Run tree-wide dotnet format 2026-05-21 20:48:41 +02:00
Bond_009 3d8bcf1ffd Alternate solution to #7843 without extra prop 2026-05-21 20:10:21 +02:00
Bond-009 e63bc1e27c Merge pull request #16861 from JPVenson/fix/fixMigrations12.0
Reorder Migrations and fix failing migration
2026-05-21 19:32:57 +02:00
Bond-009 4209b3ba51 Add support for filtering boxsets by parentId (#16882) 2026-05-21 19:32:39 +02:00
Ethan Pippin 40485aa2f6 Have device deletion take list of ids (#12834)
* add delete multiple devices via id

* make atomic

* use Add

* Update Jellyfin.Api/Controllers/DevicesController.cs

Co-authored-by: JPVenson <ger-delta-07@hotmail.de>

* remove model binding, use functional device selection

* use singular id

* use BadRequest instead

---------

Co-authored-by: JPVenson <ger-delta-07@hotmail.de>
2026-05-21 19:30:24 +02:00
JPVenson 49cc2f7899 Modernize version display in UI (#16862)
Modernize version display in UI
2026-05-21 19:27:55 +02:00
Bond-009 11ca3ade86 Merge pull request #16855 from Shadowghost/fix-local-plugin-images
Fix integrated provider images
2026-05-21 19:27:46 +02:00
Bond-009 fa734df82f Merge pull request #16878 from IDisposable/fix/overwrite-gpg-quietly
Use --batch --yes for installing jellyfin keyring in devcontainer
2026-05-21 19:21:00 +02:00
Bond-009 fbfaa4f661 Merge pull request #16889 from jellyfin/renovate/ci-deps
Update actions/stale action to v10.3.0
2026-05-21 19:20:36 +02:00
aleksantero d65eafdfe2 Translated using Weblate (Finnish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fi/
2026-05-21 11:14:47 +00:00
Ekaterine Papava 51ff31cd41 Translated using Weblate (Georgian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ka/
2026-05-21 07:45:43 +00:00
Bijai Chandra 2ed07155b2 Translated using Weblate (Malayalam)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ml/
2026-05-21 07:45:43 +00:00
renovate[bot] c6fd0be892 Update actions/stale action to v10.3.0 2026-05-21 07:02:03 +00:00
Klomer 325be80a2b Translated using Weblate (Breton)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/br/
2026-05-21 01:25:06 +00:00
Bas 3e5cf13968 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2026-05-21 01:25:03 +00:00
Klomer 9f7eee2592 Translated using Weblate (Breton)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/br/
2026-05-20 16:59:21 +00:00
Klomer 57bc534f40 Added translation using Weblate (Breton) 2026-05-20 16:49:51 +00:00
Landyn Frisby afb4d180d9 Translated using Weblate (Maori)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/mi/
2026-05-20 10:59:54 +00:00
Ekaterine Papava 5bc7969c2c Translated using Weblate (Georgian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ka/
2026-05-20 10:59:53 +00:00
Shadowghost 9dfcc0918f Add support for filtering boxsets by parentId 2026-05-20 11:34:45 +02:00
Marc Brooks 8384ef8a04 Use --batch --yes for installing jellyfin keyring in devcontainer
Fixes the .devcontainer setup's install-ffmpeg.sh halting at
File '/etc/apt/keyrings/jellyfin.gpg' exists. Overwrite? (y/N)
2026-05-19 17:29:27 -05:00
Bond-009 2b2db76948 Merge pull request #16448 from LTe/feat/embedded-subtitles
Embed external subtitles into MKV when transcoding
2026-05-19 19:08:15 +02:00
Fjuro e805cd4df7 Translated using Weblate (Czech)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/cs/
2026-05-19 16:39:40 +00:00
Bond-009 c436c9ff29 Merge pull request #16870 from jellyfin/renovate/coverlet.collector-10.x
Update dependency coverlet.collector to 10.0.1
2026-05-19 18:26:01 +02:00
Bond-009 7d744009ad Merge pull request #16871 from jellyfin/renovate/ghcr.io-devcontainers-features-docker-in-docker-3.x
Update ghcr.io/devcontainers/features/docker-in-docker Docker tag to v3
2026-05-19 18:25:52 +02:00
Piotr Niełacny f6af1a9fb6 Use file-scoped namespace in EncodingHelperTests 2026-05-19 13:03:07 +02:00
Piotr Niełacny 405d987557 Normalize VobSub .sub to .idx for embedding, add EncodingHelper tests
Move the .sub to .idx path normalization outside the burn-in check so
it applies to subtitle embedding as well. ffmpeg requires the .idx file
to read VobSub subtitles.

Add unit tests for GetMapArgs and GetInputArgument covering internal
subs, external SRT, multi-file SRT, multi-stream MKS containers, and
VobSub .sub/.idx path normalization.
2026-05-19 13:03:07 +02:00
Piotr Niełacny a15b426e73 Fix external subtitle stream mapping for multi-stream containers
Compute the in-file stream index for external subtitles instead of
hardcoding -map 1:0. For single-stream files (SRT/ASS/VTT) the index
is always 0, preserving existing behavior. For multi-stream containers
like MKS, the correct track is selected by counting sibling streams
that share the same Path.

Add unit tests for GetMapArgs covering internal subs, external SRT,
multiple external files, and multi-stream MKS containers.
2026-05-19 13:03:07 +02:00
Piotr Niełacny 2a689f268b Embed external subtitles into MKV when transcoding
Allow external subtitle files (SRT, ASS, PGS, etc.) to be muxed into
MKV output containers when the device profile requests Embed delivery.

Previously, the IsExternal guard in GetSubtitleProfile excluded external
subtitles from Embed consideration entirely, forcing them to be served
as separate sidecar files even when the output container supports
embedding.

Changes:
- Extract CanConsiderEmbedSubtitle in StreamBuilder to allow external
  subs through when transcoding to MKV
- Add external subtitle file as FFmpeg input (-i) for Embed delivery
- Map external embedded subs from the correct FFmpeg input index
- Fix external audio map index to account for the new subtitle input
- Extract NeedsExternalSubtitleMuxing in EncodingHelper to deduplicate
  the external subtitle input check

Fixes #16403
2026-05-19 13:03:07 +02:00
Gargotaire 2c66447f08 Translated using Weblate (Catalan)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ca/
2026-05-18 20:53:57 +00:00
Bond-009 43e869f832 Update dependency Svg.Skia to 3.7.0 (#16371)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-18 20:26:14 +02:00
Tayfun Akgüç 8deb5c1d2a fix: write livetv recording NFO dateadded as UTC (#16863)
fix: write livetv recording NFO dateadded as UTC
2026-05-18 20:22:20 +02:00
Bond-009 077ad5c574 Merge pull request #16772 from jellyfin/renovate/bitfaster.caching-2.x
Update dependency BitFaster.Caching to 2.6.0
2026-05-18 20:01:40 +02:00
Aindriú Mac Giolla Eoin 3a4e6236a8 Translated using Weblate (Irish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ga/
2026-05-18 17:22:24 +00:00
DyingSlacker c4957dff31 Translated using Weblate (Chinese (Simplified Han script))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hans/
2026-05-18 17:22:24 +00:00
Vilhelm Prytz ed27de13a0 Translated using Weblate (Swedish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/sv/
2026-05-18 17:22:24 +00:00
Dan Tsivinsky e00d01cc30 Translated using Weblate (Russian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ru/
2026-05-18 17:22:24 +00:00
PlinioRegisNeto 2c7addc671 Translated using Weblate (Portuguese (Brazil))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt_BR/
2026-05-18 17:22:24 +00:00
Vincenzo Reale dac6b70f52 Translated using Weblate (Italian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/it/
2026-05-18 17:22:23 +00:00
Szilki077 5e8b86f80c Translated using Weblate (Hungarian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hu/
2026-05-18 17:22:23 +00:00
GolanGitHub 07c63d5ebf Translated using Weblate (Spanish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es/
2026-05-18 17:22:23 +00:00
psmattas 80a552a35d fix: suppress repeated PriorityClass warning in MediaEncoder
When Jellyfin runs without permission to set process priority (e.g.
Docker), StartProcess() logged a warning for every file probed during
a library scan. Add a _canSetProcessPriority flag: warn once on first
failure, skip all subsequent attempts.

Fixes #15287
2026-05-18 14:40:34 +01:00
renovate[bot] 8d28c15e3e Update ghcr.io/devcontainers/features/docker-in-docker Docker tag to v3 2026-05-18 13:27:47 +00:00
renovate[bot] 3430f4fa57 Update dependency Svg.Skia to 3.7.0 2026-05-18 13:27:37 +00:00
renovate[bot] 3a1bd5984d Update dependency BitFaster.Caching to 2.6.0 2026-05-18 13:27:29 +00:00
renovate[bot] 7e7bacd013 Update dependency coverlet.collector to 10.0.1 2026-05-18 13:27:11 +00:00
rimasx 8b84bf6e21 Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/et/
2026-05-17 22:28:57 +00:00
Translation expert aa960dc696 Translated using Weblate (Arabic)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ar/
2026-05-17 22:28:56 +00:00
Bond-009 f14ab37bf5 Misc fixes (#16837)
* Order chapter response by start time

* Properly handle cancellation in MediaSegmentManager

* Prevent unecessary log spam in NetworkUtils

* Fixup
2026-05-17 14:07:43 +02:00
Bruno Ferreira 2f8bf92fb8 fix: add null check for non-existent program in GetProgram (#16858)
fix: add null check for non-existent program in GetProgram
2026-05-17 14:01:39 +02:00
Luca ed3c62b66e Translated using Weblate (Romanian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ro/
2026-05-16 19:34:18 +00:00
Shadowghost 8740f3d154 Move ComicVine and GoogleBooks ExternalUrl providers to MediaBrowser.Providers.Books 2026-05-16 18:52:20 +02:00
Shadowghost d6240bfa88 Apply review suggestions 2026-05-16 18:20:00 +02:00
Shadowghost 3655b4b094 Apply review and sonar suggestions 2026-05-16 16:14:18 +02:00
rimasx 5c3c3e35b9 Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/et/
2026-05-16 09:08:16 +00:00
lednurb 6b1378fa89 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2026-05-16 09:08:16 +00:00
Shadowghost ea8f6c51fd Merge remote-tracking branch 'upstream/master' into search-rebased 2026-05-16 09:57:06 +02:00
Shadowghost d71194aa8c Parallelize internal and external calls 2026-05-16 09:50:33 +02:00
Shadowghost 1fdf58e40f Address review comments 2026-05-16 09:44:36 +02:00
Bond-009 c4a21cb322 Merge pull request #16853 from jtvhd6/fix/ca1819-channel-features
Fix CA1819 warnings in ChannelFeatures by using IReadOnlyList
2026-05-15 22:57:36 +02:00
Bond-009 31005e878b Merge pull request #16857 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v4.35.5
2026-05-15 22:42:53 +02:00
Bond-009 19ce23c3c8 Merge pull request #16852 from theguymadmax/splashscreen-pg13
Set max rating for splashscreen to 13
2026-05-15 22:42:32 +02:00
JPVenson 9d20aefd89 Reorder migration handling for extra column 2026-05-15 20:10:33 +00:00
JPVenson f73fc1feb2 Update filenaming scheme to match EFCore one 2026-05-15 19:03:08 +00:00
Shadowghost 09e607db99 Fix integrated provider images 2026-05-15 18:42:11 +02:00
Thadah D. Denyse 20dda72cec Translated using Weblate (Basque)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/eu/
2026-05-15 15:55:56 +00:00
serzh-photograf 72492d95b4 Translated using Weblate (Ukrainian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/uk/
2026-05-15 15:55:56 +00:00
queeup 9c184ceed7 Translated using Weblate (Turkish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/tr/
2026-05-15 15:55:55 +00:00
Kityn c53133bf9b Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pl/
2026-05-15 15:55:55 +00:00
renovate[bot] c63c7aa176 Update github/codeql-action action to v4.35.5 2026-05-15 13:45:18 +00:00
Bond-009 9d420271ad Merge pull request #9787 from TheMelmacian/feature/language_filters
New filters for audio and subtitle languages
2026-05-15 15:44:22 +02:00
Shadowghost 97c20e6ac5 Fix movie recommendations 2026-05-15 14:37:01 +02:00
TheMelmacian fae4950ac2 Apply suggestions from code review
Co-authored-by: Bond-009 <bond.009@outlook.com>
2026-05-15 12:00:00 +02:00
Bas d93e2d6667 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2026-05-15 09:47:36 +00:00
Bond-009 31889c0215 Merge pull request #16828 from Shadowghost/episode-multiple-versions
Implement multiple versions for episodes.
2026-05-15 10:19:28 +02:00
JPVenson 8ec3b5c7ac readded concurrency exception check 2026-05-15 04:06:09 -04:00
Bond-009 8e602f982f Merge pull request #15970 from Shadowghost/similarity
Implement similarity providers
2026-05-15 10:00:53 +02:00
hoanghuy309 097097300a Translated using Weblate (Vietnamese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/vi/
2026-05-15 07:44:32 +00:00
bhoriss ac8e5780d6 Translated using Weblate (French)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fr/
2026-05-15 07:44:31 +00:00
bhoriss 27a8d29aba Translated using Weblate (French (Canada))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fr_CA/
2026-05-15 07:44:31 +00:00
PhillyMay 2acefba085 Translated using Weblate (German)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/de/
2026-05-15 07:44:31 +00:00
Joseph Vallas 6fdb423bfb Fix CA1819 warnings in ChannelFeatures by using IReadOnlyList 2026-05-14 19:43:58 -05:00
Weblate 1cfef32906 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/
2026-05-14 22:57:17 +00:00
Cody Robibero 0a5a1f135f Add Accept-Language header support and cleanup translations (#16488)
* Add Accept-Language header support for per-request localization

* Use native middleware

* Cleanup

* Add Fallback

* Build BCP47 map reflexively

* Address review comments
2026-05-14 18:57:11 -04:00
theguymadmax 031b9a11b8 Set max rating for splashscreen to 13 2026-05-14 18:43:39 -04:00
Shadowghost 0b209fe66b Add Listenbrainz plugin Logo 2026-05-14 08:05:29 +02:00
Shadowghost ae7a8c418b Make Cache duration user configurable 2026-05-14 07:56:19 +02:00
Bond-009 e6e19e3ce0 Merge pull request #16833 from jellyfin/renovate/microsoft
Update Microsoft to 10.0.8
2026-05-14 07:52:16 +02:00
Bond-009 1b14ee6e11 Merge pull request #16832 from jellyfin/renovate/dotnet-monorepo
Update dependency dotnet-ef to v10.0.8
2026-05-14 07:52:08 +02:00
Bond-009 a8ab398fab Merge pull request #16835 from JPVenson/fix/adaptLoggingForUserConcurrency
Update log for user session related concurrency update fails
2026-05-14 07:47:21 +02:00
Shadowghost 7a5181c3fd Address review comments 2026-05-14 07:46:43 +02:00
Shadowghost 1751c5b45d Fixup 2026-05-14 07:42:50 +02:00
Weblate 157431475f Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/
2026-05-14 02:32:47 +00:00
Mateusz Lesiak 651fe2b7b3 Translated using Weblate (Haitian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ht/
2026-05-14 02:32:43 +00:00
hoanghuy309 78abe79764 Translated using Weblate (Vietnamese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/vi/
2026-05-14 02:32:41 +00:00
TheMelmacian 068b3fd58d remove language filters from old Items endpoint 2026-05-14 01:01:56 +02:00
Shadowghost 4f81f29a90 Fix multipart version item creation 2026-05-13 23:10:05 +02:00
Shadowghost b8c0017b74 Build BCP47 map reflexively 2026-05-13 21:23:53 +02:00
Shadowghost c91f640d37 Support stacked multi versions 2026-05-13 21:17:40 +02:00
Bond-009 3b452c3682 Merge pull request #16721 from dkanada/music-artists
return music artists from person endpoints
2026-05-13 19:05:19 +02:00
Shadowghost e811cd7caf Prevent unecessary log spam in NetworkUtils 2026-05-13 13:47:56 +02:00
Shadowghost 38bda65ca9 Properly handle cancellation in MediaSegmentManager 2026-05-13 13:47:07 +02:00
Shadowghost 5165e4e2d4 Order chapter response by start time 2026-05-13 13:46:46 +02:00
dkanada 843e0f0c84 return music artists from person endpoints 2026-05-13 09:37:18 +09:00
Nicolas N 6014ad6ef2 Translated using Weblate (Haitian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ht/
2026-05-12 23:26:19 +00:00
serzh-photograf 2f27e9b5b6 Translated using Weblate (Ukrainian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/uk/
2026-05-12 23:26:19 +00:00
Gallyam Biktashev 7504875ccf Translated using Weblate (Russian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ru/
2026-05-12 23:26:19 +00:00
Gargotaire 1872340a01 Translated using Weblate (Catalan)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ca/
2026-05-12 23:26:18 +00:00
Shadowghost b1b4519944 Apply review suggestions 2026-05-13 00:58:33 +02:00
renovate[bot] 8435dfb779 Update Microsoft to 10.0.8 2026-05-12 22:46:52 +00:00
Shadowghost 95164883c1 Add Fallback 2026-05-12 23:18:38 +02:00
Shadowghost 93d7a1cf20 Cleanup 2026-05-12 23:18:38 +02:00
Shadowghost 5cfb379aa6 Use native middleware 2026-05-12 23:18:38 +02:00
Shadowghost 4be3f5f1f9 Add Accept-Language header support for per-request localization 2026-05-12 23:18:38 +02:00
Shadowghost 9e794e80c2 Fix master merge 2026-05-12 23:11:34 +02:00
JPVenson a47da0f1a3 Update logging message for DbConcurrency messages 2026-05-12 21:11:15 +00:00
Shadowghost 8f7c54ee5e Merge remote-tracking branch 'upstream/master' into search-rebased 2026-05-12 22:50:16 +02:00
Shadowghost 7f5ff3dabd Address review comments 2026-05-12 22:48:48 +02:00
JPVenson c6910c3034 Update log for user session related concurrency update fails 2026-05-12 20:42:26 +00:00
renovate[bot] 25f0e8b423 Update dependency dotnet-ef to v10.0.8 2026-05-12 18:19:58 +00:00
Bond-009 e9942c3857 Merge pull request #16831 from Bond-009/netVersion
Reference correct .NET version in README
2026-05-12 20:01:27 +02:00
Bond_009 04ecf77d97 Reference correct .NET version in README 2026-05-12 18:35:37 +02:00
nyanmisaka b9ee9b0660 Backport pull request #16819 from jellyfin/release-10.11.z
Fix rate control in av1_amf encoder

Original-merge: a023b9c88d

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-05-12 12:26:13 -04:00
Bond-009 27a3ccb7e4 consolidate OpenAPI categories and deprecate startup routes (#16757) 2026-05-12 18:13:11 +02:00
Tim Eisele a9865367d8 Safeguard against invalid GUIDs (#16813)
Safeguard against invalid GUIDs
2026-05-12 18:12:54 +02:00
TheMelmacian 39049a726e move language filters from QueryFiltersLegacy to QueryFilters 2026-05-12 02:12:14 +02:00
José Fonseca c169184e01 Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt/
2026-05-11 20:13:48 +00:00
José Fonseca 5bcea608c5 Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt_PT/
2026-05-11 20:13:48 +00:00
Milo Ivir 22bf421be6 Translated using Weblate (Croatian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hr/
2026-05-11 20:13:48 +00:00
GolanGitHub 6d3a7b6f69 Translated using Weblate (Spanish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es/
2026-05-11 20:13:48 +00:00
Bond-009 406aaabefd Use SortName when sorting by name (#16804)
* Use SortName when sorting by name

* Preserve ordering in item values query
2026-05-11 18:22:26 +02:00
Shadowghost d5bb7756f1 Implement multiple versions for episodes. 2026-05-11 16:41:22 +02:00
Aindriú Mac Giolla Eoin ef64f19eac Translated using Weblate (Irish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ga/
2026-05-11 14:04:44 +00:00
Anrijs Vitolins 2800ae3b8a Translated using Weblate (Latvian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/lv/
2026-05-11 14:04:44 +00:00
Vincenzo Reale 7ead333f6e Translated using Weblate (Italian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/it/
2026-05-11 14:04:44 +00:00
Szilki077 9be1246749 Translated using Weblate (Hungarian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hu/
2026-05-11 14:04:44 +00:00
alxhu 2229851689 Translated using Weblate (German)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/de/
2026-05-11 14:04:43 +00:00
BitToby 21f12a1ad0 Suppress CA2213 false positive on ApplicationHost._pluginManager (#2149) (#16792) 2026-05-11 06:29:05 +02:00
renovate[bot] be0f0b9761 Update danielpalme/ReportGenerator-GitHub-Action action to v5.5.10 (#16820) 2026-05-11 06:28:43 +02:00
TheMelmacian 5701cdce68 fix: prevent language filters to load in non video libraries 2026-05-10 21:40:41 +02:00
Tim Eisele f24709f11c Print warning on invalid Subnets in Network/Proxy configuration (#16793)
Print warning on invalid Subnets in Network/Proxy configuration
2026-05-10 20:34:26 +02:00
Bond-009 4f238ca9b3 Merge pull request #16803 from nyanmisaka/new-profile-condition-video-rotation
Add videoRotation profile condition
2026-05-10 20:32:40 +02:00
Bond-009 42870986a8 Merge pull request #16807 from Shadowghost/fix-artist-duplicates
Fix artist duplicates
2026-05-10 20:28:36 +02:00
TheMelmacian a42956c182 fix: filter for VideoTypes if Item is Iso file 2026-05-10 12:52:53 +02:00
TheMelmacian 2b7f641163 feat: language filters for subtitles and audio 2026-05-10 12:41:57 +02:00
dkanada 65710a4e4f add missing exception information to error log 2026-05-10 12:49:35 +09:00
Bas 82120732ca Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2026-05-09 13:53:22 +00:00
lednurb 9a3dfec151 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2026-05-09 13:53:22 +00:00
Shadowghost 02835c6144 Add People Deduplication 2026-05-09 11:18:05 +02:00
nyanmisaka 6d6dee9492 Add tests for videoRotation profile condition
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2026-05-09 15:20:29 +08:00
nyanmisaka fc251265d9 Check videoRotation in video stream copy
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2026-05-09 15:20:29 +08:00
nyanmisaka 5cb6ac521a Add videoRotation profile condition
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2026-05-09 15:20:29 +08:00
Bond-009 4dd19b990b Merge pull request #16290 from benbenmoss/fix/io-excemption-from-strm
IOException with STRM HTTP URLs
2026-05-09 08:19:41 +02:00
Bond-009 efa502a65f Merge pull request #16798 from Shadowghost/fix-segment-provider
Fix Segment Provider Configuration
2026-05-09 08:17:02 +02:00
Shadowghost b7b405dc83 Fix artist duplicates 2026-05-09 02:07:26 +02:00
Shadowghost 149649a6cf Preserve ordering in item values query 2026-05-09 02:06:01 +02:00
Fjuro 169745fddb Translated using Weblate (Czech)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/cs/
2026-05-08 22:52:08 +00:00
Translation expert c4c521719e Translated using Weblate (Arabic)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ar/
2026-05-08 20:31:00 +00:00
Shadowghost e9cad048e9 Use SortName when sorting by name 2026-05-08 20:34:36 +02:00
Bond-009 de64a69c7a Merge pull request #14847 from tjwalkr3/warnings-5
Fix CA1051 and CA1815 warnings, Change public fields to auto properties
2026-05-08 17:55:25 +02:00
Bond-009 c328dbef10 Update github/codeql-action action to v4.35.4 (#16796)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-08 17:51:47 +02:00
dkanada 8437866ffa consolidate OpenAPI categories and deprecate startup routes 2026-05-08 12:53:26 +09:00
dkanada df751af194 fix reported SonarQube issues 2026-05-08 12:51:34 +09:00
Shadowghost b84bd34c67 Fix Segment Provider Configuration 2026-05-08 01:05:14 +02:00
Erik W 82b51a60a5 Translated using Weblate (Swedish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/sv/
2026-05-07 21:29:41 +00:00
Kityn 5cdfb9bfac Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pl/
2026-05-07 21:29:38 +00:00
Bas 6c59f9a03d Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2026-05-07 19:59:14 +00:00
Erik W e1e18e8da0 Add OriginalLanguage as option to PreferredAudioLanguage (#12579)
* Add OriginalLanguage as option to PreferredAudioLanguage

* Support for multiple original languages

* Add original audio stream indicator

* Fetch OriginalLanguage from TMDB

* Adapt to EFCore refactor

* Fix PlayDefaultAudioTrack OriginalLanguage behavior

* Fix better PlayDefaultAudioTrack OriginalLanguage behavior

* Add comment to ItemFields

* Improved PlayDefaultAudioTrack behavior

* Add migration for original language

* Use sting.Equals for string comparisons

* Always set dto OriginalLanguage

* Remove OriginalLanguage from ItemFields

---------

Co-authored-by: Lampan-git <lampan-git@users.noreply.github.com>
2026-05-07 20:07:23 +02:00
renovate[bot] 63a078b720 Update github/codeql-action action to v4.35.4 2026-05-07 18:05:21 +00:00
theguymadmax d636b82e83 Allow tmdb as an alias for tmdbid provider id (#16433)
Allow tmdb as an alias for tmdbid provider id
2026-05-07 20:04:28 +02:00
theguymadmax 0028104ed9 Consolidate kewords 2026-05-06 20:58:40 -04:00
theguymadmax f6ac1d9f38 Fix folders being identified as seasons in mixed libraries 2026-05-06 18:35:23 -04:00
Tim Eisele bc074b5283 Switch to new version scheme (#16758) 2026-05-06 17:41:34 -04:00
dkanada 3876a0ad3d fix person type exclusion in api response (#16784) 2026-05-06 17:39:45 -04:00
Marc Brooks a629080c89 Fix MusicBrainz test. (#16789) 2026-05-06 17:38:56 -04:00
Bond-009 2fbb821581 Merge pull request #16472 from IDisposable/feature/season-provider-id-from-path
Parse provider IDs from season and episode folder/file names
2026-05-06 20:49:28 +02:00
Bond-009 33ed52b8ee Merge branch 'master' into feature/season-provider-id-from-path 2026-05-06 20:49:19 +02:00
Bond-009 d1ab428476 Merge pull request #16321 from WizardOfYendor1/fix/livetv-consumer-leak-negative-position-ticks
Fix live stream consumer leak on negative PositionTicks
2026-05-06 20:46:13 +02:00
Bond-009 142b89eab5 Merge pull request #16319 from JPVenson/feat/MigrationStartupSwitch
Add startup mode to migrate or seed the database on cmd
2026-05-06 20:38:53 +02:00
Bond-009 1bbbc1c823 Merge pull request #16328 from Shadowghost/rating-fix
Fix Canadian rating and fallback to unrated if we have a CountryCode but no matching rating
2026-05-06 20:33:58 +02:00
Niels van Velzen a8f361f8c0 Merge pull request #16788 from theguymadmax/do-more-like-no2
Remove DigitalOcean from sponsors section
2026-05-06 19:08:43 +02:00
Niels van Velzen c0593281ff Merge pull request #16466 from PERSONALPANCHIWIRIS/fix/issue#16308_community_rating_not_updating
Fix #16308: Community ratings not updating after changing .nfo file.
2026-05-06 19:08:19 +02:00
Niels van Velzen d648aba881 Merge pull request #16611 from LmanTW/master
Ignore season directories with no video for TV Shows
2026-05-06 19:08:05 +02:00
Niels van Velzen 44d5954205 Merge pull request #16783 from Shadowghost/fix-people-without-item-id
Fix unique people response for query if no item ID is supplied
2026-05-06 19:07:13 +02:00
Niels van Velzen 10c42d70ca Merge pull request #16780 from Shadowghost/fix-muscibrainz-dispose
Move MusicBrainz Query client to plugin instance
2026-05-06 19:07:03 +02:00
Niels van Velzen da88a06ede Merge pull request #16779 from Shadowghost/fix-subtitle-save
Fix subtitle save path
2026-05-06 19:07:00 +02:00
Bond-009 842a5efdcf Merge pull request #16782 from JPVenson/backport/15368
Fix UserManager after EFcore refactor (backport #15368)
2026-05-06 18:02:30 +02:00
Bond-009 e84fd95bcc Merge pull request #16246 from lcorbasson/lcorbasson-patch-1
Add the filename to exceptions in DeserializeFromFile()
2026-05-06 17:41:20 +02:00
Bond-009 28546f535c Merge pull request #16646 from Biosias/cz-sk-season-parse
Add different Slovak and Czech translation of Season for parsing
2026-05-06 17:40:47 +02:00
Bond-009 e50aeb914a Merge pull request #16322 from poytiis/remove-ToList-calls
Remove unnecessary ToList calls in TrickplayManager
2026-05-06 17:40:12 +02:00
Bond-009 087e745e7a Merge pull request #16778 from Shadowghost/fix-rewatch
Fix rewatch query
2026-05-06 17:37:13 +02:00
theguymadmax c8c890b9e5 Remove DigitalOcean from sponsors section 2026-05-06 08:21:23 -04:00
Shadowghost 4b8be6bc91 Fix unique people response for query if no item ID is supplied 2026-05-05 20:21:44 +02:00
JPVenson ec054f6a34 Backport changes from #15368 2026-05-05 17:57:27 +00:00
Shadowghost d3e6079d38 Move MusicBrainz Query client to plugin instance 2026-05-05 17:43:37 +02:00
Shadowghost 9ade1fb8f6 Fix subtitle save path 2026-05-05 17:32:58 +02:00
Shadowghost 8a43b1c784 Fix rewatch query 2026-05-05 17:31:19 +02:00
Niels van Velzen 4178e0ebaf Merge pull request #16220 from Shadowghost/epg-fixes
Fix EPG issues
2026-05-05 15:53:19 +02:00
Niels van Velzen 064fd8c5c0 Merge pull request #16756 from Shadowghost/artist-speedup
Speed-up LatestItems for Music
2026-05-05 15:49:02 +02:00
Niels van Velzen 7be1350205 Merge pull request #16769 from llaforest/fix/playback-progress-null-overwrite
Guard against null-overwrite of saved audio/subtitle track selections
2026-05-05 15:48:53 +02:00
Niels van Velzen b227f3e85b Merge pull request #16777 from gabeluci/fix-directoryservice-sort
Fix use of thread-unsafe List<T>.Sort()
2026-05-05 15:48:46 +02:00
Joshua M. Boniface fd6badf096 Merge pull request #16754 from nielsvanvelzen/keep-legacy-auth
Keep legacy authorization enabled
2026-05-05 09:46:38 -04:00
samurato 7e4727fff8 Translated using Weblate (Nepali)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ne/
2026-05-05 12:31:14 +00:00
Gabriel Luci 6f2e42c20c Fix use of thread-unsafe List<T>.Sort() 2026-05-04 23:46:00 -04:00
Shadowghost d4f91ab5ca Fixup 2026-05-04 23:48:09 +02:00
Shadowghost 5e82b61bab Apply review suggestions 2026-05-04 23:40:07 +02:00
Shadowghost 0d58c773f9 Fix review comments 2026-05-04 21:42:31 +02:00
Shadowghost 6be96100c7 Fix review and CodeQL comments 2026-05-04 21:33:10 +02:00
Shadowghost 57c0fcd674 Merge remote-tracking branch 'upstream/master' into epg-fixes 2026-05-04 21:26:26 +02:00
llaforest 6ea2f05497 Guard against null-overwrite of saved audio/subtitle track selections
Some clients omit AudioStreamIndex or SubtitleStreamIndex in playback progress reports and it causes previously saved track selections to be erased.
Add .HasValue checks so only explicit track changes are persisted.
2026-05-04 13:26:08 -04:00
Niels van Velzen ec04313317 Merge pull request #16478 from Shadowghost/cachdir.tag-support
Add CACHEDIR.tag support
2026-05-04 19:12:40 +02:00
Niels van Velzen d87e9f9622 Merge pull request #16695 from ExpctING/fix_dummy_chapter
Fix dummy chapter handling for videos with a single chapter or short duration.
2026-05-04 18:02:16 +02:00
Niels van Velzen 10de1ce8fe Merge pull request #16272 from jellyfin/renovate/morestachio-5.x
Update dependency Morestachio to 5.0.1.670
2026-05-04 18:01:11 +02:00
Niels van Velzen 5d5ae271a5 Merge pull request #16702 from itz4blitz/blitz/issue-13197-nfo-season
Honor episode NFO season during metadata merge
2026-05-04 18:00:50 +02:00
Niels van Velzen d707a9dba1 Merge pull request #16704 from dyld-w/fix/keyframe-duration-overshoot
Fix keyframe duration overshoot breaking playback
2026-05-04 17:59:59 +02:00
Niels van Velzen d359d2f7a8 Merge pull request #16166 from Shadowghost/ignore-caching
Implement ignore rule caching
2026-05-04 17:59:48 +02:00
Niels van Velzen ba268cc3fb Merge pull request #16761 from Shadowghost/fix-recursive-collection-folder
Fix Playlist and Boxset query, save and count performance
2026-05-04 17:58:57 +02:00
Niels van Velzen dcba6c3659 Merge pull request #16616 from dkanada/fix-person-limit
fix person TotalRecordCount when limit is applied
2026-05-04 17:58:27 +02:00
Niels van Velzen 57821e4cde Merge pull request #16475 from Shadowghost/fix-triple-digit-episode-numbers
Fix triple digit episode number handling
2026-05-04 17:58:13 +02:00
Niels van Velzen b7d0301099 Merge pull request #16747 from MBR-0001/fix-ffprobe-subs
Fix FFProbeVideoInfo downloading subtitles without considering internal streams
2026-05-04 17:57:49 +02:00
Shadowghost 2365cea626 Only consider Album creation date 2026-05-04 15:13:00 +02:00
Shadowghost fa65a392b0 Fix Playlist and Boxset query and count perf 2026-05-04 10:25:02 +02:00
dkanada ec990be12a fix person TotalRecordCount when limit is applied 2026-05-04 12:06:11 +09:00
Shadowghost ea7000a4d6 Fix Sonar complaints 2026-05-04 02:20:48 +02:00
Shadowghost 0f6bab03eb Fix Sonar comments 2026-05-04 02:16:00 +02:00
Shadowghost 88cad2ad1a Speed-up LatestItems for Music 2026-05-04 02:00:38 +02:00
Shadowghost 07a802d8fa Implement search providers 2026-05-04 01:55:07 +02:00
Shadowghost 4ebce39070 Implement Similarity providers 2026-05-03 23:43:01 +02:00
Shadowghost d20c775daf Implement ignore rule caching 2026-05-03 23:35:33 +02:00
Niels van Velzen b8e25b49b3 Keep legacy authorization enabled 2026-05-03 22:20:24 +02:00
Weblate 622947e374 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/
2026-05-03 19:56:43 +00:00
Niels van Velzen 6e22075a63 Merge pull request #16062 from Shadowghost/perf-rebased
Query Performance Improvements
2026-05-03 21:56:34 +02:00
Shadowghost d68d0fa962 Merge remote-tracking branch 'upstream/master' into perf-rebased 2026-05-03 13:31:23 +02:00
Shadowghost 00b08c0b32 Omit BoxSet related materialization 2026-05-03 13:26:30 +02:00
Shadowghost 0183127d2a Apply review suggestion 2026-05-03 13:20:12 +02:00
nyanmisaka d9ced0d639 Use strict QSV CPB size for less powerful H.264 decoder
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2026-05-03 12:25:33 +02:00
Seven Rats f5f75ed2e1 feat/audiobook_chapters (#16518)
feat/audiobook_chapters
2026-05-03 12:18:20 +02:00
Bond-009 df6f706c2f Merge pull request #16744 from nyanmisaka/skip-ssa-to-ass-conv
Avoid SSA to ASS conversion and loss of styles
2026-05-03 12:17:12 +02:00
Bond-009 3aed429120 Merge pull request #16746 from jellyfin/renovate/ci-deps
Update danielpalme/ReportGenerator-GitHub-Action action to v5.5.9
2026-05-03 12:16:58 +02:00
Bond-009 f9012b6411 Merge pull request #16739 from tcsenpai/fix-symmetric-skip-defaults
fix: use symmetric 15s default for skip forward/backward lengths
2026-05-03 12:07:30 +02:00
Bas 6293e7a3c9 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2026-05-03 05:52:08 +00:00
Bate Mite 9404fa2b27 Translated using Weblate (Macedonian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/mk/
2026-05-02 20:38:02 +00:00
MBR#0001 19b756a507 Fix FFProbeVideoInfo downloading subtitles without considering internal streams
Currently "Skip if the video already contains embedded subtitles" and "Skip if the default audio track matches the download language" are ignored because the internal tracks are not loaded before downloading

This method is also triggered by the missing subtitles task (whenever a subtitle is downloaded) so if there are multiple languages configured, after first one is downloaded (valid) it runs it for other languages which might be internal
2026-05-02 21:07:13 +02:00
renovate[bot] 4e94c3e28b Update danielpalme/ReportGenerator-GitHub-Action action to v5.5.9 2026-05-02 18:49:55 +00:00
ExpctING 127d924c5b fix
Co-authored-by: Copilot <copilot@github.com>
2026-05-03 02:06:13 +08:00
Bond-009 8150a51238 Merge pull request #16738 from jellyfin/renovate/ci-deps
Update CI dependencies
2026-05-02 17:30:45 +02:00
renovate[bot] fd80a9d916 Update CI dependencies 2026-05-02 14:52:19 +00:00
nyanmisaka e75f7f1b28 Avoid SSA to ASS conversion and loss of styles
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2026-05-02 21:36:34 +08:00
Hassan Alabdulaal f7bfad8673 Translated using Weblate (Arabic)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ar/
2026-05-02 11:37:43 +00:00
Hassan Alabdulaal 3690d0bf86 Translated using Weblate (Arabic)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ar/
2026-05-02 10:12:21 +00:00
Hassan Alabdulaal 4e257364b6 Added translation using Weblate (Arabic (Saudi Arabia)) 2026-05-02 08:24:04 +00:00
tcsenpai 58e7ff7f9d Use symmetric 15s default for skip forward/backward lengths
Previously the default skip forward was 30s while skip backward was 10s.
This asymmetry is unexpected for most users and causes a poor UX,
especially on mobile/TV clients that rely on these server-side defaults.

Both values now default to 15000ms (15s), keeping a single consistent
behaviour until the user explicitly customizes them.
2026-05-01 22:09:26 +02:00
Shadowghost 68ab585894 Merge remote-tracking branch 'upstream/master' into epg-fixes 2026-04-29 22:18:47 +02:00
Bond-009 105492ac28 Merge pull request #16690 from jellyfin/renovate/diacritics-4.x
Update dependency Diacritics to 4.1.8
2026-04-29 21:40:43 +02:00
gnattu bb12b122c3 Backport pull request #16718 from jellyfin/release-10.11.z
Allow HDR10 for VPP tonemapping

Original-merge: 938c043596

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-04-29 15:39:34 -04:00
Bond-009 6d15f693b5 Merge pull request #16715 from dkanada/obsolete-endpoints
hide HLS controllers and deprecate unused endpoints
2026-04-29 21:36:58 +02:00
Bond-009 e12fbe08a4 Merge pull request #16725 from jellyfin/renovate/microsoft
Update dependency Microsoft.NET.Test.Sdk to 18.5.1
2026-04-29 21:34:56 +02:00
renovate[bot] e9af1588f2 Update dependency Microsoft.NET.Test.Sdk to 18.5.1 2026-04-28 18:32:08 +00:00
Bond-009 b733857da2 Merge pull request #16672 from dwandw/fix-ipv6-prefixes-not-recognized-as-proxy
Fix IPv6 prefixes not recognized as proxy
2026-04-28 20:21:07 +02:00
Bond-009 44a5c6b3dd Merge pull request #16710 from jellyfin/renovate/ci-deps
Update danielpalme/ReportGenerator-GitHub-Action action to v5.5.7
2026-04-28 20:03:16 +02:00
renovate[bot] 035d8f06cc Update danielpalme/ReportGenerator-GitHub-Action action to v5.5.7 2026-04-27 20:36:46 +00:00
dkanada c59d3bb21a hide HLS controllers and update obsolete endpoints 2026-04-27 21:45:40 +09:00
dwandw 9962fbbe2e fix: IPv6 prefixes not recognized as proxy https://github.com/jellyfin/jellyfin/issues/15710 2026-04-27 07:13:27 +00:00
Shadowghost 070e2b2d0c Apply review suggestions 2026-04-26 22:30:52 +02:00
Bond-009 8b94722110 Merge pull request #16708 from jellyfin/renovate/fscheck.xunit.v3-3.x
Update dependency FsCheck.Xunit.v3 to 3.3.3
2026-04-26 21:44:08 +02:00
Shadowghost 755ef1f942 Fix BoxSet library visibility 2026-04-26 18:53:17 +02:00
Shadowghost a1f3da1819 Reduce correlated EXISTS queries 2026-04-26 18:53:17 +02:00
Shadowghost d19449e6a5 Use AsNoTracking() when only reading 2026-04-26 18:53:17 +02:00
Shadowghost fc866a64e0 Remove unnecessary materializations 2026-04-26 18:53:06 +02:00
Bond-009 48299ff694 Merge pull request #16698 from dkanada/api-tags
improve openapi endpoint categorization
2026-04-26 17:57:26 +02:00
renovate[bot] a35787b82b Update dependency FsCheck.Xunit.v3 to 3.3.3 2026-04-26 13:58:51 +00:00
dkanada a9117bcda4 use decorators to improve openapi endpoint categories 2026-04-26 16:13:22 +09:00
Dylan Dellett-Wion 9f5f18d2db Add test for keyframe duration overshoot clamping 2026-04-26 00:24:15 -04:00
Dylan Dellett-Wion 8044156df5 Clamp keyframe duration overshoot instead of throwing in HLS playlist generation 2026-04-26 00:22:34 -04:00
itz4blitz f9a7cd7457 Honor episode NFO season during metadata merge
Path-derived season numbers could win over explicit provider metadata during episode refresh, causing episodes to appear in the wrong season. Prefer provider-supplied season numbers in the provider merge phases without letting later backfill merges clobber them.
2026-04-25 18:38:07 -04:00
ExpctING 1dd8541ed5 fix ci failed
Co-authored-by: Copilot <copilot@github.com>
2026-04-25 21:10:47 +08:00
ExpctING d86a4d6815 fix chapter average calculation to avoid division by zero error.
Co-authored-by: Copilot <copilot@github.com>
2026-04-25 16:38:21 +08:00
ExpctING 857e730168 Fix dummy chapter handling for videos with a single chapter. 2026-04-25 03:30:55 +08:00
Bond-009 461662f1ff Merge pull request #15762 from MSalman5230/Preservation-of-Watched-Status-on-Re-watch
Fix watched status resetting on re-watch
2026-04-24 19:40:38 +02:00
Bond-009 a183fce142 Merge branch 'master' into Preservation-of-Watched-Status-on-Re-watch 2026-04-24 19:00:19 +02:00
Bond-009 b1e2419c65 Merge pull request #16666 from Shadowghost/xunit3
Upgrade to xunit v3
2026-04-24 18:59:31 +02:00
Niels van Velzen 3c93465940 Merge pull request #16694 from Bond-009/contributors
Remove all JF contributors from Emby list
2026-04-24 18:52:39 +02:00
Bond_009 64c8c83fae Remove all JF contributors from Emby list 2026-04-24 18:10:43 +02:00
renovate[bot] 1691940c3f Update dependency Diacritics to 4.1.8 2026-04-23 23:46:18 +00:00
Bond-009 c3707e3b87 Merge pull request #16689 from jellyfin/renovate/z440.atl.core-7.x
Update dependency z440.atl.core to 7.13.0
2026-04-23 21:51:09 +02:00
Bond-009 d4dda995e1 Merge pull request #16658 from jskoetsier/fix/image-jpg-mime-type
fix: add image/jpg to MIME type extension lookup
2026-04-23 20:31:34 +02:00
Bond-009 5ed9fb11ac Merge pull request #16649 from MBR-0001/removeGlobalSubtitleConfiguration
Skip libraries without enabled subtitle providers in SubtitleScheduledTask
2026-04-23 20:28:59 +02:00
Bond-009 54d2a0f3bf Merge pull request #16678 from jellyfin/renovate/dotnet-monorepo
Update dependency dotnet-ef to v10.0.7
2026-04-23 20:21:05 +02:00
renovate[bot] 4bb1e2543f Update dependency z440.atl.core to 7.13.0 2026-04-23 12:41:53 +00:00
Bond-009 3bb9235777 Merge pull request #16679 from jellyfin/renovate/microsoft
Update Microsoft
2026-04-22 20:17:09 +02:00
renovate[bot] 50768923fb Update Microsoft 2026-04-22 10:58:32 +00:00
renovate[bot] 44957300ab Update dependency Morestachio to 5.0.1.670 2026-04-21 18:06:10 +00:00
renovate[bot] cec9b51b4f Update dependency dotnet-ef to v10.0.7 2026-04-21 18:05:58 +00:00
Bond-009 18e8a5375b Merge pull request #16667 from johnpc/fix/probe-provider-error-path
Include item path in provider error log messages
2026-04-21 20:05:29 +02:00
Bond-009 b31520d603 Merge pull request #16670 from jellyfin/renovate/ci-deps
Update danielpalme/ReportGenerator-GitHub-Action action to v5.5.6
2026-04-21 20:04:46 +02:00
Francisco Ernesto Planas Pestana c483619928 Fix jellyfin#16308: Community ratings not updating after changing .nfo file.
When "replace all metadata" was issued on a film, with the Web metadata
scrapers and "save to local metadata" disabled, after changing the
.nfo file, 'Community rating' was not updated in the server, remaining
the cached value.

Fixed by adding, in the .nfo parser, an option for
'communityrating' along with value conformity verifiers.

Validation tests were added.
2026-04-21 10:45:23 +01:00
Phillycodes ab8e3422dc Translated using Weblate (Haitian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ht/
2026-04-21 07:21:45 +00:00
renovate[bot] 2df0b9d821 Update danielpalme/ReportGenerator-GitHub-Action action to v5.5.6 2026-04-20 23:38:25 +00:00
Shadowghost b717754ed8 Merge remote-tracking branch 'upstream/master' into epg-fixes 2026-04-20 08:16:45 +02:00
John Corser 0d6484b7ec Include item path in provider error log messages
Fixes #16622 - Error messages like 'Error in Probe Provider' now include
the media file path, making it easier to identify which file caused the
failure.
2026-04-19 13:32:06 -04:00
Shadowghost bd70e0ca34 Upgrade to xunit v3 2026-04-19 18:41:39 +02:00
Shadowghost f806ae4018 Fix too many SQL variables error on large libraries 2026-04-19 10:27:47 +02:00
Shadowghost 8a1ad14faf Fix review comment 2026-04-19 10:27:23 +02:00
Shadowghost e71bb7e904 Merge remote-tracking branch 'upstream/master' into perf-rebased 2026-04-19 10:23:34 +02:00
Bond-009 96269ff177 Merge pull request #15355 from twsouthwick/twsouthwick-patch-1
Enable jellyfin.db customized path
2026-04-18 19:09:33 +02:00
Bond-009 365729d75f Merge pull request #16659 from Bond-009/xmltv
Update to Jellyfin.XmlTv 10.12.0-pre1
2026-04-18 19:00:48 +02:00
Bond_009 4f1ad3fee0 Update to Jellyfin.XmlTv 10.12.0-pre1 2026-04-18 17:31:29 +02:00
MBR-0001 a2eff41d66 Merge branch 'master' into removeGlobalSubtitleConfiguration 2026-04-18 17:14:31 +02:00
Bond-009 5aa093d299 Update dependency coverlet.collector to v10 (#16657)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-18 17:07:53 +02:00
KGT1 1d44899606 Remove global subtitle configuration (#14957) 2026-04-18 17:06:46 +02:00
Sebas Koetsier 48b0029180 fix: add image/jpg to MIME type extension lookup
Although image/jpg is not a registered MIME type (RFC 2046 specifies
image/jpeg), several external providers return image/jpg as the
Content-Type for JPEG images:

- TMDb API (thumbnail/episode images)
- Schedules Direct EPG
- Various other metadata providers

Without this mapping, Jellyfin throws ArgumentException:
'Unable to determine image file extension from mime type image/jpg'

This causes library scans to fail when saving episode thumbnails
and other images from these providers, leading to repeated scan
failures and cancelled library scans.

PR #7052 previously added this but it was lost during the migration
to FrozenDictionary. Issue #13568 reports the same bug in 10.10+.

Fixes: jellyfin/jellyfin#13568
Related: jellyfin/jellyfin#7050, jellyfin/jellyfin#7052
2026-04-18 15:38:17 +02:00
renovate[bot] 7113a8c57c Update dependency coverlet.collector to v10 2026-04-17 17:00:44 +00:00
SecularSteve 946ff12185 Translated using Weblate (Bosnian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/bs/
2026-04-17 12:45:54 +00:00
SecularSteve 1e64e42842 Added translation using Weblate (Bosnian) 2026-04-17 07:31:38 +00:00
MBR-0001 d4a46bc629 Fix comparison 2026-04-16 22:34:13 +02:00
Bond-009 5a1eec690f Merge pull request #8890 from SenorSmartyPants/XMLTV-Live
Set XmlTvProgram.IsLive
2026-04-16 19:56:07 +02:00
Bond-009 f9bad54b40 Merge pull request #16645 from jellyfin/renovate/ci-deps
Update danielpalme/ReportGenerator-GitHub-Action action to v5.5.5
2026-04-16 19:55:13 +02:00
Biosias 31e8e197cf Add differen Slovak and Czech translation of Season for parsing 2026-04-16 13:14:59 +02:00
renovate[bot] d8c55a29bb Update danielpalme/ReportGenerator-GitHub-Action action to v5.5.5 2026-04-16 04:59:35 +00:00
Bond-009 ff4d384cd6 Remove permission check from GHA (#11231)
Permission check is moved to the script itself
2026-04-15 20:07:43 +02:00
Eliya Wolfram Konzo 8510cfe77d Added Tanzania countries.json (#14406)
* Update countries.json

Added Tanzania

* Fix order countries.json

* Fix tests

---------

Co-authored-by: Bond_009 <bond.009@outlook.com>
2026-04-15 19:59:13 +02:00
renovate[bot] eb6c0e0935 Update github/codeql-action action to v4.35.2 (#16639)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-15 19:46:47 +02:00
Niels van Velzen 6a85961816 Merge pull request #13491 from gnattu/disallow-trailing-leading-space-library-name
Don't allow library name with leading or trailing space
2026-04-15 19:20:06 +02:00
Hilmar Gústafsson 8ba9319f27 fix: retain subtitles spanning HLS segment boundaries (#16594)
fix: retain subtitles spanning HLS segment boundaries
2026-04-15 19:11:29 +02:00
Bond-009 b5885fe234 Merge pull request #13443 from jsoref/permissions-ci
chore(ci): Add permissions grant
2026-04-15 19:10:49 +02:00
Bond-009 ba3497b9dd Update dependency dotnet-ef to v10.0.6 (#16635)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-15 19:10:08 +02:00
Bond-009 0fd80868f8 Update Microsoft to 10.0.6 (#16636)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-15 19:09:51 +02:00
Milo Ivir 9239b12118 Translated using Weblate (Croatian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hr/
2026-04-15 14:32:36 +00:00
Milo Ivir 8a01f04de5 Translated using Weblate (Croatian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hr/
2026-04-15 14:27:15 +00:00
Milo Ivir 1864c17412 Translated using Weblate (Croatian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hr/
2026-04-15 14:23:02 +00:00
Milo Ivir ac6edd40c8 Translated using Weblate (Croatian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hr/
2026-04-15 14:20:06 +00:00
Milo Ivir 03523be555 Translated using Weblate (Croatian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hr/
2026-04-15 13:19:20 +00:00
Sakari Kukkonen fa8073d9ff Translated using Weblate (Finnish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fi/
2026-04-14 23:39:01 +00:00
renovate[bot] f9c7b18fdd Update Microsoft to 10.0.6 2026-04-14 18:21:22 +00:00
renovate[bot] 1ac5f71bf3 Update dependency dotnet-ef to v10.0.6 2026-04-14 18:21:13 +00:00
theguymadmax 5bad7b8ae3 Fix artist metadata not being fetched on initial library scan (#16606)
* Fix artist metadata not being fetched on initial library scan

* Update Emby.Server.Implementations/Library/Validators/ArtistsValidator.cs

Co-authored-by: Bond-009 <bond.009@outlook.com>

---------

Co-authored-by: Bond-009 <bond.009@outlook.com>
2026-04-14 18:38:01 +02:00
Tim Eisele fb33b725e0 Fix in-process restart (#16482)
Fix in-process restart
2026-04-13 20:06:46 +02:00
Gargotaire ce3fa80a28 Translated using Weblate (Catalan)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ca/
2026-04-13 17:46:40 +00:00
Niels van Velzen ec9c94bd7a Merge pull request #16619 from dkanada/person-filter
add NameStartsWith and NameLessThan filters to Person search
2026-04-13 11:57:33 +02:00
dkanada bb265cd403 add NameStartsWithOrGreater parameter to Persons endpoint 2026-04-13 13:50:04 +09:00
Shadowghost 5b4882c102 More generic collection folder filter handling 2026-04-12 18:46:35 +02:00
dkanada 22644075e7 add NameStartsWith and NameLessThan filters to Person search 2026-04-12 12:42:49 +09:00
Lofuuzi 6fc406f2c5 Translated using Weblate (Chinese (Traditional Han script, Hong Kong))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant_HK/
2026-04-11 23:47:59 +00:00
Shadowghost 60e01e1f22 Apply review suggestions 2026-04-11 18:00:41 +02:00
Shadowghost e0f50f504a Merge remote-tracking branch 'upstream/master' into epg-fixes 2026-04-11 17:48:00 +02:00
Shadowghost d8bbb4dfe8 Fix filters 2026-04-11 17:42:27 +02:00
Bond-009 046023b9dd Merge pull request #16380 from LTe/fix-subtitle-extraction-setting
Respect EnableSubtitleExtraction setting in subtitle delivery
2026-04-11 11:37:17 +02:00
Bond-009 193a15ea45 Merge pull request #16567 from shocklateboy92/fix/iso639-2-language-display
Fix language display for ISO 639-2-only codes (e.g. mul, und, mis, zxx)
2026-04-11 10:24:48 +02:00
Bond-009 45700f6f7d Merge pull request #16609 from ddemarco5/master
Fix HDR tonemapping for BDMV content
2026-04-11 10:13:34 +02:00
Bond-009 99f2129d91 Merge pull request #16618 from jellyfin/renovate/ci-deps
Update actions/upload-artifact action to v7.0.1
2026-04-11 10:11:33 +02:00
renovate[bot] 29d11f6ecb Update actions/upload-artifact action to v7.0.1 2026-04-10 19:09:15 +00:00
LmanTW 3ef7ada736 Ignore season directories with no video for TV Shows 2026-04-10 18:59:59 +08:00
Dominic DeMarco 22f0507258 Record missing information
Fixes tonemapping checks by recording previously missing information when gathering video stream information from videos in a BDMV structure
2026-04-10 00:21:52 -07:00
Lasath Fernando c300651d0d Simplify null-check ternary style in ProbeResultNormalizer
Co-authored-by: Bond-009 <bond.009@outlook.com>
2026-04-09 13:53:38 -05:00
Bond-009 eacdc83fda Merge pull request #16588 from jellyfin/renovate/microsoft
Update dependency Microsoft.NET.Test.Sdk to 18.4.0
2026-04-09 18:12:17 +02:00
Joshua M. Boniface e3b5cf4996 Merge pull request #16456 from joshuaboniface/fix-path-filesystem-logic 2026-04-09 00:37:00 -04:00
Lasath Fernando 553f38a237 Fix language display for ISO 639-2-only codes (e.g. mul, und)
LoadCultures() in LocalizationManager skipped all iso6392.txt entries
without a two-letter ISO 639-1 code, dropping 302 of 496 languages
including mul (Multiple languages), und (Undetermined), mis (Uncoded
languages), zxx, and many real languages like Achinese, Akkadian, etc.
This caused FindLanguageInfo() to return null for these codes, which
meant:
- ExternalPathParser could not recognize them as valid language codes
  in subtitle filenames, so the Language field was never set
- DisplayTitle fell back to the raw code string (e.g. "Mul")

Fix by allowing entries without two-letter codes to be loaded with an
empty TwoLetterISOLanguageName. Also set LocalizedLanguage in
ProbeResultNormalizer for ffprobe-detected streams (the DB repository
path was already handled on master).
2026-04-08 12:38:24 -05:00
renovate[bot] 68f26e5a34 Update dependency Microsoft.NET.Test.Sdk to 18.4.0 2026-04-08 15:37:03 +00:00
nour ovendodger 78e0a2b5c1 Translated using Weblate (Abkhazian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ab/
2026-04-08 00:33:16 +00:00
Shadowghost 24a0df9a39 Merge remote-tracking branch 'upstream/master' into perf-rebased 2026-04-07 21:36:07 +02:00
Lofuuzi b28a5794ec Translated using Weblate (Chinese (Traditional Han script, Hong Kong))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant_HK/
2026-04-06 19:36:57 +00:00
Joshua M. Boniface 179db631f7 Merge pull request #16577 from Bond-009/security-backports
Backport security fixes
2026-04-06 09:37:59 -04:00
Tim Eisele e44821e8f6 Update MediaBrowser.Controller/Entities/BaseItem.cs
Co-authored-by: Bond-009 <bond.009@outlook.com>
2026-04-06 12:39:05 +02:00
Shadowghost 740e9f8749 Lock down tuner API to be admin-only 2026-04-06 11:37:45 +02:00
Shadowghost 0bf7653e36 Fix GHSA-jh22-fw8w-2v9x 2026-04-06 11:37:45 +02:00
Shadowghost b846958f2c Add additional validations 2026-04-06 11:37:45 +02:00
Shadowghost 3c2833e3e8 Fix GHSA v2jv-54xj-h76w 2026-04-06 11:37:45 +02:00
Joshua M. Boniface 3c9b71e124 Fix GHSA-8fw7-f233-ffr8 with improved sanitization
Co-Authored-By: Shadowghost <Ghost_of_Stone@web.de>
2026-04-06 11:37:45 +02:00
Joshua M. Boniface 8cecf53057 Fix GHSA-j2hf-x4q5-47j3 with improved sanitization
Co-Authored-By: Shadowghost <Ghost_of_Stone@web.de>
2026-04-06 11:37:45 +02:00
Shadowghost c008f28d31 Backport pull request #16540 from jellyfin/release-10.11.z
Handle folders without associated library in FixLibrarySubtitleDownloadLanguages

Original-merge: be095f85ab

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

Backported-by: Bond_009 <bond.009@outlook.com>
2026-04-06 05:19:33 -04:00
MBR-0001 142ba42883 Backport pull request #16539 from jellyfin/release-10.11.z
Fix subtitle saving

Original-merge: f51c63e244

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

Backported-by: Bond_009 <bond.009@outlook.com>
2026-04-06 05:19:32 -04:00
Bond-009 cf9b8161ef Merge pull request #16342 from Bond-009/spammydebug
Don't spam debug log with items without rating
2026-04-06 10:52:17 +02:00
kscop-n1 83c9ab0079 Translated using Weblate (Ukrainian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/uk/
2026-04-06 08:50:12 +00:00
kscop-n1 f5e9c1de45 Translated using Weblate (Ukrainian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/uk/
2026-04-06 08:50:00 +00:00
Bas 76c17856ba Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2026-04-06 08:50:00 +00:00
Bill Thornton 4b59d8f117 Merge pull request #16573 from theguymadmax/update-template-for-10.11.8 2026-04-05 21:22:47 -04:00
Lofuuzi 31720cef05 Translated using Weblate (Chinese (Traditional Han script, Hong Kong))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant_HK/
2026-04-05 22:08:36 +00:00
theguymadmax 34e2f91d50 Update issue template version to 10.11.8 2026-04-05 16:35:15 -04:00
Bond-009 42a0892022 Merge pull request #16490 from theguymadmax/fix-nested-boxsets-query
Fix BoxSet parentId being ignored in item queries
2026-04-05 16:53:44 +02:00
Bond-009 95562f9fee Merge pull request #16501 from bilbofroggins/master
Reverse check for track changed
2026-04-05 16:53:22 +02:00
Bond-009 643116e1d0 Merge pull request #16570 from jellyfin/renovate/z440.atl.core-7.x
Update dependency z440.atl.core to 7.12.0
2026-04-05 16:52:23 +02:00
Bond-009 9bf04df5d9 Merge pull request #14745 from HeroBrine1st/master
Add AlbumNormalizationGain field to BaseItemDto
2026-04-05 16:38:35 +02:00
renovate[bot] 8482b3cfb9 Update dependency z440.atl.core to 7.12.0 2026-04-05 14:03:00 +00:00
Weblate 7f3e27c007 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/
2026-04-05 09:36:44 +00:00
Lofuuzi 3225023c1f Translated using Weblate (Chinese (Traditional Han script, Hong Kong))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant_HK/
2026-04-05 09:36:41 +00:00
lednurb cc7bfff412 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2026-04-05 09:36:41 +00:00
Bond-009 70a48e1da4 Merge pull request #16397 from dkanada/person-queries
add StartIndex and ParentId to person search
2026-04-05 11:33:39 +02:00
dkanada 80df5dc984 add StartIndex and ParentId to person search 2026-04-05 15:40:18 +09:00
Niels van Velzen 982d7432f9 Merge pull request #16569 from dkanada/sed-arguments
edit openapi files in place with sed
2026-04-05 08:39:31 +02:00
dkanada 97a1feb16d edit openapi files in place with sed 2026-04-05 15:19:10 +09:00
Bond-009 894768c4f9 Merge pull request #16561 from dkanada/workflow-spec
fix invalid workflow on openapi report job
2026-04-04 18:37:58 +02:00
Kisnov 134fe92f42 Translated using Weblate (Catalan)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ca/
2026-04-04 13:19:32 +00:00
dkanada 5d2a529fb3 fix invalid workflow on openapi report job 2026-04-04 17:39:15 +09:00
lednurb 94b3d41d7d Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2026-04-04 07:07:56 +00:00
Joshua M. Boniface a2dcaa9521 Merge pull request #15902 from ZeusCraft10/fix/udp-discovery-cross-subnet-ipv6 2026-04-04 01:53:59 -04:00
Joshua M. Boniface e4d6b8e1bd Merge pull request #16553 from theguymadmax/fix-blocked-music 2026-04-04 01:53:18 -04:00
Joshua M. Boniface 7256ac81c0 Merge pull request #16556 from dkanada/openapi-report 2026-04-04 01:52:06 -04:00
Lofuuzi 6e81226054 Translated using Weblate (Chinese (Traditional Han script, Hong Kong))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant_HK/
2026-04-03 23:42:40 +00:00
Lofuuzi 12af9f9a57 Translated using Weblate (Chinese (Traditional Han script, Hong Kong))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant_HK/
2026-04-03 13:42:42 +00:00
MrPlow 83ee080200 Translated using Weblate (German)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/de/
2026-04-03 13:42:41 +00:00
dkanada da4d06c5ab move permissions block to publish job 2026-04-03 20:17:31 +09:00
dkanada 87c8349c6b fix openapi report and publish workflows 2026-04-03 19:52:37 +09:00
theguymadmax c5726559fd Fix parental ratings not working on music albums 2026-04-02 19:43:53 -04:00
Niels van Velzen 9e489cd41f Merge pull request #16419 from Shadowghost/extend-segment-interface
Add callback for segment data pruning to IMediaSegmentProvider
2026-04-02 22:00:01 +02:00
HeroBrine1st Erquilenne 9b00854e68 Add AlbumNormalizationGain field to BaseItemDto 2026-04-02 20:03:48 +03:00
rimasx 397147d035 Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/et/
2026-04-02 12:28:46 +00:00
Tushar Mhatre f788e8b741 Translated using Weblate (Hindi)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hi/
2026-04-02 07:01:38 +00:00
Shadowghost 99ad70fbc8 Wrap method parameters 2026-04-01 18:01:25 +02:00
g10rga321 7c57b62ece Translated using Weblate (Georgian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ka/
2026-04-01 09:14:58 +00:00
Niels van Velzen c7ac591548 Merge pull request #16530 from theguymadmax/update-template-for-10.11.7
Update issue template version to 10.11.7
2026-04-01 09:26:00 +02:00
theguymadmax 736a01f447 Update issue template version to 10.11.7 2026-03-31 22:05:37 -04:00
Lofuuzi cef81ae2ed Translated using Weblate (Chinese (Traditional Han script, Hong Kong))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant_HK/
2026-03-31 16:00:40 +00:00
Bond-009 376769c732 Merge pull request #16524 from dkanada/api-workflows
remove nested directory for openapi workflows
2026-03-31 17:49:59 +02:00
Shadowghost 6fdfc6a61b Fix version filters 2026-03-30 21:04:59 +02:00
Lofuuzi b6e4b3a4f5 Translated using Weblate (Chinese (Traditional Han script, Hong Kong))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant_HK/
2026-03-30 18:45:18 +00:00
Bond-009 d5d4309417 Backport pull request #16522 from jellyfin/release-10.11.z
Fix CA1810 build error

Original-merge: 7e88b18192

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

Backported-by: Bond_009 <bond.009@outlook.com>
2026-03-30 14:08:09 -04:00
nyanmisaka 5b3537b3d7 Backport pull request #16519 from jellyfin/release-10.11.z
Fix Null was not checked before using the H264 profile

Original-merge: 89e914c7f1

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-03-30 14:08:07 -04:00
theguymadmax 2134ea3f7f Backport pull request #16514 from jellyfin/release-10.11.z
Fix lint issue

Original-merge: e1691e649e

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-03-30 14:08:06 -04:00
Molier 42e8a780ca Backport pull request #16440 from jellyfin/release-10.11.z
Remove -copyts and add -flush_packets 1 to subtitle extraction

Original-merge: ec33c74ec4

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-03-30 14:08:05 -04:00
theguymadmax 7825fa4e43 Backport pull request #16425 from jellyfin/release-10.11.z
Fix restore backup metadata location

Original-merge: 0f1732e5f5

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-03-30 14:08:04 -04:00
Shadowghost d5f4c624e3 Do not return alternate versions by default 2026-03-30 18:56:31 +02:00
dkanada c5ee639016 remove nested directory for openapi workflows 2026-03-31 01:41:47 +09:00
Bond-009 e4f01973b7 Merge pull request #16365 from Shadowghost/cleanup-trickplay-failure
Cleanup trickplay cache dir on failure
2026-03-30 18:39:37 +02:00
Bond-009 5f30a4538b Merge pull request #16507 from Bond-009/isavc
Only set IsAvc for video streams
2026-03-30 18:34:55 +02:00
Niels van Velzen a536ef88c4 Merge pull request #16463 from dkanada/pull-request
split openapi workflows between pull request and merge
2026-03-30 09:41:01 +02:00
krvi a0834973ed Translated using Weblate (Faroese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fo/
2026-03-29 22:35:24 +00:00
Shadowghost acaeba11f3 Apply review comments 2026-03-30 00:12:35 +02:00
Bond-009 a3960b30c0 Backport pull request #16369 from jellyfin/release-10.11.z
Fix nullref ex in font handling

Original-merge: 41c2d51d8c

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-03-29 14:28:41 -04:00
Beatriz Teixeira 8ceb8c23ce fix(dto): prefer PlaylistsFolder primary image for playlists tiles
This patch fixes issue #16032 where the Playlists media folder ignored a user-uploaded Primary image and kept showing the generated collage. The root cause was DTO image precedence on UserView items for CollectionType.playlists. We now prefer the display parent (PlaylistsFolder) Primary image when available by clearing the UserView Primary tag and setting ParentPrimaryImageItemId/ParentPrimaryImageTag. Added tests cover both paths: parent custom image preferred, and fallback to existing UserView Primary when parent has none.
2026-03-29 15:27:32 +01:00
Bond_009 a6da575785 Only set IsAvc for video streams
Also enables nullable for MediaStreamInfo
Makes more properties nullable that aren't always present
2026-03-29 14:27:49 +02:00
upscaylman ea206f43a2 recognize underscore and dot separators for multi-version grouping (#16465)
* Add underscore and dot as multi-version file separators

Extend IsEligibleForMultiVersion to recognize _ and . as valid
separators between the base movie name and the version suffix.

Common naming patterns like 'Movie_4K.mkv' or 'Movie.UHD.mkv'
are now correctly grouped as alternate versions during library scan.

* Address review: remove comment, add 3D recognition assertions

---------

Co-authored-by: aimarshall615-creator <aimarshall615@gmail.com>
2026-03-29 12:42:36 +02:00
scheilch 5cfa466d8b fix: cap GetVideoBitrateParamValue at 400 Mbps (#16467)
* fix: cap GetVideoBitrateParamValue at 400 Mbps

The previous cap of int.MaxValue / 2 (~1073 Mbps) is far beyond any
realistic transcode target and allows encoder parameters derived from
it (e.g. -bufsize = bitrate * 4 for QSV) to grow to multi-gigabit
values, which is incorrect regardless of whether the encoder tolerates it.

400 Mbps is a safe upper bound for all current hardware encoders:
- Intel QSV H.264 peaks at ~300 Mbps (High 5.1 CPB = 168.75 Mbit)
- HEVC High Tier Level 5.x supports ~240 Mbps
- AV1 hardware encoders have no meaningful real-world constraint at
  this level

The existing FallbackMaxStreamingBitrate mechanism (default 30 Mbps)
provides a similar guard but only when LiveStreamId is set, covering
M3U and HDHR sources. Plugin-provided streams and any source that
bypasses the LiveTV pipeline are not subject to it and can pass
unreasonably high values downstream. This cap closes that gap for
all encoder paths.

Suggested by @nyanmisaka in review of #16376.

* Update MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs

---------

Co-authored-by: Bond-009 <bond.009@outlook.com>
2026-03-29 12:39:16 +02:00
furdiburd 921a364bb0 Add ignore patterns for Hungarian sample files (#16238)
* Add ignore patterns for Hungarian sample files

Added ignore patterns for Hungarian sample files.

* Removed leftover spaces
2026-03-29 12:38:46 +02:00
Tim Eisele ad9ebe5baa More robust date handling in Library DB migration (#16474)
* More robust date handling in Library DB migration

* Apply review comment
2026-03-29 12:38:32 +02:00
Tim Eisele 6ea77f484d Fix attachment extraction of files without video or audio stream (#16312)
* Fix attachment extraction of files without video or audio stream

* Apply review suggestions
2026-03-29 12:38:01 +02:00
Tim Eisele a12736a0ce Apply suggestions from code review
Co-authored-by: theguymadmax <theguymadmax@proton.me>
2026-03-29 10:28:15 +02:00
NoFear0411 e5bbb1ea0c Add spec-compliant dvh1 HLS variant for Dolby Vision Profile 5 (#16362)
* Add spec-compliant dvh1 HLS variant for Dolby Vision Profile 5

DV Profile 5 has no backward-compatible base layer, so
SUPPLEMENTAL-CODECS cannot be used. The master playlist
currently labels P5 streams as hvc1 in the CODECS field,
even though DynamicHlsController already passes
-tag:v:0 dvh1 -strict -2 to FFmpeg for P5 copy-codec
streams, writing a dvh1 FourCC and dvvC configuration box
into the fMP4 init segment. This mismatch between the
manifest (hvc1) and the bitstream (dvh1) causes
spec-compliant clients like Apple TV and webOS 24+ to set
up an HDR10 pipeline instead of a Dolby Vision one.

Add a dvh1 variant before the existing hvc1 variant for P5
copy-codec streams. Both variants point to the same stream
URL. Spec-compliant clients select dvh1 and activate the
DV decoder path. Legacy clients that reject dvh1 in CODECS
fall through to the hvc1 variant and detect DV from the
init segment, preserving existing behavior.

Fixes #16179

* Address review: support AV1 DoVi P10, add client capability check

- GetDoviString: add isAv1 parameter, return dav1 FourCC for AV1 DoVi
  (P10 bl_compat_id=0) and dvh1 for HEVC DoVi (P5)
- Remove redundant IsDovi() check; VideoRangeType.DOVI is sufficient
  and correctly limits to profiles without a compatible base layer
- Replace IsDoviRemoved() with client capability check using
  GetRequestedRangeTypes(state.VideoStream.Codec) to only emit the
  dvh1/dav1 variant for clients that declared DOVI support
- Update comments and doc summary to reflect P5 + P10/bl0 scope

* Use codec string instead of boolean for DoVi FourCC mapping

Replace bool isAv1 with string codec in GetDoviString for
future-proofing when DoVi extends to H.266/VVC or AV2.

* Move AppendDoviPlaylist next to AppendPlaylist

* Fix SA1508: remove blank line before closing brace

* Use AppendLine() instead of Append(Environment.NewLine)
2026-03-28 22:12:06 +01:00
Patrick Cunniff 3fb1d94038 reverse check for track changed
Signed-off-by: Patrick Cunniff <pjcfifa@gmail.com>
2026-03-28 16:25:01 -04:00
WizardOfYendor1 3a4dff8cc4 Fix live stream consumer leak when PositionTicks is negative
When a stalled HLS client sends ReportPlaybackStopped with a negative
PositionTicks (e.g. HLS.js reporting position on buffer stall), the
ArgumentOutOfRangeException was thrown before GetSession was called,
causing CloseLiveStreamIfNeededAsync to never run. This left the
ILiveStream.ConsumerCount permanently incremented, permanently holding
a tuner open with no active viewer.

Fix by acquiring the session and performing live stream cleanup before
throwing the validation exception, so tuner resources are always freed
even when playback reporting fails with invalid position data.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-27 20:11:26 -04:00
Bond-009 e807575dc7 Merge pull request #16471 from jellyfin/renovate/swashbuckle-aspnetcore-monorepo
Update swashbuckle-aspnetcore monorepo to 10.1.7
2026-03-27 19:53:59 +01:00
Bond-009 ef83000b30 Merge pull request #16483 from jellyfin/renovate/pin-dependencies
Pin chrisdickinson/setup-yq action to fa3192e
2026-03-27 19:53:12 +01:00
Bond-009 6a20f948f4 Merge pull request #16222 from tyage/fix/filename-truncation-bracketed-tags
Fix filename truncation when bracketed tags appear mid-filename
2026-03-27 19:21:43 +01:00
Bond-009 bd6acb1686 Merge pull request #16442 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v4.35.1
2026-03-27 19:16:25 +01:00
theguymadmax f33c039d1b Fix BoxSet parentId being ignored in item queries 2026-03-27 13:48:30 -04:00
renovate[bot] 40cadfca44 Update github/codeql-action action to v4.35.1 2026-03-27 17:36:22 +00:00
Joshua M. Boniface 0ba41754d8 Merge pull request #15841 from JanzenJohn/feat/fix-ipv6-crash
fix crashes on devices that don't support ipv6
2026-03-27 13:33:12 -04:00
renovate[bot] 6e154de954 Pin chrisdickinson/setup-yq action to fa3192e 2026-03-26 19:27:09 +00:00
Shadowghost 4fe3abdc0e Delete file-based playlists if empty/removed 2026-03-26 19:37:57 +01:00
Shadowghost 1219c5ec3b Add CACHEDIR.tag support 2026-03-26 13:14:42 +01:00
Shadowghost 2147f57df5 Fix triple digit episode number handling 2026-03-26 11:44:35 +01:00
Tim Eisele f793acc1aa Update Emby.Server.Implementations/Localization/LocalizationManager.cs
Co-authored-by: theguymadmax <theguymadmax@proton.me>
2026-03-26 10:06:50 +01:00
Lofuuzi 9c09e7113e Translated using Weblate (Chinese (Traditional Han script, Hong Kong))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant_HK/
2026-03-26 00:23:07 +00:00
Marc Brooks aa96ff42e6 Parse provider IDs from season and episode folder/file names
Season and episode directories/files can now include provider ID
attributes in their names (e.g. "Season 01 [tvdbid=22222]" or
"Show S01E01 [tmdbid=99999].mkv"), consistent with the existing
behavior for series folders.

Supported providers: imdbid, tvdbid, tvmazeid, tmdbid.

Adds TmdbSeasonExternalId and TmdbEpisodeExternalId so that
the TMDB season and episode IDs are surfaced in the metadata editor.

Seasons do not have their own IMDb IDs, so we don't support imdbid parsing
in SeasonResolver. Instead, generate IMDb season URLs via
ImdbExternalUrlProvider using the parent series' IMDb ID and the
season number, matching the IMDb URL format:
imdb.com/title/{seriesId}/episodes/?season={N}

Add tests for the ExternalUrlProviders.
2026-03-25 18:47:40 -05:00
renovate[bot] 5fa865f9e5 Update swashbuckle-aspnetcore monorepo to 10.1.7 2026-03-25 23:01:19 +00:00
Bond-009 bcc748e664 Update swashbuckle-aspnetcore monorepo to 10.1.6 (#16461)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-25 18:28:03 +01:00
Francisco Ernesto Planas Pestana e065015d6d Fix #16308: Community ratings not updating after changing .nfo file.
When "replace all metadata" was issued on a film, with the Web metadata
scrapers and "save to local metadata" disabled, after changing the
.nfo file, 'Community rating' was not updated in the server, remaining
the cached value.

Fixed by changing the flag on the 'MergeData' call
(line 809 - MetadataService.cs) to use the option defined by the
user and not the erroneous absolute 'false' value.

Also, in the .nfo parser an option for 'communityrating' was added
along with value conformity verifiers.

Validation tests were added.
2026-03-25 14:07:53 +00:00
dkanada 6b443bb2ec split openapi workflows between pull request and merge 2026-03-25 15:39:31 +09:00
Joshua M. Boniface fec78c8448 Lint for the Linter Gods 2026-03-24 22:31:17 -04:00
Joshua M. Boniface c22933260b Fix linting issue 2026-03-24 22:23:48 -04:00
renovate[bot] 8fc6f07d5a Update swashbuckle-aspnetcore monorepo to 10.1.6 2026-03-24 21:59:16 +00:00
scheilch 386c4cb723 Fix int32 overflow in QSV rate-control parameter computation (#16376)
Fix int32 overflow in QSV rate-control parameter computation
2026-03-24 18:02:00 +01:00
Joshua M. Boniface 965b602c68 Apply suggestions from code review
Co-authored-by: JPVenson <ger-delta-07@hotmail.de>
2026-03-23 23:09:56 -04:00
Joshua M. Boniface 8142bbd50e Properly define variable type 2026-03-23 17:22:35 -04:00
Joshua M. Boniface 418beafebb Update FolderStorageInfo record 2026-03-23 17:15:49 -04:00
Joshua M. Boniface 434ebc8b11 Ensure ResolvedPath is sent on error too 2026-03-23 17:11:29 -04:00
Joshua M. Boniface 300036c859 Fix FolderStorageInfo to show parent filesystem
A direct implementation using DriveInfo directly on a path does not work
as expected. The method will return a DriveInfo object with the given
path as both the Name and the RootDirectory, which is not helpful.

Instead, add parsing logic to find the best possible match out of all
filesystems on the system for the path, including handling edge cases
involving symlinked paths in the chain.

This ensures that the resulting DeviceId is a valid filesystem, allowing
it to be used in the UI to show a better description. It also includes
the new ResolvedPath which will show, if required, what the Path
resolved to after all symlinks are interpolated.

One possible issue here is that walking all drives as-is might become
slow(er) on a system with many partitions, but even on my
partition-heavy system with over a dozen ZVOLs and remote mounts, this
takes under 0.4 seconds including runup time for `dotnet run`, so I
imagine this should be fine.
2026-03-23 17:08:15 -04:00
theguymadmax 24ec04d89f Backport pull request #16449 from jellyfin/release-10.11.z
Fix NFO saver using wrong provider ID for collectionnumber

Original-merge: ce867f9834

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-03-23 17:06:23 -04:00
nyanmisaka b82a2ced75 Backport pull request #16423 from jellyfin/release-10.11.z
Fix readrate options in FFmpeg 8.1

Original-merge: 29b2361857

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-03-23 17:06:22 -04:00
Bond-009 568e26c534 Merge pull request #15593 from dkanada/book-provider-ids
include external IDs and URLs for book providers
2026-03-23 21:25:11 +01:00
lednurb f52005768a Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2026-03-22 16:15:43 +00:00
dkanada a0d1e05696 migrate local comic providers to server codebase 2026-03-21 12:02:22 +09:00
Lofuuzi f6211a03dd Translated using Weblate (Chinese (Traditional Han script, Hong Kong))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant_HK/
2026-03-20 19:32:38 +00:00
Louis 995d56d5ff Recognize ".m4b", ".m4a", ".aac", ".flac", ".mp3", and ".opus" as an audio-book formats (#15377)
* Recognize ".m4b" as an audio-book format

- Has the resolver recognize the ".m4b" format as book
  - Jellyfin reverts to seeing the file as a music file without this check

* Recognize ".m4a", ".aac", ".flac", and ".mp3" as an audio-book formats

- All the formats supported in the docs will now be marked as type "Book"

* Add ".opus" as a supported Audiobook format

---------

Co-authored-by: Louis Sandoval <louis@sandoval.family>
2026-03-19 20:31:29 +01:00
Lofuuzi 63a7c71e77 Translated using Weblate (Chinese (Traditional Han script, Hong Kong))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant_HK/
2026-03-19 10:34:54 +00:00
Ärik dc4d3639e0 Translated using Weblate (Swedish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/sv/
2026-03-18 00:45:21 +00:00
renovate[bot] d88dd1dd63 Update dependency coverlet.collector to 8.0.1 (#16428)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-17 19:28:30 +01:00
Lofuuzi a2fba38954 Translated using Weblate (Chinese (Traditional Han script, Hong Kong))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant_HK/
2026-03-17 15:29:40 +00:00
Lofuuzi 54856dc026 Translated using Weblate (Chinese (Traditional Han script, Hong Kong))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant_HK/
2026-03-17 00:49:12 +00:00
renovate[bot] dbd58dd666 Update CI dependencies (#16417)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-16 20:10:01 +01:00
Lofuuzi dbc42bb8e2 Translated using Weblate (Chinese (Traditional Han script, Hong Kong))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant_HK/
2026-03-15 15:48:06 +00:00
Lofuuzi f6a5b27efc Translated using Weblate (Chinese (Traditional Han script, Hong Kong))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant_HK/
2026-03-15 06:49:44 +00:00
Shadowghost ebc15d3e27 Handle removed alternates 2026-03-14 20:26:40 +01:00
Lofuuzi c0c4740215 Translated using Weblate (Chinese (Traditional Han script, Hong Kong))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant_HK/
2026-03-14 19:01:44 +00:00
Shadowghost 98bbc26c5e Add callback for segment data pruning to IMediaSegmentProvider 2026-03-14 19:58:43 +01:00
Shadowghost 4b48cad6f7 Don't throw if path is missing 2026-03-14 19:57:18 +01:00
Benjamin Lea d65960fe5d Translated using Weblate (Hebrew (Israel))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/he_IL/
2026-03-14 00:53:45 +00:00
Shadowghost 27d54c5b1c Fix IsResumable and IsPlayed filter 2026-03-13 22:46:42 +01:00
nyanmisaka 31adb5dcd1 Backport pull request #16392 from jellyfin/release-10.11.z
Fix filter detection in FFmpeg 8.1

Original-merge: 55c00d76bb

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-03-13 15:33:08 -04:00
IceStormNG cf03e3118a Backport pull request #16293 from jellyfin/release-10.11.z
Apply analyzeduration and probesize for subtitle streams to improve codec parameter detection

Original-merge: fda49a5a49

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-03-13 15:33:07 -04:00
lowbit 3997e016fa Backport pull request #16257 from jellyfin/release-10.11.z
Fix subtitle extraction caching empty files

Original-merge: 6864e108b8

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-03-13 15:33:06 -04:00
Bond-009 4eead536a9 Merge pull request #16368 from redinsch/fix/image-language-priority
Fix remote image language priority to prefer English over no-language
2026-03-13 20:25:36 +01:00
Bond-009 6c8a5dc104 Merge pull request #16388 from theguymadmax/respect-library-country-code
Respect library country code for parental ratings
2026-03-13 20:25:08 +01:00
Bond-009 8795ed4ebf Merge pull request #16395 from jaxx2104/fix/ca2263-prefer-generic-enum-overload
Use generic Enum overloads to resolve CA2263 warnings
2026-03-13 20:24:05 +01:00
Bond-009 7b7800435a Merge pull request #16398 from Bond-009/invalidfilters
Return BadRequest when an invalid set of filters is given
2026-03-13 20:23:23 +01:00
Bond-009 136ec00f3e Merge pull request #16384 from jellyfin/renovate/dotnet-monorepo
Update dependency dotnet-ef to v10.0.5
2026-03-13 20:22:56 +01:00
Bond-009 8a9d9dd977 Merge pull request #16405 from jellyfin/renovate/microsoft
Update Microsoft to 10.0.5
2026-03-13 19:43:45 +01:00
Piotr Niełacny 37983c943a Respect EnableSubtitleExtraction setting in subtitle delivery
Wire up EnableSubtitleExtraction config to MediaEncoder.CanExtractSubtitles
so the setting is actually respected. Gate subtitle extraction check behind
PlayMethod.Transcode since DirectPlay has no competing ffmpeg process.

Add parameterized tests for StreamBuilder.GetSubtitleProfile covering
text and graphical codecs, profile format matching, and extraction
setting behavior. Remove misplaced SubtitleEncoder extraction test.
2026-03-13 16:34:44 +01:00
Shadowghost d218303b93 Merge remote-tracking branch 'upstream/master' into perf-rebased 2026-03-13 09:33:09 +01:00
renovate[bot] 4952e65a03 Update Microsoft to 10.0.5 2026-03-12 17:24:43 +00:00
renovate[bot] b825829191 Update dependency dotnet-ef to v10.0.5 2026-03-12 17:24:35 +00:00
Bond-009 ff4c9263e4 Merge pull request #16382 from jellyfin/renovate/swashbuckle-aspnetcore-monorepo
Update swashbuckle-aspnetcore monorepo to 10.1.5
2026-03-12 18:24:04 +01:00
Bond_009 946c6b9981 Return BadRequest when an invalid set of filters is given 2026-03-11 21:22:48 +01:00
renovate[bot] 6880a2ce3e Update swashbuckle-aspnetcore monorepo to 10.1.5 2026-03-11 20:21:54 +00:00
Bond-009 b308baaf41 Merge pull request #16385 from jellyfin/renovate/microsoft
Update Microsoft
2026-03-11 21:20:56 +01:00
renovate[bot] 8e29e5e419 Update Microsoft 2026-03-11 19:45:48 +00:00
Bond-009 a7b8a68b8d Merge pull request #16396 from jellyfin/renovate/ci-deps
Update actions/download-artifact action to v8.0.1
2026-03-11 20:43:59 +01:00
Bond-009 99dcda6197 Merge pull request #16389 from jellyfin/renovate/major-microsoft
Update dependency Microsoft.CodeAnalysis.Analyzers to v5
2026-03-11 20:43:45 +01:00
Shadowghost bcd5c33ecd Merge remote-tracking branch 'upstream/master' into perf-rebased 2026-03-11 19:36:37 +01:00
renovate[bot] 32270576c2 Update actions/download-artifact action to v8.0.1 2026-03-11 16:02:08 +00:00
jaxx2104 e4eba084dd Use generic Enum overloads to resolve CA2263 warnings
Replace Enum.Parse(typeof(T), ...) and Enum.GetNames(typeof(T)) with
their generic counterparts Enum.Parse<T>() and Enum.GetNames<T>() in
MediaBrowser.Model/Dlna for improved type safety.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 23:57:30 +09:00
Shadowghost 352b6c91f8 Safeguard against empty list 2026-03-11 15:39:04 +01:00
Shadowghost a8a029de73 Fix DeleteItemsUnsafeFast usage 2026-03-11 09:16:35 +01:00
renovate[bot] 7ab1c6bb15 Update dependency Microsoft.CodeAnalysis.Analyzers to v5 2026-03-10 23:31:43 +00:00
theguymadmax 119b2e3d2f Respect library country code for parental ratings 2026-03-10 19:04:02 -04:00
Bond-009 08f9ec5d37 Merge pull request #16160 from Shadowghost/fix-itemvalues-uniqueness
Fix ItemValues Type checks
2026-03-10 21:26:05 +01:00
Denislav Denev d6e2fcb233 Translated using Weblate (Bulgarian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/bg/
2026-03-10 05:22:41 +00:00
Shadowghost ba722b4517 Optimize Search and NextUp queries 2026-03-08 15:26:35 +01:00
redinsch 4f08c7a097 Merge remote-tracking branch 'origin/master' into fix/image-language-priority 2026-03-08 14:09:46 +01:00
redinsch 3b29375179 Use file-scoped namespace in EnumerableExtensionsTests 2026-03-08 12:02:08 +01:00
Bond-009 eb3f8b93d0 Merge pull request #16331 from JuanCalderon-17/first-contribution
Add missing ProducesResponseType(401) to QuickConnectController.InitiateQuickConnect
2026-03-08 11:35:46 +01:00
redinsch ebb6949ea7 Fix remote image language priority to prefer English over no-language
Previously, images with no language were ranked higher (score 3) than
English images (score 2), causing poorly rated languageless images to
be selected over well-rated English alternatives for posters and logos.

Swap the priority so English is preferred over no-language images.
Backdrop images are unaffected as they have their own dedicated sorting.

Add unit tests for OrderByLanguageDescending.

Fixes #13310
2026-03-08 11:29:54 +01:00
Shadowghost 1d8bdcc411 Fix played check in next episode logic 2026-03-07 21:24:10 +01:00
Shadowghost e6e7f2a692 Fix batch delete of items with same userdata keys 2026-03-07 21:23:35 +01:00
Shadowghost 5882006ee7 Optimize migrations 2026-03-07 21:23:16 +01:00
Shadowghost ea1c1d0468 Optimize grouping query performance 2026-03-07 20:14:04 +01:00
Shadowghost 077fa89717 Split BaseItemRepository and IItemRepository 2026-03-07 20:12:42 +01:00
Shadowghost 382db1da0d Cleanup trickplay cache dir on failure 2026-03-07 10:49:42 +01:00
crimsonspecter 0ebf6a6db6 Backport pull request #16341 from jellyfin/release-10.11.z
Fix hls segment length adjustment for remuxed content

Original-merge: 09ba04662a

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-03-06 16:58:07 -05:00
Bond-009 d2334a35c1 Merge pull request #16340 from jellyfin/renovate/polly-monorepo
Update dependency Polly to 8.6.6
2026-03-06 22:32:50 +01:00
Bond-009 99e4e1fbd7 Merge pull request #16352 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v4.32.6
2026-03-06 22:20:52 +01:00
renovate[bot] bc05ecd543 Update github/codeql-action action to v4.32.6 2026-03-05 23:57:22 +00:00
Shadowghost 268f23f39a Fix trickplay generation for parts and alt versions 2026-03-06 00:16:04 +01:00
Shadowghost 744c5539d8 Fix review comments 2026-03-05 22:54:26 +01:00
Shadowghost f5b2e0b8f9 Ensure parts use base type 2026-03-05 21:38:10 +01:00
Bond-009 f1b4f805e5 Merge pull request #16345 from jellyfin/renovate/ci-deps
Update actions/setup-dotnet action to v5.2.0
2026-03-05 20:22:27 +01:00
Shadowghost 59c360aea7 Fix OrderMapper 2026-03-05 19:43:32 +01:00
renovate[bot] c843c71003 Update actions/setup-dotnet action to v5.2.0 2026-03-05 06:38:13 +00:00
Eugene a7c95ab009 Translated using Weblate (Afrikaans)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/af/
2026-03-04 23:20:35 +00:00
Bond_009 8824f07e1b Don't spam debug log with items without rating 2026-03-04 20:14:21 +01:00
Bond-009 7cd79c3121 Merge pull request #16339 from jellyfin/renovate/ci-deps
Update danielpalme/ReportGenerator-GitHub-Action action to v5.5.3
2026-03-04 19:17:51 +01:00
renovate[bot] b444d2c66a Update dependency Polly to 8.6.6 2026-03-04 16:07:01 +00:00
Ori b83378d656 Translated using Weblate (Hebrew (Israel))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/he_IL/
2026-03-04 10:06:11 +00:00
renovate[bot] 5807bf1d8f Update danielpalme/ReportGenerator-GitHub-Action action to v5.5.3 2026-03-03 22:45:40 +00:00
Shadowghost 3da726463d Fix Liked and Favorite filters 2026-03-03 22:27:33 +01:00
Shadowghost 8c0898738d Fix stacking 2026-03-03 21:45:28 +01:00
Bond-009 e378f63b70 Merge pull request #16318 from NoFear0411/fix-sar-anamorphic-detection
Fix near-1:1 SAR values falsely flagged as anamorphic
2026-03-03 20:34:05 +01:00
Juan 44f7d2b854 Add missing ProducesResponseType(401) to InitiateQuickConnect
The InitiateQuickConnect endpoint returns HTTP 401 Unauthorized when
Quick Connect is disabled, and this was already documented in the XML
response comment, but the corresponding [ProducesResponseType] attribute
was missing, causing the OpenAPI/Swagger spec to omit it.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-03 11:53:38 -05:00
Ori e4500303bb Translated using Weblate (Hebrew (Israel))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/he_IL/
2026-03-03 16:37:38 +00:00
Bond-009 2f18e6e7f6 Use artist images for music library thumbnail (#16240) 2026-03-02 21:35:47 +01:00
Bond-009 ca0b2aa7a6 AIFF support: add .aifc as audio file type, remove .aiff as image file type (#16274) 2026-03-02 21:35:31 +01:00
renovate[bot] f2ed024296 Update CI dependencies (#16324)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-02 20:52:57 +01:00
Shadowghost d5fb6f99ef Refresh rating levels 2026-03-02 09:14:34 +01:00
Shadowghost 3d4e4c4572 If we have a country code in the rating, treat as unrated if the country does not have the rating 2026-03-02 09:14:23 +01:00
Shadowghost 11e16df596 Fix Canadian ratings 2026-03-02 09:04:40 +01:00
Anthony Lavado b6f4ffd251 Merge pull request #16323 from jellyfin/readme-sponsor-update
Update JetBrains logo link in README.md
2026-03-01 14:28:14 -05:00
Anthony Lavado 8715cb5b9e Update JetBrains logo link in README.md
Update the logo to match the current branding that has been live for a while now.
2026-03-01 12:38:07 -05:00
JPVenson febfd7f94a Stop server immediately on migration only mode 2026-03-01 15:52:22 +00:00
NoFear0411 d87fe973f3 Fix StyleCop and xUnit analyzer errors
- Add missing param and returns XML doc tags (SA1611, SA1615)
- Remove trailing alignment whitespace in test attributes (SA1025)
- Use nullable string parameter for null test case (xUnit1012)
2026-03-01 18:51:27 +04:00
Teemu Pöytäniemi 8271568677 Add poytiis to CONTRIBUTORS.md 2026-03-01 16:35:24 +02:00
Teemu Pöytäniemi b22c8882d6 Remove unnecessary ToList calls 2026-03-01 16:28:55 +02:00
JPVenson 63c4fc297a Update naming 2026-03-01 13:12:51 +00:00
JPVenson e70eaf8bc1 Add startup mode to migrate or seed the database on cmd 2026-03-01 13:10:32 +00:00
theguymadmax f680495ca3 Backport pull request #16253 from jellyfin/release-10.11.z
Checkpoint WAL before moving library.db in migration

Original-merge: b6a96513de

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-03-01 05:57:23 -05:00
MBR-0001 d2f733f9a4 Backport pull request #16204 from jellyfin/release-10.11.z
Fix broken library subtitle download settings

Original-merge: ca57166e95

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-03-01 05:57:22 -05:00
JPVenson d55f082579 Merge pull request #16281 from jellyfin/JPVenson-patch-1
Revise note on hosting web client for development
2026-03-01 11:50:37 +01:00
NoFear0411 bc316b3dc8 Fix near-1:1 SAR values falsely flagged as anamorphic
Encoders sometimes produce sample aspect ratios like 3201:3200
(0.03% off square) for content that has effectively square pixels.
The exact string comparison against "1:1" marks these as anamorphic,
which triggers unnecessary transcoding on clients that require
non-anamorphic video.

Parse the SAR ratio numerically and treat values within 1% of 1:1
as square pixels. This threshold is well clear of the nearest real
anamorphic SAR (PAL 4:3 at 16:15 = 6.67% off).
2026-03-01 00:00:05 +04:00
Shadowghost 116a036d56 Fix promotion 2026-02-28 17:08:32 +01:00
Shadowghost 8ee4f951fe Defer primary deletion if we replace primary until after item creation 2026-02-28 11:31:52 +01:00
Shadowghost 457c53da6f Decouple demotion detection from deletion 2026-02-27 21:22:47 +01:00
Shadowghost 46ffe0af9c Fix version promotion if multiple versions change 2026-02-27 20:07:09 +01:00
Bond-009 e6d73ae367 Merge pull request #16307 from jellyfin/renovate/major-github-artifact-actions
Update GitHub Artifact Actions (major)
2026-02-27 18:08:16 +01:00
Shadowghost 826e21ecc8 Fix LinkedAlternativeVersion validation 2026-02-27 13:51:51 +01:00
Shadowghost 885b45838c Enable Extras for BD and DVD folders 2026-02-27 13:30:23 +01:00
Shadowghost bd6bf6ee3c Merge remote-tracking branch 'upstream/master' into perf-rebased 2026-02-27 13:27:57 +01:00
renovate[bot] 2068be1221 Update GitHub Artifact Actions 2026-02-26 22:50:41 +00:00
dfederm bdfb6edfa3 Backport pull request #16150 from jellyfin/release-10.11.z
Fix nullref in Season.GetEpisodes when the season is detached from a series

Original-merge: b65daeca0b

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-02-26 13:54:31 -05:00
Bond-009 25e8c6d591 Merge pull request #16255 from cosu/fix/streaminfo-malformed-query-string
Fix malformed query string in StreamInfo.ToUrl() causing 500 error via proxies
2026-02-26 19:31:19 +01:00
Bond-009 c11c33e1a8 Merge pull request #16256 from Shadowghost/upgrade-swashbuckle
Upgrade Swashbuckle to v10
2026-02-26 19:31:02 +01:00
Pavel Miniutka e8232d31ab Translated using Weblate (Belarusian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/be/
2026-02-26 07:33:06 +00:00
Shadowghost 2d0d497961 Update saved metadata on primary change 2026-02-25 21:03:46 +01:00
Shadowghost 4bd9dbe910 Fix LinkedChildren rerouting on primary version demotion 2026-02-25 20:53:29 +01:00
Bond-009 b456afe00e Merge pull request #16296 from jellyfin/renovate/microsoft
Update dependency Microsoft.NET.Test.Sdk to 18.3.0
2026-02-25 18:19:40 +01:00
Shadowghost b7da5c1860 Apply review suggestions 2026-02-25 14:51:53 +01:00
Shadowghost 9aa69eded9 Fix collection handling of multiple version movie 2026-02-25 08:51:26 +01:00
Shadowghost b5f5b02787 Fix special features filter 2026-02-24 21:35:50 +01:00
renovate[bot] 01b3c6f902 Update dependency Microsoft.NET.Test.Sdk to 18.3.0 2026-02-24 16:40:26 +00:00
ghis@am.com 41d2070008 adding strm & http ignore to extract timestamp 2026-02-24 10:58:47 +11:00
Shadowghost 61ff36d761 Optimize SeriesDatePlayed ordering 2026-02-23 23:44:15 +01:00
Shadowghost 100d6bb38c Gracefully handle empty listingId 2026-02-23 21:17:52 +01:00
Shadowghost 66c11231b2 Fix promotion logic 2026-02-23 20:25:55 +01:00
Shadowghost 34c1e45bc2 Fixup 2026-02-23 17:01:38 +01:00
Shadowghost ea0641b659 Fix version promotion 2026-02-23 09:05:43 +01:00
Shadowghost d63b2b2657 Apply review suggestion 2026-02-22 12:37:14 +01:00
Shadowghost 6ce5f9dfd5 Cleanup folder duplicates of series 2026-02-22 12:34:58 +01:00
Shadowghost ed43ad0968 Persistence 2026-02-22 11:32:55 +01:00
Shadowghost 27396bffc6 Handle 5002, 5003 and add caches 2026-02-22 11:14:15 +01:00
Shadowghost d156e04c9a Fix Skipping 2026-02-21 22:56:53 +01:00
Shadowghost 5541653f73 Return Name instead of CleanName for legacy filters 2026-02-21 22:51:46 +01:00
Shadowghost ae5420d4ae Handle linkedChildren in GetPlayedAndTotalCountBatch and optimize filter 2026-02-21 22:38:07 +01:00
Shadowghost 0f1a6fe4c2 Fix IsPlayed filter and setting BoxSet played/unplayed 2026-02-21 19:58:00 +01:00
Shadowghost 97340edf02 Fix image failure response handling in batch endpoint 2026-02-21 16:47:08 +01:00
Evan Champion ccf2d15d5d AIFF support: add .aifc as audio file type, remove .aiff as image file type 2026-02-21 20:59:57 +08:00
Shadowghost c4c3e9ea4d Fix batch requests 2026-02-21 11:40:18 +01:00
INOUE Daisuke 56a469d8c3 Translated using Weblate (Japanese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ja/
2026-02-21 02:41:32 +00:00
Shadowghost 561e78efb4 Apply review suggestions 2026-02-20 21:21:25 +01:00
Shadowghost ff0a64ecb9 Merge remote-tracking branch 'upstream/master' into perf-rebased 2026-02-20 21:17:55 +01:00
Bond-009 2dfebb51be Merge pull request #16266 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v4.32.4
2026-02-20 18:09:58 +01:00
renovate[bot] 716f4c8198 Update github/codeql-action action to v4.32.4 2026-02-20 15:41:35 +00:00
Shadowghost 679664ca28 Add early returns 2026-02-20 15:14:03 +01:00
Shadowghost b0eec00e1c Properly handle SD internal error codes 2026-02-20 14:58:12 +01:00
Shadowghost e49d71707c Fix EPG issues 2026-02-20 14:35:56 +01:00
Andrew Rabert 9da046abc1 Merge pull request #16263 from jellyfin/fix/replace-pull-request-target
Mitigate pull_request_target privilege escalation
2026-02-19 23:59:07 -05:00
Andrew Rabert 01eb56f047 Mitigate pull_request_target privilege escalation
Hotfix — replaces pull_request_target with pull_request to stop
granting write permissions and secrets to fork PRs. Some workflows
will break; can be fixed properly later.
2026-02-19 23:53:48 -05:00
Shadowghost 94dcaf2ea2 Upgrade Swashbuckle to v10 2026-02-18 22:39:49 +01:00
Cosmin Dumitru 37b50fe13c Fix malformed query string in StreamInfo.ToUrl() causing 500 error via proxies
StreamInfo.ToUrl() generated URLs like `/master.m3u8?&DeviceId=...` (note `?&`)
because `?` was appended to the path and all parameters started with `&`. When
the first optional parameter (DeviceProfileId) was null, the result was a
malformed query string.

This is harmless when clients hit Jellyfin directly (ASP.NET Core tolerates `?&`),
but when accessed through a reverse proxy that parses and re-serializes the URL
(e.g. Home Assistant ingress via aiohttp/yarl), `?&` becomes `?=&` — introducing
an empty-key query parameter. ParseStreamOptions then crashes on `param.Key[0]`
with IndexOutOfRangeException.

Changes:
- StreamInfo.ToUrl(): Track query start position and replace the first `&` with
  `?` after all parameters are appended, producing valid query strings
- ParseStreamOptions: Guard against empty query parameter keys
- Tests: Remove .Replace("?&", "?") workaround that masked the bug

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 21:08:35 +01:00
Niels van Velzen 6829794aa0 Merge pull request #16104 from jellyfin/renovate/tmdblib-3.x
Update dependency TMDbLib to v3
2026-02-18 21:05:14 +01:00
Shadowghost 3a090a5716 Optimize item count calculation for named items 2026-02-18 20:28:42 +01:00
Shadowghost f96c399e62 Fix cleanup for BDMV 2026-02-17 22:59:03 +01:00
Bond-009 06a6c6e16b Merge pull request #16249 from jellyfin/renovate/ci-deps 2026-02-17 18:39:50 +01:00
renovate[bot] daf88a5ca2 Update actions/stale action to v10.2.0 2026-02-17 06:49:00 +00:00
Shadowghost 0f75518287 Enforce permissions on BoxSets 2026-02-16 18:50:11 +01:00
Loïc CORBASSON 893188ab28 Add the filename to the exception's trace to facilitate error resolution (see #12254, #9508, ...) 2026-02-16 17:23:52 +01:00
Shadowghost de32e2eb6f Fix library performance 2026-02-16 10:50:18 +01:00
Shadowghost 84962cbc94 Cleanup orphan items 2026-02-16 10:06:16 +01:00
Shadowghost ba356638e8 Fix Extra refresh 2026-02-15 23:13:01 +01:00
Shadowghost 3439d3c017 Migrate PrimaryVersionId to GUID and fix assignment 2026-02-15 23:12:52 +01:00
Shadowghost 837c7d4ed3 Try fixing orphan versions again 2026-02-15 19:49:30 +01:00
Shadowghost 4ce03ffa21 Fix orphaned alt version cleanup 2026-02-15 17:34:06 +01:00
Shadowghost 50cabcd99d Remove split queries 2026-02-15 16:54:54 +01:00
Bond_009 b346370dfc Fix build 2026-02-15 11:28:42 +01:00
Bond-009 fc6419685c Merge pull request #16242 from jellyfin/renovate/coverlet.collector-8.x
Update dependency coverlet.collector to v8
2026-02-15 10:58:53 +01:00
renovate[bot] 04ffbe5e9a Update dependency TMDbLib to v3 2026-02-15 09:49:18 +00:00
Bond-009 d0809ce58b Merge pull request #16236 from theguymadmax/fix-season-unknown
Fix episodes appearing in Season Unknown incorrectly and prevent unnecessary virtual season creation
2026-02-15 10:48:55 +01:00
Shadowghost 9730aaac57 Fix ordering of cleanup in migration 2026-02-15 10:32:53 +01:00
Shadowghost 340bcafd3d Merge remote-tracking branch 'upstream/master' into perf-rebased 2026-02-15 10:14:41 +01:00
Shadowghost f5c9a4a476 Add cleanup for orphaned versions 2026-02-15 10:14:30 +01:00
renovate[bot] a56aa2dd53 Update dependency coverlet.collector to v8 2026-02-15 02:37:05 +00:00
theguymadmax 106f33227a Use artist images for music library thumbnail 2026-02-14 10:06:50 -05:00
Bond-009 1311f66f72 Merge pull request #16144 from DerMaddis/series-production-year
TmdbSeriesProvider: Set ProductionYear field
2026-02-14 12:35:54 +01:00
Bond-009 217068eeb7 Merge pull request #16235 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v4.32.3
2026-02-14 12:19:28 +01:00
Bond-009 44d55f7fa3 Merge pull request #15138 from kevgrig/issue15137
Add moveToTop option to IPlaylistManager.AddItemToPlaylistAsync
2026-02-14 12:08:00 +01:00
Bond-009 29582ed461 Merge branch 'master' into issue15137 2026-02-14 12:07:30 +01:00
Bond-009 ca6d499680 Update Jellyfin.Api/Controllers/PlaylistsController.cs 2026-02-14 12:06:18 +01:00
Bond-009 3b69859867 Merge pull request #14709 from loop95/fix-artist-kairon-irse
Fix: Add 'Kairon; IRSE!' to artist whitelist
2026-02-14 12:03:16 +01:00
Bond-009 c1c7de6a81 Merge pull request #16214 from jellyfin/renovate/asynckeyedlock-8.x
Update dependency AsyncKeyedLock to 8.0.2
2026-02-14 12:02:05 +01:00
Bond-009 7bcbe20641 Merge pull request #16217 from jellyfin/renovate/microsoft
Update Microsoft to 10.0.3
2026-02-14 11:58:34 +01:00
Bond-009 2edf23bb40 Merge pull request #16216 from jellyfin/renovate/dotnet-monorepo
Update dependency dotnet-ef to v10.0.3
2026-02-14 11:58:23 +01:00
theguymadmax 074aa7e639 Backport pull request #16231 from jellyfin/release-10.11.z
Skip image checks for empty folders

Original-merge: 8cd3090cee

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-02-14 05:57:26 -05:00
dfederm a37e83d448 Backport pull request #16227 from jellyfin/release-10.11.z
Reattach user data after item removal during library scan

Original-merge: be71295693

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-02-14 05:57:25 -05:00
dfederm d8543351e2 Backport pull request #16226 from jellyfin/release-10.11.z
Deduplicate provider IDs during MigrateLibraryDb migration

Original-merge: 58c330b63d

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-02-14 05:57:24 -05:00
saltpi dce91cf8c8 Backport pull request #16116 from jellyfin/release-10.11.z
Fix TMDB image URLs missing size parameter

Original-merge: caa05c1bf2

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-02-14 05:57:23 -05:00
theguymadmax 48e456903e Apply review feedback 2026-02-13 16:28:22 -05:00
theguymadmax 2757c18312 Fix episodes appearing in Season Unknown incorrectly and prevent unnecessary virtual season creation 2026-02-13 11:52:10 -05:00
renovate[bot] a1117a1fbd Update github/codeql-action action to v4.32.3 2026-02-13 15:33:57 +00:00
DerMaddis f685a65241 add to CONTRIBUTORS.md 2026-02-13 12:11:13 +01:00
DerMaddis e73ebc9741 TmdbSeriesProvider: Set ProductionYear in SearchResult mappers 2026-02-13 12:03:58 +01:00
renovate[bot] 18a1cd388a Update dependency AsyncKeyedLock to 8.0.2 2026-02-12 12:13:58 +00:00
tyage 1c2f08bc17 Fix filename truncation when bracketed tags appear mid-filename 2026-02-12 00:23:44 +09:00
renovate[bot] 6fff4a7bfa Update Microsoft to 10.0.3 2026-02-10 23:05:25 +00:00
renovate[bot] 5aad260767 Update dependency dotnet-ef to v10.0.3 2026-02-10 23:05:17 +00:00
Niels van Velzen 8b5914001d Merge pull request #16202 from JPVenson/feat/devcontainerupdate
Fix container and updated
2026-02-10 17:53:38 +01:00
Pavel Miniutka 5eaaad660d Translated using Weblate (Belarusian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/be/
2026-02-10 09:51:30 +00:00
francescbassas de36952f53 Translated using Weblate (Catalan)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ca/
2026-02-09 23:14:52 +00:00
Shadowghost edec464306 Handle episode versions in LinkedChild migration 2026-02-09 18:25:07 +01:00
Vincenzo Reale 6b8400cc3d Translated using Weblate (Italian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/it/
2026-02-09 11:37:24 +00:00
Vincenzo Reale a0bf5199ba Translated using Weblate (Italian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/it/
2026-02-09 10:57:22 +00:00
Vincenzo Reale 01264c10a6 Translated using Weblate (Italian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/it/
2026-02-09 10:11:24 +00:00
Vincenzo Reale 558b31f386 Translated using Weblate (Italian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/it/
2026-02-09 10:10:39 +00:00
Shadowghost 5dcec831f3 Fix naming filter when collapsing into boxsets 2026-02-09 09:13:31 +01:00
Shadowghost 737abe6f3a Fix version order in migration 2026-02-09 09:13:05 +01:00
Shadowghost edc6caf255 Cleanup and fix version ordering 2026-02-09 00:45:48 +01:00
Shadowghost 0a99a78ddc Fix random sorting 2026-02-08 21:52:08 +01:00
Shadowghost 71594b4a9a Fix multiple version resolution 2026-02-08 17:22:52 +01:00
renovate[bot] 5656df4339 Update dependency z440.atl.core to 7.11.0 (#16199)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-07 23:45:38 +01:00
Shadowghost bb6c3b4eec Fix BoxSet collapse handling and deletion 2026-02-07 21:17:01 +01:00
JPVenson fa4d51c5e6 Fix container and updated 2026-02-07 18:50:08 +00:00
Shadowghost 2420ece5fe Fix version resolution and scan handling 2026-02-07 19:01:37 +01:00
renovate[bot] 21bb702fd3 Update github/codeql-action action to v4.32.2 (#16171)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-07 10:30:03 -07:00
renovate[bot] 4a494271dd Update dependency AsyncKeyedLock to 8.0.1 (#16096)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-07 10:29:54 -07:00
renovate[bot] 1f6768178a Update dependency Svg.Skia to 3.4.1 (#15941)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-07 10:27:55 -07:00
Shadowghost 00dd84035e Merge remote-tracking branch 'upstream/master' into perf-rebased 2026-02-07 14:06:53 +01:00
Shadowghost f5d966fcc3 Remove Collection and Playlist cleanup task 2026-02-07 09:37:42 +01:00
Shadowghost 98d7c8d59f Make sure we deduplicate LinkedChildren 2026-02-07 09:37:42 +01:00
Shadowghost 268d88a5fb Optimize Collection Grouping, NextUp and Latest queries 2026-02-07 01:38:06 +01:00
Shadowghost 8ddc35a1ce Optimize Indices 2026-02-07 00:57:15 +01:00
Milo Ivir fead4acae1 Translated using Weblate (Croatian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hr/
2026-02-06 22:08:06 +00:00
Milo Ivir ccd042750d Translated using Weblate (Croatian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hr/
2026-02-06 01:52:08 +00:00
Shadowghost 46ad25f47d Fix NextUp 2026-02-05 19:57:39 +01:00
Shadowghost 0c46004cd9 Optimize accessibility checks 2026-02-05 19:57:39 +01:00
Bond-009 e4619556ba Merge pull request #16181 from theguymadmax/trim-people
Trim names and roles for people
2026-02-05 17:45:45 +01:00
Shadowghost a0346fe5b7 Fix multiple version handling 2026-02-05 01:41:07 +01:00
Bond-009 9f2dc178f5 Merge pull request #16178 from theguymadmax/fix-invaild-viewtype
Skip validation for empty landing preferences
2026-02-04 19:23:38 +01:00
Shadowghost aedd2b04a2 Fix alternative Versions and prevent over fetching 2026-02-04 19:19:31 +01:00
theguymadmax 4c751e0a86 Normalize names and roles 2026-02-03 17:41:01 -05:00
Blackspirits 32d8086121 Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt/
2026-02-03 11:05:55 +00:00
Blackspirits 7c200899d7 Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt_PT/
2026-02-03 11:05:55 +00:00
theguymadmax 613d72fa26 Skip empty ViewType validation 2026-02-03 01:16:25 -05:00
Bond-009 909e2142d6 Merge pull request #14927 from nileshp87/patch-1
Add curly brace and parentheses support for parsing attribute values
2026-02-02 20:54:06 +01:00
Bond-009 8083ab78b5 Fix tests 2026-02-02 20:46:28 +01:00
Bond-009 cbc0138507 Merge pull request #16151 from Daydreamer-riri/tmdb-lang
Fix TMDB language handling: support full ISO 639-1 + ISO 3166-1 codes (e.g. zh-CN, zh-TW)
2026-02-02 20:29:03 +01:00
Shadowghost 1dacb69d80 Fix Genre Uniqueness 2026-02-01 21:51:52 +01:00
Shadowghost 77ff451e60 Only save unique values of ProductionLocations, Studios, Tags, Artists and AlbumArtists 2026-02-01 21:23:13 +01:00
KecskeTech 4f695bc58a Translated using Weblate (Hungarian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hu/
2026-02-01 17:36:00 +00:00
Augusto d1d4fe2e33 Translated using Weblate (Spanish (Argentina))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es_AR/
2026-02-01 17:36:00 +00:00
Shadowghost 98b561d62c Revert RefreshMetadata changes 2026-02-01 16:54:59 +01:00
Shadowghost d6a8fa1485 Fix part removal and double series refresh 2026-02-01 14:16:51 +01:00
Bond-009 fc0d268fe5 Merge pull request #16146 from jellyfin/renovate/metabrainz.musicbrainz-8.x
Update dependency MetaBrainz.MusicBrainz to v8
2026-02-01 13:52:40 +01:00
Shadowghost 042385599f Fix orderBy warnings 2026-02-01 12:22:27 +01:00
Riri 7b10888c95 Remove handling for 5-letter language codes in TMDb language normalization 2026-02-01 15:33:07 +08:00
Shadowghost 09a729effe Fix tag checks 2026-01-31 23:45:38 +01:00
Shadowghost 2789532aa8 Optimize Validator and Filter Performance 2026-01-31 19:22:04 +01:00
Shadowghost 694db80d4c Reroute on version removal 2026-01-31 19:21:36 +01:00
renovate[bot] 3920ed4b92 Update dependency MetaBrainz.MusicBrainz to v8 2026-01-31 18:09:41 +00:00
Shadowghost a650148dfd Merge remote-tracking branch 'upstream/master' into perf-rebased 2026-01-30 21:12:06 +01:00
DerMaddis 0a1dd56af6 TmdbSeriesProvider: Set ProductionYear field 2026-01-30 14:24:11 +01:00
dkanada 0413a8b6d2 include external IDs and URLs for book providers 2026-01-29 19:45:31 +09:00
nielsvanvelzen 841e4dabb5 Backport pull request #16109 from jellyfin/release-10.11.z
Fix SessionInfoWebSocketListener not using SessionInfoDto

Original-merge: e65aff8bc6

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

Backported-by: Bond_009 <bond.009@outlook.com>
2026-01-28 12:11:30 -05:00
theguymadmax 815a153b94 Backport pull request #16098 from jellyfin/release-10.11.z
Fix random sort returning duplicate items

Original-merge: a37ead86df

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

Backported-by: Bond_009 <bond.009@outlook.com>
2026-01-28 12:11:29 -05:00
theguymadmax 0c274af72c Backport pull request #16077 from jellyfin/release-10.11.z
Revert hidden directory ignore pattern

Original-merge: 644327eb76

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-01-28 12:11:28 -05:00
MarcoCoreDuo 6d34f605a3 Backport pull request #16071 from jellyfin/release-10.11.z
Rehydrate cached UserData after reattachment

Original-merge: 95d08b264f

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-01-28 12:11:26 -05:00
theguymadmax dad6f650bc Backport pull request #16066 from jellyfin/release-10.11.z
Fix TMDB crew department mapping

Original-merge: 673f617994

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-01-28 12:11:25 -05:00
IceStormNG 5045c2e448 Backport pull request #16053 from jellyfin/release-10.11.z
Fix HLS playlist generation for transcodes with fractional framerate

Original-merge: 893a849f28

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-01-28 12:11:24 -05:00
theguymadmax ec4744709d Backport pull request #15816 from jellyfin/release-10.11.z
Fix artist display order

Original-merge: a2b1936e73

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-01-28 12:11:23 -05:00
Bond-009 91dd146c0f Merge pull request #16119 from jellyfin/renovate/ci-deps
Update CI dependencies
2026-01-28 17:39:23 +01:00
renovate[bot] 4344d75694 Update CI dependencies 2026-01-28 02:41:06 +00:00
Gladtbam b97f5b809d fix: Resolve CA1849/CA2007 synchronous IO in EpubImageProvider (#16124) 2026-01-27 19:40:12 -07:00
Weblate b9e5cce383 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/
2026-01-27 19:12:26 +00:00
Niels van Velzen 565de2d377 Merge pull request #16110 from nielsvanvelzen/api-depr
Remove some deprecated API members
2026-01-27 11:31:50 +01:00
Niels van Velzen 6ed633ce42 Merge pull request #15604 from dkanada/opf-metadata
extract local metadata from OPF and EPUB files
2026-01-27 11:31:27 +01:00
Niels van Velzen cf7150cd9d Merge pull request #15908 from jpds/playback-start-log
SessionManager: Log when playback is started
2026-01-27 11:31:09 +01:00
Niels van Velzen b8d2f1f911 Remove unused usings 2026-01-27 11:13:32 +01:00
Shadowghost 17e8759a52 Apply review suggestions 2026-01-26 16:52:26 +01:00
Niels van Velzen 360b6bcce1 Merge pull request #14809 from lostb1t/fix/subtitleencoder
fix: prevent premature disposal of HTTP subtitle streams
2026-01-26 12:00:14 +01:00
Niels van Velzen 874fd9ac0a Remove some deprecated API members 2026-01-25 21:39:57 +01:00
queeup 92f3c8cf15 Translated using Weblate (Turkish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/tr/
2026-01-25 10:04:21 +00:00
ldmheaye 441a41b2eb Translated using Weblate (Chinese (Simplified Han script))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hans/
2026-01-25 04:25:39 +00:00
ldmheaye bc6c3b1013 Translated using Weblate (Chinese (Simplified Han script))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hans/
2026-01-25 03:33:55 +00:00
ldmheaye a676391af2 Translated using Weblate (Chinese (Simplified Han script))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hans/
2026-01-25 01:35:39 +00:00
ldmheaye 411a6cced1 Translated using Weblate (Chinese (Simplified Han script))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hans/
2026-01-25 01:31:08 +00:00
queeup 62474af0c0 Translated using Weblate (Turkish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/tr/
2026-01-25 00:25:46 +00:00
Bond-009 738d4753f2 Merge pull request #16081 from jellyfin/renovate/ci-deps
Update CI dependencies
2026-01-24 09:38:15 +01:00
renovate[bot] 152d4451ec Update CI dependencies 2026-01-23 14:57:28 +00:00
Bond-009 fd71adfba9 Update dependency Diacritics to 4.1.4 (#16047)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-20 20:18:03 +01:00
Shadowghost 327ace1d30 Fix GetMediaSourceName_Valid test 2026-01-19 12:54:35 +01:00
Shadowghost 95a301dc43 Optimization and search test fixes 2026-01-19 12:39:17 +01:00
Dzmitry Zubialevich 7151c4ca21 Translated using Weblate (Belarusian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/be/
2026-01-19 10:38:18 +00:00
Niels van Velzen 05997987ad Merge pull request #16059 from theguymadmax/master
Update issue template version to 10.11.6
2026-01-19 09:13:26 +01:00
Aung Khant Soe bab4e620e3 Translated using Weblate (Burmese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/my/
2026-01-19 03:22:55 +00:00
theguymadmax 977d1c38b2 Update issue template version to 10.11.6 2026-01-18 20:04:52 -05:00
Shadowghost 342846e4fc Add ImageInfo index 2026-01-18 19:48:46 +01:00
Shadowghost 99440f8432 Fix EFcore readme 2026-01-18 19:48:46 +01:00
Shadowghost 2086ac7dd2 Don't use raw SQL 2026-01-18 19:48:46 +01:00
Shadowghost 4a1012fd22 FIx folder refreshes resetting LinkedChildren 2026-01-18 19:48:46 +01:00
Shadowghost 89427af41c Fixes after rebase 2026-01-18 19:48:46 +01:00
Shadowghost 5996c4afce Complete LinkedChildren integration and batch DTO optimizations
This commit integrates remaining performance changes:

- Add batch user data fetching in DtoService to reduce N+1 queries
- Add GetNextUpEpisodesBatch in TVSeriesManager for efficient batch retrieval
- Update Video/Movie/BoxSet to use LibraryManager for alternate versions
- Transition LinkedChild to use ItemId instead of Path (obsolete Path/LibraryItemId)
- Update providers and controllers for LinkedChildren-based references
- Add NextUpEpisodeBatchResult for batched episode queries
- Integrate IDescendantQueryProvider in SqliteDatabaseProvider
2026-01-18 19:48:46 +01:00
Shadowghost dfa78590c2 Add OwnerId fix migration and library options event
- Add FixIncorrectOwnerIdRelationships migration routine
- Add LibraryOptionsUpdatedEventArgs for library options changes
2026-01-18 19:47:02 +01:00
Shadowghost 912a963a2b Add folder-aware filter extensions and descendant query provider
- Add FolderAwareFilterExtensions for LinkedChildren-based filtering
- Add IDescendantQueryProvider interface for database-specific queries
- Add MatchCriteria classes for folder filtering
- Add SqliteDescendantQueryProvider implementation
2026-01-18 19:47:02 +01:00
Shadowghost f260585917 Add LinkedChildren data migration routine
Migrates existing LinkedChildren data from JSON-serialized Data column
to the new relational LinkedChildren table for boxsets, playlists,
and video alternate versions.
2026-01-18 19:47:02 +01:00
Shadowghost 22d8a00716 Add optimized indexes for UserData and latest items queries 2026-01-18 19:47:02 +01:00
Shadowghost c350fd0f40 Remove ExtraIds column and use OwnerId relationship for extras
- Remove ExtraIds property from BaseItemEntity and BaseItem
- Update RefreshExtras to query via OwnerId instead of cached ExtraIds
- Update GetExtras methods to query database via OwnerIds filter
- Add OwnerIds and ExtraTypes filter support to InternalItemsQuery
- Add filter handling in BaseItemRepository for new query options
- Update HasSpecialFeature/HasTrailer filters to use Extras relationship
- Add CleanupOrphanedExtras migration routine
- Add database migration to drop ExtraIds column
2026-01-18 19:47:02 +01:00
Shadowghost 139d23ddc2 Normalize OwnerId to GUID and add performance indexes
- Change OwnerId from string to Guid for proper foreign key relationships
- Add Owner/Extras navigation properties for extras relationship
- Add indexes on OwnerId and ExtraType columns for efficient queries
- Add optimized composite indexes for latest items queries sorted by DateCreated
- Update BaseItemRepository and migration to handle new Guid type
2026-01-18 19:46:37 +01:00
Shadowghost cc2ccd1bf3 Add LinkedChildren database table for normalized relationships
Introduces a new database table to store linked child relationships for
boxsets, playlists, and video alternate versions. This replaces the
JSON-serialized Data column approach with a proper relational structure.

- Add LinkedChildEntity and LinkedChildType enum
- Add entity configuration with proper foreign keys
- Add EF Core migration for SQLite
2026-01-18 19:46:37 +01:00
Shadowghost 1491494bcb Add early tag check exit and enhance search ordering
- BaseItem: Skip GetInheritedTags() call for users without tag
  restrictions, improving visibility check performance
- BaseItem: Only fetch parents once in visibility chec
- OrderMapper: Include OriginalTitle in search relevance scoring
  for better matching of foreign content
2026-01-18 19:46:37 +01:00
Shadowghost 0b77f97048 Optimize latest items grouping in UserViewManager
- Use dictionary lookup for O(1) container grouping instead of O(n) FirstOrDefault searches
- Add optimized path for movies in GetLatestItemList
- Reduce query limit multiplier from 5x to 2x
- Update to collection expression syntax
2026-01-18 19:45:39 +01:00
Shadowghost d3d4d37e82 Simplify UserDataManager and remove unused private methods
Removes unused private GetUserData and GetUserDataInternal methods.
Moves GetUserDataBatch to be an abstract interface method rather than
having a default implementation for clarity.
2026-01-18 19:45:39 +01:00
Shadowghost 1c1447362e Skip metadata refresh for already-indexed items during validation
Optimizes the validation process by checking if items already exist in
the database before attempting to refresh metadata.
2026-01-18 19:45:39 +01:00
Vignesh Skanda d1c97b8e1d Fix typos in XML documentation comments (#15997)
* Fix typos in XML documentation comments

* Update src/Jellyfin.Networking/Manager/NetworkManager.cs

---------

Co-authored-by: Bond-009 <bond.009@outlook.com>
2026-01-18 18:22:51 +01:00
theguymadmax fb32709259 Backport pull request #16046 from jellyfin/release-10.11.z
Restore weekly refresh for library folder images

Original-merge: 338b480217

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

Backported-by: Bond_009 <bond.009@outlook.com>
2026-01-18 11:30:44 -05:00
theguymadmax c9b7c5bb56 Backport pull request #16029 from jellyfin/release-10.11.z
Skip hidden directories and .ignore paths in library monitoring

Original-merge: 2cb7fb52d2

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-01-18 11:30:43 -05:00
theguymadmax 42ff253339 Backport pull request #16020 from jellyfin/release-10.11.z
Fix birthplace not saving correctly

Original-merge: 49775b1f6a

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-01-18 11:30:42 -05:00
Shadowghost c4ffc357a3 Backport pull request #15983 from jellyfin/release-10.11.z
Prioritize better matches on search

Original-merge: a518160a6f

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-01-18 11:30:41 -05:00
Collin-Swish afcaec0a89 Backport pull request #15965 from jellyfin/release-10.11.z
Add mblink creation logic to library update endpoint.

Original-merge: 22d593b8e9

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-01-18 11:30:39 -05:00
MarcoCoreDuo 09edca8b7a Backport pull request #15899 from jellyfin/release-10.11.z
Fix watched state not kept on Media replace/rename

Original-merge: 8433b6d8a4

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-01-18 11:30:38 -05:00
Shadowghost f9fd34b11e Backport pull request #15872 from jellyfin/release-10.11.z
Be more strict about PersonType assignment

Original-merge: b56de6493f

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-01-18 11:30:37 -05:00
theguymadmax aa666565d1 Backport pull request #15808 from jellyfin/release-10.11.z
Trim music artist names

Original-merge: 093cfc3f3b

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-01-18 11:30:36 -05:00
Bond-009 f83e8ee806 Merge pull request #15928 from jellyfin/renovate/asynckeyedlock-8.x
Update dependency AsyncKeyedLock to v8
2026-01-18 16:33:39 +01:00
renovate[bot] 84ebed1eb7 Update Microsoft to v5 (#15486) 2026-01-18 07:40:09 -07:00
Bond-009 1d7c6af520 Merge pull request #15481 from jellyfin/renovate/major-dotnet-monorepo
Update dependency dotnet-ef to v10
2026-01-18 12:20:25 +01:00
Bond-009 226da3b371 Fix zh-CN subtitle language display (#15947)
The DisplayTitle property was using .NET's CultureInfo.GetCultures(NeutralCultures)
to resolve language display names. Since zh-CN is a specific culture (not neutral),
it would fall back to the base 'zh' code, resulting in generic 'Chinese' instead
of 'Chinese (Simplified)'.

This change adds a LocalizedLanguage property to MediaStream that gets populated
via LocalizationManager.FindLanguageInfo() when streams are retrieved from the
database. This leverages Jellyfin's existing iso6392.txt mappings which correctly
map zh-CN to 'Chinese (Simplified)'.

The same pattern is already used for other localized strings like LocalizedDefault
and LocalizedExternal.
2026-01-18 12:19:31 +01:00
Abitofevrything 8d052a6cb1 Merge pull request #15926 from abitofevrything/feat/accurate_hls_seeking
Refactor HLS transcode seeking
2026-01-18 12:17:06 +01:00
renovate[bot] ef0409d06c Update dependency Diacritics to 4.1.4 2026-01-18 11:09:41 +00:00
Bond-009 b9abf590c5 Merge pull request #15475 from Bond-009/net10
Update to .NET 10.0
2026-01-18 12:08:51 +01:00
rimasx 6a9bb060eb Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/et/
2026-01-15 16:40:52 +00:00
Bond-009 6a7600a8c6 Merge pull request #16002 from jellyfin/renovate/ci-deps
Update CI dependencies
2026-01-14 21:46:53 +01:00
Bond_009 e12131108e Update to 10.0.2 2026-01-14 18:59:02 +01:00
Richard Torhan 89b5b99873 Update Actions to .NET 10 2026-01-14 18:55:47 +01:00
Richard Torhan 50dcec1ff5 Fix error CA2016: Forward the 'cancellationToken' parameter to the 'ExtractToDirectoryAsync' method or pass in 'CancellationToken.None' explicitly to indicate intentionally not propagating the token 2026-01-14 18:55:47 +01:00
Richard Torhan d089537bca Fix error CA1849: 'ZipFile.ExtractToDirectory(Stream, string, bool)' synchronously blocks. Await 'ZipFile.ExtractToDirectoryAsync(Stream, string, bool, CancellationToken)' instead. (https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1849) 2026-01-14 18:55:47 +01:00
Richard Torhan e70355fbe1 Fix nullable annotation 2026-01-14 18:55:47 +01:00
Richard Torhan 140c459ac3 Fix logger CA2024: Do not use StreamReader.EndOfStream in async methods 2026-01-14 18:55:47 +01:00
Bond_009 098e8c6fed Replace AlphanumericComparator with new CompareOptions.NumericOrdering 2026-01-14 18:55:47 +01:00
Bond_009 1ba8e2c93c Fix tests 2026-01-14 18:55:47 +01:00
Bond_009 9e480f6efb Update to .NET 10.0 2026-01-14 18:55:47 +01:00
renovate[bot] 0892847c2f Update CI dependencies 2026-01-14 03:34:32 +00:00
renovate[bot] c464ba83f2 Update dependency dotnet-ef to v10 2026-01-13 18:53:28 +00:00
Samuvel Paul 62e51fd00a Translated using Weblate (Malayalam)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ml/
2026-01-10 14:36:47 +00:00
theguymadmax cf9051c277 Backport pull request #15961 from jellyfin/release-10.11.z
Fix crash when plugin repository has an invalid URL

Original-merge: 317a3a47c3

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-01-10 06:11:27 -05:00
theguymadmax d270957c82 Backport pull request #15950 from jellyfin/release-10.11.z
Revert "always sort season by index number"

Original-merge: 32d2414de0

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-01-10 06:11:26 -05:00
theguymadmax 0ee872999d Backport pull request #15931 from jellyfin/release-10.11.z
Fix tag inheritance for Continue Watching queries

Original-merge: 559e0088e5

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2026-01-10 06:11:25 -05:00
SilentSkies c4f4dcc181 Translated using Weblate (Welsh)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/cy/
2026-01-09 23:05:26 +00:00
SilentSkies 22ee5113d0 Translated using Weblate (Welsh)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/cy/
2026-01-09 22:22:37 +00:00
SilentSkies e233eee07b Translated using Weblate (Welsh)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/cy/
2026-01-09 22:16:00 +00:00
Bond-009 185849b68a Merge pull request #15956 from ZeusCraft10/fix/issue-15945-unknown-type-deserialization
fix: Handle unknown item types gracefully in DeserializeBaseItem
2026-01-09 18:40:59 +01:00
Bond-009 e62b6f8339 Merge pull request #15959 from nyanmisaka/truehd-dts-hls-codec-string
Add TrueHD and DTS codes string for HLS
2026-01-09 18:34:48 +01:00
Bond-009 9931537d87 Merge pull request #15958 from ZeusCraft10/fix/cryptography-provider-missing-iterations
Fix KeyNotFoundException in CryptographyProvider when iterations parameter is missing
2026-01-09 18:30:27 +01:00
Bond-009 82c4df5cde Merge pull request #15963 from jellyfin/renovate/z440.atl.core-7.x
Update dependency z440.atl.core to 7.10.0
2026-01-09 18:26:26 +01:00
renovate[bot] 103f556c8d Update dependency z440.atl.core to 7.10.0 2026-01-06 18:48:42 +00:00
nyanmisaka 582a1d9866 Add TrueHD and DTS codes string for HLS
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2026-01-06 23:15:06 +08:00
ZeusCraft10 244757c92c Fix KeyNotFoundException in CryptographyProvider.Verify
When a password hash is missing the 'iterations' parameter, Verify now
throws a descriptive FormatException instead of KeyNotFoundException.

- Extract GetIterationsParameter() helper method to avoid code duplication
- Provide distinct error messages for missing vs invalid parameters
- Add comprehensive unit tests for CryptographyProvider
2026-01-05 23:03:22 -05:00
ZeusCraft10 0ff869dfcd fix: Handle unknown item types gracefully in DeserializeBaseItem
When querying items with recursive=true, items with types from removed
plugins would cause a 500 error. Now these items are skipped with a
warning log instead of throwing an exception.

Fixes #15945
2026-01-05 21:08:26 -05:00
Niels van Velzen a1e0e4fd9d Merge pull request #15888 from Shadowghost/fix-api-diff
Fix API diff workflow
2026-01-05 17:22:50 +01:00
Dzmitry Zubialevich 4138214ac3 Translated using Weblate (Belarusian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/be/
2026-01-05 13:51:28 +00:00
ZeusCraft10 9039077286 Fix zh-CN subtitle language display
The DisplayTitle property was using .NET's CultureInfo.GetCultures(NeutralCultures)
to resolve language display names. Since zh-CN is a specific culture (not neutral),
it would fall back to the base 'zh' code, resulting in generic 'Chinese' instead
of 'Chinese (Simplified)'.

This change adds a LocalizedLanguage property to MediaStream that gets populated
via LocalizationManager.FindLanguageInfo() when streams are retrieved from the
database. This leverages Jellyfin's existing iso6392.txt mappings which correctly
map zh-CN to 'Chinese (Simplified)'.

The same pattern is already used for other localized strings like LocalizedDefault
and LocalizedExternal.
2026-01-05 06:22:44 -05:00
Shadowghost 8a1129bbde Use new repoository and lock to commit 2026-01-05 12:19:26 +01:00
Bond-009 706a8d2850 Merge pull request #14990 from jellyfin/renovate/metabrainz.musicbrainz-7.x
Update dependency MetaBrainz.MusicBrainz to v7
2026-01-03 12:11:44 +01:00
Bond-009 ba4dbcf5a1 Merge pull request #15916 from stevenaw/optimize-tofirstupper
Optimize `StringHelper.FirstToUpper()`
2026-01-03 12:04:19 +01:00
Dzmitry Zubialevich bfae788a44 Translated using Weblate (Belarusian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/be/
2026-01-02 11:39:26 +00:00
renovate[bot] e02a2ae48f Update dependency AsyncKeyedLock to v8 2026-01-02 10:49:18 +00:00
Shadowghost 18dc32d735 Fix OpenAPI diff workflow 2026-01-02 10:07:45 +01:00
Shadowghost 85ff708597 Format workflows 2026-01-02 10:07:45 +01:00
Tim Eisele 23b48a0d0f Upgrade Swashbuckle and fix OpenAPI spec (#15886) 2026-01-01 18:46:51 -07:00
Peaches_MLG d1055b0b36 Fixed issue with ABI Compatability - Difference not completing (#15924) 2026-01-01 18:46:17 -07:00
Jonathan Davies 3c77758b32 SessionManager: Improved wording of playback messages 2025-12-31 20:53:55 +00:00
Jonathan Davies b564a43d9c SessionManager: Log usernames in playback messages 2025-12-31 15:01:50 +00:00
Jonathan Davies f08657ab27 SessionManager: Log when playback is started 2025-12-31 15:01:41 +00:00
stevenaw e5fb071708 Optimize StringHelper.ToFirstUpper() 2025-12-31 09:26:31 -05:00
ZeusCraft10 72b4faa00b Fix UDP Auto-Discovery returning IPv6 for cross-subnet IPv4 requests
Fixes #15898

When a UDP discovery request is relayed from a different IPv4 subnet,
GetBindAddress() now correctly returns an IPv4 address instead of
incorrectly falling back to ::1.

Changes:
- Loopback fallback now prefers address family matching the source IP
- Interface fallback now prefers interfaces matching source address family
- Added test case for cross-subnet IPv4 request scenario
2025-12-30 17:34:05 -05:00
SamuWhale d28ee6d714 Translated using Weblate (Thai)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/th/
2025-12-29 17:50:10 +00:00
MrPlow 2f62a8bb39 Translated using Weblate (German)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/de/
2025-12-29 17:50:10 +00:00
Joker 75f1276119 Translated using Weblate (German)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/de/
2025-12-29 11:04:35 +00:00
Bond_009 6c8395ff87 Fix build 2025-12-29 10:06:22 +01:00
Bond_009 82b2e7773f Pass cancellation token to GetReleaseGroupResultAsync 2025-12-29 10:05:46 +01:00
renovate[bot] 336958318d Update dependency MetaBrainz.MusicBrainz to v7 2025-12-29 09:00:33 +00:00
Bond-009 8a8f7956ef Merge pull request #15878 from jellyfin/renovate/xunit.skippablefact-1.x
Update dependency Xunit.SkippableFact to 1.5.61
2025-12-28 13:23:48 +01:00
Collin-Swish c728e97bda Backport pull request #15858 from jellyfin/release-10.11.z
Fix playlist item de-duplication

Original-merge: 78e3702cb0

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-28 07:22:38 -05:00
gnattu 5c76dd26bc Backport pull request #15835 from jellyfin/release-10.11.z
Use hvc1 codectag for Dolby Vision 8.4

Original-merge: 18096e48e0

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-28 07:22:37 -05:00
nyanmisaka 7af5ee1812 Backport pull request #15834 from jellyfin/release-10.11.z
Fix video lacking SAR and DAR are marked as anamorphic

Original-merge: 9470439cfa

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-28 07:22:36 -05:00
nyanmisaka 7f0e71578d Backport pull request #15833 from jellyfin/release-10.11.z
Fix missing H.264 and AV1 SDR fallbacks in HLS playlist

Original-merge: 01b20d3b75

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-28 07:22:34 -05:00
cvium 45e881c93e Backport pull request #15826 from jellyfin/release-10.11.z
add CultureDto cache

Original-merge: 1805f2259f

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-28 07:22:33 -05:00
nyanmisaka b429306f05 Backport pull request #15819 from jellyfin/release-10.11.z
Fix the use of HWA in unsupported H.264 Hi422P/Hi444PP

Original-merge: 4c587776d6

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-28 07:22:32 -05:00
gnattu 88acd51ee2 Backport pull request #15807 from jellyfin/release-10.11.z
Enforce more strict webm check

Original-merge: 8379b4634a

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-28 07:22:31 -05:00
Shadowghost 3c802a7505 Backport pull request #15793 from jellyfin/release-10.11.z
Prefer US rating on fallback

Original-merge: 156761405e

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-28 07:22:30 -05:00
theguymadmax 928a8458dd Backport pull request #15786 from jellyfin/release-10.11.z
Fix parental rating filtering with sub-scores

Original-merge: 5804d6840c

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-28 07:22:28 -05:00
nyanmisaka 43797fee42 Backport pull request #15776 from jellyfin/release-10.11.z
Fix AV1 decoding hang regression on RK3588

Original-merge: 035b5895b0

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-28 07:22:27 -05:00
theguymadmax b9158c467a Backport pull request #15768 from jellyfin/release-10.11.z
Fix NullReferenceException in ApplyOrder method

Original-merge: b617c62f8e

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-28 07:22:26 -05:00
theguymadmax 252ab45473 Backport pull request #15767 from jellyfin/release-10.11.z
Fix collections display order

Original-merge: 22da5187c8

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-28 07:22:25 -05:00
theguymadmax afc083e9fa Backport pull request #15766 from jellyfin/release-10.11.z
Fix backdrop images being deleted when stored with media

Original-merge: 12c5d6b636

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-28 07:22:24 -05:00
theguymadmax f867ce3842 Backport pull request #15757 from jellyfin/release-10.11.z
Fix trickplay images using wrong item on alternate versions

Original-merge: 481ee03f35

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-28 07:22:23 -05:00
Collin-Swish 2a464c316d Backport pull request #15752 from jellyfin/release-10.11.z
Fix case sensitivity edge case

Original-merge: b50ce1ad6b

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-28 07:22:21 -05:00
Shadowghost b9cf26db2f Backport pull request #15746 from jellyfin/release-10.11.z
Skip invalid ignore rules

Original-merge: 6e60634c9f

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-28 07:22:20 -05:00
myzhysz 580585846b Backport pull request #15698 from jellyfin/release-10.11.z
Fix stack overflow during scan (#15000)

Original-merge: dde70fd8a2

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-28 07:22:19 -05:00
martenumberto 1af1c72e81 Backport pull request #15690 from jellyfin/release-10.11.z
Fix: Add .ts fallback for video streams to prevent crash

Original-merge: 2a0b90e385

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-28 07:22:18 -05:00
gnattu 5557004375 Backport pull request #15689 from jellyfin/release-10.11.z
Use original name for MusicAritist matching

Original-merge: 4c5a3fbff3

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-28 07:22:17 -05:00
ivanjx 5d50ff5f81 Backport pull request #15681 from jellyfin/release-10.11.z
Fix symlinked file size

Original-merge: d32f487e8e

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-28 07:22:15 -05:00
theguymadmax 8e2ed40a8b Backport pull request #15680 from jellyfin/release-10.11.z
Fix ItemAdded event triggering when updating metadata

Original-merge: fb65f8f853

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-28 07:22:14 -05:00
andrewrabert 8461268837 Backport pull request #15666 from jellyfin/release-10.11.z
Fix unnecessary database JOINs in ApplyNavigations

Original-merge: 4cdd8c8233

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-28 07:22:13 -05:00
SapientGuardian 8a0b963d2c Backport pull request #15662 from jellyfin/release-10.11.z
Fix blocking in async context in LimitedConcurrencyLibraryScheduler

Original-merge: d91adb5d54

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-28 07:22:12 -05:00
liszto 24acd94015 Backport pull request #15659 from jellyfin/release-10.11.z
Fix thumbnails never deletes from temp folder ( issue #15629 )

Original-merge: 636908fc4d

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-28 07:22:11 -05:00
MrPlow c30654c33c Translated using Weblate (German)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/de/
2025-12-28 01:44:02 +00:00
renovate[bot] 7bafd13564 Update dependency Xunit.SkippableFact to 1.5.61 2025-12-27 18:48:03 +00:00
Translation expert 0e73a56a45 Translated using Weblate (Arabic)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ar/
2025-12-26 01:04:36 +00:00
Bond-009 f9fec33048 Merge pull request #15797 from Smeagolworms4/fix-get-metadata-editor-info
Fix GET MetadataEditor ContentTypeOptions for mixed content
2025-12-24 10:28:58 +01:00
Bond-009 934a9c9e32 Merge pull request #15831 from allmazz/upd-contributors
Add myself to CONTRIBUTORS.md
2025-12-24 10:26:02 +01:00
Bond-009 25115e95aa Merge branch 'master' into upd-contributors 2025-12-24 10:25:54 +01:00
john janzen 146681f0ba Warn server administrator when IPv6 is enabled but unsupported by OS 2025-12-21 15:37:22 +01:00
lostb1t 7f1a0ff6fc wip 2025-12-21 14:34:27 +01:00
lostb1t 8d8d38600e wip 2025-12-21 14:34:27 +01:00
lostb1t 172b054f48 wip 2025-12-21 14:34:27 +01:00
lostb1t 2168847a45 wip 2025-12-21 14:34:27 +01:00
lostb1t e5a2acd6dd ise codec before path on format selection 2025-12-21 14:34:27 +01:00
lostb1t ddc613cd72 fix CA2007 2025-12-21 14:34:27 +01:00
lostb1t fa99b1d81c fix: remote subtitles 2025-12-21 14:34:27 +01:00
john janzen 93902fc610 fix crashes on devices that don't support ipv6 2025-12-20 19:50:33 +01:00
Björn Tenje Persson 84f66dd54e Fixed Multi Sort in New ActivityManager (#15820) 2025-12-19 20:36:38 -07:00
Kityn d446fde009 Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pl/
2025-12-19 06:55:08 +00:00
Fabrizio Mansilla ee676fd568 Translated using Weblate (Spanish (Argentina))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es_AR/
2025-12-19 06:55:08 +00:00
Kirill Nikiforov 2cca942ce6 Add myself to CONTRIBUTORS.md 2025-12-18 22:56:33 +01:00
Michael 59d574edb7 Translated using Weblate (German)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/de/
2025-12-17 22:15:03 +00:00
Bond-009 c170b18155 Merge pull request #15810 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v4.31.9
2025-12-17 18:08:51 +01:00
renovate[bot] 45a49a4fb4 Update github/codeql-action action to v4.31.9 2025-12-16 19:10:15 +00:00
João Moura 12a2f7c1a5 Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt_PT/
2025-12-16 18:22:40 +00:00
SmeagolWorms4 d0950c8f09 Fix GET MetadataEditor ContentTypeOptions for inheritedContentType 2025-12-15 23:11:01 +01:00
Joshua M. Boniface ebf8220f1d Merge pull request #15798 from theguymadmax/10.11.5-template-version
Update issue template version to 10.11.5
2025-12-15 09:59:51 -05:00
theguymadmax c4e8180b3c Update issue template version to 10.11.5 2025-12-15 09:20:41 -05:00
Luigi311 771b0a7eab Library: Async the SaveImages function (#15718) 2025-12-13 08:43:49 -07:00
renovate[bot] 4db0ab0f40 Update GitHub Artifact Actions (#15783)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-13 08:42:57 -07:00
dkanada dd480f96cd parse more information from book filenames (#15655) 2025-12-13 08:29:28 -07:00
Niels van Velzen 6b6d54a07c Remove legacy API route middleware (#15669) 2025-12-13 08:26:22 -07:00
Bond-009 428beda1c7 Merge pull request #15780 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v4.31.8
2025-12-13 10:43:57 +01:00
Bond-009 baa8d40940 Merge pull request #15774 from stevenaw/optimize-GetUniqueFlags
Optimize GetUniqueFlags<T>()
2025-12-12 18:00:25 +01:00
renovate[bot] c8bdee26b7 Update github/codeql-action action to v4.31.8 2025-12-12 12:13:35 +00:00
stevenaw ef73ed6ef7 optimize GetUniqueFlags() 2025-12-11 22:15:19 -05:00
Nilesh Patel acb9da6f93 Add curly brace and parentheses support for parsing attribute values from paths 2025-12-10 12:23:05 -08:00
Masood d1f242bc09 Update CONTRIBUTORS.md 2025-12-10 19:08:54 +05:30
Masood 113bd9af05 Remove redundant assignment in playback start logic 2025-12-10 18:50:20 +05:30
Masood d757e12e1a Update CONTRIBUTORS.md 2025-12-10 18:26:23 +05:30
Masood 37d6101f02 Fix watched status resetting on re-watch 2025-12-10 18:11:03 +05:30
Veldermon-rbg d70e0fe9cf Translated using Weblate (Maori)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/mi/
2025-12-10 05:20:53 +00:00
Veldermon-rbg 053cc9406d Added translation using Weblate (Maori) 2025-12-10 00:29:33 +00:00
Bas 0f85120c5e Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2025-12-10 00:29:32 +00:00
Tom O'Neill 25aef7fabf Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2025-12-10 00:29:32 +00:00
Mark Cilia Vincenti 492ea66841 Proper pinning of SkiaSharp to prevent accidental updates (#15736) 2025-12-08 21:16:14 -07:00
evan314159 8b2a8b94b6 avoid Take(0) when limit == 0 (#14608)
Co-authored-by: Evan <evan@MacBook-Pro.local>
2025-12-08 21:15:46 -07:00
xin f24e80701c Fix typo in CheckOrCreateMarker exception (#15341) 2025-12-08 21:06:17 -07:00
Cody Robibero 0b3d6676d1 Add ability to sort and filter activity log entries (#15583) 2025-12-08 21:01:32 -07:00
Mark Cilia Vincenti c3a8734adf Locking cleaning (#15713) 2025-12-08 21:01:12 -07:00
audrey-inglish 8fd59d6f33 Merge pull request #14879 from audrey-inglish/master
Fix: normalize punctuation when computing CleanName so searches without punctuation match (closes #1674)
2025-12-08 18:43:37 +01:00
Bond-009 da3bff3edf Merge pull request #15433 from theguymadmax/fix-recently-added-shows
Fix episodes showing up on recently added shows
2025-12-08 18:38:50 +01:00
Bond-009 45cb5a0008 Merge pull request #15704 from theguymadmax/add-cpu-to-template
Add CPU to issue template
2025-12-05 20:50:59 +01:00
Bond-009 ea097fb1a3 Merge pull request #15706 from jellyfin/renovate/ci-deps
Update CI dependencies
2025-12-05 20:47:46 +01:00
renovate[bot] a25b48b151 Update CI dependencies 2025-12-05 18:58:06 +00:00
Furqaan Dawood 873f1d9e83 Added translation using Weblate (Swahili) 2025-12-04 14:41:47 +00:00
Bond-009 294439bf74 Merge pull request #15682 from jellyfin/renovate/ci-deps
Update CI dependencies
2025-12-03 20:05:29 +01:00
crobibero 6e74be0d46 Backport pull request #15672 from jellyfin/release-10.11.z
Cache OpenApi document generation

Original-merge: 8cd5652157

Merged-by: anthonylavado <anthony@lavado.ca>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-03 14:04:28 -05:00
nyanmisaka deb81eae10 Backport pull request #15670 from jellyfin/release-10.11.z
Fix the empty output of trickplay on RK3576

Original-merge: 98d1d0cb35

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

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-03 14:04:27 -05:00
theguymadmax 70dcf3f7b3 Backport pull request #15594 from jellyfin/release-10.11.z
Fix isMovie filter logic

Original-merge: 94f3725208

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-03 14:04:25 -05:00
QuintonQu ebcfed83c4 Backport pull request #15582 from jellyfin/release-10.11.z
Add hidden file check in BdInfoDirectoryInfo.cs.

Original-merge: 29b3aa8543

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-03 14:04:24 -05:00
theguymadmax 5d46278584 Backport pull request #15568 from jellyfin/release-10.11.z
Fix ResolveLinkTarget crashing on exFAT drives

Original-merge: fbb9a0b2c7

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-03 14:04:23 -05:00
theguymadmax 4f020a947a Backport pull request #15564 from jellyfin/release-10.11.z
Fix locked fields not saving

Original-merge: 0ee81e87be

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-03 14:04:22 -05:00
theguymadmax 3460d1de3c Backport pull request #15563 from jellyfin/release-10.11.z
Save item to database before providers run to prevent FK errors

Original-merge: c491a918c2

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-03 14:04:20 -05:00
gnattu 7d2e4cd817 Backport pull request #15557 from jellyfin/release-10.11.z
Restrict first video frame probing to file protocol

Original-merge: ee7ad83427

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-03 14:04:19 -05:00
gnattu 8cd6ef37c4 Backport pull request #15556 from jellyfin/release-10.11.z
Prevent copying HDR streams when only SDR is supported

Original-merge: 1e7e46cb82

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-03 14:04:18 -05:00
theguymadmax e4daaf0d83 Backport pull request #15548 from jellyfin/release-10.11.z
Fix NullReferenceException in filesystem path comparison

Original-merge: 5ae444d96d

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-12-03 14:04:17 -05:00
theguymadmax 69c98af9f9 Add CPU to issue template 2025-12-03 09:45:50 -05:00
renovate[bot] 7425a493ee Update CI dependencies 2025-12-03 05:30:25 +00:00
Hasan Abdulaal 691c194152 Translated using Weblate (Arabic)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ar/
2025-12-02 13:27:39 +00:00
Niels van Velzen 2f8896c375 Merge pull request #15538 from KarkaLT/master
Add subtitle extraction timeout configuration option
2025-12-02 13:50:42 +01:00
Niels van Velzen 6c507b77ae Remove DtoExtensions.AddClientFields (#15638) 2025-11-30 07:22:54 -07:00
renovate[bot] 6ed0ccd37c Update appleboy/ssh-action action to v1.2.4 (#15660)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-30 07:15:08 -07:00
Martín 80e1e42947 Added translation using Weblate (Occitan) 2025-11-28 20:01:20 +00:00
Niels van Velzen 6ace00eb6a Merge pull request #15227 from kevgrig/issue15226
Add milliseconds to default console output format
2025-11-27 16:33:38 +01:00
Niels van Velzen a35ffbf17e Merge pull request #13977 from sususu98/fix/strm-local-subtitle-url
refactor(StreamInfo): reorganize subtitle URL logic and conditions
2025-11-27 16:33:19 +01:00
Niels van Velzen 8c02c3be93 Merge pull request #14824 from CodyEngel/fix-numeric-titles
Fix TV Series parsing containing only numbers.
2025-11-27 16:32:11 +01:00
Niels van Velzen 45669c9b30 Merge pull request #15437 from allmazz/feat/more_file_metadata_tags
Add support for more embedded metadata tags
2025-11-27 16:31:42 +01:00
Niels van Velzen 19c232809e Merge pull request #14950 from nielsvanvelzen/security-remove-has-password
Deprecate HasPassword property on UserDto
2025-11-27 16:31:05 +01:00
Niels van Velzen 301f65af48 Merge pull request #15559 from nielsvanvelzen/disable-legacy-auth
Disable legacy authorization methods by default
2025-11-27 16:30:45 +01:00
Bond-009 082ba58e51 Merge pull request #15630 from jellyfin/renovate/ci-deps
Update CI dependencies
2025-11-25 18:30:46 +01:00
Bond-009 3b5bdc6bc2 Merge pull request #15246 from JPVenson/feature/AddVersionDisplayStartupUi
Add version to StartupUI
2025-11-25 18:30:27 +01:00
Bond-009 b05e91dba1 Merge pull request #15614 from jellyfin/renovate/polly-monorepo
Update dependency Polly to 8.6.5
2025-11-25 18:26:41 +01:00
renovate[bot] c7703242e5 Update CI dependencies 2025-11-25 06:39:50 +00:00
Bond-009 21042ad0c2 Merge pull request #15626 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v4.31.5
2025-11-24 19:16:42 +01:00
renovate[bot] 8904551a59 Update github/codeql-action action to v4.31.5 2025-11-24 11:12:00 +00:00
renovate[bot] cf1ef22367 Update dependency Polly to 8.6.5 2025-11-23 14:03:55 +00:00
dkanada d95bab41a1 improve genre support from OPF metadata 2025-11-23 21:40:52 +09:00
dkanada 820e208bdc fix runtime exception from incorrect argument to XDocument method 2025-11-23 21:37:56 +09:00
rimasx c08e81c52b Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/et/
2025-11-23 10:43:48 +00:00
Bond-009 23e66ae1ea Merge pull request #15607 from jellyfin/renovate/z440.atl.core-7.x
Update dependency z440.atl.core to 7.9.0
2025-11-23 10:22:43 +01:00
MBR#0001 73fd6721f6 Skip library if all subtitle providers are disabled 2025-11-22 17:39:43 +01:00
KGT1 41c1c5f7bf remove global subtitle configuration 2025-11-22 17:15:09 +01:00
renovate[bot] 37bbdf3fe7 Update dependency z440.atl.core to 7.9.0 2025-11-22 15:15:12 +00:00
Bond-009 f124223015 Merge pull request #15591 from jellyfin/renovate/actions-checkout-6.x
Update actions/checkout action to v6
2025-11-22 10:22:11 +01:00
Bond-009 9587a9b13c Merge pull request #15566 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v4.31.4
2025-11-22 10:20:48 +01:00
dkanada 6963d95880 extract local metadata from OPF and EPUB files 2025-11-22 16:25:59 +09:00
Niels van Velzen 67c67df507 Use async migration 2025-11-20 22:11:55 +01:00
renovate[bot] 569f8cfcfc Update actions/checkout action to v6 2025-11-20 18:58:53 +00:00
Anthony Lavado aa4ddd139a Add all 10.11 versions to issue template (#15565) 2025-11-18 21:05:43 -05:00
renovate[bot] 8ac97f5471 Update github/codeql-action action to v4.31.4 2025-11-19 01:37:24 +00:00
Bond-009 efabfbc931 Merge pull request #15542 from jellyfin/renovate/ci-deps
Update actions/checkout action to v5.0.1
2025-11-18 22:04:58 +01:00
Bond-009 6b5dc115e8 Merge pull request #15478 from jellyfin/renovate/microsoft
Update Microsoft
2025-11-18 22:01:56 +01:00
Bond-009 2dc0af667e Merge pull request #15477 from jellyfin/renovate/dotnet-monorepo
Update dependency dotnet-ef to v9.0.11
2025-11-18 22:01:49 +01:00
Niels van Velzen 196c243a7d Disable legacy authorization methods by default 2025-11-18 16:17:04 +01:00
Rufis72 55dbff8f30 Translated using Weblate (English (Pirate))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/en@pirate/
2025-11-18 08:19:02 +00:00
theguymadmax 2af43e0131 Backport pull request #15529 from jellyfin/release-10.11.z
Fix movie titles using folder name when NFO saver is enabled

Original-merge: f8e012582a

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-11-17 14:09:14 -05:00
theguymadmax faf1cea63e Backport pull request #15514 from jellyfin/release-10.11.z
Add 1 minute tolerance for NFO change detection

Original-merge: 6566188e45

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-11-17 14:09:13 -05:00
theguymadmax 7e25089c08 Backport pull request #15508 from jellyfin/release-10.11.z
Fix playlist DateCreated and DateLastMediaAdded not being set

Original-merge: 078f9584ed

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-11-17 14:09:12 -05:00
Iksas 8fa36a38e2 Backport pull request #15502 from jellyfin/release-10.11.z
Fix font extraction for certain transcoding settings

Original-merge: ee34c75386

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-11-17 14:09:10 -05:00
theguymadmax 5b3f29946b Backport pull request #15501 from jellyfin/release-10.11.z
Fix .ignore handling for directories

Original-merge: e8150428b6

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-11-17 14:09:09 -05:00
theguymadmax c869b5b884 Backport pull request #15493 from jellyfin/release-10.11.z
Remove InheritedTags and update tag filtering logic

Original-merge: 4b38e35bbb

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-11-17 14:09:08 -05:00
CBPJ a08b6ac266 Backport pull request #15487 from jellyfin/release-10.11.z
Fix gitignore-style not working properly on windows.

Original-merge: 435bb14bb2

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-11-17 14:09:07 -05:00
theguymadmax 4e68a5a078 Backport pull request #15472 from jellyfin/release-10.11.z
Fix series DateLastMediaAdded not updating when new episodes are added

Original-merge: abfbaca336

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-11-17 14:09:06 -05:00
Bond-009 99c68ddd50 Backport pull request #15468 from jellyfin/release-10.11.z
Check if target exists before trying to follow it

Original-merge: 5878b1ffc5

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-11-17 14:09:05 -05:00
Bond-009 d7f628677e Backport pull request #15466 from jellyfin/release-10.11.z
Don't error out when searching for marker files fails

Original-merge: f4a846aa4d

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-11-17 14:09:03 -05:00
theguymadmax e51680cf56 Backport pull request #15462 from jellyfin/release-10.11.z
Fix NullReferenceException in GetPathProtocol when path is null

Original-merge: 7c1063177f

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-11-17 14:09:02 -05:00
theguymadmax 2e7d7752e9 Backport pull request #15446 from jellyfin/release-10.11.z
Fix AncestorIds not migrating

Original-merge: 177b6464ca

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-11-17 14:09:01 -05:00
IceStormNG 26ac2ccd74 Backport pull request #15441 from jellyfin/release-10.11.z
Fix System.NullReferenceException when people's role is null (10.11.z)

Original-merge: 5a9a8363f4

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-11-17 14:08:59 -05:00
theguymadmax de9e653b73 Backport pull request #15435 from jellyfin/release-10.11.z
Fix search terms using diacritics

Original-merge: 63a3e55297

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-11-17 14:08:58 -05:00
theguymadmax e34e7a1d0b Backport pull request #15423 from jellyfin/release-10.11.z
Invalidate parent folder's cache on deletion/creation

Original-merge: 49efd68fc7

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-11-17 14:08:57 -05:00
nielsvanvelzen 5a30f108fe Backport pull request #15422 from jellyfin/release-10.11.z
Update branding in Swagger page

Original-merge: d140630208

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-11-17 14:08:56 -05:00
JPVenson 74c9629372 Backport pull request #15413 from jellyfin/release-10.11.z
Fixed missing sort argument

Original-merge: 91c3b1617e

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-11-17 14:08:55 -05:00
theguymadmax 6c5f448787 Backport pull request #15404 from jellyfin/release-10.11.z
Improve season folder parsing

Original-merge: 2e5ced5098

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-11-17 14:08:54 -05:00
Bond-009 f848b8f12c Backport pull request #15390 from jellyfin/release-10.11.z
Don't enforce a minimum amount of free space for the tmp and log dirs

Original-merge: 097cb87f6f

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-11-17 14:08:53 -05:00
theguymadmax bcec5f2e44 Backport pull request #15381 from jellyfin/release-10.11.z
Fix name filters to use only SortName

Original-merge: 7222910b05

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-11-17 14:08:51 -05:00
theguymadmax 7d05c875f3 Backport pull request #15380 from jellyfin/release-10.11.z
Fix item count display for collapsed items

Original-merge: 8f71922734

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-11-17 14:08:50 -05:00
theguymadmax c805c5e2b1 Backport pull request #15373 from jellyfin/release-10.11.z
Fix collection grouping in mixed libraries

Original-merge: 13c4517a66

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-11-17 14:08:49 -05:00
evanreichard c2c4c0adbf Backport pull request #15369 from jellyfin/release-10.11.z
feat(sqlite): add timeout config

Original-merge: c2e5081d64

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-11-17 14:08:48 -05:00
revam 5ea3910af9 Backport pull request #15263 from jellyfin/release-10.11.z
Resolve symlinks for static media source infos

Original-merge: 3b2d64995a

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-11-17 14:08:47 -05:00
theguymadmax 06fb300cff Backport pull request #14955 from jellyfin/release-10.11.z
Fix tmdbid not detected in single movie folder

Original-merge: def5956cd1

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-11-17 14:08:45 -05:00
renovate[bot] 626ab7e00a Update actions/checkout action to v5.0.1 2025-11-17 18:40:00 +00:00
Bond-009 1d140645b0 Merge pull request #15528 from jellyfin/renovate/z440.atl.core-7.x
Update dependency z440.atl.core to 7.8.0
2025-11-17 19:38:20 +01:00
Karolis 5182aec13f Add subtitle extraction timeout configuration option 2025-11-17 15:18:29 +02:00
renovate[bot] 52f0c3dd24 Update dependency z440.atl.core to 7.8.0 2025-11-16 17:53:55 +00:00
Bond-009 b8327dbc9f Merge pull request #15480 from jellyfin/renovate/ci-deps
Update CI dependencies
2025-11-16 18:52:54 +01:00
hoanghuy309 d1722936c0 Translated using Weblate (Vietnamese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/vi/
2025-11-15 06:48:18 +00:00
renovate[bot] 931240a3f5 Update CI dependencies 2025-11-14 01:24:06 +00:00
Grant Alexander b216a27bfc Translated using Weblate (English (Pirate))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/en@pirate/
2025-11-12 23:22:20 +00:00
renovate[bot] 8471a67bcd Update Microsoft 2025-11-11 18:42:18 +00:00
renovate[bot] b8a409195f Update dependency dotnet-ef to v9.0.11 2025-11-11 18:42:10 +00:00
Bond-009 1da67e5e10 Merge pull request #15450 from jellyfin/renovate/fscheck.xunit-3.x
Update dependency FsCheck.Xunit to 3.3.2
2025-11-09 19:39:59 +01:00
Bond-009 ed1ec7ca6b Merge pull request #15448 from jellyfin/renovate/z440.atl.core-7.x
Update dependency z440.atl.core to 7.7.0
2025-11-09 17:57:55 +01:00
renovate[bot] 3d7a68beb1 Update dependency FsCheck.Xunit to 3.3.2 2025-11-09 15:40:14 +00:00
renovate[bot] 32fc57cf17 Update dependency z440.atl.core to 7.7.0 2025-11-09 10:59:00 +00:00
Christopher Young 88602ce905 Refactored GroupTests. Removed duplicate mock object declarations 2025-11-08 12:35:37 -07:00
Bond-009 0598c6eaf6 Merge pull request #15438 from jellyfin/renovate/ci-deps
Update appleboy/ssh-action action to v1.2.3
2025-11-08 17:17:52 +01:00
Andrew 0d7b687da0 Update Jellyfin Server version in issue template (#15398) 2025-11-08 08:30:30 -07:00
Christopher Young 4cb0385745 Merge branch 'master' of https://github.com/JadedRain/jellyfin 2025-11-08 07:31:02 -07:00
Christopher Young 438d992c8b Fixed group tests to use a file scoped namespace 2025-11-08 07:30:58 -07:00
renovate[bot] e69754fd3a Update appleboy/ssh-action action to v1.2.3 2025-11-08 04:18:07 +00:00
Kirill Nikiforov ac81ddd39a add support for more embedded metadata tags 2025-11-08 02:54:53 +04:00
theguymadmax 217ea488df Fix episode showing up on recently added shows 2025-11-07 09:39:23 -05:00
Diogo Coelho f693c9d39f Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt_PT/
2025-11-06 11:37:15 +00:00
Logan Douglas 1adf441f1c Merge branch 'jellyfin:master' into master 2025-11-05 13:06:57 -07:00
Bond-009 96d72788a1 Merge pull request #15312 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v4.31.2
2025-11-04 21:07:02 +01:00
Bond-009 0d74a95bb8 Merge pull request #15348 from jellyfin/renovate/serilog.sinks.console-6.x
Update dependency Serilog.Sinks.Console to 6.1.1
2025-11-04 21:05:17 +01:00
evanreichard a7d039b7c6 Backport pull request #15328 from jellyfin/release-10.11.z
fix: in optimistic locking, key off table is locked

Original-merge: b5f0199a25

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2025-11-02 21:58:46 -05:00
Shadowghost 87b02b1316 Backport pull request #15326 from jellyfin/release-10.11.z
Skip too large extracted season numbers

Original-merge: e7dbb3afec

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2025-11-02 21:58:45 -05:00
vinnyspb 871de372ff Backport pull request #15325 from jellyfin/release-10.11.z
Update file size when refreshing metadata

Original-merge: f994dd6211

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2025-11-02 21:58:44 -05:00
crobibero c9d93b0745 Backport pull request #15322 from jellyfin/release-10.11.z
Fix legacy migration file checks

Original-merge: da254ee968

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2025-11-02 21:58:43 -05:00
thornbill 1ccd10863e Backport pull request #15254 from jellyfin/release-10.11.z
Update password reset to always return the same response structure

Original-merge: 4ad3141875

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2025-11-02 21:58:42 -05:00
nyanmisaka 4258df4485 Backport pull request #15247 from jellyfin/release-10.11.z
Ignore initial delay in audio-only containers

Original-merge: 6bf88c049e

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2025-11-02 21:58:41 -05:00
renovate[bot] 63f06aad94 Update dependency Serilog.Sinks.Console to 6.1.1 2025-11-02 23:14:23 +00:00
Taylor Southwick 43a055d7ea Enable jellyfin.db customized path
This enables moving where the database is stored to another directory that doesn't have all the trickplay/subtitles/etc

Fixes #15354
2025-11-02 11:11:39 -08:00
Jacky He ffe82be7a7 Translated using Weblate (Chinese (Traditional Han script, Hong Kong))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant_HK/
2025-10-31 23:39:28 +00:00
Logan Douglas 490bf347cb Merge branch 'jellyfin:master' into master 2025-10-31 13:06:17 -06:00
Jacky He 23929a3e70 Translated using Weblate (Chinese (Traditional Han script, Hong Kong))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant_HK/
2025-10-30 19:34:52 +00:00
renovate[bot] 83d0dbdbcb Update github/codeql-action action to v4.31.2 2025-10-30 18:35:55 +00:00
Battseren Badral 573ce9ceaa Translated using Weblate (Mongolian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/mn/
2025-10-29 22:47:08 +00:00
Jacky He f21fe9f95e Translated using Weblate (Chinese (Traditional Han script, Hong Kong))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant_HK/
2025-10-29 22:47:08 +00:00
Battseren Badral f92eca3efb Translated using Weblate (Mongolian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/mn/
2025-10-29 00:03:00 +00:00
Pascal Wiesmann 7d778d7bef Translated using Weblate (Alemannic)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/gsw/
2025-10-28 09:23:31 +00:00
JJBlue 21f65e2e27 Backport pull request #15220 from jellyfin/release-10.11.z
Skip extracted files in migration if bad timestamp or no access

Original-merge: a305204cfa

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-10-27 15:43:31 -04:00
theguymadmax 28b0657608 Backport pull request #15217 from jellyfin/release-10.11.z
Normalize paths in database queries

Original-merge: 75f472e6a7

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-10-27 15:43:30 -04:00
crobibero a489942454 Backport pull request #15212 from jellyfin/release-10.11.z
Skip invalid database migration

Original-merge: 2966d27c97

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-10-27 15:43:29 -04:00
Shadowghost 423c2654c0 Backport pull request #15209 from jellyfin/release-10.11.z
Improve symlink handling

Original-merge: e5656af1f2

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-10-27 15:43:27 -04:00
crobibero 4dc826644d Backport pull request #15197 from jellyfin/release-10.11.z
Filter plugins by id instead of name

Original-merge: 5691eee4f1

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-10-27 15:43:26 -04:00
crobibero 0f21222a0c Backport pull request #15196 from jellyfin/release-10.11.z
Skip directory entry when restoring from backup

Original-merge: 0e4031ae52

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-10-27 15:43:25 -04:00
crobibero 570b8b2eb9 Backport pull request #15194 from jellyfin/release-10.11.z
Initialize transcode marker during startup

Original-merge: 81b8b0ca4a

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-10-27 15:43:24 -04:00
Shadowghost 08fd175f5a Backport pull request #15187 from jellyfin/release-10.11.z
Fix pagination and sorting for folders

Original-merge: 7d1824ea27

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-10-27 15:43:23 -04:00
gnattu 511b5d9c53 Backport pull request #15177 from jellyfin/release-10.11.z
Make priority class setting more robust

Original-merge: 70c32a26fa

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-10-27 15:43:22 -04:00
CeruleanRed 6514196e8d Backport pull request #15176 from jellyfin/release-10.11.z
Only save chapters that are within the runtime of the video file

Original-merge: 442af96ed9

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-10-27 15:43:21 -04:00
crobibero ed6cb30762 Backport pull request #15170 from jellyfin/release-10.11.z
Clean up BackupService

Original-merge: ac3fa3c376

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-10-27 15:43:20 -04:00
crobibero 232c0399e2 Backport pull request #15164 from jellyfin/release-10.11.z
Fix XmlOutputFormatter

Original-merge: 2b94bb54aa

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-10-27 15:43:19 -04:00
nyanmisaka dbb015441f Backport pull request #15144 from jellyfin/release-10.11.z
Fix videos with cropping metadata are probed as anamorphic

Original-merge: 175ee12bbc

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-10-27 15:43:18 -04:00
theguymadmax 4c1c160990 Backport pull request #15133 from jellyfin/release-10.11.z
Play selected song first with instant mix

Original-merge: 1520a697ad

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-10-27 15:43:17 -04:00
MBR-0001 0931d6e4de Backport pull request #15126 from jellyfin/release-10.11.z
Fix Has(Imdb/Tmdb/Tvdb)Id checks

Original-merge: 14b3085ff1

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-10-27 15:43:15 -04:00
ivanjx 3f2ebc4179 Backport pull request #15113 from jellyfin/release-10.11.z
Add season number fallback for OMDB and TMDB plugins

Original-merge: 618ec4543e

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-10-27 15:43:14 -04:00
Shadowghost 14e8194581 Backport pull request #15112 from jellyfin/release-10.11.z
Skip extracted files in migration if bad timestamp or no access

Original-merge: 7a1c1cd342

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-10-27 15:43:13 -04:00
theguymadmax 3c4dc16003 Backport pull request #15102 from jellyfin/release-10.11.z
Make season paths case-insensitive

Original-merge: 305b0fdca3

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-10-27 15:43:12 -04:00
Bond-009 54d28d9842 Backport pull request #15098 from jellyfin/release-10.11.z
Lower required tmp dir size to 512MiB

Original-merge: 0a6e8146be

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-10-27 15:43:11 -04:00
theguymadmax adfa520057 Backport pull request #15087 from jellyfin/release-10.11.z
Optimize WhereReferencedItemMultipleTypes filtering

Original-merge: a5bc4524d8

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-10-27 15:43:10 -04:00
theguymadmax 5deb69b23f Backport pull request #15083 from jellyfin/release-10.11.z
Fix LiveTV images not saving to database

Original-merge: d738386fe2

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-10-27 15:43:09 -04:00
nyanmisaka 348b2992d7 Backport pull request #15072 from jellyfin/release-10.11.z
Reject stream copy of HDR10+ video if the client does not support HDR10

Original-merge: a725220c21

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-10-27 15:43:08 -04:00
gnattu 9f8fb6d588 Backport pull request #15055 from jellyfin/release-10.11.z
Log the message more clear when network manager is not ready

Original-merge: a245605152

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-10-27 15:43:07 -04:00
Shadowghost cee16d47cb Backport pull request #15054 from jellyfin/release-10.11.z
Speed-up trickplay migration

Original-merge: ca830d5be7

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-10-27 15:43:06 -04:00
Shadowghost 9e53f46ad2 Backport pull request #15032 from jellyfin/release-10.11.z
Skip invalid keyframe cache data

Original-merge: f4a53209f4

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-10-27 15:43:04 -04:00
Joshua M. Boniface 53dfcae1a6 Merge pull request #15236 from joshuaboniface/codeowners
Update CODEOWNERS to capture bump_version
2025-10-27 09:10:47 -04:00
JPVenson 81f1cc78b2 Add version to StartupUI 2025-10-27 13:01:52 +00:00
kreaxv efd659412f Translated using Weblate (Mongolian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/mn/
2025-10-27 09:41:00 +00:00
Joshua M. Boniface c31ea251c4 Improve handling of .github dir 2025-10-26 22:17:33 -04:00
Joshua M. Boniface 285e7c6c4f Update CODEOWNERS to capture bump_version 2025-10-26 22:07:46 -04:00
Joshua M. Boniface c274336563 Bump version to 10.12.0 (for real this time) 2025-10-26 21:52:03 -04:00
Joshua M. Boniface d5fd5dfe6a Fix bump_version to handle spaced filename 2025-10-26 21:51:41 -04:00
Kevin G 42ddcfa565 Add milliseconds to default console output format
Signed-off-by: Kevin G <kevin@myplaceonline.com>
2025-10-26 10:29:29 -05:00
Bond-009 6fa69f9fe5 Merge pull request #15206 from jellyfin/renovate/ci-deps
Update danielpalme/ReportGenerator-GitHub-Action action to v5.4.18
2025-10-26 14:50:42 +01:00
Bond-009 0b876365a1 Merge pull request #15205 from jellyfin/renovate/z440.atl.core-7.x
Update dependency z440.atl.core to 7.6.0
2025-10-26 14:39:09 +01:00
Battseren Badral cdc8325c7b Translated using Weblate (Mongolian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/mn/
2025-10-25 21:55:13 +00:00
renovate[bot] a6a8e29916 Update danielpalme/ReportGenerator-GitHub-Action action to v5.4.18 2025-10-25 15:32:59 +00:00
renovate[bot] 6fd3847298 Update dependency z440.atl.core to 7.6.0 2025-10-25 15:12:02 +00:00
Bond-009 3ff516a430 Merge pull request #15191 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v4.31.0
2025-10-25 11:23:34 +02:00
Bond-009 d8591840f3 Merge pull request #15192 from jellyfin/renovate/major-github-artifact-actions
Update GitHub Artifact Actions (major)
2025-10-25 11:22:40 +02:00
HanHwanHo c5affbbf71 Translated using Weblate (Korean)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ko/
2025-10-25 07:46:36 +00:00
renovate[bot] 788f090f27 Update GitHub Artifact Actions 2025-10-24 23:59:16 +00:00
renovate[bot] 0e3b6652b3 Update github/codeql-action action to v4.31.0 2025-10-24 23:59:06 +00:00
Kevin G 79061f4635 Change moveToTop in AddItemToPlaylistAsync to 0-based position
Signed-off-by: Kevin G <kevin@myplaceonline.com>
2025-10-23 19:27:34 -05:00
desibooklover d167d59c23 Translated using Weblate (Punjabi)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pa/
2025-10-23 03:50:04 +00:00
desibooklover f58b4860f7 Translated using Weblate (Hindi)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hi/
2025-10-23 03:50:04 +00:00
Kevin G cd9154f110 Add moveToTop option to IPlaylistManager.AddItemToPlaylistAsync
Signed-off-by: Kevin G <kevin@myplaceonline.com>
2025-10-22 22:17:28 -05:00
Grant Alexander 96b7fc0ac0 Translated using Weblate (Spanish (Mexico))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es_MX/
2025-10-21 15:20:51 +00:00
oddife c8ad861590 Translated using Weblate (Marathi)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/mr/
2025-10-20 21:27:58 +00:00
Jellyfin Release Bot 1a1a24cfff Bump version to 10.12.0 2025-10-19 20:45:13 -04:00
Bond-009 ace30afcf8 Merge pull request #15016 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v4.30.9
2025-10-19 11:14:52 +02:00
Niels van Velzen d43db230fa Add back UpdateUserPassword_Empty_RemoveSetPassword test 2025-10-19 09:45:55 +02:00
rimasx fc056b6273 Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/et/
2025-10-19 05:33:11 +00:00
rimasx ac5efb4775 Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/et/
2025-10-18 11:54:27 +00:00
renovate[bot] fefd676adc Update github/codeql-action action to v4.30.9 2025-10-17 15:56:06 +00:00
Bond-009 59c17a663c Merge pull request #15006 from jellyfin/renovate/dotnet-monorepo
Update dependency dotnet-ef to v9.0.10
2025-10-15 17:39:47 +02:00
Bond-009 641551e164 Merge pull request #15007 from jellyfin/renovate/microsoft
Update Microsoft to 9.0.10
2025-10-15 17:39:32 +02:00
renovate[bot] bd543d7ac3 Update Microsoft to 9.0.10 2025-10-15 00:34:53 +00:00
renovate[bot] 545e412259 Update dependency dotnet-ef to v9.0.10 2025-10-15 00:34:44 +00:00
Cody Robibero 7dff92bb82 Use TryAdd instead of Add (#14997) 2025-10-13 22:18:37 +02:00
Cody Robibero b36aab9399 Validate encoder path (#14996) 2025-10-13 14:16:05 -06:00
Erik W 2c7d2d4719 Handle es-419 in TMDb (#14946) 2025-10-13 13:47:16 -06:00
Tim Eisele 5c519270b8 Remove chapters on file change (#14984) 2025-10-13 12:32:41 -06:00
theguymadmax 55047b1183 Fix exception when saving user data to NFO files (#14993) 2025-10-13 10:09:40 -06:00
theguymadmax 794e1361d7 Fix contributing artist query (#14991) 2025-10-13 09:09:09 -06:00
kreaxv 27c9c9c0ed Translated using Weblate (Mongolian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/mn/
2025-10-13 12:42:46 +00:00
rimasx 68636b2390 Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/et/
2025-10-12 18:15:54 +00:00
Joshua M. Boniface 2e6430c4f4 Merge pull request #14965 from KGT1/mapTmdbcol
add xmbc nfo uniqueid type norminalisation
2025-10-11 17:21:32 -04:00
Joshua M. Boniface c88d792963 Merge pull request #14960 from karm235/13697-fix-lufs-detection
Fix LUFS detection deadlock per issue #13697
2025-10-11 17:20:52 -04:00
Joshua M. Boniface 73dbc9e89f Merge pull request #14978 from theguymadmax/fix-playlistfolder
Prevent PlaylistsFolder deletion during library removal
2025-10-11 17:20:40 -04:00
Joshua M. Boniface cf3edd9875 Merge pull request #14971 from theguymadmax/skip-artist-album-persontype
Skip creating Person entities for Artist and AlbumArtist types
2025-10-11 17:20:31 -04:00
Joshua M. Boniface ef0131ad69 Merge pull request #14976 from JPVenson/bugfix/ItemCounterSorting
apply sort on ItemValue query
2025-10-11 17:20:23 -04:00
rimasx 056c318f04 Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/et/
2025-10-11 11:46:41 +00:00
theguymadmax 49c3443b0c Prevent PlaylistsFolder deletion during library removal 2025-10-10 18:34:37 -04:00
Bond-009 e415718fe7 Merge pull request #14975 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v4.30.8
2025-10-10 22:09:46 +02:00
JPVenson 8abcfb2a80 Fix ordering query 2025-10-10 20:08:59 +00:00
Logan Douglas fd6e48603b Merge branch 'jellyfin:master' into master 2025-10-10 12:08:11 -06:00
pokreman06 b09c9655fd Update tests/Jellyfin.Server.Implementations.Tests/SyncPlay/GroupTests.cs
Co-authored-by: Bond-009 <bond.009@outlook.com>
2025-10-10 10:38:36 -06:00
pokreman06 790220ef6b Update tests/Jellyfin.Server.Implementations.Tests/SyncPlay/GroupTests.cs
Co-authored-by: Bond-009 <bond.009@outlook.com>
2025-10-10 10:38:29 -06:00
pokreman06 c08b1a4595 Update Emby.Server.Implementations/SyncPlay/Group.cs
Co-authored-by: Bond-009 <bond.009@outlook.com>
2025-10-10 10:35:46 -06:00
Bond-009 9aadf97958 Merge pull request #14945 from jellyfin/renovate/asynckeyedlock-7.x
Update dependency AsyncKeyedLock to 7.1.7
2025-10-10 18:10:38 +02:00
renovate[bot] 9e57121171 Update github/codeql-action action to v4.30.8 2025-10-10 16:02:22 +00:00
Bond-009 b471811920 Merge pull request #14959 from jellyfin/renovate/github-codeql-action-4.x
Update github/codeql-action action to v4
2025-10-10 18:01:21 +02:00
renovate[bot] 3cb99add76 Update github/codeql-action action to v4 2025-10-10 15:51:16 +00:00
Bond-009 001f1c4377 Merge pull request #14954 from jellyfin/renovate/ci-deps
Update CI dependencies
2025-10-10 17:50:15 +02:00
Bond-009 9ef3706b44 Merge pull request #14969 from theguymadmax/fix-artist-external-id
Fix artist external Url
2025-10-10 17:49:39 +02:00
rimasx 864d6d0b8f Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/et/
2025-10-10 10:58:43 +00:00
faquino a565e4896e Translated using Weblate (Galician)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/gl/
2025-10-10 10:58:43 +00:00
JPVenson ceef9143ad cleanup 2025-10-10 09:18:05 +00:00
JPVenson a7a92509c7 fixes #14952 apply sort on ItemValue query 2025-10-10 09:10:21 +00:00
taham e876e784da Translated using Weblate (Urdu)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ur/
2025-10-10 05:25:11 +00:00
taham 9b7d5edc86 Translated using Weblate (Urdu (Pakistan))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ur_PK/
2025-10-10 05:25:10 +00:00
JPVenson f01cddf273 Add migration attribute 2025-10-09 19:45:43 +00:00
JPVenson 0d4bd0495b Add migration to remove artist and album artists from database 2025-10-09 19:44:07 +00:00
theguymadmax 6f9c4dea6e Skip creating Person entities for Artist and AlbumArtist types 2025-10-09 11:00:36 -05:00
rimasx 8c51920911 Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/et/
2025-10-09 12:39:38 +00:00
faquino 8f2fd65810 Translated using Weblate (Galician)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/gl/
2025-10-09 12:39:38 +00:00
rimasx 953659980f Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/et/
2025-10-09 10:47:27 +00:00
renovate[bot] 8ab1fecb70 Update CI dependencies 2025-10-09 10:20:29 +00:00
theguymadmax f5d42ee180 Fix artist external Url 2025-10-09 01:14:49 -05:00
Christopher Young 622b60064d Merge branch 'master' of https://github.com/JadedRain/jellyfin 2025-10-08 12:27:51 -06:00
Christopher Young 91b2b7fc3d added tests 2025-10-08 12:27:46 -06:00
KGT1 e28d547006 add test for new uniqueid nfo key normalisation 2025-10-08 15:32:30 +00:00
KGT1 b3b9f74014 also apply provider normalisation on uniqueid type tag 2025-10-08 15:23:50 +00:00
theguymadmax 07d31c6ba5 Improve performance on people query (#14963) 2025-10-08 09:23:20 -06:00
KGT1 a9198e865e map tmdbcol nfo property to TmdbCollection 2025-10-08 14:33:50 +00:00
theguymadmax 79ff0b0b00 Fix collections folder duplication (#14925) 2025-10-08 08:32:00 -06:00
theguymadmax 2b45a984dd Clean up missing image references (#14962) 2025-10-08 08:23:12 -06:00
Milo Ivir 739642b330 Translated using Weblate (Croatian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hr/
2025-10-07 19:45:38 +00:00
karm235 6097045d71 cleanup 2025-10-07 12:20:08 -05:00
karm235 51e20a14c2 Fix LUFS detection deadlock on albums with verbose output 2025-10-07 12:11:02 -05:00
rimasx eb0d05cf1e Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/et/
2025-10-06 08:38:24 +00:00
Bond-009 d3d5915f31 Truncate password reset file on open for writing (#14948) 2025-10-05 11:24:12 -06:00
Niels van Velzen 0fb6d930e1 Deprecate HasPassword property on UserDto 2025-10-05 11:10:36 +02:00
Bond-009 288640a5d0 Merge pull request #14940 from jellyfin/renovate/ci-deps
Update actions/stale action to v10.1.0
2025-10-04 21:15:57 +02:00
Cody Robibero ff0a1b999f Handle xx as TMDb no language for backdrops (#14941) 2025-10-04 21:04:35 +02:00
renovate[bot] da0fe7455e Update dependency AsyncKeyedLock to 7.1.7 2025-10-04 14:59:22 +00:00
Thomas Jones bf69f9d8a8 Validate wizard-created libraries immediately instead of only doing it after a library refresh was triggered (#14942)
Co-authored-by: Derpipose <90276123+Derpipose@users.noreply.github.com>
2025-10-04 08:58:51 -06:00
Nyanmisaka badf22fcc2 Limit decoder thread count on AMD AMF to save VRAM (#14943) 2025-10-04 08:04:25 -06:00
renovate[bot] b59e9f90f0 Update actions/stale action to v10.1.0 2025-10-03 22:04:26 +00:00
renovate[bot] 056b92dbd5 Update dependency Microsoft.NET.Test.Sdk to v18 (#14930)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-02 17:34:06 -06:00
renovate[bot] ba80f5e416 Update peter-evans/create-or-update-comment action to v5 (#14933)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-02 17:33:54 -06:00
lostb1t 97ec4c1da2 fix: get total count after grouping (#14931) 2025-10-02 17:33:50 -06:00
renovate[bot] 894ba1a410 Update github/codeql-action action to v3.30.6 (#14932)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-02 17:33:37 -06:00
gnattu 0a0aaefad5 Fix mka-style tagging key (#14936) 2025-10-02 17:33:31 -06:00
JPVenson c8b97bf533 Readd wildcard search (#14934) 2025-10-02 17:33:01 -06:00
Bond-009 cfa4e357ea Merge pull request #14923 from jellyfin/renovate/peter-evans-find-comment-4.x
Update peter-evans/find-comment action to v4
2025-10-02 20:50:59 +02:00
pokreman06 0b4854c5ef Merge branch 'jellyfin:master' into master 2025-10-02 11:07:05 -06:00
theguymadmax 0f42aa892e Fix BoxSet sorting (#14919)
Co-authored-by: Cody Robibero <cody@robibe.ro>
2025-10-01 21:10:31 -06:00
JPVenson cce6bf27e0 Add check for processing recursive data structures (#14897) 2025-10-01 17:26:56 -06:00
theguymadmax d6cebf1e67 Add tag filtering and random sorting to GetSimilarItems (#14918) 2025-10-01 17:26:48 -06:00
theguymadmax c053a6cd78 Fix parental ratings logic (#14909) 2025-10-01 17:26:30 -06:00
renovate[bot] d8c62420bf Update peter-evans/find-comment action to v4 2025-10-01 22:51:24 +00:00
Christopher Young d6a1c8413c fixed logic in HasAccessToQueue. If we receive a null response from IsVisibleStandalone then it should be false 2025-09-30 12:27:25 -06:00
Joshua M. Boniface d483c3efe6 Merge pull request #14887 from JPVenson/bugfix/fixMigrationReferences
Add explicit reference check to migration
2025-09-28 12:44:09 -04:00
Joshua M. Boniface 275c1a3cc1 Merge pull request #14883 from crobibero/code-analysis
Only include custom code analysis for debug builds
2025-09-28 12:34:21 -04:00
Joshua M. Boniface 4942b2c15f Merge pull request #14890 from nielsvanvelzen/destructive-migration
Fix AddProperParentChildRelationBaseItemWithCascade migration deleting all items
2025-09-28 12:26:40 -04:00
Niels van Velzen 3fc71293b4 Fix AddProperParentChildRelationBaseItemWithCascade migration deleting all items 2025-09-28 13:14:10 +02:00
JPVenson 8ea9bece03 Add explicit reference check to migration 2025-09-28 08:46:31 +00:00
Nicolas N baa7f5f0b0 Translated using Weblate (Haitian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ht/
2025-09-28 06:47:40 +00:00
Cody Robibero b9c96f3d2c Revert "Add Jellyfin.CodeAnalysis project to abi diff (#14875)"
This reverts commit 526ec83305.
2025-09-27 16:41:01 -06:00
Cody Robibero 08f9b932ac Only include CodeAnalysis in debug mode 2025-09-27 16:39:40 -06:00
daswesen123 e6cd73df03 Translated using Weblate (English (Pirate))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/en@pirate/
2025-09-27 22:14:14 +00:00
Corentin Malbet 71ebb1f456 Fixing the UFID field value giving a warning and not being correctly processed (#14851) 2025-09-26 14:24:59 -06:00
Tim Eisele 9c298c52f5 Expose ExtractAllExtractableSubtitles (#14876) 2025-09-26 13:45:01 -06:00
Niels van Velzen 3e8db40901 Merge pull request #14874 from jellyfin/renovate/polly-monorepo
Update dependency Polly to 8.6.4
2025-09-26 21:39:47 +02:00
Niels van Velzen f9ead9615c Merge pull request #14855 from jellyfin/renovate/ci-deps
Update CI dependencies
2025-09-26 21:39:16 +02:00
Niels van Velzen 93af2d6f67 Merge pull request #14873 from theguymadmax/use-listorder
Restore NFO/import ordering by using ListOrder instead of SortOrder
2025-09-26 21:38:29 +02:00
renovate[bot] 027c91949d Update CI dependencies 2025-09-26 17:50:59 +00:00
JPVenson 526ec83305 Add Jellyfin.CodeAnalysis project to abi diff (#14875) 2025-09-26 11:49:51 -06:00
renovate[bot] dfcacce1b0 Update dependency Polly to 8.6.4 2025-09-26 15:13:09 +00:00
theguymadmax 2a54669a8a Restore NFO/import ordering by using ListOrder instead of SortOrder 2025-09-26 10:49:38 -04:00
JPVenson 54d48fa446 Fix people deduplication lookup (#14864) 2025-09-25 19:27:38 -06:00
JPVenson 1736a566cc Fixes FK on unconnected base items (#14863) 2025-09-25 19:27:17 -06:00
gnattu 04ab362e59 Revert "Update skiasharp monorepo (#14849)" (#14862) 2025-09-25 16:05:04 +02:00
JPVenson e282b05b8f fixes #14859 Add Check for ItemValues (#14860) 2025-09-25 08:02:20 -06:00
JPVenson 2aa39226c6 Apply filter server side (#14856) 2025-09-24 18:15:10 -06:00
theguymadmax 60fbd39bb9 Fix people sort order (#14852) 2025-09-24 17:37:07 -06:00
JPVenson 740b9924a0 Include ListOrder on Import (#14854) 2025-09-24 15:22:05 -06:00
JPVenson 5a6d9180fe Add People Dedup and multiple progress fixes (#14848) 2025-09-24 15:20:30 -06:00
theguymadmax 897975fc57 Fix collections one-off (#14814) 2025-09-24 15:19:15 -06:00
Bond-009 7dab62616f Merge pull request #14827 from tjwalkr3/warnings-3
Fix CA1051 warning, Change public field to auto-property
2025-09-24 19:32:24 +02:00
renovate[bot] f1bd9a40d5 Update skiasharp monorepo (#14849)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-24 08:28:46 +02:00
renovate[bot] 469e6e1bc8 Update danielpalme/ReportGenerator-GitHub-Action action to v5.4.15 (#14830)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-23 19:52:31 -06:00
JPVenson 38f5f8008a Fix ordering where exists (#14843) 2025-09-23 19:51:44 -06:00
Thomas Jones a014cb538e Fixed 3 different CA1051 warnings. Changed them to auto properties and rearranged the members to fit styling rules.
Co-authored-by: Derpipose <90276123+Derpipose@users.noreply.github.com>
2025-09-23 14:18:15 -06:00
Thomas Jones 378ba937b6 Added in pragma warning disable for CA1815 warning.
Co-authored-by: Derpipose <90276123+Derpipose@users.noreply.github.com>
2025-09-23 13:17:52 -06:00
Cody Engel 2508e8349b update summary docs
Signed-off-by: Cody Engel <cengel815@gmail.com>
2025-09-23 08:22:00 -06:00
JPVenson 7bb68d8610 Fix Image loading (#14842) 2025-09-23 07:02:30 -06:00
Cody Robibero 27047c35a4 Add schema to 503 headers (#14840) 2025-09-23 07:00:34 -06:00
Looooke 42003ca9d2 Translated using Weblate (Alemannic)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/gsw/
2025-09-22 22:16:10 +00:00
JPVenson 98f5e21bb8 Fix groupings not applied (#14826) 2025-09-22 15:31:21 -06:00
Mikal S. 162985bb23 fix: add back missing behavior for HasAnyProviderId (#14831) 2025-09-22 09:56:41 -06:00
Jan Zachar 0d2c551cce Translated using Weblate (Belarusian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/be/
2025-09-22 12:04:53 +00:00
Janniry Belen 717e7cbd77 Translated using Weblate (Spanish (Dominican Republic))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es_DO/
2025-09-22 04:08:11 +00:00
Thomas Jones 58f9bdcf5c Added ourselves to CONTRIBUTORS.md
Co-authored-by: Derpipose <90276123+Derpipose@users.noreply.github.com>
2025-09-20 23:58:49 -06:00
Thomas Jones 2a499aaa95 Fix CA1051 warnings in EncodingJobInfo.cs
Convert public fields to auto-properties and fix member ordering

Co-authored-by: Derpipose <90276123+Derpipose@users.noreply.github.com>
2025-09-20 23:31:58 -06:00
Cody Engel bd9a44ce7d remove explicit ‘-‘ support in series name 2025-09-20 18:00:44 -06:00
Cody Engel da31d0c6a6 support series that are numeric only
updates SeriesResolver to handle series names that only contain numbers such as 1923.
2025-09-20 14:04:00 -06:00
evan314159 4246825239 Attach before updating/deleting to avoid DbUpdateConcurrencyException (#14746) 2025-09-20 07:23:04 -06:00
renovate[bot] 68810c690b Update dependency z440.atl.core to 7.5.0 (#14793) 2025-09-20 07:22:10 -06:00
Tim Eisele b73ea1b99d Skip removed images (#14823) 2025-09-20 07:20:21 -06:00
JPVenson 59f77c24c9 Revert limit hack (#14820) 2025-09-20 07:19:26 -06:00
JPVenson 0949212993 Make migration handle parent cleanup (#14817)
* Make migration handle parent cleanup

* Remove speed improvement

* Update MigrateLibraryDb.cs
2025-09-19 13:17:31 -06:00
renovate[bot] 248aac9a3a Update dependency Svg.Skia to 3.2.1 (#14815)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-19 11:48:16 -06:00
JPVenson a1b85a63e7 Fix root folder not being saved to Db if nessesary (#14819)
* Fix root folder not being saved to Db if nessesary

* Always update folder to Db
2025-09-19 11:47:41 -06:00
Kendall Garner 091cb1c34a Fix playlist move from smaller to larger index (#14794) 2025-09-18 08:37:31 -06:00
JPVenson eaf33f01e1 #14751 Only migrate providerids that match assumption (#14810) 2025-09-17 18:33:23 -06:00
renovate[bot] db2dbaa62b Update Microsoft to 4.14.0 (#14808)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-16 13:08:28 -06:00
renovate[bot] 1a7df6daf7 Update dependency Newtonsoft.Json to 13.0.4 (#14807)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-16 13:08:24 -06:00
JPVenson a0b3e2b071 Optimize internal querying of UserData, other fixes (#14795) 2025-09-16 13:08:04 -06:00
evan314159 2618a5fba2 Fix sync disposal of async-created IAsyncDisposable objects (#14755) 2025-09-16 11:14:52 +02:00
Bond-009 2ee887a502 Merge pull request #14800 from jellyfin/renovate/tmdblib-2.x
Update dependency TMDbLib to 2.3.0
2025-09-16 11:13:01 +02:00
Bond-009 a17e157d44 Merge pull request #14799 from Shadowghost/add-ec3
Add ec3 to audio file extensions
2025-09-16 11:12:41 +02:00
renovate[bot] 6b6745b7fe Update dependency TMDbLib to 2.3.0 2025-09-15 02:51:21 +00:00
Shadowghost 594f9e4f6b Add ec3 to audio file extensions 2025-09-14 23:23:04 +02:00
Bond-009 4cda5f5ff2 Merge pull request #14790 from jellyfin/renovate/ci-deps
Update danielpalme/ReportGenerator-GitHub-Action action to v5.4.13
2025-09-14 21:39:20 +02:00
JPVenson 24410d8a2e Reenable common PRAGMA setters (#14791) 2025-09-14 11:24:35 -06:00
Cody Robibero 4d36bd635d Revert IsPlayed optimization, pass UserItemData to IsPlayed when available (#14786) 2025-09-14 11:18:21 -06:00
renovate[bot] ef65534071 Update danielpalme/ReportGenerator-GitHub-Action action to v5.4.13 2025-09-12 23:56:20 +00:00
KGT1 7c6cedd90a Allow non-admin users to subscribe to their own Sessions (#13767) 2025-09-12 14:15:00 -06:00
theguymadmax 96590eea85 Fix duplicate media entries (#14404) 2025-09-12 13:58:42 -06:00
Bond-009 6796b3435d Avoid constant arrays as arguments (#14784) 2025-09-12 13:58:28 -06:00
Bond-009 8776a447d1 Various cleanups (#14785) 2025-09-12 13:58:23 -06:00
JPVenson c02a24e32a Fix several Stackoverflows (#14783) 2025-09-12 13:58:16 -06:00
Bond-009 deee04ae38 Add fast path to check for empty ignore files (#14782) 2025-09-12 13:58:02 -06:00
Tim Eisele 580db0c1d2 Never replace BoxSet LinkedChildren on update (#14723) 2025-09-12 13:57:55 -06:00
Alex Collado 8fcc2496d9 Change Spanish order in iso6392.txt to favor Castillian (#14777) 2025-09-12 13:57:48 -06:00
JPVenson f0e60a7ff3 Improve optimistic locking behavior (#14779) 2025-09-12 13:57:40 -06:00
JPVenson a99e67544a Reenable pooling (#14778) 2025-09-12 13:57:33 -06:00
nenadsuperzmaj bca6400bc3 Translated using Weblate (Serbian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/sr/
2025-09-12 18:09:53 +00:00
theguymadmax 986a509955 Add 1-second tolerance to resume playback completion check (#14774) 2025-09-11 15:24:23 -06:00
theguymadmax da19f02f7b Sort trailers before teasers (#14715) 2025-09-11 15:23:41 -06:00
Bond-009 3fad5eb069 Make private Emby.Naming.Video.StackResolver.StackMetadata sealed to silence compiler warning (#14764) 2025-09-11 10:18:47 +02:00
renovate[bot] 9923a51aed Update dependency dotnet-ef to v9.0.9 (#14768)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-11 10:18:20 +02:00
renovate[bot] 585e9a2fe2 Update Microsoft to 9.0.9 (#14769)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-11 10:18:06 +02:00
renovate[bot] 8e81737dba Update github/codeql-action action to v3.30.3 (#14767)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-11 10:09:59 +02:00
Tim Eisele e4e578b37a Don't use ffprobe frame options on audio probe (#14773) 2025-09-10 20:32:14 -06:00
Looooke 387bc0c8eb Translated using Weblate (Alemannic)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/gsw/
2025-09-09 23:20:42 +00:00
Varoon Pazhyanur cbb569a277 Make private Emby.Naming.Video.StackResolver.StackMetadata sealed to silence compiler warning 2025-09-08 21:21:43 -04:00
Adrián HM 1fa63b797b Translated using Weblate (Spanish (Mexico))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es_MX/
2025-09-08 22:32:30 +00:00
Magnus Antonsen aa3a7c88a4 Translated using Weblate (Norwegian Bokmål)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nb_NO/
2025-09-08 15:02:04 +00:00
evan314159 0a2cf69a55 Additional debug logging for SQLite connections (#14753) 2025-09-07 14:40:27 -06:00
theguymadmax 0845b0c258 Skip non-media folders in movie resolver (#14724)
* Skip non-media folders in movie resolver

* Ignorepatterns first
2025-09-07 13:02:52 +02:00
theguymadmax e043f93a72 Preserve 3D format on metadata refresh (#14742) 2025-09-06 11:38:00 -06:00
Arty 6ac2d707cb Translated using Weblate (Russian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ru/
2025-09-06 04:51:32 +00:00
JPVenson 20f7ddbf8f Refactor Display preference manager (#14056) 2025-09-05 14:39:15 -06:00
renovate[bot] 4849486fa0 Update github/codeql-action action to v3.30.1 (#14748)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-05 17:13:46 +02:00
renovate[bot] 4ccd3da77a Update actions/stale action to v10 (#14741)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-05 11:10:59 +02:00
renovate[bot] bc28dc11c0 Update actions/setup-python action to v6 (#14740)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-05 11:10:36 +02:00
theguymadmax d9eaeed61d Fix latest items grouping by collection type (#14736)
* Fix latest items grouping by collection type

* Update Emby.Server.Implementations/Library/UserViewManager.cs

Co-authored-by: Bond-009 <bond.009@outlook.com>

---------

Co-authored-by: Bond-009 <bond.009@outlook.com>
2025-09-05 11:05:37 +02:00
Bond-009 c7320dc189 Add more robust error handling for AudioNormalizationTask (#14728) 2025-09-03 21:12:24 -06:00
Shane Powell 71048917dd AudioNormalizationTask db progress saving (#14550) 2025-09-03 21:11:58 -06:00
renovate[bot] 11eab1b663 Update actions/setup-dotnet action to v5 (#14738)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-03 21:10:21 -06:00
Md Ashikur Rahman a17a0495d8 Translated using Weblate (Bengali)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/bn/
2025-09-03 20:51:22 +00:00
renovate[bot] b3e57a5f7d Update github/codeql-action action to v3.30.0 (#14730)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-02 18:06:23 -06:00
renovate[bot] 65827cce6f Update dependency NEbml to 1.1.0.5 (#14732)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-02 10:05:05 +02:00
Milo Ivir b5df0d2a34 Translated using Weblate (Croatian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hr/
2025-09-02 06:43:07 +00:00
ShalokShalom 339a31f0a5 Update .Net Core to .Net (#14718) 2025-09-01 11:45:24 -06:00
evan314159 a0d4ae1974 Correct Album Artists merge logic (#14655)
* Correct Album Artists merge logic and Artist equality checks

Correct Album Artists merge logic in MetadataService that causes empty
metadata sources to overwrite populated Album Artists arrays. This impacted
People-to-BaseItem relationships and caused orphaned records in Peoples.

Correct equality checks to be case-sensitive so Jelly metadata exactly
matches file metadata.

* use StringComparer.Ordinal

---------

Co-authored-by: Evan <evan@MacBook-Pro.local>
2025-09-01 13:22:55 +02:00
renovate[bot] d65b18a7f3 Update dependency Polly to 8.6.3 (#14690)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-27 17:40:51 -06:00
renovate[bot] cc93b44947 Update dependency Svg.Skia to 3.0.6 (#14691)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-27 17:40:36 -06:00
evan314159 e753adac2c fix ProbeProvider.HasChanged: if file date changed (#14674) 2025-08-27 17:34:51 -06:00
Marc Brooks 0b465842c8 Normalizer cleanup (#14711) 2025-08-27 17:34:00 -06:00
Cody Robibero da3f3b09d9 Use existing userData (#14703) 2025-08-26 16:09:17 -06:00
loop 2b6febc8da Fix: Add 'Kairon; IRSE!' to artist whitelist 2025-08-25 10:41:21 +02:00
Bond-009 7a9beb3745 Merge pull request #14701 from jellyfin/renovate/fscheck.xunit-3.x
Update dependency FsCheck.Xunit to 3.3.1
2025-08-24 21:26:46 +02:00
renovate[bot] c7ee07b14a Update dependency FsCheck.Xunit to 3.3.1 2025-08-24 18:51:40 +00:00
Lucas d8dfbc26f6 Translated using Weblate (Spanish (Argentina))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es_AR/
2025-08-23 16:48:55 +00:00
Shiva Prasad 88e0d35ed7 Translated using Weblate (Telugu)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/te/
2025-08-23 09:57:19 +00:00
evan314159 1eadb07a12 Fix GetSimilarItems to exclude the searched for item Id (#14686) 2025-08-22 19:00:29 -06:00
Gjelbrim Haskaj 26d9633fed Translated using Weblate (Albanian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/sq/
2025-08-23 00:15:35 +00:00
spurdl 19aadd934b Translated using Weblate (Finnish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fi/
2025-08-22 20:57:15 +00:00
Bond-009 ce28374d40 Run background ffmpeg tasks as ProcessPriorityClass.BelowNormal (#14651)
Follow TrickPlay example of running other background ffmpeg tasks as ProcessPriorityClass.BelowNormal:

- Keyframe extraction
- Media info probing during library scans
- Audio normalization
- Image extraction

Co-authored-by: Evan <evan@MacBook-Pro.local>
2025-08-22 10:08:29 +02:00
evan314159 7aa1c46447 Merge pull request #14653 from evan314159/coremigration
Delay initialization of singleton services during migration CoreInitialisation stage
2025-08-22 10:06:39 +02:00
Bond-009 ffb7753f8d Merge pull request #14684 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v3.29.11
2025-08-22 10:04:41 +02:00
renovate[bot] 14884f2628 Update github/codeql-action action to v3.29.11 2025-08-21 20:57:46 +00:00
intelligentdonut 41188ff054 Translated using Weblate (English (Pirate))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/en@pirate/
2025-08-19 17:42:50 +00:00
Bond-009 cb6e38d830 Merge pull request #14670 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v3.29.10
2025-08-19 17:16:37 +02:00
renovate[bot] 4ba34709d6 Update github/codeql-action action to v3.29.10 2025-08-18 16:34:37 +00:00
Gene 28b8d3ee29 fix: correct anamorphic video detection (#14640) (#14648) 2025-08-15 18:52:43 -06:00
MrPlow 9eaca73888 Translated using Weblate (German)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/de/
2025-08-15 16:24:00 +00:00
Evan 29e17b6bc0 Run background ffmpeg tasks as ProcessPriorityClass.BelowNormal
Follow TrickPlay example of running other background ffmpeg tasks as ProcessPriorityClass.BelowNormal:

- Keyframe extraction
- Media info probing during library scans
- Audio normalization
- Image extraction
2025-08-15 07:18:44 +08:00
Yago Raña Gayoso 84cde7383f Translated using Weblate (Galician)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/gl/
2025-08-14 18:32:52 +00:00
Joshua M. Boniface a2c0799489 Merge commit from fork
Remove server side processing for profile picture and splash screen
2025-08-13 18:08:43 -04:00
evan314159 ad133eb6b9 Fix AlbumArtistIds filter to use correct ItemValueType (#14641) 2025-08-13 05:52:54 -06:00
Alex Collado 50180adc53 Change Spanish; Latin code acording to BCP 47 specification (#14639) 2025-08-13 07:33:58 +02:00
Cody Robibero bd94ca3071 Merge pull request #14634 from crobibero/itemname-counts 2025-08-12 20:20:54 -06:00
Bond-009 869b4f8bbf Merge pull request #14636 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v3.29.9
2025-08-12 23:22:55 +02:00
renovate[bot] a4d856360b Update github/codeql-action action to v3.29.9 2025-08-12 15:49:37 +00:00
Cody Robibero beca405ad4 Refactor to pull item counts in a single query 2025-08-11 21:06:04 -06:00
renovate[bot] c0be325b89 Update actions/checkout action to v5 (#14631)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-11 13:06:47 -06:00
renovate[bot] dea500b26b Update dependency UTF.Unknown to 2.6.0 (#14599)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Bond_009 <bond.009@outlook.com>
2025-08-11 13:06:24 -06:00
evan314159 47634e731a Refactor query from EXISTS to JOIN to avoid API timeouts with large libraries (#14557) 2025-08-11 13:05:13 -06:00
Bond-009 cd1d11366e Merge pull request #14615 from jellyfin/renovate/z440.atl.core-7.x
Update dependency z440.atl.core to 7.3.0
2025-08-11 18:25:32 +02:00
Bond-009 76dfaead8b Merge pull request #14612 from jellyfin/renovate/ci-deps
Update CI dependencies
2025-08-11 18:06:01 +02:00
Evan 5eef85f027 move new TaggedItemCounts to its own file 2025-08-11 20:49:06 +08:00
renovate[bot] e6a7530ced Update CI dependencies 2025-08-11 11:22:48 +00:00
renovate[bot] 00be664b9e Update dependency z440.atl.core to 7.3.0 2025-08-10 15:15:27 +00:00
Thunderstrike116 e1d0f7d1e5 Translated using Weblate (Greek)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/el/
2025-08-10 13:57:29 +00:00
Evan 0a4ff3f3c0 Fix GetBaseItemDto to return related item counts via SQL count
For API call /Items/{item id} GetBaseItemDto will return the counts of related items e.g. artists, albums, songs.  GetBaseItemDto currently does this by calling GetTaggedItems which retrieves the objects into memory to count them.  Replace with SQL count.

Fixes:
This should be an improvement for any large libraries, but especially large music libraries.  Example:

Request Library -> Genres -> any very popular genre in your large library, e.g. Classical
Number of albums = 1552, songs = 23515, ...

- Before change: Try to retrieve 1552 albums, 23515 songs, ... in memory, API never returns, database on fire
- After change: API returns in 367ms and Genre view opens with 200 albums in 2 seconds

I verified the numbers returned are correct but note that there is a bug somewhere else in Jellyfin that is setting TopParentId to NULL for a large portion of my MusicArtists, which causes them to not be counted by the existing GetCount().  This is not related to this change, also happens with the existing code, and does not seem to affect the Web UI.

Includes Cory's changes in:
- https://github.com/jellyfin/jellyfin/pull/14610#issuecomment-3172211468
- https://github.com/jellyfin/jellyfin/pull/14610#issuecomment-3172239154
2025-08-10 18:02:17 +08:00
NarohC 21f214b1a6 Translated using Weblate (Spanish (Mexico))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es_MX/
2025-08-10 07:38:46 +00:00
Tim Eisele 0650666497 Always save images (#14600) 2025-08-09 08:24:26 -06:00
Bond-009 877899dcc2 Merge pull request #14583 from jellyfin/renovate/dotnet-monorepo
Update dependency dotnet-ef to 9.0.8
2025-08-08 19:41:37 +02:00
Bond-009 bf2f8ec633 Merge pull request #14584 from jellyfin/renovate/microsoft
Update Microsoft to 9.0.8
2025-08-08 19:41:16 +02:00
Bond-009 2eff03b03e Merge pull request #14606 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v3.29.8
2025-08-08 19:26:18 +02:00
renovate[bot] 103932e4fb Update github/codeql-action action to v3.29.8 2025-08-08 14:31:59 +00:00
Niels van Velzen 2b94b3b5f6 Merge pull request #14597 from jellyfin/renovate/svg.skia-3.x
Update dependency Svg.Skia to 3.0.5
2025-08-07 22:05:37 +02:00
Niels van Velzen 64032e8656 Merge pull request #14604 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v3.29.6
2025-08-07 22:04:24 +02:00
renovate[bot] 329ce8d4c2 Update Microsoft to 9.0.8 2025-08-07 19:51:21 +00:00
renovate[bot] 2a7c924904 Update github/codeql-action action to v3.29.6 2025-08-07 19:51:15 +00:00
renovate[bot] 72664a68bc Update dependency Svg.Skia to 3.0.5 2025-08-07 19:51:12 +00:00
renovate[bot] 3ec123b616 Update dependency dotnet-ef to 9.0.8 2025-08-07 19:51:05 +00:00
Niels van Velzen 376220661b Merge pull request #14593 from Bond-009/revert
Revert "Merge pull request #13604 from Jxiced/master"
2025-08-07 21:49:59 +02:00
Lotine Guille 9e88121647 Translated using Weblate (English (Pirate))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/en@pirate/
2025-08-07 01:15:12 +00:00
Bond_009 c7c7b30d28 Revert "Merge pull request #13604 from Jxiced/master"
This reverts commit ce78af2ed4, reversing
changes made to db7465e83d.
2025-08-06 15:49:40 +02:00
Bond-009 601ce4c3b1 Merge pull request #14590 from jellyfin/renovate/major-github-artifact-actions
Update actions/download-artifact action to v5
2025-08-06 15:45:12 +02:00
Nick fcc7f53e81 Translated using Weblate (Uzbek)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/uz/
2025-08-06 05:11:07 +00:00
newton181 e3acf08acc Translated using Weblate (Spanish (Latin America))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es_419/
2025-08-06 05:11:07 +00:00
renovate[bot] c60139a32c Update actions/download-artifact action to v5 2025-08-05 22:10:49 +00:00
Niels van Velzen 6d4efe6523 Translated using Weblate (Norwegian Nynorsk)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nn/
2025-08-05 05:28:20 +00:00
Erick Marx 43a955dded Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt/
2025-08-04 13:27:28 +00:00
Joshua M. Boniface 5cae44fdf7 Merge pull request #12718 from IceStormNG/extract-mks-subtitles
Extract subtitles of MKS aux files if they're extractable.
2025-08-03 17:31:13 -04:00
Joshua M. Boniface c3cb5fd2f9 Merge pull request #14021 from sususu98/enhancement/strmSeek
Enhanced HTTP Range request support for. strm file
2025-08-03 17:30:45 -04:00
Joshua M. Boniface 1262ac31dc Merge pull request #14410 from dyphire/language
Further refinement of BCP 47 language labeling support
2025-08-03 17:29:40 -04:00
Joshua M. Boniface 0f5bb5cf76 Merge pull request #14540 from TokerX/issue-8641
Improve extra rule resolution and file handling
2025-08-03 17:29:04 -04:00
Joshua M. Boniface ce78af2ed4 Merge pull request #13604 from Jxiced/master
Prevent whitespaces in username during wizard setup
2025-08-03 17:27:50 -04:00
Joshua M. Boniface 4b6fb6c4bb Merge branch 'master' into master 2025-08-03 17:27:17 -04:00
Niels van Velzen db7465e83d Merge pull request #14567 from Shadowghost/skip-image-failure
Don't fail image saving on missing BaseItem
2025-08-03 18:47:50 +02:00
Shadowghost 803e87ca5f Don't fail image saving on missing BaseItem 2025-08-02 22:10:39 +02:00
Bond-009 9e36fa4263 Merge pull request #14553 from nyanmisaka/fix-fmp4-ignore-audio-delay
Add extra movflags to fMP4 to take initial audio delay into account
2025-08-01 10:31:00 +02:00
Bond-009 a52a230778 Merge pull request #14467 from jkhsjdhjs/keyframe-only-trickplay-extraction-fallback
Add fallback for keyframe-only trickplay extraction
2025-08-01 10:30:24 +02:00
Niels van Velzen b00e381109 Merge pull request #14554 from JPVenson/feature/FixIsFolderMigration
Also migrate IsFolder
2025-07-31 16:07:48 +02:00
Hestadgard b8fb8bd608 Translated using Weblate (Norwegian Nynorsk)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nn/
2025-07-31 07:52:58 +00:00
nomener 34c9adef80 Translated using Weblate (German)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/de/
2025-07-31 07:25:36 +00:00
JPVenson c8d2f43660 Add logging 2025-07-30 20:14:24 +00:00
JPVenson ef733c5ace use guid instead 2025-07-30 20:10:26 +00:00
JPVenson a1eb04dc0b Add full migration for IsFolder flag 2025-07-30 19:58:56 +00:00
JPVenson 711e649e35 Also migrate IsFolder 2025-07-30 19:41:34 +00:00
Hestadgard 1d408a1503 Translated using Weblate (Norwegian Nynorsk)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nn/
2025-07-30 17:29:30 +00:00
Hestadgard 6391dd9570 Translated using Weblate (Norwegian Bokmål)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nb_NO/
2025-07-30 17:29:29 +00:00
dyphire 2007815fa6 Further refinement of BCP 47 language labeling support 2025-07-30 22:15:37 +08:00
nyanmisaka a5b4eca804 Add extra movflags to fMP4 to take initial audio delay into account
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2025-07-30 18:00:14 +08:00
Bond-009 76d498ac9d Merge pull request #14530 from jellyfin/renovate/ci-deps
Update CI dependencies
2025-07-30 10:55:40 +02:00
dikson804 90b4345cfd Translated using Weblate (Chinese (Traditional Han script, Hong Kong))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant_HK/
2025-07-30 05:11:20 +00:00
renovate[bot] 317192c23d Update CI dependencies 2025-07-30 03:59:51 +00:00
Ghouri dcb12a73fb Translated using Weblate (Norwegian Nynorsk)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nn/
2025-07-29 08:13:35 +00:00
Hossain Rizbi b15abddfd7 Translated using Weblate (Bengali)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/bn/
2025-07-28 21:19:19 +00:00
Hossain Rizbi cfde5af3b0 Translated using Weblate (Bengali)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/bn/
2025-07-28 20:57:07 +00:00
Troj@ 26a6cfaf65 Translated using Weblate (Belarusian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/be/
2025-07-28 16:45:43 +00:00
theguymadmax 8a8018f0de Preserve interpunct (·) (#14543) 2025-07-27 20:09:50 -06:00
evan314159 6f49782b7b fix file modification date comparisons (#14503) 2025-07-27 20:08:06 -06:00
theguymadmax 536437bbe3 Fix allow and block queries (#14482) 2025-07-27 19:28:04 -06:00
Shane Powell ba54cda774 Add progress reporting to AudioNormalizationTask. (#14306) 2025-07-27 19:27:24 -06:00
Piyush Rungta e86315128d Ignore directory if empty .ignore file is present (#14536) 2025-07-27 19:22:12 -06:00
JPVenson 7320e10329 readd Format for splashscreen and user image 2025-07-27 23:12:40 +00:00
JPVenson 5b544bf1ed Remove even obsoleter code 2025-07-27 21:17:20 +00:00
JPVenson 1a1d9b2404 Remove obsolete code 2025-07-27 21:16:45 +00:00
JPVenson 96a05276a6 Removed all server side processing options from public endpoints for image gen 2025-07-27 21:15:18 +00:00
Bas dfab2fb6e2 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2025-07-27 18:34:20 +00:00
Sven Cazier 7785b51f57 Enhance extra rules for video and audio file naming; update tests for new naming conventions 2025-07-26 23:24:58 +02:00
Tim Eisele a068f75623 Set DateLastSaved after running metadata savers (#14531) 2025-07-25 08:20:19 -06:00
Gargotaire 1ed191c5b3 Translated using Weblate (Catalan)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ca/
2025-07-24 20:32:31 +00:00
Gargotaire 0e3fbb6abd Translated using Weblate (Catalan)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ca/
2025-07-24 17:27:34 +00:00
Gargotaire 583a861b32 Translated using Weblate (Catalan)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ca/
2025-07-24 02:15:06 +00:00
Zhelyan Radoev 3bcfe13652 Translated using Weblate (Bulgarian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/bg/
2025-07-24 02:15:06 +00:00
Bond-009 f5a135a1db Merge pull request #14521 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v3.29.4
2025-07-23 18:11:07 +02:00
renovate[bot] 0cea853b45 Update github/codeql-action action to v3.29.4 2025-07-23 15:32:24 +00:00
jkhsjdhjs 663087b155 Fix trickplay extraction ffmpeg error-handling (#14493) 2025-07-22 17:13:38 -06:00
Dan Watson dddeea1f7b Fix issue with EncodedRecorder streams not showing up under "Active Recordings" (#14357) 2025-07-22 17:13:01 -06:00
renovate[bot] a148a4ad02 Update dependency Svg.Skia to 3.0.4 (#14515) 2025-07-22 17:10:46 -06:00
JPVenson 57d077d08e Supress transaction (#14514) 2025-07-22 17:09:31 -06:00
Mylan1173 774be151aa Translated using Weblate (Hungarian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hu/
2025-07-22 12:19:37 +00:00
Bond-009 7569ac65a8 Merge pull request #14508 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v3.29.3
2025-07-22 10:33:32 +02:00
zag 4621a99c7c Translated using Weblate (Malay)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ms/
2025-07-22 08:21:51 +00:00
renovate[bot] 1e796e0b7a Update github/codeql-action action to v3.29.3 2025-07-21 21:06:53 +00:00
Jacob Rasmussen 4da5483ef4 Translated using Weblate (Danish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/da/
2025-07-21 08:07:29 +00:00
theguymadmax eea0872980 Fix Serbian ISO 639-2 codes (#14476) 2025-07-20 20:01:31 -06:00
Cody Robibero 36c90ce2ce Clean up and fix backup/restore (#14489) 2025-07-20 20:01:13 -06:00
Niels van Velzen 48e93dcbce Use RequestHelpers.GetSession in SessionWebSocketListener (#14494) 2025-07-20 20:00:47 -06:00
Gargotaire 6cee66119e Translated using Weblate (Catalan)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ca/
2025-07-19 22:22:01 +00:00
JPVenson c62a07405e improve userdata migration (#14488) 2025-07-19 11:34:51 -06:00
renovate[bot] 7bd08ab290 Update dependency NEbml to v1 (#14490) 2025-07-19 11:34:33 -06:00
renovate[bot] 088ef0d37a Update dependency z440.atl.core to 7.2.0 (#14496) 2025-07-19 11:34:11 -06:00
SaddFox ba0f61ef2d Translated using Weblate (Slovenian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/sl/
2025-07-18 21:18:23 +00:00
SaddFox c70f6bffcf Translated using Weblate (Slovenian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/sl/
2025-07-18 21:18:09 +00:00
JPVenson 21a6d6f0d6 Delete old migrations on restore (#14486) 2025-07-17 17:19:41 -06:00
queukat aa77dfb92d Drawing: make SkiaEncoder more robust when reading image dimensions (#14481) 2025-07-17 17:19:33 -06:00
Stephan Sundermann 2ad37fe021 Ensure UserData stays unique on delete (#14475) 2025-07-17 17:19:26 -06:00
renovate[bot] fd5205a6eb Update danielpalme/ReportGenerator-GitHub-Action action to v5.4.9 (#14485)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-17 09:20:39 +02:00
EinarGisla 60cfa65cdc Translated using Weblate (Icelandic)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/is/
2025-07-16 22:41:15 +00:00
madman38 e5139e1004 Translated using Weblate (Turkish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/tr/
2025-07-16 14:41:36 +00:00
renovate[bot] aa1abf8b94 Update dependency Diacritics to 4.0.17 (#14477) 2025-07-15 06:58:00 -06:00
sharanchius 742b5637fa Translated using Weblate (Lithuanian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/lt/
2025-07-15 01:50:30 +00:00
Nyanmisaka 25a362345d Fix refreshing the library cannot delete old attachments (#14461) 2025-07-14 18:40:37 -06:00
JPVenson 310a54f090 Allow loading of Database options for DB provider (#14466) 2025-07-14 18:39:43 -06:00
renovate[bot] e9d92bdcb0 Update dependency z440.atl.core to 7.1.0 (#14469)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-14 18:37:22 -06:00
FJOX.win dc39a51475 vob file support (#14471) 2025-07-14 18:36:54 -06:00
JPVenson c51f3a3342 Use IDatabaseCreator instead of relying on History repository (#14465) 2025-07-14 18:36:36 -06:00
sharanchius 7ece959f4e Translated using Weblate (Lithuanian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/lt/
2025-07-14 15:23:01 +00:00
sharanchius c96e828002 Translated using Weblate (Lithuanian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/lt/
2025-07-14 13:43:39 +00:00
felix920506 ab56ceaa16 Translated using Weblate (Chinese (Traditional Han script))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant/
2025-07-14 09:38:42 +00:00
sharanchius 4645633acf Translated using Weblate (Lithuanian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/lt/
2025-07-14 09:38:42 +00:00
jkhsjdhjs d6f93759ea Add myself to CONTRIBUTORS.md
I have contributed previously, but forgot to add myself last time.
2025-07-14 00:09:46 +02:00
jkhsjdhjs bf3f37e3d0 Add fallback for keyframe-only trickplay extraction
Keyframe-only trickplay image extraction can fail for some media
files. The current behavior is to skip the media file and try again
on the next run, which will fail again.

This adds a fallback to regular non-keyframe-only extraction for
failed runs, so the extraction can complete.
2025-07-14 00:09:43 +02:00
renovate[bot] 982e0c9370 Update dependency Polly to 8.6.2 (#14455)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-12 09:47:56 +02:00
JPVenson 55e681b9a6 Add SerilogExpressions reference (#14438) 2025-07-11 23:38:41 -06:00
JPVenson 7ba77804c4 Added advanced parallel process calculation (#14437) 2025-07-11 23:27:13 -06:00
Bas af6f5a8ed0 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2025-07-11 18:13:18 +00:00
Ella Veter 1162fcebf8 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2025-07-11 16:50:00 +00:00
renovate[bot] 38d0367c42 Update dependency dotnet-ef to 9.0.7 (#14440)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-09 00:47:46 +02:00
renovate[bot] 7d3372018f Update Microsoft to 9.0.7 (#14441)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-09 00:46:44 +02:00
renovate[bot] 8629831658 Update dependency z440.atl.core to v7 (#14391) 2025-07-07 18:10:48 -06:00
Nyanmisaka db55d983f8 Only enable VAAPI MJPEG encoder on Intel iHD driver (#14433) 2025-07-07 18:05:14 -06:00
JPVenson 4d5ba8d7a5 Only save images when changed (#14425) 2025-07-07 09:14:01 -06:00
Bond-009 6d4169a449 Update dependency Diacritics to v4 (#14418)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-05 11:08:38 +02:00
Shane Powell 8dcb0bfecb Merge pull request #14309 from shanepowell/MediaInfoFixs
Fix PeopleHelper.AddPerson Exceptions due to bad meta-data extracts.
2025-07-04 19:22:27 +02:00
Bond-009 844d69ab64 Read ALBUMARTISTS in preference to ARTISTS when PreferNonstandardArtistsTag set (#14413)
Jellyfin implemented ARTISTS multivalue tag but did not implement the equivalent ALBUMARTISTS multivalue tag.  This change adds ALBUMARTISTS support.  If present and PreferNonstandardArtistsTag is set, ALBUMARTISTS will be used in preference to ALBUMARTIST.  As with ARTISTS, the intent is to offer support for multiple album artists without affecting software that does not read ALBUMARTIST as a multivalued tag.

Example album before/after:

    ALBUM           : Amici e Rivali
    ARTIST          : Lawrence Brownlee / Michael Spyres
    album_artist    : Lawrence Brownlee
    ARTISTS         : Lawrence Brownlee;Michael Spyres
    ALBUMARTISTS    : Lawrence Brownlee;Michael Spyres

Before ALBUMARTISTS support, Jellyfin reports:
    Album Artist: Lawrence Brownlee [hyperlinked]
    On each track Artist: Lawrence Brownlee, Michael Spyres

After ALBUMARTISTS support, Jellyfin reoprts:
    Album Artist: Lawrence Brownlee [hyperlinked], Michael Spyres [hyperlinked]
    On each track Artist: none shown (no other artists in source metadata)

This is ideal as both key artists are hyperlinkable from their albums.

References to other products implementing ALBUMARTISTS:
- Navidrome: https://www.navidrome.org/docs/usage/tagging-guidelines/#handling-multiple-artists-and-collaborations
- Kodi: https://kodi.wiki/view/Music_tagging#albumartists
- MusicBrainz Picard: https://picard-docs.musicbrainz.org/en/variables/variables_basic.html (_albumartists tag)

Co-authored-by: Evan <evan@MacBook-Pro.local>
2025-07-04 19:19:26 +02:00
Bond-009 5c36b44484 Fix seasons random (#13224) (#14335)
Sorting was always enabled so removed the `enableSorting` parameter
in QueryResult method.

Co-authored-by: Maxime <>
2025-07-04 19:18:38 +02:00
renovate[bot] 4e4d7e7764 Update github/codeql-action action to v3.29.2 (#14400)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-03 17:18:29 +02:00
renovate[bot] 4c268a3579 Update dependency Diacritics to v4 2025-07-03 15:15:02 +00:00
Yago Raña Gayoso 77bcd2f5f6 Translated using Weblate (Galician)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/gl/
2025-07-02 19:07:02 +00:00
Bill Thornton 8406924471 Merge pull request #14414 from thornbill/revert-pt-translations
Revert invalid Portuguese translations
2025-07-02 10:52:11 -04:00
Bill Thornton 67fd4ce187 Revert "Translated using Weblate (Portuguese)"
This reverts commit dde306b170.
2025-07-02 10:47:44 -04:00
Bill Thornton b37b39773a Revert "Translated using Weblate (Portuguese)"
This reverts commit 9c817a97a9.
2025-07-02 10:47:31 -04:00
akshay 6f98767aed Translated using Weblate (Marathi)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/mr/
2025-07-02 09:49:41 +00:00
Tal Sarid 643460f484 Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/he/
2025-07-02 08:16:42 +00:00
Evan a4231bf428 Read ALBUMARTISTS in preference to ARTISTS when PreferNonstandardArtistsTag set
Jellyfin implemented ARTISTS multivalue tag but did not implement the equivalent ALBUMARTISTS multivalue tag.  This change adds ALBUMARTISTS support.  If present and PreferNonstandardArtistsTag is set, ALBUMARTISTS will be used in preference to ALBUMARTIST.  As with ARTISTS, the intent is to offer support for multiple album artists without affecting software that does not read ALBUMARTIST as a multivalued tag.

Example album before/after:

    ALBUM           : Amici e Rivali
    ARTIST          : Lawrence Brownlee / Michael Spyres
    album_artist    : Lawrence Brownlee
    ARTISTS         : Lawrence Brownlee;Michael Spyres
    ALBUMARTISTS    : Lawrence Brownlee;Michael Spyres

Before ALBUMARTISTS support, Jellyfin reports:
    Album Artist: Lawrence Brownlee [hyperlinked]
    On each track Artist: Lawrence Brownlee, Michael Spyres

After ALBUMARTISTS support, Jellyfin reoprts:
    Album Artist: Lawrence Brownlee [hyperlinked], Michael Spyres [hyperlinked]
    On each track Artist: none shown (no other artists in source metadata)

This is ideal as both key artists are hyperlinkable from their albums.

References to other products implementing ALBUMARTISTS:
- Navidrome: https://www.navidrome.org/docs/usage/tagging-guidelines/#handling-multiple-artists-and-collaborations
- Kodi: https://kodi.wiki/view/Music_tagging#albumartists
- MusicBrainz Picard: https://picard-docs.musicbrainz.org/en/variables/variables_basic.html (_albumartists tag)
2025-07-02 07:55:24 +08:00
Edson 9c817a97a9 Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt/
2025-07-01 18:43:41 +00:00
dyphire f9c4c9b345 Add additional chinese languages 2025-07-01 16:47:13 +08:00
Deleted User dde306b170 Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt/
2025-07-01 08:19:32 +00:00
Tal Sarid e2b61d951b Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/he/
2025-07-01 00:32:48 +00:00
Gargotaire 9eff25bfed Translated using Weblate (Catalan)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ca/
2025-07-01 00:32:47 +00:00
Tommaso Morganti ff4484eb4a Translated using Weblate (Italian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/it/
2025-06-29 16:35:11 +00:00
Gargotaire 62b2adbf66 Translated using Weblate (Catalan)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ca/
2025-06-29 16:35:11 +00:00
gnattu 9ac8c2a2fa Fix compiler warning for CodeMigration.cs (#14390) 2025-06-29 08:00:29 -06:00
renovate[bot] 90e72fb687 Update dependency BitFaster.Caching to 2.5.4 (#14392)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-29 10:23:38 +02:00
Acrotos 630846798d Translated using Weblate (Romanian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ro/
2025-06-28 20:50:29 +00:00
Petrică Andrei-Cosmin 9d5be19a27 Translated using Weblate (Romanian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ro/
2025-06-28 20:50:29 +00:00
renovate[bot] 6058ab50f8 Update github/codeql-action action to v3.29.1 (#14389)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-28 11:23:12 +02:00
Ruben Teixeira e3b379052d Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt_PT/
2025-06-28 00:39:50 +00:00
Nirwan 0b6f4b2bd9 Translated using Weblate (Indonesian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/id/
2025-06-27 11:27:47 +00:00
Varun Sudarshan 4f6db1bc22 Translated using Weblate (Kannada)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/kn/
2025-06-27 02:51:17 +00:00
Oatavandi 8c8c71125c Translated using Weblate (Tamil)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ta/
2025-06-27 02:51:17 +00:00
Tim Eisele c6e568692e Fix modification checks and make sure to use UTC (#14347) 2025-06-26 17:50:37 -06:00
Archie d5a76bdff8 Changed misspell of 'temporarily' in 503 response (#14377) 2025-06-26 17:49:07 -06:00
Nyanmisaka ebdc756547 Fix -fps_mode option being applied on input (#14379) 2025-06-26 17:48:43 -06:00
stelle 10d0cec7b9 Translated using Weblate (Malay)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ms/
2025-06-25 13:51:17 +00:00
Hasan Abdulaal 10cc651790 Translated using Weblate (Arabic)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ar/
2025-06-25 13:51:16 +00:00
theguymadmax 7d18f3d6ed Improve cast and crew handling (#14370) 2025-06-24 17:48:36 -06:00
Max Rumpf 9b8c12d433 Adapt LrcLyricParser to new LrcParser version (#14263) 2025-06-24 16:59:09 -06:00
JPVenson ba0eb87371 Add migration to migrate disconnected UserData too (#14339) 2025-06-23 08:36:49 -06:00
Mason Weigand d561cef81f RemoveNowPlayingItem should also set FullNowPlayingItem to null (#14360) bb 2025-06-23 08:31:25 -06:00
theguymadmax b528c1100f Fix missing music genre metadata (#14332) 2025-06-23 08:30:59 -06:00
Tim Eisele 96c9f4fdad Make keyframe extraction task cancellable (#14368) 2025-06-23 08:29:42 -06:00
Onni Saarni 6d077fcf40 Translated using Weblate (Finnish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fi/
2025-06-22 07:12:05 +00:00
Niels van Velzen ab99b2bad3 Merge pull request #14341 from Shadowghost/misc
Cleanup Migration
2025-06-22 08:49:24 +02:00
Tim Eisele db36be7a6b Skip missing images when creating collages (#14344)
* Skip missing images when creating collages
2025-06-21 12:23:08 +02:00
Romulo Alves 85f158e1dd Translated using Weblate (Portuguese (Brazil))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt_BR/
2025-06-20 03:36:14 +00:00
RingoJet e1365bd253 Translated using Weblate (Arabic)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ar/
2025-06-20 03:36:14 +00:00
Shoham Peller 1ec66adc30 fix(devcontainer): correct apt-packages path (#14235)
Feature path was incorrect, which failed the creation of the
devcontainer
2025-06-19 14:46:55 +02:00
Shadowghost af0bcbc652 Fixup 2025-06-19 12:33:46 +02:00
Tim Eisele b2312466e1 Update Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
Co-authored-by: Bond-009 <bond.009@outlook.com>
2025-06-19 11:40:40 +02:00
Bond-009 cc7915c2e6 Merge pull request #14338 from jellyfin/renovate/polly-monorepo
Update dependency Polly to 8.6.1
2025-06-19 11:28:13 +02:00
Bond-009 a537c66da1 Merge pull request #14322 from gnattu/disable-hdr-non-hdr-clients
Don't check dynamic metadata removal for static HDR formats
2025-06-19 11:27:23 +02:00
Bond-009 a43adf42f3 Merge pull request #14324 from jellyfin/renovate/microsoft
Update dependency System.Linq.Async to 6.0.3
2025-06-19 11:26:54 +02:00
Bond-009 6996c8a1de Merge pull request #14330 from jellyfin/qsv-dx11-static-pool
Fix QSV "static surface pool size exceeded" on Windows
2025-06-19 11:26:37 +02:00
Bond-009 f976630003 Merge pull request #14333 from theguymadmax/add-act-naming-option
Add act as a stacking option for music albums
2025-06-19 11:25:46 +02:00
Bond-009 965cf93419 Merge pull request #14328 from crobibero/trickplay-info
Use dto instead of db object when returning trickplay
2025-06-19 11:24:03 +02:00
Bond-009 70ea3f863a Merge pull request #14327 from crobibero/fix-startup
Fix startup logger, startup health check
2025-06-19 11:20:35 +02:00
Tim Eisele 989aef18af Update Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>
2025-06-18 23:08:05 +02:00
Shadowghost ccb917b8df Cleanup logging and user data import skip on missing user 2025-06-18 21:33:32 +02:00
queeup 7cf6389ab5 Translated using Weblate (Turkish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/tr/
2025-06-18 15:47:10 +00:00
renovate[bot] 2473b89a8d Update dependency Polly to 8.6.1 2025-06-18 09:36:02 +00:00
Yusuke, Hirota 6575c69a4e Translated using Weblate (Japanese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ja/
2025-06-18 09:01:34 +00:00
nextlooper42 66d594836c Translated using Weblate (Slovak)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/sk/
2025-06-18 09:01:34 +00:00
Roi Gabay 43028f735f Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/he/
2025-06-18 09:01:34 +00:00
Maxime e83b992eef Fix seasons random (#13224)
Sorting was always enabled so removed the `enableSorting` parameter
in QueryResult method.
2025-06-18 00:41:09 +02:00
theguymadmax 8368d10d1b Add act as a stacking option for music albums 2025-06-17 12:16:32 -04:00
Nyanmisaka e8291fc856 Fix QSV "static surface pool size exceeded" on Windows
d3d11va doesn't support dynamic pool size, use vpp filter ctx to relay to prevent encoder async and bframes from exhausting the decoder pool.
2025-06-17 15:02:13 +08:00
Aindriú Mac Giolla Eoin 308707476d Translated using Weblate (Irish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ga/
2025-06-17 01:01:35 +00:00
Daniel Szente e252589900 Translated using Weblate (Hungarian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hu/
2025-06-17 01:01:34 +00:00
Mathieu Funk 1220cac255 Translated using Weblate (English (United Kingdom))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/en_GB/
2025-06-17 01:01:34 +00:00
Gallyam Biktashev 7218d82c21 Translated using Weblate (Russian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ru/
2025-06-17 01:01:34 +00:00
bdubz a4524eb2ad Translated using Weblate (Spanish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es/
2025-06-17 01:01:34 +00:00
Thadah D. Denyse 553ba56389 Translated using Weblate (Basque)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/eu/
2025-06-17 01:01:34 +00:00
Cody Robibero afa2103d42 Use dto instead of db object when returning trickplay 2025-06-16 18:55:21 -06:00
Cody Robibero 7256c9c89d Fix startup logger, startup health check 2025-06-16 18:32:29 -06:00
renovate[bot] f3cdaeaa12 Update dependency System.Linq.Async to 6.0.3 2025-06-16 21:23:20 +00:00
gnattu 368808eba4 Don't check dynamic metadata removal for static HDR formats
Those videos have no metadata to be removed at all, just force transcoding when the client does not support it.
2025-06-17 02:29:16 +08:00
renovate[bot] 0fc8ed6aeb Update danielpalme/ReportGenerator-GitHub-Action action to v5.4.8 (#14316) 2025-06-16 09:15:23 +02:00
gnattu f60281d8fd Use square root scaling for high framerate videos' bitrate requirements (#14314) 2025-06-15 15:22:49 -06:00
renovate[bot] 2936588c0f Update dependency z440.atl.core to 6.26.0 (#14315) 2025-06-15 15:21:38 -06:00
JPVenson 0e1be6ce30 Use proper scheduler that honors the parallel task limit (#14281) 2025-06-15 15:21:11 -06:00
JPVenson 4cd0a2ed8d Always set update action when item does not exist (#14304) 2025-06-15 15:19:57 -06:00
Tim Eisele aa05185917 Only remove image file if it exists (#14302) 2025-06-15 15:19:30 -06:00
JPVenson 2d9257b203 Add explicit check for placeholder ID (#14298) 2025-06-15 12:07:19 -06:00
JPVenson d1d9c8ed06 Remove appsettings.json loading component from startup server (#14275) 2025-06-13 15:26:09 -06:00
Ēvalds Zemturis 23c25289da Translated using Weblate (Latvian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/lv/
2025-06-12 18:48:11 +00:00
DyingSlacker aad6bca955 Translated using Weblate (Chinese (Simplified Han script))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hans/
2025-06-12 18:48:11 +00:00
Tim Eisele 9f0f9a276f Fix People Issues (#14284) 2025-06-12 05:21:01 -06:00
Bond-009 6016159860 Merge pull request #14287 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v3.29.0
2025-06-12 13:13:04 +02:00
renovate[bot] 6ffc044af1 Update github/codeql-action action to v3.29.0 2025-06-11 23:31:43 +00:00
Tim Eisele c22f24319b Properly handle file access issues in some cases (#14272) 2025-06-11 17:31:14 -06:00
JPVenson 1c4c9cf733 Fix UserData cleanup task and queries (#14280) 2025-06-11 17:30:57 -06:00
Battseren Badral ea34a38f09 Translated using Weblate (Mongolian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/mn/
2025-06-11 23:01:34 +00:00
stanol bbcfb2f421 Translated using Weblate (Ukrainian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/uk/
2025-06-11 23:01:34 +00:00
cmpsb 0873fa8a86 Translated using Weblate (Swedish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/sv/
2025-06-11 23:01:34 +00:00
st7105 9dc50b4ac6 Translated using Weblate (Russian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ru/
2025-06-11 23:01:34 +00:00
Martin Just 617ab0d0ca Translated using Weblate (German)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/de/
2025-06-11 23:01:34 +00:00
Gargotaire dee9629037 Translated using Weblate (Catalan)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ca/
2025-06-11 23:01:33 +00:00
Bond-009 31f3b5f6bb Merge pull request #14279 from jellyfin/renovate/polly-8.x
Update dependency Polly to 8.6.0
2025-06-11 10:50:36 +02:00
renovate[bot] 2ac6a7ba3f Update dependency Polly to 8.6.0 2025-06-11 04:50:21 +00:00
hoanghuy309 ece77779f8 Translated using Weblate (Vietnamese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/vi/
2025-06-10 22:37:54 +00:00
Dan Tsivinsky c15c1f82a3 Translated using Weblate (Russian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ru/
2025-06-10 22:37:54 +00:00
Kityn a15352b80c Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pl/
2025-06-10 22:37:53 +00:00
Bas 304b944152 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2025-06-10 22:37:53 +00:00
myrad2267 e81c8ac6d1 Translated using Weblate (French)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fr/
2025-06-10 22:37:53 +00:00
myrad2267 97c1cb2f26 Translated using Weblate (French (Canada))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fr_CA/
2025-06-10 22:37:53 +00:00
Lukáš Kucharczyk ac9d84f602 Translated using Weblate (Czech)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/cs/
2025-06-10 22:37:53 +00:00
Gargotaire f3bf3c9853 Translated using Weblate (Catalan)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ca/
2025-06-10 22:37:53 +00:00
renovate[bot] 644245bb7c Update dependency dotnet-ef to 9.0.6 (#14273)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-10 15:23:15 -06:00
renovate[bot] a18c0007b4 Update Microsoft to 9.0.6 (#14274)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-10 15:22:59 -06:00
Niels van Velzen c8a51160b4 Merge pull request #14269 from JPVenson/bugfix/BackupTableNames
Fix schema name on backup
2025-06-10 17:34:16 +02:00
JPVenson 4a0a45a045 Use explicit naming 2025-06-10 14:33:41 +00:00
JPVenson 91da1c035d Fix schema name on backup 2025-06-10 14:31:01 +00:00
ThunderClapLP 6b5ce934b3 Fix existing media segments not being handled on scan (#14218) 2025-06-10 07:45:09 -06:00
Niels van Velzen 7174bb6a93 Merge pull request #14264 from IDisposable/patch-1
chore/typo
2025-06-10 07:17:15 +02:00
Marc Brooks 7037121bd0 chore/typo
s/entires/entries
2025-06-09 19:58:25 -05:00
renovate[bot] 7417da0e5c Update dependency z440.atl.core to 6.25.0 (#14257)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-09 17:34:08 -06:00
Sid K 1e8bf1ce8d fix(Session): don't query DB if queue hasn't changed (#14244) 2025-06-09 17:33:28 -06:00
Dario Ackermann d4c3d24e52 fix(collection): Do not lock newly created collections (#14259) 2025-06-09 17:32:31 -06:00
JPVenson d3ad2aec60 Feature/persistent watch data (#14262) 2025-06-09 17:14:27 -06:00
JPVenson 3554f068fb Ignore null key virtual folders (#14253) 2025-06-09 06:20:04 -06:00
Niels van Velzen 6dac1fde0a Merge pull request #14255 from gnattu/pin-skia-3116
Pin Skiasharp version to 3.116.1
2025-06-09 12:15:59 +02:00
gnattu 56fe4a158e Add comment for version pin
Co-authored-by: JPVenson <ger-delta-07@hotmail.de>
2025-06-09 18:14:51 +08:00
Chatcharin Sangbutsarakum c2332d340c Translated using Weblate (Thai)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/th/
2025-06-09 06:22:06 +00:00
gnattu d5b5c71baf Pin Skiasharp version to 3.116.1
Any prebuilt version newer than that does not work with debian based arm64 system and currently build from source is the only way to use those versions. Pin the latest good version for now instead to make our life and our downstream packagers' life easier.
2025-06-09 10:15:44 +08:00
JPVenson 7aee5b1e70 Fix ExcludeItemId, ExcludeProviderIds and HasAnyProviderId filter (#14249) 2025-06-08 19:53:18 -06:00
JPVenson a8601b3797 util forward headers on startup api (#14246) 2025-06-08 19:52:48 -06:00
JPVenson 1e9e4ffda9 Rework startup topic handling and reenable output to logging framework (#14243) 2025-06-08 19:52:39 -06:00
theguymadmax d7faf9a327 Use filename for single videos (non-movie/null collections) in MovieResolver (#14162) 2025-06-08 19:52:25 -06:00
gnattu bdb3adeb30 Don't attempt to do metadata removal for dovi without fallback (#14240) 2025-06-08 07:29:17 -06:00
JPVenson 1f5cfb1e23 Only show log in Local network (#14241) 2025-06-08 07:28:37 -06:00
Niels van Velzen c2cc27a8a9 Merge pull request #12908 from scampower3/search-for-missing-overrides-existing
Fix search for missing metadata overriding existing metadata
2025-06-07 21:56:46 +02:00
Niels van Velzen f4bce38ddb Merge pull request #14209 from theguymadmax/themoviedb-year-cache-key
Add year parameter to TMDB series cache key
2025-06-07 21:56:30 +02:00
Niels van Velzen 547b8cafb1 Merge pull request #13307 from qiqian/master
always sort season by index number
2025-06-07 21:52:01 +02:00
Carsten Braun 98daf4aedb Use string.IsNullOrEmpty instead of regular null check. 2025-06-07 21:51:08 +02:00
Carsten Braun fcf56b73cb When subtitle is embedded in the main video file, the path will be null. 2025-06-07 21:51:08 +02:00
Carsten Braun e8239a7ee2 Do not attempt to extract internal subtitles if there are only MKS subtitles. 2025-06-07 21:51:08 +02:00
Carsten Braun 84cebeae64 Skip early if subtitle is in MKS to avoid unnecessary function calls. 2025-06-07 21:51:08 +02:00
Carsten Braun c0e2875818 If subtitles are part of an MKS, it is not an error. Just log for debug purpose and continue. 2025-06-07 21:51:08 +02:00
Carsten Braun 411ba03bf0 Fixed formatting 2025-06-07 21:51:08 +02:00
Carsten Braun b2e19c0306 Also extract subtitles of MKS aux files if they're extractable. 2025-06-07 21:51:08 +02:00
Joshua M. Boniface 6d287d5627 Merge pull request #14228 from JPVenson/bugfix/StartupLookup
Fix source directory for setup template
2025-06-06 17:18:46 -04:00
theguymadmax 4f3b49472a Fix broken chapter image placeholders when no image is present (#14230) 2025-06-06 13:52:00 -06:00
felix920506 ef90fe9157 Update issue report.yml (#14099) 2025-06-06 06:56:29 -06:00
Mohammed Alhaddar 97f9d0c7e6 Fixing race condition in GetSessionInfo (#14131) 2025-06-06 06:55:05 -06:00
sharinganthief 9ab22e9f8b Add try catch (#14154) 2025-06-06 06:54:53 -06:00
JPVenson 04422250eb Fix source directory for setup template 2025-06-06 10:59:15 +00:00
wzrd a702b62553 Translated using Weblate (German)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/de/
2025-06-06 02:11:36 +00:00
theguymadmax 5d7ae6a134 Fix metadata not refreshing in negative UTC timezones (#14225) 2025-06-05 15:58:20 -06:00
theguymadmax 5ac0260e5f Fix DirectoryNotFoundException for backdrop folders in trickplay (#14223) 2025-06-05 15:57:31 -06:00
JPVenson 88332e89c4 Feature/version check in library migration (#14105) 2025-06-05 08:59:11 -06:00
JPVenson a3578caa8c Migrate all known old migrations even when not applied in migration.xml (#14217) 2025-06-05 08:46:50 -06:00
Blackspirits b45e5463c1 Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt/
2025-06-05 02:37:16 +00:00
Blackspirits 10ab381e62 Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt_PT/
2025-06-05 02:37:15 +00:00
AfmanS fa363f6276 Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt_PT/
2025-06-04 21:23:55 +00:00
Joshua M. Boniface 57214dafe8 Merge pull request #14222 from JPVenson/feature/DisableCacheForIndex
Add cache-control: no-cache to index.html if selfhosted
2025-06-04 14:04:37 -04:00
JPVenson 9ed9347cde Add cache-control: no-cache to index.html if selfhosted 2025-06-04 16:07:33 +00:00
JPVenson 916e897ed2 Allow custom plugin provided database providers to be loaded (#14171) 2025-06-03 16:53:37 -06:00
JPVenson d5672ce407 Add declarative backups for migrations (#14135) 2025-06-03 16:49:41 -06:00
James 0c46431cbb Update XmlTv tests to use UTC date formats. (#14163) 2025-06-03 15:30:08 -06:00
Tim Eisele e1a5c16404 Prune trickplay data on regenerate and scan (#14085) 2025-06-03 15:25:09 -06:00
jade 44b5de1568 Fix missing logging of connections by disallowed IPs (#14011) 2025-06-03 15:22:30 -06:00
Shane Powell 08b2ffeaab fixes #14193 (#14203) 2025-06-03 15:21:35 -06:00
JPVenson 48825f468e Fix server not auto restarting (#14215) 2025-06-03 15:16:35 -06:00
renovate[bot] 56d6e4b4cc Update dependency FsCheck.Xunit to 3.3.0 (#14216)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-03 15:16:00 -06:00
JPVenson 697bb6a480 Backup MigrationHistory as well (#14136) 2025-06-03 15:15:46 -06:00
JPVenson a1d72deba2 Add multiple options for internal locking (#14047) 2025-06-03 15:15:22 -06:00
JPVenson 9456d7168f Add partition helper (#14039) 2025-06-03 15:15:04 -06:00
renovate[bot] ae5e6431c5 Update github/codeql-action action to v3.28.19 (#14212)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-03 15:14:53 -06:00
renovate[bot] e2ee58f29d Update dependency Microsoft.NET.Test.Sdk to 17.14.1 (#14211)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-03 15:14:12 -06:00
Niels van Velzen bd3ee9f1e4 Merge pull request #14202 from shanepowell/fix-unittests
Fix unittests
2025-06-03 23:07:22 +02:00
theguymadmax 7ef3f73ce4 Add year parameter to TMDB series cache key 2025-06-03 11:04:43 -04:00
General-c4 4bc336091e Translated using Weblate (Arabic)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ar/
2025-06-03 09:34:14 +00:00
Bond-009 c75f1e2987 Merge pull request #14030 from baka0815/iso639txt-pt
Localization/iso6392.txt: Correct the Portuguese entries
2025-06-02 15:39:48 +02:00
Shane Powell 4a4ed1b5d5 Merge branch 'jellyfin:master' into fix-unittests 2025-06-02 09:42:45 +12:00
Bond-009 eea80e5735 Merge pull request #13145 from SenorSmartyPants/RemoteImageSorting
Round RemoteImage CommunityRating to nearest tenths when sorting
2025-06-01 20:14:39 +02:00
Bond-009 c565010f28 Merge pull request #14179 from nyanmisaka/offload-sub-scale-to-rkrga
Offload 1080p+ subtitle scaling to RKRGA
2025-06-01 20:07:26 +02:00
XLi 285cd708f6 Translated using Weblate (Literary Chinese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/lzh/
2025-05-31 14:57:34 +00:00
Shane Powell 3330465337 Fix failing unit tests on machines where the local timezone offset is far enough away from the test data day to be off by a day.
Change the test startdate to specifically be utc instead of local machine timezone.
2025-05-31 10:41:26 +12:00
wheremygit 4ba95b9ac4 Translated using Weblate (Marathi)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/mr/
2025-05-28 16:00:37 +00:00
nyanmisaka 1ee705f3e1 Fix RKRGA 2pass scaling issue caused by auto AR reduction
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2025-05-26 23:49:04 +08:00
nyanmisaka 0e0c7c5c59 Offload 1080p+ subtitle scaling to RKRGA
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2025-05-26 23:49:04 +08:00
Bond-009 4993234a7d Merge pull request #13933 from jellyfin/renovate/svg.skia-3.x
Update dependency Svg.Skia to 3.0.3
2025-05-25 14:02:38 +02:00
renovate[bot] ed9affb14c Update dependency Svg.Skia to 3.0.3 2025-05-25 00:57:06 +00:00
theguymadmax 41b9eb8c0a Add SVG to transparent image types (#14160) 2025-05-23 11:30:35 -06:00
Napaul Intrarasing 605b8bb7aa Translated using Weblate (Thai)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/th/
2025-05-22 21:01:32 +00:00
Bond-009 538d0b622a Merge pull request #14153 from theguymadmax/name-case-insensitivity
Make name sorting case-insensitive
2025-05-22 17:58:07 +02:00
Max 8cb077402f Use CleanName for sorting case insensitive 2025-05-22 10:32:40 -04:00
theguymadmax 0cea039445 Fix media detection for single video files with subfolders (#14140) 2025-05-22 07:05:23 -06:00
theguymadmax c3762186da Fix collection behavior when sorting by rating or runtime (#14148)
Co-authored-by: Max <no@example.com>
2025-05-22 07:05:14 -06:00
Bond-009 44981cd823 Enable OpenCL deinterlacer for AMF on Windows when available (#14144)
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2025-05-22 12:58:57 +02:00
Max 709d0bb231 Make name sorting case insensitive 2025-05-21 11:18:34 -04:00
nyanmisaka 56231222df Enable OpenCL deinterlacer for AMF on Windows when available
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2025-05-20 22:07:00 +08:00
theguymadmax a6a89f7953 Fix ArgumentNullException when downloading season logos (#14141) 2025-05-20 06:03:04 -06:00
renovate[bot] 8339111732 Update dependency Microsoft.NET.Test.Sdk to 17.14.0 (#14143)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-20 13:57:49 +02:00
Tal Sarid 87e50025a9 Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/he/
2025-05-19 22:41:32 +00:00
gnattu 9d601f8e9b Terminate at null char for audio tags (#14100) 2025-05-18 18:40:18 -06:00
JPVenson fe2596dc0e Add Full system backup feature (#13945) 2025-05-18 18:39:04 -06:00
renovate[bot] cdbf4752b9 Update skiasharp monorepo (major) (#13369) 2025-05-18 18:38:26 -06:00
theguymadmax 43659f011c Fix ArgumentNullException in TmdbExternalUrlProvider (#14130) 2025-05-18 18:35:12 -06:00
Tal Sarid 8d781a0966 Added translation using Weblate (Hebrew (Israel)) 2025-05-17 13:44:36 +00:00
renovate[bot] 7217b09cda Update dependency Microsoft.CodeAnalysis.BannedApiAnalyzers to v4 (#14113)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-17 06:55:12 -06:00
renovate[bot] f577dd6d64 Update github/codeql-action action to v3.28.18 (#14119)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-17 06:55:04 -06:00
renovate[bot] 9afb441361 Update dependency z440.atl.core to 6.24.0 (#14122)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-17 06:54:33 -06:00
Alexander Miller 29fc7711a1 Merge pull request #14094 from allesmi/fix/ancestor-ids-parent-child-relation
Translate query by AncestorIds correctly
2025-05-15 11:48:20 +02:00
Bond-009 265cc50144 Merge pull request #14102 from jellyfin/renovate/dotnet-monorepo
Update dependency dotnet-ef to 9.0.5
2025-05-14 11:48:00 +02:00
Bond-009 07b8247784 Merge pull request #14103 from jellyfin/renovate/microsoft
Update Microsoft to 9.0.5
2025-05-14 11:47:49 +02:00
renovate[bot] 16e04970f7 Update Microsoft to 9.0.5 2025-05-13 20:32:08 +00:00
renovate[bot] 61b928bc34 Update dependency dotnet-ef to 9.0.5 2025-05-13 18:51:06 +00:00
Blackspirits 4014b262d9 Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt_PT/
2025-05-13 01:02:29 +00:00
Blackspirits 8bc0123f42 Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt_PT/
2025-05-12 14:01:06 +00:00
renovate[bot] 28602af328 Update appleboy/scp-action action to v1 (#14012) 2025-05-11 21:15:10 -06:00
Tim Eisele 1b34ebc0fc Fix extracted data cleanup in cleanup post scan task (#14083) 2025-05-11 21:11:21 -06:00
renovate[bot] 14f142faa8 Update danielpalme/ReportGenerator-GitHub-Action action to v5.4.7 (#14090) 2025-05-11 21:10:56 -06:00
Alesaaq fc2ecf9c93 Translated using Weblate (Galician)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/gl/
2025-05-11 11:28:25 +00:00
SoumyadipAuddy 86917cd167 added different countries parental ratings (#14069) 2025-05-09 20:23:54 -06:00
theguymadmax 6c57ad4772 Fix Blu-ray metadata processing: preserve external streams and language metadata (#14077) 2025-05-09 08:35:54 -06:00
gnattu 140de04f94 Reject invalid replaygain tag value (#14082) 2025-05-09 08:35:41 -06:00
Tim Eisele 49c6a99e00 Cleanup external item data cleanup (#14072) 2025-05-09 08:35:29 -06:00
Nyanmisaka 07093c84c8 Use VBR and MBBRC in QSV encoders for better quality (#14079) 2025-05-08 14:43:13 -06:00
JPVenson a7bb3ea214 Only consider migrations that have key set for migration.xml migration (#14061) 2025-05-05 17:23:23 -06:00
Bond-009 28e2f5bb08 Add tests for ManagedFileSystem.MoveDirectory (#14065) 2025-05-05 15:39:06 -06:00
gnattu dec5814a6a Fix cross filesystem dir moving (#14063) 2025-05-05 14:22:43 -06:00
Tim Eisele d976f13970 Recognize file changes and remove data on change (#13839) 2025-05-04 21:21:44 -06:00
Bond-009 0c3ba30de2 Cleanup file related code (#14023) 2025-05-04 08:40:34 -06:00
JPVenson 4096c973c6 fix #14034 Readd Context provider on Initialise (#14040) 2025-05-04 08:27:03 -06:00
Bond-009 ce0a6b2df8 Merge pull request #14058 from jellyfin/renovate/ci-deps
Update danielpalme/ReportGenerator-GitHub-Action action to v5.4.6
2025-05-04 15:13:21 +02:00
renovate[bot] 06b7f88d6c Update danielpalme/ReportGenerator-GitHub-Action action to v5.4.6 2025-05-04 11:28:17 +00:00
Blackspirits 5e5fdf6173 Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt/
2025-05-04 07:31:23 +00:00
Blackspirits 0cd039b65c Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt_PT/
2025-05-04 07:31:23 +00:00
Bond-009 3ec5b7efaa Merge pull request #14017 from jellyfin/renovate/serilog.sinks.file-7.x
Update dependency Serilog.Sinks.File to v7
2025-05-03 16:52:05 +02:00
Nyanmisaka 4199f7acc2 Fix the transparency issue of ASS subtitle rendering in HWA (#14024) 2025-05-03 08:21:08 -06:00
theguymadmax 70dbf837c5 Add albumart as recognized filename for music artwork (#14048) 2025-05-03 08:19:59 -06:00
SoumyadipAuddy 7e6d4424b2 added parental ratings as per Indian Central Board of Film Certification norms (#14050) 2025-05-03 08:19:24 -06:00
harry-hart 930a4d0f60 Update NamingOptions.cs to include "part" (#14022) 2025-05-02 07:54:34 -06:00
renovate[bot] d894b91d46 Update dependency z440.atl.core to 6.23.0 (#14045)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-02 07:51:56 -06:00
theguymadmax 57716833b8 Fix trickplay directory path construction (#14036) 2025-05-02 07:01:23 -06:00
Bond-009 e5c40ea98d Merge pull request #14046 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v3.28.17
2025-05-02 14:56:44 +02:00
Bond-009 b4a58ee13a Merge pull request #14028 from Shadowghost/cleanup-tasks
Cleanup Tasks and Validators
2025-05-02 14:47:53 +02:00
renovate[bot] 2803d4941b Update github/codeql-action action to v3.28.17 2025-05-02 11:44:36 +00:00
Niels van Velzen dbedb9096b Merge pull request #14044 from theguymadmax/fix-log-file
Fix startup logger log file order
2025-05-02 13:43:54 +02:00
theguymadmax 3cf213c4fb Fix startup logger log file order 2025-05-01 21:20:35 -04:00
Jothi Prasath 3cc4e8a88a Translated using Weblate (Tamil)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ta/
2025-05-01 17:46:24 +00:00
Christoph "baka0815" Schwerdtfeger 9050a094a7 Localization/iso6392.txt: change pob and pop
pob and pop are not valid iso 639 codes for Portuguese. "pob" seems to be Poqomchi' and "pop" is Pwapwâ.
So just change them to both reference por which is the 3-letter-code for portuguese.
2025-04-30 20:16:45 +02:00
Shadowghost 5c9f70c375 Cleanup Tasks and Validators 2025-04-30 09:29:13 +02:00
Bond-009 aa24d08d33 Fix image extractor with more strict ffmpeg requirement (#14013)
* Correctly handle retry when I frame only failed

* Use full range output for image

* Don't trim image extractor option
2025-04-29 14:10:24 +02:00
sususu98 a7891b3f2d Enhanced HTTP Range request support for. strm file
Forward the Range, Accept-Ranges, and Content-
Range headers, improve User-Agent handling,
and adjust the default Content-Type.
2025-04-29 17:08:50 +08:00
besart-hajdari 0a0fcd3b19 Translated using Weblate (Albanian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/sq/
2025-04-28 14:29:03 +00:00
Joshua M. Boniface 055d466d16 Merge pull request #14016 from crobibero/upd-projects
Add new nuget packages to abi diff
2025-04-27 21:16:20 -04:00
renovate[bot] 5dc7962995 Update dependency Serilog.Sinks.File to v7 2025-04-28 00:43:47 +00:00
JPVenson e66c76fc34 Unified migration handling (#13950) 2025-04-27 18:18:08 -06:00
Cody Robibero e57a95e9cd Add required nuget properties 2025-04-27 18:11:22 -06:00
Cody Robibero 2b854fb365 Add new nuget packages to abi diff 2025-04-27 18:02:42 -06:00
gnattu f436743f9f Don't trim image extractor option 2025-04-27 21:37:44 +08:00
gnattu 77bb1a726e Use full range output for image 2025-04-27 21:36:57 +08:00
gnattu 6637102162 Correctly handle retry when I frame only failed 2025-04-27 21:30:02 +08:00
JPVenson 1c4b5199b8 Fix ItemValue query (#13939) 2025-04-26 19:10:54 -06:00
Tim Eisele f576783ae1 Fix distinction queries (#14007) 2025-04-26 18:49:30 -06:00
Rasko 67110b512a Translated using Weblate (Norwegian Bokmål)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nb_NO/
2025-04-26 19:22:49 +00:00
renovate[bot] 1264254301 Update dependency z440.atl.core to 6.22.0 (#13995)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-26 09:37:23 -06:00
gnattu 2e467f29de Don't pass through timestamp for image extractor (#13999) 2025-04-26 09:36:40 -06:00
Tim Eisele 9092130350 Optimize migrations (#13855) 2025-04-26 09:36:17 -06:00
Tim Eisele a0b3b7335f Add .gitignore style ignoring (#13906) 2025-04-26 09:35:57 -06:00
JPVenson 5d65cfcd99 improved performance of save operations (#13889) 2025-04-26 09:32:12 -06:00
JPVenson 2ea7af777b Create directory before checking for size (#13962) 2025-04-26 09:30:57 -06:00
JPVenson 8ee358de2c Check for path overlaps (#12832) 2025-04-26 09:30:25 -06:00
Tim Eisele df5671263f Merge pull request #13847 from Shadowghost/rework-chapter-management
Rework chapter management
2025-04-26 14:01:12 +02:00
Bond-009 f35b8dd33d Merge pull request #13536 from tkloy24/13250-Extras-Delete-Whole-Folder
Fix IsInMixedFolder not being set for Extras
2025-04-26 12:07:45 +02:00
Bond-009 8f1ebfc4cd Merge pull request #13378 from felix920506/patch-1
Only run merge conflict labler action on pull requests
2025-04-26 12:06:15 +02:00
Bond-009 dbaa3e458d Merge pull request #13993 from nielsvanvelzen/api-deprecate-old-playstate
Deprecate OnPlaybackXXX API operations in favor of ReportPlaybackXXX
2025-04-26 11:28:45 +02:00
Bond-009 d62cf7f7cb Merge pull request #13981 from jellyfin/renovate/ci-deps
Update CI dependencies
2025-04-25 17:30:08 +02:00
renovate[bot] cf0220f183 Update CI dependencies 2025-04-24 18:06:11 +00:00
Teja Chundru 317d76e97c Translated using Weblate (Telugu)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/te/
2025-04-24 13:30:32 +00:00
sususu98 aebabb1580 style: fix return statement indentation in StreamInfo.cs 2025-04-24 14:25:12 +08:00
sususu98 d5402718b7 Merge branch 'jellyfin:master' into fix/strm-local-subtitle-url 2025-04-24 14:18:17 +08:00
sususu98 fd108ff528 Style: Fix indentation in StreamInfo.cs 2025-04-24 14:17:33 +08:00
Fernando Fernández c4cb41f3b2 Temporarily ignore NonTransactionalMigrationOperation warnings (#13972) 2025-04-23 21:31:03 -06:00
Niels van Velzen 32887adff3 Deprecate OnPlaybackXXX API operations in favor of ReportPlaybackXXX 2025-04-23 22:00:07 +02:00
sususu98 22ce1f25d0 refactor(StreamInfo): reorganize subtitle URL logic and conditions
# Conflicts:
#	MediaBrowser.Model/Dlna/StreamInfo.cs
2025-04-23 18:18:38 +08:00
Bond-009 fca048fe18 Merge pull request #13967 from jellyfin/renovate/z440.atl.core-6.x
Update dependency z440.atl.core to 6.21.0
2025-04-23 09:20:53 +02:00
renovate[bot] 1dd3808147 Update dependency z440.atl.core to 6.21.0 2025-04-22 17:34:25 +00:00
JPVenson a0931baa8e Add Api and startup check for sufficient storage capacity (#13888) 2025-04-20 20:06:50 -06:00
Niels van Velzen 5e4bd744c0 Return SyncPlay group info after creation, add GET group endpoint (#13935) 2025-04-20 19:40:23 -06:00
MrPlow 576f6d411a Translated using Weblate (German)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/de/
2025-04-20 13:03:46 +00:00
MrPlow 51b54f5695 Translated using Weblate (German)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/de/
2025-04-20 10:12:14 +00:00
Bond-009 74230131a1 Fix OverflowException when scanning media with a very short duration (#13949) 2025-04-19 13:08:29 -06:00
JPVenson 7df6e0b16f Add port awareness to startup server (#13913) 2025-04-19 13:08:24 -06:00
Niels van Velzen 269508be9f Fix SyncPlay WebSocket OpenAPI schemas (#13946) 2025-04-19 13:08:15 -06:00
theguymadmax 1c190f7952 Improve video resolution filtering and classification logic (#13332) 2025-04-19 10:45:19 -06:00
Nyanmisaka e84826297d Fix thumbnail extraction of mpegts videos in FFmpeg 7.1+ (#13942) 2025-04-19 10:41:30 -06:00
Bond-009 86b81c912d Merge pull request #13928 from jellyfin/renovate/libse-4.x
Update dependency libse to 4.0.12
2025-04-16 11:56:42 +02:00
renovate[bot] ccc49b109f Update dependency libse to 4.0.12 2025-04-15 17:48:45 +00:00
Tim Eisele 6e9e2f500f Fix Genre cleanup (#13916) 2025-04-14 20:43:38 -06:00
Nyanmisaka 8be8ea60f1 Add DoVi Profile 5 support for Rockchip RKMPP (#13911) 2025-04-13 07:43:58 -06:00
renovate[bot] 22c816de0a Update dependency Svg.Skia to 2.0.0.8 (#13907) 2025-04-13 07:43:44 -06:00
Tim Eisele 61cb53999e Safeguard against null value trimming in tag results (#13908) 2025-04-13 07:43:06 -06:00
Bond-009 5eefbb6bf6 Merge pull request #13905 from jellyfin/renovate/asynckeyedlock-7.x
Update dependency AsyncKeyedLock to 7.1.6
2025-04-12 16:19:45 +02:00
Bill Thornton afdde7b243 Remove the hashed password from startup users response (#13904) 2025-04-12 07:12:33 -06:00
renovate[bot] d6fbdcc0f8 Update dependency AsyncKeyedLock to 7.1.6 2025-04-12 09:14:07 +00:00
Bill Thornton 5020c09640 Merge pull request #13901 from thornbill/add-startup-name 2025-04-11 18:04:20 -04:00
Bill Thornton 874f6895a2 Add ServerName to startup configuration 2025-04-11 13:58:34 -04:00
Rafał Stępień c972047566 Add polish age ratings (#13851) 2025-04-11 10:25:53 -06:00
Bond-009 dbf0edf4f8 Merge pull request #13898 from jellyfin/renovate/fscheck.xunit-3.x
Update dependency FsCheck.Xunit to 3.2.0
2025-04-11 12:07:57 +02:00
Bond-009 4d7f85f14a Merge pull request #13897 from jellyfin/renovate/svg.skia-2.x
Update dependency Svg.Skia to 2.0.0.7
2025-04-11 12:07:37 +02:00
renovate[bot] 9ec8790faa Update dependency Svg.Skia to 2.0.0.7 2025-04-11 09:10:17 +00:00
renovate[bot] 9a806cf3a4 Update dependency FsCheck.Xunit to 3.2.0 2025-04-11 00:29:23 +00:00
Tim Eisele cad8de9701 Add Genre cleanup and fix cleanup filter queries (#13891) 2025-04-09 18:40:16 -06:00
stelle 294b2f90d1 Translated using Weblate (Malay)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ms/
2025-04-09 16:01:04 +00:00
gnattu 32fe92d8f5 Only reselect audio streams when user preference is respected (#13832) 2025-04-08 19:22:30 -06:00
Markus Prettner c152f610ce Fix negated IP addresses without subnet mask not being parsed correctly (#13854) 2025-04-08 19:21:57 -06:00
renovate[bot] 0bbc6bb31d Update dependency dotnet-ef to 9.0.4 (#13879)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-08 19:21:28 -06:00
renovate[bot] cb59a017a5 Update Microsoft to 9.0.4 (#13878)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-08 19:19:21 -06:00
JPVenson 070abcd8ff Fix InheritedParentalRatingSubValue not set (#13880) 2025-04-08 19:19:01 -06:00
Niels van Velzen 16dc1e2260 Use Guid for parentPrimaryImageItemId (#13874) 2025-04-08 14:59:21 -06:00
Nyanmisaka 98697e75ca Fix seeking beyond EOF again (#13871) 2025-04-08 14:58:55 -06:00
Bond-009 1e10cd003d Merge pull request #13869 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v3.28.15
2025-04-08 15:02:24 +02:00
baka0815 5fc1b1c862 Translate the ISO-639-2/B codes to ISO-639-2/T. (#13068)
* Translate the ISO-639-2/B codes to ISO-639-2/T.

This enables 19 additional languages to be displayed correctly.

* Convert the 2-dimensional array to a dictionary

* Added the French language to the list of ISO-639-2/B codes

* Don't change the property, use a local variable instead.

* When creating the MediaStream in the MediaStreamRepository ensure that the ISO 639-2/T (f.e. deu) code is used for the language as that is the one the .NET culture info knows.
The other code is most likely the ISO 639-2/B code (f.e. ger) which is unknown to the .NET culture info and will result in just displaying the code instead of the display name.

* Move the substitution of ISO 639-2/B to /T to the localization manager.
Some language (like Chinese) have multiple entries in the iso6392.txt file (f.e. zho|chi|zh|..., zho|chi|zh-tw|...) but the conversation between /T and /B is the same so use .TryAdd.

* Change the method definition from GetISO6392TFromB to TryGetISO6392TFromB and return true if a case was found.

* Add unit tests for TryGetISO6392TFromB.
2025-04-07 21:29:12 -06:00
renovate[bot] 4fa1a9cb97 Update github/codeql-action action to v3.28.15 2025-04-08 01:06:31 +00:00
JPVenson 77ad7f6139 Fix the migration as the new constraint now uses Value as unique key (#13867) 2025-04-07 14:42:01 -06:00
Alex 82a561b87d Add API support for ELRC word-based lyrics (#12941)
* Add API support for ELRC word-based lyrics

Adds support for word-based timestamps from within ELRC files.

* Create TimeTags object

* redo TimeTag implementation

Change TimeTag to long, redo TimeTag implementation
Make timestamp not nullable
Update MediaBrowser.Model/Lyrics/LyricLine.cs
Make TimeTag list IReadOnlyList
Remove nullable Timestamp
Update TimeTag description

Co-Authored-By: Cody Robibero <cody@robibe.ro>

* Changes to LyricLineTimeTag

Moved TimeTag to LyricLineTimeTag
Change "timestamp" to "start" for consistency
Change plural "TimeTags" to "Cues"
Change comments

* Change LyricLineTimeTag to LyricLineCue, include info about end times

* Remove width

* Remove width tag

* Rewrite cue parser and add tests

---------

Co-authored-by: Cody Robibero <cody@robibe.ro>
2025-04-07 08:59:18 -06:00
JPVenson 04ca27ad07 Fix backup not written to correct directory (#13853)
* Fix backup not written to correct directory

* Improve restore handling and only restore on actual error

* Fix first failed migration not causing a rollback
2025-04-07 08:59:00 -06:00
Bond-009 e1ef4290af Merge pull request #13863 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v3.28.14
2025-04-07 15:58:37 +02:00
renovate[bot] 1ef0a41066 Update github/codeql-action action to v3.28.14 2025-04-07 12:11:49 +00:00
Tim Eisele b65e03da9a Fix Genre type (#13862) 2025-04-07 06:11:05 -06:00
JQ fe79384cd5 Returns album artists apart from artist names when doing a lyrics search (#13852) 2025-04-06 14:18:39 -06:00
Joshua M. Boniface 2c9c9f591d Merge commit from fork
Fix not trusting all sources for forward headers if none are configured
2025-04-05 14:44:42 -04:00
Joshua M. Boniface 7d705249ca Merge commit from fork
Fix validation of API parameters passed to FFmpeg
2025-04-05 14:44:19 -04:00
Tim Eisele de3d1445c0 Fix ancestors (#13827) 2025-04-05 10:49:29 -06:00
Tim Eisele 0e7ae0e9a4 Fix indices and update of ItemValues (#13843) 2025-04-05 09:57:58 -06:00
Tim Eisele 2264d58ae7 Use subdirectories to organize extracted data (#13838)
* Use subdirectories to organize extracted data

* Apply suggestions from code review
2025-04-05 07:53:17 -06:00
HigherLevel f7021d04eb Translated using Weblate (Afrikaans)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/af/
2025-04-04 13:01:03 +00:00
Bond-009 1c2b48182a Fix ArgumentNullException on playlist creation (#13837)
mediaSourceId can be null, the IDE doesn't know this as nullable is disabled for BaseEncodingJobOptions
2025-04-03 17:44:47 -06:00
Tim Eisele d0c1ef8002 Update MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs
Co-authored-by: Cody Robibero <cody@robibe.ro>
2025-04-03 20:42:33 +02:00
timminator d1ed6593ad Make ReadInputAtNativeFramerate configurable for M3U tuner (#13773) 2025-04-03 09:18:00 -06:00
Tim Eisele 596b635511 Cleanup extracted files (#13760)
* Cleanup extracted files

* Pagination and fixes

* Add migration for attachments to MigrateLibraryDb

* Unify attachment handling

* Don't extract again if files were already extracted

* Fix MKS attachment extraction

* Always run full extraction on mks

* Don't try to extract mjpeg streams as attachments

* Fallback to check if attachments were extracted to cache folder

* Fixup
2025-04-03 09:17:14 -06:00
Tim Eisele 0bde7bae05 Only remove keyframe cache dir if it exists (#13834) 2025-04-03 08:47:31 -06:00
JPVenson a18d60d2de Trim library names (#13828) 2025-04-02 18:19:31 -06:00
Tim Eisele 0573999d5e Import Keyframes into database (#13771)
* Migrate keyframe data into database

* Clear database table before import to handle failed migrations
2025-04-02 18:06:40 -06:00
gnattu 49ac705867 Improve dynamic HDR metadata handling (#13277)
* Add support for bitstream filter to remove dynamic hdr metadata

* Add support for ffprobe's only_first_vframe for HDR10+ detection

* Add BitStreamFilterOptionType for metadata removal check

* Map HDR10+ metadata to VideoRangeType.cs

Current implementation uses a hack that abuses the EL flag to avoid database schema changes. Should add proper field once EFCore migration is merged.

* Add more Dolby Vision Range types

Out of spec ones are problematic and should be marked as a dedicated invalid type and handled by the server to not crash the player.

Profile 7 videos should not be treated as normal HDR10 videos at all and should remove the metadata before serving.

* Remove dynamic hdr metadata when necessary

* Allow direct playback of HDR10+ videos on HDR10 clients

* Only use dovi codec tag when dovi metadata is not removed

* Handle DV Profile 7 Videos better

* Fix HDR10+ with new bitmask

* Indicate the presence of HDR10+ in HLS SUPPLEMENTAL-CODECS

* Fix Dovi 8.4 not labeled as HLG in HLS

* Fallback to dovi_rpu bsf for av1 when possible

* Fix dovi_rpu cli for av1

* Use correct EFCore db column for HDR10+

* Undo outdated migration

* Add proper hdr10+ migration

* Remove outdated migration

* Rebase to new db code

* Add migrations for Hdr10PlusPresentFlag

* Directly use bsf enum

* Add xmldocs for SupportsBitStreamFilterWithOption

* Make `VideoRangeType.Unknown` explicitly default on api models.

* Unset default for non-api model class

* Use tuples for bsf dictionary for now
2025-04-02 18:06:02 -06:00
KGT1 9c7cf808aa allow admin users to get Splashscreen even when disabled (#13825)
refactor
2025-04-02 16:32:53 -06:00
Niels van Velzen 767ee2b5c4 Merge pull request #13822 from thornbill/missing-system-info
Add missing public properties to SystemInfo response
2025-04-01 20:04:50 +02:00
Tim Eisele 086fbd49cf Cleanup ItemFields (#13818)
* Cleanup ItemFields

* Update MediaBrowser.Model/Querying/ItemFields.cs
2025-03-31 17:46:21 -06:00
KGT1 14b785d188 Preserve SplashscreenLocation when updating branding config (#13756)
* add BrandingOptionsDto and add branding endpoints

* refactor new HttpGet Configuration Branding into existing API calls

* Add BrandingOptions to _ignoredConfigurations for openAPI

* rename BrandOptionsDto to BrandingOptionsDto
2025-03-31 17:46:01 -06:00
Dmitry Lyzo 940c4e8ba8 Add Dolby Vision tests for Tizen (#12670)
* Fix Tizen H264 profiles

* Add Dolby Vision tests for Tizen

* Allow Dolby Vision fallback layer on Tizen 3+
2025-03-31 17:45:14 -06:00
Fernando Fernández 2b742a5966 Reduce SKImage to SKBitmap conversion, high quality canvas (#5366) 2025-03-31 17:45:03 -06:00
Tim Eisele 5769c398c6 Fix Tmdb external URL generation (#13817)
* Fix Tmdb external URL generation

* Update MediaBrowser.Providers/Plugins/Tmdb/TmdbExternalUrlProvider.cs
2025-03-31 17:44:06 -06:00
gnattu 4a4fef830e Explicitly set default value for enums used in API models (#13821)
Enums in response model with no nullability or default value will make the API very fragile as each extension to the enum will break the API for some clients, but a lot of enums actually do have an unknown value which should be used as a default. This set all model properties that are non-nullable using an enum that has an Unknown member in 10.10, except MediaStream.VideoRangeType which is refactored in #13277
2025-03-31 17:43:31 -06:00
Bond-009 e9729a536f Use pattern matching for null checks (#13793)
Fix the few that slipped through
2025-03-31 17:38:25 -06:00
Bill Thornton d9a79b5eef Add missing public properties to SystemInfo response 2025-03-31 18:26:34 -04:00
Tim Eisele 3fc3b04daf Rework parental ratings (#12615) 2025-03-30 21:51:54 -06:00
Quyet Vu 2ace880345 Fix playlist order (#13730)
* Fix playlist order move

* Remove extra space

* Added more test cases

* Change namespace to file-scoped
2025-03-30 21:39:51 -06:00
Tim Eisele d7b786e777 Fix MoveTrickplayFiles migration (#13807) 2025-03-30 21:38:50 -06:00
renovate[bot] 150094e3a4 Update dependency z440.atl.core to 6.20.0 (#13811)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-30 21:38:36 -06:00
Tim Eisele 824bafc32d Fix StreamInfo.ToUrl (#13808) 2025-03-30 21:37:58 -06:00
JPVenson 90a6cca92b Library.db migration impovements (#13809)
* Fixes cleanup of wrong table in migration

* use dedicated context for each step

* Use prepared Context

* Fix measurement of UserData migration time

* Update logging and combine cleanup to its own stage

* fix people map not logging
migrate only readonly database

* Add id blacklisting in migration to avoid duplicated log entires
2025-03-30 21:36:27 -06:00
Bond-009 476a0d6932 Merge pull request #13194 from gnattu/av1-videotoolbox
Enable VideoToolbox AV1 decode
2025-03-30 23:12:53 +02:00
JPVenson d75216cf3a Fixes cleanup of wrong table in migration (#13796) 2025-03-29 10:00:19 -06:00
LJQ c906c1ca0d rebase 2025-03-29 02:33:58 +08:00
gnattu c69e9d8f2c Gate the macOS only functions 2025-03-28 21:30:39 +08:00
gnattu 384134fd25 Use string literal 2025-03-28 21:22:00 +08:00
Johannes Heuel 2c499d1e86 feat: allow grouping shows into collections (#13236)
* feat: allow grouping shows into collections

* add pre-startup routine to rename EnableGroupingIntoCollections

* Update Jellyfin.Server/Migrations/PreStartupRoutines/RenameEnableGroupingIntoCollections.cs
2025-03-28 06:54:12 -06:00
Tim Eisele 9657708b38 Reduce allocations, simplifed code, faster implementation, included tests - StreamInfo.ToUrl (#9369)
* Rework PR 6168

* Fix test
2025-03-28 06:51:44 -06:00
Dmitry Lyzo cb931e0062 Add profile condition to limit the number of streams (#13583) 2025-03-28 06:51:22 -06:00
Shadowghost 3df7d7a809 Add validation for level input 2025-03-28 08:21:37 +01:00
Shadowghost 1fcc79316d Rename ValidationRegex to ContainerValidationRegex 2025-03-28 08:21:37 +01:00
Shadowghost 6d7950bddc Fix container parameter validation 2025-03-28 08:21:37 +01:00
JPVenson a2ef0e4abe Fix trusting all sources for forward headers if none are configured 2025-03-28 08:08:18 +01:00
Niels van Velzen 7f5cc544df Merge pull request #13790 from crobibero/fix-build
Fix build and tests
2025-03-28 07:21:59 +01:00
Cody Robibero 15465afd8e Revert changes to DirectoryService 2025-03-27 21:13:27 -06:00
Cody Robibero 6c46b06c75 Fix merged namespace error 2025-03-27 19:46:45 -06:00
Michael McElroy f02190c394 Fix for Issue #12142: Fix ExtraRuleResolver filtering out top level folders (#12170)
* Fix ExtraRuleResolver to stop filtering out libraries where the name of the base folder matches an 'videos extras' rule with an ExtraRuleType of DirectoryName

Currently the ExtraRuleResolver code doesn't know anything about the root folder of the current library. As a result, when we're attempting to add items in a library where the root folder has a name with a match in Emby.Naming.Common.NamingOptions.VideoExtraRules, the entire library is being ignored as a Video Extras folder.

Need to pass in the root folder of the current library to compare to the path of the current item being evaluated, and if we match the current item's folder to the root folder, then we ignore the ExtraRules with a type of DirectoryName and we continue to scan deeper in the library. Filters still apply to subfolders within the library itself.

* Update CONTRIBUTORS.md

* Update Emby.Naming/Video/ExtraRuleResolver.cs

* Update ExtraTests.cs

Add tests for this fix.

Also add missing tests in TestKodiExtras, TestExpandedExtras, and TestSample, and expanded TestDirectories into TestDirectoriesAudioExtras and TestDirectoriesVideoExtras. There were no checks for the theme-music folder name previously.

* Update ExtraTests.cs

Removed unnecessary "using System"

* In MediaBrowser.Model, upgrade System.Text.Json from 8.0.3 (vulnerable - high risk) to 8.0.4

* Update ExtraTests.cs

Remove empty lines in usings

* Revert "In MediaBrowser.Model, upgrade System.Text.Json from 8.0.3 (vulnerable - high risk) to 8.0.4"
2025-03-27 18:18:19 -06:00
Cody Robibero 88ceaa39b0 Implement limiting caches (#13605)
* Implement basic expiring cache for LibraryManager

* Add expiring cache to more places

* Rider why

* Make DirectoryService caches static

* Use FastConcurrentLru

* Reduce default cache size

* Simplify DirectoryService caches

* Make directory service cache size at least 128
2025-03-27 18:16:54 -06:00
gnattu e9331fe9d7 Improve SkiaEncoder's font handling (#13231)
* Improve SkiaEncoder's font handling

Our previous approach didn’t work with some complex library names, even when the required fonts were present, because the font handling logic was too simplistic. Modern Unicode and the fonts have become quite complex, making it challenging to implement it correctly. This improved implementation still isn’t the most correct way, but it’s better than it used to be. It now falls back to multiple fonts to find the best one and also handles extended grapheme clusters that were incorrectly processed before.

* Fix space

* Remove redundant comment

* Make _typefaces an array

* Make Measure and Draw text function name clear

* Fix rename
2025-03-27 18:07:54 -06:00
Kevin Jilissen 9f70578997 Add channel queries to series (#13356)
Currently, the IChannel interface can deliver channel result folders which are interpreted as series and seasons. However, Jellyfin does not query for the contents of these folders when viewing said serie of season. This results in empty series in the API.
2025-03-27 18:06:10 -06:00
Jacob Warren 07f07ba6bc Fix Sort by Year Bug (#12101) (#13733) 2025-03-27 18:05:03 -06:00
Nyanmisaka a123a2cb22 Fix validation of VAAPI/QSV render node path (#13786)
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2025-03-27 17:59:32 -06:00
timminator 181a37a8cd Fix consumer count off by one when closing a browser tab with a livestream that is transcoding (#13220)
Rework Implementation
Fix review issues
Add missing nullorempty check
Fix closely related #13721
2025-03-27 17:59:08 -06:00
Tobias Kloy 7717d2e261 Avoid multiple enumerations 2025-03-27 17:51:31 +01:00
Tobias Kloy b108a8cfc5 Fix IsInMixedFolder not being set for Extras in mixed subfolders 2025-03-27 17:51:31 +01:00
theguymadmax ae4b35da46 Include UnratedType in LibraryDb migration query (#13783) 2025-03-27 10:43:39 -06:00
theguymadmax f6b98d0faf Add eac3 as audio name format (#13784) 2025-03-27 10:43:25 -06:00
JPVenson 9e4abb7319 Add override for migration if old library still exists (#13779) 2025-03-27 05:34:59 -06:00
JQ d06ce1f1e0 Fix only returning one item from /Item/Latest api. (#12492)
* Updated to EFcore

* Remove unused using

* Dont use DateCreated not from episode type or music type

* use TranslateQuery to filter out instead and then do the grouping and retrival of min and max datecreated instead

* Album also
2025-03-26 20:26:47 -06:00
baka0815 cafb7cd002 Change the order of the iso6392.txt file (#13314)
* Change the order of the ISO-639-2 list

Now the ISO 639-2/T (terminological) comes first (which is the same as the ISO 639-3 code) and the second column is for the ISO 639-2/B (bibliograpihc) code.
The terminological code is derived from the native name for the language while the bibliographic code is more of a "legacy feature" where the code is derived from the English name for the language.

The format of the file is now

ISO 639-2/T (or ISO 639-3) | ISO 639-2/B (where applicable) | ISO 639-1 (two-letter code) | English name | French name

* Sort the ISO list by the first column
2025-03-26 20:25:53 -06:00
Dmitry Lyzo 777e0823ba Extract container, video and audio compatibility checks (#12678)
* Extract container, video and audio compatibility checks

* Extract audio compatibility checks

* Extract CheckVideoConditions

* Simplify direct audio stream check
2025-03-26 20:24:16 -06:00
JPVenson 296b17bf44 Feature/backup on migration (#13754)
* Added generalised backup for migrations

* Added backup strategy to MigrateLibraryDb

* Added missing namespace

* Fix merge issues

* Fixed style issue

* change fast backup key to timestamp

* Update src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/SqliteDatabaseProvider.cs

* Update Fields

* applied review comments
2025-03-26 20:23:36 -06:00
renovate[bot] 08dbb5c842 Update CI dependencies (#13766) 2025-03-26 06:02:58 -06:00
Cody Robibero d848faeb75 Merge pull request #13589 from JPVenson/feature/DatabaseRefactor
[Feature] Database code refactor
2025-03-25 21:34:26 -06:00
Cody Robibero 1b388d7296 Clean up csproj 2025-03-25 21:25:27 -06:00
JPVenson bfff1b9be2 Fix reference 2025-03-25 16:55:26 +01:00
JPVenson 42bdb22bfb Fixed namespaces 2025-03-25 16:45:00 +01:00
JPVenson 160020c551 WIP fixed namespaces 2025-03-25 15:30:22 +00:00
JPVenson 7cd059c033 Merge remote-tracking branch 'origin/master' into feature/DatabaseRefactor 2025-03-25 15:13:32 +00:00
JPVenson 850f1c79f1 Merge branch 'master' into feature/DatabaseRefactor 2025-03-25 15:12:48 +00:00
Niels van Velzen 035ecbdde3 Merge pull request #13769 from JPVenson/Bugfix/FixCleanupTaskNotAwaiting
Fix Cleanup task not awaiting async methods
2025-03-24 19:15:10 +01:00
Niels van Velzen 2c0ecd6775 Merge pull request #13764 from JPVenson/bugfix/FixOpenApiFor503
Add OpenAPI spec for #12880
2025-03-24 19:14:41 +01:00
JPVenson cd5f18a084 Fix Cleanup task not awaiting async methods 2025-03-24 17:23:16 +00:00
JPVenson daf8eca8ae update header api description and values 2025-03-24 16:56:36 +00:00
Niels van Velzen 8680170706 Merge pull request #13616 from Lampan-git/fix_people_role
Include PeopleBaseItemMap in GetPeople to inlcude Role and SortOrder
2025-03-24 15:29:28 +01:00
Bond-009 480244e111 Merge pull request #13691 from NooNameR/noonamer/add_pattern_search
Add ability to provide search pattern to GetFiles
2025-03-24 14:15:42 +01:00
Bond-009 64a5a8419d Merge pull request #13765 from JPVenson/bugfix/DisableFlakyTests
Disabled flaky tests
2025-03-24 14:09:03 +01:00
Bond-009 592f278ee2 Merge pull request #13759 from jellyfin/renovate/ci-deps
Update danielpalme/ReportGenerator-GitHub-Action action to v5.4.5
2025-03-24 11:23:26 +01:00
JPVenson ef7f6fc8a9 fixed typo 2025-03-24 10:16:25 +00:00
JPVenson 8d49a396e8 Fixed readme 2025-03-24 10:15:28 +00:00
JPVenson 8e9b57aea9 Fixed naming scheme 2025-03-24 10:14:16 +00:00
JPVenson ea8f1ffb7c renamed SqLite to Sqlite 2025-03-24 10:07:52 +00:00
JPVenson e4b11c664c Disabled flaky tests 2025-03-24 08:38:17 +00:00
JPVenson a026a3722c Clarified retry value type 2025-03-24 08:31:52 +00:00
JPVenson aa4936c59c Added OpenAPI spec for #12880 2025-03-24 08:27:21 +00:00
JPVenson 3c2d3ac18b Update src/Jellyfin.Database/readme.md
Co-authored-by: Tim Eisele <Tim_Eisele@web.de>
2025-03-24 09:19:00 +01:00
JPVenson 671d801d9f #13540 Fixed (#13757)
#13508 Partially fixed

Co-authored-by: JPVenson <github@jpb.software>
2025-03-23 19:52:34 -06:00
Niels van Velzen 516754c2a6 Merge pull request #13761 from Shadowghost/fix-runtime
Add missing singleton
2025-03-23 23:17:37 +01:00
Shadowghost ea6130b354 Add missing singleton 2025-03-23 23:10:16 +01:00
renovate[bot] b3b2da681f Update danielpalme/ReportGenerator-GitHub-Action action to v5.4.5 2025-03-23 20:36:11 +00:00
Joshua M. Boniface 35f8720251 Merge pull request #12880 from JPVenson/feature/10.10/DetachedMigration
Added Setup overlay app to communicate status of startup
2025-03-23 12:41:28 -04:00
Tim Eisele dfb485d1f2 Rework season folder parsing (#11748) 2025-03-23 10:05:40 -06:00
Tim Eisele 8db6a39e92 Remove all DB data on item removal, delete internal trickplay files (#13753) 2025-03-23 10:05:13 -06:00
Adil 8b6aec7ce5 Rename Pakistan to select dropdown accessible name (#13752) 2025-03-23 08:31:26 -06:00
Fernando Fernández c77a0719c2 Clear dictionaries when not needed, use set for finding existing base items (#13749) 2025-03-22 18:30:32 -06:00
timminator 350983e03c Fix OnPlaybackStopped task erroring out (#13226) 2025-03-20 07:10:48 -06:00
Lampan-git aabaf1a656 Backport pull request #13720 from jellyfin/release-10.10.z
Fix regression where "Search for missing metadata" not handling cast having multiple roles

Original-merge: 91ca81eca7

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-03-20 05:55:51 -04:00
Bond-009 69b07c9f31 Merge pull request #13724 from theguymadmax/imdb-person-url
Fix IMDb URL for People
2025-03-20 10:44:56 +01:00
Bond-009 c6178c63bf Merge pull request #13738 from jellyfin/renovate/ci-deps
Update CI dependencies
2025-03-19 22:13:13 +01:00
renovate[bot] 3eca221cc6 Update CI dependencies 2025-03-19 18:27:37 +00:00
renovate[bot] 11fbca45ff Update actions/download-artifact action to v4.2.0 (#13734)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-18 17:41:02 -06:00
timminator c24d0c1240 Respect preferred language when selecting forced subtitles (#13098)
Rework subtitle selection logic
2025-03-18 17:40:06 -06:00
Cody Robibero 85b5bebda4 Add fast-path to getting just the SeriesPresentationUniqueKey for NextUp (#13687)
* Add more optimized query to calculate series that should be processed for next up

* Filter series based on last watched date
2025-03-18 17:37:04 -06:00
Blackspirits e1392ca1b6 Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt_PT/
2025-03-18 16:01:01 -04:00
Thunderstrike116 62fc2b8d0d Translated using Weblate (Greek)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/el/
2025-03-17 06:01:02 -04:00
Bond-009 2d9549dbbc Merge pull request #13727 from jellyfin/renovate/ci-deps
Update actions/setup-dotnet action to v4.3.1
2025-03-17 09:26:59 +01:00
renovate[bot] 747fa4699a Update actions/setup-dotnet action to v4.3.1 2025-03-17 04:59:58 +00:00
theguymadmax 407935d181 Fix IMDb URL for People 2025-03-16 19:00:00 -04:00
Joesph boukolos 6104d8d5f9 Translated using Weblate (Esperanto)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/eo/
2025-03-16 02:24:41 -04:00
Cody Robibero 8a6d1402d2 Merge pull request #13493 from gnattu/fix-subnet-check-master 2025-03-15 08:35:55 -06:00
Bond-009 e684f26c97 Add start index to /Programs/Recommended endpoint (#13696) 2025-03-15 08:35:08 -06:00
Lampan-git cf1f251f2a Preserve null sortOrder during migration 2025-03-14 21:07:34 +01:00
Tim Eisele 0eed5ee79b Fix build and tests (#13718) 2025-03-14 08:17:18 -06:00
renovate[bot] 7d6bf5cb0d Update dependency python to 3.13 (#13701)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-13 19:36:41 -06:00
renovate[bot] 14e3b2214a Update dependency dotnet-ef to 9.0.3 (#13703)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-13 19:36:31 -06:00
renovate[bot] b346d12e1c Update Microsoft to 9.0.3 (#13702)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-13 19:36:21 -06:00
Joshua M. Boniface 79437f85c5 Merge pull request #13175 from Shadowghost/external-url-providers
Migrate to IExternalUrlProvider
2025-03-13 21:08:18 -04:00
Thunderstrike116 8cb5ea60d6 Translated using Weblate (Greek)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/el/
2025-03-13 07:47:27 -04:00
gnattu cbca153132 More typos 2025-03-13 06:27:12 +08:00
Joshua M. Boniface f87150bb3d Merge pull request #9560 from IDisposable/sort-nfo-data
Sort embedded collections in Nfo files
2025-03-12 18:14:04 -04:00
Marc Brooks a5f3d942f6 Merge branch 'master' into sort-nfo-data 2025-03-12 10:33:27 -05:00
gnattu 237e7bd44b Backport pull request #13694 from jellyfin/release-10.10.z
Clone fallback audio tags instead of use ATL.Track.set

Original-merge: 9eb2044eae

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-03-12 08:40:33 -04:00
Bond-009 28fc0e4796 Merge pull request #13690 from theguymadmax/add-cleanName
Include CleanName in LibraryDb migration query
2025-03-12 13:32:24 +01:00
Thunderstrike116 490e087b46 Translated using Weblate (Greek)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/el/
2025-03-12 06:53:53 -04:00
denys.kozhevnikov 4325c67e89 Add ability to provide search pattern 2025-03-11 21:04:12 +00:00
theguymadmax f1dd065eca Include CleanName in LibraryDb migration query 2025-03-10 11:50:28 -04:00
congerh de5b6470be Backport pull request #13659 from jellyfin/release-10.10.z
Upgrade LrcParser to 2025.228.1

Original-merge: ae6a7acf14

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-03-10 06:56:51 -04:00
Bond-009 6331de2e13 Merge pull request #13406 from Shadowghost/extract-trickplay-master
Extract trickplay files into own subdirectory
2025-03-10 11:00:12 +01:00
Bond-009 9c5a304142 Merge pull request #13675 from te9c/master
Include SortName in LibraryDb migration query
2025-03-10 10:52:30 +01:00
Bond-009 ea8be12dea Merge pull request #13683 from jellyfin/renovate/z440.atl.core-6.x
Update dependency z440.atl.core to 6.19.0
2025-03-10 10:50:49 +01:00
Bond-009 ab99572eb2 Merge pull request #13671 from jellyfin/renovate/ci-deps
Update CI dependencies
2025-03-10 10:48:26 +01:00
Thunderstrike116 0d7eb48930 Translated using Weblate (Greek)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/el/
2025-03-09 16:25:43 -04:00
Thunderstrike116 8ef7b4f9b5 Translated using Weblate (Greek)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/el/
2025-03-09 16:08:08 -04:00
renovate[bot] f5adbc0296 Update CI dependencies 2025-03-09 17:00:13 +00:00
renovate[bot] cb650c69b8 Update dependency z440.atl.core to 6.19.0 2025-03-09 12:45:55 +00:00
Roman Dordzheev 70b8fa73f0 Include SortName in LibraryDb migration query 2025-03-08 13:55:21 +03:00
Lampan-git 7abb94d8a2 Move mapping assignment to Map 2025-03-05 22:37:18 +01:00
Lampan-git e137a06362 Change PeopleBaseItemMap query from GroupJoin to Include 2025-03-05 16:59:49 +01:00
Lampan-git 4e3d7383f5 Change GetPeople PeopleBaseItemMap code to query 2025-03-05 16:59:31 +01:00
Troj@ ab369f27f7 Translated using Weblate (Belarusian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/be/
2025-03-04 14:47:09 -05:00
Troj@ 728819780a Translated using Weblate (Belarusian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/be/
2025-03-04 08:58:12 -05:00
IDisposable efb901c369 Backport pull request #13639 from jellyfin/release-10.10.z
Support more rating formats

Original-merge: 4f94d23011

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-03-02 11:23:02 -05:00
Lampan-git aad7506e85 Backport pull request #13618 from jellyfin/release-10.10.z
Include Role and SortOrder in MergePeople to fix "Search for missing metadata"

Original-merge: fcdef875a2

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-03-02 11:23:01 -05:00
Bond-009 d116f989a8 Merge pull request #13643 from l2dy/patch-1
Fix possible NullReferenceException in playlist warning
2025-03-02 17:21:58 +01:00
Zero King 82b3135dd9 Fix possible NullReferenceException in playlist warning 2025-03-02 01:03:55 +08:00
Bond-009 a8d9607298 Merge pull request #13608 from jellyfin/renovate/z440.atl.core-6.x
Update dependency z440.atl.core to 6.18.0
2025-03-01 16:01:32 +01:00
JPVenson feea5af2f3 Merge remote-tracking branch 'jellyfinorigin/master' into feature/DatabaseRefactor 2025-03-01 14:16:49 +00:00
JPVenson a6b4d124d7 Replicated changes made from #13492 2025-03-01 14:16:02 +00:00
Bond-009 04f7cd6011 Merge pull request #13492 from gnattu/dont-use-returning-clause
Don't use RETURNING clause with EFCore
2025-03-01 14:54:51 +01:00
Bond-009 710c253318 Merge pull request #13606 from nielsvanvelzen/goodbye-wal
Remove deprecated GetWakeOnLanInfo endpoint
2025-03-01 14:53:19 +01:00
Marc Brooks f035b11625 Better exception message when folders or folder items are missing (#13632)
Emit the not-found Id in the exception for easier diagnosis
2025-02-28 23:01:21 -07:00
Dominik Krivohlavek 93dd5551df Add support for reading and storing Recording MBIDs from file metadata (#12173)
* Add recording metadata provider

* Add recording MBID

* Save recording MBID during probing

* Set recording ID in probe result normalizer

* Add recording external media type

* Reimplement after changes in upstream

* Rename variable

* Rename variable

* Revert "Set recording ID in probe result normalizer"

This reverts commit 9dd18c8aba3f970a5816a13a33acf3d58b0e440f.

* Fix setting provider ID

* Simplify code

* Fix comment

* Add missing using
2025-02-28 23:00:52 -07:00
Bond-009 f6603018d6 Merge pull request #13625 from jellyfin/renovate/ci-deps
Update actions/download-artifact action to v4.1.9
2025-02-28 21:51:56 +01:00
Balázs Meskó 0803600afd Translated using Weblate (Hungarian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hu/
2025-02-26 06:01:18 -05:00
renovate[bot] c38e887ea5 Update actions/download-artifact action to v4.1.9 2025-02-26 00:31:28 +00:00
Bond-009 1131b051d8 Backport pull request #13601 from jellyfin/release-10.10.z
Delete children from cache on parent delete

Original-merge: 767a5e6193

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-25 15:32:03 -05:00
Bond-009 33e8c18136 Backport pull request #13593 from jellyfin/release-10.10.z
Wait for ffmpeg to exit on Windows before we try deleting the concat file

Original-merge: 346f36bc09

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-25 15:32:02 -05:00
Shadowghost 06be4998e1 Backport pull request #13611 from jellyfin/release-10.10.z
Remove empty ParentIndexNumber workaround

Original-merge: 1daf761aec

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-25 15:26:47 -05:00
Lampan-git d28ee96f06 Include PeopleBaseItemMap in GetPeople 2025-02-25 18:10:50 +01:00
Marc Brooks 114591c1aa Clean up usings and honor SortName 2025-02-25 01:51:38 -06:00
Jxiced e7bc86ebb8 Move throw into interface to use in wizard, check for null and invalid username. 2025-02-23 22:16:35 +00:00
millallo 068bc68764 Translated using Weblate (Italian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/it/
2025-02-23 07:55:12 -05:00
renovate[bot] 7f8eb179a6 Update dependency z440.atl.core to 6.18.0 2025-02-23 12:38:16 +00:00
Jxiced 7aa96dfc20 Update contributors. 2025-02-22 22:34:41 +00:00
Tim Eisele 260f1323d8 Apply suggestions from code review
Co-authored-by: Cody Robibero <cody@robibe.ro>
2025-02-22 18:59:37 +01:00
Bond-009 10c6266989 Merge pull request #13603 from jellyfin/renovate/ci-deps
Update CI dependencies
2025-02-22 17:01:14 +01:00
Niels van Velzen d18066f0f2 Remove GetMacAddresses from NetworkManager 2025-02-22 10:27:42 +01:00
Niels van Velzen 83b2c47237 Remove deprecated GetWakeOnLanInfo endpoint 2025-02-22 10:23:33 +01:00
Jxiced 70d07b830d Prevent whitespaces in username during wizard setup. 2025-02-21 21:19:20 +00:00
renovate[bot] a4aefc8a80 Update CI dependencies 2025-02-21 20:25:39 +00:00
Bond-009 a9f84b92df Merge pull request #13584 from jellyfin/renovate/ci-deps
Update appleboy/ssh-action action to v1.2.1
2025-02-21 16:06:20 +01:00
JPVenson 8c0b0d9102 Merge remote-tracking branch 'jellyfinorigin/master' into feature/10.10/DetachedMigration 2025-02-21 11:08:09 +00:00
JPVenson 963f2357a9 simplified logfile path 2025-02-21 11:06:28 +00:00
JPVenson 7735aafef5 renaming of jfHost
usings cleanup
2025-02-21 11:05:47 +00:00
JPVenson a05b3be1b3 Fixed nullability on startupService 2025-02-21 11:00:01 +00:00
Shadowghost 5ff2767012 Use TryGetProviderId where possible 2025-02-21 11:58:46 +01:00
theguymadmax 7ca09c4081 Backport pull request #13594 from jellyfin/release-10.10.z
Fix 4K filtering when grouping movies into collections

Original-merge: 317d7a9f4f

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-21 05:39:38 -05:00
JPVenson 05f5d19ff4 fixed new project paths 2025-02-20 19:56:59 +00:00
Bond-009 51e0ce7ea4 Merge pull request #13556 from Jxiced/master
Don't allow usernames to have leading or trailing spaces
2025-02-20 12:04:43 +01:00
JPVenson 3e223ead1e Fixed references for database projects 2025-02-20 10:02:47 +00:00
JPVenson 69e3e4c468 Fixed readme for migrations 2025-02-20 09:59:21 +00:00
JPVenson 44dfe554a8 Moved Database projects under /src
removed old pgsql references
2025-02-20 09:55:02 +00:00
Bond-009 0dbd875dd0 Merge pull request #13567 from jellyfin/renovate/z440.atl.core-6.x
Update dependency z440.atl.core to 6.17.0
2025-02-20 10:36:31 +01:00
Shadowghost 5303445c9b Migrate to IExternalUrlProvider 2025-02-20 10:13:27 +01:00
JPVenson f07e1f4aae Reverted Comparison code for name check 2025-02-19 18:30:18 +00:00
JPVenson d8030147ff Merge remote-tracking branch 'jellyfinorigin/master' into feature/DatabaseRefactor 2025-02-19 18:25:00 +00:00
JPVenson ddc20b74bf Removed pgsql from refactor 2025-02-19 18:21:23 +00:00
JPVenson 8b07c1f53d Fixed gitignore for pgsql data 2025-02-19 15:38:32 +00:00
renovate[bot] a085b90e05 Update appleboy/ssh-action action to v1.2.1 2025-02-19 12:53:13 +00:00
Cody Robibero 712908d53c Revert nullability of MediaStream.IsHearingImpaired (#13573) 2025-02-17 19:20:18 -07:00
renovate[bot] 523123dd36 Update dependency z440.atl.core to 6.17.0 2025-02-16 16:26:43 +00:00
pbf801 03a2b2f2e8 Translated using Weblate (Catalan)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ca/
2025-02-16 06:01:18 -05:00
Cody Robibero 06527fae6e Disallow incremental updates to JellyfinDbModelSnapshot (#13564) 2025-02-15 18:33:45 -07:00
Bond-009 66e571cd97 Merge pull request #13553 from crobibero/efcore-livetv-epg
Change BaseItemEntity ChannelId to nullable Guid
2025-02-15 19:21:16 +01:00
Jxiced 84450bb297 Update Jellyfin.Server.Implementations/Users/UserManager.cs
Co-authored-by: gnattu <gnattu@users.noreply.github.com>
2025-02-14 18:13:05 +00:00
Jxiced b5fcbfc15e Update test cases. 2025-02-14 17:49:25 +00:00
Jxiced 237c1d9b97 Update regex and revert previous changes to ThrowIfInvalidUsername. 2025-02-14 17:46:23 +00:00
Jxiced a0ab0eb875 Update ThrowIfInvalidUsername to include whitespaces. 2025-02-14 17:01:01 +00:00
Bond-009 2db0750abb Make the JsonConverters for delimited arrays more generic (#13396)
* Make the JsonConverters for delimited arrays more generic

Also adds some tests for serialization (with different types) as we didn't have any before.

* Ignore warnings
2025-02-13 20:24:55 -07:00
choyakawa fb69b976bf Fix the issue where the external audio track always defaults. (#13132) 2025-02-13 20:24:39 -07:00
gnattu fa97e8e183 Write only for query columns to EFCore db (#13542)
* Write only for query columns to EFCore db.

We currently don't write the columns that do not exist on the BaseItem class definition in db. However, columns like `CleanName` is still useful and being used by internal queries and current behavior would cause such query to return nothing.

The only exception is the UserDataKey which is not even being used for internal query that can be omitted.

* Update comment
2025-02-13 20:19:24 -07:00
Cody Robibero debc499711 Change BaseItemEntity ChannelId to nullable Guid 2025-02-13 20:17:25 -07:00
renovate[bot] b2a2fd6fcc Update danielpalme/ReportGenerator-GitHub-Action action to v5.4.4 (#13528)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-13 19:13:40 -07:00
renovate[bot] 475bfd3e32 Update Microsoft (#13534)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-13 19:13:22 -07:00
renovate[bot] fb9f983d20 Update dependency dotnet-ef to 9.0.2 (#13548)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-13 19:13:03 -07:00
gnattu 1ebef57508 Backport pull request #13532 from jellyfin/release-10.10.z
Fix image encoding concurrency limit

Original-merge: 3f539472f3

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-13 09:49:58 -05:00
Bond-009 17e78c0d40 Merge pull request #13539 from gnattu/mimic-old-get-item-value-names
Simulate old GetItemValueNames behavior
2025-02-13 13:37:05 +01:00
Cody Robibero dd7a804cfb Merge pull request #13516 from tkloy24/13510-Search-Results-Case-Insensitive-For-People
Fix Search results are case-sensitive for people
2025-02-12 07:55:17 -07:00
gnattu d2e7ab1c1a Simulate old GetItemValueNames behavior
The GetItemValueNames function in the old implementation was intended to retrieve the original value rather than the cleaned value. The old implementation lacked a clear specification regarding which value to return for the non-cleaned value in a group and relied on an undefined behavior of SQLite, and this implementation assumes the first one is the desired one.
2025-02-11 11:45:53 +08:00
Loris Laera f12acb014a Translated using Weblate (Luxembourgish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/lb/
2025-02-10 11:01:19 -05:00
Thadah D. Denyse b91f63ce8b Translated using Weblate (Basque)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/eu/
2025-02-10 11:01:19 -05:00
Abdullah Khaled 2b5cb5f9f4 Translated using Weblate (Arabic)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ar/
2025-02-10 11:01:19 -05:00
Bond-009 dc654065f2 Merge pull request #13527 from Bond-009/fixbuildagain
Rename CreateOrUpdateItems back to CreateItems
2025-02-10 12:31:47 +01:00
Bond-009 ccaaaca712 Merge pull request #13521 from jellyfin/renovate/z440.atl.core-6.x
Update dependency z440.atl.core to 6.16.0
2025-02-10 12:03:03 +01:00
Bond_009 ce76817020 Rename CreateOrUpdateItems back to CreateItems
Reverts the name change of this function made in the EFCore PR. This hopefully
reduces the amount of merge conflicts while backporting and makes it consistent
with the CreateItem function.
2025-02-09 18:30:53 +01:00
IDisposable c9c90050d9 Backport pull request #13504 from jellyfin/release-10.10.z
Fix LiveTV Guide Backdrop image not updating

Original-merge: 8544e7fc72

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-09 12:22:49 -05:00
Shadowghost 9e13003fbb Backport pull request #13469 from jellyfin/release-10.10.z
Fix SchedulesDirect image prefetching

Original-merge: 21e398ba0c

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-09 12:22:48 -05:00
elfalem ba46608ffe Backport pull request #12721 from jellyfin/release-10.10.z
Skip allowed tags check for parents of an item

Original-merge: d1fbdcee34

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-09 12:19:51 -05:00
renovate[bot] b6dad55ad3 Update dependency z440.atl.core to 6.16.0 2025-02-09 16:52:53 +00:00
renovate[bot] 6922fd0a38 Update github/codeql-action action to v3.28.9 (#13517)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-09 09:50:12 -07:00
gnattu 7a5a4ad7da Handle empty image lists gracefully in SplashscreenPostScanTask (#13498)
The current linq will just throw when there is no image candidates. Just pass empty lists to `CreateSplashscreen` as this case is already handled there.
2025-02-09 09:45:16 -07:00
Joshua M. Boniface 075fec6fc6 Remove check-backport CI action (#13523)
This has not worked reliably in a long time, and results in the majority
of PRs having a failing CI status. Just remove it; we'll handle
backports manually as needed.
2025-02-09 09:30:34 -07:00
Loris Laera 75c0a7a107 Added translation using Weblate (Luxembourgish) 2025-02-09 10:13:07 -05:00
Thadah D. Denyse e1dd2dce92 Translated using Weblate (Basque)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/eu/
2025-02-09 10:13:07 -05:00
crobibero b11de39c34 Backport pull request #13499 from jellyfin/release-10.10.z
Allow api key to subscribe to admin websockets

Original-merge: 03082e90f9

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-09 08:50:53 -05:00
gnattu f4a2679177 Backport pull request #13490 from jellyfin/release-10.10.z
Correctly handle audio number tag fallbacks

Original-merge: 117d2082aa

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-09 08:39:56 -05:00
JPVenson db2167178a Backport pull request #13459 from jellyfin/release-10.10.z
Fixed Websocket not locking state correctly

Original-merge: 49bb5a6442

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-09 08:39:55 -05:00
Bond-009 69784b2f17 Backport pull request #13439 from jellyfin/release-10.10.z
Fall back to calculating mime type from path when needed

Original-merge: 8aa4e2e320

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-09 08:39:54 -05:00
Tobias Kloy 83f0f3d629 Optimise string handling in PeopleRepository filtering. 2025-02-07 22:20:35 +01:00
Tobias Kloy 3a4d67319a Disable Warnings similar as in BaseItemRepository 2025-02-07 20:37:35 +01:00
tkloy24 7f41cc53ca Update Jellyfin.Server.Implementations/Item/PeopleRepository.cs
Co-authored-by: JPVenson <ger-delta-07@hotmail.de>
2025-02-07 19:46:38 +01:00
Tobias Kloy 0a4ca33d4f Fix Search results are case-sensitive for people 2025-02-07 14:38:33 +01:00
gnattu 341bb02422 Order MediaStream query by StreamIndex (#13506)
Our stream index calculation logic implemented in #7529, assumes an in-order array. However, our current query may return out-of-order items, leading the server to pass an incorrect index to ffmpeg, causing the transcoding to crash.
2025-02-06 07:15:29 -07:00
Marc Brooks 4e64b261a8 Moved Trimmed to Jellyfin.Extensions.StringExtensions 2025-02-05 18:13:28 -06:00
CrimsonBlue ead7de18df Translated using Weblate (Haitian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ht/
2025-02-05 18:01:17 -05:00
JPVenson dfdef511a5 Merge remote-tracking branch 'jellyfinorigin/master' into feature/pgsql_provider 2025-02-05 18:32:13 +00:00
Bond-009 00b66a06ea Enable nullable for AuthorizationInfo (#13485) 2025-02-04 17:10:39 -07:00
gnattu 9aec576c76 Typo
Co-authored-by: Cody Robibero <cody@robibe.ro>
2025-02-05 08:04:29 +08:00
gnattu 2de04cb07c Make StartDate/EndDate nullable (#13494)
These dates are used as birthdate and death date for person (ask luke for why) and a non-nullable column would cause the null date become 1901-01-01, making all living people dead.
2025-02-04 17:02:07 -07:00
CrimsonBlue e7f32fb174 Added translation using Weblate (Haitian) 2025-02-04 17:22:58 -05:00
Bond-009 1acefa6182 Update dependency FsCheck.Xunit to 3.1.0 (#13463)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-04 15:00:35 +01:00
gnattu 533ceeaaf2 Fix subnet contains check
We are still using `Subnet.Contains` a lot but that does not handle IPv4 mapped to IPv6 addresses at all. It was partially fixed by #12094 in local network checking, but it may not always happen on LAN.

Also make all local network checking to use IsInLocalNetwork method instead of just performing `Subnet.Contains` which is not accurate.

Filter out all link-local addresses for external interface matching.
2025-02-04 16:52:17 +08:00
gnattu b13039f377 Use regex attribute to validate input 2025-02-04 16:10:25 +08:00
gnattu b0e853070b Don't use RETURNING clause with EFCore
The RETURNING clause helps with performance and is now default of EFCore. However, EFCore cannot automatically perform retry when the table was locked/busy. Disable it as a workaround for the locking issues of very huge databases.
2025-02-04 15:57:57 +08:00
gnattu 2904083053 Remove unused import 2025-02-04 15:34:04 +08:00
gnattu 47af1c4576 Don't allow library name with leading or trailing space
Windows has a specific requirement on filenames that cannot have leading or trailing spaces and the folder creation would fail. Reject such request in the api controller.
2025-02-04 15:31:52 +08:00
Marc Brooks e8cbcde02e Merge branch 'master' into sort-nfo-data 2025-02-03 19:48:59 -06:00
Bond-009 d376b5fbc7 Fix build after backports due to EFCore change (#13488) 2025-02-03 16:37:39 -07:00
Shadowghost c77b3fa258 Backport pull request #13448 from jellyfin/release-10.10.z
Fix interface ordering again

Original-merge: 731874429c

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-03 17:07:13 -05:00
Bond-009 10f4f8b2ab Backport pull request #13425 from jellyfin/release-10.10.z
Open files with FileShare.Read for BlurHash calculations

Original-merge: bfe0fdbcdc

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-03 17:07:12 -05:00
gnattu c05a41cc3c Backport pull request #13423 from jellyfin/release-10.10.z
Don't select audio stream and codec explicitly for copy when bitrate exceeds limit

Original-merge: e8514de33b

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-03 17:07:11 -05:00
gnattu 24be951b75 Backport pull request #13411 from jellyfin/release-10.10.z
Use WriteThrough for ImageSaver

Original-merge: 6329de4fc3

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-03 17:07:10 -05:00
gnattu dc28056450 Backport pull request #13390 from jellyfin/release-10.10.z
Catch IOExceptions for GetFileSystemMetadata

Original-merge: 3766a88bea

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-03 17:07:09 -05:00
Shadowghost abdb5ab79e Backport pull request #13388 from jellyfin/release-10.10.z
Fix rating levels

Original-merge: 53a45c6033

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-03 17:07:08 -05:00
alltilla eb4162f9ec Backport pull request #13384 from jellyfin/release-10.10.z
Fix parallel use of not thread-safe SubtitleFormat instance

Original-merge: 0b2a59e963

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-03 16:59:08 -05:00
Shadowghost 608c44d5b3 Backport pull request #13382 from jellyfin/release-10.10.z
Fix interface selection

Original-merge: 0394965753

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-03 16:59:07 -05:00
gnattu ceba3475fb Backport pull request #13345 from jellyfin/release-10.10.z
Never treat matroska as webm for audio playback

Original-merge: 344cc8b97b

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-03 16:59:06 -05:00
gnattu d52ab30ae9 Backport pull request #13313 from jellyfin/release-10.10.z
Use nv15 as intermediate format for 2-pass rkrga scaling

Original-merge: 5c6317f68d

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-03 16:59:05 -05:00
Shadowghost e79fc6b851 Backport pull request #13288 from jellyfin/release-10.10.z
Fix DTS in HLS

Original-merge: cea0c95942

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-03 16:59:04 -05:00
gnattu 4595625f19 Backport pull request #13262 from jellyfin/release-10.10.z
Don't use custom params on ultrafast x265 preset

Original-merge: 86160cd99c

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-03 16:59:03 -05:00
Shadowghost c44006c20d Backport pull request #13227 from jellyfin/release-10.10.z
Fix EPG image caching

Original-merge: b9881b8bdf

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-03 16:59:01 -05:00
Shadowghost eac491fbd3 Backport pull request #13218 from jellyfin/release-10.10.z
Fix missing episode removal

Original-merge: 4e28f4fe03

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-03 16:56:03 -05:00
gnattu 8cb11692a9 Backport pull request #13209 from jellyfin/release-10.10.z
Transcode to audio codec satisfied other conditions when copy check failed.

Original-merge: 8aa41d5904

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-03 16:56:01 -05:00
Bond-009 533464e186 Backport pull request #13188 from jellyfin/release-10.10.z
Fix possible infinite loops in incomplete MKV files

Original-merge: 6f7ce439d3

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-03 16:56:00 -05:00
gnattu 2392290b72 Backport pull request #13187 from jellyfin/release-10.10.z
Properly check LAN IP in HasRemoteAccess

Original-merge: eb5f8d49dd

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-03 16:55:59 -05:00
gnattu 144e62027d Backport pull request #13183 from jellyfin/release-10.10.z
Don't generate trickplay for backdrops

Original-merge: 80940c0c57

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-03 16:55:58 -05:00
gnattu 4c17498369 Backport pull request #13182 from jellyfin/release-10.10.z
Don't fall back to ffprobe results for multi-value audio tags

Original-merge: f97f38585b

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-03 16:55:56 -05:00
gnattu b79f96e98b Backport pull request #13169 from jellyfin/release-10.10.z
Check if the video has an audio track before codec fallback

Original-merge: ff4f3b0441

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-03 16:55:55 -05:00
Shadowghost f46cb112f7 Backport pull request #13167 from jellyfin/release-10.10.z
Fix NFO ID parsing

Original-merge: f0e9b2fb96

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-03 16:55:54 -05:00
nyanmisaka bc1419728f Backport pull request #13151 from jellyfin/release-10.10.z
Always do tone-mapping for HDR transcoding when software pipeline is used

Original-merge: b31f1696f2

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-03 16:55:53 -05:00
gnattu 39cd3dcbd1 Backport pull request #13127 from jellyfin/release-10.10.z
Fallback to lossy audio codec for bitrate limit

Original-merge: 65f722f23c

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-03 16:54:36 -05:00
TheMelmacian 51207edf44 Backport pull request #13092 from jellyfin/release-10.10.z
Fix: handling of <set> elements in NfoParser

Original-merge: f333ef74b3

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Bond_009 <bond.009@outlook.com>
2025-02-03 16:54:35 -05:00
JPVenson 078587d232 Added Version string to application name connection for pgsql 2025-02-03 20:20:37 +00:00
JPVenson df8f352d65 Made key lookup case insensitive 2025-02-03 20:16:58 +00:00
JPVenson c9237ae731 Applied review suggestions 2025-02-03 20:15:36 +00:00
renovate[bot] cfeb879519 Update dependency z440.atl.core to 6.15.0 (#13477)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-03 16:38:29 +01:00
JPVenson efb402b1d2 Fixed shutdown behavior 2025-02-02 02:32:28 +00:00
JPVenson 61b2ad7f49 Added missing assembly info and fixed migration tests 2025-02-02 02:21:34 +00:00
JPVenson 2e5ff6842a Added collation migration in SqLite 2025-02-02 02:13:37 +00:00
JPVenson 4b57f2bdbb Fixed whitespace formatting 2025-02-02 02:10:14 +00:00
JPVenson 17003f4d76 Merge remote-tracking branch 'jellyfinorigin/master' into feature/pgsql_provider 2025-02-02 02:09:14 +00:00
JPVenson ebe89c07b3 Fixed collation and pgsql container 2025-02-02 02:07:04 +00:00
renovate[bot] 6a757ac0e5 Update dependency FsCheck.Xunit to 3.1.0 2025-01-31 01:44:19 +00:00
sinterdev ce64dbc034 Removing CollectionFolders from cache when they are deleted on disk. (#13315) 2025-01-30 18:43:37 -07:00
renovate[bot] 4fa2f2475c Update CI dependencies (#13460)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-30 13:59:24 +01:00
JPVenson 379a104cfb Changed UserName to non-deterministic field 2025-01-29 20:17:50 +00:00
renovate[bot] d583d9a313 Update github/codeql-action action to v3.28.7 (#13458)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-29 18:41:17 +01:00
luzpaz 6fda268892 Merge pull request #13453 from luzpaz/extentions-typo
Fix source typo
2025-01-29 16:56:25 +01:00
LK HO 350b7feefa Translated using Weblate (Chinese (Traditional Han script, Hong Kong))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant_HK/
2025-01-29 10:01:17 -05:00
Bond-009 9734892322 Merge pull request #12925 from Bond-009/await
Always await instead of directly returning Task
2025-01-28 11:29:46 +01:00
Bond-009 bcdffa74a8 Remove useless checks and dead code (#13405)
* Remove useless checks and dead code

* Enable adaptive bitrate streaming again

* Disable adaptive bitrate streaming by default
2025-01-28 11:29:22 +01:00
Josh Soref 0869a4f1f6 chore(ci): Let CI fail independently on each platform (#13446)
Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
2025-01-28 11:27:52 +01:00
Josh Soref 40da2ccac5 Fix spelling (#13444)
* spelling: anamorphic

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: associated

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: channelinfo

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: eagerly

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: enumerable

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: greater than/less than

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: greater

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: lineup

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: logs out

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: names

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: paging

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: playlist

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: sanitized

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: saving

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

---------

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
2025-01-28 11:27:34 +01:00
renovate[bot] e806fec902 Update CI dependencies (#13452)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-28 11:24:10 +01:00
myrad2267 44173cc802 Translated using Weblate (French (Canada))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fr_CA/
2025-01-28 05:20:20 -05:00
JPVenson d07e1a13b3 Fixed collation settings 2025-01-27 20:55:39 +00:00
JPVenson 74858042fc Added devcontainer for pgsql development 2025-01-27 19:14:11 +00:00
JPVenson 4ce0d498ab Added pgsql devcontainer 2025-01-27 18:32:36 +00:00
JPVenson ce00bc076e Fixed postgres sql provider 2025-01-27 18:21:47 +00:00
JPVenson 433640d985 Added pgsql support for jellyfin 🎉 2025-01-27 17:43:34 +00:00
JPVenson 844646e2fe Fixed migration runner and added docs for adding migrations 2025-01-27 17:20:14 +00:00
JPVenson 9d1c4ea169 Fixed DbContext usage on Provider 2025-01-27 16:35:46 +00:00
Bond-009 2e080087e6 Merge pull request #13438 from luzpaz/typos-various
Fix typos
2025-01-27 14:13:31 +01:00
Bond-009 7684986fa1 Use MediaTypeNames where possible (#13440) 2025-01-26 21:06:24 -07:00
JPVenson aa811eb1e3 Prepared Seperation of Database components for future multi provider support 2025-01-26 20:45:28 +00:00
Josh Soref 80365f277a chore(ci): Add permissions grant
Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
2025-01-26 15:20:10 -05:00
Anrijs Vitolins 7e9ce78849 Translated using Weblate (Latvian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/lv/
2025-01-26 14:01:17 -05:00
luzpaz b37bc9016f Fix typos
Found via `codespell -q 3 -D ../../dictionary.txt -S "./Emby.Server.Implementations/Localization" -L allready,childrens,groupe,inh,raisons,re-use,som,supercede,superceded,thirdparty,whoknows`
2025-01-26 11:14:03 -05:00
Bond-009 0541808c25 Merge pull request #13431 from jellyfin/renovate/z440.atl.core-6.x
Update dependency z440.atl.core to 6.14.0
2025-01-26 16:55:55 +01:00
Bond-009 ab124bec88 Merge pull request #13436 from luzpaz/typos
Fix various typos
2025-01-26 16:54:53 +01:00
Bond-009 8b180aca3a Merge pull request #11103 from jsoref/spelling
Fix spelling
2025-01-26 16:54:43 +01:00
Shadowghost 6454a35ef8 Extract trickplay files into own subdirectory 2025-01-26 11:56:19 +01:00
luzpaz c877ffa5ad Fix various typos
Found via `codespell -q 3 -S "./Emby.Server.Implementations/Localization" -L inh,som`
2025-01-25 21:04:37 -05:00
Josh Soref 044cf9fb85 chore: fix spelling
* a
* acceleration
* addition
* altogether
* api clients
* artist
* associated
* bandwidth
* cannot
* capabilities
* case-insensitive
* case-sensitive
* configuration
* delimiter
* dependent
* diacritics
* directors
* enable
* explicitly
* filters
* finish
* have
* hierarchy
* implicit
* include
* information
* into
* its
* keepalive
* localization
* macos
* manual
* matching
* metadata
* nonexistent
* options
* overridden
* parsed
* parser
* playback
* preferring
* processes
* processing
* provider
* ratings
* retrieval
* running
* segments
* separate
* should
* station
* subdirectories
* superseded
* supported
* system
* than
* the
* throws
* transpose
* valid
* was

link: forum or chat rooms

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
2025-01-25 20:05:15 -05:00
renovate[bot] cace593472 Update dependency z440.atl.core to 6.14.0 2025-01-25 21:51:07 +00:00
Bond-009 b318f33599 Remove the ability to auto port forward (#13222) 2025-01-25 09:34:06 -07:00
Bond-009 cc284afb47 Merge pull request #13410 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v3.28.5
2025-01-25 11:27:31 +01:00
Joshua M. Boniface 93b8eade61 Merge pull request #12798 from JPVenson/feature/EFUserData
Refactor library.db into jellyfin.db and EFCore
2025-01-25 02:08:44 -05:00
renovate[bot] 4cdb2c7cfa Update github/codeql-action action to v3.28.5 2025-01-24 19:00:34 +00:00
Blackspirits 679ee960d3 Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt/
2025-01-24 03:39:55 -05:00
Bond-009 07dce33452 Merge pull request #13407 from jellyfin/renovate/fscheck.xunit-3.x
Update dependency FsCheck.Xunit to 3.0.1
2025-01-23 10:56:35 +01:00
Bond-009 8c01b64a83 Merge pull request #13408 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v3.28.3
2025-01-23 10:44:01 +01:00
Bond_009 a70200af14 Disable adaptive bitrate streaming by default 2025-01-23 10:42:53 +01:00
lotko lol 87432e2368 Translated using Weblate (Slovenian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/sl/
2025-01-22 17:26:23 -05:00
renovate[bot] 45412639fa Update github/codeql-action action to v3.28.3 2025-01-22 21:34:49 +00:00
renovate[bot] 724d9c18f7 Update dependency FsCheck.Xunit to 3.0.1 2025-01-22 21:34:44 +00:00
Bond-009 13c9880100 Merge pull request #13360 from reuterma24/doc-improvement-container-helper
improve documentation for ContainerHelper class
2025-01-22 17:44:37 +01:00
Bond-009 cd2255a3ad Add support for .gzip files and handle URL redirection (#13319)
Co-authored-by: Max <@>
2025-01-22 17:44:16 +01:00
renovate[bot] e7c130abcf Update CI dependencies (#13400)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-22 17:41:08 +01:00
renovate[bot] 579b0f6565 Update dependency z440.atl.core to 6.13.0 (#13403)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-22 17:40:44 +01:00
Bond_009 3aa1ebb500 Enable adaptive bitrate streaming again 2025-01-22 17:36:26 +01:00
Bond_009 47f798827b Remove useless checks and dead code 2025-01-22 17:31:52 +01:00
renovate[bot] 5612d2187b Update dependency coverlet.collector to 6.0.4 (#13395)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-20 10:13:21 +01:00
JPVenson 64cf67f1ac Fixed ordering by artist 2025-01-19 13:03:09 +00:00
JPVenson caa1a06dec Merge branch 'feature/EFUserData' of https://github.com/JPVenson/jellyfin into feature/EFUserData 2025-01-19 12:41:11 +00:00
JPVenson 48ae3bc0df Fixed tests again 2025-01-19 12:41:11 +00:00
JPVenson 7d1a9dcc61 Update Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
Co-authored-by: Bond-009 <bond.009@outlook.com>
2025-01-19 13:30:31 +01:00
JPVenson cd75df6521 Applied review comments 2025-01-19 12:29:14 +00:00
JPVenson 56a4aa180b Fixed codesmell 2025-01-18 16:22:05 +00:00
JPVenson 2f306358c0 applied review comments 2025-01-18 16:17:26 +00:00
PalmarHealer b908fb5788 Translated using Weblate (German)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/de/
2025-01-18 10:28:51 -05:00
JPVenson 96e4d8ca78 worsen comment 2025-01-17 19:19:24 +00:00
felix920506 294190bb21 Update pull-request-conflict.yml 2025-01-16 08:05:56 -05:00
JPVenson a7ad5dfc80 Reverted doc change 2025-01-15 20:34:24 +00:00
JPVenson b33810534b Applied review comments 2025-01-15 20:12:41 +00:00
Sven Giermann 2624021d67 Add ability to remove a ChannelMapping (#12970)
* Add ability to remove a ChannelMapping

Remove a ChannelMapping by selecting the same mapping again.
This should be an intuitive way to de-select a mapping which currently requires the manual editing of a config file:
https://forum.jellyfin.org/t-how-to-unmap-livetv-channels

---------

Co-authored-by: Bond-009 <bond.009@outlook.com>
2025-01-15 11:26:39 +01:00
Bond-009 37e6ed5feb Merge pull request #13354 from jellyfin/renovate/sharpfuzz-2.x
Update dependency SharpFuzz to 2.2.0
2025-01-15 11:19:22 +01:00
Bond-009 c166387a5a Merge pull request #13374 from jellyfin/renovate/dotnet-monorepo
Update dependency dotnet-ef to 9.0.1
2025-01-15 11:15:34 +01:00
Bond-009 3cb7c48f85 Merge pull request #13373 from jellyfin/renovate/microsoft
Update Microsoft to 9.0.1
2025-01-15 11:10:21 +01:00
renovate[bot] 5b962534be Update dependency dotnet-ef to 9.0.1 2025-01-14 23:02:30 +00:00
renovate[bot] 04fe74ce8f Update Microsoft to 9.0.1 2025-01-14 23:02:12 +00:00
Bond-009 85e0cad5f3 Merge pull request #13353 from jellyfin/renovate/z440.atl.core-6.x
Update dependency z440.atl.core to 6.12.0
2025-01-13 11:07:44 +01:00
marudosurdo 0409849cc7 Translated using Weblate (Japanese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ja/
2025-01-13 00:01:16 -05:00
reuterma24 5a02ea4a31 added myself to CONTRIBUTORS.md 2025-01-12 18:57:29 +01:00
reuterma24 fdb489ae47 improve parameter documentation for ContainsContainer method in ContainerHelper class 2025-01-12 18:54:19 +01:00
renovate[bot] 6282455ff0 Update dependency SharpFuzz to 2.2.0 2025-01-12 00:33:12 +00:00
renovate[bot] 4c1a47bc53 Update dependency z440.atl.core to 6.12.0 2025-01-11 20:26:51 +00:00
JPVenson d716a53ec2 Applied review comments 2025-01-11 18:13:16 +00:00
renovate[bot] fb5da641f4 Update dependency FsCheck.Xunit to v3 (#13333)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Cody Robibero <cody@robibe.ro>
2025-01-11 09:37:28 -07:00
Niels van Velzen fd3057b549 Add option to disable deprecated legacy authorization options (#13306) 2025-01-11 09:37:13 -07:00
Niels van Velzen 3b8e614819 Prefer ApiKey over api_key in generated URL's (#13342) 2025-01-11 09:35:44 -07:00
Bond-009 17bbe4a2cd Merge pull request #13347 from jellyfin/renovate/ci-deps
Update CI dependencies
2025-01-11 13:34:28 +01:00
stelle 42c1d7a915 Translated using Weblate (Malay)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ms/
2025-01-11 05:01:16 -05:00
zzdovydas 8cf1a50b2e Translated using Weblate (Lithuanian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/lt/
2025-01-11 05:01:16 -05:00
az2oo1 25ef02d8df Translated using Weblate (Arabic)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ar/
2025-01-11 05:01:16 -05:00
renovate[bot] ac9bafa7e7 Update CI dependencies 2025-01-10 20:48:35 +00:00
Bond-009 a4e41c751a Merge pull request #13339 from jellyfin/renovate/xunit-dotnet-monorepo
Update dependency xunit to 2.9.3
2025-01-09 16:58:22 +01:00
renovate[bot] 878e778fbc Update dependency xunit to 2.9.3 2025-01-08 20:42:37 +00:00
zichichi 5b63d093b1 Translated using Weblate (Italian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/it/
2025-01-07 11:01:16 -05:00
Kachelkaiser 814264f62c Translated using Weblate (German)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/de/
2025-01-07 11:01:16 -05:00
Bond-009 649d41914f Merge pull request #13327 from jellyfin/renovate/ci-deps
Update eps1lon/actions-label-merge-conflict action to v3.0.3
2025-01-06 18:03:20 +01:00
renovate[bot] b077d378fb Update eps1lon/actions-label-merge-conflict action to v3.0.3 2025-01-06 14:49:15 +00:00
Jashanpreet Singh d22094be03 Translated using Weblate (Punjabi)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pa/
2025-01-05 16:07:39 -05:00
Frederiks Kronbergs 4e87af6d03 Translated using Weblate (Latvian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/lv/
2025-01-05 16:07:39 -05:00
Franco Castillo 07185bc32b Translated using Weblate (Spanish (Argentina))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es_AR/
2025-01-05 16:07:38 -05:00
Max ab38009069 Add support for .gzip files and handle URL redirection 2025-01-04 02:12:29 -05:00
SamCurant453 c07bce97a1 Translated using Weblate (Bengali)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/bn/
2025-01-02 14:36:01 -05:00
Qian Qian e16ea7b236 always sort season by index number 2025-01-01 11:47:14 +08:00
Bond-009 02358a662e Merge pull request #13304 from jellyfin/renovate/coverlet.collector-6.x
Update dependency coverlet.collector to 6.0.3
2024-12-31 11:16:32 +01:00
renovate[bot] b5b7bd2959 Update dependency coverlet.collector to 6.0.3 2024-12-31 02:14:37 +00:00
Bond-009 b07231ae33 Merge pull request #13291 from jellyfin/renovate/ci-deps 2024-12-29 11:14:09 +01:00
renovate[bot] 0d8b387e71 Update danielpalme/ReportGenerator-GitHub-Action action to v5.4.3 2024-12-28 21:39:46 +00:00
theoverlordbamse 80d98379de Translated using Weblate (Danish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/da/
2024-12-28 13:01:15 -05:00
dtalens a9d299253e Translated using Weblate (Catalan)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ca/
2024-12-28 13:01:15 -05:00
Bond-009 c966ad906c Merge pull request #13286 from jellyfin/renovate/ci-deps
Update actions/setup-dotnet action to v4.2.0
2024-12-27 10:39:11 +01:00
renovate[bot] 50463d2d17 Update actions/setup-dotnet action to v4.2.0 2024-12-26 23:13:41 +00:00
robertscerri 5774b601f5 Translated using Weblate (Maltese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/mt/
2024-12-24 09:32:00 -05:00
Bond-009 4cbdb01c3d Merge pull request #13271 from jellyfin/renovate/libse-4.x
Update dependency libse to 4.0.10
2024-12-23 09:23:04 +01:00
Bond-009 c8c544dc5e Merge pull request #13272 from jellyfin/renovate/z440.atl.core-6.x
Update dependency z440.atl.core to 6.11.0
2024-12-23 09:22:49 +01:00
renovate[bot] c0fd8dab22 Update dependency z440.atl.core to 6.11.0 2024-12-22 15:43:47 +00:00
renovate[bot] b73e3637de Update dependency libse to 4.0.10 2024-12-22 15:43:38 +00:00
Bond-009 f8e2b866b3 Merge pull request #13263 from jellyfin/renovate/ci-deps 2024-12-22 00:31:15 +01:00
renovate[bot] 9ed55affa6 Update danielpalme/ReportGenerator-GitHub-Action action to v5.4.2 2024-12-21 21:07:47 +00:00
Bond-009 00163ce167 Merge pull request #13258 from jellyfin/renovate/ci-deps 2024-12-21 12:08:34 +01:00
renovate[bot] 87612ef20d Update github/codeql-action action to v3.28.0 2024-12-20 21:16:32 +00:00
Bond-009 c4d4419800 Merge pull request #13213 from Ich1goSan/master
move to new System.Threading.Lock type for better performance
2024-12-20 22:15:45 +01:00
Zigi84 17f0643147 Translated using Weblate (Serbian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/sr/
2024-12-20 12:56:40 -05:00
Bond-009 170368f9c9 Merge pull request #13230 from jellyfin/renovate/z440.atl.core-6.x
Update dependency z440.atl.core to 6.10.0
2024-12-19 17:53:06 +01:00
Lai, Wei-Chen ea0a78dd0b Translated using Weblate (Chinese (Traditional Han script))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant/
2024-12-19 00:51:49 -05:00
JPVenson dcfbf55794 Fixed linter 2024-12-19 00:10:47 +00:00
Bond-009 73a1259382 Merge pull request #13248 from jellyfin/renovate/ci-deps
Update actions/upload-artifact action to v4.5.0
2024-12-18 17:31:35 +01:00
renovate[bot] 695aa594f2 Update actions/upload-artifact action to v4.5.0 2024-12-17 23:45:40 +00:00
renovate[bot] 1143d9509f Update dependency z440.atl.core to 6.10.0 2024-12-15 16:11:40 +00:00
JPVenson a0c568bc6c Applied review comments 2024-12-15 14:46:40 +00:00
JPVenson 1c3196dd5f Merge remote-tracking branch 'origin/master' into feature/EFUserData 2024-12-15 14:15:43 +00:00
Bond-009 55f5eaf0e3 Merge pull request #13193 from jellyfin/renovate/serilog.aspnetcore-9.x
Update dependency Serilog.AspNetCore to v9
2024-12-14 13:42:07 +01:00
renovate[bot] 6a91c80f12 Update dependency Serilog.AspNetCore to v9 2024-12-14 10:27:01 +00:00
Bond-009 23cf4bc94e Merge pull request #13195 from Shadowghost/merge-ruleset-editorconf
Migrate rulesets to .editorconf
2024-12-14 11:18:50 +01:00
Bond-009 fa5b8ee863 Merge pull request #13215 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v3.27.9
2024-12-14 11:18:31 +01:00
renovate[bot] e0d563782e Update github/codeql-action action to v3.27.9 2024-12-13 00:23:33 +00:00
Daniyar Alpyspayev 2614fecf8d move to new System.Threading.Lock type for better performance 2024-12-12 18:10:06 +05:00
Luca-Foglieni b89877554c Translated using Weblate (Italian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/it/
2024-12-11 11:46:33 -05:00
Bond-009 623d0cd8ad Merge pull request #13203 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v3.27.7
2024-12-10 20:10:52 +01:00
Bond-009 9322e37b95 Merge pull request #13192 from jellyfin/renovate/serilog.settings.configuration-9.x
Update dependency Serilog.Settings.Configuration to v9
2024-12-10 18:47:43 +01:00
renovate[bot] 82cbd01354 Update github/codeql-action action to v3.27.7 2024-12-10 15:24:42 +00:00
Tim Eisele 6d74b97836 Update .editorconfig
Co-authored-by: Erwin de Haan <1627021+EraYaN@users.noreply.github.com>
2024-12-09 19:38:54 +01:00
Tim Eisele 4b11cad6d4 Cleanup 2024-12-09 17:25:51 +01:00
Tim Eisele 08027b1008 Migrate rulesets to .editorconf 2024-12-09 14:42:27 +01:00
gnattu 0fc288936d Enable VideoToolbox AV1 decode
This decoder differs from others provided by VideoToolbox in that it lacks any software fallback. To achieve consistent behavior with other VideoToolbox decoders, this PR implemented additional checking on the server to simulate the software fallback provided by VideoToolbox.

The current fallback checking mechanism is a temporary solution. In the long term, it should be replaced with a more capable hardware capability checking system.
2024-12-09 16:17:49 +08:00
renovate[bot] 692e7bd4c4 Update dependency Serilog.Settings.Configuration to v9 2024-12-09 00:40:57 +00:00
Bond-009 6691380c04 Merge pull request #13076 from theguymadmax/tv-icon-image-fix
Determine tv image type by extension if content-type is unavailable
2024-12-08 12:17:36 +01:00
Bond-009 f9aa93406b Merge pull request #13024 from jellyfin/renovate/major-dotnet-monorepo
Update dependency dotnet-ef to v9
2024-12-07 11:53:54 +01:00
renovate[bot] 88b8a13ecd Update dependency dotnet-ef to v9 2024-12-07 10:29:34 +00:00
JPVenson fe1aab034e Merge branch 'jellyfin:master' into feature/EFUserData 2024-12-06 17:59:27 +01:00
Max 43fff5799b Fix code 2024-12-05 17:14:28 -05:00
Max 630de12e5e Apply review changes 2024-12-04 10:08:41 -05:00
Bond-009 1feceea508 Merge pull request #13152 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v3.27.6
2024-12-04 09:33:39 +01:00
Bond-009 bd1eee5e27 Merge pull request #13141 from jellyfin/renovate/z440.atl.core-6.x
Update dependency z440.atl.core to 6.9.0
2024-12-03 19:33:31 +01:00
renovate[bot] 37f7bda3cc Update github/codeql-action action to v3.27.6 2024-12-03 14:47:46 +00:00
VC 3d819b74bd Translated using Weblate (Chinese (Traditional Han script, Hong Kong))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant_HK/
2024-12-02 06:32:10 -05:00
SenorSmartyPants 12c14ddb24 Round CommunityRating to nearest tenths 2024-12-01 22:08:15 -06:00
renovate[bot] a7e5f43a8a Update dependency Xunit.SkippableFact to 1.5.23 (#13134)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-01 17:10:29 -07:00
RealGreenDragon f1e020c0b0 Removed RemoveOldPlugins configuration flag (#13102) 2024-12-01 17:09:30 -07:00
Ethan Pippin 06923cbf2b Implement TaskTriggerInfoType enum (#12783) 2024-12-01 17:08:37 -07:00
renovate[bot] b8c7cd5aa7 Update dependency z440.atl.core to 6.9.0 2024-12-01 15:48:40 +00:00
Bond-009 9ae1ac2513 Merge pull request #11222 from jellyfin/renovate/mimetypes-2.x
Update dependency MimeTypes to 2.5.2
2024-12-01 00:06:53 +01:00
gnattu b7f6ccc306 Backport pull request #13113 from jellyfin/release-10.10.z
Only do DoVi remux when the client supports profiles without fallbacks

Original-merge: 9464f9e622

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
2024-11-30 17:59:39 -05:00
Bond_009 5cbe71a1b2 Resolve audio/x-aac to .aac 2024-11-30 23:40:18 +01:00
Andrijan Jovanovski ea45804213 Translated using Weblate (Macedonian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/mk/
2024-11-30 15:31:41 -05:00
Bond-009 a1e635809b Merge pull request #12867 from Dessyreqt/master
Move TV-PG ratings to be in line with PG rating.
2024-11-30 12:10:14 +01:00
Kenneth Cochran e922fe8582 Added test for ListsingsManager.DeleteListingsProvider(). (#12793)
* Added test for DeleteListingsProvider().

* Added myself to CONTRIBUTORS.md

* Removed unintentionally committed test SaveListingProvider_SavesProviderAndReturnsInfo()

* Cleaned up test in response to PR feedback.
2024-11-30 12:08:19 +01:00
JPVenson 556f4c4bfb Updated DevContainer to Bookworm Debian (#13037)
* Updated DevContainer to Bookworm Debian
Removed dual container and made FFmpeg install default

* Update .devcontainer/devcontainer.json

Co-authored-by: Bond-009 <bond.009@outlook.com>

* Fixed Tabs

---------

Co-authored-by: Bond-009 <bond.009@outlook.com>
2024-11-30 12:07:48 +01:00
1hitsong b03f478867 Fix typo in guide info endpoint comment (#13117) 2024-11-29 10:32:00 -07:00
DragoPrime 1272bb9a84 Translated using Weblate (Romanian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ro/
2024-11-26 15:00:03 -05:00
Bond-009 572c5e24fa Merge pull request #13097 from nielsvanvelzen/venson-cant-spell
Fix typo in LibraryOptions
2024-11-26 19:42:47 +01:00
Bond-009 9fef0b7e5f Merge pull request #13100 from jellyfin/renovate/svg.skia-2.x
Update dependency Svg.Skia to 2.0.0.4
2024-11-26 19:41:45 +01:00
renovate[bot] a0746c9a46 Update dependency Svg.Skia to 2.0.0.4 2024-11-24 18:17:11 +00:00
renovate[bot] 1399e6be38 Update dependency MimeTypes to 2.5.2 2024-11-24 14:27:29 +00:00
Niels van Velzen 1c77e9606e Fix typo in LibraryOptions 2024-11-24 14:53:08 +01:00
Bond-009 4254c5acf6 Merge pull request #13089 from jellyfin/renovate/asynckeyedlock-7.x
Update dependency AsyncKeyedLock to 7.1.4
2024-11-24 13:33:18 +01:00
Bond-009 e688e3f1da Merge pull request #13072 from jellyfin/renovate/microsoft
Update dependency Microsoft.NET.Test.Sdk to 17.12.0
2024-11-24 13:33:05 +01:00
Bond-009 cd6f52a29f Merge pull request #13056 from jellyfin/renovate/ci-deps
Update CI dependencies
2024-11-24 13:32:55 +01:00
JPVenson 3b18a36ba5 removed unused 2024-11-24 10:59:05 +00:00
JPVenson 6a08361f6f Applied review comments 2024-11-24 10:58:09 +00:00
JPVenson 80cace4321 Updated usage of internal user Id 2024-11-23 22:39:39 +00:00
renovate[bot] edb30ee543 Update dependency AsyncKeyedLock to 7.1.4 2024-11-22 11:21:27 +00:00
renovate[bot] f932c4efa7 Update CI dependencies 2024-11-20 14:40:19 +00:00
Max 1ba0b88703 Use .net constants 2024-11-19 21:28:15 -05:00
JPVenson 0dd6dacc4f Merge remote-tracking branch 'origin/master' into feature/EFUserData 2024-11-19 20:53:38 +00:00
Shadowghost 06c603428b Backport pull request #13059 from jellyfin/release-10.10.z
Exclude file system based library playlists from migration

Original-merge: 23de7e517e

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-11-19 15:43:33 -05:00
goknsh 924c80a209 Backport pull request #13033 from jellyfin/release-10.10.z
Respect cancellation token/HTTP request aborts correctly in `SymlinkFollowingPhysicalFileResultExecutor`

Original-merge: 293e0f5faf

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-11-19 15:43:32 -05:00
gnattu 7f81bbd42f Backport pull request #13030 from jellyfin/release-10.10.z
Always cleanup trickplay temp for ffmpeg failures

Original-merge: 9e61a6fd72

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-11-19 15:43:31 -05:00
nyanmisaka 9f86f8748c Backport pull request #13026 from jellyfin/release-10.10.z
Fix missing procamp vaapi filter

Original-merge: cf11a2dc1e

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-11-19 15:43:29 -05:00
gnattu 7f296d06e6 Backport pull request #13003 from jellyfin/release-10.10.z
Only set first MusicBrainz ID for audio tags

Original-merge: e2434d38c5

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-11-19 15:43:28 -05:00
gnattu fbdbf77a59 Backport pull request #12991 from jellyfin/release-10.10.z
Use invariant culture for tonemap options

Original-merge: d292fde9e2

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-11-19 15:43:27 -05:00
nyanmisaka 661caa62e2 Backport pull request #12989 from jellyfin/release-10.10.z
Fix InvariantCulture in VPP tonemap options

Original-merge: 25321d7f80

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-11-19 15:43:26 -05:00
nyanmisaka 87a3c5d11c Backport pull request #12973 from jellyfin/release-10.10.z
Fix pixel format in HEVC RExt SDR transcoding

Original-merge: aa08d3f2bf

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-11-19 15:43:24 -05:00
nyanmisaka 547d393af0 Backport pull request #12964 from jellyfin/release-10.10.z
Fix height of imported trickplay tiles

Original-merge: 09c377fb6c

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-11-19 15:43:23 -05:00
Max 96cf13060d Extension lookup tv icons 2024-11-19 15:43:22 -05:00
gnattu ee66c74527 Backport pull request #12962 from jellyfin/release-10.10.z
Always consider null char as delimiter for ID3v2

Original-merge: 97dc02b163

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-11-19 15:43:22 -05:00
gnattu 882f3374ed Backport pull request #12955 from jellyfin/release-10.10.z
Fix trickplay images never being replaced

Original-merge: 9c6454ec46

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-11-19 15:43:21 -05:00
gnattu 19c5c95f4e Backport pull request #12949 from jellyfin/release-10.10.z
Fix json array string writer in JsonDelimitedArrayConverter

Original-merge: 3089e9e40a

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-11-19 15:43:20 -05:00
gnattu 4f562d67b0 Backport pull request #12947 from jellyfin/release-10.10.z
Add a small tolerance value to remux fps check

Original-merge: 954950dc14

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-11-19 15:43:19 -05:00
Shadowghost 6e7118eff1 Backport pull request #12934 from jellyfin/release-10.10.z
Fix playlists

Original-merge: 8bee67f1f8

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-11-19 15:43:18 -05:00
JPVenson 27b044493a Backport pull request #12916 from jellyfin/release-10.10.z
Added query filter to disregard disabled Providers

Original-merge: 38c08c4fad

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-11-19 15:43:17 -05:00
renovate[bot] 2a8ebccd16 Update dependency Microsoft.NET.Test.Sdk to 17.12.0 2024-11-19 17:10:28 +00:00
koreapyj d1d5ea9c80 Translated using Weblate (Korean)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ko/
2024-11-18 03:00:02 -05:00
JPVenson 136a7995f7 Fixed server side distinct filter 2024-11-17 15:42:35 +00:00
dkanada 4c65e0d397 make playlist creation private by default (#12853) 2024-11-17 08:13:01 -07:00
JPVenson e8761044c2 Fixed segment providers never presented to UI (#13060) 2024-11-17 08:12:43 -07:00
JPVenson 25f8e2259a Fixed ChapterRepository not set 2024-11-17 14:14:14 +00:00
JPVenson fa5faa09c0 Merge remote-tracking branch 'origin/master' into feature/EFUserData 2024-11-17 11:54:19 +00:00
Bond-009 cf79b072a7 Merge pull request #13022 from jellyfin/renovate/major-microsoft
Update Microsoft to v9 (major)
2024-11-17 12:43:38 +01:00
JPVenson 68252ffa1b Merge branch 'feature/EFUserData' of https://github.com/JPVenson/jellyfin into feature/EFUserData 2024-11-17 11:05:14 +00:00
JPVenson c71dc380bf Fixed error 2024-11-17 11:05:13 +00:00
JPVenson b39553611d Applied coding style 2024-11-17 11:03:43 +00:00
JPVenson 427359deee Merge branch 'master' into feature/EFUserData 2024-11-17 01:23:26 +01:00
JPVenson 17e4485b94 Removed grouping key for testing 2024-11-16 23:33:04 +00:00
JPVenson b6177363e9 Fixed search case sensitivity 2024-11-16 22:10:07 +00:00
JPVenson 9f7f9cc0ff Fixed metadata refresh not working 2024-11-16 20:30:43 +00:00
Cody Robibero 9e05abcc85 Add dotnet9 to abi compat workflow (#13046) 2024-11-16 19:01:32 +01:00
Bond-009 ceb850c770 Update projects to .NET 9 (#13023) 2024-11-16 10:11:01 -07:00
JPVenson c925f8688e Filter duplicate BaseItems on save 2024-11-15 18:30:26 +00:00
renovate[bot] 2831882054 Update Microsoft to v9 2024-11-15 17:52:48 +00:00
Bond-009 5e8c0fe40c Merge pull request #13021 from jellyfin/renovate/microsoft
Update Microsoft to 8.0.11
2024-11-15 18:52:01 +01:00
Bond-009 3a8b27eb1e Merge pull request #12986 from jellyfin/renovate/skiasharp-monorepo
Update skiasharp monorepo
2024-11-15 18:37:24 +01:00
Bond-009 33c253268e Merge pull request #13019 from jellyfin/renovate/ci-deps
Update CI dependencies
2024-11-15 18:35:44 +01:00
Bond-009 6e022465e9 Merge pull request #12792 from jellyfin/renovate/dotnet-monorepo
Update dotnet monorepo
2024-11-15 18:34:52 +01:00
JPVenson 77bae62acc Added migration filtering 2024-11-15 16:24:38 +00:00
Jamoliddin Rakhmonberdiev 1be18114a9 Translated using Weblate (Uzbek)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/uz/
2024-11-15 11:00:02 -05:00
Johan Dixelius ae721542cc Translated using Weblate (Swedish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/sv/
2024-11-15 11:00:00 -05:00
JPVenson 3eedbae506 Fixed Item query 2024-11-15 14:33:07 +00:00
JPVenson 03e08412d7 Fixed paging not beeing applied 2024-11-15 14:17:25 +00:00
JPVenson 19e55f4309 Fixed migration referencing non-existing Items 2024-11-15 09:08:27 +00:00
JPVenson 92eb983c61 Fixed Query Distinct 2024-11-15 09:00:13 +00:00
SenorSmartyPants c46dff16cc Set IsLive 2024-11-14 17:09:53 -06:00
JPVenson 0ff1ee951d Fixed compiler error 2024-11-14 22:01:51 +00:00
JPVenson 37129f7952 Fixed Transaction for Userdata 2024-11-14 21:48:21 +00:00
JPVenson d4aca84581 Disabled sqlite pooling 2024-11-14 21:47:42 +00:00
JPVenson e8be7ab011 Merge branch 'jellyfin:master' into feature/EFUserData 2024-11-14 21:56:18 +01:00
JPVenson 30ba35aa0c attempted to fix multi insert for Itemvalues 2024-11-14 20:36:27 +00:00
JPVenson b60cd378d9 Updated order of saving for Items 2024-11-14 20:03:23 +00:00
JPVenson 060aa4719e Fixed NextUp and Latest query performance 2024-11-14 19:53:59 +00:00
JPVenson 96d9bb83a3 Fixed Movie RecentlyAdded 2024-11-14 18:09:04 +00:00
JPVenson b830c42fca There can be also NULL people? 2024-11-14 16:10:43 +00:00
renovate[bot] 023838f3c8 Update CI dependencies 2024-11-14 15:58:14 +00:00
JPVenson 75d40e69b5 removed dbg code 2024-11-14 15:37:22 +00:00
JPVenson f81d124019 Fixed items can be null saving 2024-11-14 15:23:59 +00:00
JPVenson 5167333602 Fixed base items not saved before Metadata 2024-11-14 14:07:36 +00:00
JPVenson 93adddd7a9 reverted dbg code 2024-11-14 10:25:49 +00:00
JPVenson aea255f910 Deterministic tests my *** 2024-11-14 10:14:41 +00:00
JPVenson 432cfba2e2 Reverted Test code 2024-11-14 09:55:32 +00:00
JPVenson c5488f8ead Fixed tests message 2024-11-14 09:25:55 +00:00
JPVenson 7d137a8e8a Updated test dbg message 2024-11-14 09:20:12 +00:00
JPVenson 056dcf7e81 Added Pipeline debug code 2024-11-14 09:04:35 +00:00
JPVenson 5f2be93e19 Fixed Tests 2024-11-14 08:48:53 +00:00
JPVenson 6bcc7aa79f Updated comments/TODOs 2024-11-14 06:06:09 +00:00
JPVenson ffc18a2044 Updated comments/TODOs 2024-11-14 05:58:32 +00:00
JPVenson a71187ebcc Fixed FUCKING TopParentId 2024-11-13 22:58:17 +00:00
JPVenson 7c51b37ca0 Fixed Person creation 2024-11-13 22:05:23 +00:00
JPVenson 6b371ba04f Fixed storage of Person images 2024-11-13 22:04:03 +00:00
JPVenson e43e34eab8 Fixed Scan saving library items 2024-11-13 20:28:52 +00:00
JPVenson 2060d0ca2c Fixed DeadPeople query 2024-11-13 19:09:39 +00:00
renovate[bot] 16bc1ebc8b Update dotnet monorepo 2024-11-13 18:05:16 +00:00
George Vella 53683809d9 Translated using Weblate (Maltese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/mt/
2024-11-13 12:00:03 -05:00
JPVenson 7b81a39ee1 Fix Deduplication and Save of Items 2024-11-13 14:25:26 +00:00
JPVenson fcb1dfc010 Remove unmapped fields 2024-11-13 10:45:37 +00:00
JPVenson 5fb4d6a169 Merge branch 'feature/EFUserData' of https://github.com/JPVenson/jellyfin into feature/EFUserData 2024-11-13 10:43:11 +00:00
JPVenson 4747edd635 Merge branch 'feature/EFUserData' of https://github.com/JPVenson/jellyfin into feature/EFUserData 2024-11-13 10:34:09 +00:00
JPVenson 11388c0144 Removed unmapped joins again 2024-11-13 10:31:51 +00:00
JPVenson cafc74c64c Removed unmapped joins again 2024-11-13 10:29:13 +00:00
JPVenson c7f63a0da1 removed unmapped queried fields 2024-11-13 10:28:22 +00:00
JPVenson 07455dfb4d Readded External fields on request 2024-11-13 10:07:45 +00:00
JPVenson 3b8e177ba8 Removed duplicated code 2024-11-13 01:08:20 +00:00
JPVenson 8165813414 Fixed people saving 2024-11-13 00:49:39 +00:00
JPVenson acd878e67e Fixed null reference being created by EfCore 2024-11-13 00:40:10 +00:00
JPVenson b744ceabaa Added Check for arguments 2024-11-13 00:23:06 +00:00
JPVenson d073e2c664 Fixed invalid columns on MediaStreams 2024-11-12 23:53:05 +00:00
JPVenson 46905ac66a Fixed NameStartsOrGreater filter 2024-11-12 20:50:23 +00:00
renovate[bot] dc90b0edb9 Update Microsoft to 8.0.11 2024-11-12 20:06:37 +00:00
JPVenson 22515ad647 Fixed app paths not being expanded 2024-11-12 17:23:41 +00:00
JPVenson d3174b5171 Fixed userdata lookup 2024-11-12 16:14:17 +00:00
JPVenson 85b8b2573b Fixed AncestorIds
Fixed Sorting, NextUp and Continue Watching
2024-11-12 15:37:01 +00:00
JPVenson a7a2257ccb Fixed Search ordering and NextUp 2024-11-12 13:29:29 +00:00
JPVenson 510b29f2a4 Fixed dangling connections keept open on window migration 2024-11-12 07:16:24 +00:00
renovate[bot] 817ca1775a Update dependency AsyncKeyedLock to 7.1.3 (#13007)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-11 17:15:53 -07:00
JPVenson 00c4f23276 Fixed image save method transaction commit 2024-11-11 23:14:06 +00:00
JPVenson 43a2ec990c Refactored array usage 2024-11-11 23:11:17 +00:00
JPVenson efe5b59517 Cleaned up BaseItem querying 2024-11-11 22:29:44 +00:00
JPVenson 508b27f156 Fixed Duplicate returns on grouping
Fixed UserDataKey not stored
2024-11-11 17:39:50 +00:00
JPVenson bdab5e549e Fixed WAL lock on program exit 2024-11-11 17:39:20 +00:00
Bond-009 8f3410c81c Merge pull request #12994 from jellyfin/renovate/z440.atl.core-6.x
Update dependency z440.atl.core to 6.8.0
2024-11-11 12:53:30 +01:00
Bas 2d28b2ff6e Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2024-11-11 04:00:05 -05:00
Aindriú Mac Giolla Eoin 772e9a6d4a Translated using Weblate (Irish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ga/
2024-11-11 04:00:05 -05:00
darkabella a5e05a7f14 Translated using Weblate (Catalan)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ca/
2024-11-11 04:00:05 -05:00
koreapyj ceefb71fe9 Translated using Weblate (Korean)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ko/
2024-11-11 04:00:05 -05:00
JPVenson 741397f1be Fixed images not loading 2024-11-11 07:00:51 +00:00
JPVenson c6e67edd86 Fixed ItemSorting 2024-11-11 06:21:43 +00:00
JPVenson fb48d0790f Fixed Library DB lookup 2024-11-11 06:14:08 +00:00
JPVenson 8dbbb3e243 Fixed user Index 2024-11-11 05:34:11 +00:00
JPVenson 2d4f7f725f Fixed TopParent not beeing migrated 2024-11-11 00:27:30 +00:00
JPVenson 911139e2d5 Fixed provider Ids not queried with baseItems 2024-11-10 21:06:15 +00:00
JPVenson 6b777f9d43 Fixed filter query 2024-11-10 21:01:16 +00:00
JPVenson 67d8e8c7da fixed ExtraIds not returned as empty list 2024-11-10 20:42:27 +00:00
JPVenson efc6611072 Refixed timing for migration 2024-11-10 20:40:24 +00:00
JPVenson fb88d48374 Fixed out of order unittests 2024-11-10 20:18:36 +00:00
JPVenson dfbbbf023d reverted tag enumeration 2024-11-10 20:10:59 +00:00
JPVenson 4b0a5ea8e9 Fixed reference aggregate collections nullable when empty 2024-11-10 19:31:22 +00:00
JPVenson 4959232b27 Fixed tags aggregation 2024-11-10 19:28:41 +00:00
JPVenson 73ddbeb4c1 Fixed migration timer 2024-11-10 19:25:17 +00:00
JPVenson b5bb2261bc Who thought it be a good idea to let indexes start 1 one please step forward!!! 2024-11-10 19:19:35 +00:00
JPVenson cec4ad9b65 Improved Logging 2024-11-10 18:36:46 +00:00
JPVenson b0b14e6edd Fixed order of column selects 2024-11-10 18:01:51 +00:00
JPVenson 6efcd6b873 Fixed GUID selector for typed based item 2024-11-10 18:01:04 +00:00
Bond-009 fabf616a5a Merge pull request #12992 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v3.27.1
2024-11-10 12:10:14 +01:00
renovate[bot] 9ee8642813 Update dependency z440.atl.core to 6.8.0 2024-11-08 22:29:58 +00:00
renovate[bot] 71daa3e5a1 Update github/codeql-action action to v3.27.1 2024-11-08 19:19:17 +00:00
renovate[bot] dacb407bec Update skiasharp monorepo 2024-11-07 18:41:26 +00:00
VC 257d8d12b8 Translated using Weblate (Chinese (Traditional Han script, Hong Kong))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant_HK/
2024-11-06 21:00:00 -05:00
newton181 bf00899f92 Translated using Weblate (Spanish (Latin America))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es_419/
2024-11-05 01:00:02 -05:00
Tomi e34ea6400b Translated using Weblate (Finnish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fi/
2024-11-05 01:00:02 -05:00
guroww 5776163d6e Translated using Weblate (Bulgarian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/bg/
2024-11-05 01:00:02 -05:00
renovate[bot] 1dd3792984 Update dependency z440.atl.core to 6.7.0 (#12943)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-03 10:51:06 -07:00
gnattu 46fb6c1579 Backport pull request #12940 from jellyfin/release-10.10.z
Remove DynamicImageResponse local image after saved to metadata folder

Original-merge: 3a9b48a2aa

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-11-03 10:55:53 -05:00
gnattu 9e386ecc27 Backport pull request #12931 from jellyfin/release-10.10.z
Set AudioCodec when building stream

Original-merge: a165883999

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

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-11-03 10:55:51 -05:00
JPVenson d81fec6b7c Backport pull request #12915 from jellyfin/release-10.10.z
Fixed possible NullReferenceException in SessionManager

Original-merge: 3592c629e7

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-11-03 10:55:50 -05:00
revam 510312045a Backport pull request #12909 from jellyfin/release-10.10.z
Don't try to prune images for virtual episodes.

Original-merge: f99e0407fd

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-11-03 10:55:49 -05:00
benedikt257 600a09f1fc Backport pull request #12891 from jellyfin/release-10.10.z
Fix TMDB import failing when no IMDB ID is set for a movie

Original-merge: c6629aebf8

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-11-03 10:55:48 -05:00
Bond-009 725c414682 Merge pull request #12778 from TonyBotongChu/anime-parse
Add EpisodeExpression for anime file names
2024-11-03 15:44:20 +01:00
SethPattee a416c438da Added + in username regex validator, Test + in username, issue #10414 (#12819) 2024-11-03 15:43:27 +01:00
Roi Gabay 30e20a0146 Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/he/
2024-11-03 04:00:00 -05:00
Bas 66aad36d1f Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2024-11-01 14:41:38 -04:00
Roi Gabay 258ae9d4c2 Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/he/
2024-11-01 14:41:38 -04:00
Bond_009 d2db700402 Always await instead of directly returning Task
https://github.com/davidfowl/AspNetCoreDiagnosticScenarios/blob/master/AsyncGuidance.md#prefer-asyncawait-over-directly-returning-task

The performance impact is negligible (and it's me saying that!)
2024-10-31 17:02:06 +01:00
Bond-009 282784cbb6 Merge pull request #12922 from jellyfin/renovate/svg.skia-2.x
Update dependency Svg.Skia to 2.0.0.2
2024-10-31 16:39:23 +01:00
renovate[bot] 9259623abb Update dependency Svg.Skia to 2.0.0.2 2024-10-31 13:15:18 +00:00
TalalSh d4e8c641ea Translated using Weblate (Arabic)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ar/
2024-10-29 22:12:32 -04:00
JPVenson 0639758abd Updated all instances of ImmutableList to ImmutableArray 2024-10-28 14:34:29 +00:00
JPVenson f80fa96453 Removed unused Using 2024-10-28 11:54:58 +00:00
JPVenson 76df4c48bc Changed from ImmuntableList to ImmutableArray 2024-10-28 11:54:39 +00:00
JPVenson 9342a6a9d6 Reverted Primary Constructor 2024-10-28 11:54:08 +00:00
akshay 0bce3500fb Translated using Weblate (Hindi)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hi/
2024-10-28 07:41:38 -04:00
Spiros Vita 12db844d14 Translated using Weblate (Greek)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/el/
2024-10-28 07:41:38 -04:00
Frederik Palmø 6392970066 Translated using Weblate (Danish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/da/
2024-10-28 07:41:38 -04:00
JPVenson a3ae055779 Change ChannelId and OwnerId to be expected strings 2024-10-28 09:24:12 +00:00
JPVenson 07ed9a3ea4 Updated TryGetGuid for migration 2024-10-28 09:22:32 +00:00
JPVenson 3d87d0faa2 Fixed migration not loading guid for items 2024-10-28 09:02:24 +00:00
Joshua M. Boniface 0437511931 Merge pull request #12893 from HadrienPatte/auto-update-issue-template-version
Auto update issue template version on new release
2024-10-27 19:28:00 -04:00
Hadrien Patte 9d676f8836 Auto update issue template version on new release 2024-10-27 18:58:20 +01:00
Bond-009 f0700b76d5 Merge pull request #12882 from HadrienPatte/update-issue-template-version
Update issue template version from 10.9.11 to 10.10.0
2024-10-27 10:57:59 +01:00
Hadrien Patte 6b135ea209 Update issue template version from 10.9.11 to 10.10.0 2024-10-26 21:19:46 +02:00
Jellyfin Release Bot a0c634a6ed Bump version to 10.11.0 2024-10-26 13:32:51 -04:00
JPVenson 41c27d4e7e ATV requested endpoint mock 2024-10-26 16:59:12 +00:00
Rafael Morine 61861b1904 Translated using Weblate (Russian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ru/
2024-10-26 07:41:38 -04:00
JPVenson dc029d549c removed double dispose 2024-10-26 11:08:20 +00:00
JPVenson ebabaac6b1 removed dbg timeout 2024-10-26 10:47:38 +00:00
JPVenson cd81a698a6 Reverted change to network manager 2024-10-26 10:34:11 +00:00
JPVenson 1e7acec017 Added Setup overlay app to communicate status of startup 2024-10-26 10:31:01 +00:00
Nyanmisaka 3ceb8337e7 Fix check for format option in scale_cuda filter (#12874) 2024-10-25 12:52:27 -06:00
renovate[bot] 87c8feed4a Update dependency Serilog.Sinks.Async to 2.1.0 (#12870)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-25 12:51:43 -06:00
renovate[bot] fd411cda18 Update CI dependencies (#12869)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-25 12:51:35 -06:00
fract exe abd6649e5d Translated using Weblate (Croatian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hr/
2024-10-24 00:34:11 -04:00
David Carroll d6d6ebe3fb Update UUID for Rating Level migration 2024-10-23 09:21:53 -05:00
David Carroll 6f268736f0 Move TV-PG ratings to be in line with PG rating. 2024-10-22 23:20:59 -05:00
Bond-009 6f3d9688cf Merge pull request #12863 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v3.27.0
2024-10-22 22:00:38 +02:00
Bas f9ad453317 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2024-10-22 15:47:46 -04:00
nicito bd78a36db8 Translated using Weblate (Bulgarian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/bg/
2024-10-22 15:47:46 -04:00
renovate[bot] 5cc49d25c4 Update github/codeql-action action to v3.27.0 2024-10-22 17:13:53 +00:00
JPVenson 421b49dee9 Adapted Review sugestions 2024-10-22 11:47:05 +00:00
JPVenson a9f387f19b Reverted ImmutableList change 2024-10-22 10:56:02 +00:00
JPVenson bf7e6858d5 Reverted ToImmutableList change 2024-10-22 10:54:22 +00:00
JPVenson c2a0dfb1e5 Reodered Context creation 2024-10-22 10:53:39 +00:00
JPVenson 447ff1d23c Made Clean task async 2024-10-22 10:52:34 +00:00
JPVenson 88fb668cc5 Added Unittest to check for unapplied model changes (#12854) 2024-10-20 21:27:27 -06:00
JPVenson 5b696124fc Add catch to remove cached user if creation fails (#12574) 2024-10-20 21:27:18 -06:00
Blackspirits 31382b232d Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt/
2024-10-20 13:41:36 -04:00
Blackspirits 48f9b96029 Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt_PT/
2024-10-20 13:41:36 -04:00
JPVenson e331dc35ac Fixed tests 2024-10-20 11:04:54 +00:00
JPVenson d4ca8d58c4 Fixed Migrations 2024-10-20 10:31:43 +00:00
JPVenson 10a2a316a4 i have too much time.
Refactored BaseItem and UserData relation
2024-10-20 10:11:24 +00:00
JPVenson cd2e043472 Readded old library move in migration 2024-10-20 09:43:40 +00:00
Blackspirits b3da2ff8f4 Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt/
2024-10-19 13:01:03 -04:00
AfmanS 1b13273d61 Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt_PT/
2024-10-19 13:01:03 -04:00
Blackspirits 2e615b003d Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt_PT/
2024-10-19 13:01:03 -04:00
Blackspirits b2c8c0d361 Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt_PT/
2024-10-19 12:31:41 -04:00
Blackspirits 0caed5b410 Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt/
2024-10-19 12:31:41 -04:00
AfmanS 07b38b825a Translated using Weblate (Portuguese (Portugal))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt_PT/
2024-10-19 12:31:41 -04:00
Nyanmisaka df8edaa083 Fix seeking beyond EOF in HWA transcoding (#12847) 2024-10-19 08:46:13 -06:00
renovate[bot] cbd4e070bf Update dependency z440.atl.core to 6.6.0 (#12846)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-19 08:46:02 -06:00
renovate[bot] 4cc9811447 Update dependency AsyncKeyedLock to 7.0.2 (#12812)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-19 08:45:52 -06:00
renovate[bot] df06a37395 Update github/codeql-action action to v3.26.13 (#12820) 2024-10-19 08:31:01 -06:00
JP 12effd4e62 Translated using Weblate (Lithuanian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/lt/
2024-10-19 07:41:37 -04:00
gnattu 6813db06d7 Infer more audio codec from containers (#12837) 2024-10-19 05:23:48 -06:00
JPVenson 8b4fa42e49 Ensure Skia images are always disposed (#12786) 2024-10-17 07:35:03 -06:00
Cody Robibero 4251cbc277 Merge pull request #12824 from gnattu/don't-check-remote-trickplay 2024-10-16 07:01:09 -06:00
gnattu 5ac895bef6 Fix format 2024-10-16 17:50:19 +08:00
gnattu 666db81a09 Allow invalid id for trickplay
Co-authored-by: JPVenson <ger-delta-07@hotmail.de>
2024-10-16 17:47:24 +08:00
aevar fe05aa8cf1 Translated using Weblate (Icelandic)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/is/
2024-10-15 20:59:29 -04:00
myrad2267 143d70d264 Translated using Weblate (French (Canada))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fr_CA/
2024-10-15 20:59:29 -04:00
gnattu bcb2a3d5e9 Don't check remote sources for trickplay 2024-10-15 18:22:39 +08:00
Nyanmisaka 0bc142de9a Translated using Weblate (Chinese (Simplified Han script))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hans/
2024-10-14 16:41:36 -04:00
NOV 5ad6613b9e Translated using Weblate (French)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fr/
2024-10-14 16:41:36 -04:00
BryanHuas 7c22a99e05 Translated using Weblate (Spanish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es/
2024-10-13 10:41:37 -04:00
BryanHuas 3bc367da3b Translated using Weblate (Spanish (Mexico))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es_MX/
2024-10-13 10:41:37 -04:00
TonyB 5957790ce8 Use [0-9] instead of \d 2024-10-12 17:09:18 +08:00
TonyB 79ee36ee15 Add EpisodeExpression for anime file names 2024-10-12 17:09:18 +08:00
Bond-009 822d407584 Merge pull request #12777 from fice-t/MemberNotNull
NetworkManager: Use MemberNotNull attribute
2024-10-12 10:58:48 +02:00
Bond-009 8653722088 Merge pull request #12805 from jellyfin/renovate/serilog.aspnetcore-8.x
Update dependency Serilog.AspNetCore to 8.0.3
2024-10-12 10:49:06 +02:00
JPVenson e20ecfc670 applied review comments 2024-10-11 14:16:42 +00:00
JPVenson 058a567e00 Removed unused mapping tables 2024-10-11 11:46:43 +00:00
JPVenson 05ffa7b413 Applied Review Comments 2024-10-11 11:42:49 +00:00
JPVenson b73985e04f Expanded People architecture and fixed migration 2024-10-11 11:11:15 +00:00
Bas 577fb2c6fe Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2024-10-11 03:53:52 -04:00
renovate[bot] 4242a10dbe Update dependency Serilog.AspNetCore to 8.0.3 2024-10-11 06:24:17 +00:00
renovate[bot] 162021def9 Update CI dependencies (#12800)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-10 14:47:33 -06:00
JPVenson f397fc5b98 Fixed CustomType serialisation 2024-10-10 20:03:15 +00:00
Tom Deseyn 4492eb0e66 StartupHelper: fix app paths when SpecialFolder does not yet exists. (#12790) 2024-10-10 13:35:00 -06:00
JPVenson ae641b7f3a Applied review comments 2024-10-10 19:27:26 +00:00
JPVenson 9c5599f81b Applied review comments 2024-10-10 18:30:08 +00:00
JPVenson 439a997fca Readded custom serialisation 2024-10-10 18:01:14 +00:00
JPVenson ea4c208fde fixed string concat 2024-10-10 17:35:51 +00:00
JPVenson 5e922f1c10 Aggregated Migrations 2024-10-10 16:09:29 +00:00
JPVenson 441b995189 Applied Review Suggestions 2024-10-10 15:27:13 +00:00
JPVenson f58a24f005 Fixed tests 2024-10-10 15:23:34 +00:00
JPVenson ee0dad6f43 Refactored ItemValue structure 2024-10-10 14:32:49 +00:00
Bond-009 27ad11039c Merge pull request #12788 from jellyfin/renovate/serilog.settings.configuration-8.x
Update dependency Serilog.Settings.Configuration to 8.0.4
2024-10-10 07:59:06 +02:00
renovate[bot] aba905fa26 Update dependency Serilog.Settings.Configuration to 8.0.4 2024-10-10 01:01:18 +00:00
JPVenson 3e7ce5e1df Removed obsolete Score and Similiarity values for search 2024-10-10 00:57:19 +00:00
JPVenson 7f03f39bcc Fixed tests 2024-10-10 00:49:06 +00:00
JPVenson 7a5c7e70f6 Update comments 2024-10-10 00:02:16 +00:00
JPVenson 868bb9ea25 Update comments 2024-10-10 00:01:02 +00:00
JPVenson 2c2e33dd82 Updated .AsNoTracking() where applicable 2024-10-09 23:58:55 +00:00
JPVenson fe9c96d052 Used enum value for ItemValueType 2024-10-09 23:55:28 +00:00
JPVenson 4c86642c00 Added comments 2024-10-09 23:22:21 +00:00
JPVenson 2955f2f562 Fixed AncestorIds and applied review comments 2024-10-09 23:19:24 +00:00
JPVenson eb601e944c Expanded BaseItem aggregate types 2024-10-09 23:01:54 +00:00
JPVenson f1ae764041 Merge branch 'jellyfin:master' into feature/EFUserData 2024-10-09 21:05:27 +02:00
JPVenson 473628ba3a Apply suggestions from code review
Co-authored-by: Cody Robibero <cody@robibe.ro>
2024-10-09 21:03:57 +02:00
JPVenson 5267851e64 Add migration for library.db to jellyfin.db 2024-10-09 17:04:58 +00:00
JPVenson 01d834f21a Fixed (most) tests 2024-10-09 15:20:42 +00:00
renovate[bot] 7f878b8209 Update Microsoft (#12791)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-09 06:52:05 -06:00
JPVenson c2844bda3b Added EF BaseItem migration 2024-10-09 11:22:52 +00:00
JPVenson 3dc4024338 Added BaseItem Configuration 2024-10-09 11:02:47 +00:00
JPVenson 2014fa56b8 Ported new Item Repository architecture 2024-10-09 10:41:54 +00:00
JPVenson b09a41ad1f WIP porting new Repository structure 2024-10-09 10:36:08 +00:00
JPVenson be48cdd9e9 Naming refactoring and WIP porting of new interface repositories 2024-10-09 09:53:39 +00:00
Bond-009 82c4c6fffa Merge pull request #12787 from jellyfin/renovate/ci-deps 2024-10-09 08:00:10 +02:00
JPVenson 15bf43e3ad Removed BaseSqliteRepository 2024-10-08 19:53:26 +00:00
renovate[bot] 05cea509f2 Update CI dependencies 2024-10-08 19:34:21 +00:00
JPVenson 6acd146d17 WIP migration sqlite item repository to efcore 2024-10-08 19:11:31 +00:00
JPVenson ea81db67f4 Added Sorting and Grouping 2024-10-08 16:27:47 +00:00
JPVenson 90103165e2 Removed SimilarityScore and ported Search function 2024-10-08 15:16:03 +00:00
Anders 1341ead608 Translated using Weblate (Danish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/da/
2024-10-08 11:06:35 -04:00
JPVenson 527998cd0c WIP port search function 2024-10-08 13:46:21 +00:00
JPVenson d5409a26ea WIP Search refactoring and Provider ID refactoring 2024-10-08 13:18:48 +00:00
JPVenson 6c819fe516 WIP BaseItem search refactoring 2024-10-08 12:27:27 +00:00
JPVenson d3a3d9fce3 Merge remote-tracking branch 'jellyfinorigin/master' into feature/EFUserData 2024-10-08 09:34:34 +00:00
rushmash aaf20592bb Translated using Weblate (Belarusian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/be/
2024-10-07 15:41:37 -04:00
renovate[bot] bfc6ee616c Update appleboy/ssh-action action to v1.1.0 (#12781)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-06 16:20:36 -06:00
Cody Robibero 6a9a9546fd Clean up logging in MediaSegmentManager (#12776) 2024-10-06 16:20:14 -06:00
Yon Ploj b988b989d5 Translated using Weblate (Slovenian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/sl/
2024-10-05 18:41:35 -04:00
Roi Gabay 62755c7312 Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/he/
2024-10-05 18:41:35 -04:00
Alexander Gramiak 76ac1e6143 NetworkManager: Use MemberNotNull attribute
Added in .NET 5, this attribute allows for the compiler to recognize
that InitializeLan (and by extension, UpdateSettings) will initialize
the specified fields.
2024-10-05 15:28:30 -06:00
Daniel b5d89a67e8 Translated using Weblate (Finnish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fi/
2024-10-04 14:41:37 -04:00
millallo eb56475651 Translated using Weblate (Italian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/it/
2024-10-04 14:41:37 -04:00
Bond-009 fe168135ae Merge pull request #12769 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v3.26.11
2024-10-04 18:46:34 +02:00
gnattu 18a621ec25 Extract DoVi thumbnail at 4000nit (#12771) 2024-10-04 06:51:17 -06:00
joshjryan 3edd6ab767 Fix allow inputContainer to be null for Live TV (#12770) 2024-10-04 06:51:08 -06:00
renovate[bot] e0d78f9731 Update github/codeql-action action to v3.26.11 2024-10-03 22:32:24 +00:00
Nyanmisaka b496f979f0 Clean up deprecated -vsync option (#12765) 2024-10-03 08:18:40 -06:00
renovate[bot] 9604088e3c Update github/codeql-action action to v3.26.10 (#12754)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-02 10:35:02 -06:00
Nyanmisaka 368edeb8ad Fix full range in SW decoder & HW encoder for Trickplay (#12763) 2024-10-02 10:34:40 -06:00
Filip S 973eaf5caf Translated using Weblate (Macedonian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/mk/
2024-10-01 23:14:32 -04:00
Roi Gabay abcd6cd10d Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/he/
2024-10-01 23:14:31 -04:00
Nyanmisaka ee54231715 Translated using Weblate (Chinese (Simplified Han script))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hans/
2024-10-01 10:15:28 -04:00
Léon 4314b451d9 Translated using Weblate (French)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fr/
2024-10-01 10:15:28 -04:00
Nyanmisaka 4317702559 Fix RKMPP-DRM-OpenCL mapping (#12758) 2024-10-01 07:02:01 -06:00
Nyanmisaka f36e73e748 Improve Trickplay image quality using HQ scaler on intel (#12759) 2024-10-01 07:01:33 -06:00
gnattu 7cc3f9506e Disable ATL's internal ID3v2.2/3 splitting (#12751) 2024-09-30 07:15:52 -06:00
gnattu 9ef7ccfc12 Add perf tradeoff mode to image extractor (#12744) 2024-09-29 20:21:46 -06:00
Nyanmisaka 77420739e6 Handle full range output in tonemap filter for Trickplay (#12746) 2024-09-29 20:21:36 -06:00
Tim Eisele 0ef72683bb Do not consider tags in search (#12741) 2024-09-29 20:21:24 -06:00
renovate[bot] 6773223da4 Update dependency z440.atl.core to 6.5.0 (#12748) 2024-09-29 20:20:43 -06:00
Bond-009 8ca4963ff3 Merge pull request #12742 from jellyfin/renovate/ci-deps
Update danielpalme/ReportGenerator-GitHub-Action action to v5.3.10
2024-09-29 19:25:34 +02:00
renovate[bot] 2ed802424a Update danielpalme/ReportGenerator-GitHub-Action action to v5.3.10 2024-09-28 21:29:15 +00:00
gnattu 992d56e565 Workaround ATL tag parsing (#12705) 2024-09-28 08:52:05 -06:00
Tim Eisele d10406fd75 Pre-fill ParentIndexNumber to preserve it between scans (#12739) 2024-09-28 08:51:48 -06:00
Tim Eisele c8c58d6aac Add missing migration for SegmentProviderId (#12735) 2024-09-28 03:56:11 -06:00
renovate[bot] a55e6b7fbc Update CI dependencies (#12707) 2024-09-28 03:55:36 -06:00
renovate[bot] d255900957 Update dependency prometheus-net.DotNetRuntime to 4.4.1 (#12729) 2024-09-28 03:55:09 -06:00
Nyanmisaka f52f5290b2 Fix vpp tonemap pixfmt regression (#12733) 2024-09-28 03:36:33 -06:00
Nyanmisaka e5f5f7c384 Fix the invalid libplacebo filter option (#12732) 2024-09-28 12:14:42 +08:00
BromTeque 2ccb8b7380 Translated using Weblate (Norwegian Bokmål)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nb_NO/
2024-09-27 17:41:39 -04:00
Bond-009 b973c91781 Merge pull request #12728 from jellyfin/renovate/xunit-dotnet-monorepo
Update dependency xunit to 2.9.2
2024-09-27 11:06:24 +02:00
renovate[bot] 7f38b19238 Update dependency xunit to 2.9.2 2024-09-27 04:00:18 +00:00
Tim Wang b7093b0d40 Translated using Weblate (Japanese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ja/
2024-09-26 13:25:00 -04:00
Tim Eisele e67dd3fc0e Add endpoint for getting playlists by id (#12697) 2024-09-26 07:45:08 -06:00
Cody Robibero bc9594aeed Merge pull request #12700 from elfalem/allowed-tags-private-playlist 2024-09-26 07:44:43 -06:00
elfalem 8499be23cc Update SqliteItemRepository.cs - incorporate review suggestion
Co-authored-by: Bond-009 <bond.009@outlook.com>
2024-09-25 20:05:00 -04:00
gnattu 75bbd30296 Fix get sessions with api key (#12696) 2024-09-24 08:15:53 -06:00
gnattu 38d0b004ba Only move trickplay file should not be saved with media to metadata dir (#12704) 2024-09-24 08:12:04 -06:00
Niels van Velzen 30be00adb2 Merge pull request #12698 from jellyfin/fix-libraryoptions-api
Sanitize CustomTagDelimiters server side
2024-09-24 08:37:35 +02:00
gnattu 0ffddacf11 Move GetCustomTagDelimiters to Extension 2024-09-24 12:36:05 +08:00
elfalem dafd186410 Ensure user's own playlists are accessible regardless of allowed tags 2024-09-23 18:52:18 -04:00
gnattu 00ca4abbe1 Sanitize CustomTagDelimiters server side
The API requires an array type and does not support runtime generated default value. Use server side helper function to sanitize it into char.
2024-09-24 05:15:46 +08:00
Nyanmisaka cb8f01065a Fix MJPEG hwenc may be incorrectly enabled on AMDGPU (#12695) 2024-09-23 11:24:49 -06:00
Cody Robibero 3c639c2e80 Tweak Trickplay migration for speed (#12643) 2024-09-23 09:09:23 -06:00
gnattu 0539fdc5e3 Fix libx264/libx265 auto preset (#12692) 2024-09-23 09:09:08 -06:00
Nyanmisaka a0204ada2f Fix intel Xe kernel driver cannot be used with QSV (#12691) 2024-09-23 09:02:31 -06:00
Dmitry Lyzo 8a456bf895 Escape quotes in the subtitle path (#12690) 2024-09-23 09:01:45 -06:00
renovate[bot] aed00733f8 Update dependency xunit to 2.9.1 (#12687)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Cody Robibero <cody@robibe.ro>
2024-09-22 19:44:37 -06:00
elfalem 9ec85a0f18 Allow Playlists access for users with allowed tags configured (#12686) 2024-09-22 18:50:29 -06:00
Nyanmisaka 5d5afe10e8 Fix incorrect input range for certain hw JPEG encoders (#12683) 2024-09-22 18:50:18 -06:00
Nyanmisaka c108e5c485 Translated using Weblate (Chinese (Simplified Han script))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hans/
2024-09-22 16:24:33 -04:00
hoanghuy309 e21592f473 Translated using Weblate (Vietnamese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/vi/
2024-09-22 14:11:12 -04:00
Niels van Velzen 4dcae54035 Fix GetTrickplayTileImage operation name (#12681) 2024-09-22 10:25:43 -06:00
Niels van Velzen 39747ee80b Fix media segment operation name (#12682) 2024-09-22 10:25:25 -06:00
Niels van Velzen bcc818f397 Fix DeviceProfile.Id should be nullable (#12679) 2024-09-22 08:58:23 -06:00
Nyanmisaka b162e9290b Fix the diff between requested and actual resolution in RKMPP (#12680) 2024-09-22 08:58:15 -06:00
Nyanmisaka 62606e46b5 Translated using Weblate (Chinese (Simplified Han script))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hans/
2024-09-22 05:57:44 -04:00
gnattu 56cf1a581c Better bitrate and resolution normalization (#12644) 2024-09-21 20:01:47 -06:00
Cody Robibero c97c2217a5 Merge pull request #12676 from gnattu/rework-burnin-during-transcoding
Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com>
2024-09-21 20:01:33 -06:00
gnattu 4502024468 Remove all subtitle options from audio endpoints
Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com>
2024-09-22 04:41:30 +08:00
gnattu 1346ebc134 Don't add subtitle option to audio endpoint 2024-09-22 03:13:30 +08:00
gnattu c3e889cd41 Conditionally add burn in option for remote source 2024-09-22 01:11:23 +08:00
gnattu d944f415f3 Let HLS Controller decide if subtitle should be burn in
Previously, we predicted whether the subtitle should be burned in with transcode reasons, but that was not accurate because the actual transcoding codec is only determined after the client has requested the stream. This pass through the option to the `DynamicHlsController` to handle the subtitle burn-in during the actual transcoding process. Now the client should be responsible to conditionally load the subtitle when this option is enabled.
2024-09-22 00:35:41 +08:00
l00d3r 38f80edc80 Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/et/
2024-09-21 08:56:32 -04:00
l00d3r 092e9e29f1 Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/et/
2024-09-21 08:33:34 -04:00
l00d3r 78638c72fb Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/et/
2024-09-21 08:15:16 -04:00
Tim Eisele 9ff7575c85 Fix metadata merge for BoxSets (#12583) 2024-09-20 07:46:44 -06:00
renovate[bot] 41fb696ef6 Update github/codeql-action action to v3.26.8 (#12672)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-20 07:46:31 -06:00
Nyanmisaka e615b56a70 Fix RKMPP 2pass scaling in Trickplay (#12675) 2024-09-20 07:01:58 -06:00
Bond-009 e005c32151 Merge pull request #12673 from nyanmisaka/rkmppdec-nokey
Enable key-frame only decoding for RKMPP trickplay
2024-09-20 11:49:27 +02:00
nyanmisaka 7ab7f69916 Enable key-frame only decoding for RKMPP trickplay
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2024-09-20 03:22:53 +08:00
Bas 2c0520b540 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2024-09-19 11:42:42 -04:00
Cody Robibero b8ccf7fa70 Merge pull request #12587 from Shadowghost/session-info-dto 2024-09-19 09:04:01 -06:00
Tim Eisele d4bde14a01 Update src/Jellyfin.Extensions/Json/Converters/JsonDelimitedArrayConverter.cs
Co-authored-by: Bond-009 <bond.009@outlook.com>
2024-09-19 16:46:59 +02:00
Nyanmisaka 93db8990d9 Enable HEVC RExt HW decoding for 4:2:2/4:4:4 content (#12664) 2024-09-19 07:14:18 -06:00
Brian Howe 03aa37731b Watch library directories with perm errors (#10684) 2024-09-19 07:12:32 -06:00
Balázs Meskó 9c4bf48b4e Translated using Weblate (Hungarian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hu/
2024-09-19 00:41:54 -04:00
Marc Brooks 6dc61a430b Sort embedded collections in Nfo files
Because the Nfo files emit the collections as they are in-memory, the
files are not stable in format, genres, tags, albums, people, etc. are emitted in random orders. Add ordering of the collections when emitting the Nfo files so the file remains stable (unchanged) when underlying media information doesn't change.

In the process of this, it became clear that most of the providers and probes don't trim the strings like people's names, genre names, etc. so did a pass of Trim cleanup too.

Specific ordering: (alphabetical/numeric ascending after trimming blanks and defaulting to zero for missing numbers)

BaseItem: Directors, Writers, Trailers (by Url), Production Locations, Genres, Studios, Tags, Custom Provider Data (by key), Linked Children  (by Path>LibraryItemId), Backdrop Images (by path), Actors (by SortOrder>Name)

AlbumNfo: Artists, Album Artists, Tracks (by ParentIndexNumber>IndexNumber>Name)

ArtistNfo: Albums (by Production Year>SortName>Name)

MovieNfo: Artists

Fix Debug build lint


Fix CI debug build lint issue.


Fix review issues

Fixed debug-build lint issues.
Emits the `disc` number to NFO for tracks with a non-zero ParentIndexNumber and only emit `position` if non-zero.
Removed the exception filtering I put in for testing.

Don't emit actors for MusicAlbums or MusicArtists


Swap from String.Trimmed() to ?.Trim()
Addressing PR feedback

Can't use ReadOnlySpan in an async method

Removed now-unused namespace
2024-09-18 20:33:18 -05:00
Shadowghost 5bfb7b5d11 Remove invalid test 2024-09-18 16:18:14 +02:00
Shadowghost ffa1c370fd Fix permission checks 2024-09-18 16:10:13 +02:00
Shadowghost 0a982e2bfd Return empty response instead of not found 2024-09-18 16:04:29 +02:00
Shadowghost 7a2427bf07 Add SessionInfoDto, DeviceInfoDto and implement JsonDelimitedArrayConverter.Write 2024-09-18 15:42:15 +02:00
gnattu 569a41fc2a Don't expose hwaccel type for non-admin (#12663) 2024-09-18 07:25:28 -06:00
gnattu 97d2f778f8 Only sort item by width when they have the same path (#12626) 2024-09-18 07:22:53 -06:00
gnattu 901573473d Sort by version name before resolution sorting (#12621) 2024-09-18 07:22:33 -06:00
Cody Robibero 8c8972f0b5 Merge pull request #9374 from Shadowghost/fixup2 2024-09-18 07:21:43 -06:00
Chris Lee 0f9a8d8ee1 Translated using Weblate (Norwegian Bokmål)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nb_NO/
2024-09-18 03:41:35 -04:00
Shadowghost 5a5da33f44 Apply review suggestions 2024-09-17 23:34:12 +02:00
Shadowghost 2351eeba56 Rework PR 6203 2024-09-17 20:35:23 +02:00
gnattu 41ac5f8d76 Fix subtitle dar comparison when number not exact (#12660) 2024-09-17 07:08:16 -06:00
Cody Robibero 93b40b04cb Merge pull request #12639 from gnattu/more-streambuilder-test 2024-09-16 11:03:14 -06:00
gnattu b92fc7ea9d Don't resolve trickplay folder during media scanning (#12652) 2024-09-16 10:47:12 -06:00
Nyanmisaka d3e7f53d93 Fix some PGSSUB burn-in perf regressions (#12655) 2024-09-16 10:47:02 -06:00
sand14 2a6f7c1a40 Translated using Weblate (Romanian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ro/
2024-09-15 20:41:35 -04:00
Filipe Motta 523e0c927e Translated using Weblate (Portuguese (Brazil))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt_BR/
2024-09-15 20:41:34 -04:00
xwr 66bfb2b4f8 Translated using Weblate (Galician)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/gl/
2024-09-14 13:41:36 -04:00
Sebastião josé 7df938674e Translated using Weblate (Portuguese (Brazil))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt_BR/
2024-09-14 13:41:36 -04:00
NonameMissingNo 195142861c Translated using Weblate (Hungarian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hu/
2024-09-14 13:41:36 -04:00
gnattu ffbfd46dea Move progressive tests to old place 2024-09-14 03:28:14 +08:00
gnattu 3d43b834de Remove redundant info 2024-09-14 01:34:06 +08:00
Dmitry Lyzo 77c6fd5ab2 Improve direct profile ranking 2024-09-14 01:26:51 +08:00
gnattu 6a5f22fc2f Revert "Return more precise transcoding reasons"
This reverts commit de8bb15c

Signed-off-by: gnattu <gnattuoc@me.com>
2024-09-14 01:24:57 +08:00
gnattu 118c583bff Add Dolby Vision testing
Signed-off-by: gnattu <gnattuoc@me.com>
2024-09-14 01:23:41 +08:00
Bond-009 2f602deb5a Merge pull request #12642 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v3.26.7
2024-09-13 18:11:09 +02:00
renovate[bot] 1e94511f79 Update github/codeql-action action to v3.26.7 2024-09-13 15:31:51 +00:00
gnattu b0e6c357f7 Restore progressive transcoding tests
Signed-off-by: gnattu <gnattuoc@me.com>
2024-09-13 23:26:48 +08:00
gnattu af92b4370f Fix safari test
Signed-off-by: gnattu <gnattuoc@me.com>
2024-09-13 23:19:35 +08:00
gnattu cefcbcb2ac Add mkv h264 ac3 tests
Signed-off-by: gnattu <gnattuoc@me.com>
2024-09-13 23:17:33 +08:00
gnattu 5913db991b Improve readability
Signed-off-by: gnattu <gnattuoc@me.com>
2024-09-13 22:46:36 +08:00
gnattu edc15c8e92 Add broken fps mkv test
Signed-off-by: gnattu <gnattuoc@me.com>
2024-09-13 18:20:07 +08:00
gnattu de8bb15c78 Return more precise transcoding reasons
Using the first profile's reason is somewhat arbitrary, as many clients' first profile may not be the most compatible one. For instance, browsers often set WebM as the first profile, which doesn’t support common codecs like H.264 and AAC by design. This causes `VideoCodecNotSupported` and `AudioCodecNotSupported` to be returned, even if the browser supports those codecs. Only use those reasons when all profiles indicate that the codec is not supported.

Signed-off-by: gnattu <gnattuoc@me.com>
2024-09-13 18:19:05 +08:00
gnattu 6395f4889d Update unit test for StreamBuilder to reflect current server and clients
Signed-off-by: gnattu <gnattuoc@me.com>
2024-09-13 15:44:03 +08:00
Niels van Velzen 7d178aad0b Merge pull request #12636 from gnattu/fix-ci
Remove redundant newline to fix CI
2024-09-13 07:34:38 +02:00
gnattu 3c64e1d33f Remove redundant newline to fix CI
Signed-off-by: gnattu <gnattuoc@me.com>
2024-09-13 10:07:10 +08:00
Josh Hood a529edaad1 Translated using Weblate (Cornish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/kw/
2024-09-12 18:41:36 -04:00
Ruben Teixeira acbe4082a8 Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt/
2024-09-12 18:41:36 -04:00
BromTeque ac55682260 Translated using Weblate (Norwegian Bokmål)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nb_NO/
2024-09-12 18:41:35 -04:00
gnattu 90a00e1293 Only remove images in metadata folder by default (#12631) 2024-09-12 13:45:38 -06:00
Bond-009 6b646e24ea Don't extract chapter images if chapters are <1s long on average (#11832) 2024-09-12 13:44:57 -06:00
gnattu 62712aa12c Add option to always burn in subtitles if transcoding is triggered (#12430) 2024-09-12 09:53:21 -06:00
gnattu 0ff7f28753 Enable BWDIF VideoToolbox deint filter when available (#12634) 2024-09-12 09:52:24 -06:00
Nyanmisaka 6deebb4498 Fix QSV presets may be empty (#12633) 2024-09-12 09:52:03 -06:00
felix920506 751e12e5b5 Translated using Weblate (Chinese (Traditional))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant/
2024-09-11 16:41:36 -04:00
Nyanmisaka 074d9aa5d5 Translated using Weblate (Chinese (Simplified))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hans/
2024-09-11 16:41:36 -04:00
queeup fdb3f3c7b7 Translated using Weblate (Turkish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/tr/
2024-09-11 16:41:36 -04:00
nextlooper42 23590bb962 Translated using Weblate (Slovak)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/sk/
2024-09-11 16:41:36 -04:00
Andi Chandler 624800a1c7 Translated using Weblate (English (United Kingdom))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/en_GB/
2024-09-11 16:41:36 -04:00
Cody Robibero e6ceab46a4 Merge pull request #12627 from oxixes/burn-subtitle-cache 2024-09-11 12:10:17 -06:00
Gary Wang 81aca67745 feat(i18n): able to finetune transliterator (#12378) 2024-09-11 09:36:56 -06:00
oxixes dd462f8072 Add @oxixes to contributors 2024-09-11 11:50:51 +02:00
oxixes d2c2dcd53c Solve CodeQL issue 2024-09-11 11:43:02 +02:00
jaina heartles f38e715d01 Add @heartles to CONTRIBUTORS.md 2024-09-11 10:03:27 +02:00
jaina heartles 7c3c0aa940 Use subtitle cache when burning-in subs 2024-09-11 10:03:08 +02:00
stanol c67b78bc68 Translated using Weblate (Ukrainian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/uk/
2024-09-10 13:41:35 -04:00
無情天 7d2a498f68 Translated using Weblate (Chinese (Simplified))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hans/
2024-09-10 13:41:35 -04:00
Hoomaane79 c14b530692 Translated using Weblate (Persian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fa/
2024-09-10 13:41:35 -04:00
gnattu 987dbe98c8 cli: add option to disable network change detection (#11253) 2024-09-09 13:17:10 -06:00
Dmitry Lyzo 3da081ba86 Add audio ranking for transcoding profiles (#12546) 2024-09-09 13:16:58 -06:00
Jolter 43861f0ce1 Translated using Weblate (Swedish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/sv/
2024-09-09 11:41:36 -04:00
Kityn 34323ae811 Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pl/
2024-09-09 11:41:36 -04:00
Bas 9bbb3b6164 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2024-09-09 11:41:36 -04:00
Federico Abella 0003a55c1d Translated using Weblate (Spanish (Argentina))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es_AR/
2024-09-09 11:41:36 -04:00
Lea3D 98ea585a0f Translated using Weblate (German)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/de/
2024-09-09 11:41:36 -04:00
Lukáš Kucharczyk d93eb9a87e Translated using Weblate (Czech)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/cs/
2024-09-09 11:41:36 -04:00
Nyanmisaka 36d934f4c0 Enable Rockchip MJPEG encoder for Trickplay (#12610) 2024-09-09 09:24:45 -06:00
Tim Eisele 0d85af019c Use enums for encoding options (#12561) 2024-09-09 08:43:37 -06:00
Dmitry Lyzo 54f663b0f3 Extract condition from Where clause to eliminate extra filtering (#12614) 2024-09-09 07:51:28 -06:00
JPVenson ee1bdf4e22 WIP move baseitem to jellyfin.db 2024-09-08 16:56:14 +00:00
fabriciodeuner ae1dd5b1fc Translated using Weblate (Portuguese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt/
2024-09-08 10:41:35 -04:00
fabriciodeuner 57b17b174f Translated using Weblate (Portuguese (Brazil))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt_BR/
2024-09-08 10:41:35 -04:00
bene toffix cfb19fa9fc Translated using Weblate (Catalan)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ca/
2024-09-08 10:41:35 -04:00
Niels van Velzen 32c4d50912 Merge pull request #12613 from TimGels/chore-update-issue-template-version
Update issue template version from 10.9.10 to 10.9.11
2024-09-08 15:37:03 +02:00
TimGels 40c5dc92c0 Update issue template version from 10.9.10 to 10.9.11 2024-09-08 15:27:02 +02:00
Niels van Velzen dbba4ef4f6 Merge pull request #12608 from gnattu/fix-trickplay-migration
Fix trickplay migration
2024-09-08 09:46:53 +02:00
Niels van Velzen a75163a49f Merge pull request #12607 from gnattu/stream-writer-type
Fix FormattingStreamWriter type
2024-09-08 09:46:43 +02:00
gnattu a1b84d2dea Fix trickplay migration
The auto import generated by IDE used wrong namespace

Signed-off-by: gnattu <gnattuoc@me.com>
2024-09-08 15:05:55 +08:00
gnattu 97ba12b8ef Fix FormattingStreamWriter type
Signed-off-by: gnattu <gnattuoc@me.com>
2024-09-08 11:45:38 +08:00
gnattu c6de7225b9 Add non-standard multi-value audio tag support (#12385) 2024-09-07 21:10:59 -06:00
gnattu b4f71859d9 Make Live TV compatibility profiles customizable (#12529) 2024-09-07 21:08:54 -06:00
dmitrylyzo 84b20afe1f Backport pull request #12575 from jellyfin/release-10.9.z
Fix subtitle and attachment extraction when input path contains quotes

Original-merge: 3c3ebe8344

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-09-07 18:09:54 -04:00
Bond-009 e10b986ea0 Backport pull request #12558 from jellyfin/release-10.9.z
Fix alt version name generation

Original-merge: 70f4f2e8c2

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-09-07 18:09:53 -04:00
Bond-009 7631956451 Backport pull request #12550 from jellyfin/release-10.9.z
Create and use FormattingStreamWriter

Original-merge: cd2f2ca178

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-09-07 18:09:52 -04:00
gnattu c7bb2fe137 Backport pull request #12531 from jellyfin/release-10.9.z
Don't apply chapter image settings to music

Original-merge: 2fe13f54ea

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

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-09-07 18:08:41 -04:00
JPVenson 5ceedced1c Feature/media segments plugin api (#12359) 2024-09-07 14:56:51 -06:00
JPVenson d0b4b2ddb3 Migrated UserData from library sqlite db to jellyfin.db 2024-09-07 19:07:34 +00:00
renovate[bot] fc247dab92 Update dependency z440.atl.core to 6.4.0 (#12606)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-07 12:04:09 -06:00
Tim Eisele c56dbc1c44 Enhance Trickplay (#11883) 2024-09-07 11:23:48 -06:00
Niels van Velzen 675a8a9ec9 Remove left-over network path references (#12446) 2024-09-07 11:22:31 -06:00
gnattu df00909b85 Backport #12562 and #12521 (#12602)
Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com>
Co-authored-by: Nyanmisaka <nst799610810@gmail.com>
2024-09-07 11:21:14 -06:00
Nyanmisaka 5d4f71eb9a Enable tone-mapping and HLS remuxing for DoVi Profile 10 in AV1 (#12604) 2024-09-07 11:19:26 -06:00
llutic d0567fc8c6 Add support DoVi Profile 10 (#11559) 2024-09-07 11:18:18 -06:00
gnattu ced2d21f7b Add SUPPLEMENTAL-CODECS for Dolby Vision video with fallbacks (#12605) 2024-09-07 11:17:16 -06:00
gnattu 5a8a19e07b Add MediaStream.ReferenceFrameRate for problematic video files (#12603)
Co-authored-by: Nyanmisaka <nst799610810@gmail.com>
2024-09-07 11:16:23 -06:00
Jesus Lopez Reynosa 57452d65ef Translated using Weblate (Spanish (Mexico))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es_MX/
2024-09-06 19:41:35 -04:00
Niels van Velzen d250f7bd95 Merge pull request #12420 from gnattu/codec-profile-subcontainer
Add SubContainer support to CodecProfile
2024-09-06 22:04:10 +02:00
Niels van Velzen 435e50fd9a Merge pull request #12578 from Shadowghost/task-cleanup
Cleanup tasks
2024-09-06 21:58:04 +02:00
Niels van Velzen bafbc2372c Merge pull request #12552 from Bond-009/passwordhashing
Increase password hash iterations
2024-09-06 21:57:35 +02:00
Niels van Velzen 2b492ed8cd Merge pull request #12545 from Bond-009/sha1
Remove passwordSha1 param from AuthenticateUser function
2024-09-06 21:56:59 +02:00
Niels van Velzen cc2f91b331 Merge pull request #12547 from Bond-009/userdatamanager
Clean up UserDataManager
2024-09-06 21:56:42 +02:00
Niels van Velzen 9afaa6ae4d Merge pull request #12548 from Bond-009/utf8bom
Remove BOM from UTF-8 files
2024-09-06 21:56:31 +02:00
Cody Robibero 5929a04bea Only run on pull_request_target, use jellyfin-bot (#12599) 2024-09-06 19:46:22 +02:00
Bond-009 ccfd8fa66c Merge pull request #12590 from nyanmisaka/bwdif-cuda-deint
Enable the new BWDIF CUDA deint filter when available
2024-09-06 17:14:44 +02:00
renovate[bot] 2798759216 Update dependency BlurHashSharp.SkiaSharp to 1.3.3 (#12591)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-06 16:51:45 +02:00
renovate[bot] c9c0b91d56 Update dependency BlurHashSharp to 1.3.3 (#12589)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-06 08:21:32 -06:00
Nyanmisaka 48b2941cfe Add native VPP tonemap for QSV on Windows (#12592) 2024-09-06 07:48:00 -06:00
Łukasz 1451cbc39e Add subtitle parser errors to log if available (#12479) 2024-09-06 07:47:06 -06:00
Cody Robibero cd95eabcc6 ABI Diff action - use Github Token (#12594) 2024-09-06 13:18:19 +00:00
renovate[bot] d7b753ae3a Update dependency libse to 4.0.8 (#12598)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-06 07:16:32 -06:00
Bond-009 1f5ce4e4a2 Merge pull request #12588 from jellyfin/renovate/ci-deps
Update CI dependencies
2024-09-06 00:16:22 +02:00
MattiaPell 3757102919 Translated using Weblate (Italian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/it/
2024-09-05 14:41:35 -04:00
Hoomaane79 843f55fedc Translated using Weblate (Persian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fa/
2024-09-05 14:41:35 -04:00
RobotFK a83333e475 Translated using Weblate (German)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/de/
2024-09-05 14:41:35 -04:00
nyanmisaka aecd294fd7 Enable the new BWDIF CUDA deint filter when available
this requires jellyfin-ffmpeg7

Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2024-09-05 22:27:58 +08:00
renovate[bot] f8e5908fd6 Update CI dependencies 2024-09-05 14:01:11 +00:00
Cody Robibero 12a88fe042 Add ABI compat workflow (#11132) 2024-09-05 08:00:24 -06:00
Bond-009 46dbc53092 Merge pull request #12584 from jellyfin/renovate/microsoft
Update dependency Microsoft.NET.Test.Sdk to 17.11.1
2024-09-05 14:23:58 +02:00
renovate[bot] 8bd46d35fe Update dependency Microsoft.NET.Test.Sdk to 17.11.1 2024-09-05 07:23:12 +00:00
Stepan Goremykin a3cc39ddd8 Use frozen collections in MimeTypes.cs (#10826)
Co-authored-by: Stepan Goremykin <goremukin@gmail.com>
2024-09-04 17:47:01 -06:00
renovate[bot] e1076bab9c Update dependency z440.atl.core to 6.3.0 (#12581)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-04 17:46:49 -06:00
Shadowghost 994266a54f Fixup 2024-09-04 17:50:15 +02:00
Jonas Jensen de07c146c9 Translated using Weblate (Danish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/da/
2024-09-04 11:41:35 -04:00
Shadowghost 08ed0a9a5d Cleanup tasks 2024-09-04 17:38:10 +02:00
Bond-009 737a1b8a37 Merge pull request #12384 from evanjarrett/qsv-renderdevice
Update QSV device args  to use the renderNodePath
2024-09-04 16:06:07 +02:00
Bond-009 3b2e4e27eb Merge pull request #12567 from jellyfin/renovate/z440.atl.core-6.x
Update dependency z440.atl.core to 6.2.0
2024-09-04 15:49:57 +02:00
Nyanmisaka 95f91e0263 Adapting AMD VAAPI-Vulkan pipeline to FFmpeg 7.0 (#12577) 2024-09-04 07:36:49 -06:00
gnattu e68755a6c1 Allow SW encoders to use VideoToolbox HW filters (#12576) 2024-09-04 07:36:20 -06:00
Bond-009 6995e747c2 Merge pull request #12571 from jellyfin/dovi-sw-tonemapx
Enable software tonemap for dolby vision
2024-09-04 12:37:19 +02:00
renovate[bot] 31b8651117 Update danielpalme/ReportGenerator-GitHub-Action action to v5.3.9 (#12573)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-03 13:48:25 -06:00
Facu 972174b1e4 Translated using Weblate (Spanish (Latin America))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es_419/
2024-09-03 10:43:55 -04:00
Facu fa9b87ca0a Translated using Weblate (Spanish (Argentina))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es_AR/
2024-09-03 10:43:54 -04:00
Facu 7fad6b753e Translated using Weblate (German)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/de/
2024-09-03 10:43:54 -04:00
gnattu dbf91be3a6 Remove redundant frame conversion for vaapi
Signed-off-by: gnattu <gnattuoc@me.com>
2024-09-03 15:23:48 +08:00
gnattu ae82a4eee0 Enable software tonemap for dolby vision
This applies software tonemapx filter for dolby vision videos that have no compatability fallback.

Due to the complexity of the reshaping process, this is quite CPU-intensive. For real-time transcoding and tonemapping of 4K 60fps content, a CPU with 16 cores of Zen3-level performance is recommended.

Signed-off-by: gnattu <gnattuoc@me.com>
2024-09-03 14:39:05 +08:00
uxdesignerhector c0f212b459 Translated using Weblate (Spanish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es/
2024-09-02 09:41:34 -04:00
Niels van Velzen 46508880c7 Merge pull request #12559 from TimGels/chore-update-issue-template-version
Update issue template version from 10.9.9 to 10.9.10
2024-09-02 11:26:58 +02:00
renovate[bot] 2d024327b8 Update dependency z440.atl.core to 6.2.0 2024-09-01 23:36:38 +00:00
Bond-009 9effdc7df6 Merge pull request #12543 from Shadowghost/upgrade-lrcparser
Upgrade LRCParser to 2024.0728.2
2024-08-31 21:59:29 +02:00
Bond-009 eaca25d456 Merge pull request #12549 from Bond-009/livetvcontrollertests
Add LiveTvController tests
2024-08-31 21:59:19 +02:00
Bond-009 8c46c22c64 Merge pull request #12551 from Bond-009/pluginscontrollertests
Add PluginsController tests
2024-08-31 21:59:07 +02:00
TimGels b08b81cf7c Update issue template version from 10.9.9 to 10.9.10 2024-08-31 19:58:31 +02:00
Martin Clüwer Slåtsve b5a1811784 Translated using Weblate (Norwegian Bokmål)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nb_NO/
2024-08-31 07:44:46 -04:00
Josh Hood 93ef62f239 Translated using Weblate (Cornish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/kw/
2024-08-31 07:44:46 -04:00
Bond-009 5f86bb6dcd Merge pull request #12553 from jellyfin/renovate/ci-deps
Update actions/upload-artifact action to v4.4.0
2024-08-31 11:29:32 +02:00
renovate[bot] 8518769e6b Update actions/upload-artifact action to v4.4.0 2024-08-30 18:54:49 +00:00
Bond_009 e69e097e19 Increase password hash iterations
It has been a while since this was last updated: https://github.com/jellyfin/jellyfin/pull/6818
Recommendations have changed since: https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html#pbkdf2
2024-08-30 19:29:23 +02:00
Bond-009 7207749044 Merge pull request #12540 from nyanmisaka/tune-x2645-params
Tune x264/5 encoding params for realtime playback
2024-08-30 17:22:50 +02:00
Bond-009 1c7d90c3dc Merge pull request #12533 from Bond-009/ffmpegtimeout
Improve error message when image extraction times out
2024-08-30 17:22:39 +02:00
Bond_009 1082f20c20 Add PluginsController tests 2024-08-30 16:23:11 +02:00
Bond_009 af4b810c5e Add LiveTvController tests 2024-08-30 16:13:33 +02:00
Bond_009 97a02f5803 Remove BOM from UTF-8 files
I think some people need to change their IDE configuration ;)
2024-08-30 15:29:48 +02:00
Bond_009 277830855d Clean up UserDataManager
* enable nullable
* remove unused methods
* fix warnings and docs
2024-08-30 15:08:56 +02:00
Bond_009 eca5abe4bb Remove passwordSha1 param from AuthenticateUser function 2024-08-30 14:27:30 +02:00
Shadowghost 4185558f5e Upgrade LRCParser to 2024.0728.2 2024-08-30 09:03:57 +02:00
Bond-009 9644e894f0 Merge pull request #12534 from gnattu/new-tonemap-mode
Add new tonemap mode options
2024-08-30 00:07:52 +02:00
Bond-009 9c76a2e91b Merge pull request #12532 from Bond-009/hlscodecs
Use Apple reccomended values for HLS CODECS
2024-08-30 00:07:44 +02:00
Nguyen Thanh b97f958770 Translated using Weblate (Vietnamese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/vi/
2024-08-29 13:41:35 -04:00
無情天 8fbdee23b5 Translated using Weblate (Chinese (Simplified))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hans/
2024-08-29 13:41:35 -04:00
PaneradFisk f04beeb222 Translated using Weblate (Swedish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/sv/
2024-08-29 13:41:35 -04:00
Humam e61ae70aa6 Translated using Weblate (Arabic)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ar/
2024-08-29 13:41:35 -04:00
nyanmisaka d7be6a5ab0 Tune x264/5 encoding params for realtime playback
Some options that are too performance-intensive are disabled, while
others are left enabled to trade-off between real-time playback and quality.

Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2024-08-30 00:57:00 +08:00
renovate[bot] 84bbe86fd2 Update CI dependencies (#12538)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-29 09:28:00 -06:00
renovate[bot] d61ed2d9a6 Update dependency Svg.Skia to 2.0.0.1 (#12537)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-29 07:30:51 -06:00
gnattu 298fe97ab2 Add new tonemap mode options
Signed-off-by: gnattu <gnattuoc@me.com>
2024-08-29 08:14:43 +08:00
Bond_009 95200ad225 Improve error message when image extraction times out
The exception will get logged higher up the call stack.
2024-08-28 23:09:17 +02:00
Bond_009 d352d883d3 Use Apple reccomended values for HLS CODECS 2024-08-28 22:57:42 +02:00
gnattu 6c8ca30f7f Prevent server from starting if the ffmpeg path is invalid (#12463) 2024-08-28 12:43:37 -06:00
Cody Robibero 8c3f3c503b Merge pull request #11665 from Bond-009/getuserbyid 2024-08-28 12:39:48 -06:00
gnattu 639d75bd83 Fix noautorotate cli for videotoolbox (#12530) 2024-08-28 12:37:19 -06:00
stanol 48e7c6c904 Translated using Weblate (Ukrainian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/uk/
2024-08-28 03:41:35 -04:00
Fedor M c887c79160 Translated using Weblate (Russian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ru/
2024-08-28 03:41:35 -04:00
Matthieu Delorme 1dca643fb1 Translated using Weblate (French)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fr/
2024-08-28 03:41:35 -04:00
Andi Chandler f96d8e025a Translated using Weblate (English (United Kingdom))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/en_GB/
2024-08-28 03:41:35 -04:00
Lukáš Kucharczyk c0e0f176a8 Translated using Weblate (Czech)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/cs/
2024-08-28 03:41:35 -04:00
Bond-009 6281cd707d Merge pull request #11250 from nyanmisaka/fix-hwa-video-rotation
Fix the broken video orientation (+-90/180)
2024-08-27 22:24:34 +02:00
nyanmisaka d447207489 Apply suggestions from code review
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2024-08-28 03:20:04 +08:00
Niels van Velzen ed572467aa Merge pull request #12524 from nyanmisaka/fix-filter-ffmpeg7
Adjust filters to adapt FFmpeg 7.0
2024-08-27 08:48:31 +02:00
Josh Hood 3e46650957 Translated using Weblate (Cornish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/kw/
2024-08-26 18:10:26 -04:00
Kityn 85a8ef3513 Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pl/
2024-08-26 18:10:26 -04:00
Bas 70dcfd325b Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2024-08-26 18:10:26 -04:00
renovate[bot] 9f249e3eed Update github/codeql-action action to v3.26.5 (#12508)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-26 14:40:49 -06:00
nyanmisaka 5ef7ab540a Adjust filters to adapt FFmpeg 7.0
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2024-08-27 02:42:29 +08:00
Josh Hood a640baeea7 Added translation using Weblate (Cornish) 2024-08-26 04:56:21 -04:00
gnattu 29d5344ba7 fix typo
Signed-off-by: gnattu <gnattuoc@me.com>
2024-08-26 00:04:08 +08:00
gnattu e31c6d3934 Add SubContainer support to CodecProfile
Currently, when specifying codec profiles, the client can only specify profiles applied to direct containers, with no way to apply a profile specifically to HLS or a specific HLS container. This limitation is not suitable for more complex client codec support scenarios.

To address this, a SubContainer field is added to CodecProfile. The client can now specify the main container as "hls" to apply the profile exclusively to HLS streams. Additionally, the SubContainer field allows the profile to be applied to a specific HLS container.

Currently, this is only used in StreamBuilder for HLS streams. Further changes may be required to extend its usage.

Signed-off-by: gnattu <gnattuoc@me.com>
2024-08-26 00:04:05 +08:00
dmitrylyzo ca4bd57b8d Backport pull request #12499 from jellyfin/release-10.9.z
Apply all codec conditions

Original-merge: fff4477a93

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-08-25 02:46:42 -04:00
nyanmisaka fd73b0cac0 Backport pull request #12493 from jellyfin/release-10.9.z
Fix bitstream filter not applied to videos in TS container

Original-merge: 078ee1f2de

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

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-08-25 02:46:40 -04:00
nielsvanvelzen cb83dc2664 Backport pull request #12490 from jellyfin/release-10.9.z
Set Content-Disposition header to attachment for image endpoints

Original-merge: 9645955629

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-08-25 02:46:38 -04:00
gnattu 2fd9418af0 Backport pull request #12443 from jellyfin/release-10.9.z
Check attachment path for null before use

Original-merge: 122da8f447

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-08-25 02:46:36 -04:00
scampower3 1ca2c4b4e1 Backport pull request #12425 from jellyfin/release-10.9.z
Don't force non-virtual when all episodes in season are isMissing=true

Original-merge: be949af59e

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-08-25 02:46:34 -04:00
ikelos bdb2d81687 Backport pull request #12415 from jellyfin/release-10.9.z
Include AVIF extension for support images

Original-merge: 5027e3cd53

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-08-25 02:46:32 -04:00
fredrik-eriksson fa638388b4 Backport pull request #12414 from jellyfin/release-10.9.z
Revert "NextUp query respects Limit (#11956)"

Original-merge: 9810d22d96

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-08-25 02:46:30 -04:00
Bond-009 73fe6fc4b6 Merge pull request #12507 from gnattu/fix-SA1508-lyrics
Fix SA1508 in LyricScheduledTask
2024-08-24 01:08:29 +02:00
gnattu 7da787609b Fix SA1508 in LyricScheduledTask
Signed-off-by: gnattu <gnattuoc@me.com>
2024-08-24 06:59:48 +08:00
Bond-009 7691b11f33 Merge pull request #12454 from theguymadmax/local-svg
Allow svg for local images
2024-08-24 00:03:50 +02:00
Bond-009 549c01c736 Merge pull request #12457 from lostb1t/feature/boxset-sort
Add support for ItemSortBy values in BoxSet
2024-08-24 00:00:48 +02:00
Bond-009 e211445034 Merge pull request #12397 from crobibero/lyrics-finale
Add lyrics library options, add download scheduled task
2024-08-24 00:00:38 +02:00
Bond-009 dea69e800f Merge pull request #12485 from jellyfin/renovate/asynckeyedlock-7.x
Update dependency AsyncKeyedLock to v7.0.1
2024-08-23 23:59:46 +02:00
Bond-009 80bdfd1d98 Merge pull request #12498 from scampower3/pass-seriesdisplayorder-seasoninfo
Pass Series Display Order information to SeasonInfo
2024-08-23 23:59:13 +02:00
Ovidiu Popa f090071db2 Translated using Weblate (Romanian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ro/
2024-08-23 15:21:16 -04:00
Bond-009 d5d85d121a Merge pull request #12497 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v3.26.4
2024-08-22 14:29:14 +02:00
LJQ bfec336549 Pass Series Display Order information to SeasonInfo 2024-08-22 17:50:13 +08:00
renovate[bot] bf25284b93 Update github/codeql-action action to v3.26.4 2024-08-21 22:12:43 +00:00
Evan Jarrett 6eec6c9957 fix number parser 2024-08-21 09:37:52 -05:00
houching 207261a2cf Translated using Weblate (Khmer (Central))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/km/
2024-08-20 15:12:10 -04:00
Cody Robibero c9e800af64 Update Emby.Server.Implementations/Localization/Core/en-US.json
Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>
2024-08-20 12:33:38 -06:00
renovate[bot] 854e1e7a4f Update dependency z440.atl.core to v6 (#12426)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-20 11:30:58 -06:00
renovate[bot] 5ec573d92a Update dependency AsyncKeyedLock to v7.0.1 2024-08-20 17:03:37 +00:00
Bond-009 7c628e9e4f Merge pull request #12471 from eltociear/patch-2
chore: update BaseSqliteRepository.cs
2024-08-20 15:41:34 +02:00
Bond-009 e06af011d6 Merge pull request #12480 from jellyfin/renovate/microsoft
Update dependency Microsoft.NET.Test.Sdk to v17.11.0
2024-08-20 14:07:04 +02:00
renovate[bot] 28562804f7 Update dependency Microsoft.NET.Test.Sdk to v17.11.0 2024-08-20 11:44:47 +00:00
Bond-009 567adb8caa Merge pull request #12398 from bpauquette/patch-5
Update XmlTvListingsProvider.cs to fix the record series button missing on many programs
2024-08-20 13:43:16 +02:00
Bond-009 98e5f56066 Merge pull request #12473 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v3.26.3
2024-08-19 23:41:17 +02:00
renovate[bot] e0d7b30a5e Update github/codeql-action action to v3.26.3 2024-08-19 18:43:17 +00:00
Ikko Eltociear Ashimine 853b2fa17c chore: update BaseSqliteRepository.cs
overriden -> overridden
2024-08-20 01:03:40 +09:00
theMasterpc 4c23f38076 Update PluginPageInfo.cs summary. (#12464) 2024-08-19 07:33:54 -06:00
lostb1t 4344b951a6 make Sort private and use Enum parse 2024-08-19 11:47:34 +02:00
Bas 00fb955103 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2024-08-18 10:41:33 -04:00
lostb1t 0b7dc7ff64 use default enum for unordered 2024-08-17 09:14:45 +02:00
Evan Jarrett e1f72b1f27 Add ability to specify gpu index on windows 2024-08-16 14:48:50 -07:00
lostb1t e59eac6a07 filter in special display order 2024-08-16 18:31:40 +02:00
lostb1t f737fad43a Rework get children functions to support ItemSortBy values 2024-08-16 17:01:53 +02:00
theguymadmax 065ec7ec0b Allow svg for local images 2024-08-15 23:18:40 -04:00
Bond-009 ffecdfc18c Merge pull request #12449 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v3.26.2
2024-08-15 13:01:58 +02:00
renovate[bot] 3b2875a5a8 Update github/codeql-action action to v3.26.2 2024-08-14 16:35:02 +00:00
Bond-009 a21ecda78f Merge pull request #12375 from tobias-varden/pr_2
Update the default repository URL for the StudioImages plugin
2024-08-14 16:09:26 +02:00
Bond-009 fa7335156a Merge pull request #12439 from jellyfin/renovate/dotnet-monorepo
Update dependency dotnet-ef to v8.0.8
2024-08-14 16:05:14 +02:00
renovate[bot] b79fead73d Update dependency dotnet-ef to v8.0.8 2024-08-14 13:36:00 +00:00
Bond-009 39c91bd6ca Merge pull request #12438 from jellyfin/renovate/microsoft
Update Microsoft to v8.0.8
2024-08-14 14:05:18 +02:00
Bond-009 21ee835551 Merge pull request #12405 from jellyfin/renovate/ci-deps
Update CI dependencies
2024-08-14 14:04:18 +02:00
renovate[bot] 0216ef80f8 Update CI dependencies 2024-08-13 22:33:36 +00:00
renovate[bot] 8e98c62122 Update Microsoft to v8.0.8 2024-08-13 15:20:59 +00:00
Niels van Velzen 4363cbd88b Merge pull request #12435 from aaronjrodrigues/patch-1
Update README.md
2024-08-13 17:19:58 +02:00
Aaron Rodrigues b94bcee867 Update README.md
this fixes some spelling and grammar :)
2024-08-12 21:13:59 +02:00
Bond-009 f7846d0141 Merge pull request #12429 from gnattu/fix-vt-decoder
Fix VideoToolbox Hi10P
2024-08-12 19:03:44 +02:00
Bond-009 b824d8b84b Merge pull request #12428 from gnattu/remove-unused-encoders
Remove unused encoders
2024-08-12 19:00:37 +02:00
gnattu 7d9e315593 Remove duplicated check
Signed-off-by: gnattu <gnattuoc@me.com>
2024-08-12 19:33:03 +08:00
HanaO00 08e9eaa954 Translated using Weblate (French)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fr/
2024-08-12 00:10:14 -04:00
gnattu 487dbf3e85 Fix Videotoolbox Hi10P hardware decoding
We need to mark h264 as 10bit supported for videotoolbox

Signed-off-by: gnattu <gnattuoc@me.com>
2024-08-12 09:28:17 +08:00
gnattu 808cd6f06a Fix software decoder with videotoolbox encoder
Format should be placed before hwupload to support some software decoders

Signed-off-by: gnattu <gnattuoc@me.com>
2024-08-12 09:26:51 +08:00
gnattu 447dd3aed7 Use Math.Min
Co-authored-by: Bond-009 <bond.009@outlook.com>
2024-08-12 01:53:56 +08:00
gnattu 2321866302 Remove more outdated options.
Signed-off-by: gnattu <gnattuoc@me.com>
2024-08-12 00:57:50 +08:00
gnattu 26489c4908 Remove container guessing doc from hls
Signed-off-by: gnattu <gnattuoc@me.com>
2024-08-12 00:11:22 +08:00
gnattu a3ebbabf95 Update api doc to remove outdated info
Signed-off-by: gnattu <gnattuoc@me.com>
2024-08-12 00:06:31 +08:00
gnattu 058a3dcc6a Remove legacy encoders
Signed-off-by: gnattu <gnattuoc@me.com>
2024-08-11 18:17:09 +08:00
gnattu 1f819d3382 Remove VPx encoders
Signed-off-by: gnattu <gnattuoc@me.com>
2024-08-11 17:38:11 +08:00
koka late f7227c6ca1 Added translation using Weblate (English (Middle)) 2024-08-06 13:30:53 -04:00
Cody Robibero a4953263bd Fix class name 2024-08-06 07:53:44 -06:00
Cody Robibero 3873c7fda0 Update MediaBrowser.Providers/Lyric/LyricScheduledTask.cs
Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>
2024-08-06 07:52:59 -06:00
grumpycat 845ebc5e62 Update XmlTvListingsProvider.cs
Fix failing test.
2024-08-05 20:58:40 -04:00
grumpycat a5ae5600ce Update XmlTvListingsProvider.cs
Fixes a bug where certain programs like the "Good Morning America" no longer have the record series button.
2024-08-05 18:34:54 -04:00
Cody Robibero eacc8c7d35 Add scheduled task to automatically search for lyrics 2024-08-05 16:00:08 -06:00
Cody Robibero 0bf7babcbe Add missing lyric fetcher settings from library options 2024-08-05 15:59:55 -06:00
Tim Gels 82ad4b9235 Updated issue Jellyfin version (#12394) 2024-08-05 10:38:31 -06:00
Bond_009 e221c1d25d Enable nullable for NextUpQuery 2024-08-05 17:17:57 +02:00
Bond_009 a90316b4d9 Replace UserId with User in NextUpQuery 2024-08-05 17:17:57 +02:00
Bond_009 09f4477510 Replace UserId with User in UserViewQuery 2024-08-05 17:17:57 +02:00
Bond_009 c680dbb53e Use User overload of UserDataManager.SaveUserData when possible 2024-08-05 17:17:57 +02:00
Bond_009 4549337335 Change arguments AssertCanUpdateUser to take a user 2024-08-05 17:17:57 +02:00
Bond_009 c831af2fe2 Pass User instead of UserId inside LatestItemsQuery 2024-08-05 17:17:57 +02:00
justinkb 21f1813d82 Backport pull request #12390 from jellyfin/release-10.9.z
fix SA1201 issue

Original-merge: 3f3145600c

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

Backported-by: Bond_009 <bond.009@outlook.com>
2024-08-05 11:01:30 -04:00
nyanmisaka 7ee9c9b7a0 Backport pull request #12374 from jellyfin/release-10.9.z
Fix compatibility between TranscodingThrottler and FFmpeg 7.0

Original-merge: ee0094d889

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2024-08-05 11:01:28 -04:00
nielsvanvelzen 0675b06bea Backport pull request #12356 from jellyfin/release-10.9.z
Fix creating virtual seasons (again)

Original-merge: 900acc03aa

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
2024-08-05 10:58:23 -04:00
gnattu 22d8528d90 Backport pull request #11901 from jellyfin/release-10.9.z
Implement Device Cache to replace EFCoreSecondLevelCacheInterceptor

Original-merge: b7bc0e1c96

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Bond_009 <bond.009@outlook.com>
2024-08-05 10:58:22 -04:00
JPVenson d5fdb9c3a7 Fix missing service registration for MediaSegments (#12392) 2024-08-05 08:50:43 -06:00
JPVenson 00eb6c0d6f Add media segments API (#12345)
* Added Media segment manager

* Added "HasSegments" to MediaSourceInfo when requesting though baseitem

* Fixed ordering of Media Segements

* Added media segment API controller

* Added .ConfigureAwait(false) on media segments manager

* renamed MediaSegmentsController
removed empty route

* Added Model layer for Media Segments
Fixed review comments Media segments

* Updated media segment naming
refactored api and manager usage

* Added mediaSegment type filter

* Fixed codesmell

* Fixed naming and typos

* Added EF Migration

* Added Identity Generation for MediaSegments
Made mediasegment filter optional

* Fixed optional filter parameter

* refactored segment namespace

* Added SegmentProviderId to MediaSegment

* Media segment comment indentation

* Added MediaSegmentManager query notracking
2024-08-05 14:20:27 +02:00
Bond-009 9a8298a84d Merge pull request #12388 from jellyfin/renovate/z440.atl.core-5.x
Update dependency z440.atl.core to v5.26.0
2024-08-05 13:06:11 +02:00
Nyanmisaka 2aa9cf4007 Merge branch 'master' into fix-hwa-video-rotation 2024-08-05 16:37:09 +08:00
gnattu 7ea91dfcc4 Update VideoToolbox pipeline for jellyfin-ffmpeg7 (#12380) 2024-08-04 20:37:40 -06:00
renovate[bot] 84f9e94268 Update dependency z440.atl.core to v5.26.0 2024-08-04 22:03:50 +00:00
Franco Castillo bbf3a2138b Translated using Weblate (Spanish (Argentina))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es_AR/
2024-08-04 17:41:32 -04:00
Evan Jarrett 8941c059f6 use string.Empty 2024-08-03 18:19:36 -05:00
Evan Jarrett 0d8669fbe8 Add a new EncodingOption for QsvDevice 2024-08-03 15:05:13 -05:00
Evan Jarrett 51433528a1 Allow QSV to use the renderNodePath instead of defaulting to the first available device 2024-08-03 11:56:56 -05:00
Bond-009 a82527dcdf Merge pull request #12376 from jellyfin/renovate/ci-deps
Update actions/upload-artifact action to v4.3.5
2024-08-02 18:38:25 +02:00
renovate[bot] 95f41b6a73 Update actions/upload-artifact action to v4.3.5 2024-08-02 15:52:17 +00:00
CS 919b8ef9e2 Use collection initializers when possible 2024-08-02 16:19:20 +02:00
CS b34cbc2f16 Update default artwork repository url to point to githubusercontent.com domain 2024-08-02 16:12:55 +02:00
Andrejs 894933848a Translated using Weblate (Latvian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/lv/
2024-08-02 06:48:25 -04:00
Bond-009 b39ff1dd42 Merge pull request #12369 from Bond-009/warn
Enable more analyser rules as errors
2024-08-02 11:12:47 +02:00
Bond-009 f2e749548c Merge pull request #12354 from gnattu/ac-4-downmix
Add AC-4 downmix algorithm
2024-08-01 20:05:18 +02:00
Bond_009 0a0de6708e Enable more analyser rules as errors
Also deduplicates a bit of code inside of SeasonPathParser and adds some more tests
2024-08-01 17:17:10 +02:00
Bond-009 623f9f6d8a Merge pull request #12364 from jellyfin/renovate/serilog.aspnetcore-8.x
Update dependency Serilog.AspNetCore to v8.0.2
2024-08-01 13:53:20 +02:00
gnattu 3788ccd447 Add comments for Dave750/NightmodeDialogue 7.1 downmix
Signed-off-by: gnattu <gnattuoc@me.com>
2024-08-01 07:45:16 +08:00
renovate[bot] bb12d8240f Update dependency Serilog.AspNetCore to v8.0.2 2024-07-31 23:05:30 +00:00
gnattu c171b6def2 fix space
Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-31 00:00:34 +08:00
gnattu 8f28c3a0fb fix doc
Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-31 00:00:34 +08:00
gnattu 31dccaca0f Add 5.0 and 7.0 support to ac4 downmix
Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-31 00:00:34 +08:00
gnattu daf8d649f2 Add AC4 downmix
Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-31 00:00:34 +08:00
TheMelmacian d4eeafe53f Fix: parsing of xbmc style multi episode nfo files (#12268) 2024-07-30 09:51:08 -06:00
gnattu 0a1a109b2e Add RFC7845 downmix algorithm (#12300) 2024-07-30 09:50:22 -06:00
Cody Robibero f7ab17d24d Merge pull request #11879 from gnattu/migrate-to-atl 2024-07-30 09:48:48 -06:00
vyrmin 3984b828e8 Translated using Weblate (Croatian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hr/
2024-07-30 09:41:32 -04:00
Bond-009 5d0c5fd40d Merge pull request #11432 from Bond-009/dtonullable
Enable nullable for DtoService and DtoOptions
2024-07-29 22:19:37 +02:00
Bond-009 57f95bdc32 Merge pull request #11390 from Bond-009/UserItemData
Enable nullable for UserItemData
2024-07-29 22:01:58 +02:00
Bond_009 63b90ab45c Fix build 2024-07-29 21:57:11 +02:00
Bond_009 2b3ebb0751 Enable nullable for DtoService and DtoOptions 2024-07-29 21:05:40 +02:00
Bond_009 d3f0346f04 Enable nullable for UserItemData
MetadataResult.GetOrAddUserData doesn't ever get used and is probably broken since the migration to .NET Core as it still expects a Guid for userId
2024-07-29 21:05:23 +02:00
Bond-009 eeb8c59ff2 Merge pull request #12355 from crobibero/querying-nullable
Enable nullability for QueryResult
2024-07-29 18:14:49 +02:00
Cody Robibero 48b5602144 Enable nullability for QueryResult 2024-07-29 07:38:15 -06:00
Bond-009 fd5d8bebb9 Merge pull request #12353 from gnattu/display-dv-title-when-available
Display DOVI title in DisplayTitle when available
2024-07-29 12:16:28 +02:00
Gokki ff72acd194 Translated using Weblate (Filipino)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fil/
2024-07-29 02:41:32 -04:00
aky 5f122e7f79 Translated using Weblate (Korean)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ko/
2024-07-29 02:41:32 -04:00
gnattu 0132ad05ab Display DOVI title in DisplayTitle when available
Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-29 07:49:05 +08:00
gnattu 79c4469ac7 Remove redundant NaN check
Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-29 06:23:16 +08:00
gnattu 5c5b326b1a Remove test var
Co-authored-by: Cody Robibero <cody@robibe.ro>
2024-07-29 06:23:16 +08:00
gnattu 56a98a3bb0 Make internal value separator a constant
Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-29 06:23:16 +08:00
gnattu 1d658a5a4d Remove redundant check
Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-29 06:23:13 +08:00
gnattu 939e02ccee Apply suggestions from code review
Co-authored-by: Cody Robibero <cody@robibe.ro>
2024-07-29 06:21:51 +08:00
gnattu 507f89b8ed Bump to v5.25.0
Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-29 06:21:51 +08:00
gnattu ac9322370b Check if the metadata is supported for title fallback
Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-29 06:21:51 +08:00
gnattu 172feab084 Migrate to z440.atl instead of TagLib-Sharp
The ATL lib provides a lot of advantages to the TagLib we are currently using.

Notably:

- auto-detect the format of the audio data, even if the file extension has the wrong label, and provides unified API for different file types.

- supports more audio formats than TagLib

- supports lyrics natively

- supports playlists and cuesheets

- srovides relatively simple and controllable way for non-standard fields, enable us to implement compatibility features instead of waiting for lib updates

- is actually maintained

Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-29 06:21:47 +08:00
Bond-009 095d4d4d15 Merge pull request #12295 from Bond-009/trysetproviderid
Add TrySetProviderId extension
2024-07-29 00:13:40 +02:00
gnattu 162ea38a95 Check MaxAudioChannels for directAudioStream candidates (#12319)
* Check MaxAudioChannels for directAudioStream candidates

The current stream builder logic does not check the channel limit when determining if the audio stream can be directly used, and this can cause some undesired effects:

- A high channel count surround sound stream might be picked even if a stereo one exists when the user requires stereo audio.

- The user's preferred audio codec might not be respected during the downmix because the requested codec is now forced to be the same as the original source.

Signed-off-by: gnattu <gnattuoc@me.com>

* Fix unit test

Signed-off-by: gnattu <gnattuoc@me.com>

* Set correct transcode reason and target channels for unit test

Signed-off-by: gnattu <gnattuoc@me.com>

* Match old stream selection behavior

Signed-off-by: gnattu <gnattuoc@me.com>

* Fix reason matching

Signed-off-by: gnattu <gnattuoc@me.com>

---------

Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-29 00:11:59 +02:00
Bond-009 dea7be5e8a Merge pull request #12327 from crobibero/live-tv-nullable
Fix up getting livetv programs api docs
2024-07-29 00:10:53 +02:00
Bond-009 797b426ae7 Merge pull request #12343 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v3.25.15
2024-07-26 20:58:24 +02:00
renovate[bot] 3de51cd9f8 Update github/codeql-action action to v3.25.15 2024-07-26 17:07:18 +00:00
Bond-009 5fda3f482a Merge pull request #12309 from Bond-009/nobuffer
Don't buffer content in GetStaticRemoteStreamResult
2024-07-26 11:16:47 +02:00
Cody Robibero 4f746c40d7 suggestions from review 2024-07-25 11:18:25 -06:00
Bond-009 6bff5f6df8 Merge pull request #12304 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v3.25.14
2024-07-25 15:29:22 +02:00
renovate[bot] 001cad22db Update github/codeql-action action to v3.25.14 2024-07-25 10:35:32 +00:00
Bond-009 a37324cbee Merge pull request #12329 from jellyfin/renovate/libse-4.x 2024-07-24 15:37:06 +02:00
renovate[bot] a4a9a181f5 Update dependency AsyncKeyedLock to v7 (#12316)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-24 07:19:12 -06:00
Tim Gels 7610947248 Update issue report.yml to use 10.9.8 version (#12332) 2024-07-24 13:33:09 +02:00
Tobias 8bc1419699 Fix comment in PhotoProvider (#12323)
Co-authored-by: CS <comwan@gmail.com>
2024-07-24 13:10:12 +02:00
renovate[bot] a968e31179 Update dependency libse to v4.0.7 2024-07-24 00:37:36 +00:00
Cody Robibero 6fd79fb015 Fix up getting livetv programs api docs 2024-07-23 11:34:41 -06:00
Bond-009 59446a8dd2 Merge pull request #12322 from jellyfin/renovate/svg.skia-2.x
Update dependency Svg.Skia to v2
2024-07-23 16:18:19 +02:00
Nyanmisaka 00088c2954 Merge branch 'master' into fix-hwa-video-rotation 2024-07-23 15:37:33 +08:00
renovate[bot] 975ad25162 Update dependency Svg.Skia to v2 2024-07-22 20:13:31 +00:00
Bond-009 19dca018b2 Merge pull request #12310 from Bond-009/fixbdmvstreamindex
Fix BDMV stream indexes
2024-07-22 12:11:57 +02:00
ItsAllAboutTheCode 24f355a779 Changed GetThemeMedia to support SortBy/Order options (#12167)
* Changed `GetThemeMedia` to support SortBy/Order options

The `GetThemeMedia, `GetThemeVideos` and `GetThemeSongs` functions can optionally sort the results based based on passing an ItemSortBy type and a SortOrder.

This is intended to be used by jellyfin-web in order to allow users to control the order of theme playback.
See PR: https://github.com/jellyfin/jellyfin-web/pull/5714

* Update MediaBrowser.Controller/Entities/BaseItem.cs

Fix the `GetThemeVideos` two argument overload having both parameters defaulted.
For the two argument overload, both parameters are required.
2024-07-21 16:16:31 +02:00
Bond-009 d5cf0ad2c8 Merge pull request #11492 from jellyfin/better-vbr-settings
Add better audio VBR settings
2024-07-21 16:15:43 +02:00
Bond-009 1dc0a1de6c Backport pull request #12296 from jellyfin/release-10.9.z
Properly escape paths in concat file for BDMV

Original-merge: 4afa6db108

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-07-21 00:58:06 -04:00
Bond-009 46fde9aa04 Backport pull request #12278 from jellyfin/release-10.9.z
Fix localization of audio title

Original-merge: f7a90b6383

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-07-21 00:58:05 -04:00
nielsvanvelzen a8ac58fd5b Backport pull request #12240 from jellyfin/release-10.9.z
Fix season handling ("Season Unknown" / unneccesary empty seasons)

Original-merge: c1f7ccbca4

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-07-21 00:58:04 -04:00
Bond_009 99bba29715 Fix switch expression 2024-07-20 20:37:44 +02:00
Bond_009 f308a01e59 Fix DTS codec name 2024-07-20 20:22:51 +02:00
Bond_009 406320cb98 Fix more codec names 2024-07-20 19:57:40 +02:00
Bond_009 1e7aca8a3d Fix BDMV stream indexes
Also fixes the subtitle codec for PGS subtitles from PGS to PGSSUB
2024-07-20 17:32:09 +02:00
Bond_009 26fcb78ae3 Don't buffer content in GetStaticRemoteStreamResult 2024-07-20 13:31:04 +02:00
Bond-009 2b0082bf15 Merge pull request #12299 from gnattu/fix-ac4-samplerate-check
Fix AC-4 Sample rate check
2024-07-19 14:43:32 +02:00
Cody Robibero 4239de1ee7 Merge pull request #11399 from jellyfin/audio-remux 2024-07-18 08:12:20 -04:00
gnattu 59c18a7454 Remove space
Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-18 18:49:04 +08:00
gnattu 855215673a Use string.Equals
Co-authored-by: Bond-009 <bond.009@outlook.com>
2024-07-18 17:50:19 +08:00
gnattu cb7714a32e Code cleanup
Co-authored-by: Bond-009 <bond.009@outlook.com>
2024-07-18 17:49:44 +08:00
gnattu 992eed5ef7 Fix AC-4 Sample rate check
Some Audio codec will have a null CodecTag, check for that to avoid null reference

If the client already requests a specific sample rate, use that instead of our default sample rate for AC-4

Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-18 11:45:16 +08:00
gnattu efee37a632 Simplify EnableAudioVbrEncoding getter
Co-authored-by: Bond-009 <bond.009@outlook.com>
2024-07-18 02:43:02 +08:00
gnattu 5262439300 Enable hardware Trickplay processing pipeline for VideoToolbox (#11510) 2024-07-17 13:50:32 -04:00
gnattu ce7cbc1f64 Don't check the misleading options.EnableDirectStream for direct stream availability
Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-18 01:49:55 +08:00
gnattu 8851ace543 Enable Dolby AC-4 decoder (#11486) 2024-07-17 12:35:40 -04:00
Cody Robibero d6051d9d7e Merge pull request #11489 from jellyfin/allow-vp9-remuxing 2024-07-17 12:32:44 -04:00
Cody Robibero c207404089 Merge pull request #11511 from jellyfin/trickplay-keyframe-only 2024-07-17 12:28:58 -04:00
gnattu e851bb869b Simply AMF Windows checking
Co-authored-by: Nyanmisaka <nst799610810@gmail.com>
2024-07-17 22:25:28 +08:00
gnattu fd5df98616 Move default value to api spec
Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-17 21:52:44 +08:00
Cody Robibero b026772764 Move external url listing to provider for plugin use (#12279) 2024-07-17 09:48:31 -04:00
Bond_009 ecd2dab0a2 Add TrySetProviderId extension 2024-07-17 15:48:21 +02:00
gnattu 9acc93853e Specify the default value in api spec
Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-17 21:27:35 +08:00
gnattu 24910348a1 Force channel to be >= 1
Co-authored-by: Cody Robibero <cody@robibe.ro>
2024-07-17 21:27:35 +08:00
gnattu d5eb8fc121 Also make UniversalAudioController check client VBR settings
Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-17 21:27:35 +08:00
gnattu 7ad432be23 Default EnableAudioVbrEncoding to true in TranscodingProfile
This will match the old behavior when user takes no action for clients

Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-17 21:27:35 +08:00
gnattu 0381c5a288 Add EnableAudioVbrEncoding to TranscodingProfile
This will allow the client selectively disable VBR audio when it causes problems.

Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-17 21:27:35 +08:00
gnattu 78929418cc Use better audio VBR settings
LAME's VBR mode only has advantage over a certain bitrate range. For very low and very high bitrate, use the ABR mode instead.

aac_at's CVBR mode produces very good quality and is not worse than its TVBR mode in blind testing. Use this mode for convenience.

The ffmpeg native aac encoder will have quality regression with its VBR mode. Always use CBR mode for ffmpeg's native aac encoder.

Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-17 21:27:35 +08:00
gnattu b28d22545a Simplify condition check
Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-17 21:25:29 +08:00
Bond-009 78ed8f660c Merge pull request #12294 from Bond-009/nullproviderid2
Fix (another) ArgumentNullException while scanning music
2024-07-17 14:52:39 +02:00
Bond_009 2e338f74ec Fix (another) ArgumentNullException while scanning music
```
[2024-07-17 14:31:18.202 +02:00] [ERR] [19] MediaBrowser.Providers.Music.AudioMetadataService: Error in "Probe Provider"
System.ArgumentNullException: Value cannot be null. (Parameter 'value')
   at System.ArgumentNullException.Throw(String paramName)
   at System.ArgumentNullException.ThrowIfNull(Object argument, String paramName)
   at System.ArgumentException.ThrowNullOrEmptyException(String argument, String paramName)
   at MediaBrowser.Model.Entities.ProviderIdsExtensions.SetProviderId(IHasProviderIds instance, String name, String value) in /home/loma/dev/jellyfin/MediaBrowser.Model/Entities/ProviderIdsExtensions.cs:line 121
   at MediaBrowser.Model.Entities.ProviderIdsExtensions.SetProviderId(IHasProviderIds instance, MetadataProvider provider, String value) in /home/loma/dev/jellyfin/MediaBrowser.Model/Entities/ProviderIdsExtensions.cs:line 151
   at MediaBrowser.Providers.MediaInfo.AudioFileProber.FetchDataFromTags(Audio audio, MediaInfo mediaInfo, MetadataRefreshOptions options, Boolean tryExtractEmbeddedLyrics) in /home/loma/dev/jellyfin/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs:line 330
   at MediaBrowser.Providers.MediaInfo.AudioFileProber.FetchAsync(Audio audio, MediaInfo mediaInfo, MetadataRefreshOptions options, CancellationToken cancellationToken) in /home/loma/dev/jellyfin/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs:line 139
   at MediaBrowser.Providers.MediaInfo.AudioFileProber.Probe[T](T item, MetadataRefreshOptions options, CancellationToken cancellationToken) in /home/loma/dev/jellyfin/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs:line 105
   at MediaBrowser.Providers.Manager.MetadataService`2.RunCustomProvider(ICustomMetadataProvider`1 provider, TItemType item, String logName, MetadataRefreshOptions options, RefreshResult refreshResult, CancellationToken cancellationToken) in /home/loma/dev/jellyfin/MediaBrowser.Providers/Manager/MetadataService.cs:line 800
```
2024-07-17 14:36:47 +02:00
Bond-009 12bcd1a528 Merge pull request #12292 from Bond-009/nullproviderid
Fix ArgumentNullException while scanning music
2024-07-17 14:24:03 +02:00
Troja 92903f0d4a Translated using Weblate (Belarusian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/be/
2024-07-17 08:12:03 -04:00
gnattu c8f157444c Make comment better
Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-17 14:08:39 +08:00
gnattu ed9d27bb3a Correctly set bitrate limit for remuxing
Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-17 13:35:59 +08:00
gnattu f840d9b60f Fix direct play
The SupportsDirectStream is a little bit misleading as it actually means "Supports Direct Play"

Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-17 13:35:59 +08:00
gnattu a16d3d4887 Allow clients to send audio container override for HLS
This will improve flexibility due to overcome the complex compatibility situation of HLS

Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-17 13:35:59 +08:00
gnattu e4101128e0 feat: add audio remux to UniversalAudioController
Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-17 13:35:59 +08:00
Cody Robibero 042d3e3f93 Don't include new internal MediaStream properties in api spec (#12288) 2024-07-16 12:57:02 -04:00
gnattu 0340eccb52 Force software decoding when hardware decoder does not support keyframe only mode but requested by user
Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-17 00:47:22 +08:00
gnattu 68bfabbaba Add option to extract keyframe only during trickplay image generation
This would be significantly faster than decoding every frame, but it does have compatibility issues. Not all decoders support this mode, notably the VP9 decoder, CUVID decoders, and QSV decoders.

Some videos with very long key-frame intervals may also perform poorly with this mode, as the image timing could become too inaccurate to reflect the actual frame.

Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-17 00:47:22 +08:00
Bond_009 19dc0872a9 Fix ArgumentNullException while scanning music
```
[2024-07-16 18:00:20.517 +02:00] [ERR] [65] MediaBrowser.Providers.Music.AudioMetadataService: Error in "Probe Provider"
System.ArgumentNullException: Value cannot be null. (Parameter 'value')
   at System.ArgumentNullException.Throw(String paramName)
   at System.ArgumentNullException.ThrowIfNull(Object argument, String paramName)
   at System.ArgumentException.ThrowNullOrEmptyException(String argument, String paramName)
   at MediaBrowser.Model.Entities.ProviderIdsExtensions.SetProviderId(IHasProviderIds instance, String name, String value) in /home/loma/dev/jellyfin/MediaBrowser.Model/Entities/ProviderIdsExtensions.cs:line 121
   at MediaBrowser.Model.Entities.ProviderIdsExtensions.SetProviderId(IHasProviderIds instance, MetadataProvider provider, String value) in /home/loma/dev/jellyfin/MediaBrowser.Model/Entities/ProviderIdsExtensions.cs:line 151
   at MediaBrowser.MediaEncoding.Probing.ProbeResultNormalizer.SetAudioInfoFromTags(MediaInfo audio, Dictionary`2 tags) in /home/loma/dev/jellyfin/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs:line 1322
   at MediaBrowser.MediaEncoding.Probing.ProbeResultNormalizer.GetMediaInfo(InternalMediaInfoResult data, Nullable`1 videoType, Boolean isAudio, String path, MediaProtocol protocol) in /home/loma/dev/jellyfin/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs:line 199
```
2024-07-16 18:23:21 +02:00
mokshsinghji f1f97186ba Translated using Weblate (Punjabi)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pa/
2024-07-16 10:36:20 -04:00
Vlad f353afe926 Translated using Weblate (Russian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ru/
2024-07-16 10:36:20 -04:00
Bond-009 9653cf46fb Merge pull request #12201 from Bond-009/bdsegmentfullname
Use complete paths in BD info
2024-07-16 14:43:27 +02:00
renovate[bot] 9528b2d391 Update danielpalme/ReportGenerator-GitHub-Action action to v5.3.8 (#12284)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-16 08:19:51 -04:00
Bond-009 f68038f2cf Run DeleteTranscodeFileTask on startup (#12239) 2024-07-15 08:55:31 -04:00
David Schulte fc1bee30a6 Allow streaming of raw PGS subtitles without transcoding (#12056) 2024-07-15 08:48:09 -04:00
Erwin de Haan 3262f8dc2a Add check for ProviderIds to prevent '=' from appearing in keys, also support '=' in the values. (#12274) 2024-07-15 08:44:22 -04:00
Bond-009 c666f9d050 Use real temp dir instead of cache dir for temp files (#12226) 2024-07-15 08:44:14 -04:00
ItsAllAboutTheCode 5e840c1db6 Improve LibraryManager.Sort when using "Random" order (#12165)
Co-authored-by: Cody Robibero <cody@robibe.ro>
2024-07-15 08:44:06 -04:00
Tim Gels 90dcd9f267 Refactor bug report issue template (#11135) 2024-07-15 08:42:52 -04:00
Spz.Takumi 3213537277 Translated using Weblate (Thai)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/th/
2024-07-15 08:37:54 -04:00
Cody Robibero 1eb2b6ec61 Merge pull request #12270 from gnattu/sw-tonemap 2024-07-15 08:25:29 -04:00
Bond-009 eb45a36af0 Merge pull request #12242 from jellyfin/renovate/xunit-dotnet-monorepo
Update xunit-dotnet monorepo
2024-07-14 13:30:07 +02:00
Bond-009 a17c1a7c3a Merge pull request #12261 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v3.25.12
2024-07-14 13:29:48 +02:00
gnattu 518c166a39 Prefer tonemapx during HDR image extraction
Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-12 23:15:49 +08:00
gnattu 2dee5b8d04 Correctly specify format for tonemap
Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-12 23:15:49 +08:00
gnattu 1f32f95b9c Add tonemapx to filter list
Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-12 23:15:49 +08:00
gnattu 016dc9d86c Add SIMD optimized software tonemap support
Signed-off-by: gnattu <gnattuoc@me.com>
2024-07-12 23:15:49 +08:00
Bond-009 c050abf3e8 Merge pull request #12259 from jellyfin/renovate/serilog.settings.configuration-8.x
Update dependency Serilog.Settings.Configuration to v8.0.2
2024-07-12 13:05:28 +02:00
renovate[bot] 170358c3c4 Update github/codeql-action action to v3.25.12 2024-07-12 10:09:13 +00:00
renovate[bot] 40c9688cef Update dependency Serilog.Settings.Configuration to v8.0.2 2024-07-12 00:24:16 +00:00
Unn Krigul 7435fa8446 Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/et/
2024-07-11 09:05:16 -04:00
Bond-009 834b26934b Merge pull request #12252 from jellyfin/renovate/ci-deps
Update actions/setup-python action to v5.1.1
2024-07-11 13:05:31 +02:00
Bond-009 2fb5984869 Merge pull request #12251 from honestlywhoknows/premieredatecompare-unittests
Add unit tests for PremiereDateComparer
2024-07-11 13:00:06 +02:00
renovate[bot] cab9fa1ae6 Update actions/setup-python action to v5.1.1 2024-07-10 17:18:58 +00:00
Bond-009 f62af90ae3 Merge pull request #12248 from jellyfin/renovate/dotnet-monorepo
Update dotnet monorepo to v8.0.7
2024-07-10 13:19:28 +02:00
honestlywhoknows 0d0900269f Add entry to CONTRIBUTORS.md
Add my entry to CONTRIBUTORS.md
2024-07-09 21:21:19 -04:00
honestlywhoknows 072938289c Update PremiereDateComparerTests
Add extra tests for edge cases, adjust dummy values for easier debugging
2024-07-09 21:11:23 -04:00
Adam 8933574ce9 Correct PremiereDateComparerTests
Correct PremiereDateComparerTests - Adjust expected values, add comments, add extra test
2024-07-09 20:22:06 -04:00
Adam 86835dd3c6 Create PremiereDateComparerTests
Create PremiereDateComparerTests to test PremiereDateComparer functionality.
2024-07-09 16:09:15 -04:00
Bond-009 86c4c9471b Merge pull request #12247 from jellyfin/renovate/ci-deps
Update actions/setup-dotnet action to v4.0.1
2024-07-09 18:07:17 +02:00
renovate[bot] fa018ec6a9 Update dotnet monorepo to v8.0.7 2024-07-09 15:28:18 +00:00
renovate[bot] ddd7b2b8af Update actions/setup-dotnet action to v4.0.1 2024-07-09 15:28:07 +00:00
Bond-009 5ef76a5e31 Merge pull request #12246 from jellyfin/renovate/dotnet-monorepo
Update dotnet monorepo
2024-07-09 17:27:18 +02:00
renovate[bot] c93ce48e67 Update dotnet monorepo 2024-07-09 13:18:23 +00:00
renovate[bot] ac7a09d6c5 Update xunit-dotnet monorepo 2024-07-08 20:18:37 +00:00
Tushar Joshi 2d3ecf8bf8 Translated using Weblate (Hindi)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hi/
2024-07-07 04:41:30 -04:00
mjohl 5562d3db4c Translated using Weblate (Afrikaans)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/af/
2024-07-07 04:41:30 -04:00
Bond-009 170000e04a Merge pull request #12221 from jellyfin/renovate/ci-deps
Update CI dependencies
2024-07-06 21:19:03 +02:00
renovate[bot] e35e52b2f4 Update CI dependencies 2024-07-05 16:19:16 +00:00
Hilmar Gústafsson f1b4eee8b5 Translated using Weblate (Icelandic)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/is/
2024-07-05 02:21:05 -04:00
Bond_009 60c45d6273 Use complete paths in BD info
This way we don't need to find the complete path later
2024-07-01 00:21:06 +02:00
Bond-009 6225b92da0 Merge pull request #12185 from crobibero/live-tv-conflict-exception
Add messages to LiveTvConflict exception
2024-06-30 23:30:24 +02:00
Bond-009 64b6805ec3 Merge pull request #12189 from jellyfin/renovate/ci-deps
Update CI dependencies
2024-06-30 13:56:15 +02:00
renovate[bot] a9800e8ff0 Update CI dependencies 2024-06-28 22:08:55 +00:00
Cody Robibero c46a50ace9 Add messages to LiveTvConflict exception 2024-06-27 23:05:45 -04:00
Bond-009 79e9fe112c Merge pull request #11204 from revam/fix-resolver-helper-init-values
Don't expect `BaseItem` to be a movie/video file.
2024-06-27 09:45:56 +02:00
Jalal Majed 970386bd9a Translated using Weblate (Arabic)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ar/
2024-06-26 12:27:03 -04:00
Bond-009 e063fcb036 Backport pull request #12166 from jellyfin/release-10.9.z
Fix HDR detection for 4K Blu-Ray BDMVs

Original-merge: 30fc089dd5

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-24 20:29:06 -04:00
gnattu ea7e834ae1 Backport pull request #12126 from jellyfin/release-10.9.z
Try to add extracted lyrics during scanning

Original-merge: 25f02658f0

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-24 20:29:05 -04:00
Shadowghost bd3645cbb0 Backport pull request #12055 from jellyfin/release-10.9.z
Fix season backdrops

Original-merge: 2266a00337

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-24 20:29:03 -04:00
Shadowghost e2ca6e92e4 Backport pull request #12053 from jellyfin/release-10.9.z
Rewrite PlaylistItemsProvider as ILocalMetadataProvider

Original-merge: cbbe5db813

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-24 20:29:01 -04:00
Shadowghost 9eab2bfe41 Backport pull request #12050 from jellyfin/release-10.9.z
Fix season handling

Original-merge: 4601097d3e

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-24 20:29:00 -04:00
Shadowghost 6734450d40 Backport pull request #12025 from jellyfin/release-10.9.z
Fix empty image folder removal for legacy locations

Original-merge: 476dc01f4d

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-24 20:28:58 -04:00
Bond-009 ac114b27a9 Backport pull request #11911 from jellyfin/release-10.9.z
Log album name and id in normalization task

Original-merge: c9b6ebd94f

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-24 20:28:57 -04:00
sbeg 17d7f5f88e Translated using Weblate (Croatian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hr/
2024-06-24 17:14:44 -04:00
Bond-009 ff51e679dc Merge pull request #12158 from jellyfin/renovate/serilog.sinks.file-6.x
Update dependency Serilog.Sinks.File to v6
2024-06-24 11:47:26 +02:00
nyanmisaka d37c5d8921 Backport pull request #12149 from jellyfin/release-10.9.z
Fix MicroDVD being recognized as DVDSUB subtitles

Original-merge: 6010bc01c3

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-23 11:40:59 -04:00
Shadowghost 81e38e772b Backport pull request #12134 from jellyfin/release-10.9.z
Only cleanup children on specific exceptions

Original-merge: 6cf98d4930

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-23 11:40:58 -04:00
Shadowghost a13dc9b91c Backport pull request #12123 from jellyfin/release-10.9.z
Fix Cleanup Task metadata saving

Original-merge: 85078d8f10

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-23 11:40:56 -04:00
Shadowghost 99bae981da Backport pull request #12120 from jellyfin/release-10.9.z
Do not override <year> if <releasedate> is set

Original-merge: bf53f1ae38

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-23 11:40:55 -04:00
Shadowghost 9c96ce5f6e Backport pull request #12094 from jellyfin/release-10.9.z
Map IPv6 mapped IPv4 addresses back to IPv4 before running checks

Original-merge: f097aad01e

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-23 11:40:54 -04:00
Shadowghost 034c13c48f Backport pull request #12073 from jellyfin/release-10.9.z
Fix Music Brainz release group query

Original-merge: 23a660e917

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-23 11:40:52 -04:00
Rivenlalala 7d438a748f Backport pull request #12065 from jellyfin/release-10.9.z
Make m2ts extension case-insensitive

Original-merge: f2a5ccf102

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-23 11:40:51 -04:00
gnattu 91f5f0bfc4 Backport pull request #12046 from jellyfin/release-10.9.z
Fix mpeg-ts detection

Original-merge: 78eb9b2f78

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-23 11:40:50 -04:00
oddstr13 0736ca7b5a Backport pull request #12043 from jellyfin/release-10.9.z
Fix the Australian PG rating

Original-merge: 1606b6c0f6

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-23 11:40:48 -04:00
Shadowghost 970c95959a Backport pull request #12039 from jellyfin/release-10.9.z
Fix local episode image thumb recognition

Original-merge: d813f83b4a

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-23 11:40:47 -04:00
Shadowghost 529d24ec30 Backport pull request #12037 from jellyfin/release-10.9.z
Do not fail user deletion if we have no playlist folder

Original-merge: d90f504ca7

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-23 11:40:46 -04:00
nyanmisaka b0f2135762 Backport pull request #12031 from jellyfin/release-10.9.z
Fix video embedded image detection

Original-merge: 37b7e953f7

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-23 11:40:44 -04:00
Shadowghost 1c106e8323 Backport pull request #12028 from jellyfin/release-10.9.z
Fix replace all and respect metadata settings

Original-merge: 08b64c5502

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-23 11:40:42 -04:00
Bond-009 bfe7d1ee3a Backport pull request #12026 from jellyfin/release-10.9.z
Check hearing impared flags with equality instead of contains

Original-merge: a89678074e

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-23 11:40:41 -04:00
Shadowghost b337371a0c Backport pull request #12024 from jellyfin/release-10.9.z
Remove incomplete mediatype restriction from playlists

Original-merge: 34a65980e3

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-23 11:40:40 -04:00
gnattu a1b9f90d7d Backport pull request #12017 from jellyfin/release-10.9.z
Overwrite supported codecs for livetv

Original-merge: 2b78980747

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-23 11:40:38 -04:00
renovate[bot] 4fbed419d0 Update dependency Serilog.Sinks.File to v6 2024-06-23 01:02:27 +00:00
Bond-009 92dcf0c13b Merge pull request #12124 from gnattu/enable-hi10p-vt
Enable H.264 Hi10P hardware decode for Apple Silicon on macOS >=14.6
2024-06-20 11:38:20 +02:00
Bond-009 ae5a7d7962 Merge pull request #12140 from jellyfin/renovate/idisposableanalyzers-4.x
Update dependency IDisposableAnalyzers to v4.0.8
2024-06-20 11:18:50 +02:00
renovate[bot] bac765aaaa Update dependency IDisposableAnalyzers to v4.0.8 2024-06-19 17:15:48 +00:00
Abubakr Khabebulloev c1596180bf Translated using Weblate (Uzbek)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/uz/
2024-06-19 05:49:53 -04:00
Daniel ひっかもりい e7ad883fe9 Translated using Weblate (Latvian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/lv/
2024-06-17 20:41:28 -04:00
ɴᴇᴋᴏ cb0e8df4a4 Translated using Weblate (Chinese (Traditional))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hant/
2024-06-17 20:41:28 -04:00
gnattu 9792fb117c Enable H.264 Hi10P hardware decode for Apple Silicon on macOS >=14.6
macOS 14.6 beta and macOS 15 beta enables h264 10bit hardware decode on Apple Silicon.

Signed-off-by: gnattu <gnattuoc@me.com>
2024-06-18 06:26:43 +08:00
Daniel ひっかもりい 3d14898b35 Translated using Weblate (Latvian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/lv/
2024-06-16 20:11:17 -04:00
Mirco Cau da07197c88 Translated using Weblate (Italian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/it/
2024-06-16 11:41:29 -04:00
Mikal S 9b7da736ed Replace != with is not
Co-authored-by: Bond-009 <bond.009@outlook.com>
2024-06-15 18:00:53 +02:00
Bond-009 9a6f4372f8 Merge pull request #12022 from l2dy/patch-1
Improve empty list check
2024-06-15 15:25:56 +02:00
Bond-009 1a790b30ed Merge pull request #12027 from nielsvanvelzen/index-number-query
Support filter by index number in ItemsController
2024-06-15 15:25:22 +02:00
Bond-009 ea1f6e7870 Merge pull request #12095 from jellyfin/renovate/serilog.enrichers.thread-4.x
Update dependency Serilog.Enrichers.Thread to v4
2024-06-15 15:23:50 +02:00
renovate[bot] 92a12ea33b Update dependency Serilog.Enrichers.Thread to v4 2024-06-14 11:52:49 +00:00
Kevin O'Connell 845001249a Translated using Weblate (Irish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ga/
2024-06-14 07:41:29 -04:00
newton181 56d5ba6d06 Translated using Weblate (Spanish (Latin America))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es_419/
2024-06-14 07:41:29 -04:00
Bond-009 873cd02bde Merge pull request #12088 from jellyfin/renovate/ci-deps
Update CI dependencies
2024-06-13 21:02:52 +02:00
renovate[bot] 4265220ccd Update CI dependencies 2024-06-13 17:51:02 +00:00
frauhottelmann 12d5298420 Translated using Weblate (German)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/de/
2024-06-13 02:12:39 -04:00
Turtleindeed f39a17de14 Translated using Weblate (Norwegian Bokmål)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nb_NO/
2024-06-12 01:18:17 -04:00
Mikal Stordal 12ed1d6429 fix: update tests 2024-06-11 02:02:51 +02:00
Mikal Stordal 7b17b5b488 fix: add null check 2024-06-11 02:02:51 +02:00
Mikal Stordal 0cf8b376ac Don't expect BaseItem to be a movie/video file.
This fix is mainly so I can mass-add series _and_ movie entries using a
`IMultiItemResolver` without having to resort to complicated logic
using _both_ a `IItemResolver` and a `IMultiItemResolver` by splitting
up what gets added where.

I've also added three new interface methods to the `IDirectoryService`,
one of which is used in the modified
`ResolverHelper.SetInitialItemValues(…)` to get the file system entry
info for the item regardless of which type the file system entry is.

In my local testing so far I haven't found any issues introduced
by this change.
2024-06-11 02:01:15 +02:00
Bond-009 8c76900470 Merge pull request #12057 from jellyfin/renovate/serilog.sinks.console-6.x
Update dependency Serilog.Sinks.Console to v6
2024-06-10 11:29:56 +02:00
renovate[bot] 9e21ecceea Update dependency Serilog.Sinks.Console to v6 2024-06-10 01:47:46 +00:00
Niels van Velzen 69e0ed42ea Support filter by index number in ItemsController 2024-06-07 22:38:46 +02:00
Bond-009 31aa44d23d Merge pull request #11453 from jellyfin/renovate/xunit-dotnet-monorepo
Update xunit-dotnet monorepo to v2.8.1
2024-06-07 21:36:19 +02:00
renovate[bot] 5ce64eb0f8 Update xunit-dotnet monorepo to v2.8.1 2024-06-07 18:36:03 +00:00
Bond-009 99854fd07a Merge pull request #12012 from Bond-009/asyncVoid
Replace async void with async Task in tests
2024-06-07 20:35:10 +02:00
Zero King 8caefc2a55 Improve empty list check 2024-06-08 01:06:47 +08:00
Dr Aghosh B Prasad f0c8273b63 Translated using Weblate (Malayalam)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ml/
2024-06-07 06:41:29 -04:00
Dan Johansen 24d0c6a54a Translated using Weblate (Danish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/da/
2024-06-07 06:41:29 -04:00
Bond_009 55a25d7a42 Replace async void with async Task in tests 2024-06-07 10:37:20 +02:00
Bond-009 ae49d04088 Merge pull request #12000 from jellyfin/renovate/serilog.sinks.async-2.x
Update dependency Serilog.Sinks.Async to v2
2024-06-07 10:07:30 +02:00
renovate[bot] 6a1dd69358 Update dependency Serilog.Sinks.Async to v2 2024-06-07 00:36:42 +00:00
Bond-009 dc2eca9f2c Merge pull request #11993 from Bond-009/buildFix
Fix build
2024-06-06 21:10:05 +02:00
Bond_009 f38ca3a392 Fix build 2024-06-06 21:07:22 +02:00
Bond-009 ec2fa95bf3 Merge pull request #11972 from Bond-009/numconns
Remove old connection count props
2024-06-06 20:42:33 +02:00
Bond-009 7b40c6fef1 Merge pull request #11971 from jellyfin/revert-11615-patch-1
Revert "Allow collection sort by Release Date Descending"
2024-06-06 20:42:28 +02:00
Bond-009 cca4c516f1 Merge pull request #11987 from jellyfin/renovate/serilog.settings.configuration-8.x
Update dependency Serilog.Settings.Configuration to v8.0.1
2024-06-06 20:42:11 +02:00
Bond-009 b4e32a5ede Backport pull request #11986 from jellyfin/release-10.9.z
Use only 1 write connection/DB

Original-merge: cc4563a477

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-06 14:30:40 -04:00
Shadowghost 4015ac78cd Backport pull request #11984 from jellyfin/release-10.9.z
Set ProductionLocations instead of Tags

Original-merge: 279cba008b

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-06 14:30:39 -04:00
Shadowghost 0c1c41aeaf Backport pull request #11978 from jellyfin/release-10.9.z
Fallback to local dir when saving to media dir fails

Original-merge: f41efb3b2c

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-06 14:30:37 -04:00
Bond-009 78e8eae5ad Backport pull request #11969 from jellyfin/release-10.9.z
Create readonly DB connections when possible

Original-merge: a46c17e19f

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-06 14:30:36 -04:00
gnattu cd5fb84136 Backport pull request #11963 from jellyfin/release-10.9.z
Fix Library renaming

Original-merge: b78efd6b1e

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-06 14:30:34 -04:00
Shadowghost bb0c234984 Backport pull request #11959 from jellyfin/release-10.9.z
Do not stop validation if folder was removed

Original-merge: cf59140276

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-06 14:30:32 -04:00
Shadowghost 18dd6b2875 Backport pull request #11934 from jellyfin/release-10.9.z
Fix local image saving

Original-merge: b0bb22b650

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-06 14:30:30 -04:00
Shadowghost f67e327b29 Backport pull request #11921 from jellyfin/release-10.9.z
Fix identify over NFO and replace all when NFO saving enabled

Original-merge: bfcc09db8a

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-06 14:30:29 -04:00
renovate[bot] 3646e9e050 Update dependency Serilog.Settings.Configuration to v8.0.1 2024-06-06 09:39:08 +00:00
Shadowghost 926470829d Backport pull request #11958 from jellyfin/release-10.9.z
Export trailer URLs in new format

Original-merge: 47c5e0c2c7

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

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-05 17:03:03 -04:00
cptn-x 357799b508 Backport pull request #11956 from jellyfin/release-10.9.z
NextUp query respects Limit

Original-merge: 484aea1cdb

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-05 17:03:01 -04:00
Shadowghost 02678253b9 Backport pull request #11954 from jellyfin/release-10.9.z
Do not delete file locations for virtual episodes and seasons

Original-merge: 23b1251393

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-05 17:02:59 -04:00
Shadowghost aeb0aded91 Backport pull request #11943 from jellyfin/release-10.9.z
Increase lyrics migration batch size to 5000

Original-merge: 2a3c904a9f

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-05 17:02:58 -04:00
Shadowghost c554321495 Backport pull request #11935 from jellyfin/release-10.9.z
Fix dateadded and movie NFO recognition

Original-merge: 0c039145e5

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-05 17:02:56 -04:00
Shadowghost a705e56acc Backport pull request #11933 from jellyfin/release-10.9.z
Check trailer distinction by URL

Original-merge: b1a5fe2f55

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

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-05 17:02:55 -04:00
Shadowghost 4a06b6d13b Backport pull request #11920 from jellyfin/release-10.9.z
Only set season path if season folder parsing was successful

Original-merge: d1c00ba4ed

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

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-05 17:02:54 -04:00
Joshua M. Boniface 4a5e2828df Merge pull request #11973 from Bond-009/shields
Update shields in README
2024-06-05 12:41:52 -04:00
Bond_009 0f9178f1de Remove Reddit badge 2024-06-05 15:54:03 +02:00
Bond_009 675cd01d60 Remove Azure badge 2024-06-05 15:54:03 +02:00
Bond_009 fcb85ebb98 Link to JF Space 2024-06-05 15:48:33 +02:00
Bond-009 5975a0c5c8 Revert "Allow collection sort by Release Date Descending" 2024-06-05 12:02:25 +02:00
Bond_009 953bd5f210 Remove old connection count props
Not used with the new SQLite lib
2024-06-05 11:58:21 +02:00
Bond-009 727f176542 Merge pull request #11615 from cptn-x/patch-1
Allow collection sort by Release Date Descending
2024-06-05 11:52:07 +02:00
Bond-009 dc4271505b Merge pull request #11877 from Bond-009/enableLibTests
Add regression tests for update library endpoint
2024-06-05 11:50:17 +02:00
Bond-009 3f764e2407 Merge pull request #11947 from jellyfin/renovate/ci-deps
Update CI dependencies
2024-06-04 17:52:35 +02:00
renovate[bot] f812ac838e Update CI dependencies 2024-06-04 15:34:51 +00:00
hoanghuy309 7e84a8964e Translated using Weblate (Vietnamese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/vi/
2024-06-04 00:56:53 -04:00
Acrotos 4ef806b14e Translated using Weblate (Romanian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ro/
2024-06-03 21:12:37 -04:00
Vencel Bajnok 1f6e0ebf81 Translated using Weblate (Hungarian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hu/
2024-06-03 21:12:37 -04:00
CasperDoesCoding 3738f87278 Translated using Weblate (Swedish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/sv/
2024-06-02 15:08:38 -04:00
Bond_009 e2c4e52f39 Add regressions tests for update library endpoint 2024-06-02 18:18:13 +02:00
Bond-009 741a01db3b Merge pull request #11866 from jellyfin/renovate/dotnet-monorepo
Update dotnet monorepo to v8.0.6
2024-06-02 18:17:28 +02:00
Albert Berg Hansen 726026f0ae Translated using Weblate (Danish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/da/
2024-06-01 20:36:19 -04:00
Bond-009 c7f87c0d69 Backport pull request #11910 from jellyfin/release-10.9.z
Audio normalization: parse ffmpeg output line by line

Original-merge: d2be2ee480

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-01 18:41:15 -04:00
gnattu 4fa3c30df2 Backport pull request #11894 from jellyfin/release-10.9.z
Escape tmpConcatPath for DVD and BD folder

Original-merge: 26419c64f5

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-01 18:41:14 -04:00
gnattu 0d0a2b4d58 Backport pull request #11886 from jellyfin/release-10.9.z
Fix multi-part album folder being detected as artist folder

Original-merge: d602b6dbc5

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-01 18:41:12 -04:00
Shadowghost c1032967c2 Backport pull request #11882 from jellyfin/release-10.9.z
Fix missing episodes query for seasons

Original-merge: 8e979bdb4b

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-01 18:41:11 -04:00
Bond-009 4035f6aa21 Backport pull request #11876 from jellyfin/release-10.9.z
Don't check if admin has access to library when updating

Original-merge: 563033786f

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-01 18:41:10 -04:00
thornbill dc2db22c3d Backport pull request #11873 from jellyfin/release-10.9.z
Fix FirstTimeSetupHandler allowing public access

Original-merge: 869dab2ba2

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-01 18:41:08 -04:00
gnattu 2599babe31 Backport pull request #11859 from jellyfin/release-10.9.z
Use music metadata from ffprobe when TagLib fails

Original-merge: b8a0cf6a9e

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-01 18:41:07 -04:00
gnattu 8424ff5b61 Backport pull request #11857 from jellyfin/release-10.9.z
Fix ffprobe -user_agent parameter

Original-merge: d0336cd67e

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-01 18:41:05 -04:00
gnattu b123f7ffcd Backport pull request #11851 from jellyfin/release-10.9.z
Relax remuxing requirement for LiveTV

Original-merge: 0392daa103

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-01 18:41:04 -04:00
gnattu 9563e4f85e Backport pull request #11823 from jellyfin/release-10.9.z
Add Env Var to disable second level cache

Original-merge: 95c7d997c1

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-01 18:41:02 -04:00
gnattu c4b7c91f3a Backport pull request #11812 from jellyfin/release-10.9.z
Extract media attachment one by one if the filename appears to be a path

Original-merge: 45e8872cc0

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-01 18:41:00 -04:00
Shadowghost 1a94976752 Backport pull request #11806 from jellyfin/release-10.9.z
Return missing episodes for series when no user defined

Original-merge: ae584beaac

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-01 18:40:59 -04:00
Shadowghost 407dc9272c Backport pull request #11762 from jellyfin/release-10.9.z
Mark Audio as RequiresDeserialization and backfill data

Original-merge: e2c909f50f

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-01 18:40:57 -04:00
Shadowghost 5d4880c497 Backport pull request #11743 from jellyfin/release-10.9.z
Fix replace logic

Original-merge: 2ddb15c784

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-01 18:40:56 -04:00
Shadowghost c0364fc766 Backport pull request #11719 from jellyfin/release-10.9.z
Move NFO series season name parsing to own local provider

Original-merge: a53ea029fa

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-06-01 18:40:55 -04:00
Bond-009 76abff2fba Merge pull request #11881 from jellyfin/renovate/ci-deps
Update CI dependencies
2024-06-01 17:59:11 +02:00
renovate[bot] a7d28045cb Update CI dependencies 2024-06-01 11:14:02 +00:00
Sultan Iskandar Maulana 885df54cca Translated using Weblate (Indonesian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/id/
2024-06-01 00:09:30 -04:00
huasbryan14 93e66746f9 Translated using Weblate (Spanish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es/
2024-06-01 00:09:30 -04:00
huasbryan14 1f8dcea494 Translated using Weblate (Spanish (Mexico))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es_MX/
2024-06-01 00:09:30 -04:00
Misael bbe2891ec5 Translated using Weblate (Spanish (Dominican Republic))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es_DO/
2024-05-31 11:34:24 -04:00
Bond-009 de291fd7de Merge pull request #11814 from jellyfin/renovate/efcoresecondlevelcacheinterceptor-4.x
Update dependency EFCoreSecondLevelCacheInterceptor to v4.5.0
2024-05-29 17:53:42 +02:00
renovate[bot] 01f88e4de5 Update dotnet monorepo to v8.0.6 2024-05-28 18:08:40 +00:00
nuhah100 b3bb031fca Translated using Weblate (Hebrew)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/he/
2024-05-28 11:16:09 -04:00
hoanghuy309 24d6532cf1 Translated using Weblate (Vietnamese)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/vi/
2024-05-27 11:41:26 -04:00
Michal Jan Warecki f3e39e87d7 Translated using Weblate (Norwegian Nynorsk)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nn/
2024-05-26 10:41:27 -04:00
Bond-009 4d5428ea90 Merge pull request #11835 from jellyfin/renovate/ci-deps
Update danielpalme/ReportGenerator-GitHub-Action action to v5.3.4
2024-05-26 12:14:22 +02:00
renovate[bot] c175371557 Update danielpalme/ReportGenerator-GitHub-Action action to v5.3.4 2024-05-25 19:19:44 +00:00
nyanmisaka fc14c08bcc Backport pull request #11830 from jellyfin/release-10.9.z
Fix the IOSurf error in QSV transcoding

Original-merge: 5e7514243c

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-25 11:46:30 -04:00
Shadowghost 30b4ddeddf Backport pull request #11808 from jellyfin/release-10.9.z
Add Canceled to ended state

Original-merge: 4a54e5ddeb

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-25 11:46:29 -04:00
gnattu 876ae44b8a Backport pull request #11805 from jellyfin/release-10.9.z
Use SharedStream for LiveTV more restrictively

Original-merge: ef985896e2

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-25 11:46:28 -04:00
Shadowghost 39ae56db0a Backport pull request #11804 from jellyfin/release-10.9.z
Exclude virtual items from DateLastMediaAdded calculation

Original-merge: d89e5a0074

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-25 11:46:27 -04:00
crobibero 35bc6866d5 Backport pull request #11802 from jellyfin/release-10.9.z
Mark SearchHint.MatchedTerm as nullable

Original-merge: ab6c2424db

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-25 11:46:26 -04:00
gnattu 654dd2b704 Backport pull request #11801 from jellyfin/release-10.9.z
Force more compatible transcoding profile for LiveTV

Original-merge: e7b1162cb3

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-25 11:46:25 -04:00
nyanmisaka 2faa8c141f Backport pull request #11799 from jellyfin/release-10.9.z
Disable VA-VK interop on not supported kernel versions

Original-merge: eb437e7163

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-25 11:46:23 -04:00
gnattu ac0064110b Backport pull request #11798 from jellyfin/release-10.9.z
Recalculate trickplay image height for anamorphic videos

Original-merge: d9232e05f1

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-25 11:46:22 -04:00
Shadowghost 2af1ae5d8a Backport pull request #11792 from jellyfin/release-10.9.z
Improve reliability of HasChanged check

Original-merge: b2d54b82fa

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-25 11:46:21 -04:00
NotSaifA 833a1da355 Backport pull request #11790 from jellyfin/release-10.9.z
Trickplay: kill ffmpeg when task is cancelled

Original-merge: 4a344bebc0

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-25 11:46:19 -04:00
gnattu e6dab2fa11 Backport pull request #11788 from jellyfin/release-10.9.z
Override too small trickplay image interval

Original-merge: 60232ce9be

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-25 11:46:18 -04:00
Bond-009 5c828df567 Backport pull request #11781 from jellyfin/release-10.9.z
Retain order blu-ray segments

Original-merge: 2ddf2a7866

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-25 11:46:16 -04:00
Bond-009 c7e0be3c3b Backport pull request #11774 from jellyfin/release-10.9.z
Apply audio boost when downmixing regardless of downmixalgo

Original-merge: 06a5ddda5e

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

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-25 11:46:14 -04:00
gnattu e7145acd56 Backport pull request #11766 from jellyfin/release-10.9.z
Filter invalid IPs on external interface matching

Original-merge: 2eece01acc

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-25 11:46:13 -04:00
Shadowghost debd9eb8ce Backport pull request #11754 from jellyfin/release-10.9.z
Fix BD/DVD folder chapter image extraction

Original-merge: 52be8be28f

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-25 11:46:12 -04:00
Shadowghost c3091b75a3 Backport pull request #11739 from jellyfin/release-10.9.z
Do not run trickplay on scan if disabled

Original-merge: 86f5c93434

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-25 11:46:11 -04:00
crobibero 4430706915 Backport pull request #11738 from jellyfin/release-10.9.z
Don't require user when getting current session

Original-merge: 4fcbeef5e6

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-25 11:46:09 -04:00
gnattu 487ebd3ca8 Backport pull request #11713 from jellyfin/release-10.9.z
Fix VideoToolbox H264 constrained profile option

Original-merge: d608f1e3cc

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-25 11:46:08 -04:00
Shadowghost 45400ac301 Backport pull request #11700 from jellyfin/release-10.9.z
Prevent double iterating over all seasons

Original-merge: 5200633574

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-25 11:46:07 -04:00
rushmash cbb99b6e6e Translated using Weblate (Belarusian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/be/
2024-05-25 06:41:27 -04:00
millallo 063fabd344 Translated using Weblate (Italian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/it/
2024-05-25 06:41:27 -04:00
DJSweder cb9c848918 Translated using Weblate (Czech)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/cs/
2024-05-25 06:41:27 -04:00
Bond-009 b8898e2338 Merge pull request #11793 from jellyfin/renovate/vstest-monorepo
Update dependency Microsoft.NET.Test.Sdk to v17.10.0
2024-05-24 14:17:38 +02:00
renovate[bot] 41e92b34ad Update dependency EFCoreSecondLevelCacheInterceptor to v4.5.0 2024-05-24 12:16:23 +00:00
Bond-009 109112ba93 Merge pull request #11782 from Jason-Barratt/readmeTypos
README Typo Fixes
2024-05-24 14:16:01 +02:00
Bond-009 c975d50cdc Merge pull request #11772 from Bond-009/audioProfile
Prefer profile over codec for display title
2024-05-24 14:15:43 +02:00
Mikhail Arkhipov 575584b68f Translated using Weblate (Russian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ru/
2024-05-24 02:41:27 -04:00
renovate[bot] 113d00f840 Update dependency Microsoft.NET.Test.Sdk to v17.10.0 2024-05-22 15:19:55 +00:00
Jason 1567031046 VSCode -> VS Code 2024-05-21 21:04:23 +02:00
Jason 98842b9357 typo fixes 2024-05-21 20:17:51 +02:00
Niels van Velzen 8037382e8f Fix OpenAPI workflow summary (#11780) 2024-05-21 11:57:12 -06:00
Niels van Velzen 70e85cb6c4 Fix OpenAPI workflow some more (#11779) 2024-05-21 11:38:53 -06:00
Niels van Velzen 624ad9cb98 Improve OpenAPI diff workflow (#11769) 2024-05-21 07:18:59 -06:00
Bond_009 69ae006f37 Prefer profile over codec for display title
FFmpeg 6.1 and newer can recognize Dolby Atmos and DTS:X.
This change makes it possible to see if a track has one of these technologies
if the used FFmpeg supports it.
2024-05-21 14:55:42 +02:00
Bond-009 d4f0b03982 Merge pull request #11711 from Bond-009/log
Only log item id in trickplay warning
2024-05-21 13:57:14 +02:00
Bond-009 d257c3c1bb Merge pull request #11760 from jellyfin/renovate/ci-deps
Update github/codeql-action action to v3.25.6
2024-05-21 10:51:10 +02:00
Mathias Dejerud 03c23e15b3 Translated using Weblate (Swedish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/sv/
2024-05-20 17:36:32 -04:00
IvanLeka 00de8316ca Translated using Weblate (Russian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ru/
2024-05-20 17:36:32 -04:00
renovate[bot] e37e88f92f Update github/codeql-action action to v3.25.6 2024-05-20 19:13:41 +00:00
Niels van Velzen 40820e3b41 Fix OpenAPI workflow (#11733) 2024-05-19 07:57:51 -06:00
Bas c0f5fe9bd3 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2024-05-19 03:38:21 -04:00
queeup cbaafbc132 Translated using Weblate (Turkish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/tr/
2024-05-18 08:22:49 -04:00
Bond_009 1f2c73b40a Only log item id in trackplay warning
Turns out it's the same
`[WRN] [53] Jellyfin.Server.Implementations.Trickplay.TrickplayManager: Media source "17a76092102691425e94624a69247057" not found at "/mnt/USBshare/Movies/Top Gun (1986)/extras/Top Gun_t04.mkv" for item 17a76092-1026-9142-5e94-624a69247057`
2024-05-18 13:13:34 +02:00
cvium 01946c6ef5 Backport pull request #11699 from jellyfin/release-10.9.z
Use MediaType instead of ToString and add text/ as disallowed mimetypes

Original-merge: 46c748d888

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-17 13:51:57 -04:00
Bond-009 4ded042dde Backport pull request #11698 from jellyfin/release-10.9.z
Fix not binding to SQL parameters

Original-merge: d303ca56e3

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

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-17 13:51:56 -04:00
gnattu 424ca49c26 Backport pull request #11689 from jellyfin/release-10.9.z
Workaround ffmpeg keyframe seeking for external subtitles

Original-merge: 02937873b1

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

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-17 13:51:54 -04:00
Shadowghost a2eb4c5e60 Backport pull request #11680 from jellyfin/release-10.9.z
Secure local playlist path handling

Original-merge: 832e27a8fb

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-17 13:51:53 -04:00
Bond-009 0c159cd8b6 Backport pull request #11677 from jellyfin/release-10.9.z
Properly dispose dbContext in MigrateUserDb

Original-merge: 9b98638b2b

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

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-17 13:51:52 -04:00
gnattu 7336427ce6 Backport pull request #11675 from jellyfin/release-10.9.z
Fix quality parameter for vaapi_mjpeg

Original-merge: ddd5c302b4

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

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-17 13:51:51 -04:00
Shadowghost 8b938e2696 Backport pull request #11673 from jellyfin/release-10.9.z
Fix local playlist scanning

Original-merge: 26714e2c62

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

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-17 13:51:50 -04:00
Shadowghost a7b2b92f2b Backport pull request #11671 from jellyfin/release-10.9.z
Fix network binding

Original-merge: 430d450828

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

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-17 13:51:48 -04:00
gnattu 5fe7d7f0bf Backport pull request #11670 from jellyfin/release-10.9.z
Restore caching for UserManager

Original-merge: f8b67ec44c

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

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-17 13:51:47 -04:00
gnattu e109e54949 Backport pull request #11668 from jellyfin/release-10.9.z
Always fallback for failed HEAD request

Original-merge: 8aee50020b

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-17 13:51:46 -04:00
Bond-009 8139179780 Backport pull request #11653 from jellyfin/release-10.9.z
Don't generate TrickPlay images for files that don't exist

Original-merge: c1615419b9

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-17 13:51:45 -04:00
thornbill 9a1a588857 Backport pull request #11651 from jellyfin/release-10.9.z
Fix FirstTimeSetupPolicy allowing guest access

Original-merge: 2cb052a119

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-17 13:51:44 -04:00
Shadowghost b063dfd2e3 Backport pull request #11648 from jellyfin/release-10.9.z
Fix series status parsing

Original-merge: c6c48a2b47

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

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-17 13:51:42 -04:00
Shadowghost 29a293f9e7 Backport pull request #11647 from jellyfin/release-10.9.z
Fix season names

Original-merge: 2da06bc0b1

Merged-by: joshuaboniface <joshua@boniface.me>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-17 13:51:40 -04:00
crobibero 77c3ddc7ca Backport pull request #11633 from jellyfin/release-10.9.z
Allow empty user id when getting device list

Original-merge: a5d60c4521

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-17 13:51:39 -04:00
gnattu 9b978578ce Backport pull request #11629 from jellyfin/release-10.9.z
Fix missing filename for timer

Original-merge: 3f760e6685

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-17 13:51:38 -04:00
nfmccrina 4385430f05 Backport pull request #11621 from jellyfin/release-10.9.z
Handle exception for unexpected audio file YEAR tag values

Original-merge: d5dc4435d9

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-17 13:51:37 -04:00
Kityn 4e2b30b193 Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pl/
2024-05-17 07:59:25 -04:00
Jonhnny Translate 7604c4b0f1 Translated using Weblate (French (Canada))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fr_CA/
2024-05-17 07:59:25 -04:00
Bond-009 cb3691dd0d Merge pull request #11685 from jellyfin/renovate/ci-deps
Update actions/checkout action to v4.1.6
2024-05-17 10:41:22 +02:00
renovate[bot] 45fc7342f5 Update actions/checkout action to v4.1.6 2024-05-16 22:24:50 +00:00
Nicolas 0cc5cc796d Translated using Weblate (Abkhazian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ab/
2024-05-16 13:59:17 -04:00
無情天 860c7da6e8 Translated using Weblate (Chinese (Simplified))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hans/
2024-05-16 13:59:17 -04:00
cptn d35021db92 Merge branch 'jellyfin:master' into patch-1 2024-05-15 22:32:19 -04:00
gnattu 5df171b3f9 Add remuxing support for VP9
Add VP9 as a valid HLS format to enable remuxing. This is useful when audio processing is required, but the VP9 video can be passed as-is to avoid unnecessary video transcoding.

No VP9 encoder is enabled and should not be enabled. AV1 and HEVC should be preferred over VP9 if video transcoding is required.

Signed-off-by: gnattu <gnattuoc@me.com>
2024-05-16 09:34:21 +08:00
Jonhnny Translate d318010c67 Translated using Weblate (French (Canada))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fr_CA/
2024-05-15 18:46:55 -04:00
LilleMarkus 37b2d3aa2c Translated using Weblate (Estonian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/et/
2024-05-15 10:56:35 -04:00
Bond-009 279e91bb3d Merge pull request #11642 from jellyfin/renovate/ci-deps
Update danielpalme/ReportGenerator-GitHub-Action action to v5.3.0
2024-05-15 09:37:29 +02:00
Kityn e619e19242 Translated using Weblate (Polish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pl/
2024-05-15 00:53:05 -04:00
newton181 01c352d2e8 Translated using Weblate (Spanish (Mexico))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/es_MX/
2024-05-14 20:20:34 -04:00
Cody Robibero 23d0537fb3 Fix reference to deprecated package (#11530) 2024-05-14 16:55:29 -06:00
Bond-009 d622fc9281 Merge pull request #11634 from jellyfin/renovate/dotnet-monorepo
Update dotnet monorepo to v8.0.5
2024-05-14 23:36:04 +02:00
renovate[bot] 435023a8f9 Update danielpalme/ReportGenerator-GitHub-Action action to v5.3.0 2024-05-14 20:06:32 +00:00
renovate[bot] 0173f7642b Update dotnet monorepo to v8.0.5 2024-05-14 20:06:27 +00:00
Bond-009 60fb3d5c06 Merge pull request #11515 from jellyfin/renovate/ci-deps
Update CI dependencies
2024-05-14 22:05:44 +02:00
cptn fe07b4bbc5 Allow collection sort by Release Date Descending
- default sort is still Release Date Ascending
- choosing sort by Release Date will change it to sort by Release Date Descending

This is because most people go to collections to browse new movies to watch, and recently released movies should be on top.
2024-05-13 22:59:41 -04:00
gnattu 69d4886697 Backport pull request #11587 from jellyfin/release-10.9.z
Fix network config

Original-merge: f396a95f05

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-13 12:47:38 -04:00
TimGels 610e56baaf Backport pull request #11578 from jellyfin/release-10.9.z
Change "try" to "attempt" english translation

Original-merge: 25c50bcc5d

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-13 12:47:36 -04:00
gnattu 5ac518b02a Backport pull request #11570 from jellyfin/release-10.9.z
Fix absolute path checking on windows

Original-merge: 6689d837d6

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-13 12:47:35 -04:00
crobibero 3564b00fc0 Backport pull request #11569 from jellyfin/release-10.9.z
Default to processor count concurrent scan instead of 2 * processor count

Original-merge: f77a5d0c5c

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-13 12:47:34 -04:00
crobibero a118498f79 Backport pull request #11541 from jellyfin/release-10.9.z
Fix migration with special Rating

Original-merge: efba619acb

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-13 12:47:32 -04:00
crobibero e5ecdcf8c9 Backport pull request #11539 from jellyfin/release-10.9.z
Add metrics collector to disposable parts

Original-merge: c1907354e8

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
2024-05-13 12:47:31 -04:00
Joshua M. Boniface 1e0c7f05e6 Merge pull request #11603 from joshuaboniface/stable-openapi
Add OpenAPI spec generator for stable releases
2024-05-13 11:54:57 -04:00
Joshua M. Boniface bd255b3553 Use dashes in workflow names 2024-05-13 11:30:25 -04:00
Joshua M. Boniface f568aed520 Clean up trailing space 2024-05-13 11:25:58 -04:00
Joshua M. Boniface 27ecf175d8 Use expansion syntax as per [1]
[1] https://docs.github.com/en/actions/using-jobs/using-conditions-to-control-job-execution#overview
2024-05-13 11:25:22 -04:00
Joshua M. Boniface 11a454c0fc Don't run unstables on tags 2024-05-13 11:24:21 -04:00
Joshua M. Boniface 8dd91ce9f8 Add OpenAPI spec generator for stable releases
Adds a stable publish action which runs on new tags and pushes the spec
to the repository server. Uses all the same logic as Unstable specs but
with the correct paths.
2024-05-13 11:21:38 -04:00
renovate[bot] 92e5f946c1 Update CI dependencies 2024-05-13 13:21:27 +00:00
Bas fd250e4fe1 Translated using Weblate (Dutch)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/nl/
2024-05-13 02:32:06 -04:00
Cody Robibero 1ec130757d Disable nuget warning in Jellyfin.Extensions (#11536) 2024-05-12 15:18:27 -06:00
mozartbanging ce3e287892 Translated using Weblate (Finnish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/fi/
2024-05-12 13:26:08 -04:00
therealblitz00 13ed3329e0 Translated using Weblate (Portuguese (Brazil))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/pt_BR/
2024-05-12 13:26:08 -04:00
sanctimon 25c23af865 Translated using Weblate (Greek)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/el/
2024-05-12 03:13:51 -04:00
felix920506 4b7c41ee0f Update version in issue template (#11400) 2024-05-11 18:06:16 -06:00
Oatavandi 717b726329 Translated using Weblate (Tamil)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ta/
2024-05-11 15:24:07 -04:00
Jellyfin Release Bot 04022f85af Bump version to 10.10.0 2024-05-11 14:23:59 -04:00
nyanmisaka deb36eeeda Add HWA video transpose support (+-90/180)
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2024-03-30 06:09:58 +08:00
nyanmisaka 95b81ff54a Only streamCopy videos containing rotation data in fMP4
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2024-03-30 06:09:58 +08:00
nyanmisaka 6076462ff5 Add tests for the video rotation side data
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2024-03-30 06:09:58 +08:00
nyanmisaka 5967d26228 Register video rotation side data in DB
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2024-03-30 06:09:58 +08:00
nyanmisaka bf654bde60 Add json parser for video rotation side data
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2024-03-30 06:09:58 +08:00
felix920506 9ec657cf6e Remove permission check from GHA
Permission check is moved to the script itself
2024-03-27 13:23:10 -04:00
1911 changed files with 173670 additions and 37045 deletions
+1 -1
View File
@@ -3,7 +3,7 @@
"isRoot": true,
"tools": {
"dotnet-ef": {
"version": "8.0.4",
"version": "10.0.11",
"commands": [
"dotnet-ef"
]
@@ -1,28 +0,0 @@
{
"name": "Development Jellyfin Server - FFmpeg",
"image":"mcr.microsoft.com/devcontainers/dotnet:8.0-jammy",
// restores nuget packages, installs the dotnet workloads and installs the dev https certificate
"postStartCommand": "dotnet restore; dotnet workload update; dotnet dev-certs https --trust; sudo bash \"./.devcontainer/Dev - Server Ffmpeg/install-ffmpeg.sh\"",
// reads the extensions list and installs them
"postAttachCommand": "cat .vscode/extensions.json | jq -r .recommendations[] | xargs -n 1 code --install-extension",
"features": {
"ghcr.io/devcontainers/features/dotnet:2": {
"version": "none",
"dotnetRuntimeVersions": "8.0",
"aspNetCoreRuntimeVersions": "8.0"
},
"ghcr.io/devcontainers-contrib/features/apt-packages:1": {
"preserve_apt_list": false,
"packages": ["libfontconfig1"]
},
"ghcr.io/devcontainers/features/docker-in-docker:2": {
"dockerDashComposeVersion": "v2"
},
"ghcr.io/devcontainers/features/github-cli:1": {},
"ghcr.io/eitsupi/devcontainer-features/jq-likes:2": {}
},
"hostRequirements": {
"memory": "8gb",
"cpus": 4
}
}
+27 -9
View File
@@ -1,21 +1,39 @@
{
"name": "Development Jellyfin Server",
"image":"mcr.microsoft.com/devcontainers/dotnet:8.0-jammy",
"image": "mcr.microsoft.com/devcontainers/dotnet:10.0-noble",
"service": "app",
"workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}",
// restores nuget packages, installs the dotnet workloads and installs the dev https certificate
"postStartCommand": "dotnet restore; dotnet workload update; dotnet dev-certs https --trust",
// reads the extensions list and installs them
"postAttachCommand": "cat .vscode/extensions.json | jq -r .recommendations[] | xargs -n 1 code --install-extension",
"postStartCommand": "sudo dotnet restore; sudo dotnet workload update; sudo dotnet dev-certs https --trust; sudo bash \"./.devcontainer/install-ffmpeg.sh\"",
// The previous way of installing extensions via the vs command dont work on selfhosted devcontainers
"customizations": {
"vscode": {
"extensions": [
"ms-dotnettools.csharp",
"editorconfig.editorconfig",
"github.vscode-github-actions",
"ms-dotnettools.vscode-dotnet-runtime",
"ms-dotnettools.csdevkit",
"alexcvzz.vscode-sqlite",
"streetsidesoftware.code-spell-checker",
"eamodio.gitlens",
"redhat.vscode-xml"
]
}
},
"features": {
"ghcr.io/devcontainers/features/dotnet:2": {
"version": "none",
"dotnetRuntimeVersions": "8.0",
"aspNetCoreRuntimeVersions": "8.0"
"dotnetRuntimeVersions": "10.0",
"aspNetCoreRuntimeVersions": "10.0"
},
"ghcr.io/devcontainers-contrib/features/apt-packages:1": {
"ghcr.io/devcontainers-extra/features/apt-packages:1": {
"preserve_apt_list": false,
"packages": ["libfontconfig1"]
"packages": [
"libfontconfig1"
]
},
"ghcr.io/devcontainers/features/docker-in-docker:2": {
"ghcr.io/devcontainers/features/docker-in-docker:3": {
"dockerDashComposeVersion": "v2"
},
"ghcr.io/devcontainers/features/github-cli:1": {},
@@ -1,6 +1,6 @@
#!/bin/bash
## configure the following for a manuall install of a specific version from the repo
## configure the following for a manual install of a specific version from the repo
# wget https://repo.jellyfin.org/releases/server/ubuntu/versions/jellyfin-ffmpeg/6.0.1-1/jellyfin-ffmpeg6_6.0.1-1-jammy_amd64.deb -O ffmpeg.deb
@@ -15,7 +15,7 @@ sudo apt-get install software-properties-common -y
sudo add-apt-repository universe -y
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://repo.jellyfin.org/jellyfin_team.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/jellyfin.gpg
curl -fsSL https://repo.jellyfin.org/jellyfin_team.gpg.key | sudo gpg --batch --yes --dearmor -o /etc/apt/keyrings/jellyfin.gpg
export VERSION_OS="$( awk -F'=' '/^ID=/{ print $NF }' /etc/os-release )"
export VERSION_CODENAME="$( awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release )"
export DPKG_ARCHITECTURE="$( dpkg --print-architecture )"
@@ -29,4 +29,4 @@ Signed-By: /etc/apt/keyrings/jellyfin.gpg
EOF
sudo apt update -y
sudo apt install jellyfin-ffmpeg6 -y
sudo apt install jellyfin-ffmpeg7 -y
+348
View File
@@ -192,3 +192,351 @@ csharp_space_between_method_call_empty_parameter_list_parentheses = false
# Wrapping preferences
csharp_preserve_single_line_statements = true
csharp_preserve_single_line_blocks = true
###############################
# C# Analyzer Rules #
###############################
### ERROR #
###########
# error on SA1000: The keyword 'new' should be followed by a space
dotnet_diagnostic.SA1000.severity = error
# error on SA1001: Commas should not be preceded by whitespace
dotnet_diagnostic.SA1001.severity = error
# error on SA1106: Code should not contain empty statements
dotnet_diagnostic.SA1106.severity = error
# error on SA1107: Code should not contain multiple statements on one line
dotnet_diagnostic.SA1107.severity = error
# error on SA1028: Code should not contain trailing whitespace
dotnet_diagnostic.SA1028.severity = error
# error on SA1117: The parameters should all be placed on the same line or each parameter should be placed on its own line
dotnet_diagnostic.SA1117.severity = error
# error on SA1137: Elements should have the same indentation
dotnet_diagnostic.SA1137.severity = error
# error on SA1142: Refer to tuple fields by name
dotnet_diagnostic.SA1142.severity = error
# error on SA1210: Using directives should be ordered alphabetically by the namespaces
dotnet_diagnostic.SA1210.severity = error
# error on SA1316: Tuple element names should use correct casing
dotnet_diagnostic.SA1316.severity = error
# error on SA1414: Tuple types in signatures should have element names
dotnet_diagnostic.SA1414.severity = error
# disable warning SA1513: Closing brace should be followed by blank line
dotnet_diagnostic.SA1513.severity = error
# error on SA1518: File is required to end with a single newline character
dotnet_diagnostic.SA1518.severity = error
# error on SA1629: Documentation text should end with a period
dotnet_diagnostic.SA1629.severity = error
# error on CA1001: Types that own disposable fields should be disposable
dotnet_diagnostic.CA1001.severity = error
# error on CA1012: Abstract types should not have public constructors
dotnet_diagnostic.CA1012.severity = error
# error on CA1063: Implement IDisposable correctly
dotnet_diagnostic.CA1063.severity = error
# error on CA1305: Specify IFormatProvider
dotnet_diagnostic.CA1305.severity = error
# error on CA1307: Specify StringComparison for clarity
dotnet_diagnostic.CA1307.severity = error
# error on CA1309: Use ordinal StringComparison
dotnet_diagnostic.CA1309.severity = error
# error on CA1310: Specify StringComparison for correctness
dotnet_diagnostic.CA1310.severity = error
# error on CA1513: Use 'ObjectDisposedException.ThrowIf' instead of explicitly throwing a new exception instance
dotnet_diagnostic.CA1513.severity = error
# error on CA1725: Parameter names should match base declaration
dotnet_diagnostic.CA1725.severity = error
# error on CA1725: Call async methods when in an async method
dotnet_diagnostic.CA1727.severity = error
# error on CA1813: Avoid unsealed attributes
dotnet_diagnostic.CA1813.severity = error
# error on CA1834: Use 'StringBuilder.Append(char)' instead of 'StringBuilder.Append(string)' when the input is a constant unit string
dotnet_diagnostic.CA1834.severity = error
# error on CA1843: Do not use 'WaitAll' with a single task
dotnet_diagnostic.CA1843.severity = error
# error on CA1845: Use span-based 'string.Concat'
dotnet_diagnostic.CA1845.severity = error
# error on CA1849: Call async methods when in an async method
dotnet_diagnostic.CA1849.severity = error
# error on CA1851: Possible multiple enumerations of IEnumerable collection
dotnet_diagnostic.CA1851.severity = error
# error on CA1854: Prefer a 'TryGetValue' call over a Dictionary indexer access guarded by a 'ContainsKey' check to avoid double lookup
dotnet_diagnostic.CA1854.severity = error
# error on CA1860: Avoid using 'Enumerable.Any()' extension method
dotnet_diagnostic.CA1860.severity = error
# error on CA1861: Avoid constant arrays as arguments
dotnet_diagnostic.CA1861.severity = error
# error on CA1862: Use the 'StringComparison' method overloads to perform case-insensitive string comparisons
dotnet_diagnostic.CA1862.severity = error
# error on CA1863: Use 'CompositeFormat'
dotnet_diagnostic.CA1863.severity = error
# error on CA1864: Prefer the 'IDictionary.TryAdd(TKey, TValue)' method
dotnet_diagnostic.CA1864.severity = error
# error on CA1865-CA1867: Use 'string.Method(char)' instead of 'string.Method(string)' for string with single char
dotnet_diagnostic.CA1865.severity = error
dotnet_diagnostic.CA1866.severity = error
dotnet_diagnostic.CA1867.severity = error
# error on CA1868: Unnecessary call to 'Contains' for sets
dotnet_diagnostic.CA1868.severity = error
# error on CA1869: Cache and reuse 'JsonSerializerOptions' instances
dotnet_diagnostic.CA1869.severity = error
# error on CA1870: Use a cached 'SearchValues' instance
dotnet_diagnostic.CA1870.severity = error
# error on CA1871: Do not pass a nullable struct to 'ArgumentNullException.ThrowIfNull'
dotnet_diagnostic.CA1871.severity = error
# error on CA1872: Prefer 'Convert.ToHexString' and 'Convert.ToHexStringLower' over call chains based on 'BitConverter.ToString'
dotnet_diagnostic.CA1872.severity = error
# error on CA2016: Forward the CancellationToken parameter to methods that take one
# or pass in 'CancellationToken.None' explicitly to indicate intentionally not propagating the token
dotnet_diagnostic.CA2016.severity = error
# error on CA2201: Exception type System.Exception is not sufficiently specific
dotnet_diagnostic.CA2201.severity = error
# error on CA2215: Dispose methods should call base class dispose
dotnet_diagnostic.CA2215.severity = error
# error on CA2249: Use 'string.Contains' instead of 'string.IndexOf' to improve readability
dotnet_diagnostic.CA2249.severity = error
# error on CA2254: Template should be a static expression
dotnet_diagnostic.CA2254.severity = error
################
### SUGGESTION #
################
# disable warning CA1014: Mark assemblies with CLSCompliantAttribute
dotnet_diagnostic.CA1014.severity = suggestion
# disable warning CA1024: Use properties where appropriate
dotnet_diagnostic.CA1024.severity = suggestion
# disable warning CA1031: Do not catch general exception types
dotnet_diagnostic.CA1031.severity = suggestion
# disable warning CA1032: Implement standard exception constructors
dotnet_diagnostic.CA1032.severity = suggestion
# disable warning CA1040: Avoid empty interfaces
dotnet_diagnostic.CA1040.severity = suggestion
# disable warning CA1062: Validate arguments of public methods
dotnet_diagnostic.CA1062.severity = suggestion
# TODO: enable when false positives are fixed
# disable warning CA1508: Avoid dead conditional code
dotnet_diagnostic.CA1508.severity = suggestion
# disable warning CA1515: Consider making public types internal
dotnet_diagnostic.CA1515.severity = suggestion
# disable warning CA1716: Identifiers should not match keywords
dotnet_diagnostic.CA1716.severity = suggestion
# disable warning CA1720: Identifiers should not contain type names
dotnet_diagnostic.CA1720.severity = suggestion
# disable warning CA1724: Type names should not match namespaces
dotnet_diagnostic.CA1724.severity = suggestion
# disable warning CA1873: Avoid potentially expensive logging
dotnet_diagnostic.CA1873.severity = suggestion
# disable warning CA1805: Do not initialize unnecessarily
dotnet_diagnostic.CA1805.severity = suggestion
# disable warning CA1812: internal class that is apparently never instantiated.
# If so, remove the code from the assembly.
# If this class is intended to contain only static members, make it static
dotnet_diagnostic.CA1812.severity = suggestion
# disable warning CA1822: Member does not access instance data and can be marked as static
dotnet_diagnostic.CA1822.severity = suggestion
# CA1859: Use concrete types when possible for improved performance
dotnet_diagnostic.CA1859.severity = suggestion
# TODO: Enable
# CA1861: Prefer 'static readonly' fields over constant array arguments if the called method is called repeatedly and is not mutating the passed array
dotnet_diagnostic.CA1861.severity = suggestion
# disable warning CA2000: Dispose objects before losing scope
dotnet_diagnostic.CA2000.severity = suggestion
# TODO: Reevaluate when false positives are fixed: https://github.com/dotnet/roslyn-analyzers/issues/7699
# disable warning CA2025: Do not pass 'IDisposable' instances into unawaited tasks
dotnet_diagnostic.CA2025.severity = suggestion
# disable warning CA2253: Named placeholders should not be numeric values
dotnet_diagnostic.CA2253.severity = suggestion
# disable warning CA5394: Do not use insecure randomness
dotnet_diagnostic.CA5394.severity = suggestion
# error on CA3003: Review code for file path injection vulnerabilities
dotnet_diagnostic.CA3003.severity = suggestion
# error on CA3006: Review code for process command injection vulnerabilities
dotnet_diagnostic.CA3006.severity = suggestion
###############
### DISABLED #
###############
# disable warning SA1009: Closing parenthesis should be followed by a space.
dotnet_diagnostic.SA1009.severity = none
# disable warning SA1011: Closing square bracket should be followed by a space.
dotnet_diagnostic.SA1011.severity = none
# disable warning SA1101: Prefix local calls with 'this.'
dotnet_diagnostic.SA1101.severity = none
# disable warning SA1108: Block statements should not contain embedded comments
dotnet_diagnostic.SA1108.severity = none
# disable warning SA1118: Parameter must not span multiple lines.
dotnet_diagnostic.SA1118.severity = none
# disable warning SA1128:: Put constructor initializers on their own line
dotnet_diagnostic.SA1128.severity = none
# disable warning SA1130: Use lambda syntax
dotnet_diagnostic.SA1130.severity = none
# disable warning SA1200: 'using' directive must appear within a namespace declaration
dotnet_diagnostic.SA1200.severity = none
# disable warning SA1202: 'public' members must come before 'private' members
dotnet_diagnostic.SA1202.severity = none
# disable warning SA1204: Static members must appear before non-static members
dotnet_diagnostic.SA1204.severity = none
# disable warning SA1309: Fields must not begin with an underscore
dotnet_diagnostic.SA1309.severity = none
# disable warning SA1311: Static readonly fields should begin with upper-case letter
dotnet_diagnostic.SA1311.severity = none
# disable warning SA1413: Use trailing comma in multi-line initializers
dotnet_diagnostic.SA1413.severity = none
# disable warning SA1512: Single-line comments must not be followed by blank line
dotnet_diagnostic.SA1512.severity = none
# disable warning SA1515: Single-line comment should be preceded by blank line
dotnet_diagnostic.SA1515.severity = none
# disable warning SA1600: Elements should be documented
dotnet_diagnostic.SA1600.severity = none
# disable warning SA1601: Partial elements should be documented
dotnet_diagnostic.SA1601.severity = none
# disable warning SA1602: Enumeration items should be documented
dotnet_diagnostic.SA1602.severity = none
# disable warning SA1633: The file header is missing or not located at the top of the file
dotnet_diagnostic.SA1633.severity = none
# disable warning CA1054: Change the type of parameter url from string to System.Uri
dotnet_diagnostic.CA1054.severity = none
# disable warning CA1055: URI return values should not be strings
dotnet_diagnostic.CA1055.severity = none
# disable warning CA1056: URI properties should not be strings
dotnet_diagnostic.CA1056.severity = none
# disable warning CA1303: Do not pass literals as localized parameters
dotnet_diagnostic.CA1303.severity = none
# disable warning CA1308: Normalize strings to uppercase
dotnet_diagnostic.CA1308.severity = none
# disable warning CA1848: Use the LoggerMessage delegates
dotnet_diagnostic.CA1848.severity = none
# disable warning CA2101: Specify marshaling for P/Invoke string arguments
dotnet_diagnostic.CA2101.severity = none
# disable warning CA2234: Pass System.Uri objects instead of strings
dotnet_diagnostic.CA2234.severity = none
# error on RS0030: Do not used banned APIs
dotnet_diagnostic.RS0030.severity = error
# disable warning IDISP001: Dispose created
dotnet_diagnostic.IDISP001.severity = suggestion
# TODO: Enable when false positives are fixed
# disable warning IDISP003: Dispose previous before re-assigning
dotnet_diagnostic.IDISP003.severity = suggestion
# disable warning IDISP004: Don't ignore created IDisposable
dotnet_diagnostic.IDISP004.severity = suggestion
# disable warning IDISP007: Don't dispose injected
dotnet_diagnostic.IDISP007.severity = suggestion
# disable warning IDISP008: Don't assign member with injected and created disposables
dotnet_diagnostic.IDISP008.severity = suggestion
[tests/**.{cs,vb}]
# disable warning SA0001: XML comment analysis is disabled due to project configuration
dotnet_diagnostic.SA0001.severity = none
# disable warning CA1707: Identifiers should not contain underscores
dotnet_diagnostic.CA1707.severity = none
# disable warning CA2007: Consider calling ConfigureAwait on the awaited task
dotnet_diagnostic.CA2007.severity = none
# disable warning CA2234: Pass system uri objects instead of strings
dotnet_diagnostic.CA2234.severity = suggestion
# disable warning xUnit1028: Test methods must have a supported return type.
dotnet_diagnostic.xUnit1028.severity = none
# CA1826: Do not use Enumerable methods on indexable collections
dotnet_diagnostic.CA1826.severity = suggestion
+11 -4
View File
@@ -1,4 +1,11 @@
# Joshua must review all changes to deployment and build.sh
.ci/* @joshuaboniface
deployment/* @joshuaboniface
build.sh @joshuaboniface
# Joshua must review all changes to bump_version and any files it touches
bump_version @joshuaboniface
.github/ISSUE_TEMPLATE @joshuaboniface
MediaBrowser.Common/MediaBrowser.Common.csproj @joshuaboniface
Jellyfin.Data/Jellyfin.Data.csproj @joshuaboniface
MediaBrowser.Controller/MediaBrowser.Controller.csproj @joshuaboniface
MediaBrowser.Model/MediaBrowser.Model.csproj @joshuaboniface
Emby.Naming/Emby.Naming.csproj @joshuaboniface
src/Jellyfin.Extensions/Jellyfin.Extensions.csproj @joshuaboniface
# Core must approve all changes within the repo config
.github/ @jellyfin/core
+130 -48
View File
@@ -1,58 +1,137 @@
name: Issue Report
description: File an issue report
title: "[Issue]: "
labels: [bug, triage]
type: Bug
body:
- type: markdown
id: introduction
attributes:
value: |
Thanks for taking the time to report an issue. Before submitting a report, please do the following:
1. Please head to our forum or chat rooms and troubleshoot with volunteers if you haven't already. Links can be found here: https://jellyfin.org/contact/
2. Please search the bug tracker for similar issues. If you do find one, please comment there instead of opening a new bug report.
3. If you decide to open a new report, please provide as much detail as possible.
4. Please **ONLY** report **ONE** issue per report. If you are experiencing multiple issues, please open multiple reports.
- type: textarea
id: what-happened
### Thank you for taking the time to report an issue!
Please keep in mind that Jellyfin is a [free and open-source](https://jellyfin.org/docs/general/about) project, made up entirely and exclusively of **volunteers** who donate their free time to the project.
- type: checkboxes
id: before-posting
attributes:
label: Please describe your bug
description: Also tell us, what did you expect to happen?
label: "This issue respects the following points:"
description: All conditions are **required**. Failure to comply with any of these conditions may cause your issue to be closed without comment.
options:
- label: This is a **bug**, not a question or a configuration issue; Please visit our [forum or chat rooms](https://jellyfin.org/contact/) first to troubleshoot with volunteers, before creating a report.
required: true
- label: This issue is **not** already reported on [GitHub](https://github.com/jellyfin/jellyfin/issues?q=is%3Aopen+is%3Aissue) _(I've searched it)_.
required: true
- label: I'm using an up to date version of Jellyfin Server stable, unstable or master; We generally do not support previous older versions. If possible, please update to the latest version before opening an issue.
required: true
- label: I agree to follow Jellyfin's [Code of Conduct](https://jellyfin.org/docs/general/community-standards.html#code-of-conduct).
required: true
- label: This report addresses only a single issue; If you encounter multiple issues, kindly create separate reports for each one.
required: true
- type: markdown
id: preliminary-information
attributes:
value: |
### General preliminary information
Please keep the following in mind when creating this issue:
1. Fill in as much of the template as possible. When you are unsure about the relevancy of a section, do include the information requested in that section. Only leave out information in sections when you are completely sure about it not being relevant.
2. Provide as much detail as possible. Do not assume other people to know what is going on.
3. Keep everything readable and structured. Nobody enjoys reading poorly written reports that are difficult to understand.
4. Keep an eye on your report as long as it is open, your involvement might be requested at a later moment.
5. Keep the title short and descriptive. The title is not the place to write down a full description of the issue.
6. When deciding to leave out information in a field, leave it blank and empty. Avoid writing things such as `n/a` for empty fields.
- type: textarea
id: bug-description
attributes:
label: Description of the bug
description: Please provide a detailed description on the bug you encountered, in a readable and comprehensible way.
placeholder: |
The more information that you are able to provide, the better. Did you do anything before this happened? Did you upgrade or change anything? Any screenshots or logs you can provide will be helpful.
If you are using an old release of Jellyfin, please also explain why.
After upgrading to version x.y.z of Jellyfin, the "login disclaimer" is showing incorrect text. It appears to me that it is appending the server name to the end of the login disclaimer, and showing that to a user. It might be a regression from pull request x. I have tried rebooting my host as well as my container multiple times. I tested this functionality on different clients, and it happens to all the tested clients (client x, y, z), that support the login disclaimer functionality. This makes me believe it is a server side issue.
validations:
required: true
- type: textarea
id: repro-steps
attributes:
label: Reproduction Steps
label: Reproduction steps
description: Reproduction steps should be complete and self-contained. Anyone can reproduce this issue by following these steps. Furthermore, the steps should be clear and easy to follow.
placeholder: |
1. In this environment...
2. With this config...
3. Run '...'
4. See error...
1. Sign in on the Jellyfin web client, with an admin account, using a browser of your choice.
2. Navigate to the dashboard.
3. Select "general".
4. Change the login disclaimer to something like "I am a cool disclaimer!"
5. Save the settings.
6. Sign out.
7. Make sure you are on the sign in screen. Otherwise, navigate to the sign in screen manually.
validations:
required: true
- type: textarea
id: actual-behavior
attributes:
label: What is the current _bug_ behavior?
description: Write down the incorrect behavior that currently happens after following the reproduction steps.
placeholder: |
The login disclaimer on the sign in screen has the server name appended to the text. The text shown is: "I am a cool disclaimer!jellyfinserver".
validations:
required: true
- type: textarea
id: expected-behavior
attributes:
label: What is the expected _correct_ behavior?
description: Write down the correct expected behavior that is supposed to happen after following the reproduction steps.
placeholder: |
The login disclaimer on the sign in screen should only show the configured text. The text that should be shown is: "I am a cool disclaimer!".
validations:
required: true
- type: dropdown
id: version
attributes:
label: Jellyfin Version
description: What version of Jellyfin are you running?
label: Jellyfin Server version
description: What version of Jellyfin are you using?
options:
- 10.8.13
- 10.8.12
- 10.8.11 or older (please specify)
- Unstable (master branch)
- 10.11.11
- 10.11.10
- 10.11.9
- 10.11.8
- 10.11.7
- 10.11.6
- Master
- Unstable
- Older*
validations:
required: true
- type: input
id: version-other
id: version-master
attributes:
label: "if other:"
placeholder: Other
label: "Specify commit id"
description: Fill in this field in case the option 'master' is selected. Provide the commit id it was built on.
placeholder: |
610e56baafc3011e1bfa043bdabb567bda0c2ab0
- type: input
id: version-unstable
attributes:
label: "Specify unstable release number"
description: Fill in this field in case the option 'unstable' is selected. Provide the unstable release number.
placeholder: |
2024050906
- type: input
id: version-older
attributes:
label: "Specify version number"
description: Fill in this field in case the option 'older' is selected. Provide the version number.
placeholder: |
x.y.z
- type: input
id: build-version
attributes:
label: "Specify the build version"
description: Please provide the build version that is shown in the dashboard.
validations:
required: true
- type: textarea
id: environment-information
attributes:
label: Environment
description: |
Accurately fill in as much environment details as possible. If a certain environment field is not shown in the template below, but you consider useful information, please include it.
Examples:
- **OS**: [e.g. Debian 11, Windows 10]
- **Linux Kernel**: [e.g. none, 5.15, 6.1, etc.]
@@ -62,12 +141,15 @@ body:
- **FFmpeg Version**: [e.g. 5.1.2-Jellyfin]
- **Playback**: [Direct Play, Remux, Direct Stream, Transcode]
- **Hardware Acceleration**: [e.g. none, VAAPI, NVENC, etc.]
- **CPU Model**: [e.g. AMD Ryzen 5 9600X, Intel Core i7-8565U, etc.]
- **GPU Model**: [e.g. none, UHD630, GTX1050, etc.]
- **Installed Plugins**: [e.g. none, Fanart, Anime, etc.]
- **Reverse Proxy**: [e.g. none, nginx, apache, etc.]
- **Base URL**: [e.g. none, yes: /example]
- **Networking**: [e.g. Host, Bridge/NAT]
- **Storage**: [e.g. local, NFS, cloud]
- **Jellyfin Data Storage & Filesystem**: [e.g. local SATA SSD - ext4, local HDD - NTFS]
- **Media Storage & Filesystem**: [e.g. Local HDD - ext4, SMB Share]
- **External Integrations**: [e.g. Jellystat, Jellyseerr]
value: |
- OS:
- Linux Kernel:
@@ -77,31 +159,35 @@ body:
- FFmpeg Version:
- Playback Method:
- Hardware Acceleration:
- CPU Model:
- GPU Model:
- Plugins:
- Reverse Proxy:
- Base URL:
- Networking:
- Storage:
- Jellyfin Data Storage & Filesystem:
- Media Storage & Filesystem:
- External Integrations:
render: markdown
validations:
required: true
- type: markdown
id: general-information-logs
attributes:
value: |
When providing logs, please keep the following things in mind.
1. **DO NOT** use external paste services.
When providing logs, please keep the following things in mind:
1. **DO NOT** use external paste services. If logs are too large to paste into the field, upload them as text files.
2. Please provide complete logs.
- For server logs, include everything you think is important plus *10 lines before and after*
- For server logs, ensure to capture all relevant information, encompassing both the events leading up to and following the occurrence of the issue. Typically, providing 10 *lines preceding and succeeding* the problem should be adequate.
- For ffmpeg logs, please provide the entire file unmodified.
3. Please do not run logs through any translation program. Especially beware if your browser translates pages by default.
3. Please do not run logs through any translation program. We exclusively accept raw, untranslated logs. Particularly exercise caution if your browser automatically translates pages by default.
- Do not forget to censor out personal information such as public IP addresses.
4. Please do not include logs as screenshots, with the only exception being client logs in browsers.
- type: textarea
id: logs
id: jellyfin-logs
attributes:
label: Jellyfin logs
description: Please copy and paste any relevant log output. This can be found in Dashboard > Logs.
placeholder: For playback issues, browser/client and FFmpeg logs may be more useful.
render: shell
validations:
required: true
@@ -109,24 +195,20 @@ body:
id: ffmpeg-logs
attributes:
label: FFmpeg logs
description: Please copy and paste recent FFmpeg log output. This can be found in Dashboard > Logs > FFmpeg*.log.
placeholder: This field is mandatory for debugging hardware transcoding issues. It's important to include the specific codec details. If no FFmpeg logs appear, the file was Direct Played and did not use FFmpeg.
description: Relevant FFmpeg log output. This can be found in Dashboard > Logs > FFmpeg*.log. This field is considered mandatory for transcoding related issues. It's also important to include the specific codec details.
render: shell
- type: textarea
id: browserlogs
id: browser-logs
attributes:
label: Please attach any browser or client logs here
placeholder: Access browser logs by using the F12 to bring up the console. Screenshots are typically easier to read than raw logs. For clients such as Android or iOS, please see our documentation.
label: Client / Browser logs
description: Access browser logs by using the F12 to bring up the console. Screenshots are typically easier to read than raw logs. For clients such as Android or iOS, please see our documentation.
- type: textarea
id: screenshots
attributes:
label: Please attach any screenshots here
placeholder: Images can be pasted directly into the textbox and will be hosted by github.
- type: checkboxes
id: terms
label: Relevant screenshots or videos
description: Attach relevant screenshots or videos related to this report.
- type: textarea
id: additional-information
attributes:
label: Code of Conduct
description: By submitting this issue, you agree to follow our [Code of Conduct](https://jellyfin.org/docs/general/community-standards.html#code-of-conduct)
options:
- label: I agree to follow this project's Code of Conduct
required: true
label: Additional information
description: Any additional information that might be useful to this issue.
+5 -1
View File
@@ -1,11 +1,15 @@
<!--
Ensure your title is short, descriptive, and in the imperative mood (Fix X, Change Y, instead of Fixed X, Changed Y).
For a good inspiration of what to write in commit messages and PRs please review https://chris.beams.io/posts/git-commit/ and our documentation.
For a good inspiration of what to write in commit messages and PRs please review https://chris.beams.io/posts/git-commit/ and our https://jellyfin.org/docs/general/contributing/issues/ page.
-->
**Changes**
<!-- Describe your changes here in 1-5 sentences. -->
**Code assistance**
<!-- If code assistance was used, describe how it contributed
e.g., code generated by LLM, explanation of code base, debugging guidance. -->
**Issues**
<!-- Tag any issues that this PR solves here.
ex. Fixes # -->
+13 -6
View File
@@ -8,6 +8,10 @@ on:
schedule:
- cron: '24 2 * * 4'
permissions:
contents: read
security-events: write
jobs:
analyze:
name: Analyze
@@ -20,18 +24,21 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Setup .NET
uses: actions/setup-dotnet@4d6c8fcf3c8f7a60068d26b594648e99df24cee3 # v4.0.0
uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
dotnet-version: '8.0.x'
dotnet-version: '10.0.x'
- name: Initialize CodeQL
uses: github/codeql-action/init@d39d31e687223d841ef683f52467bd88e9b21c14 # v3.25.3
uses: github/codeql-action/init@ff2f1c621b7f889edc0d3c761ac2e6a3f8cdb0dd # v4.37.7
with:
languages: ${{ matrix.language }}
queries: +security-extended
- name: Autobuild
uses: github/codeql-action/autobuild@d39d31e687223d841ef683f52467bd88e9b21c14 # v3.25.3
uses: github/codeql-action/autobuild@ff2f1c621b7f889edc0d3c761ac2e6a3f8cdb0dd # v4.37.7
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@d39d31e687223d841ef683f52467bd88e9b21c14 # v3.25.3
uses: github/codeql-action/analyze@ff2f1c621b7f889edc0d3c761ac2e6a3f8cdb0dd # v4.37.7
+159
View File
@@ -0,0 +1,159 @@
name: ABI Compatibility
on:
pull_request:
permissions: {}
jobs:
abi-head:
name: ABI - HEAD
runs-on: ubuntu-latest
permissions: read-all
steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ github.event.pull_request.head.sha }}
repository: ${{ github.event.pull_request.head.repo.full_name }}
- name: Setup .NET
uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
dotnet-version: '10.0.x'
- name: Build
run: |
dotnet build Jellyfin.Server -o ./out
- name: Upload Head
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: abi-head
retention-days: 14
if-no-files-found: error
path: out/
abi-base:
name: ABI - BASE
if: ${{ github.base_ref != '' }}
runs-on: ubuntu-latest
permissions: read-all
steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ github.event.pull_request.head.sha }}
repository: ${{ github.event.pull_request.head.repo.full_name }}
fetch-depth: 0
- name: Setup .NET
uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
dotnet-version: '10.0.x'
- name: Checkout common ancestor
env:
HEAD_REF: ${{ github.head_ref }}
run: |
git remote add upstream https://github.com/${{ github.event.pull_request.base.repo.full_name }}
git -c protocol.version=2 fetch --prune --progress --no-recurse-submodules upstream +refs/heads/*:refs/remotes/upstream/* +refs/tags/*:refs/tags/*
ANCESTOR_REF=$(git merge-base upstream/${{ github.base_ref }} origin/$HEAD_REF)
git checkout --progress --force $ANCESTOR_REF
- name: Build
run: |
dotnet build Jellyfin.Server -o ./out
- name: Upload Head
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: abi-base
retention-days: 14
if-no-files-found: error
path: out/
abi-diff:
permissions:
pull-requests: write # to create or update comment (peter-evans/create-or-update-comment)
name: ABI - Difference
if: ${{ github.event_name == 'pull_request' }}
runs-on: ubuntu-latest
needs:
- abi-head
- abi-base
steps:
- name: Download abi-head
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: abi-head
path: abi-head
- name: Download abi-base
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: abi-base
path: abi-base
- name: Setup ApiCompat
run: |
dotnet tool install --global Microsoft.DotNet.ApiCompat.Tool
- name: Run ApiCompat
id: diff
run: |
{
echo 'body<<EOF'
for file in Jellyfin.Data.dll MediaBrowser.Common.dll MediaBrowser.Controller.dll MediaBrowser.Model.dll Emby.Naming.dll Jellyfin.Extensions.dll Jellyfin.MediaEncoding.Keyframes.dll Jellyfin.Database.Implementations.dll; do
COMPAT_OUTPUT="$( { apicompat --left ./abi-base/${file} --right ./abi-head/${file}; } 2>&1 || true )"
if [ "APICompat ran successfully without finding any breaking changes." != "${COMPAT_OUTPUT}" ]; then
printf "\n${file}\n${COMPAT_OUTPUT}\n"
fi
done
echo EOF
} >> $GITHUB_OUTPUT
- name: Find difference comment
uses: peter-evans/find-comment@b30e6a3c0ed37e7c023ccd3f1db5c6c0b0c23aad # v4.0.0
id: find-comment
with:
issue-number: ${{ github.event.pull_request.number }}
direction: last
body-includes: abi-diff-workflow-comment
- name: Reply or edit difference comment (changed)
uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5.0.0
if: ${{ steps.diff.outputs.body != '' }}
with:
issue-number: ${{ github.event.pull_request.number }}
comment-id: ${{ steps.find-comment.outputs.comment-id }}
edit-mode: replace
token: ${{ secrets.JF_BOT_TOKEN }}
body: |
<!--abi-diff-workflow-comment-->
<details>
<summary>ABI Difference</summary>
```
${{ steps.diff.outputs.body }}
```
</details>
- name: Reply or edit difference comment (unchanged)
uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5.0.0
if: ${{ steps.diff.outputs.body == '' && steps.find-comment.outputs.comment-id != '' }}
with:
issue-number: ${{ github.event.pull_request.number }}
comment-id: ${{ steps.find-comment.outputs.comment-id }}
edit-mode: replace
token: ${{ secrets.JF_BOT_TOKEN }}
body: |
<!--abi-diff-workflow-comment-->
<details>
<summary>ABI Difference</summary>
No changes to the ABI found. See history of this comment for previous changes.
</details>
+25
View File
@@ -0,0 +1,25 @@
name: Format
on:
push:
branches:
- master
# Run formatter against the forked branch, but
# do not allow access to secrets
# https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflows-in-forked-repositories
pull_request:
env:
SDK_VERSION: "10.0.x"
jobs:
format-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
dotnet-version: ${{ env.SDK_VERSION }}
- name: Run DotNet Format
run: dotnet format --verify-no-changes --verbosity minimal
-203
View File
@@ -1,203 +0,0 @@
name: OpenAPI
on:
push:
branches:
- master
pull_request_target:
permissions: {}
jobs:
openapi-head:
name: OpenAPI - HEAD
runs-on: ubuntu-latest
permissions: read-all
steps:
- name: Checkout repository
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
with:
ref: ${{ github.event.pull_request.head.sha }}
repository: ${{ github.event.pull_request.head.repo.full_name }}
- name: Setup .NET
uses: actions/setup-dotnet@4d6c8fcf3c8f7a60068d26b594648e99df24cee3 # v4.0.0
with:
dotnet-version: '8.0.x'
- name: Generate openapi.json
run: dotnet test tests/Jellyfin.Server.Integration.Tests/Jellyfin.Server.Integration.Tests.csproj -c Release --filter "Jellyfin.Server.Integration.Tests.OpenApiSpecTests"
- name: Upload openapi.json
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3
with:
name: openapi-head
retention-days: 14
if-no-files-found: error
path: tests/Jellyfin.Server.Integration.Tests/bin/Release/net8.0/openapi.json
openapi-base:
name: OpenAPI - BASE
if: ${{ github.base_ref != '' }}
runs-on: ubuntu-latest
permissions: read-all
steps:
- name: Checkout repository
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
with:
ref: ${{ github.event.pull_request.head.sha }}
repository: ${{ github.event.pull_request.head.repo.full_name }}
fetch-depth: 0
- name: Checkout common ancestor
env:
HEAD_REF: ${{ github.head_ref }}
run: |
git remote add upstream https://github.com/${{ github.event.pull_request.base.repo.full_name }}
git -c protocol.version=2 fetch --prune --progress --no-recurse-submodules upstream +refs/heads/*:refs/remotes/upstream/* +refs/tags/*:refs/tags/*
ANCESTOR_REF=$(git merge-base upstream/${{ github.base_ref }} origin/$HEAD_REF)
git checkout --progress --force $ANCESTOR_REF
- name: Setup .NET
uses: actions/setup-dotnet@4d6c8fcf3c8f7a60068d26b594648e99df24cee3 # v4.0.0
with:
dotnet-version: '8.0.x'
- name: Generate openapi.json
run: dotnet test tests/Jellyfin.Server.Integration.Tests/Jellyfin.Server.Integration.Tests.csproj -c Release --filter "Jellyfin.Server.Integration.Tests.OpenApiSpecTests"
- name: Upload openapi.json
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3
with:
name: openapi-base
retention-days: 14
if-no-files-found: error
path: tests/Jellyfin.Server.Integration.Tests/bin/Release/net8.0/openapi.json
openapi-diff:
permissions:
pull-requests: write # to create or update comment (peter-evans/create-or-update-comment)
name: OpenAPI - Difference
if: ${{ github.event_name == 'pull_request_target' }}
runs-on: ubuntu-latest
needs:
- openapi-head
- openapi-base
steps:
- name: Download openapi-head
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7
with:
name: openapi-head
path: openapi-head
- name: Download openapi-base
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7
with:
name: openapi-base
path: openapi-base
- name: Workaround openapi-diff issue
run: |
sed -i 's/"allOf"/"oneOf"/g' openapi-head/openapi.json
sed -i 's/"allOf"/"oneOf"/g' openapi-base/openapi.json
- name: Calculate OpenAPI difference
uses: docker://openapitools/openapi-diff
continue-on-error: true
with:
args: --fail-on-changed --markdown openapi-changes.md openapi-base/openapi.json openapi-head/openapi.json
- id: read-diff
name: Read openapi-diff output
run: |
body=$(cat openapi-changes.md)
body="${body//'%'/'%25'}"
body="${body//$'\n'/'%0A'}"
body="${body//$'\r'/'%0D'}"
echo ::set-output name=body::$body
- name: Find difference comment
uses: peter-evans/find-comment@3eae4d37986fb5a8592848f6a574fdf654e61f9e # v3.1.0
id: find-comment
with:
issue-number: ${{ github.event.pull_request.number }}
direction: last
body-includes: openapi-diff-workflow-comment
- name: Reply or edit difference comment (changed)
uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4.0.0
if: ${{ steps.read-diff.outputs.body != '' }}
with:
issue-number: ${{ github.event.pull_request.number }}
comment-id: ${{ steps.find-comment.outputs.comment-id }}
edit-mode: replace
body: |
<!--openapi-diff-workflow-comment-->
<details>
<summary>Changes in OpenAPI specification found. Expand to see details.</summary>
${{ steps.read-diff.outputs.body }}
</details>
- name: Edit difference comment (unchanged)
uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4.0.0
if: ${{ steps.read-diff.outputs.body == '' && steps.find-comment.outputs.comment-id != '' }}
with:
issue-number: ${{ github.event.pull_request.number }}
comment-id: ${{ steps.find-comment.outputs.comment-id }}
edit-mode: replace
body: |
<!--openapi-diff-workflow-comment-->
No changes to OpenAPI specification found. See history of this comment for previous changes.
publish:
name: OpenAPI - Publish Unstable Spec
if: |
github.event_name != 'pull_request_target' &&
contains(github.repository_owner, 'jellyfin')
runs-on: ubuntu-latest
needs:
- openapi-head
steps:
- name: Set unstable dated version
id: version
run: |-
echo "JELLYFIN_VERSION=$(date +'%Y%m%d%H%M%S')" >> $GITHUB_ENV
- name: Download openapi-head
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7
with:
name: openapi-head
path: openapi-head
- name: Upload openapi.json (unstable) to repository server
uses: appleboy/scp-action@917f8b81dfc1ccd331fef9e2d61bdc6c8be94634 # v0.1.7
with:
host: "${{ secrets.REPO_HOST }}"
username: "${{ secrets.REPO_USER }}"
key: "${{ secrets.REPO_KEY }}"
source: openapi-head/openapi.json
strip_components: 1
target: "/srv/incoming/openapi/unstable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}"
- name: Move openapi.json (unstable) into place
uses: appleboy/ssh-action@029f5b4aeeeb58fdfe1410a5d17f967dacf36262 # v1.0.3
with:
host: "${{ secrets.REPO_HOST }}"
username: "${{ secrets.REPO_USER }}"
key: "${{ secrets.REPO_KEY }}"
debug: false
script_stop: false
script: |
if ! test -d /run/workflows; then
sudo mkdir -p /run/workflows
sudo chown ${{ secrets.REPO_USER }} /run/workflows
fi
(
flock -x -w 300 200 || exit 1
TGT_DIR="/srv/repository/main/openapi"
LAST_SPEC="$( ls -lt ${TGT_DIR}/unstable/ | grep 'jellyfin-openapi' | head -1 | awk '{ print $NF }' )"
# If new and previous spec don't differ (diff retcode 0), remove incoming and finish
if diff /srv/incoming/openapi/unstable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}/openapi.json ${TGT_DIR}/unstable/${LAST_SPEC} &>/dev/null; then
rm -r /srv/incoming/openapi/unstable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}
exit 0
fi
# Move new spec into place
sudo mv /srv/incoming/openapi/unstable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}/openapi.json ${TGT_DIR}/unstable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}.json
# Delete previous jellyfin-openapi-unstable_previous.json
sudo rm ${TGT_DIR}/jellyfin-openapi-unstable_previous.json
# Move current jellyfin-openapi-unstable.json symlink to jellyfin-openapi-unstable_previous.json
sudo mv ${TGT_DIR}/jellyfin-openapi-unstable.json ${TGT_DIR}/jellyfin-openapi-unstable_previous.json
# Create new jellyfin-openapi-unstable.json symlink
sudo ln -s unstable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}.json ${TGT_DIR}/jellyfin-openapi-unstable.json
# Check that the previous openapi unstable spec link is correct
if [[ "$( readlink ${TGT_DIR}/jellyfin-openapi-unstable_previous.json )" != "unstable/${LAST_SPEC}" ]]; then
sudo rm ${TGT_DIR}/jellyfin-openapi-unstable_previous.json
sudo ln -s unstable/${LAST_SPEC} ${TGT_DIR}/jellyfin-openapi-unstable_previous.json
fi
) 200>/run/workflows/openapi-unstable.lock
+5 -4
View File
@@ -9,19 +9,20 @@ on:
pull_request:
env:
SDK_VERSION: "8.0.x"
SDK_VERSION: "10.0.x"
jobs:
run-tests:
strategy:
matrix:
os: ["ubuntu-latest", "macos-latest", "windows-latest"]
fail-fast: false
runs-on: "${{ matrix.os }}"
steps:
- uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-dotnet@4d6c8fcf3c8f7a60068d26b594648e99df24cee3 # v4.0.0
- uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
dotnet-version: ${{ env.SDK_VERSION }}
@@ -34,7 +35,7 @@ jobs:
--verbosity minimal
- name: Merge code coverage results
uses: danielpalme/ReportGenerator-GitHub-Action@2a2d60ea1c7e811f54684179af6ac1ae8c1ce69a # 5.2.5
uses: danielpalme/ReportGenerator-GitHub-Action@d3ebf1f760f7d8ab92cc44d9bcfee7ad73722a31 # v5.5.11
with:
reports: "**/coverage.cobertura.xml"
targetdir: "merged/"
+10 -95
View File
@@ -4,7 +4,7 @@ on:
types:
- created
- edited
pull_request_target:
pull_request:
types:
- labeled
- synchronize
@@ -17,14 +17,14 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Notify as seen
uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4.0.0
uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5.0.0
with:
token: ${{ secrets.JF_BOT_TOKEN }}
comment-id: ${{ github.event.comment.id }}
reactions: '+1'
- name: Checkout the latest code
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
token: ${{ secrets.JF_BOT_TOKEN }}
fetch-depth: 0
@@ -34,110 +34,25 @@ jobs:
env:
GITHUB_TOKEN: ${{ secrets.JF_BOT_TOKEN }}
check-backport:
permissions:
contents: read
name: Check Backport
if: ${{ ( github.event.issue.pull_request && contains(github.event.comment.body, '@jellyfin-bot check backport') ) || github.event.label.name == 'stable backport' || contains(github.event.pull_request.labels.*.name, 'stable backport' ) }}
runs-on: ubuntu-latest
steps:
- name: Notify as seen
uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4.0.0
if: ${{ github.event.comment != null }}
with:
token: ${{ secrets.JF_BOT_TOKEN }}
comment-id: ${{ github.event.comment.id }}
reactions: eyes
- name: Checkout the latest code
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
with:
token: ${{ secrets.JF_BOT_TOKEN }}
fetch-depth: 0
- name: Notify as running
id: comment_running
uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4.0.0
if: ${{ github.event.comment != null }}
with:
token: ${{ secrets.JF_BOT_TOKEN }}
issue-number: ${{ github.event.issue.number }}
body: |
Running backport tests...
- name: Perform test backport
id: run_tests
run: |
set +o errexit
git config --global user.name "Jellyfin Bot"
git config --global user.email "team@jellyfin.org"
CURRENT_BRANCH="origin/${GITHUB_HEAD_REF}"
git checkout master
git merge --no-ff ${CURRENT_BRANCH}
MERGE_COMMIT_HASH=$( git log -q -1 | head -1 | awk '{ print $2 }' )
git fetch --all
CURRENT_STABLE=$( git branch -r | grep 'origin/release' | sort -rV | head -1 | awk -F '/' '{ print $NF }' )
stable_branch="Current stable release branch: ${CURRENT_STABLE}"
echo ${stable_branch}
echo ::set-output name=branch::${stable_branch}
git checkout -t origin/${CURRENT_STABLE} -b ${CURRENT_STABLE}
git cherry-pick -sx -m1 ${MERGE_COMMIT_HASH} &>output.txt
retcode=$?
cat output.txt | grep -v 'hint:'
output="$( grep -v 'hint:' output.txt )"
output="${output//'%'/'%25'}"
output="${output//$'\n'/'%0A'}"
output="${output//$'\r'/'%0D'}"
echo ::set-output name=output::$output
exit ${retcode}
- name: Notify with result success
uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4.0.0
if: ${{ github.event.comment != null && success() }}
with:
token: ${{ secrets.JF_BOT_TOKEN }}
comment-id: ${{ steps.comment_running.outputs.comment-id }}
body: |
${{ steps.run_tests.outputs.branch }}
Output from `git cherry-pick`:
---
${{ steps.run_tests.outputs.output }}
reactions: hooray
- name: Notify with result failure
uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4.0.0
if: ${{ github.event.comment != null && failure() }}
with:
token: ${{ secrets.JF_BOT_TOKEN }}
comment-id: ${{ steps.comment_running.outputs.comment-id }}
body: |
${{ steps.run_tests.outputs.branch }}
Output from `git cherry-pick`:
---
${{ steps.run_tests.outputs.output }}
reactions: confused
rename:
name: Rename
if: contains(github.event.comment.body, '@jellyfin-bot rename') && github.event.comment.author_association == 'MEMBER'
if: contains(github.event.comment.body, '@jellyfin-bot rename')
runs-on: ubuntu-latest
steps:
- name: pull in script
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: jellyfin/jellyfin-triage-script
- name: install python
uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: '3.12'
python-version: '3.14'
cache: 'pip'
- name: install python packages
run: pip install -r rename/requirements.txt
- name: run rename script
run: python3 rename.py
working-directory: ./rename
+1 -1
View File
@@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-latest
if: ${{ contains(github.repository, 'jellyfin/') }}
steps:
- uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e # v9.0.0
- uses: actions/stale@4391f3da665fdf50b6810c1a66712fb9ba21aa93 # v11.0.0
with:
repo-token: ${{ secrets.JF_BOT_TOKEN }}
ascending: true
+6 -3
View File
@@ -10,16 +10,19 @@ jobs:
issues: write
steps:
- name: pull in script
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: jellyfin/jellyfin-triage-script
- name: install python
uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: '3.12'
python-version: '3.14'
cache: 'pip'
- name: install python packages
run: pip install -r main-repo-triage/requirements.txt
- name: check and comment issue
working-directory: ./main-repo-triage
run: python3 single_issue_gha.py
+44
View File
@@ -0,0 +1,44 @@
name: OpenAPI Generate
on:
workflow_call:
inputs:
ref:
required: true
type: string
repository:
required: true
type: string
artifact:
required: true
type: string
permissions:
contents: read
jobs:
main:
name: Main
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ inputs.ref }}
repository: ${{ inputs.repository }}
- name: Configure .NET
uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
dotnet-version: '10.0.x'
- name: Create File
run: dotnet test tests/Jellyfin.Server.Integration.Tests/Jellyfin.Server.Integration.Tests.csproj -c Release --filter Jellyfin.Server.Integration.Tests.OpenApiSpecTests
- name: Upload Artifact
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: ${{ inputs.artifact }}
path: tests/Jellyfin.Server.Integration.Tests/bin/Release/net10.0/openapi.json
retention-days: 14
if-no-files-found: error
+140
View File
@@ -0,0 +1,140 @@
name: OpenAPI Publish
on:
push:
branches:
- master
tags:
- 'v*'
jobs:
publish-openapi:
name: OpenAPI - Publish Artifact
uses: ./.github/workflows/openapi-generate.yml
permissions:
contents: read
with:
ref: ${{ github.sha }}
repository: ${{ github.repository }}
artifact: openapi-head
publish-unstable:
name: OpenAPI - Publish Unstable Spec
if: ${{ github.event_name != 'pull_request' && !startsWith(github.ref, 'refs/tags/v') && contains(github.repository_owner, 'jellyfin') }}
runs-on: ubuntu-latest
needs:
- publish-openapi
steps:
- name: Set unstable dated version
id: version
run: |-
echo "JELLYFIN_VERSION=$(date +'%Y%m%d%H%M%S')" >> $GITHUB_ENV
- name: Download openapi-head
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: openapi-head
path: openapi-head
- name: Upload openapi.json (unstable) to repository server
uses: appleboy/scp-action@ff85246acaad7bdce478db94a363cd2bf7c90345 # v1.0.0
with:
host: "${{ secrets.REPO_HOST }}"
username: "${{ secrets.REPO_USER }}"
key: "${{ secrets.REPO_KEY }}"
source: openapi-head/openapi.json
strip_components: 1
target: "/srv/incoming/openapi/unstable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}"
- name: Move openapi.json (unstable) into place
uses: appleboy/ssh-action@0ff4204d59e8e51228ff73bce53f80d53301dee2 # v1.2.5
with:
host: "${{ secrets.REPO_HOST }}"
username: "${{ secrets.REPO_USER }}"
key: "${{ secrets.REPO_KEY }}"
debug: false
script: |
if ! test -d /run/workflows; then
sudo mkdir -p /run/workflows
sudo chown ${{ secrets.REPO_USER }} /run/workflows
fi
(
flock -x -w 300 200 || exit 1
TGT_DIR="/srv/repository/main/openapi"
LAST_SPEC="$( ls -lt ${TGT_DIR}/unstable/ | grep 'jellyfin-openapi' | head -1 | awk '{ print $NF }' )"
# If new and previous spec don't differ (diff retcode 0), remove incoming and finish
if diff /srv/incoming/openapi/unstable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}/openapi.json ${TGT_DIR}/unstable/${LAST_SPEC} &>/dev/null; then
rm -r /srv/incoming/openapi/unstable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}
exit 0
fi
# Move new spec into place
sudo mv /srv/incoming/openapi/unstable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}/openapi.json ${TGT_DIR}/unstable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}.json
# Delete previous jellyfin-openapi-unstable_previous.json
sudo rm ${TGT_DIR}/jellyfin-openapi-unstable_previous.json
# Move current jellyfin-openapi-unstable.json symlink to jellyfin-openapi-unstable_previous.json
sudo mv ${TGT_DIR}/jellyfin-openapi-unstable.json ${TGT_DIR}/jellyfin-openapi-unstable_previous.json
# Create new jellyfin-openapi-unstable.json symlink
sudo ln -s unstable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}.json ${TGT_DIR}/jellyfin-openapi-unstable.json
# Check that the previous openapi unstable spec link is correct
if [[ "$( readlink ${TGT_DIR}/jellyfin-openapi-unstable_previous.json )" != "unstable/${LAST_SPEC}" ]]; then
sudo rm ${TGT_DIR}/jellyfin-openapi-unstable_previous.json
sudo ln -s unstable/${LAST_SPEC} ${TGT_DIR}/jellyfin-openapi-unstable_previous.json
fi
) 200>/run/workflows/openapi-unstable.lock
publish-stable:
name: OpenAPI - Publish Stable Spec
if: ${{ startsWith(github.ref, 'refs/tags/v') && contains(github.repository_owner, 'jellyfin') }}
runs-on: ubuntu-latest
needs:
- publish-openapi
steps:
- name: Set version number
id: version
run: |-
echo "JELLYFIN_VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV
- name: Download openapi-head
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: openapi-head
path: openapi-head
- name: Upload openapi.json (stable) to repository server
uses: appleboy/scp-action@ff85246acaad7bdce478db94a363cd2bf7c90345 # v1.0.0
with:
host: "${{ secrets.REPO_HOST }}"
username: "${{ secrets.REPO_USER }}"
key: "${{ secrets.REPO_KEY }}"
source: openapi-head/openapi.json
strip_components: 1
target: "/srv/incoming/openapi/stable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}"
- name: Move openapi.json (stable) into place
uses: appleboy/ssh-action@0ff4204d59e8e51228ff73bce53f80d53301dee2 # v1.2.5
with:
host: "${{ secrets.REPO_HOST }}"
username: "${{ secrets.REPO_USER }}"
key: "${{ secrets.REPO_KEY }}"
debug: false
script: |
if ! test -d /run/workflows; then
sudo mkdir -p /run/workflows
sudo chown ${{ secrets.REPO_USER }} /run/workflows
fi
(
flock -x -w 300 200 || exit 1
TGT_DIR="/srv/repository/main/openapi"
LAST_SPEC="$( ls -lt ${TGT_DIR}/stable/ | grep 'jellyfin-openapi' | head -1 | awk '{ print $NF }' )"
# If new and previous spec don't differ (diff retcode 0), remove incoming and finish
if diff /srv/incoming/openapi/stable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}/openapi.json ${TGT_DIR}/stable/${LAST_SPEC} &>/dev/null; then
rm -r /srv/incoming/openapi/stable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}
exit 0
fi
# Move new spec into place
sudo mv /srv/incoming/openapi/stable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}/openapi.json ${TGT_DIR}/stable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}.json
# Delete previous jellyfin-openapi-stable_previous.json
sudo rm ${TGT_DIR}/jellyfin-openapi-stable_previous.json
# Move current jellyfin-openapi-stable.json symlink to jellyfin-openapi-stable_previous.json
sudo mv ${TGT_DIR}/jellyfin-openapi-stable.json ${TGT_DIR}/jellyfin-openapi-stable_previous.json
# Create new jellyfin-openapi-stable.json symlink
sudo ln -s stable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}.json ${TGT_DIR}/jellyfin-openapi-stable.json
# Check that the previous openapi stable spec link is correct
if [[ "$( readlink ${TGT_DIR}/jellyfin-openapi-stable_previous.json )" != "stable/${LAST_SPEC}" ]]; then
sudo rm ${TGT_DIR}/jellyfin-openapi-stable_previous.json
sudo ln -s stable/${LAST_SPEC} ${TGT_DIR}/jellyfin-openapi-stable_previous.json
fi
) 200>/run/workflows/openapi-stable.lock
@@ -0,0 +1,80 @@
name: OpenAPI Check
on:
pull_request:
jobs:
ancestor:
name: Common Ancestor
runs-on: ubuntu-latest
outputs:
base_ref: ${{ steps.ancestor.outputs.base_ref }}
steps:
- name: Checkout Repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ github.event.pull_request.head.sha }}
repository: ${{ github.event.pull_request.head.repo.full_name }}
fetch-depth: 0
- name: Search History
id: ancestor
run: |
git remote add upstream https://github.com/${{ github.event.pull_request.base.repo.full_name }}
git fetch --prune --progress --no-recurse-submodules upstream +refs/heads/*:refs/remotes/upstream/* +refs/tags/*:refs/tags/*
ANCESTOR_REF=$(git merge-base upstream/${{ github.base_ref }} HEAD)
echo "ref: ${ANCESTOR_REF}"
echo "base_ref=${ANCESTOR_REF}" >> "$GITHUB_OUTPUT"
head:
name: Head Artifact
uses: ./.github/workflows/openapi-generate.yml
with:
ref: ${{ github.event.pull_request.head.sha }}
repository: ${{ github.event.pull_request.head.repo.full_name }}
artifact: openapi-head
base:
name: Base Artifact
uses: ./.github/workflows/openapi-generate.yml
needs:
- ancestor
with:
ref: ${{ needs.ancestor.outputs.base_ref }}
repository: ${{ github.event.pull_request.base.repo.full_name }}
artifact: openapi-base
diff:
name: Generate Report
runs-on: ubuntu-latest
needs:
- head
- base
steps:
- name: Download Head
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: openapi-head
path: openapi-head
- name: Download Base
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: openapi-base
path: openapi-base
- name: Detect Changes
id: openapi-diff
run: |
sed -i 's:allOf:oneOf:g' openapi-head/openapi.json
sed -i 's:allOf:oneOf:g' openapi-base/openapi.json
mkdir -p /tmp/openapi-report
mv openapi-head/openapi.json /tmp/openapi-report/head.json
mv openapi-base/openapi.json /tmp/openapi-report/base.json
docker run -v /tmp/openapi-report:/data openapitools/openapi-diff:2.1.6 /data/base.json /data/head.json --state -l ERROR --markdown /data/openapi-report.md
- name: Upload Artifact
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: openapi-report
path: /tmp/openapi-report/openapi-report.md
@@ -0,0 +1,59 @@
name: OpenAPI Report
on:
workflow_run:
workflows:
- OpenAPI Check
types:
- completed
jobs:
metadata:
name: Generate Metadata
runs-on: ubuntu-latest
if: ${{ github.event.workflow_run.conclusion == 'success' }}
outputs:
pr_number: ${{ steps.pr_number.outputs.pr_number }}
steps:
- name: Get Pull Request Number
id: pr_number
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
HEAD_SHA: ${{ github.event.workflow_run.head_sha }}
run: |
API_RESPONSE=$(gh pr list --repo "${GITHUB_REPOSITORY}" --search "${HEAD_SHA}" --state open --json number)
PR_NUMBER=$(echo "${API_RESPONSE}" | jq '.[0].number')
echo "repository: ${GITHUB_REPOSITORY}"
echo "sha: ${HEAD_SHA}"
echo "response: ${API_RESPONSE}"
echo "pr: ${PR_NUMBER}"
echo "pr_number=${PR_NUMBER}" >> "${GITHUB_OUTPUT}"
comment:
name: Pull Request Comment
runs-on: ubuntu-latest
if: ${{ github.event.workflow_run.conclusion == 'success' }}
needs:
- metadata
permissions:
pull-requests: write
actions: read
contents: read
steps:
- name: Download OpenAPI Report
id: download_report
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: openapi-report
path: openapi-report
run-id: ${{ github.event.workflow_run.id }}
github-token: ${{ secrets.GITHUB_TOKEN }}
- name: Push Comment
uses: thollander/actions-comment-pull-request@24bffb9b452ba05a4f3f77933840a6a841d1b32b # v3.0.1
with:
github-token: ${{ secrets.JF_BOT_TOKEN }}
file-path: ${{ steps.download_report.outputs.download-path }}/openapi-report.md
pr-number: ${{ needs.metadata.outputs.pr_number }}
comment-tag: openapi-report
+2 -1
View File
@@ -4,7 +4,7 @@ on:
push:
branches:
- master
pull_request_target:
pull_request:
issue_comment:
permissions: {}
@@ -21,6 +21,7 @@ jobs:
with:
project: Current Release
action: delete
column: In progress
repo-token: ${{ secrets.JF_BOT_TOKEN }}
- name: Add to 'Release Next' project
+6 -5
View File
@@ -5,18 +5,19 @@ on:
branches:
- master
pull_request_target:
issue_comment:
types: [synchronize]
permissions: {}
jobs:
label:
name: Labeling
main:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
if: ${{ github.repository == 'jellyfin/jellyfin' }}
steps:
- name: Apply label
uses: eps1lon/actions-label-merge-conflict@e62d7a53ff8be8b97684bffb6cfbbf3fc1115e2e # v3.0.0
if: ${{ github.event_name == 'push' || github.event_name == 'pull_request_target'}}
uses: eps1lon/actions-label-merge-conflict@0273be72a0bbd58fcd71d0d6c02c209b50d1e5e1 # v3.1.0
with:
dirtyLabel: 'merge conflict'
commentOnDirty: 'This pull request has merge conflicts. Please resolve the conflicts so the PR can be successfully reviewed and merged.'
+1 -1
View File
@@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-latest
if: ${{ contains(github.repository, 'jellyfin/') }}
steps:
- uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e # v9.0.0
- uses: actions/stale@4391f3da665fdf50b6810c1a66712fb9ba21aa93 # v11.0.0
with:
repo-token: ${{ secrets.JF_BOT_TOKEN }}
ascending: true
+3 -3
View File
@@ -28,12 +28,12 @@ jobs:
timeoutSeconds: 3600
- name: Setup YQ
uses: chrisdickinson/setup-yq@latest
uses: chrisdickinson/setup-yq@fa3192edd79d6eb0e4e12de8dde3a0c26f2b853b # latest
with:
yq-version: v4.9.8
- name: Checkout Repository
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ env.TAG_BRANCH }}
@@ -66,7 +66,7 @@ jobs:
NEXT_VERSION: ${{ github.event.inputs.NEXT_VERSION }}
steps:
- name: Checkout Repository
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ env.TAG_BRANCH }}
+5
View File
@@ -19,6 +19,7 @@ local.properties
.classpath
.settings/
.loadpath
*.lscache
# External tool builders
.externalToolBuilders/
@@ -277,3 +278,7 @@ apiclient/generated
# Omnisharp crash logs
mono_crash.*.json
# Devcontainer temp files
.devcontainer/devcontainer-lock.json
dotnet/
+6 -5
View File
@@ -1,12 +1,13 @@
{
"recommendations": [
"recommendations": [
"ms-dotnettools.csharp",
"editorconfig.editorconfig",
"github.vscode-github-actions",
"ms-dotnettools.vscode-dotnet-runtime",
"ms-dotnettools.csdevkit"
],
"unwantedRecommendations": [
"ms-dotnettools.csdevkit",
"alexcvzz.vscode-sqlite"
],
"unwantedRecommendations": [
]
]
}
+3 -3
View File
@@ -6,7 +6,7 @@
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceFolder}/Jellyfin.Server/bin/Debug/net8.0/jellyfin.dll",
"program": "${workspaceFolder}/Jellyfin.Server/bin/Debug/net10.0/jellyfin.dll",
"args": [],
"cwd": "${workspaceFolder}/Jellyfin.Server",
"console": "internalConsole",
@@ -22,7 +22,7 @@
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceFolder}/Jellyfin.Server/bin/Debug/net8.0/jellyfin.dll",
"program": "${workspaceFolder}/Jellyfin.Server/bin/Debug/net10.0/jellyfin.dll",
"args": ["--nowebclient"],
"cwd": "${workspaceFolder}/Jellyfin.Server",
"console": "internalConsole",
@@ -34,7 +34,7 @@
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceFolder}/Jellyfin.Server/bin/Debug/net8.0/jellyfin.dll",
"program": "${workspaceFolder}/Jellyfin.Server/bin/Debug/net10.0/jellyfin.dll",
"args": ["--nowebclient", "--ffmpeg", "/usr/lib/jellyfin-ffmpeg/ffmpeg"],
"cwd": "${workspaceFolder}/Jellyfin.Server",
"console": "internalConsole",
+3
View File
@@ -0,0 +1,3 @@
{
"dotnet.preferVisualStudioCodeFileSystemWatcher": true
}
+59 -11
View File
@@ -1,5 +1,6 @@
# Jellyfin Contributors
- [0x25CBFC4F](https://github.com/0x25CBFC4F)
- [1337joe](https://github.com/1337joe)
- [97carmine](https://github.com/97carmine)
- [Abbe98](https://github.com/Abbe98)
@@ -14,7 +15,7 @@
- [bilde2910](https://github.com/bilde2910)
- [bfayers](https://github.com/bfayers)
- [BnMcG](https://github.com/BnMcG)
- [Bond-009](https://github.com/Bond-009)
- [Bond_009](https://github.com/Bond-009)
- [brianjmurrell](https://github.com/brianjmurrell)
- [bugfixin](https://github.com/bugfixin)
- [chaosinnovator](https://github.com/chaosinnovator)
@@ -27,9 +28,12 @@
- [cryptobank](https://github.com/cryptobank)
- [cvium](https://github.com/cvium)
- [dannymichel](https://github.com/dannymichel)
- [darioackermann](https://github.com/darioackermann)
- [DaveChild](https://github.com/DaveChild)
- [DavidFair](https://github.com/DavidFair)
- [Delgan](https://github.com/Delgan)
- [DerMaddis](https://github.com/dermaddis)
- [Derpipose](https://github.com/Derpipose)
- [dcrdev](https://github.com/dcrdev)
- [dhartung](https://github.com/dhartung)
- [dinki](https://github.com/dinki)
@@ -52,6 +56,7 @@
- [geilername](https://github.com/geilername)
- [GermanCoding](https://github.com/GermanCoding)
- [gnattu](https://github.com/gnattu)
- [gnuyent](https://github.com/gnuyent)
- [GodTamIt](https://github.com/GodTamIt)
- [grafixeyehero](https://github.com/grafixeyehero)
- [h1nk](https://github.com/h1nk)
@@ -59,14 +64,19 @@
- [HelloWorld017](https://github.com/HelloWorld017)
- [ikomhoog](https://github.com/ikomhoog)
- [iwalton3](https://github.com/iwalton3)
- [Jakob Kukla](https://github.com/jakobkukla)
- [jftuga](https://github.com/jftuga)
- [jkhsjdhjs](https://github.com/jkhsjdhjs)
- [jmshrv](https://github.com/jmshrv)
- [joern-h](https://github.com/joern-h)
- [joshuaboniface](https://github.com/joshuaboniface)
- [JustAMan](https://github.com/JustAMan)
- [justinfenn](https://github.com/justinfenn)
- [JPVenson](https://github.com/JPVenson)
- [JPUC1143](https://github.com/Jpuc1143/)
- [KerryRJ](https://github.com/KerryRJ)
- [Larvitar](https://github.com/Larvitar)
- [lbenini](https://github.com/lbenini)
- [LeoVerto](https://github.com/LeoVerto)
- [Liggy](https://github.com/Liggy)
- [lmaonator](https://github.com/lmaonator)
@@ -79,15 +89,20 @@
- [marius-luca-87](https://github.com/marius-luca-87)
- [mark-monteiro](https://github.com/mark-monteiro)
- [MarkCiliaVincenti](https://github.com/MarkCiliaVincenti)
- [Martin Reuter](https://github.com/reuterma24)
- [Matt Teahan](https://github.com/matt-teahan)
- [Matt07211](https://github.com/Matt07211)
- [Matthew Jones](https://github.com/matthew-jones-uk)
- [Maxr1998](https://github.com/Maxr1998)
- [mcarlton00](https://github.com/mcarlton00)
- [Michael McElroy](https://github.com/mcmcelro)
- [mitchfizz05](https://github.com/mitchfizz05)
- [mohd-akram](https://github.com/mohd-akram)
- [MrTimscampi](https://github.com/MrTimscampi)
- [n8225](https://github.com/n8225)
- [Nalsai](https://github.com/Nalsai)
- [Narfinger](https://github.com/Narfinger)
- [Nathan McCrina](https://github.com/nfmccrina)
- [NathanPickard](https://github.com/NathanPickard)
- [neilsb](https://github.com/neilsb)
- [nevado](https://github.com/nevado)
@@ -98,21 +113,26 @@
- [OancaAndrei](https://github.com/OancaAndrei)
- [obradovichv](https://github.com/obradovichv)
- [oddstr13](https://github.com/oddstr13)
- [olsh](https://github.com/olsh)
- [orryverducci](https://github.com/orryverducci)
- [PCEWLKR](https://github.com/PCEWLKR)
- [petermcneil](https://github.com/petermcneil)
- [Phlogi](https://github.com/Phlogi)
- [pjeanjean](https://github.com/pjeanjean)
- [ploughpuff](https://github.com/ploughpuff)
- [poytiis](https://github.com/poytiis)
- [pR0Ps](https://github.com/pR0Ps)
- [PrplHaz4](https://github.com/PrplHaz4)
- [RazeLighter777](https://github.com/RazeLighter777)
- [redSpoutnik](https://github.com/redSpoutnik)
- [ringmatter](https://github.com/ringmatter)
- [Robert Lützner](https://github.com/rluetzner)
- [ryan-hartzell](https://github.com/ryan-hartzell)
- [s0urcelab](https://github.com/s0urcelab)
- [sachk](https://github.com/sachk)
- [sammyrc34](https://github.com/sammyrc34)
- [samuel9554](https://github.com/samuel9554)
- [SapientGuardian](https://github.com/SapientGuardian)
- [scheidleon](https://github.com/scheidleon)
- [sebPomme](https://github.com/sebPomme)
- [SegiH](https://github.com/SegiH)
@@ -122,6 +142,8 @@
- [sl1288](https://github.com/sl1288)
- [Smith00101010](https://github.com/Smith00101010)
- [sorinyo2004](https://github.com/sorinyo2004)
- [Soumyadip Auddy](https://github.com/SoumyadipAuddy)
- [st7105](https://github.com/st7105)
- [sparky8251](https://github.com/sparky8251)
- [spookbits](https://github.com/spookbits)
- [ssenart](https://github.com/ssenart)
@@ -137,18 +159,21 @@
- [ThibaultNocchi](https://github.com/ThibaultNocchi)
- [thornbill](https://github.com/thornbill)
- [ThreeFive-O](https://github.com/ThreeFive-O)
- [tjwalkr3](https://github.com/tjwalkr3)
- [TrisMcC](https://github.com/TrisMcC)
- [trumblejoe](https://github.com/trumblejoe)
- [TtheCreator](https://github.com/TtheCreator)
- [twinkybot](https://github.com/twinkybot)
- [Ullmie02](https://github.com/Ullmie02)
- [Unhelpful](https://github.com/Unhelpful)
- [Utku Özdemir](https://github.com/utkuozdemir)
- [viaregio](https://github.com/viaregio)
- [vitorsemeano](https://github.com/vitorsemeano)
- [voodoos](https://github.com/voodoos)
- [whooo](https://github.com/whooo)
- [WiiPlayer2](https://github.com/WiiPlayer2)
- [WillWill56](https://github.com/WillWill56)
- [WizardOfYendor1](https://github.com/WizardOfYendor1)
- [wtayl0r](https://github.com/wtayl0r)
- [Wuerfelbecher](https://github.com/Wuerfelbecher)
- [Wunax](https://github.com/Wunax)
@@ -158,6 +183,7 @@
- [XVicarious](https://github.com/XVicarious)
- [YouKnowBlom](https://github.com/YouKnowBlom)
- [ZachPhelan](https://github.com/ZachPhelan)
- [ZeusCraft10](https://github.com/ZeusCraft10)
- [KristupasSavickas](https://github.com/KristupasSavickas)
- [Pusta](https://github.com/pusta)
- [nielsvanvelzen](https://github.com/nielsvanvelzen)
@@ -183,6 +209,37 @@
- [btopherjohnson](https://github.com/btopherjohnson)
- [GeorgeH005](https://github.com/GeorgeH005)
- [Vedant](https://github.com/viktory36/)
- [NotSaifA](https://github.com/NotSaifA)
- [HonestlyWhoKnows](https://github.com/honestlywhoknows)
- [TheMelmacian](https://github.com/TheMelmacian)
- [ItsAllAboutTheCode](https://github.com/ItsAllAboutTheCode)
- [pret0rian8](https://github.com/pret0rian)
- [jaina heartles](https://github.com/heartles)
- [oxixes](https://github.com/oxixes)
- [elfalem](https://github.com/elfalem)
- [Kenneth Cochran](https://github.com/kennethcochran)
- [benedikt257](https://github.com/benedikt257)
- [revam](https://github.com/revam)
- [allesmi](https://github.com/allesmi)
- [ThunderClapLP](https://github.com/ThunderClapLP)
- [Shoham Peller](https://github.com/spellr)
- [theshoeshiner](https://github.com/theshoeshiner)
- [TokerX](https://github.com/TokerX)
- [GeneMarks](https://github.com/GeneMarks)
- [Kirill Nikiforov](https://github.com/allmazz)
- [bjorntp](https://github.com/bjorntp)
- [martenumberto](https://github.com/martenumberto)
- [ZeusCraft10](https://github.com/ZeusCraft10)
- [MarcoCoreDuo](https://github.com/MarcoCoreDuo)
- [LiHRaM](https://github.com/LiHRaM)
- [MSalman5230](https://github.com/MSalman5230)
- [dwandw](https://github.com/dwandw)
- [Lampan-git](https://github.com/Lampan-git)
- [elio42](https://github.com/elio42)
- [rwebster85](https://github.com/rwebster85)
- [Florin-Popescu](https://github.com/Florin-Popescu)
- [m0g3r](https://github.com/m0g3r)
- [martin-77](https://github.com/martin-77)
# Emby Contributors
@@ -193,7 +250,7 @@
- [Mark2xv](https://github.com/Mark2xv)
- [ScottRapsey](https://github.com/ScottRapsey)
- [skynet600](https://github.com/skynet600)
- [Cheesegeezer](https://githum.com/Cheesegeezer)
- [Cheesegeezer](https://github.com/Cheesegeezer)
- [Radeon](https://github.com/radeonorama)
- [gcw07](https://github.com/gcw07)
- [SivaramAdhiappan](https://github.com/shivaram1190)
@@ -246,12 +303,3 @@
- [tikuf](https://github.com/tikuf/)
- [Tim Hobbs](https://github.com/timhobbs)
- [SvenVandenbrande](https://github.com/SvenVandenbrande)
- [olsh](https://github.com/olsh)
- [lbenini](https://github.com/lbenini)
- [gnuyent](https://github.com/gnuyent)
- [Matthew Jones](https://github.com/matthew-jones-uk)
- [Jakob Kukla](https://github.com/jakobkukla)
- [Utku Özdemir](https://github.com/utkuozdemir)
- [JPUC1143](https://github.com/Jpuc1143/)
- [0x25CBFC4F](https://github.com/0x25CBFC4F)
- [Robert Lützner](https://github.com/rluetzner)
+6 -1
View File
@@ -3,11 +3,11 @@
<PropertyGroup>
<Nullable>enable</Nullable>
<CodeAnalysisRuleSet>$(MSBuildThisFileDirectory)/jellyfin.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<WarningsNotAsErrors>NU1902;NU1903</WarningsNotAsErrors>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
@@ -19,4 +19,9 @@
<AdditionalFiles Include="$(MSBuildThisFileDirectory)/stylecop.json" />
</ItemGroup>
<!-- Custom Analyzers -->
<ItemGroup Condition=" '$(MSBuildProjectName)' != 'Jellyfin.CodeAnalysis' AND '$(Configuration)' == 'Debug' ">
<ProjectReference Include="$(MSBuildThisFileDirectory)src/Jellyfin.CodeAnalysis/Jellyfin.CodeAnalysis.csproj" OutputItemType="Analyzer" />
</ItemGroup>
</Project>
+67 -69
View File
@@ -4,89 +4,87 @@
</PropertyGroup>
<!-- Run "dotnet list package (dash,dash)outdated" to see the latest versions of each package.-->
<ItemGroup Label="Package Dependencies">
<PackageVersion Include="AsyncKeyedLock" Version="6.4.2" />
<PackageVersion Include="AsyncKeyedLock" Version="8.0.2" />
<PackageVersion Include="AutoFixture.AutoMoq" Version="4.18.1" />
<PackageVersion Include="AutoFixture.Xunit2" Version="4.18.1" />
<PackageVersion Include="AutoFixture.Xunit3" Version="4.19.0" />
<PackageVersion Include="AutoFixture" Version="4.18.1" />
<PackageVersion Include="BDInfo" Version="0.8.0" />
<PackageVersion Include="BlurHashSharp.SkiaSharp" Version="1.3.2" />
<PackageVersion Include="BlurHashSharp" Version="1.3.2" />
<PackageVersion Include="BitFaster.Caching" Version="2.6.0" />
<PackageVersion Include="BlurHashSharp.SkiaSharp" Version="1.4.0-pre.1" />
<PackageVersion Include="BlurHashSharp" Version="1.4.0-pre.1" />
<PackageVersion Include="CommandLineParser" Version="2.9.1" />
<PackageVersion Include="coverlet.collector" Version="6.0.2" />
<PackageVersion Include="Diacritics" Version="3.3.29" />
<PackageVersion Include="coverlet.collector" Version="10.0.1" />
<PackageVersion Include="Diacritics" Version="4.1.8" />
<PackageVersion Include="DiscUtils.Udf" Version="0.16.13" />
<PackageVersion Include="DotNet.Glob" Version="3.1.3" />
<PackageVersion Include="EFCoreSecondLevelCacheInterceptor" Version="4.4.3" />
<PackageVersion Include="FsCheck.Xunit" Version="2.16.6" />
<PackageVersion Include="HarfBuzzSharp.NativeAssets.Linux" Version="7.3.0.2" />
<PackageVersion Include="FsCheck.Xunit.v3" Version="3.3.4" />
<PackageVersion Include="HarfBuzzSharp.NativeAssets.Linux" Version="8.3.1.5" />
<PackageVersion Include="ICU4N.Transliterator" Version="60.1.0-alpha.356" />
<PackageVersion Include="IDisposableAnalyzers" Version="4.0.7" />
<PackageVersion Include="Jellyfin.XmlTv" Version="10.8.0" />
<PackageVersion Include="libse" Version="4.0.5" />
<PackageVersion Include="LrcParser" Version="2023.524.0" />
<PackageVersion Include="MetaBrainz.MusicBrainz" Version="6.1.0" />
<PackageVersion Include="Microsoft.AspNetCore.Authorization" Version="8.0.4" />
<PackageVersion Include="Microsoft.AspNetCore.HttpOverrides" Version="2.2.0" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="8.0.4" />
<PackageVersion Include="Microsoft.CodeAnalysis.BannedApiAnalyzers" Version="3.3.4" />
<PackageVersion Include="Microsoft.Data.Sqlite" Version="8.0.4" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.4" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="8.0.4" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.4" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.4" />
<PackageVersion Include="Microsoft.Extensions.Caching.Abstractions" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Binder" Version="8.0.1" />
<PackageVersion Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.1" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore" Version="8.0.4" />
<PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks" Version="8.0.4" />
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Http" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.1" />
<PackageVersion Include="Microsoft.Extensions.Logging" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Options" Version="8.0.2" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
<PackageVersion Include="MimeTypes" Version="2.4.0" />
<PackageVersion Include="Mono.Nat" Version="3.0.4" />
<PackageVersion Include="IDisposableAnalyzers" Version="4.0.8" />
<PackageVersion Include="Ignore" Version="0.2.1" />
<PackageVersion Include="Jellyfin.XmlTv" Version="10.12.0-pre1" />
<PackageVersion Include="libse" Version="4.0.12" />
<PackageVersion Include="LrcParser" Version="2025.623.0" />
<PackageVersion Include="MetaBrainz.MusicBrainz" Version="8.0.1" />
<PackageVersion Include="Microsoft.AspNetCore.Authorization" Version="10.0.11" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="10.0.11" />
<PackageVersion Include="Microsoft.CodeAnalysis.BannedApiAnalyzers" Version="5.6.0" />
<PackageVersion Include="Microsoft.CodeAnalysis.Common" Version="5.9.0" />
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="5.9.0" />
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="5.9.0" />
<PackageVersion Include="Microsoft.Data.Sqlite" Version="10.0.11" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="10.0.11" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="10.0.11" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="10.0.11" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="10.0.11" />
<PackageVersion Include="Microsoft.Extensions.Caching.Abstractions" Version="10.0.11" />
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="10.0.11" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="10.0.11" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Binder" Version="10.0.11" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="10.0.11" />
<PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore" Version="10.0.11" />
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.11" />
<PackageVersion Include="Microsoft.Extensions.Http" Version="10.0.11" />
<PackageVersion Include="Microsoft.Extensions.Logging" Version="10.0.11" />
<PackageVersion Include="Microsoft.Extensions.Options" Version="10.0.11" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.9.0" />
<PackageVersion Include="MimeTypes" Version="2.5.2" />
<PackageVersion Include="Morestachio" Version="5.0.1.670" />
<PackageVersion Include="Moq" Version="4.18.4" />
<PackageVersion Include="NEbml" Version="0.11.0" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
<PackageVersion Include="NEbml" Version="1.1.0.5" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.4" />
<PackageVersion Include="PDFtoImage" Version="5.2.1" />
<PackageVersion Include="PlaylistsNET" Version="1.4.1" />
<PackageVersion Include="prometheus-net.AspNetCore" Version="8.2.1" />
<PackageVersion Include="prometheus-net.DotNetRuntime" Version="4.4.0" />
<PackageVersion Include="prometheus-net.DotNetRuntime" Version="4.4.1" />
<PackageVersion Include="prometheus-net" Version="8.2.1" />
<PackageVersion Include="Serilog.AspNetCore" Version="8.0.1" />
<PackageVersion Include="Serilog.Enrichers.Thread" Version="3.1.0" />
<PackageVersion Include="Serilog.Settings.Configuration" Version="8.0.0" />
<PackageVersion Include="Serilog.Sinks.Async" Version="1.5.0" />
<PackageVersion Include="Serilog.Sinks.Console" Version="5.0.1" />
<PackageVersion Include="Serilog.Sinks.File" Version="5.0.0" />
<PackageVersion Include="Polly" Version="8.7.0" />
<PackageVersion Include="Serilog.AspNetCore" Version="10.0.0" />
<PackageVersion Include="Serilog.Enrichers.Thread" Version="4.0.0" />
<PackageVersion Include="Serilog.Expressions" Version="5.0.0" />
<PackageVersion Include="Serilog.Settings.Configuration" Version="10.0.1" />
<PackageVersion Include="Serilog.Sinks.Async" Version="2.1.0" />
<PackageVersion Include="Serilog.Sinks.Console" Version="6.1.1" />
<PackageVersion Include="Serilog.Sinks.File" Version="7.0.0" />
<PackageVersion Include="Serilog.Sinks.Graylog" Version="3.1.1" />
<PackageVersion Include="SerilogAnalyzer" Version="0.15.0" />
<PackageVersion Include="SharpFuzz" Version="2.1.1" />
<PackageVersion Include="SkiaSharp" Version="2.88.8" />
<PackageVersion Include="SkiaSharp.HarfBuzz" Version="2.88.8" />
<PackageVersion Include="SkiaSharp.NativeAssets.Linux" Version="2.88.8" />
<PackageVersion Include="SharpCompress" Version="0.50.4" />
<PackageVersion Include="SharpFuzz" Version="2.3.0" />
<PackageVersion Include="SkiaSharp" Version="3.119.4" />
<PackageVersion Include="SkiaSharp.HarfBuzz" Version="3.119.4" />
<PackageVersion Include="SkiaSharp.NativeAssets.Linux" Version="3.119.4" />
<PackageVersion Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" />
<PackageVersion Include="StyleCop.Analyzers" Version="1.2.0-beta.556" />
<PackageVersion Include="Svg.Skia" Version="1.0.0.18" />
<PackageVersion Include="Swashbuckle.AspNetCore.ReDoc" Version="6.5.0" />
<PackageVersion Include="Swashbuckle.AspNetCore" Version="6.2.3" />
<PackageVersion Include="System.Globalization" Version="4.3.0" />
<PackageVersion Include="System.Linq.Async" Version="6.0.1" />
<PackageVersion Include="System.Text.Encoding.CodePages" Version="8.0.0" />
<PackageVersion Include="System.Text.Json" Version="8.0.3" />
<PackageVersion Include="System.Threading.Tasks.Dataflow" Version="8.0.0" />
<PackageVersion Include="Svg.Skia" Version="3.7.0" />
<PackageVersion Include="Swashbuckle.AspNetCore.ReDoc" Version="10.2.3" />
<PackageVersion Include="Swashbuckle.AspNetCore" Version="10.2.3" />
<PackageVersion Include="System.Text.Json" Version="10.0.11" />
<PackageVersion Include="TagLibSharp" Version="2.3.0" />
<PackageVersion Include="TMDbLib" Version="2.2.0" />
<PackageVersion Include="UTF.Unknown" Version="2.5.1" />
<PackageVersion Include="Xunit.Priority" Version="1.1.6" />
<PackageVersion Include="xunit.runner.visualstudio" Version="2.5.8" />
<PackageVersion Include="Xunit.SkippableFact" Version="1.4.13" />
<PackageVersion Include="xunit" Version="2.7.1" />
<PackageVersion Include="z440.atl.core" Version="7.16.0" />
<PackageVersion Include="TMDbLib" Version="3.0.0" />
<PackageVersion Include="UTF.Unknown" Version="2.7.0" />
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.5" />
<PackageVersion Include="xunit.v3" Version="3.2.2" />
<PackageVersion Include="Xunit.v3.Priority" Version="1.1.18" />
</ItemGroup>
</Project>
</Project>
@@ -1,3 +1,5 @@
#pragma warning disable CA1815
namespace Emby.Naming.AudioBook
{
/// <summary>
+94
View File
@@ -0,0 +1,94 @@
using System;
using System.Text.RegularExpressions;
namespace Emby.Naming.Book
{
/// <summary>
/// Helper class to retrieve basic metadata from a book filename.
/// </summary>
public static partial class BookFileNameParser
{
private const string NameMatchGroup = "name";
private const string IndexMatchGroup = "index";
private const string YearMatchGroup = "year";
private const string SeriesNameMatchGroup = "seriesName";
private static readonly Regex[] _nameMatches =
[
// seriesName (seriesYear) #index (of count) (year) where only seriesName and index are required
new Regex(@"^(?<seriesName>.+?)((\s\((?<seriesYear>[0-9]{4})\))?)\s#(?<index>[0-9]+)(?:\.0)?((\s\(of\s(?<count>[0-9]+)\))?)((\s\((?<year>[0-9]{4})\))?)$"),
new Regex(@"^(?<name>.+?)\s\((?<seriesName>.+?),\s#(?<index>[0-9]+)\)(?:\.0)?((\s\((?<year>[0-9]{4})\))?)$"),
new Regex(@"^(?<index>[0-9]+)(?:\.0)?\s\-\s(?<name>.+?)((\s\((?<year>[0-9]{4})\))?)$"),
new Regex(@"(?<name>.*)\((?<year>[0-9]{4})\)"),
// last resort matches the whole string as the name
new Regex(@"(?<name>.*)")
];
[GeneratedRegex(@"^(?<name>.+?)(\sv(?<volume>[0-9]+))?(\sc(?<chapter>[0-9]+))?$")]
private static partial Regex ComicRegex();
/// <summary>
/// Parse a filename name to retrieve the book name, series name, index, and year.
/// </summary>
/// <param name="name">Book filename to parse for information.</param>
/// <returns>Returns <see cref="BookFileNameParserResult"/> object.</returns>
public static BookFileNameParserResult Parse(string? name)
{
var result = new BookFileNameParserResult();
if (name == null)
{
return result;
}
foreach (var regex in _nameMatches)
{
var match = regex.Match(name);
if (!match.Success)
{
continue;
}
if (match.Groups.TryGetValue(NameMatchGroup, out Group? nameGroup) && nameGroup.Success)
{
var comicMatch = ComicRegex().Match(nameGroup.Value.Trim());
if (comicMatch.Success)
{
if (comicMatch.Groups.TryGetValue("volume", out Group? volumeGroup) && volumeGroup.Success && int.TryParse(volumeGroup.ValueSpan, out var volume))
{
result.ParentIndex = volume;
}
if (comicMatch.Groups.TryGetValue("chapter", out Group? chapterGroup) && chapterGroup.Success && int.TryParse(chapterGroup.ValueSpan, out var chapter))
{
result.Index = chapter;
}
}
result.Name = nameGroup.ValueSpan.Trim().ToString();
}
if (match.Groups.TryGetValue(IndexMatchGroup, out Group? indexGroup) && indexGroup.Success && int.TryParse(indexGroup.Value, out var index))
{
result.Index = index;
}
if (match.Groups.TryGetValue(YearMatchGroup, out Group? yearGroup) && yearGroup.Success && int.TryParse(yearGroup.Value, out var year))
{
result.Year = year;
}
if (match.Groups.TryGetValue(SeriesNameMatchGroup, out Group? seriesGroup) && seriesGroup.Success)
{
result.SeriesName = seriesGroup.Value.Trim();
}
break;
}
return result;
}
}
}
@@ -0,0 +1,45 @@
namespace Emby.Naming.Book
{
/// <summary>
/// Data object used to pass metadata parsed from a book filename.
/// </summary>
public class BookFileNameParserResult
{
/// <summary>
/// Initializes a new instance of the <see cref="BookFileNameParserResult"/> class.
/// </summary>
public BookFileNameParserResult()
{
Name = null;
Index = null;
ParentIndex = null;
Year = null;
SeriesName = null;
}
/// <summary>
/// Gets or sets the name of the book.
/// </summary>
public string? Name { get; set; }
/// <summary>
/// Gets or sets the book index.
/// </summary>
public int? Index { get; set; }
/// <summary>
/// Gets or sets the parent index number.
/// </summary>
public int? ParentIndex { get; set; }
/// <summary>
/// Gets or sets the publication year.
/// </summary>
public int? Year { get; set; }
/// <summary>
/// Gets or sets the series name.
/// </summary>
public string? SeriesName { get; set; }
}
}
+113 -90
View File
@@ -21,8 +21,8 @@ namespace Emby.Naming.Common
/// </summary>
public NamingOptions()
{
VideoFileExtensions = new[]
{
VideoFileExtensions =
[
".001",
".3g2",
".3gp",
@@ -57,7 +57,6 @@ namespace Emby.Naming.Common
".nrg",
".nsv",
".nuv",
".ogg",
".ogm",
".ogv",
".pva",
@@ -77,10 +76,10 @@ namespace Emby.Naming.Common
".wmv",
".wtv",
".xvid"
};
];
VideoFlagDelimiters = new[]
{
VideoFlagDelimiters =
[
'(',
')',
'-',
@@ -88,15 +87,15 @@ namespace Emby.Naming.Common
'_',
'[',
']'
};
];
StubFileExtensions = new[]
{
StubFileExtensions =
[
".disc"
};
];
StubTypes = new[]
{
StubTypes =
[
new StubTypeRule(
stubType: "dvd",
token: "dvd"),
@@ -136,32 +135,32 @@ namespace Emby.Naming.Common
new StubTypeRule(
stubType: "tv",
token: "DSR")
};
];
VideoFileStackingRules = new[]
{
VideoFileStackingRules =
[
new FileStackRule(@"^(?<filename>.*?)(?:(?<=[\]\)\}])|[ _.-]+)[\(\[]?(?<parttype>cd|dvd|part|pt|dis[ck])[ _.-]*(?<number>[0-9]+)[\)\]]?(?:\.[^.]+)?$", true),
new FileStackRule(@"^(?<filename>.*?)(?:(?<=[\]\)\}])|[ _.-]+)[\(\[]?(?<parttype>cd|dvd|part|pt|dis[ck])[ _.-]*(?<number>[a-d])[\)\]]?(?:\.[^.]+)?$", false)
};
];
CleanDateTimes = new[]
{
CleanDateTimes =
[
@"(.+[^_\,\.\(\)\[\]\-])[_\.\(\)\[\]\-](19[0-9]{2}|20[0-9]{2})(?![0-9]+|\W[0-9]{2}\W[0-9]{2})([ _\,\.\(\)\[\]\-][^0-9]|).*(19[0-9]{2}|20[0-9]{2})*",
@"(.+[^_\,\.\(\)\[\]\-])[ _\.\(\)\[\]\-]+(19[0-9]{2}|20[0-9]{2})(?![0-9]+|\W[0-9]{2}\W[0-9]{2})([ _\,\.\(\)\[\]\-][^0-9]|).*(19[0-9]{2}|20[0-9]{2})*"
};
];
CleanStrings = new[]
{
@"^\s*(?<cleaned>.+?)[ _\,\.\(\)\[\]\-](3d|sbs|tab|hsbs|htab|mvc|HDR|HDC|UHD|UltraHD|4k|ac3|dts|custom|dc|divx|divx5|dsr|dsrip|dutch|dvd|dvdrip|dvdscr|dvdscreener|screener|dvdivx|cam|fragment|fs|hdtv|hdrip|hdtvrip|internal|limited|multi|subs|ntsc|ogg|ogm|pal|pdtv|proper|repack|rerip|retail|cd[1-9]|r5|bd5|bd|se|svcd|swedish|german|read.nfo|nfofix|unrated|ws|telesync|ts|telecine|tc|brrip|bdrip|480p|480i|576p|576i|720p|720i|1080p|1080i|2160p|hrhd|hrhdtv|hddvd|bluray|blu-ray|x264|x265|h264|h265|xvid|xvidvd|xxx|www.www|AAC|DTS|\[.*\])([ _\,\.\(\)\[\]\-]|$)",
@"^(?<cleaned>.+?)(\[.*\])",
CleanStrings =
[
@"^\s*(?<cleaned>.+?)[ _\,\.\(\)\[\]\-](3d|sbs|tab|hsbs|htab|mvc|HDR|HDC|UHD|UltraHD|4k|ac3|dts|custom|dc|divx|divx5|dsr|dsrip|dutch|dvd|dvdrip|dvdscr|dvdscreener|screener|dvdivx|cam|fragment|fs|hdtv|hdrip|hdtvrip|internal|limited|multi|subs|ntsc|ogg|ogm|pal|pdtv|proper|repack|rerip|retail|cd[1-9]|r5|bd5|bd|se|svcd|swedish|german|read.nfo|nfofix|unrated|ws|web-dl|telesync|ts|telecine|tc|brrip|bdrip|480p|480i|576p|576i|720p|720i|1080p|1080i|2160p|hrhd|hrhdtv|hddvd|bluray|blu-ray|x264|x265|h264|h265|xvid|xvidvd|xxx|www.www|AAC|DTS)(?=[ _\,\.\(\)\[\]\-]|$)",
@"^\s*(?<cleaned>.+?)((\s*\[[^\]]+\]\s*)+)(\.[^\s]+)?$",
@"^\s*(?<cleaned>.+?)\WE[0-9]+(-|~)E?[0-9]+(\W|$)",
@"^\s*\[[^\]]+\](?!\.\w+$)\s*(?<cleaned>.+)",
@"^\s*(?<cleaned>.+?)\s+-\s+[0-9]+\s*$",
@"^\s*(?<cleaned>.+?)(([-._ ](trailer|sample))|-(scene|clip|behindthescenes|deleted|deletedscene|featurette|short|interview|other|extra))$"
};
];
SubtitleFileExtensions = new[]
{
SubtitleFileExtensions =
[
".ass",
".mks",
".sami",
@@ -171,27 +170,29 @@ namespace Emby.Naming.Common
".sub",
".sup",
".vtt",
};
];
LyricFileExtensions = new[]
{
LyricFileExtensions =
[
".lrc",
".elrc",
".txt"
};
];
AlbumStackingPrefixes = new[]
{
AlbumStackingPrefixes =
[
"cd",
"digital media",
"disc",
"disk",
"vol",
"volume"
};
"volume",
"part",
"act"
];
ArtistSubfolders = new[]
{
ArtistSubfolders =
[
"albums",
"broadcasts",
"bootlegs",
@@ -206,10 +207,10 @@ namespace Emby.Naming.Common
"soundtracks",
"spokenwords",
"streets"
};
];
AudioFileExtensions = new[]
{
AudioFileExtensions =
[
".669",
".3gp",
".aa",
@@ -223,6 +224,7 @@ namespace Emby.Naming.Common
".afc",
".amf",
".aif",
".aifc",
".aiff",
".alac",
".amr",
@@ -238,6 +240,8 @@ namespace Emby.Naming.Common
".dsp",
".dts",
".dvf",
".eac3",
".ec3",
".far",
".flac",
".gdm",
@@ -288,33 +292,33 @@ namespace Emby.Naming.Common
".xm",
".xsp",
".ymf"
};
];
MediaFlagDelimiters = new[]
{
MediaFlagDelimiters =
[
'.'
};
];
MediaForcedFlags = new[]
{
MediaForcedFlags =
[
"foreign",
"forced"
};
];
MediaDefaultFlags = new[]
{
MediaDefaultFlags =
[
"default"
};
];
MediaHearingImpairedFlags = new[]
{
MediaHearingImpairedFlags =
[
"cc",
"hi",
"sdh"
};
];
EpisodeExpressions = new[]
{
EpisodeExpressions =
[
// *** Begin Kodi Standard Naming
// <!-- foo.s01.e01, foo.s01_e01, S01E02 foo, S01 - E02 -->
new EpisodeExpression(@".*(\\|\/)(?<seriesname>((?![Ss]([0-9]+)[][ ._-]*[Ee]([0-9]+))[^\\\/])*)?[Ss](?<seasonnumber>[0-9]+)[][ ._-]*[Ee](?<epnumber>[0-9]+)([^\\/]*)$")
@@ -327,23 +331,23 @@ namespace Emby.Naming.Common
new EpisodeExpression(@"[^\\/]*?()\.?[Ee]([0-9]+)\.([^\\/]*)$"),
new EpisodeExpression("(?<year>[0-9]{4})[._ -](?<month>[0-9]{2})[._ -](?<day>[0-9]{2})", true)
{
DateTimeFormats = new[]
{
DateTimeFormats =
[
"yyyy.MM.dd",
"yyyy-MM-dd",
"yyyy_MM_dd",
"yyyy MM dd"
}
]
},
new EpisodeExpression("(?<day>[0-9]{2})[._ -](?<month>[0-9]{2})[._ -](?<year>[0-9]{4})", true)
{
DateTimeFormats = new[]
{
DateTimeFormats =
[
"dd.MM.yyyy",
"dd-MM-yyyy",
"dd_MM_yyyy",
"dd MM yyyy"
}
]
},
// This isn't a Kodi naming rule, but the expression below causes false episode numbers for
@@ -357,7 +361,10 @@ namespace Emby.Naming.Common
// Not a Kodi rule as well, but the expression below also causes false positives,
// so we make sure this one gets tested first.
// "Foo Bar 889"
new EpisodeExpression(@".*[\\\/](?![Ee]pisode)(?<seriesname>[\w\s]+?)\s(?<epnumber>[0-9]{1,4})(-(?<endingepnumber>[0-9]{2,4}))*[^\\\/x]*$")
// Names carrying an SxxEyy marker are excluded because the Kodi expression above already covers them.
// Without that guard this expression reads digits out of the title instead, turning
// "S01E01 1-23-45 [Bluray-1080p]" into episodes 1 through 45.
new EpisodeExpression(@".*[\\\/](?![Ee]pisode)(?![^\\\/]*[Ss][0-9]+[][ ._-]*[Ee][0-9]+)(?<seriesname>[\w\s]+?)\s(?<epnumber>[0-9]{1,4})(-(?<endingepnumber>[0-9]{2,4}))*[^\\\/x]*$")
{
IsNamed = true
},
@@ -374,6 +381,14 @@ namespace Emby.Naming.Common
IsNamed = true
},
// "Name - 101.mkv", "Name - 101 [720p].mkv", "Name - 101 (2020).mkv"
// Handles absolute episode numbers with hyphen delimiter (common in anime)
// Without brackets (bracketed version handled above)
new EpisodeExpression(@".*[\\\/](?<seriesname>[^\\\/]+?)[\s_]+-[\s_]+(?<epnumber>[0-9]+)[\s_]*(?:\[.*?\]|\(.*?\))*[\s_]*(?:\.\w+)?$")
{
IsNamed = true
},
// /server/anything_102.mp4
// /server/james.corden.2017.04.20.anne.hathaway.720p.hdtv.x264-crooks.mkv
// /server/anything_1996.11.14.mp4
@@ -467,10 +482,18 @@ namespace Emby.Naming.Common
{
IsNamed = true
},
};
VideoExtraRules = new[]
{
// Anime style expression
// "[Group][Series Name][21][1080p][FLAC][HASH]"
// "[Group] Series Name [04][BDRIP]"
new EpisodeExpression(@"(?:\[(?:[^\]]+)\]\s*)?(?<seriesname>\[[^\]]+\]|[^[\]]+)\s*\[(?<epnumber>[0-9]+)\]")
{
IsNamed = true
},
];
VideoExtraRules =
[
new ExtraRule(
ExtraType.Trailer,
ExtraRuleType.DirectoryName,
@@ -561,6 +584,18 @@ namespace Emby.Naming.Common
"trailer",
MediaType.Video),
new ExtraRule(
ExtraType.Sample,
ExtraRuleType.Filename,
"sample",
MediaType.Video),
new ExtraRule(
ExtraType.ThemeSong,
ExtraRuleType.Filename,
"theme",
MediaType.Audio),
new ExtraRule(
ExtraType.Trailer,
ExtraRuleType.Suffix,
@@ -582,13 +617,7 @@ namespace Emby.Naming.Common
new ExtraRule(
ExtraType.Trailer,
ExtraRuleType.Suffix,
" trailer",
MediaType.Video),
new ExtraRule(
ExtraType.Sample,
ExtraRuleType.Filename,
"sample",
"- trailer",
MediaType.Video),
new ExtraRule(
@@ -612,15 +641,9 @@ namespace Emby.Naming.Common
new ExtraRule(
ExtraType.Sample,
ExtraRuleType.Suffix,
" sample",
"- sample",
MediaType.Video),
new ExtraRule(
ExtraType.ThemeSong,
ExtraRuleType.Filename,
"theme",
MediaType.Audio),
new ExtraRule(
ExtraType.Scene,
ExtraRuleType.Suffix,
@@ -680,14 +703,14 @@ namespace Emby.Naming.Common
ExtraRuleType.Suffix,
"-other",
MediaType.Video)
};
];
AllExtrasTypesFolderNames = VideoExtraRules
.Where(i => i.RuleType == ExtraRuleType.DirectoryName)
.ToDictionary(i => i.Token, i => i.ExtraType, StringComparer.OrdinalIgnoreCase);
Format3DRules = new[]
{
Format3DRules =
[
// Kodi rules:
new Format3DRule(
precedingToken: "3d",
@@ -714,10 +737,10 @@ namespace Emby.Naming.Common
new Format3DRule("tab"),
new Format3DRule("sbs3d"),
new Format3DRule("mvc")
};
];
AudioBookPartsExpressions = new[]
{
AudioBookPartsExpressions =
[
// Detect specified chapters, like CH 01
@"ch(?:apter)?[\s_-]?(?<chapter>[0-9]+)",
// Detect specified parts, like Part 02
@@ -730,14 +753,14 @@ namespace Emby.Naming.Common
"(?<chapter>[0-9]+)_(?<part>[0-9]+)",
// Some audiobooks are ripped from cd's, and will be named by disk number.
@"dis(?:c|k)[\s_-]?(?<chapter>[0-9]+)"
};
];
AudioBookNamesExpressions = new[]
{
AudioBookNamesExpressions =
[
// Detect year usually in brackets after name Batman (2020)
@"^(?<name>.+?)\s*\(\s*(?<year>[0-9]{4})\s*\)\s*$",
@"^\s*(?<name>[^ ].*?)\s*$"
};
];
MultipleEpisodeExpressions = new[]
{
@@ -877,12 +900,12 @@ namespace Emby.Naming.Common
/// <summary>
/// Gets list of clean datetime regular expressions.
/// </summary>
public Regex[] CleanDateTimeRegexes { get; private set; } = Array.Empty<Regex>();
public Regex[] CleanDateTimeRegexes { get; private set; } = [];
/// <summary>
/// Gets list of clean string regular expressions.
/// </summary>
public Regex[] CleanStringRegexes { get; private set; } = Array.Empty<Regex>();
public Regex[] CleanStringRegexes { get; private set; } = [];
/// <summary>
/// Compiles raw regex strings into regexes.
+2 -2
View File
@@ -6,7 +6,7 @@
</PropertyGroup>
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PublishRepositoryUrl>true</PublishRepositoryUrl>
@@ -36,7 +36,7 @@
<PropertyGroup>
<Authors>Jellyfin Contributors</Authors>
<PackageId>Jellyfin.Naming</PackageId>
<VersionPrefix>10.9.0</VersionPrefix>
<VersionPrefix>12.0.0</VersionPrefix>
<RepositoryUrl>https://github.com/jellyfin/jellyfin</RepositoryUrl>
<PackageLicenseExpression>GPL-3.0-only</PackageLicenseExpression>
</PropertyGroup>
@@ -70,7 +70,7 @@ namespace Emby.Naming.ExternalFiles
if (lastSeparator == -1)
{
break;
break;
}
string currentSlice = languageString[lastSeparator..];
@@ -97,17 +97,21 @@ namespace Emby.Naming.ExternalFiles
if (culture is not null && pathInfo.Language is null)
{
pathInfo.Language = culture.ThreeLetterISOLanguageName;
pathInfo.Language = culture.Name.Contains('-', StringComparison.OrdinalIgnoreCase)
? culture.Name
: culture.ThreeLetterISOLanguageName;
extraString = extraString.Replace(currentSlice, string.Empty, StringComparison.OrdinalIgnoreCase);
}
else if (culture is not null && pathInfo.Language == "hin")
{
// Hindi language code "hi" collides with a hearing impaired flag - use as Hindi only if no other language is set
pathInfo.IsHearingImpaired = true;
pathInfo.Language = culture.ThreeLetterISOLanguageName;
pathInfo.Language = culture.Name.Contains('-', StringComparison.OrdinalIgnoreCase)
? culture.Name
: culture.ThreeLetterISOLanguageName;
extraString = extraString.Replace(currentSlice, string.Empty, StringComparison.OrdinalIgnoreCase);
}
else if (_namingOptions.MediaHearingImpairedFlags.Any(s => currentSliceWithoutSeparator.Contains(s, StringComparison.OrdinalIgnoreCase)))
else if (_namingOptions.MediaHearingImpairedFlags.Any(s => currentSliceWithoutSeparator.Equals(s, StringComparison.OrdinalIgnoreCase)))
{
pathInfo.IsHearingImpaired = true;
extraString = extraString.Replace(currentSlice, string.Empty, StringComparison.OrdinalIgnoreCase);
+1 -1
View File
@@ -125,7 +125,7 @@ namespace Emby.Naming.TV
result.Success = true;
}
}
else if (DateTime.TryParse(match.Groups[0].ValueSpan, out date))
else if (DateTime.TryParse(match.Groups[0].ValueSpan, CultureInfo.InvariantCulture, out date))
{
result.Year = date.Year;
result.Month = date.Month;
+72 -73
View File
@@ -1,41 +1,48 @@
using System;
using System.Globalization;
using System.IO;
using System.Text.RegularExpressions;
namespace Emby.Naming.TV
{
/// <summary>
/// Class to parse season paths.
/// </summary>
public static class SeasonPathParser
public static partial class SeasonPathParser
{
/// <summary>
/// A season folder must contain one of these somewhere in the name.
/// </summary>
private static readonly string[] _seasonFolderNames =
{
"season",
"sæson",
"temporada",
"saison",
"staffel",
"series",
"сезон",
"stagione"
};
private const string SeasonKeywordPattern =
@"시즌|シーズン|сезон" +
@"|season|sæson|saison|staffel|series|stagione|säsong|seizoen|seasong" +
@"|sezon|sezona|sezóna|sezonul|série|séria|serie|seria|temporada|kausi";
private static readonly Regex CleanNameRegex = new(@"[ ._\-\[\]]", RegexOptions.Compiled);
[GeneratedRegex(@"^\s*((?<seasonnumber>(?>\d+))(?:st|nd|rd|th|\.)*(?!\s*[Ee]\d+))\s*(?:" + SeasonKeywordPattern + @")\s*(?<rightpart>.*)$", RegexOptions.IgnoreCase)]
private static partial Regex ProcessPre();
[GeneratedRegex(@"^\s*(?:" + SeasonKeywordPattern + @")\s*(?<seasonnumber>\d+?)(?=\d{3,4}p|[^\d]|$)(?!\s*[Ee]\d)(?<rightpart>.*)$", RegexOptions.IgnoreCase)]
private static partial Regex ProcessPost();
[GeneratedRegex(@"[sS](\d{1,4})(?!\d|[eE]\d)(?=\.|_|-|\[|\]|\s|$)", RegexOptions.None)]
private static partial Regex SeasonPrefix();
[GeneratedRegex(SeasonKeywordPattern, RegexOptions.IgnoreCase)]
private static partial Regex SeasonKeyword();
/// <summary>
/// Attempts to parse season number from path.
/// </summary>
/// <param name="path">Path to season.</param>
/// <param name="parentPath">Folder name of the parent.</param>
/// <param name="supportSpecialAliases">Support special aliases when parsing.</param>
/// <param name="supportNumericSeasonFolders">Support numeric season folders when parsing.</param>
/// <returns>Returns <see cref="SeasonPathParserResult"/> object.</returns>
public static SeasonPathParserResult Parse(string path, bool supportSpecialAliases, bool supportNumericSeasonFolders)
public static SeasonPathParserResult Parse(string path, string? parentPath, bool supportSpecialAliases, bool supportNumericSeasonFolders)
{
var result = new SeasonPathParserResult();
var parentFolderName = parentPath is null ? null : new DirectoryInfo(parentPath).Name;
var (seasonNumber, isSeasonFolder) = GetSeasonNumberFromPath(path, supportSpecialAliases, supportNumericSeasonFolders);
var (seasonNumber, isSeasonFolder) = GetSeasonNumberFromPath(path, parentFolderName, supportSpecialAliases, supportNumericSeasonFolders);
result.SeasonNumber = seasonNumber;
@@ -52,89 +59,81 @@ namespace Emby.Naming.TV
/// Gets the season number from path.
/// </summary>
/// <param name="path">The path.</param>
/// <param name="parentFolderName">The parent folder name.</param>
/// <param name="supportSpecialAliases">if set to <c>true</c> [support special aliases].</param>
/// <param name="supportNumericSeasonFolders">if set to <c>true</c> [support numeric season folders].</param>
/// <returns>System.Nullable{System.Int32}.</returns>
private static (int? SeasonNumber, bool IsSeasonFolder) GetSeasonNumberFromPath(
string path,
string? parentFolderName,
bool supportSpecialAliases,
bool supportNumericSeasonFolders)
{
string filename = Path.GetFileName(path);
var fileName = Path.GetFileName(path);
if (supportSpecialAliases)
var seasonPrefixMatch = SeasonPrefix().Match(fileName);
if (seasonPrefixMatch.Success &&
int.TryParse(seasonPrefixMatch.Groups[1].Value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var val))
{
if (string.Equals(filename, "specials", StringComparison.OrdinalIgnoreCase))
{
return (0, true);
}
if (string.Equals(filename, "extras", StringComparison.OrdinalIgnoreCase))
{
return (0, true);
}
return (val, true);
}
if (supportNumericSeasonFolders)
string filename = CleanNameRegex.Replace(fileName, string.Empty);
if (parentFolderName is not null)
{
if (int.TryParse(filename, NumberStyles.Integer, CultureInfo.InvariantCulture, out var val))
{
return (val, true);
}
var cleanParent = CleanNameRegex.Replace(parentFolderName, string.Empty);
filename = filename.Replace(cleanParent, string.Empty, StringComparison.OrdinalIgnoreCase);
}
if (filename.StartsWith("s", StringComparison.OrdinalIgnoreCase))
if (supportSpecialAliases &&
(filename.Equals("specials", StringComparison.OrdinalIgnoreCase) ||
filename.Equals("extras", StringComparison.OrdinalIgnoreCase)))
{
var testFilename = filename.AsSpan().Slice(1);
if (int.TryParse(testFilename, NumberStyles.Integer, CultureInfo.InvariantCulture, out var val))
{
return (val, true);
}
return (0, true);
}
// Look for one of the season folder names
foreach (var name in _seasonFolderNames)
if (supportNumericSeasonFolders &&
int.TryParse(filename, NumberStyles.Integer, CultureInfo.InvariantCulture, out val))
{
if (filename.Contains(name, StringComparison.OrdinalIgnoreCase))
{
var result = GetSeasonNumberFromPathSubstring(filename.Replace(name, " ", StringComparison.OrdinalIgnoreCase));
if (result.SeasonNumber.HasValue)
{
return result;
}
break;
}
return (val, true);
}
var parts = filename.Split(new[] { '.', '_', ' ', '-' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var part in parts)
bool isMixedLibrary = !supportNumericSeasonFolders && !supportSpecialAliases;
var preMatch = ProcessPre().Match(filename);
if (preMatch.Success)
{
if (TryGetSeasonNumberFromPart(part, out int seasonNumber))
if (isMixedLibrary && !SeasonKeyword().IsMatch(fileName))
{
return (null, false);
}
return CheckMatch(preMatch);
}
else
{
var postMatch = ProcessPost().Match(filename);
if (postMatch.Success && isMixedLibrary && !SeasonKeyword().IsMatch(fileName))
{
return (null, false);
}
return CheckMatch(postMatch);
}
}
private static (int? SeasonNumber, bool IsSeasonFolder) CheckMatch(Match match)
{
var numberString = match.Groups["seasonnumber"];
if (numberString.Success)
{
if (int.TryParse(numberString.Value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var seasonNumber))
{
return (seasonNumber, true);
}
}
return (null, true);
}
private static bool TryGetSeasonNumberFromPart(ReadOnlySpan<char> part, out int seasonNumber)
{
seasonNumber = 0;
if (part.Length < 2 || !part.StartsWith("s", StringComparison.OrdinalIgnoreCase))
{
return false;
}
if (int.TryParse(part.Slice(1), NumberStyles.Integer, CultureInfo.InvariantCulture, out var value))
{
seasonNumber = value;
return true;
}
return false;
return (null, false);
}
/// <summary>
+6
View File
@@ -25,5 +25,11 @@ namespace Emby.Naming.TV
/// </summary>
/// <value>The name of the series.</value>
public string? Name { get; set; }
/// <summary>
/// Gets or sets the year of the series.
/// </summary>
/// <value>The year of the series.</value>
public int? Year { get; set; }
}
}
+23 -1
View File
@@ -12,11 +12,18 @@ namespace Emby.Naming.TV
/// <summary>
/// Regex that matches strings of at least 2 characters separated by a dot or underscore.
/// Used for removing separators between words, i.e turns "The_show" into "The show" while
/// preserving namings like "S.H.O.W".
/// preserving names like "S.H.O.W".
/// </summary>
[GeneratedRegex(@"((?<a>[^\._]{2,})[\._]*)|([\._](?<b>[^\._]{2,}))")]
private static partial Regex SeriesNameRegex();
/// <summary>
/// Regex that matches titles with year in parentheses. Captures the title (which may be
/// numeric) before the year, i.e. turns "1923 (2022)" into "1923".
/// </summary>
[GeneratedRegex(@"(?<title>.+?)\s*\((?<year>[0-9]{4})\)")]
private static partial Regex TitleWithYearRegex();
/// <summary>
/// Resolve information about series from path.
/// </summary>
@@ -27,6 +34,21 @@ namespace Emby.Naming.TV
{
string seriesName = Path.GetFileName(path);
// First check if the filename matches a title with year pattern (handles numeric titles)
if (!string.IsNullOrEmpty(seriesName))
{
var titleWithYearMatch = TitleWithYearRegex().Match(seriesName);
if (titleWithYearMatch.Success)
{
seriesName = titleWithYearMatch.Groups["title"].Value.Trim();
return new SeriesInfo(path)
{
Name = seriesName,
Year = int.TryParse(titleWithYearMatch.Groups["year"].ValueSpan, out var year) ? year : null
};
}
}
SeriesPathParserResult result = SeriesPathParser.Parse(options, path);
if (result.Success)
{
+44
View File
@@ -0,0 +1,44 @@
using System;
using System.Linq;
using MediaBrowser.Model.Entities;
namespace Emby.Naming.TV;
/// <summary>
/// Helper class for TV metadata parsing.
/// </summary>
public static class TvParserHelpers
{
private static readonly string[] _continuingState = ["Pilot", "Returning Series", "Returning"];
private static readonly string[] _endedState = ["Cancelled", "Canceled"];
/// <summary>
/// Tries to parse a string into <see cref="SeriesStatus"/>.
/// </summary>
/// <param name="status">The status string.</param>
/// <param name="enumValue">The <see cref="SeriesStatus"/>.</param>
/// <returns>Returns true if parsing was successful.</returns>
public static bool TryParseSeriesStatus(string? status, out SeriesStatus? enumValue)
{
if (Enum.TryParse(status, true, out SeriesStatus seriesStatus))
{
enumValue = seriesStatus;
return true;
}
if (_continuingState.Contains(status, StringComparer.OrdinalIgnoreCase))
{
enumValue = SeriesStatus.Continuing;
return true;
}
if (_endedState.Contains(status, StringComparer.OrdinalIgnoreCase))
{
enumValue = SeriesStatus.Ended;
return true;
}
enumValue = null;
return false;
}
}
+2
View File
@@ -1,3 +1,5 @@
#pragma warning disable CA1815
namespace Emby.Naming.Video
{
/// <summary>
+1 -1
View File
@@ -44,7 +44,7 @@ namespace Emby.Naming.Video
var match = expression.Match(name);
if (match.Success && match.Groups.TryGetValue("cleaned", out var cleaned))
{
newName = cleaned.Value;
newName = cleaned.Value.Trim();
return true;
}
+30 -49
View File
@@ -18,68 +18,49 @@ namespace Emby.Naming.Video
/// </summary>
/// <param name="path">Path to file.</param>
/// <param name="namingOptions">The naming options.</param>
/// <param name="libraryRoot">Top-level folder for the containing library.</param>
/// <returns>Returns <see cref="ExtraResult"/> object.</returns>
public static ExtraResult GetExtraInfo(string path, NamingOptions namingOptions)
public static ExtraResult GetExtraInfo(string path, NamingOptions namingOptions, string? libraryRoot = "")
{
var result = new ExtraResult();
ExtraResult result = new ExtraResult();
for (var i = 0; i < namingOptions.VideoExtraRules.Length; i++)
bool isAudioFile = AudioFileParser.IsAudioFile(path, namingOptions);
bool isVideoFile = VideoResolver.IsVideoFile(path, namingOptions);
ReadOnlySpan<char> pathSpan = path.AsSpan();
ReadOnlySpan<char> fileName = Path.GetFileName(pathSpan);
ReadOnlySpan<char> fileNameWithoutExtension = Path.GetFileNameWithoutExtension(pathSpan);
// Trim the digits from the end of the filename so we can recognize things like -trailer2
ReadOnlySpan<char> trimmedFileNameWithoutExtension = fileNameWithoutExtension.TrimEnd(_digits);
ReadOnlySpan<char> directoryName = Path.GetFileName(Path.GetDirectoryName(pathSpan));
string fullDirectory = Path.GetDirectoryName(pathSpan).ToString();
foreach (ExtraRule rule in namingOptions.VideoExtraRules)
{
var rule = namingOptions.VideoExtraRules[i];
if ((rule.MediaType == MediaType.Audio && !AudioFileParser.IsAudioFile(path, namingOptions))
|| (rule.MediaType == MediaType.Video && !VideoResolver.IsVideoFile(path, namingOptions)))
if ((rule.MediaType == MediaType.Audio && !isAudioFile)
|| (rule.MediaType == MediaType.Video && !isVideoFile))
{
continue;
}
var pathSpan = path.AsSpan();
if (rule.RuleType == ExtraRuleType.Filename)
bool isMatch = rule.RuleType switch
{
var filename = Path.GetFileNameWithoutExtension(pathSpan);
ExtraRuleType.Filename => fileNameWithoutExtension.Equals(rule.Token, StringComparison.OrdinalIgnoreCase),
ExtraRuleType.Suffix => trimmedFileNameWithoutExtension.EndsWith(rule.Token, StringComparison.OrdinalIgnoreCase),
ExtraRuleType.Regex => Regex.IsMatch(fileName, rule.Token, RegexOptions.IgnoreCase | RegexOptions.Compiled),
ExtraRuleType.DirectoryName => directoryName.Equals(rule.Token, StringComparison.OrdinalIgnoreCase)
&& !string.Equals(fullDirectory, libraryRoot, StringComparison.OrdinalIgnoreCase),
_ => false,
};
if (filename.Equals(rule.Token, StringComparison.OrdinalIgnoreCase))
{
result.ExtraType = rule.ExtraType;
result.Rule = rule;
}
}
else if (rule.RuleType == ExtraRuleType.Suffix)
if (!isMatch)
{
// Trim the digits from the end of the filename so we can recognize things like -trailer2
var filename = Path.GetFileNameWithoutExtension(pathSpan).TrimEnd(_digits);
if (filename.EndsWith(rule.Token, StringComparison.OrdinalIgnoreCase))
{
result.ExtraType = rule.ExtraType;
result.Rule = rule;
}
}
else if (rule.RuleType == ExtraRuleType.Regex)
{
var filename = Path.GetFileName(path.AsSpan());
var isMatch = Regex.IsMatch(filename, rule.Token, RegexOptions.IgnoreCase | RegexOptions.Compiled);
if (isMatch)
{
result.ExtraType = rule.ExtraType;
result.Rule = rule;
}
}
else if (rule.RuleType == ExtraRuleType.DirectoryName)
{
var directoryName = Path.GetFileName(Path.GetDirectoryName(pathSpan));
if (directoryName.Equals(rule.Token, StringComparison.OrdinalIgnoreCase))
{
result.ExtraType = rule.ExtraType;
result.Rule = rule;
}
continue;
}
if (result.ExtraType is not null)
{
return result;
}
result.ExtraType = rule.ExtraType;
result.Rule = rule;
return result;
}
return result;
+1 -1
View File
@@ -1,4 +1,4 @@
using System.Diagnostics.CodeAnalysis;
using System.Diagnostics.CodeAnalysis;
using System.Text.RegularExpressions;
namespace Emby.Naming.Video;
+9 -4
View File
@@ -52,13 +52,18 @@ namespace Emby.Naming.Video
while (path.Length > 0)
{
var index = path.IndexOfAny(delimiters);
ReadOnlySpan<char> currentSlice;
if (index == -1)
{
index = path.Length - 1;
// No delimiter left, the last token is the remainder of the path
currentSlice = path;
path = default;
}
else
{
currentSlice = path[..index];
path = path[(index + 1)..];
}
var currentSlice = path[..index];
path = path[(index + 1)..];
if (!foundPrefix)
{
+1 -1
View File
@@ -132,7 +132,7 @@ namespace Emby.Naming.Video
}
}
private class StackMetadata
private sealed class StackMetadata
{
public StackMetadata(bool isDirectory, bool isNumerical, string partType)
{
+4 -4
View File
@@ -17,8 +17,8 @@ namespace Emby.Naming.Video
{
Name = name;
Files = Array.Empty<VideoFileInfo>();
AlternateVersions = Array.Empty<VideoFileInfo>();
Files = [];
AlternateVersions = [];
}
/// <summary>
@@ -40,10 +40,10 @@ namespace Emby.Naming.Video
public IReadOnlyList<VideoFileInfo> Files { get; set; }
/// <summary>
/// Gets or sets the alternate versions.
/// Gets or sets the alternate versions. Each alternate may itself span multiple files.
/// </summary>
/// <value>The alternate versions.</value>
public IReadOnlyList<VideoFileInfo> AlternateVersions { get; set; }
public IReadOnlyList<VideoInfo> AlternateVersions { get; set; }
/// <summary>
/// Gets or sets the extra type.
+143 -39
View File
@@ -1,10 +1,12 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using Emby.Naming.Common;
using Jellyfin.Extensions;
using Emby.Naming.TV;
using Jellyfin.Data.Enums;
using MediaBrowser.Model.IO;
namespace Emby.Naming.Video
@@ -12,8 +14,23 @@ namespace Emby.Naming.Video
/// <summary>
/// Resolves alternative versions and extras from list of video files.
/// </summary>
public static partial class VideoListResolver
public partial class VideoListResolver
{
private static readonly StringComparer _numericOrdinalComparer = StringComparer.Create(CultureInfo.InvariantCulture, CompareOptions.NumericOrdering);
private readonly NamingOptions _namingOptions;
private readonly EpisodePathParser _episodePathParser;
/// <summary>
/// Initializes a new instance of the <see cref="VideoListResolver"/> class.
/// </summary>
/// <param name="namingOptions">The naming options.</param>
public VideoListResolver(NamingOptions namingOptions)
{
_namingOptions = namingOptions;
_episodePathParser = new EpisodePathParser(namingOptions);
}
[GeneratedRegex("[0-9]{2}[0-9]+[ip]", RegexOptions.IgnoreCase)]
private static partial Regex ResolutionRegex();
@@ -24,11 +41,12 @@ namespace Emby.Naming.Video
/// Resolves alternative versions and extras from list of video files.
/// </summary>
/// <param name="videoInfos">List of related video files.</param>
/// <param name="namingOptions">The naming options.</param>
/// <param name="supportMultiVersion">Indication we should consider multi-versions of content.</param>
/// <param name="parseName">Whether to parse the name or use the filename.</param>
/// <param name="libraryRoot">Top-level folder for the containing library.</param>
/// <param name="collectionType">The type of the containing collection, if known.</param>
/// <returns>Returns enumerable of <see cref="VideoInfo"/> which groups files together when related.</returns>
public static IReadOnlyList<VideoInfo> Resolve(IReadOnlyList<VideoFileInfo> videoInfos, NamingOptions namingOptions, bool supportMultiVersion = true, bool parseName = true)
public IReadOnlyList<VideoInfo> Resolve(IReadOnlyList<VideoFileInfo> videoInfos, bool supportMultiVersion = true, bool parseName = true, string? libraryRoot = "", CollectionType? collectionType = null)
{
// Filter out all extras, otherwise they could cause stacks to not be resolved
// See the unit test TestStackedWithTrailer
@@ -36,7 +54,7 @@ namespace Emby.Naming.Video
.Where(i => i.ExtraType is null)
.Select(i => new FileSystemMetadata { FullName = i.Path, IsDirectory = i.IsDirectory });
var stackResult = StackResolver.Resolve(nonExtras, namingOptions).ToList();
var stackResult = StackResolver.Resolve(nonExtras, _namingOptions).ToList();
var remainingFiles = new List<VideoFileInfo>();
var standaloneMedia = new List<VideoFileInfo>();
@@ -65,7 +83,7 @@ namespace Emby.Naming.Video
{
var info = new VideoInfo(stack.Name)
{
Files = stack.Files.Select(i => VideoResolver.Resolve(i, stack.IsDirectoryStack, namingOptions, parseName))
Files = stack.Files.Select(i => VideoResolver.Resolve(i, stack.IsDirectoryStack, _namingOptions, parseName, libraryRoot))
.OfType<VideoFileInfo>()
.ToList()
};
@@ -84,7 +102,9 @@ namespace Emby.Naming.Video
if (supportMultiVersion)
{
list = GetVideosGroupedByVersion(list, namingOptions);
list = collectionType is CollectionType.tvshows
? GetEpisodesGroupedByVersion(list)
: GetVideosGroupedByVersion(list);
}
// Whatever files are left, just add them
@@ -98,7 +118,7 @@ namespace Emby.Naming.Video
return list;
}
private static List<VideoInfo> GetVideosGroupedByVersion(List<VideoInfo> videos, NamingOptions namingOptions)
private List<VideoInfo> GetVideosGroupedByVersion(List<VideoInfo> videos)
{
if (videos.Count == 0)
{
@@ -122,7 +142,7 @@ namespace Emby.Naming.Video
continue;
}
if (!IsEligibleForMultiVersion(folderName, video.Files[0].FileNameWithoutExtension, namingOptions))
if (!IsEligibleForMultiVersion(folderName, video.Files[0].FileNameWithoutExtension))
{
return videos;
}
@@ -133,35 +153,9 @@ namespace Emby.Naming.Video
}
}
if (videos.Count > 1)
{
var groups = videos.GroupBy(x => ResolutionRegex().IsMatch(x.Files[0].FileNameWithoutExtension)).ToList();
videos.Clear();
foreach (var group in groups)
{
if (group.Key)
{
videos.InsertRange(0, group.OrderByDescending(x => x.Files[0].FileNameWithoutExtension.ToString(), new AlphanumericComparator()));
}
else
{
videos.AddRange(group.OrderBy(x => x.Files[0].FileNameWithoutExtension.ToString(), new AlphanumericComparator()));
}
}
}
var organized = OrganizeAlternateVersions(videos, primary, folderName.ToString());
primary ??= videos[0];
videos.Remove(primary);
var list = new List<VideoInfo>
{
primary
};
list[0].AlternateVersions = videos.Select(x => x.Files[0]).ToArray();
list[0].Name = folderName.ToString();
return list;
return [organized];
}
private static bool HaveSameYear(IReadOnlyList<VideoInfo> videos)
@@ -183,7 +177,7 @@ namespace Emby.Naming.Video
return true;
}
private static bool IsEligibleForMultiVersion(ReadOnlySpan<char> folderName, ReadOnlySpan<char> testFilename, NamingOptions namingOptions)
private bool IsEligibleForMultiVersion(ReadOnlySpan<char> folderName, ReadOnlySpan<char> testFilename)
{
if (!testFilename.StartsWith(folderName, StringComparison.OrdinalIgnoreCase))
{
@@ -197,7 +191,7 @@ namespace Emby.Naming.Video
}
// There are no span overloads for regex unfortunately
if (CleanStringParser.TryClean(testFilename.ToString(), namingOptions.CleanStringRegexes, out var cleanName))
if (CleanStringParser.TryClean(testFilename.ToString(), _namingOptions.CleanStringRegexes, out var cleanName))
{
testFilename = cleanName.AsSpan().Trim();
}
@@ -205,7 +199,117 @@ namespace Emby.Naming.Video
// The CleanStringParser should have removed common keywords etc.
return testFilename.IsEmpty
|| testFilename[0] == '-'
|| testFilename[0] == '_'
|| testFilename[0] == '.'
|| CheckMultiVersionRegex().IsMatch(testFilename);
}
private List<VideoInfo> GetEpisodesGroupedByVersion(List<VideoInfo> videos)
{
if (videos.Count < 2)
{
return videos;
}
var result = new List<VideoInfo>();
var groups = new Dictionary<string, List<VideoInfo>>(StringComparer.OrdinalIgnoreCase);
for (var i = 0; i < videos.Count; i++)
{
var video = videos[i];
var episodeResult = _episodePathParser.Parse(video.Files[0].Path, false);
string? key = null;
if (episodeResult.Success)
{
if (episodeResult.IsByDate
&& episodeResult.Year.HasValue
&& episodeResult.Month.HasValue
&& episodeResult.Day.HasValue)
{
key = FormattableString.Invariant(
$"D{episodeResult.Year.Value}{episodeResult.Month.Value:D2}{episodeResult.Day.Value:D2}");
}
else if (episodeResult.EpisodeNumber.HasValue)
{
key = FormattableString.Invariant(
$"S{episodeResult.SeasonNumber ?? 0}E{episodeResult.EpisodeNumber.Value}");
}
}
if (key is null)
{
result.Add(video);
continue;
}
if (!groups.TryGetValue(key, out var group))
{
group = [];
groups[key] = group;
}
group.Add(video);
}
foreach (var group in groups.Values)
{
if (group.Count == 1)
{
result.Add(group[0]);
continue;
}
result.Add(OrganizeAlternateVersions(group));
}
return result;
}
private static VideoInfo OrganizeAlternateVersions(
List<VideoInfo> videos,
VideoInfo? primaryOverride = null,
string? nameOverride = null)
{
if (videos.Count > 1)
{
var groups = videos
.Select(x => (filename: x.Files[0].FileNameWithoutExtension.ToString(), value: x))
.Select(x => (x.filename, resolutionMatch: ResolutionRegex().Match(x.filename), x.value))
.GroupBy(x => x.resolutionMatch.Success)
.ToList();
videos = [];
foreach (var group in groups)
{
if (group.Key)
{
videos.InsertRange(0, group
.OrderByDescending(x => x.resolutionMatch.Value, _numericOrdinalComparer)
.ThenBy(x => x.filename, _numericOrdinalComparer)
.Select(x => x.value));
}
else
{
videos.AddRange(group.OrderBy(x => x.filename, _numericOrdinalComparer).Select(x => x.value));
}
}
}
// Prefer a stacked entry (more than one part) as primary
var primary = primaryOverride
?? videos.FirstOrDefault(v => v.Files.Count > 1)
?? videos[0];
videos.Remove(primary);
primary.AlternateVersions = videos;
if (nameOverride is not null)
{
primary.Name = nameOverride;
}
return primary;
}
}
}
+9 -6
View File
@@ -17,10 +17,11 @@ namespace Emby.Naming.Video
/// <param name="path">The path.</param>
/// <param name="namingOptions">The naming options.</param>
/// <param name="parseName">Whether to parse the name or use the filename.</param>
/// <param name="libraryRoot">Top-level folder for the containing library.</param>
/// <returns>VideoFileInfo.</returns>
public static VideoFileInfo? ResolveDirectory(string? path, NamingOptions namingOptions, bool parseName = true)
public static VideoFileInfo? ResolveDirectory(string? path, NamingOptions namingOptions, bool parseName = true, string? libraryRoot = "")
{
return Resolve(path, true, namingOptions, parseName);
return Resolve(path, true, namingOptions, parseName, libraryRoot);
}
/// <summary>
@@ -28,10 +29,11 @@ namespace Emby.Naming.Video
/// </summary>
/// <param name="path">The path.</param>
/// <param name="namingOptions">The naming options.</param>
/// <param name="libraryRoot">Top-level folder for the containing library.</param>
/// <returns>VideoFileInfo.</returns>
public static VideoFileInfo? ResolveFile(string? path, NamingOptions namingOptions)
public static VideoFileInfo? ResolveFile(string? path, NamingOptions namingOptions, string? libraryRoot = "")
{
return Resolve(path, false, namingOptions);
return Resolve(path, false, namingOptions, libraryRoot: libraryRoot);
}
/// <summary>
@@ -41,9 +43,10 @@ namespace Emby.Naming.Video
/// <param name="isDirectory">if set to <c>true</c> [is folder].</param>
/// <param name="namingOptions">The naming options.</param>
/// <param name="parseName">Whether or not the name should be parsed for info.</param>
/// <param name="libraryRoot">Top-level folder for the containing library.</param>
/// <returns>VideoFileInfo.</returns>
/// <exception cref="ArgumentNullException"><c>path</c> is <c>null</c>.</exception>
public static VideoFileInfo? Resolve(string? path, bool isDirectory, NamingOptions namingOptions, bool parseName = true)
public static VideoFileInfo? Resolve(string? path, bool isDirectory, NamingOptions namingOptions, bool parseName = true, string? libraryRoot = "")
{
if (string.IsNullOrEmpty(path))
{
@@ -75,7 +78,7 @@ namespace Emby.Naming.Video
var format3DResult = Format3DParser.Parse(path, namingOptions);
var extraResult = ExtraRuleResolver.GetExtraInfo(path, namingOptions);
var extraResult = ExtraRuleResolver.GetExtraInfo(path, namingOptions, libraryRoot);
var name = Path.GetFileNameWithoutExtension(path);
+1 -1
View File
@@ -19,7 +19,7 @@
</ItemGroup>
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>
+3 -3
View File
@@ -26,7 +26,7 @@ public class PhotoProvider : ICustomMetadataProvider<Photo>, IForcedProvider, IH
private readonly ILogger<PhotoProvider> _logger;
private readonly IImageProcessor _imageProcessor;
// These are causing taglib to hang
// Other extensions might cause taglib to hang
private readonly string[] _includeExtensions = [".jpg", ".jpeg", ".png", ".tiff", ".cr2", ".webp", ".avif"];
/// <summary>
@@ -49,7 +49,7 @@ public class PhotoProvider : ICustomMetadataProvider<Photo>, IForcedProvider, IH
if (item.IsFileProtocol)
{
var file = directoryService.GetFile(item.Path);
return file is not null && file.LastWriteTimeUtc != item.DateModified;
return file is not null && item.HasChanged(file.LastWriteTimeUtc);
}
return false;
@@ -108,7 +108,7 @@ public class PhotoProvider : ICustomMetadataProvider<Photo>, IForcedProvider, IH
var dateTaken = image.ImageTag.DateTime;
if (dateTaken.HasValue)
{
item.DateCreated = dateTaken.Value;
item.DateCreated = dateTaken.Value.ToUniversalTime();
item.PremiereDate = dateTaken.Value;
item.ProductionYear = dateTaken.Value.Year;
}
@@ -1,5 +1,8 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Jellyfin.Extensions;
using MediaBrowser.Common.Configuration;
namespace Emby.Server.Implementations.AppBase
@@ -30,80 +33,122 @@ namespace Emby.Server.Implementations.AppBase
ConfigurationDirectoryPath = configurationDirectoryPath;
CachePath = cacheDirectoryPath;
WebPath = webDirectoryPath;
DataPath = Directory.CreateDirectory(Path.Combine(ProgramDataPath, "data")).FullName;
}
/// <summary>
/// Gets the path to the program data folder.
/// </summary>
/// <value>The program data path.</value>
/// <inheritdoc/>
public string ProgramDataPath { get; }
/// <inheritdoc/>
public string WebPath { get; }
/// <summary>
/// Gets the path to the system folder.
/// </summary>
/// <value>The path to the system folder.</value>
/// <inheritdoc/>
public string ProgramSystemPath { get; } = AppContext.BaseDirectory;
/// <summary>
/// Gets the folder path to the data directory.
/// </summary>
/// <value>The data directory.</value>
/// <inheritdoc/>
public string DataPath { get; }
/// <inheritdoc />
public string VirtualDataPath => "%AppDataPath%";
/// <summary>
/// Gets the image cache path.
/// </summary>
/// <value>The image cache path.</value>
/// <inheritdoc/>
public string ImageCachePath => Path.Combine(CachePath, "images");
/// <summary>
/// Gets the path to the plugin directory.
/// </summary>
/// <value>The plugins path.</value>
/// <inheritdoc/>
public string PluginsPath => Path.Combine(ProgramDataPath, "plugins");
/// <summary>
/// Gets the path to the plugin configurations directory.
/// </summary>
/// <value>The plugin configurations path.</value>
/// <inheritdoc/>
public string PluginConfigurationsPath => Path.Combine(PluginsPath, "configurations");
/// <summary>
/// Gets the path to the log directory.
/// </summary>
/// <value>The log directory path.</value>
/// <inheritdoc/>
public string LogDirectoryPath { get; }
/// <summary>
/// Gets the path to the application configuration root directory.
/// </summary>
/// <value>The configuration directory path.</value>
/// <inheritdoc/>
public string ConfigurationDirectoryPath { get; }
/// <summary>
/// Gets the path to the system configuration file.
/// </summary>
/// <value>The system configuration file path.</value>
/// <inheritdoc/>
public string SystemConfigurationFilePath => Path.Combine(ConfigurationDirectoryPath, "system.xml");
/// <summary>
/// Gets or sets the folder path to the cache directory.
/// </summary>
/// <value>The cache directory.</value>
/// <inheritdoc/>
public string CachePath { get; set; }
/// <inheritdoc/>
public string TempDirectory => Path.Join(Path.GetTempPath(), "jellyfin");
/// <inheritdoc />
public string TrickplayPath => Path.Combine(DataPath, "trickplay");
/// <inheritdoc />
public string BackupPath => Path.Combine(DataPath, "backups");
/// <inheritdoc />
public virtual void MakeSanityCheckOrThrow()
{
CreateAndCheckMarker(ConfigurationDirectoryPath, "config");
CreateAndCheckMarker(LogDirectoryPath, "log");
CreateAndCheckMarker(PluginsPath, "plugin");
CreateAndCheckMarker(ProgramDataPath, "data");
CreateAndCheckMarker(CachePath, "cache");
CreateAndCheckMarker(DataPath, "data");
CreateCacheDirTag(CachePath);
}
/// <inheritdoc />
public void CreateAndCheckMarker(string path, string markerName, bool recursive = false)
{
Directory.CreateDirectory(path);
CheckOrCreateMarker(path, $".jellyfin-{markerName}", recursive);
}
/// <summary>
/// Gets the folder path to the temp directory within the cache folder.
/// Creates a CACHEDIR.TAG file in the specified directory per the Cache Directory Tagging specification.
/// This signals to backup tools (e.g. Restic, Borg) that the directory contains cached data
/// and can be excluded from backups.
/// </summary>
/// <value>The temp directory.</value>
public string TempDirectory => Path.Combine(CachePath, "temp");
/// <param name="path">The cache directory path.</param>
internal static void CreateCacheDirTag(string path)
{
var tagPath = Path.Combine(path, "CACHEDIR.TAG");
if (!File.Exists(tagPath))
{
File.WriteAllText(
tagPath,
"Signature: 8a477f597d28d172789f06886806bc55\n"
+ "# This file is a cache directory tag created by Jellyfin.\n"
+ "# For information about cache directory tags, see:\n"
+ "#\thttps://bford.info/cachedir/\n");
}
}
private IEnumerable<string> GetMarkers(string path, bool recursive = false)
{
return Directory.EnumerateFiles(path, ".jellyfin-*", recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly);
}
private void CheckOrCreateMarker(string path, string markerName, bool recursive = false)
{
string? otherMarkers = null;
try
{
otherMarkers = GetMarkers(path, recursive).FirstOrDefault(e => !Path.GetFileName(e.AsSpan()).Equals(markerName, StringComparison.OrdinalIgnoreCase));
}
catch
{
// Error while checking for marker files, assume none exist and keep going
// TODO: add some logging
}
if (otherMarkers is not null)
{
throw new InvalidOperationException($"Expected to find only {markerName} but found marker for {otherMarkers}.");
}
var markerPath = Path.Combine(path, markerName);
if (!File.Exists(markerPath))
{
FileHelper.CreateEmpty(markerPath);
}
}
}
}
@@ -4,6 +4,7 @@ using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Threading;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.Events;
using MediaBrowser.Common.Extensions;
@@ -19,7 +20,7 @@ namespace Emby.Server.Implementations.AppBase
public abstract class BaseConfigurationManager : IConfigurationManager
{
private readonly ConcurrentDictionary<string, object> _configurations = new();
private readonly object _configurationSyncLock = new();
private readonly Lock _configurationSyncLock = new();
private ConfigurationStore[] _configurationStores = Array.Empty<ConfigurationStore>();
private IConfigurationFactory[] _configurationFactories = Array.Empty<IConfigurationFactory>();
@@ -131,7 +132,7 @@ namespace Emby.Server.Implementations.AppBase
}
else
{
_configurationFactories = [.._configurationFactories, factory];
_configurationFactories = [.. _configurationFactories, factory];
}
_configurationStores = _configurationFactories
@@ -226,6 +227,8 @@ namespace Emby.Server.Implementations.AppBase
Logger.LogInformation("Setting cache path: {Path}", cachePath);
((BaseApplicationPaths)CommonApplicationPaths).CachePath = cachePath;
CommonApplicationPaths.CreateAndCheckMarker(((BaseApplicationPaths)CommonApplicationPaths).CachePath, "cache");
BaseApplicationPaths.CreateCacheDirTag(cachePath);
}
/// <summary>
+125 -43
View File
@@ -14,7 +14,9 @@ using System.Reflection;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;
using Emby.Naming.Common;
using Emby.Naming.Video;
using Emby.Photos;
using Emby.Server.Implementations.Chapters;
using Emby.Server.Implementations.Collections;
using Emby.Server.Implementations.Configuration;
using Emby.Server.Implementations.Cryptography;
@@ -24,6 +26,8 @@ using Emby.Server.Implementations.Dto;
using Emby.Server.Implementations.HttpServer.Security;
using Emby.Server.Implementations.IO;
using Emby.Server.Implementations.Library;
using Emby.Server.Implementations.Library.Search;
using Emby.Server.Implementations.Library.SimilarItems;
using Emby.Server.Implementations.Localization;
using Emby.Server.Implementations.Playlists;
using Emby.Server.Implementations.Plugins;
@@ -35,11 +39,16 @@ using Emby.Server.Implementations.SyncPlay;
using Emby.Server.Implementations.TV;
using Emby.Server.Implementations.Updates;
using Jellyfin.Api.Helpers;
using Jellyfin.Data;
using Jellyfin.Database.Implementations.Enums;
using Jellyfin.Drawing;
using Jellyfin.MediaEncoding.Hls.Playlist;
using Jellyfin.Networking.Manager;
using Jellyfin.Networking.Udp;
using Jellyfin.Server.Implementations;
using Jellyfin.Server.Implementations.FullSystemBackup;
using Jellyfin.Server.Implementations.Item;
using Jellyfin.Server.Implementations.MediaSegments;
using Jellyfin.Server.Implementations.SystemBackupService;
using MediaBrowser.Common;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.Events;
@@ -55,10 +64,14 @@ using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Drawing;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.LibraryTaskScheduler;
using MediaBrowser.Controller.LiveTv;
using MediaBrowser.Controller.Lyrics;
using MediaBrowser.Controller.MediaEncoding;
using MediaBrowser.Controller.MediaSegments;
using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Controller.Playlists;
@@ -82,15 +95,20 @@ using MediaBrowser.Model.Net;
using MediaBrowser.Model.Serialization;
using MediaBrowser.Model.System;
using MediaBrowser.Model.Tasks;
using MediaBrowser.Providers.Chapters;
using MediaBrowser.Providers.Books;
using MediaBrowser.Providers.Books.ComicBookInfo;
using MediaBrowser.Providers.Books.ComicInfo;
using MediaBrowser.Providers.Lyric;
using MediaBrowser.Providers.Manager;
using MediaBrowser.Providers.Plugins.ListenBrainz;
using MediaBrowser.Providers.Plugins.ListenBrainz.Api;
using MediaBrowser.Providers.Plugins.Tmdb;
using MediaBrowser.Providers.Plugins.Tmdb.Movies;
using MediaBrowser.Providers.Plugins.Tmdb.TV;
using MediaBrowser.Providers.Subtitles;
using MediaBrowser.XbmcMetadata.Providers;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
@@ -160,8 +178,6 @@ namespace Emby.Server.Implementations
ConfigurationManager.Configuration,
ApplicationPaths.PluginsPath,
ApplicationVersion);
_disposableParts.Add(_pluginManager);
}
/// <summary>
@@ -265,8 +281,15 @@ namespace Emby.Server.Implementations
? Environment.MachineName
: ConfigurationManager.Configuration.ServerName;
public string RestoreBackupPath { get; set; }
public string ExpandVirtualPath(string path)
{
if (path is null)
{
return null;
}
var appPaths = ApplicationPaths;
return path.Replace(appPaths.VirtualDataPath, appPaths.DataPath, StringComparison.OrdinalIgnoreCase)
@@ -396,12 +419,19 @@ namespace Emby.Server.Implementations
{
Logger.LogInformation("Running startup tasks");
EnsureStartupWizardIntegrity();
Resolve<ITaskManager>().AddTasks(GetExports<IScheduledTask>(false));
ConfigurationManager.ConfigurationUpdated += OnConfigurationUpdated;
ConfigurationManager.NamedConfigurationUpdated += OnConfigurationUpdated;
Resolve<IMediaEncoder>().SetFFmpegPath();
var ffmpegValid = Resolve<IMediaEncoder>().SetFFmpegPath();
if (!ffmpegValid)
{
throw new FfmpegException("Failed to find valid ffmpeg");
}
Logger.LogInformation("ServerId: {ServerId}", SystemId);
Logger.LogInformation("Core startup complete");
@@ -410,6 +440,24 @@ namespace Emby.Server.Implementations
return Task.CompletedTask;
}
private void EnsureStartupWizardIntegrity()
{
if (ConfigurationManager.CommonConfiguration.IsStartupWizardCompleted)
{
return;
}
var hasConfiguredAdministrator = Resolve<IUserManager>().GetUsers()
.Any(user => user.HasPermission(PermissionKind.IsAdministrator) && !string.IsNullOrEmpty(user.Password));
if (hasConfiguredAdministrator)
{
Logger.LogWarning("The startup wizard is marked incomplete but a configured administrator already exists. Marking setup as completed to prevent the unauthenticated setup endpoints from being reachable.");
ConfigurationManager.Configuration.IsStartupWizardCompleted = true;
ConfigurationManager.SaveConfiguration();
}
}
/// <inheritdoc/>
public void Init(IServiceCollection serviceCollection)
{
@@ -422,7 +470,7 @@ namespace Emby.Server.Implementations
// Initialize runtime stat collection
if (ConfigurationManager.Configuration.EnableMetrics)
{
DotNetRuntimeStatsBuilder.Default().StartCollecting();
_disposableParts.Add(DotNetRuntimeStatsBuilder.Default().StartCollecting());
}
var networkConfiguration = ConfigurationManager.GetNetworkConfiguration();
@@ -459,6 +507,7 @@ namespace Emby.Server.Implementations
serviceCollection.AddSingleton<IApplicationHost>(this);
serviceCollection.AddSingleton<IPluginManager>(_pluginManager);
serviceCollection.AddSingleton<IApplicationPaths>(ApplicationPaths);
serviceCollection.AddSingleton<IBackupService, BackupService>();
serviceCollection.AddSingleton<IFileSystem, ManagedFileSystem>();
serviceCollection.AddSingleton<IShortcutHandler, MbLinkShortcutHandler>();
@@ -466,6 +515,19 @@ namespace Emby.Server.Implementations
serviceCollection.AddScoped<ISystemManager, SystemManager>();
serviceCollection.AddSingleton<TmdbClientManager>();
serviceCollection.AddSingleton<TmdbMovieSimilarProvider>();
serviceCollection.AddSingleton<TmdbSeriesSimilarProvider>();
serviceCollection.AddSingleton<ListenBrainzLabsClient>();
serviceCollection.AddSingleton<ListenBrainzSimilarArtistProvider>();
// register the generic local metadata provider for comic files
serviceCollection.AddSingleton<ComicProvider>();
// register the actual implementations of the local metadata provider for comic files
serviceCollection.AddSingleton<IComicProvider, ComicBookInfoProvider>();
serviceCollection.AddSingleton<IComicProvider, ExternalComicInfoProvider>();
serviceCollection.AddSingleton<IComicProvider, InternalComicInfoProvider>();
serviceCollection.AddSingleton(NetManager);
@@ -486,26 +548,45 @@ namespace Emby.Server.Implementations
serviceCollection.AddSingleton<IBlurayExaminer, BdInfoExaminer>();
serviceCollection.AddSingleton<IUserDataRepository, SqliteUserDataRepository>();
serviceCollection.AddSingleton<IUserDataManager, UserDataManager>();
serviceCollection.AddSingleton<IItemRepository, SqliteItemRepository>();
serviceCollection.AddSingleton<BaseItemRepository>();
serviceCollection.AddSingleton<IItemRepository>(sp => sp.GetRequiredService<BaseItemRepository>());
serviceCollection.AddSingleton<IItemQueryHelpers>(sp => sp.GetRequiredService<BaseItemRepository>());
serviceCollection.AddSingleton<IItemPersistenceService, ItemPersistenceService>();
serviceCollection.AddSingleton<INextUpService, NextUpService>();
serviceCollection.AddSingleton<IItemCountService, ItemCountService>();
serviceCollection.AddSingleton<ILinkedChildrenService, LinkedChildrenService>();
serviceCollection.AddSingleton<IPeopleRepository, PeopleRepository>();
serviceCollection.AddSingleton<IChapterRepository, ChapterRepository>();
serviceCollection.AddSingleton<IMediaAttachmentRepository, MediaAttachmentRepository>();
serviceCollection.AddSingleton<IMediaStreamRepository, MediaStreamRepository>();
serviceCollection.AddSingleton<IKeyframeRepository, KeyframeRepository>();
serviceCollection.AddSingleton<IItemTypeLookup, ItemTypeLookup>();
serviceCollection.AddSingleton<IMediaEncoder, MediaBrowser.MediaEncoding.Encoder.MediaEncoder>();
serviceCollection.AddSingleton<EncodingHelper>();
serviceCollection.AddSingleton<IPathManager, PathManager>();
serviceCollection.AddSingleton<IExternalDataManager, ExternalDataManager>();
// TODO: Refactor to eliminate the circular dependencies here so that Lazy<T> isn't required
serviceCollection.AddTransient(provider => new Lazy<ILibraryMonitor>(provider.GetRequiredService<ILibraryMonitor>));
serviceCollection.AddTransient(provider => new Lazy<IProviderManager>(provider.GetRequiredService<IProviderManager>));
serviceCollection.AddTransient(provider => new Lazy<IUserViewManager>(provider.GetRequiredService<IUserViewManager>));
serviceCollection.AddTransient(provider => new Lazy<IExternalDataManager>(provider.GetRequiredService<IExternalDataManager>));
serviceCollection.AddSingleton<ILibraryManager, LibraryManager>();
serviceCollection.AddSingleton<NamingOptions>();
serviceCollection.AddSingleton<VideoListResolver>();
serviceCollection.AddSingleton<IMusicManager, MusicManager>();
serviceCollection.AddSingleton<ILibraryMonitor, LibraryMonitor>();
serviceCollection.AddSingleton<DotIgnoreIgnoreRule>();
serviceCollection.AddSingleton<ISearchEngine, SearchEngine>();
serviceCollection.AddSingleton<ISimilarItemsManager, SimilarItemsManager>();
serviceCollection.AddSingleton<ISearchManager, SearchManager>();
serviceCollection.AddSingleton<ISearchProvider, SqlSearchProvider>();
serviceCollection.AddSingleton<IWebSocketManager, WebSocketManager>();
@@ -527,6 +608,7 @@ namespace Emby.Server.Implementations
serviceCollection.AddSingleton<ISessionManager, SessionManager>();
serviceCollection.AddSingleton<ICollectionManager, CollectionManager>();
serviceCollection.AddSingleton<ILimitedConcurrencyLibraryScheduler, LimitedConcurrencyLibraryScheduler>();
serviceCollection.AddSingleton<IPlaylistManager, PlaylistManager>();
@@ -536,13 +618,12 @@ namespace Emby.Server.Implementations
serviceCollection.AddSingleton<IChapterManager, ChapterManager>();
serviceCollection.AddSingleton<IEncodingManager, MediaEncoder.EncodingManager>();
serviceCollection.AddSingleton<IAuthService, AuthService>();
serviceCollection.AddSingleton<IQuickConnect, QuickConnectManager>();
serviceCollection.AddSingleton<ISubtitleParser, SubtitleEditParser>();
serviceCollection.AddSingleton<ISubtitleEncoder, SubtitleEncoder>();
serviceCollection.AddSingleton<IKeyframeManager, KeyframeManager>();
serviceCollection.AddSingleton<IAttachmentExtractor, MediaBrowser.MediaEncoding.Attachments.AttachmentExtractor>();
@@ -552,28 +633,17 @@ namespace Emby.Server.Implementations
serviceCollection.AddScoped<DynamicHlsHelper>();
serviceCollection.AddScoped<IClientEventLogger, ClientEventLogger>();
serviceCollection.AddSingleton<IDirectoryService, DirectoryService>();
serviceCollection.AddSingleton<IMediaSegmentManager, MediaSegmentManager>();
}
/// <summary>
/// Create services registered with the service container that need to be initialized at application startup.
/// </summary>
/// <param name="startupConfig">The configuration used to initialise the application.</param>
/// <returns>A task representing the service initialization operation.</returns>
public async Task InitializeServices()
public async Task InitializeServices(IConfiguration startupConfig)
{
var jellyfinDb = await Resolve<IDbContextFactory<JellyfinDbContext>>().CreateDbContextAsync().ConfigureAwait(false);
await using (jellyfinDb.ConfigureAwait(false))
{
if ((await jellyfinDb.Database.GetPendingMigrationsAsync().ConfigureAwait(false)).Any())
{
Logger.LogInformation("There are pending EFCore migrations in the database. Applying... (This may take a while, do not stop Jellyfin)");
await jellyfinDb.Database.MigrateAsync().ConfigureAwait(false);
Logger.LogInformation("EFCore migrations applied successfully");
}
}
((SqliteItemRepository)Resolve<IItemRepository>()).Initialize();
((SqliteUserDataRepository)Resolve<IUserDataRepository>()).Initialize();
var localizationManager = (LocalizationManager)Resolve<ILocalizationManager>();
await localizationManager.LoadAll().ConfigureAwait(false);
@@ -599,7 +669,7 @@ namespace Emby.Server.Implementations
// Don't use an empty string password
password = string.IsNullOrWhiteSpace(password) ? null : password;
var localCert = new X509Certificate2(path, password, X509KeyStorageFlags.UserKeySet);
var localCert = X509CertificateLoader.LoadPkcs12FromFile(path, password, X509KeyStorageFlags.UserKeySet);
if (!localCert.HasPrivateKey)
{
Logger.LogError("No private key included in SSL cert {CertificateLocation}.", path);
@@ -621,22 +691,27 @@ namespace Emby.Server.Implementations
private void SetStaticProperties()
{
// For now there's no real way to inject these properly
BaseItem.Logger = Resolve<ILogger<BaseItem>>();
BaseItem.ConfigurationManager = ConfigurationManager;
BaseItem.LibraryManager = Resolve<ILibraryManager>();
BaseItem.ProviderManager = Resolve<IProviderManager>();
BaseItem.LocalizationManager = Resolve<ILocalizationManager>();
BaseItem.ItemRepository = Resolve<IItemRepository>();
BaseItem.FileSystem = Resolve<IFileSystem>();
BaseItem.UserDataManager = Resolve<IUserDataManager>();
BaseItem.ChapterManager = Resolve<IChapterManager>();
BaseItem.ChannelManager = Resolve<IChannelManager>();
Video.RecordingsManager = Resolve<IRecordingsManager>();
Folder.UserViewManager = Resolve<IUserViewManager>();
UserView.TVSeriesManager = Resolve<ITVSeriesManager>();
UserView.CollectionManager = Resolve<ICollectionManager>();
BaseItem.ConfigurationManager = ConfigurationManager;
BaseItem.FileSystem = Resolve<IFileSystem>();
BaseItem.ItemRepository = Resolve<IItemRepository>();
BaseItem.ItemCountService = Resolve<IItemCountService>();
BaseItem.LibraryManager = Resolve<ILibraryManager>();
BaseItem.LocalizationManager = Resolve<ILocalizationManager>();
BaseItem.Logger = Resolve<ILogger<BaseItem>>();
BaseItem.MediaSegmentManager = Resolve<IMediaSegmentManager>();
BaseItem.MediaSourceManager = Resolve<IMediaSourceManager>();
BaseItem.ProviderManager = Resolve<IProviderManager>();
BaseItem.UserDataManager = Resolve<IUserDataManager>();
CollectionFolder.XmlSerializer = _xmlSerializer;
CollectionFolder.ApplicationHost = this;
Folder.UserViewManager = Resolve<IUserViewManager>();
Folder.CollectionManager = Resolve<ICollectionManager>();
Folder.LimitedConcurrencyLibraryScheduler = Resolve<ILimitedConcurrencyLibraryScheduler>();
Episode.MediaEncoder = Resolve<IMediaEncoder>();
UserView.TVSeriesManager = Resolve<ITVSeriesManager>();
Video.RecordingsManager = Resolve<IRecordingsManager>();
}
/// <summary>
@@ -664,9 +739,13 @@ namespace Emby.Server.Implementations
GetExports<IMetadataService>(),
GetExports<IMetadataProvider>(),
GetExports<IMetadataSaver>(),
GetExports<IExternalId>());
GetExports<IExternalId>(),
GetExports<IExternalUrlProvider>());
Resolve<IMediaSourceManager>().AddParts(GetExports<IMediaSourceProvider>());
Resolve<ISimilarItemsManager>().AddParts(GetExports<ISimilarItemsProvider>());
Resolve<ISearchManager>().AddParts(GetExports<ISearchProvider>());
}
/// <summary>
@@ -908,8 +987,9 @@ namespace Emby.Server.Implementations
/// <inheritdoc/>
public string GetLocalApiUrl(string hostname, string scheme = null, int? port = null)
{
// If the smartAPI doesn't start with http then treat it as a host or ip.
if (hostname.StartsWith("http", StringComparison.OrdinalIgnoreCase))
// If the smartAPI isn't already a complete URL then treat it as a host or ip.
if (hostname.StartsWith("http://", StringComparison.OrdinalIgnoreCase)
|| hostname.StartsWith("https://", StringComparison.OrdinalIgnoreCase))
{
return hostname.TrimEnd('/');
}
@@ -986,6 +1066,8 @@ namespace Emby.Server.Implementations
}
_disposableParts.Clear();
_pluginManager?.Dispose();
}
_disposed = true;
@@ -0,0 +1,311 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Jellyfin.Extensions;
using MediaBrowser.Controller.Chapters;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.MediaEncoding;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.MediaInfo;
using Microsoft.Extensions.Logging;
namespace Emby.Server.Implementations.Chapters;
/// <summary>
/// The chapter manager.
/// </summary>
public class ChapterManager : IChapterManager
{
private readonly IFileSystem _fileSystem;
private readonly ILogger<ChapterManager> _logger;
private readonly IMediaEncoder _encoder;
private readonly IChapterRepository _chapterRepository;
private readonly ILibraryManager _libraryManager;
private readonly IPathManager _pathManager;
/// <summary>
/// The first chapter ticks.
/// </summary>
private static readonly long _firstChapterTicks = TimeSpan.FromSeconds(15).Ticks;
/// <summary>
/// Initializes a new instance of the <see cref="ChapterManager"/> class.
/// </summary>
/// <param name="logger">The <see cref="ILogger{ChapterManager}"/>.</param>
/// <param name="fileSystem">The <see cref="IFileSystem"/>.</param>
/// <param name="encoder">The <see cref="IMediaEncoder"/>.</param>
/// <param name="chapterRepository">The <see cref="IChapterRepository"/>.</param>
/// <param name="libraryManager">The <see cref="ILibraryManager"/>.</param>
/// <param name="pathManager">The <see cref="IPathManager"/>.</param>
public ChapterManager(
ILogger<ChapterManager> logger,
IFileSystem fileSystem,
IMediaEncoder encoder,
IChapterRepository chapterRepository,
ILibraryManager libraryManager,
IPathManager pathManager)
{
_logger = logger;
_fileSystem = fileSystem;
_encoder = encoder;
_chapterRepository = chapterRepository;
_libraryManager = libraryManager;
_pathManager = pathManager;
}
/// <summary>
/// Determines whether [is eligible for chapter image extraction] [the specified video].
/// </summary>
/// <param name="video">The video.</param>
/// <param name="libraryOptions">The library options for the video.</param>
/// <returns><c>true</c> if [is eligible for chapter image extraction] [the specified video]; otherwise, <c>false</c>.</returns>
private bool IsEligibleForChapterImageExtraction(Video video, LibraryOptions libraryOptions)
{
if (video.IsPlaceHolder)
{
return false;
}
if (libraryOptions is null || !libraryOptions.EnableChapterImageExtraction)
{
return false;
}
if (video.IsShortcut)
{
return false;
}
if (!video.IsCompleteMedia)
{
return false;
}
// Can't extract images if there are no video streams
return video.DefaultVideoStreamIndex.HasValue;
}
private long GetAverageDurationBetweenChapters(IReadOnlyList<ChapterInfo> chapters)
{
if (chapters.Count < 2)
{
return 0;
}
long sum = 0;
for (int i = 1; i < chapters.Count; i++)
{
sum += chapters[i].StartPositionTicks - chapters[i - 1].StartPositionTicks;
}
return sum / chapters.Count;
}
/// <inheritdoc />
public async Task<bool> RefreshChapterImages(Video video, IDirectoryService directoryService, IReadOnlyList<ChapterInfo> chapters, bool extractImages, bool saveChapters, CancellationToken cancellationToken)
{
if (chapters.Count == 0)
{
return true;
}
var libraryOptions = _libraryManager.GetLibraryOptions(video);
if (!IsEligibleForChapterImageExtraction(video, libraryOptions))
{
extractImages = false;
}
var averageChapterDuration = GetAverageDurationBetweenChapters(chapters);
var threshold = TimeSpan.FromSeconds(1).Ticks;
if (chapters.Count >= 2 && averageChapterDuration < threshold)
{
_logger.LogInformation("Skipping chapter image extraction for {Video} as the average chapter duration {AverageDuration} was lower than the minimum threshold {Threshold}", video.Name, averageChapterDuration, threshold);
extractImages = false;
}
var success = true;
var changesMade = false;
var runtimeTicks = video.RunTimeTicks ?? 0;
var currentImages = GetSavedChapterImages(video, directoryService);
foreach (var chapter in chapters)
{
if (chapter.StartPositionTicks >= runtimeTicks)
{
_logger.LogInformation("Stopping chapter extraction for {0} because a chapter was found with a position greater than the runtime.", video.Name);
break;
}
var path = _pathManager.GetChapterImagePath(video, chapter.StartPositionTicks);
if (!currentImages.Contains(path, StringComparison.OrdinalIgnoreCase))
{
if (extractImages)
{
cancellationToken.ThrowIfCancellationRequested();
try
{
// Add some time for the first chapter to make sure we don't end up with a black image
var time = chapter.StartPositionTicks == 0 ? TimeSpan.FromTicks(Math.Min(_firstChapterTicks, video.RunTimeTicks ?? 0)) : TimeSpan.FromTicks(chapter.StartPositionTicks);
var inputPath = video.Path;
var directoryPath = Path.GetDirectoryName(path);
if (!string.IsNullOrEmpty(directoryPath))
{
Directory.CreateDirectory(directoryPath);
}
var container = video.Container;
var mediaSource = new MediaSourceInfo
{
VideoType = video.VideoType,
IsoType = video.IsoType,
Protocol = video.PathProtocol ?? MediaProtocol.File,
};
_logger.LogInformation("Extracting chapter image for {Name} at {Path}", video.Name, inputPath);
var tempFile = await _encoder.ExtractVideoImage(inputPath, container, mediaSource, video.GetDefaultVideoStream(), video.Video3DFormat, time, cancellationToken).ConfigureAwait(false);
File.Copy(tempFile, path, true);
try
{
_fileSystem.DeleteFile(tempFile);
}
catch (IOException ex)
{
_logger.LogError(ex, "Error deleting temporary chapter image encoding file {Path}", tempFile);
}
chapter.ImagePath = path;
chapter.ImageDateModified = _fileSystem.GetLastWriteTimeUtc(path);
changesMade = true;
}
catch (Exception ex)
{
_logger.LogError(ex, "Error extracting chapter images for {0}", string.Join(',', video.Path));
success = false;
break;
}
}
else if (!string.IsNullOrEmpty(chapter.ImagePath))
{
chapter.ImagePath = null;
changesMade = true;
}
}
else if (!string.Equals(path, chapter.ImagePath, StringComparison.OrdinalIgnoreCase))
{
chapter.ImagePath = path;
chapter.ImageDateModified = _fileSystem.GetLastWriteTimeUtc(path);
changesMade = true;
}
else if (libraryOptions?.EnableChapterImageExtraction != true)
{
// We have an image for the current chapter but the user has disabled chapter image extraction -> delete this chapter's image
chapter.ImagePath = null;
changesMade = true;
}
}
if (saveChapters && changesMade)
{
SaveChapters(video, chapters);
}
DeleteDeadImages(currentImages, chapters);
return success;
}
/// <inheritdoc />
public bool Supports(BaseItem item)
=> item is Video or Audio;
/// <inheritdoc />
public void SaveChapters(BaseItem item, IReadOnlyList<ChapterInfo> chapters)
{
if (!Supports(item))
{
_logger.LogWarning("Attempted to save chapters for unsupported item type {Type}: {Name} ({Id})", item.GetType().Name, item.Name, item.Id);
return;
}
// Remove any chapters that are outside of the runtime of the item
var validChapters = chapters.Where(c => c.StartPositionTicks < item.RunTimeTicks).ToList();
_chapterRepository.SaveChapters(item.Id, validChapters);
}
/// <inheritdoc />
public ChapterInfo? GetChapter(Guid baseItemId, int index)
{
return _chapterRepository.GetChapter(baseItemId, index);
}
/// <inheritdoc />
public IReadOnlyList<ChapterInfo> GetChapters(Guid baseItemId)
{
return _chapterRepository.GetChapters(baseItemId);
}
/// <inheritdoc />
public async Task DeleteChapterDataAsync(Guid itemId, CancellationToken cancellationToken)
{
await _chapterRepository.DeleteChaptersAsync(itemId, cancellationToken).ConfigureAwait(false);
}
private IReadOnlyList<string> GetSavedChapterImages(Video video, IDirectoryService directoryService)
{
var path = _pathManager.GetChapterImageFolderPath(video);
if (!Directory.Exists(path))
{
return [];
}
try
{
return directoryService.GetFilePaths(path);
}
catch (IOException)
{
return [];
}
}
private void DeleteDeadImages(IEnumerable<string> images, IEnumerable<ChapterInfo> chapters)
{
var existingImages = chapters.Select(i => i.ImagePath).Where(i => !string.IsNullOrEmpty(i));
var deadImages = images
.Except(existingImages, StringComparer.OrdinalIgnoreCase)
.Where(i => BaseItem.SupportedImageExtensions.Contains(Path.GetExtension(i.AsSpan()), StringComparison.OrdinalIgnoreCase))
.ToList();
foreach (var image in deadImages)
{
_logger.LogDebug("Deleting dead chapter image {Path}", image);
try
{
_fileSystem.DeleteFile(image!);
}
catch (IOException ex)
{
_logger.LogError(ex, "Error deleting {Path}.", image);
}
}
}
}
@@ -4,12 +4,15 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Jellyfin.Data.Entities;
using Jellyfin.Data.Enums;
using Jellyfin.Database.Implementations.Entities;
using Jellyfin.Extensions;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.Collections;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Entities;
@@ -29,6 +32,7 @@ namespace Emby.Server.Implementations.Collections
private readonly ILibraryMonitor _iLibraryMonitor;
private readonly ILogger<CollectionManager> _logger;
private readonly IProviderManager _providerManager;
private readonly ILinkedChildrenService _linkedChildrenService;
private readonly ILocalizationManager _localizationManager;
private readonly IApplicationPaths _appPaths;
@@ -42,6 +46,7 @@ namespace Emby.Server.Implementations.Collections
/// <param name="iLibraryMonitor">The library monitor.</param>
/// <param name="loggerFactory">The logger factory.</param>
/// <param name="providerManager">The provider manager.</param>
/// <param name="linkedChildrenService">The linked children service.</param>
public CollectionManager(
ILibraryManager libraryManager,
IApplicationPaths appPaths,
@@ -49,13 +54,15 @@ namespace Emby.Server.Implementations.Collections
IFileSystem fileSystem,
ILibraryMonitor iLibraryMonitor,
ILoggerFactory loggerFactory,
IProviderManager providerManager)
IProviderManager providerManager,
ILinkedChildrenService linkedChildrenService)
{
_libraryManager = libraryManager;
_fileSystem = fileSystem;
_iLibraryMonitor = iLibraryMonitor;
_logger = loggerFactory.CreateLogger<CollectionManager>();
_providerManager = providerManager;
_linkedChildrenService = linkedChildrenService;
_localizationManager = localizationManager;
_appPaths = appPaths;
}
@@ -95,15 +102,18 @@ namespace Emby.Server.Implementations.Collections
var libraryOptions = new LibraryOptions
{
PathInfos = new[] { new MediaPathInfo(path) },
PathInfos = [new MediaPathInfo(path)],
EnableRealtimeMonitor = false,
SaveLocalMetadata = true
};
var name = _localizationManager.GetLocalizedString("Collections");
// This names a library for the whole server, so ignore the requesting client's language.
var name = _localizationManager.GetServerLocalizedString("Collections");
await _libraryManager.AddVirtualFolder(name, CollectionTypeOptions.boxsets, libraryOptions, true).ConfigureAwait(false);
_libraryManager.RootFolder.Children = null;
return FindFolders(path).First();
}
@@ -118,6 +128,22 @@ namespace Emby.Server.Implementations.Collections
return EnsureLibraryFolder(GetCollectionsFolderPath(), createIfNeeded);
}
/// <inheritdoc />
public IEnumerable<BoxSet> GetCollectionsContainingItem(User user, Guid itemId)
{
ArgumentNullException.ThrowIfNull(user);
if (itemId.IsEmpty())
{
return Enumerable.Empty<BoxSet>();
}
return _linkedChildrenService
.GetManualLinkedParentIds(itemId, BaseItemKind.BoxSet)
.Select(parentId => _libraryManager.GetItemById<BoxSet>(parentId, user))
.OfType<BoxSet>();
}
private IEnumerable<BoxSet> GetCollections(User user)
{
var folder = GetCollectionsFolder(false).GetAwaiter().GetResult();
@@ -150,15 +176,15 @@ namespace Emby.Server.Implementations.Collections
try
{
Directory.CreateDirectory(path);
var info = Directory.CreateDirectory(path);
var collection = new BoxSet
{
Name = name,
Path = path,
IsLocked = options.IsLocked,
ProviderIds = options.ProviderIds,
DateCreated = DateTime.UtcNow
DateCreated = info.CreationTimeUtc,
DateModified = info.LastWriteTimeUtc
};
parentFolder.AddChild(collection);
@@ -204,7 +230,7 @@ namespace Emby.Server.Implementations.Collections
{
if (_libraryManager.GetItemById(collectionId) is not BoxSet collection)
{
throw new ArgumentException("No collection exists with the supplied Id");
throw new ArgumentException("No collection exists with the supplied collectionId " + collectionId);
}
List<BaseItem>? itemList = null;
@@ -218,7 +244,7 @@ namespace Emby.Server.Implementations.Collections
if (item is null)
{
throw new ArgumentException("No item exists with the supplied Id");
throw new ArgumentException("No item exists with the supplied Id " + id);
}
if (!currentLinkedChildrenIds.Contains(id))
@@ -270,7 +296,7 @@ namespace Emby.Server.Implementations.Collections
{
var childItem = _libraryManager.GetItemById(guidId);
var child = collection.LinkedChildren.FirstOrDefault(i => (i.ItemId.HasValue && i.ItemId.Value.Equals(guidId)) || (childItem is not null && string.Equals(childItem.Path, i.Path, StringComparison.OrdinalIgnoreCase)));
var child = collection.LinkedChildren.FirstOrDefault(i => i.ItemId.HasValue && i.ItemId.Value.Equals(guidId));
if (child is null)
{
@@ -340,7 +366,7 @@ namespace Emby.Server.Implementations.Collections
// this is kind of a performance hack because only Video has alternate versions that should be in a box set?
if (item is Video video)
{
foreach (var childId in video.GetLocalAlternateVersionIds())
foreach (var childId in _libraryManager.GetLocalAlternateVersionIds(video))
{
if (!results.ContainsKey(childId))
{
@@ -17,9 +17,11 @@ namespace Emby.Server.Implementations
{ DefaultRedirectKey, "web/" },
{ FfmpegProbeSizeKey, "1G" },
{ FfmpegAnalyzeDurationKey, "200M" },
{ PlaylistsAllowDuplicatesKey, bool.FalseString },
{ BindToUnixSocketKey, bool.FalseString },
{ SqliteCacheSizeKey, "20000" }
{ SqliteCacheSizeKey, "20000" },
{ FfmpegSkipValidationKey, bool.FalseString },
{ FfmpegImgExtractPerfTradeoffKey, bool.FalseString },
{ DetectNetworkChangeKey, bool.TrueString }
};
}
}
@@ -39,22 +39,24 @@ namespace Emby.Server.Implementations.Cryptography
{
if (string.Equals(hash.Id, "PBKDF2", StringComparison.Ordinal))
{
var iterations = GetIterationsParameter(hash);
return hash.Hash.SequenceEqual(
Rfc2898DeriveBytes.Pbkdf2(
password,
hash.Salt,
int.Parse(hash.Parameters["iterations"], CultureInfo.InvariantCulture),
iterations,
HashAlgorithmName.SHA1,
32));
}
if (string.Equals(hash.Id, "PBKDF2-SHA512", StringComparison.Ordinal))
{
var iterations = GetIterationsParameter(hash);
return hash.Hash.SequenceEqual(
Rfc2898DeriveBytes.Pbkdf2(
password,
hash.Salt,
int.Parse(hash.Parameters["iterations"], CultureInfo.InvariantCulture),
iterations,
HashAlgorithmName.SHA512,
DefaultOutputLength));
}
@@ -62,6 +64,27 @@ namespace Emby.Server.Implementations.Cryptography
throw new NotSupportedException($"Can't verify hash with id: {hash.Id}");
}
/// <summary>
/// Extracts and validates the iterations parameter from a password hash.
/// </summary>
/// <param name="hash">The password hash containing parameters.</param>
/// <returns>The number of iterations.</returns>
/// <exception cref="FormatException">Thrown when iterations parameter is missing or invalid.</exception>
private static int GetIterationsParameter(PasswordHash hash)
{
if (!hash.Parameters.TryGetValue("iterations", out var iterationsStr))
{
throw new FormatException($"Password hash with id '{hash.Id}' is missing required 'iterations' parameter.");
}
if (!int.TryParse(iterationsStr, CultureInfo.InvariantCulture, out var iterations))
{
throw new FormatException($"Password hash with id '{hash.Id}' has invalid 'iterations' parameter: '{iterationsStr}'.");
}
return iterations;
}
/// <inheritdoc />
public byte[] GenerateSalt()
=> GenerateSalt(DefaultSaltLength);
@@ -1,213 +0,0 @@
#nullable disable
#pragma warning disable CS1591
using System;
using System.Collections.Generic;
using Jellyfin.Extensions;
using Microsoft.Data.Sqlite;
using Microsoft.Extensions.Logging;
namespace Emby.Server.Implementations.Data
{
public abstract class BaseSqliteRepository : IDisposable
{
private bool _disposed = false;
/// <summary>
/// Initializes a new instance of the <see cref="BaseSqliteRepository"/> class.
/// </summary>
/// <param name="logger">The logger.</param>
protected BaseSqliteRepository(ILogger<BaseSqliteRepository> logger)
{
Logger = logger;
}
/// <summary>
/// Gets or sets the path to the DB file.
/// </summary>
protected string DbFilePath { get; set; }
/// <summary>
/// Gets or sets the number of write connections to create.
/// </summary>
/// <value>Path to the DB file.</value>
protected int WriteConnectionsCount { get; set; } = 1;
/// <summary>
/// Gets or sets the number of read connections to create.
/// </summary>
protected int ReadConnectionsCount { get; set; } = 1;
/// <summary>
/// Gets the logger.
/// </summary>
/// <value>The logger.</value>
protected ILogger<BaseSqliteRepository> Logger { get; }
/// <summary>
/// Gets the cache size.
/// </summary>
/// <value>The cache size or null.</value>
protected virtual int? CacheSize => null;
/// <summary>
/// Gets the locking mode. <see href="https://www.sqlite.org/pragma.html#pragma_locking_mode" />.
/// </summary>
protected virtual string LockingMode => "NORMAL";
/// <summary>
/// Gets the journal mode. <see href="https://www.sqlite.org/pragma.html#pragma_journal_mode" />.
/// </summary>
/// <value>The journal mode.</value>
protected virtual string JournalMode => "WAL";
/// <summary>
/// Gets the journal size limit. <see href="https://www.sqlite.org/pragma.html#pragma_journal_size_limit" />.
/// The default (-1) is overriden to prevent unconstrained WAL size, as reported by users.
/// </summary>
/// <value>The journal size limit.</value>
protected virtual int? JournalSizeLimit => 134_217_728; // 128MiB
/// <summary>
/// Gets the page size.
/// </summary>
/// <value>The page size or null.</value>
protected virtual int? PageSize => null;
/// <summary>
/// Gets the temp store mode.
/// </summary>
/// <value>The temp store mode.</value>
/// <see cref="TempStoreMode"/>
protected virtual TempStoreMode TempStore => TempStoreMode.Memory;
/// <summary>
/// Gets the synchronous mode.
/// </summary>
/// <value>The synchronous mode or null.</value>
/// <see cref="SynchronousMode"/>
protected virtual SynchronousMode? Synchronous => SynchronousMode.Normal;
public virtual void Initialize()
{
// Configuration and pragmas can affect VACUUM so it needs to be last.
using (var connection = GetConnection())
{
connection.Execute("VACUUM");
}
}
protected SqliteConnection GetConnection()
{
var connection = new SqliteConnection($"Filename={DbFilePath}");
connection.Open();
if (CacheSize.HasValue)
{
connection.Execute("PRAGMA cache_size=" + CacheSize.Value);
}
if (!string.IsNullOrWhiteSpace(LockingMode))
{
connection.Execute("PRAGMA locking_mode=" + LockingMode);
}
if (!string.IsNullOrWhiteSpace(JournalMode))
{
connection.Execute("PRAGMA journal_mode=" + JournalMode);
}
if (JournalSizeLimit.HasValue)
{
connection.Execute("PRAGMA journal_size_limit=" + JournalSizeLimit.Value);
}
if (Synchronous.HasValue)
{
connection.Execute("PRAGMA synchronous=" + (int)Synchronous.Value);
}
if (PageSize.HasValue)
{
connection.Execute("PRAGMA page_size=" + PageSize.Value);
}
connection.Execute("PRAGMA temp_store=" + (int)TempStore);
return connection;
}
public SqliteCommand PrepareStatement(SqliteConnection connection, string sql)
{
var command = connection.CreateCommand();
command.CommandText = sql;
return command;
}
protected bool TableExists(SqliteConnection connection, string name)
{
using var statement = PrepareStatement(connection, "select DISTINCT tbl_name from sqlite_master");
foreach (var row in statement.ExecuteQuery())
{
if (string.Equals(name, row.GetString(0), StringComparison.OrdinalIgnoreCase))
{
return true;
}
}
return false;
}
protected List<string> GetColumnNames(SqliteConnection connection, string table)
{
var columnNames = new List<string>();
foreach (var row in connection.Query("PRAGMA table_info(" + table + ")"))
{
if (row.TryGetString(1, out var columnName))
{
columnNames.Add(columnName);
}
}
return columnNames;
}
protected void AddColumn(SqliteConnection connection, string table, string columnName, string type, List<string> existingColumnNames)
{
if (existingColumnNames.Contains(columnName, StringComparison.OrdinalIgnoreCase))
{
return;
}
connection.Execute("alter table " + table + " add column " + columnName + " " + type + " NULL");
}
protected void CheckDisposed()
{
ObjectDisposedException.ThrowIf(_disposed, this);
}
/// <inheritdoc />
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
/// <summary>
/// Releases unmanaged and - optionally - managed resources.
/// </summary>
/// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
protected virtual void Dispose(bool dispose)
{
if (_disposed)
{
return;
}
_disposed = true;
}
}
}
@@ -1,66 +1,153 @@
#pragma warning disable CS1591
using System;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Jellyfin.Data.Enums;
using Jellyfin.Database.Implementations;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Playlists;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
namespace Emby.Server.Implementations.Data
namespace Emby.Server.Implementations.Data;
public class CleanDatabaseScheduledTask : ILibraryPostScanTask
{
public class CleanDatabaseScheduledTask : ILibraryPostScanTask
private readonly ILibraryManager _libraryManager;
private readonly ILogger<CleanDatabaseScheduledTask> _logger;
private readonly IDbContextFactory<JellyfinDbContext> _dbProvider;
private readonly IPathManager _pathManager;
public CleanDatabaseScheduledTask(
ILibraryManager libraryManager,
ILogger<CleanDatabaseScheduledTask> logger,
IDbContextFactory<JellyfinDbContext> dbProvider,
IPathManager pathManager)
{
private readonly ILibraryManager _libraryManager;
private readonly ILogger<CleanDatabaseScheduledTask> _logger;
_libraryManager = libraryManager;
_logger = logger;
_dbProvider = dbProvider;
_pathManager = pathManager;
}
public CleanDatabaseScheduledTask(ILibraryManager libraryManager, ILogger<CleanDatabaseScheduledTask> logger)
{
_libraryManager = libraryManager;
_logger = logger;
}
public async Task Run(IProgress<double> progress, CancellationToken cancellationToken)
{
var deadItemsProgress = new Progress<double>(val => progress.Report(val * 0.8));
await CleanDeadItems(cancellationToken, deadItemsProgress).ConfigureAwait(false);
public Task Run(IProgress<double> progress, CancellationToken cancellationToken)
{
CleanDeadItems(cancellationToken, progress);
return Task.CompletedTask;
}
var playlistProgress = new Progress<double>(val => progress.Report(80 + (val * 0.2)));
await CleanOrphanedFilePlaylistsAsync(cancellationToken, playlistProgress).ConfigureAwait(false);
}
private void CleanDeadItems(CancellationToken cancellationToken, IProgress<double> progress)
private async Task CleanDeadItems(CancellationToken cancellationToken, IProgress<double> progress)
{
var itemIds = _libraryManager.GetItemIds(new InternalItemsQuery
{
var itemIds = _libraryManager.GetItemIds(new InternalItemsQuery
HasDeadParentId = true
});
var numComplete = 0;
var numItems = itemIds.Count + 1;
_logger.LogDebug("Cleaning {Number} items with dead parents", numItems);
IProgress<double> subProgress = new Progress<double>((val) => progress.Report(val / 2));
foreach (var itemId in itemIds)
{
cancellationToken.ThrowIfCancellationRequested();
var item = _libraryManager.GetItemById(itemId);
if (item is not null)
{
HasDeadParentId = true
});
_logger.LogInformation("Cleaning item {Item} type: {Type} path: {Path}", item.Name, item.GetType().Name, item.Path ?? string.Empty);
var numComplete = 0;
var numItems = itemIds.Count;
_logger.LogDebug("Cleaning {0} items with dead parent links", numItems);
foreach (var itemId in itemIds)
{
cancellationToken.ThrowIfCancellationRequested();
var item = _libraryManager.GetItemById(itemId);
if (item is not null)
foreach (var mediaSource in item.GetMediaSources(false))
{
_logger.LogInformation("Cleaning item {0} type: {1} path: {2}", item.Name, item.GetType().Name, item.Path ?? string.Empty);
_libraryManager.DeleteItem(item, new DeleteOptions
// Delete extracted data
var mediaSourceItem = _libraryManager.GetItemById(mediaSource.Id);
if (mediaSourceItem is null)
{
DeleteFileLocation = false
});
continue;
}
var extractedDataFolders = _pathManager.GetExtractedDataPaths(mediaSourceItem);
foreach (var folder in extractedDataFolders)
{
if (Directory.Exists(folder))
{
try
{
Directory.Delete(folder, true);
}
catch (Exception e)
{
_logger.LogWarning("Failed to remove {Folder}: {Exception}", folder, e.Message);
}
}
}
}
numComplete++;
double percent = numComplete;
percent /= numItems;
progress.Report(percent * 100);
// Delete item
_libraryManager.DeleteItem(item, new DeleteOptions
{
DeleteFileLocation = false
});
}
progress.Report(100);
numComplete++;
double percent = numComplete;
percent /= numItems;
subProgress.Report(percent * 100);
}
subProgress = new Progress<double>((val) => progress.Report((val / 2) + 50));
var context = await _dbProvider.CreateDbContextAsync(cancellationToken).ConfigureAwait(false);
await using (context.ConfigureAwait(false))
{
var transaction = await context.Database.BeginTransactionAsync(cancellationToken).ConfigureAwait(false);
await using (transaction.ConfigureAwait(false))
{
await context.ItemValues.Where(e => e.BaseItemsMap!.Count == 0).ExecuteDeleteAsync(cancellationToken).ConfigureAwait(false);
subProgress.Report(50);
await transaction.CommitAsync(cancellationToken).ConfigureAwait(false);
subProgress.Report(100);
}
}
progress.Report(100);
}
private async Task CleanOrphanedFilePlaylistsAsync(CancellationToken cancellationToken, IProgress<double> progress)
{
var playlists = _libraryManager.GetItemList(new InternalItemsQuery
{
IncludeItemTypes = [BaseItemKind.Playlist],
Recursive = true
}).OfType<Playlist>().ToList();
var numComplete = 0;
var numItems = Math.Max(playlists.Count, 1);
foreach (var playlist in playlists)
{
cancellationToken.ThrowIfCancellationRequested();
if (playlist.IsFile && !File.Exists(playlist.Path))
{
_logger.LogInformation("Removing file-based playlist {Name} because source file {Path} no longer exists", playlist.Name, playlist.Path);
_libraryManager.DeleteItem(playlist, new DeleteOptions { DeleteFileLocation = false });
}
numComplete++;
progress.Report((double)numComplete / numItems * 100);
}
progress.Report(100);
}
}
@@ -0,0 +1,64 @@
using System.Collections.Frozen;
using System.Collections.Generic;
using System.Threading.Channels;
using Emby.Server.Implementations.Playlists;
using Jellyfin.Data.Enums;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.LiveTv;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Controller.Playlists;
namespace Emby.Server.Implementations.Data;
/// <inheritdoc />
public class ItemTypeLookup : IItemTypeLookup
{
/// <inheritdoc />
public IReadOnlyList<string> MusicGenreTypes { get; } = [
typeof(Audio).FullName!,
typeof(MusicVideo).FullName!,
typeof(MusicAlbum).FullName!,
typeof(MusicArtist).FullName!,
];
/// <inheritdoc />
public IReadOnlyDictionary<BaseItemKind, string> BaseItemKindNames { get; } = new Dictionary<BaseItemKind, string>()
{
{ BaseItemKind.AggregateFolder, typeof(AggregateFolder).FullName! },
{ BaseItemKind.Audio, typeof(Audio).FullName! },
{ BaseItemKind.AudioBook, typeof(AudioBook).FullName! },
{ BaseItemKind.BasePluginFolder, typeof(BasePluginFolder).FullName! },
{ BaseItemKind.Book, typeof(Book).FullName! },
{ BaseItemKind.BoxSet, typeof(BoxSet).FullName! },
{ BaseItemKind.Channel, typeof(Channel).FullName! },
{ BaseItemKind.CollectionFolder, typeof(CollectionFolder).FullName! },
{ BaseItemKind.Episode, typeof(Episode).FullName! },
{ BaseItemKind.Folder, typeof(Folder).FullName! },
{ BaseItemKind.Genre, typeof(Genre).FullName! },
{ BaseItemKind.Movie, typeof(Movie).FullName! },
{ BaseItemKind.LiveTvChannel, typeof(LiveTvChannel).FullName! },
{ BaseItemKind.LiveTvProgram, typeof(LiveTvProgram).FullName! },
{ BaseItemKind.MusicAlbum, typeof(MusicAlbum).FullName! },
{ BaseItemKind.MusicArtist, typeof(MusicArtist).FullName! },
{ BaseItemKind.MusicGenre, typeof(MusicGenre).FullName! },
{ BaseItemKind.MusicVideo, typeof(MusicVideo).FullName! },
{ BaseItemKind.Person, typeof(Person).FullName! },
{ BaseItemKind.Photo, typeof(Photo).FullName! },
{ BaseItemKind.PhotoAlbum, typeof(PhotoAlbum).FullName! },
{ BaseItemKind.Playlist, typeof(Playlist).FullName! },
{ BaseItemKind.PlaylistsFolder, typeof(PlaylistsFolder).FullName! },
{ BaseItemKind.Season, typeof(Season).FullName! },
{ BaseItemKind.Series, typeof(Series).FullName! },
{ BaseItemKind.Studio, typeof(Studio).FullName! },
{ BaseItemKind.Trailer, typeof(Trailer).FullName! },
{ BaseItemKind.TvChannel, typeof(LiveTvChannel).FullName! },
{ BaseItemKind.TvProgram, typeof(LiveTvProgram).FullName! },
{ BaseItemKind.UserRootFolder, typeof(UserRootFolder).FullName! },
{ BaseItemKind.UserView, typeof(UserView).FullName! },
{ BaseItemKind.Video, typeof(Video).FullName! },
{ BaseItemKind.Year, typeof(Year).FullName! }
}.ToFrozenDictionary();
}
@@ -127,8 +127,16 @@ namespace Emby.Server.Implementations.Data
return false;
}
result = reader.GetGuid(index);
return true;
try
{
result = reader.GetGuid(index);
return true;
}
catch
{
result = Guid.Empty;
return false;
}
}
public static bool TryGetString(this SqliteDataReader reader, int index, out string result)
File diff suppressed because it is too large Load Diff
@@ -1,369 +0,0 @@
#nullable disable
#pragma warning disable CS1591
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using Jellyfin.Data.Entities;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Persistence;
using Microsoft.Data.Sqlite;
using Microsoft.Extensions.Logging;
namespace Emby.Server.Implementations.Data
{
public class SqliteUserDataRepository : BaseSqliteRepository, IUserDataRepository
{
private readonly IUserManager _userManager;
public SqliteUserDataRepository(
ILogger<SqliteUserDataRepository> logger,
IServerConfigurationManager config,
IUserManager userManager)
: base(logger)
{
_userManager = userManager;
DbFilePath = Path.Combine(config.ApplicationPaths.DataPath, "library.db");
}
/// <summary>
/// Opens the connection to the database.
/// </summary>
public override void Initialize()
{
base.Initialize();
using (var connection = GetConnection())
{
var userDatasTableExists = TableExists(connection, "UserDatas");
var userDataTableExists = TableExists(connection, "userdata");
var users = userDatasTableExists ? null : _userManager.Users;
using var transaction = connection.BeginTransaction();
connection.Execute(string.Join(
';',
"create table if not exists UserDatas (key nvarchar not null, userId INT not null, rating float null, played bit not null, playCount int not null, isFavorite bit not null, playbackPositionTicks bigint not null, lastPlayedDate datetime null, AudioStreamIndex INT, SubtitleStreamIndex INT)",
"drop index if exists idx_userdata",
"drop index if exists idx_userdata1",
"drop index if exists idx_userdata2",
"drop index if exists userdataindex1",
"drop index if exists userdataindex",
"drop index if exists userdataindex3",
"drop index if exists userdataindex4",
"create unique index if not exists UserDatasIndex1 on UserDatas (key, userId)",
"create index if not exists UserDatasIndex2 on UserDatas (key, userId, played)",
"create index if not exists UserDatasIndex3 on UserDatas (key, userId, playbackPositionTicks)",
"create index if not exists UserDatasIndex4 on UserDatas (key, userId, isFavorite)",
"create index if not exists UserDatasIndex5 on UserDatas (key, userId, lastPlayedDate)"));
if (!userDataTableExists)
{
transaction.Commit();
return;
}
var existingColumnNames = GetColumnNames(connection, "userdata");
AddColumn(connection, "userdata", "InternalUserId", "int", existingColumnNames);
AddColumn(connection, "userdata", "AudioStreamIndex", "int", existingColumnNames);
AddColumn(connection, "userdata", "SubtitleStreamIndex", "int", existingColumnNames);
if (userDatasTableExists)
{
return;
}
ImportUserIds(connection, users);
connection.Execute("INSERT INTO UserDatas (key, userId, rating, played, playCount, isFavorite, playbackPositionTicks, lastPlayedDate, AudioStreamIndex, SubtitleStreamIndex) SELECT key, InternalUserId, rating, played, playCount, isFavorite, playbackPositionTicks, lastPlayedDate, AudioStreamIndex, SubtitleStreamIndex from userdata where InternalUserId not null");
transaction.Commit();
}
}
private void ImportUserIds(SqliteConnection db, IEnumerable<User> users)
{
var userIdsWithUserData = GetAllUserIdsWithUserData(db);
using (var statement = db.PrepareStatement("update userdata set InternalUserId=@InternalUserId where UserId=@UserId"))
{
foreach (var user in users)
{
if (!userIdsWithUserData.Contains(user.Id))
{
continue;
}
statement.TryBind("@UserId", user.Id);
statement.TryBind("@InternalUserId", user.InternalId);
statement.ExecuteNonQuery();
}
}
}
private List<Guid> GetAllUserIdsWithUserData(SqliteConnection db)
{
var list = new List<Guid>();
using (var statement = PrepareStatement(db, "select DISTINCT UserId from UserData where UserId not null"))
{
foreach (var row in statement.ExecuteQuery())
{
try
{
list.Add(row.GetGuid(0));
}
catch (Exception ex)
{
Logger.LogError(ex, "Error while getting user");
}
}
}
return list;
}
/// <inheritdoc />
public void SaveUserData(long userId, string key, UserItemData userData, CancellationToken cancellationToken)
{
ArgumentNullException.ThrowIfNull(userData);
if (userId <= 0)
{
throw new ArgumentNullException(nameof(userId));
}
ArgumentException.ThrowIfNullOrEmpty(key);
PersistUserData(userId, key, userData, cancellationToken);
}
/// <inheritdoc />
public void SaveAllUserData(long userId, UserItemData[] userData, CancellationToken cancellationToken)
{
ArgumentNullException.ThrowIfNull(userData);
if (userId <= 0)
{
throw new ArgumentNullException(nameof(userId));
}
PersistAllUserData(userId, userData, cancellationToken);
}
/// <summary>
/// Persists the user data.
/// </summary>
/// <param name="internalUserId">The user id.</param>
/// <param name="key">The key.</param>
/// <param name="userData">The user data.</param>
/// <param name="cancellationToken">The cancellation token.</param>
public void PersistUserData(long internalUserId, string key, UserItemData userData, CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
using (var connection = GetConnection())
using (var transaction = connection.BeginTransaction())
{
SaveUserData(connection, internalUserId, key, userData);
transaction.Commit();
}
}
private static void SaveUserData(SqliteConnection db, long internalUserId, string key, UserItemData userData)
{
using (var statement = db.PrepareStatement("replace into UserDatas (key, userId, rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex) values (@key, @userId, @rating,@played,@playCount,@isFavorite,@playbackPositionTicks,@lastPlayedDate,@AudioStreamIndex,@SubtitleStreamIndex)"))
{
statement.TryBind("@userId", internalUserId);
statement.TryBind("@key", key);
if (userData.Rating.HasValue)
{
statement.TryBind("@rating", userData.Rating.Value);
}
else
{
statement.TryBindNull("@rating");
}
statement.TryBind("@played", userData.Played);
statement.TryBind("@playCount", userData.PlayCount);
statement.TryBind("@isFavorite", userData.IsFavorite);
statement.TryBind("@playbackPositionTicks", userData.PlaybackPositionTicks);
if (userData.LastPlayedDate.HasValue)
{
statement.TryBind("@lastPlayedDate", userData.LastPlayedDate.Value.ToDateTimeParamValue());
}
else
{
statement.TryBindNull("@lastPlayedDate");
}
if (userData.AudioStreamIndex.HasValue)
{
statement.TryBind("@AudioStreamIndex", userData.AudioStreamIndex.Value);
}
else
{
statement.TryBindNull("@AudioStreamIndex");
}
if (userData.SubtitleStreamIndex.HasValue)
{
statement.TryBind("@SubtitleStreamIndex", userData.SubtitleStreamIndex.Value);
}
else
{
statement.TryBindNull("@SubtitleStreamIndex");
}
statement.ExecuteNonQuery();
}
}
/// <summary>
/// Persist all user data for the specified user.
/// </summary>
private void PersistAllUserData(long internalUserId, UserItemData[] userDataList, CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
using (var connection = GetConnection())
using (var transaction = connection.BeginTransaction())
{
foreach (var userItemData in userDataList)
{
SaveUserData(connection, internalUserId, userItemData.Key, userItemData);
}
transaction.Commit();
}
}
/// <summary>
/// Gets the user data.
/// </summary>
/// <param name="userId">The user id.</param>
/// <param name="key">The key.</param>
/// <returns>Task{UserItemData}.</returns>
/// <exception cref="ArgumentNullException">
/// userId
/// or
/// key.
/// </exception>
public UserItemData GetUserData(long userId, string key)
{
if (userId <= 0)
{
throw new ArgumentNullException(nameof(userId));
}
ArgumentException.ThrowIfNullOrEmpty(key);
using (var connection = GetConnection())
{
using (var statement = connection.PrepareStatement("select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex from UserDatas where key =@Key and userId=@UserId"))
{
statement.TryBind("@UserId", userId);
statement.TryBind("@Key", key);
foreach (var row in statement.ExecuteQuery())
{
return ReadRow(row);
}
}
return null;
}
}
public UserItemData GetUserData(long userId, List<string> keys)
{
ArgumentNullException.ThrowIfNull(keys);
if (keys.Count == 0)
{
return null;
}
return GetUserData(userId, keys[0]);
}
/// <summary>
/// Return all user-data associated with the given user.
/// </summary>
/// <param name="userId">The internal user id.</param>
/// <returns>The list of user item data.</returns>
public List<UserItemData> GetAllUserData(long userId)
{
if (userId <= 0)
{
throw new ArgumentNullException(nameof(userId));
}
var list = new List<UserItemData>();
using (var connection = GetConnection())
{
using (var statement = connection.PrepareStatement("select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex from UserDatas where userId=@UserId"))
{
statement.TryBind("@UserId", userId);
foreach (var row in statement.ExecuteQuery())
{
list.Add(ReadRow(row));
}
}
}
return list;
}
/// <summary>
/// Read a row from the specified reader into the provided userData object.
/// </summary>
/// <param name="reader">The list of result set values.</param>
/// <returns>The user item data.</returns>
private UserItemData ReadRow(SqliteDataReader reader)
{
var userData = new UserItemData();
userData.Key = reader[0].ToString();
// userData.UserId = reader[1].ReadGuidFromBlob();
if (reader.TryGetDouble(2, out var rating))
{
userData.Rating = rating;
}
userData.Played = reader.GetBoolean(3);
userData.PlayCount = reader.GetInt32(4);
userData.IsFavorite = reader.GetBoolean(5);
userData.PlaybackPositionTicks = reader.GetInt64(6);
if (reader.TryReadDateTime(7, out var lastPlayedDate))
{
userData.LastPlayedDate = lastPlayedDate;
}
if (reader.TryGetInt32(8, out var audioStreamIndex))
{
userData.AudioStreamIndex = audioStreamIndex;
}
if (reader.TryGetInt32(9, out var subtitleStreamIndex))
{
userData.SubtitleStreamIndex = subtitleStreamIndex;
}
return userData;
}
}
}
@@ -1,30 +0,0 @@
namespace Emby.Server.Implementations.Data;
/// <summary>
/// The disk synchronization mode, controls how aggressively SQLite will write data
/// all the way out to physical storage.
/// </summary>
public enum SynchronousMode
{
/// <summary>
/// SQLite continues without syncing as soon as it has handed data off to the operating system.
/// </summary>
Off = 0,
/// <summary>
/// SQLite database engine will still sync at the most critical moments.
/// </summary>
Normal = 1,
/// <summary>
/// SQLite database engine will use the xSync method of the VFS
/// to ensure that all content is safely written to the disk surface prior to continuing.
/// </summary>
Full = 2,
/// <summary>
/// EXTRA synchronous is like FULL with the addition that the directory containing a rollback journal
/// is synced after that journal is unlinked to commit a transaction in DELETE mode.
/// </summary>
Extra = 3
}
@@ -1,23 +0,0 @@
namespace Emby.Server.Implementations.Data;
/// <summary>
/// Storage mode used by temporary database files.
/// </summary>
public enum TempStoreMode
{
/// <summary>
/// The compile-time C preprocessor macro SQLITE_TEMP_STORE
/// is used to determine where temporary tables and indices are stored.
/// </summary>
Default = 0,
/// <summary>
/// Temporary tables and indices are stored in a file.
/// </summary>
File = 1,
/// <summary>
/// Temporary tables and indices are kept in as if they were pure in-memory databases memory.
/// </summary>
Memory = 2
}
@@ -1,28 +1,38 @@
#pragma warning disable CS1591
using System;
using System.Globalization;
using System.IO;
using System.Text;
using System.Threading;
using MediaBrowser.Common.Configuration;
using Microsoft.Extensions.Logging;
namespace Emby.Server.Implementations.Devices
{
/// <summary>
/// Provides the persistent unique identifier of this server installation.
/// </summary>
public class DeviceId
{
private readonly IApplicationPaths _appPaths;
private readonly ILogger<DeviceId> _logger;
private readonly object _syncLock = new object();
private readonly Lock _syncLock = new();
private string? _id;
/// <summary>
/// Initializes a new instance of the <see cref="DeviceId"/> class.
/// </summary>
/// <param name="appPaths">Instance of the <see cref="IApplicationPaths"/> interface.</param>
/// <param name="logger">Instance of the <see cref="ILogger{DeviceId}"/> interface.</param>
public DeviceId(IApplicationPaths appPaths, ILogger<DeviceId> logger)
{
_appPaths = appPaths;
_logger = logger;
}
/// <summary>
/// Gets the device id, loading it from disk or generating and persisting a new one if none exists.
/// </summary>
public string Value => _id ??= GetDeviceId();
private string CachePath => Path.Combine(_appPaths.DataPath, "device.txt");
File diff suppressed because it is too large Load Diff
@@ -18,14 +18,15 @@
<ProjectReference Include="..\Emby.Photos\Emby.Photos.csproj" />
<ProjectReference Include="..\src\Jellyfin.Drawing\Jellyfin.Drawing.csproj" />
<ProjectReference Include="..\MediaBrowser.MediaEncoding\MediaBrowser.MediaEncoding.csproj" />
<ProjectReference Include="..\src\Jellyfin.Database\Jellyfin.Database.Implementations\Jellyfin.Database.Implementations.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="BitFaster.Caching" />
<PackageReference Include="DiscUtils.Udf" />
<PackageReference Include="Microsoft.Data.Sqlite" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" />
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" />
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" />
<PackageReference Include="prometheus-net.DotNetRuntime" />
@@ -37,7 +38,7 @@
</ItemGroup>
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>
@@ -62,10 +63,14 @@
<PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" PrivateAssets="All" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Ignore" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Localization\iso6392.txt" />
<EmbeddedResource Include="Localization\countries.json" />
<EmbeddedResource Include="Localization\Core\*.json" />
<EmbeddedResource Include="Localization\Ratings\*.csv" />
<EmbeddedResource Include="Localization\Ratings\*.json" />
</ItemGroup>
</Project>
@@ -5,8 +5,8 @@ using System.Globalization;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Jellyfin.Data.Entities;
using Jellyfin.Data.Events;
using Jellyfin.Database.Implementations.Entities;
using Jellyfin.Extensions;
using MediaBrowser.Controller.Channels;
using MediaBrowser.Controller.Configuration;
@@ -34,7 +34,7 @@ public sealed class LibraryChangedNotifier : IHostedService, IDisposable
private readonly IUserManager _userManager;
private readonly ILogger<LibraryChangedNotifier> _logger;
private readonly object _libraryChangedSyncLock = new();
private readonly Lock _libraryChangedSyncLock = new();
private readonly List<Folder> _foldersAddedTo = new();
private readonly List<Folder> _foldersRemovedFrom = new();
private readonly List<BaseItem> _itemsAdded = new();
@@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
@@ -25,7 +24,7 @@ namespace Emby.Server.Implementations.EntryPoints
private readonly IUserManager _userManager;
private readonly Dictionary<Guid, List<BaseItem>> _changedItems = new();
private readonly object _syncLock = new();
private readonly Lock _syncLock = new();
private Timer? _updateTimer;
@@ -134,19 +133,26 @@ namespace Emby.Server.Implementations.EntryPoints
private UserDataChangeInfo GetUserDataChangeInfo(Guid userId, List<BaseItem> changedItems)
{
var user = _userManager.GetUserById(userId);
var user = _userManager.GetUserById(userId)
?? throw new ArgumentException("Invalid user ID", nameof(userId));
return new UserDataChangeInfo
{
UserId = userId.ToString("N", CultureInfo.InvariantCulture),
UserId = userId,
UserDataList = changedItems
.DistinctBy(x => x.Id)
.Select(i =>
{
var dto = _userDataManager.GetUserDataDto(i, user);
dto.ItemId = i.Id.ToString("N", CultureInfo.InvariantCulture);
if (dto is null)
{
return null!;
}
dto.ItemId = i.Id;
return dto;
})
.Where(e => e is not null)
.ToArray()
};
}
@@ -1,7 +1,8 @@
#pragma warning disable CS1591
using System.Threading.Tasks;
using Jellyfin.Data.Enums;
using Jellyfin.Data;
using Jellyfin.Database.Implementations.Enums;
using MediaBrowser.Controller.Net;
using Microsoft.AspNetCore.Http;
@@ -1,5 +1,6 @@
using System;
using System.Buffers;
using System.Globalization;
using System.IO.Pipelines;
using System.Net;
using System.Net.WebSockets;
@@ -57,7 +58,7 @@ namespace Emby.Server.Implementations.HttpServer
RemoteEndPoint = remoteEndPoint;
_jsonOptions = JsonDefaults.Options;
LastActivityDate = DateTime.Now;
LastActivityDate = DateTime.UtcNow;
}
/// <inheritdoc />
@@ -69,6 +70,11 @@ namespace Emby.Server.Implementations.HttpServer
/// <inheritdoc />
public IPAddress? RemoteEndPoint { get; }
/// <summary>
/// Gets or initializes the UI culture captured from the upgrade request.
/// </summary>
public CultureInfo? RequestUICulture { get; init; }
/// <inheritdoc />
public Func<WebSocketMessageInfo, Task>? OnReceive { get; set; }
@@ -82,17 +88,28 @@ namespace Emby.Server.Implementations.HttpServer
public WebSocketState State => _socket.State;
/// <inheritdoc />
public Task SendAsync(OutboundWebSocketMessage message, CancellationToken cancellationToken)
public void ApplyRequestCulture()
{
var json = JsonSerializer.SerializeToUtf8Bytes(message, _jsonOptions);
return _socket.SendAsync(json, WebSocketMessageType.Text, true, cancellationToken);
if (RequestUICulture is null)
{
return;
}
CultureInfo.CurrentUICulture = RequestUICulture;
}
/// <inheritdoc />
public Task SendAsync<T>(OutboundWebSocketMessage<T> message, CancellationToken cancellationToken)
public async Task SendAsync(OutboundWebSocketMessage message, CancellationToken cancellationToken)
{
var json = JsonSerializer.SerializeToUtf8Bytes(message, _jsonOptions);
return _socket.SendAsync(json, WebSocketMessageType.Text, true, cancellationToken);
await _socket.SendAsync(json, WebSocketMessageType.Text, true, cancellationToken).ConfigureAwait(false);
}
/// <inheritdoc />
public async Task SendAsync<T>(OutboundWebSocketMessage<T> message, CancellationToken cancellationToken)
{
var json = JsonSerializer.SerializeToUtf8Bytes(message, _jsonOptions);
await _socket.SendAsync(json, WebSocketMessageType.Text, true, cancellationToken).ConfigureAwait(false);
}
/// <inheritdoc />
@@ -110,8 +127,12 @@ namespace Emby.Server.Implementations.HttpServer
{
receiveResult = await _socket.ReceiveAsync(memory, cancellationToken).ConfigureAwait(false);
}
catch (WebSocketException ex)
catch (Exception ex) when (ex is WebSocketException or ObjectDisposedException or OperationCanceledException)
{
// ObjectDisposedException/OperationCanceledException: the socket was torn
// down underneath us (e.g. by the keep-alive watchdog after the connection
// was declared lost). Fall through so Closed is still raised and the
// session can release this connection.
_logger.LogWarning("WS {IP} error receiving data: {Message}", RemoteEndPoint, ex.Message);
break;
}
@@ -224,12 +245,12 @@ namespace Emby.Server.Implementations.HttpServer
return ret;
}
private Task SendKeepAliveResponse()
private async Task SendKeepAliveResponse()
{
LastKeepAliveDate = DateTime.UtcNow;
return SendAsync(
await SendAsync(
new OutboundKeepAliveMessage(),
CancellationToken.None);
CancellationToken.None).ConfigureAwait(false);
}
/// <inheritdoc />
@@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Net.WebSockets;
using System.Threading.Tasks;
@@ -47,14 +48,18 @@ namespace Emby.Server.Implementations.HttpServer
_logger.LogInformation("WS {IP} request", context.Connection.RemoteIpAddress);
WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync().ConfigureAwait(false);
var connection = new WebSocketConnection(
_loggerFactory.CreateLogger<WebSocketConnection>(),
webSocket,
authorizationInfo,
context.GetNormalizedRemoteIP())
{
OnReceive = ProcessWebSocketMessageReceived
RequestUICulture = CultureInfo.CurrentUICulture
};
connection.OnReceive = result =>
{
connection.ApplyRequestCulture();
return ProcessWebSocketMessageReceived(result);
};
await using (connection.ConfigureAwait(false))
{
@@ -84,7 +89,7 @@ namespace Emby.Server.Implementations.HttpServer
/// Processes the web socket message received.
/// </summary>
/// <param name="result">The result.</param>
private Task ProcessWebSocketMessageReceived(WebSocketMessageInfo result)
private async Task ProcessWebSocketMessageReceived(WebSocketMessageInfo result)
{
var tasks = new Task[_webSocketListeners.Length];
for (var i = 0; i < _webSocketListeners.Length; ++i)
@@ -92,7 +97,7 @@ namespace Emby.Server.Implementations.HttpServer
tasks[i] = _webSocketListeners[i].ProcessMessageAsync(result);
}
return Task.WhenAll(tasks);
await Task.WhenAll(tasks).ConfigureAwait(false);
}
}
}
@@ -18,8 +18,8 @@ namespace Emby.Server.Implementations.IO
private readonly ILibraryManager _libraryManager;
private readonly IServerConfigurationManager _configurationManager;
private readonly List<string> _affectedPaths = new List<string>();
private readonly object _timerLock = new object();
private readonly List<string> _affectedPaths = new();
private readonly Lock _timerLock = new();
private Timer? _timer;
private bool _disposed;
@@ -130,7 +130,7 @@ namespace Emby.Server.Implementations.IO
private void ProcessPathChanges(List<string> paths)
{
IEnumerable<BaseItem> itemsToRefresh = paths
.Distinct(StringComparer.OrdinalIgnoreCase)
.Distinct()
.Select(GetAffectedBaseItem)
.Where(item => item is not null)
.DistinctBy(x => x!.Id)!; // Removed null values in the previous .Where()
@@ -21,6 +21,7 @@ namespace Emby.Server.Implementations.IO
private readonly ILibraryManager _libraryManager;
private readonly IServerConfigurationManager _configurationManager;
private readonly IFileSystem _fileSystem;
private readonly DotIgnoreIgnoreRule _dotIgnoreIgnoreRule;
/// <summary>
/// The file system watchers.
@@ -47,19 +48,23 @@ namespace Emby.Server.Implementations.IO
/// <param name="configurationManager">The configuration manager.</param>
/// <param name="fileSystem">The filesystem.</param>
/// <param name="appLifetime">The <see cref="IHostApplicationLifetime"/>.</param>
/// <param name="dotIgnoreIgnoreRule">The .ignore rule handler.</param>
public LibraryMonitor(
ILogger<LibraryMonitor> logger,
ILibraryManager libraryManager,
IServerConfigurationManager configurationManager,
IFileSystem fileSystem,
IHostApplicationLifetime appLifetime)
IHostApplicationLifetime appLifetime,
DotIgnoreIgnoreRule dotIgnoreIgnoreRule)
{
_libraryManager = libraryManager;
_logger = logger;
_configurationManager = configurationManager;
_fileSystem = fileSystem;
_dotIgnoreIgnoreRule = dotIgnoreIgnoreRule;
appLifetime.ApplicationStarted.Register(Start);
appLifetime.ApplicationStopping.Register(Stop);
}
/// <inheritdoc />
@@ -121,7 +126,7 @@ namespace Emby.Server.Implementations.IO
.Where(IsLibraryMonitorEnabled)
.OfType<Folder>()
.SelectMany(f => f.PhysicalLocations)
.Distinct(StringComparer.OrdinalIgnoreCase)
.Distinct()
.Order();
foreach (var path in paths)
@@ -314,6 +319,12 @@ namespace Emby.Server.Implementations.IO
var ex = e.GetException();
var dw = (FileSystemWatcher)sender;
if (ex is UnauthorizedAccessException unauthorizedAccessException)
{
_logger.LogError(unauthorizedAccessException, "Permission error for Directory watcher: {Path}", dw.Path);
return;
}
_logger.LogError(ex, "Error in Directory watcher for: {Path}", dw.Path);
DisposeWatcher(dw, true);
@@ -346,6 +357,12 @@ namespace Emby.Server.Implementations.IO
return;
}
var fileInfo = _fileSystem.GetFileSystemInfo(path);
if (_dotIgnoreIgnoreRule.ShouldIgnore(fileInfo, null))
{
return;
}
// Ignore certain files, If the parent of an ignored path has a change event, ignore that too
foreach (var i in _tempIgnoredPaths.Keys)
{
@@ -6,6 +6,7 @@ using System.Linq;
using System.Security;
using Jellyfin.Extensions;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using Microsoft.Extensions.Logging;
@@ -80,12 +81,14 @@ namespace Emby.Server.Implementations.IO
public virtual string MakeAbsolutePath(string folderPath, string filePath)
{
// path is actually a stream
if (string.IsNullOrWhiteSpace(filePath) || filePath.Contains("://", StringComparison.Ordinal))
if (string.IsNullOrWhiteSpace(filePath))
{
return filePath;
}
if (filePath.Length > 3 && filePath[1] == ':' && filePath[2] == '/')
var isAbsolutePath = Path.IsPathRooted(filePath) && (!OperatingSystem.IsWindows() || filePath[0] != '\\');
if (isAbsolutePath)
{
// absolute local path
return filePath;
@@ -97,17 +100,10 @@ namespace Emby.Server.Implementations.IO
return filePath;
}
var firstChar = filePath[0];
if (firstChar == '/')
{
// for this we don't really know
return filePath;
}
var filePathSpan = filePath.AsSpan();
// relative path
if (firstChar == '\\')
// relative path on windows
if (filePath[0] == '\\')
{
filePathSpan = filePathSpan.Slice(1);
}
@@ -154,6 +150,31 @@ namespace Emby.Server.Implementations.IO
}
}
/// <inheritdoc />
public void MoveDirectory(string source, string destination)
{
// Make sure parent directory of target exists
var parent = Directory.GetParent(destination);
parent?.Create();
try
{
Directory.Move(source, destination);
}
catch (IOException)
{
// Cross device move requires a copy
Directory.CreateDirectory(destination);
var sourceDir = new DirectoryInfo(source);
foreach (var file in sourceDir.EnumerateFiles())
{
file.CopyTo(Path.Combine(destination, file.Name), true);
}
sourceDir.Delete(true);
}
}
/// <summary>
/// Returns a <see cref="FileSystemMetadata"/> object for the specified file or directory path.
/// </summary>
@@ -232,40 +253,40 @@ namespace Emby.Server.Implementations.IO
{
result.IsDirectory = info is DirectoryInfo || (info.Attributes & FileAttributes.Directory) == FileAttributes.Directory;
// if (!result.IsDirectory)
// {
// result.IsHidden = (info.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden;
// }
if (info is FileInfo fileInfo)
{
result.Length = fileInfo.Length;
// Issue #2354 get the size of files behind symbolic links. Also Enum.HasFlag is bad as it boxes!
if ((fileInfo.Attributes & FileAttributes.ReparsePoint) == FileAttributes.ReparsePoint)
result.CreationTimeUtc = GetCreationTimeUtc(info);
result.LastWriteTimeUtc = GetLastWriteTimeUtc(info);
if (fileInfo.LinkTarget is not null)
{
try
{
using (var fileHandle = File.OpenHandle(fileInfo.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
var targetFileInfo = FileSystemHelper.ResolveLinkTarget(fileInfo, returnFinalTarget: true);
if (targetFileInfo is not null)
{
result.Length = RandomAccess.GetLength(fileHandle);
result.Exists = targetFileInfo.Exists;
if (result.Exists)
{
result.Length = targetFileInfo.Length;
result.CreationTimeUtc = GetCreationTimeUtc(targetFileInfo);
result.LastWriteTimeUtc = GetLastWriteTimeUtc(targetFileInfo);
}
}
else
{
result.Exists = false;
}
}
catch (FileNotFoundException ex)
{
// Dangling symlinks cannot be detected before opening the file unfortunately...
_logger.LogError(ex, "Reading the file size of the symlink at {Path} failed. Marking the file as not existing.", fileInfo.FullName);
result.Exists = false;
}
catch (UnauthorizedAccessException ex)
{
_logger.LogError(ex, "Reading the file at {Path} failed due to a permissions exception.", fileInfo.FullName);
}
}
else
{
result.Length = fileInfo.Length;
}
}
result.CreationTimeUtc = GetCreationTimeUtc(info);
result.LastWriteTimeUtc = GetLastWriteTimeUtc(info);
}
else
{
@@ -332,11 +353,7 @@ namespace Emby.Server.Implementations.IO
}
}
/// <summary>
/// Gets the creation time UTC.
/// </summary>
/// <param name="path">The path.</param>
/// <returns>DateTime.</returns>
/// <inheritdoc />
public virtual DateTime GetCreationTimeUtc(string path)
{
return GetCreationTimeUtc(GetFileSystemInfo(path));
@@ -373,11 +390,7 @@ namespace Emby.Server.Implementations.IO
}
}
/// <summary>
/// Gets the last write time UTC.
/// </summary>
/// <param name="path">The path.</param>
/// <returns>DateTime.</returns>
/// <inheritdoc />
public virtual DateTime GetLastWriteTimeUtc(string path)
{
return GetLastWriteTimeUtc(GetFileSystemInfo(path));
@@ -394,7 +407,7 @@ namespace Emby.Server.Implementations.IO
var info = new FileInfo(path);
if (info.Exists &&
((info.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden) != isHidden)
(info.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden != isHidden)
{
if (isHidden)
{
@@ -422,8 +435,8 @@ namespace Emby.Server.Implementations.IO
return;
}
if (((info.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) == readOnly
&& ((info.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden) == isHidden)
if ((info.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly == readOnly
&& (info.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden == isHidden)
{
return;
}
@@ -451,11 +464,7 @@ namespace Emby.Server.Implementations.IO
File.SetAttributes(path, attributes);
}
/// <summary>
/// Swaps the files.
/// </summary>
/// <param name="file1">The file1.</param>
/// <param name="file2">The file2.</param>
/// <inheritdoc />
public virtual void SwapFiles(string file1, string file2)
{
ArgumentException.ThrowIfNullOrEmpty(file1);
@@ -471,7 +480,7 @@ namespace Emby.Server.Implementations.IO
File.Copy(file1, temp1, true);
File.Copy(file2, file1, true);
File.Copy(temp1, file2, true);
File.Move(temp1, file2, true);
}
/// <inheritdoc />
@@ -488,8 +497,17 @@ namespace Emby.Server.Implementations.IO
/// <inheritdoc />
public virtual bool AreEqual(string path1, string path2)
{
return Path.TrimEndingDirectorySeparator(path1).Equals(
Path.TrimEndingDirectorySeparator(path2),
if (string.IsNullOrWhiteSpace(path1) || string.IsNullOrWhiteSpace(path2))
{
return false;
}
var normalized1 = Path.TrimEndingDirectorySeparator(path1);
var normalized2 = Path.TrimEndingDirectorySeparator(path2);
return string.Equals(
normalized1,
normalized2,
_isEnvironmentCaseInsensitive ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal);
}
@@ -531,8 +549,8 @@ namespace Emby.Server.Implementations.IO
return DriveInfo.GetDrives()
.Where(
d => (d.DriveType == DriveType.Fixed || d.DriveType == DriveType.Network || d.DriveType == DriveType.Removable)
&& d.IsReady
&& d.TotalSize != 0)
&& d.IsReady
&& d.TotalSize != 0)
.Select(d => new FileSystemMetadata
{
Name = d.Name,
@@ -550,22 +568,42 @@ namespace Emby.Server.Implementations.IO
/// <inheritdoc />
public virtual IEnumerable<FileSystemMetadata> GetFiles(string path, bool recursive = false)
{
return GetFiles(path, null, false, recursive);
return GetFiles(path, "*", recursive);
}
/// <inheritdoc />
public virtual IEnumerable<FileSystemMetadata> GetFiles(string path, IReadOnlyList<string>? extensions, bool enableCaseSensitiveExtensions, bool recursive = false)
public virtual IEnumerable<FileSystemMetadata> GetFiles(string path, string searchPattern, bool recursive = false)
{
return GetFiles(path, searchPattern, null, false, recursive);
}
/// <inheritdoc />
public virtual IEnumerable<FileSystemMetadata> GetFiles(string path, IReadOnlyList<string>? extensions, bool enableCaseSensitiveExtensions, bool recursive)
{
return GetFiles(path, "*", extensions, enableCaseSensitiveExtensions, recursive);
}
/// <inheritdoc />
public virtual IEnumerable<FileSystemMetadata> GetFiles(string path, string searchPattern, IReadOnlyList<string>? extensions, bool enableCaseSensitiveExtensions, bool recursive = false)
{
if (!Directory.Exists(path))
{
_logger.LogWarning("Directory does not exist: {Path}", path);
return [];
}
var enumerationOptions = GetEnumerationOptions(recursive);
// On linux and osx the search pattern is case sensitive
// On linux and macOS the search pattern is case-sensitive
// If we're OK with case-sensitivity, and we're only filtering for one extension, then use the native method
if ((enableCaseSensitiveExtensions || _isEnvironmentCaseInsensitive) && extensions is not null && extensions.Count == 1)
{
return ToMetadata(new DirectoryInfo(path).EnumerateFiles("*" + extensions[0], enumerationOptions));
searchPattern = searchPattern.EndsWith(extensions[0], StringComparison.Ordinal) ? searchPattern : searchPattern + extensions[0];
return ToMetadata(new DirectoryInfo(path).EnumerateFiles(searchPattern, enumerationOptions));
}
var files = new DirectoryInfo(path).EnumerateFiles("*", enumerationOptions);
var files = new DirectoryInfo(path).EnumerateFiles(searchPattern, enumerationOptions);
if (extensions is not null && extensions.Count > 0)
{
@@ -587,6 +625,9 @@ namespace Emby.Server.Implementations.IO
/// <inheritdoc />
public virtual IEnumerable<FileSystemMetadata> GetFileSystemEntries(string path, bool recursive = false)
{
// Note: any of unhandled exceptions thrown by this method may cause the caller to believe the whole path is not accessible.
// But what causing the exception may be a single file under that path. This could lead to unexpected behavior.
// For example, the scanner will remove everything in that path due to unhandled errors.
var directoryInfo = new DirectoryInfo(path);
var enumerationOptions = GetEnumerationOptions(recursive);
@@ -615,7 +656,7 @@ namespace Emby.Server.Implementations.IO
{
var enumerationOptions = GetEnumerationOptions(recursive);
// On linux and osx the search pattern is case sensitive
// On linux and macOS the search pattern is case-sensitive
// If we're OK with case-sensitivity, and we're only filtering for one extension, then use the native method
if ((enableCaseSensitiveExtensions || _isEnvironmentCaseInsensitive) && extensions is not null && extensions.Length == 1)
{
@@ -650,7 +691,7 @@ namespace Emby.Server.Implementations.IO
}
catch (Exception ex) when (ex is UnauthorizedAccessException or DirectoryNotFoundException or SecurityException)
{
_logger.LogError(ex, "Failed to enumerate path {Path}", path);
_logger.LogWarning("Failed to enumerate path \"{Path}\": {Message}", path, ex.Message);
return Enumerable.Empty<string>();
}
}
@@ -7,6 +7,7 @@ using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net.Mime;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Common.Configuration;
@@ -42,13 +43,11 @@ namespace Emby.Server.Implementations.Images
protected IImageProcessor ImageProcessor { get; set; }
protected virtual IReadOnlyCollection<ImageType> SupportedImages { get; }
= new ImageType[] { ImageType.Primary };
= [ImageType.Primary];
/// <inheritdoc />
public string Name => "Dynamic Image Provider";
protected virtual int MaxImageAgeDays => 7;
public int Order => 0;
protected virtual bool Supports(BaseItem item) => true;
@@ -116,9 +115,9 @@ namespace Emby.Server.Implementations.Images
var mimeType = MimeTypes.GetMimeType(outputPath);
if (string.Equals(mimeType, "application/octet-stream", StringComparison.OrdinalIgnoreCase))
if (string.Equals(mimeType, MediaTypeNames.Application.Octet, StringComparison.OrdinalIgnoreCase))
{
mimeType = "image/png";
mimeType = MediaTypeNames.Image.Png;
}
await ProviderManager.SaveImage(item, outputPath, mimeType, imageType, null, false, cancellationToken).ConfigureAwait(false);
@@ -268,22 +267,24 @@ namespace Emby.Server.Implementations.Images
{
var image = item.GetImageInfo(type, 0);
if (image is not null)
if (image is null)
{
if (!image.IsLocalFile)
{
return false;
}
return GetItemsWithImages(item).Count is not 0;
}
if (!FileSystem.ContainsSubPath(item.GetInternalMetadataPath(), image.Path))
{
return false;
}
if (!image.IsLocalFile)
{
return false;
}
if (!HasChangedByDate(item, image))
{
return false;
}
if (!FileSystem.ContainsSubPath(item.GetInternalMetadataPath(), image.Path))
{
return false;
}
if (!HasChangedByDate(item, image))
{
return false;
}
return true;
@@ -291,8 +292,14 @@ namespace Emby.Server.Implementations.Images
protected virtual bool HasChangedByDate(BaseItem item, ItemImageInfo image)
{
var age = DateTime.UtcNow - image.DateModified;
return age.TotalDays > MaxImageAgeDays;
var path = image.Path;
if (!string.IsNullOrEmpty(path))
{
var modificationDate = FileSystem.GetLastWriteTimeUtc(path);
return image.DateModified != modificationDate;
}
return false;
}
protected string CreateSingleImage(IEnumerable<BaseItem> itemsWithImages, string outputPathWithoutExtension, ImageType imageType)
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using Jellyfin.Data.Enums;
using Jellyfin.Database.Implementations.Enums;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.Drawing;
using MediaBrowser.Controller.Dto;
@@ -11,7 +12,6 @@ using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Querying;
namespace Emby.Server.Implementations.Images
{
@@ -33,12 +33,12 @@ namespace Emby.Server.Implementations.Images
Parent = item,
Recursive = true,
DtoOptions = new DtoOptions(true),
ImageTypes = new ImageType[] { ImageType.Primary },
OrderBy = new (ItemSortBy, SortOrder)[]
{
ImageTypes = [ImageType.Primary],
OrderBy =
[
(ItemSortBy.IsFolder, SortOrder.Ascending),
(ItemSortBy.SortName, SortOrder.Ascending)
},
],
Limit = 1
});
}
@@ -5,7 +5,9 @@
using System;
using System.Collections.Generic;
using System.IO;
using Jellyfin.Api.Extensions;
using Jellyfin.Data.Enums;
using Jellyfin.Database.Implementations.Enums;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.Drawing;
using MediaBrowser.Controller.Dto;
@@ -13,7 +15,6 @@ using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Querying;
namespace Emby.Server.Implementations.Images
{
@@ -27,51 +28,23 @@ namespace Emby.Server.Implementations.Images
{
var view = (CollectionFolder)item;
var viewType = view.CollectionType;
BaseItemKind[] includeItemTypes;
switch (viewType)
{
case CollectionType.movies:
includeItemTypes = new[] { BaseItemKind.Movie };
break;
case CollectionType.tvshows:
includeItemTypes = new[] { BaseItemKind.Series };
break;
case CollectionType.music:
includeItemTypes = new[] { BaseItemKind.MusicAlbum };
break;
case CollectionType.musicvideos:
includeItemTypes = new[] { BaseItemKind.MusicVideo };
break;
case CollectionType.books:
includeItemTypes = new[] { BaseItemKind.Book, BaseItemKind.AudioBook };
break;
case CollectionType.boxsets:
includeItemTypes = new[] { BaseItemKind.BoxSet };
break;
case CollectionType.homevideos:
case CollectionType.photos:
includeItemTypes = new[] { BaseItemKind.Video, BaseItemKind.Photo };
break;
default:
includeItemTypes = new[] { BaseItemKind.Video, BaseItemKind.Audio, BaseItemKind.Photo, BaseItemKind.Movie, BaseItemKind.Series };
break;
}
var includeItemTypes = DtoExtensions.GetBaseItemKindsForCollectionType(viewType);
var recursive = viewType != CollectionType.playlists;
if (viewType == CollectionType.music)
{
// Music albums usually don't have dedicated backdrops, so use artist instead
includeItemTypes = [BaseItemKind.MusicArtist];
}
return view.GetItemList(new InternalItemsQuery
{
CollapseBoxSetItems = false,
Recursive = recursive,
DtoOptions = new DtoOptions(false),
ImageTypes = new[] { ImageType.Primary },
ImageTypes = [ImageType.Primary],
Limit = 8,
OrderBy = new[]
{
(ItemSortBy.Random, SortOrder.Ascending)
},
OrderBy = [(ItemSortBy.Random, SortOrder.Ascending)],
IncludeItemTypes = includeItemTypes
});
}
@@ -97,5 +70,11 @@ namespace Emby.Server.Implementations.Images
return base.CreateImage(item, itemsWithImages, outputPath, imageType, imageIndex);
}
protected override bool HasChangedByDate(BaseItem item, ItemImageInfo image)
{
var age = DateTime.UtcNow - image.DateModified;
return age.TotalDays > 7;
}
}
}
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using Jellyfin.Data.Enums;
using Jellyfin.Database.Implementations.Enums;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.Drawing;
using MediaBrowser.Controller.Dto;
@@ -1,7 +1,10 @@
#pragma warning disable CS1591
using System.Collections.Generic;
using System.Linq;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.Drawing;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers;
@@ -15,5 +18,13 @@ namespace Emby.Server.Implementations.Images
: base(fileSystem, providerManager, applicationPaths, imageProcessor, libraryManager)
{
}
protected override IReadOnlyList<BaseItem> GetItemsWithImages(BaseItem item)
{
var items = base.GetItemsWithImages(item);
// Ignore any folders because they can have generated collages
return items.Where(i => i is not Folder).ToList();
}
}
}
@@ -4,6 +4,7 @@
using System.Collections.Generic;
using Jellyfin.Data.Enums;
using Jellyfin.Database.Implementations.Enums;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.Drawing;
using MediaBrowser.Controller.Dto;
@@ -37,46 +37,33 @@ namespace Emby.Server.Implementations.Library
return false;
}
// Don't ignore top level folders
if (fileInfo.IsDirectory && parent is AggregateFolder)
{
return false;
}
if (IgnorePatterns.ShouldIgnore(fileInfo.FullName))
{
return true;
}
var filename = fileInfo.Name;
// Don't ignore top level folders
if (fileInfo.IsDirectory
&& (parent is AggregateFolder || (parent?.IsTopParent ?? false)))
{
return false;
}
if (parent is null)
{
return false;
}
if (fileInfo.IsDirectory)
{
if (parent is not null)
{
// Ignore extras folders but allow it at the collection level
if (_namingOptions.AllExtrasTypesFolderNames.ContainsKey(filename)
&& parent is not AggregateFolder
&& parent is not UserRootFolder)
{
return true;
}
}
}
else
{
if (parent is not null)
{
// Don't resolve these into audio files
if (Path.GetFileNameWithoutExtension(filename.AsSpan()).Equals(BaseItem.ThemeSongFileName, StringComparison.Ordinal)
&& AudioFileParser.IsAudioFile(filename, _namingOptions))
{
return true;
}
}
// Ignore extras for unsupported types
return _namingOptions.AllExtrasTypesFolderNames.ContainsKey(fileInfo.Name)
&& parent is not UserRootFolder;
}
return false;
// Don't resolve theme songs
return Path.GetFileNameWithoutExtension(fileInfo.Name.AsSpan()).Equals(BaseItem.ThemeSongFileName, StringComparison.Ordinal)
&& AudioFileParser.IsAudioFile(fileInfo.Name, _namingOptions);
}
}
}
@@ -0,0 +1,339 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;
using BitFaster.Caching.Lru;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Resolvers;
using MediaBrowser.Model.IO;
namespace Emby.Server.Implementations.Library;
/// <summary>
/// Resolver rule class for ignoring files via .ignore.
/// </summary>
public class DotIgnoreIgnoreRule : IResolverIgnoreRule
{
private static readonly bool IsWindows = OperatingSystem.IsWindows();
private readonly FastConcurrentLru<string, IgnoreFileCacheEntry> _directoryCache;
private readonly FastConcurrentLru<string, ParsedIgnoreCacheEntry> _rulesCache;
/// <summary>
/// Initializes a new instance of the <see cref="DotIgnoreIgnoreRule"/> class.
/// </summary>
public DotIgnoreIgnoreRule()
{
var cacheSize = Math.Max(100, Environment.ProcessorCount * 100);
_directoryCache = new FastConcurrentLru<string, IgnoreFileCacheEntry>(
Environment.ProcessorCount,
cacheSize,
StringComparer.Ordinal);
_rulesCache = new FastConcurrentLru<string, ParsedIgnoreCacheEntry>(
Environment.ProcessorCount,
Math.Max(32, cacheSize / 4),
StringComparer.Ordinal);
}
/// <inheritdoc />
public bool ShouldIgnore(FileSystemMetadata fileInfo, BaseItem? parent) => IsIgnoredInternal(fileInfo, parent);
/// <summary>
/// Clears the directory lookup cache. The parsed rules cache is not cleared
/// as it validates file modification time on each access.
/// </summary>
public void ClearDirectoryCache()
{
_directoryCache.Clear();
}
/// <summary>
/// Checks whether or not the file is ignored.
/// </summary>
/// <param name="fileInfo">The file information.</param>
/// <param name="parent">The parent BaseItem.</param>
/// <returns>True if the file should be ignored.</returns>
public bool IsIgnoredInternal(FileSystemMetadata fileInfo, BaseItem? parent)
{
var searchDirectory = fileInfo.IsDirectory
? fileInfo.FullName
: Path.GetDirectoryName(fileInfo.FullName);
if (string.IsNullOrEmpty(searchDirectory))
{
return false;
}
var ignoreFile = FindIgnoreFileCached(searchDirectory);
if (ignoreFile is null)
{
return false;
}
var parsedEntry = GetParsedRules(ignoreFile);
if (parsedEntry is null)
{
// File was deleted after we cached the path - clear the directory cache entry and return false
_directoryCache.TryRemove(searchDirectory, out _);
return false;
}
// Empty file means ignore everything
if (parsedEntry.IsEmpty)
{
return true;
}
return parsedEntry.Rules.IsIgnored(GetPathToCheck(fileInfo.FullName, fileInfo.IsDirectory));
}
/// <summary>
/// Checks whether a path should be ignored based on an array of ignore rules.
/// </summary>
/// <param name="path">The path to check.</param>
/// <param name="rules">The array of ignore rules.</param>
/// <param name="isDirectory">Whether the path is a directory.</param>
/// <returns>True if the path should be ignored.</returns>
internal static bool CheckIgnoreRules(string path, string[] rules, bool isDirectory)
=> CheckIgnoreRules(path, rules, isDirectory, IsWindows);
/// <summary>
/// Checks whether a path should be ignored based on an array of ignore rules.
/// </summary>
/// <param name="path">The path to check.</param>
/// <param name="rules">The array of ignore rules.</param>
/// <param name="isDirectory">Whether the path is a directory.</param>
/// <param name="normalizePath">Whether to normalize backslashes to forward slashes (for Windows paths).</param>
/// <returns>True if the path should be ignored.</returns>
internal static bool CheckIgnoreRules(string path, string[] rules, bool isDirectory, bool normalizePath)
{
var ignore = new Ignore.Ignore();
// Add each rule individually to catch and skip invalid patterns
var validRulesAdded = 0;
foreach (var rule in rules)
{
try
{
ignore.Add(rule);
validRulesAdded++;
}
catch (RegexParseException)
{
// Ignore invalid patterns
}
}
// If no valid rules were added, fall back to ignoring everything (like an empty .ignore file)
if (validRulesAdded == 0)
{
return true;
}
// Mitigate the problem of the Ignore library not handling Windows paths correctly.
// See https://github.com/jellyfin/jellyfin/issues/15484
var pathToCheck = normalizePath ? path.NormalizePath('/') : path;
// Add trailing slash for directories to match "folder/"
if (isDirectory)
{
pathToCheck = string.Concat(pathToCheck.AsSpan().TrimEnd('/'), "/");
}
return ignore.IsIgnored(pathToCheck);
}
private FileInfo? FindIgnoreFileCached(string directory)
{
// Check if we have a cached result for this directory
if (_directoryCache.TryGet(directory, out var cached))
{
return cached.IgnoreFileDirectory is null
? null
: new FileInfo(Path.Join(cached.IgnoreFileDirectory, ".ignore"));
}
DirectoryInfo startDir;
try
{
startDir = new DirectoryInfo(directory);
}
catch (ArgumentException)
{
return null;
}
// Walk up the directory tree to find .ignore file using DirectoryInfo.Parent
var checkedDirs = new List<string> { directory };
for (var current = startDir; current is not null; current = current.Parent)
{
var currentPath = current.FullName;
// Check if this intermediate directory is cached
if (current != startDir && _directoryCache.TryGet(currentPath, out var parentCached))
{
// Cache the result for all directories we checked
var entry = new IgnoreFileCacheEntry(parentCached.IgnoreFileDirectory);
foreach (var dir in checkedDirs)
{
_directoryCache.AddOrUpdate(dir, entry);
}
return parentCached.IgnoreFileDirectory is null
? null
: new FileInfo(Path.Join(parentCached.IgnoreFileDirectory, ".ignore"));
}
var ignoreFile = new FileInfo(Path.Join(currentPath, ".ignore"));
if (ignoreFile.Exists)
{
// Cache for all directories we checked
var entry = new IgnoreFileCacheEntry(currentPath);
foreach (var dir in checkedDirs)
{
_directoryCache.AddOrUpdate(dir, entry);
}
return ignoreFile;
}
if (current != startDir)
{
checkedDirs.Add(currentPath);
}
}
// No .ignore file found - cache null result for all directories
var nullEntry = new IgnoreFileCacheEntry((string?)null);
foreach (var dir in checkedDirs)
{
_directoryCache.AddOrUpdate(dir, nullEntry);
}
return null;
}
private ParsedIgnoreCacheEntry? GetParsedRules(FileInfo ignoreFile)
{
if (!ignoreFile.Exists)
{
_rulesCache.TryRemove(ignoreFile.FullName, out _);
return null;
}
var lastModified = ignoreFile.LastWriteTimeUtc;
var fileLength = ignoreFile.Length;
var key = ignoreFile.FullName;
// Check cache
if (_rulesCache.TryGet(key, out var cached))
{
if (cached.FileLastModified == lastModified && cached.FileLength == fileLength)
{
return cached;
}
// Stale - need to reparse
_rulesCache.TryRemove(key, out _);
}
// Parse the file
var parsedEntry = ParseIgnoreFile(ignoreFile, lastModified, fileLength);
_rulesCache.AddOrUpdate(key, parsedEntry);
return parsedEntry;
}
private static ParsedIgnoreCacheEntry ParseIgnoreFile(FileInfo ignoreFile, DateTime lastModified, long fileLength)
{
if (ignoreFile.LinkTarget is null && fileLength == 0)
{
return new ParsedIgnoreCacheEntry
{
Rules = new Ignore.Ignore(),
FileLastModified = lastModified,
FileLength = fileLength,
IsEmpty = true
};
}
// Resolve symlinks
var resolvedFile = FileSystemHelper.ResolveLinkTarget(ignoreFile, returnFinalTarget: true) ?? ignoreFile;
if (!resolvedFile.Exists)
{
return new ParsedIgnoreCacheEntry
{
Rules = new Ignore.Ignore(),
FileLastModified = lastModified,
FileLength = fileLength,
IsEmpty = true
};
}
var content = File.ReadAllText(resolvedFile.FullName);
if (string.IsNullOrWhiteSpace(content))
{
return new ParsedIgnoreCacheEntry
{
Rules = new Ignore.Ignore(),
FileLastModified = lastModified,
FileLength = fileLength,
IsEmpty = true
};
}
var rules = content.Split('\n', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
var ignore = new Ignore.Ignore();
var validRulesAdded = 0;
foreach (var rule in rules)
{
try
{
ignore.Add(rule);
validRulesAdded++;
}
catch (RegexParseException)
{
// Ignore invalid patterns
}
}
// No valid rules means treat as empty (ignore all)
return new ParsedIgnoreCacheEntry
{
Rules = ignore,
FileLastModified = lastModified,
FileLength = fileLength,
IsEmpty = validRulesAdded == 0
};
}
private static string GetPathToCheck(string path, bool isDirectory)
{
// Normalize Windows paths
var pathToCheck = IsWindows ? path.NormalizePath('/') : path;
// Add trailing slash for directories to match "folder/"
if (isDirectory)
{
pathToCheck = string.Concat(pathToCheck.AsSpan().TrimEnd('/'), "/");
}
return pathToCheck;
}
private readonly record struct IgnoreFileCacheEntry(string? IgnoreFileDirectory);
private sealed class ParsedIgnoreCacheEntry
{
public required Ignore.Ignore Rules { get; init; }
public required DateTime FileLastModified { get; init; }
public required long FileLength { get; init; }
public required bool IsEmpty { get; init; }
}
}
@@ -0,0 +1,83 @@
using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Controller.Chapters;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.MediaSegments;
using MediaBrowser.Controller.Trickplay;
using Microsoft.Extensions.Logging;
namespace Emby.Server.Implementations.Library;
/// <summary>
/// IExternalDataManager implementation.
/// </summary>
public class ExternalDataManager : IExternalDataManager
{
private readonly IKeyframeManager _keyframeManager;
private readonly IMediaSegmentManager _mediaSegmentManager;
private readonly IPathManager _pathManager;
private readonly ITrickplayManager _trickplayManager;
private readonly IChapterManager _chapterManager;
private readonly ILogger<ExternalDataManager> _logger;
/// <summary>
/// Initializes a new instance of the <see cref="ExternalDataManager"/> class.
/// </summary>
/// <param name="keyframeManager">The keyframe manager.</param>
/// <param name="mediaSegmentManager">The media segment manager.</param>
/// <param name="pathManager">The path manager.</param>
/// <param name="trickplayManager">The trickplay manager.</param>
/// <param name="chapterManager">The chapter manager.</param>
/// <param name="logger">The logger.</param>
public ExternalDataManager(
IKeyframeManager keyframeManager,
IMediaSegmentManager mediaSegmentManager,
IPathManager pathManager,
ITrickplayManager trickplayManager,
IChapterManager chapterManager,
ILogger<ExternalDataManager> logger)
{
_keyframeManager = keyframeManager;
_mediaSegmentManager = mediaSegmentManager;
_pathManager = pathManager;
_trickplayManager = trickplayManager;
_chapterManager = chapterManager;
_logger = logger;
}
/// <inheritdoc/>
public async Task DeleteExternalItemDataAsync(BaseItem item, CancellationToken cancellationToken)
{
DeleteExternalItemFiles(item);
var itemId = item.Id;
await _keyframeManager.DeleteKeyframeDataAsync(itemId, cancellationToken).ConfigureAwait(false);
await _mediaSegmentManager.DeleteSegmentsAsync(itemId, cancellationToken).ConfigureAwait(false);
await _trickplayManager.DeleteTrickplayDataAsync(itemId, cancellationToken).ConfigureAwait(false);
await _chapterManager.DeleteChapterDataAsync(itemId, cancellationToken).ConfigureAwait(false);
}
/// <inheritdoc/>
public void DeleteExternalItemFiles(BaseItem item)
{
foreach (var path in _pathManager.GetExtractedDataPaths(item))
{
if (!Directory.Exists(path))
{
continue;
}
try
{
Directory.Delete(path, true);
}
catch (Exception ex)
{
_logger.LogWarning("Unable to prune external item data at {Path}: {Exception}", path, ex);
}
}
}
}
@@ -1,5 +1,4 @@
using System;
using System.Linq;
using DotNet.Globbing;
namespace Emby.Server.Implementations.Library
@@ -32,6 +31,20 @@ namespace Emby.Server.Implementations.Library
"**/*.sample.?????",
"**/sample/*",
// Avoid adding Hungarian sample files
// https://github.com/jellyfin/jellyfin/issues/16237
"**/minta.?",
"**/minta.??",
"**/minta.???", // Matches minta.mkv
"**/minta.????", // Matches minta.webm
"**/minta.?????",
"**/*.minta.?",
"**/*.minta.??",
"**/*.minta.???",
"**/*.minta.????",
"**/*.minta.?????",
"**/minta/*",
// Directories
"**/metadata/**",
"**/metadata",
@@ -49,6 +62,16 @@ namespace Emby.Server.Implementations.Library
"**/.wd_tv",
"**/lost+found/**",
"**/lost+found",
"**/subs/**",
"**/subs",
"**/.snapshots/**",
"**/.snapshots",
"**/.snapshot/**",
"**/.snapshot",
// Trickplay files
"**/*.trickplay",
"**/*.trickplay/**",
// WMC temp recording directories that will constantly be written to
"**/TempRec/**",
@@ -0,0 +1,44 @@
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Jellyfin.MediaEncoding.Keyframes;
using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Persistence;
namespace Emby.Server.Implementations.Library;
/// <summary>
/// Manager for Keyframe data.
/// </summary>
public class KeyframeManager : IKeyframeManager
{
private readonly IKeyframeRepository _repository;
/// <summary>
/// Initializes a new instance of the <see cref="KeyframeManager"/> class.
/// </summary>
/// <param name="repository">The keyframe repository.</param>
public KeyframeManager(IKeyframeRepository repository)
{
_repository = repository;
}
/// <inheritdoc />
public IReadOnlyList<KeyframeData> GetKeyframeData(Guid itemId)
{
return _repository.GetKeyframeData(itemId);
}
/// <inheritdoc />
public async Task SaveKeyframeDataAsync(Guid itemId, KeyframeData data, CancellationToken cancellationToken)
{
await _repository.SaveKeyframeDataAsync(itemId, data, cancellationToken).ConfigureAwait(false);
}
/// <inheritdoc />
public async Task DeleteKeyframeDataAsync(Guid itemId, CancellationToken cancellationToken)
{
await _repository.DeleteKeyframeDataAsync(itemId, cancellationToken).ConfigureAwait(false);
}
}
File diff suppressed because it is too large Load Diff
@@ -5,6 +5,7 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Globalization;
using System.IO;
using System.Linq;
@@ -12,14 +13,18 @@ using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using AsyncKeyedLock;
using Jellyfin.Data.Entities;
using Jellyfin.Data;
using Jellyfin.Data.Enums;
using Jellyfin.Database.Implementations.Entities;
using Jellyfin.Database.Implementations.Enums;
using Jellyfin.Extensions;
using Jellyfin.Extensions.Json;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.Extensions;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.LiveTv;
using MediaBrowser.Controller.MediaEncoding;
@@ -38,7 +43,7 @@ namespace Emby.Server.Implementations.Library
public class MediaSourceManager : IMediaSourceManager, IDisposable
{
// Do not use a pipe here because Roku http requests to the server will fail, without any explicit error message.
private const char LiveStreamIdDelimeter = '_';
private const char LiveStreamIdDelimiter = '_';
private readonly IServerApplicationHost _appHost;
private readonly IItemRepository _itemRepo;
@@ -51,7 +56,8 @@ namespace Emby.Server.Implementations.Library
private readonly ILocalizationManager _localizationManager;
private readonly IApplicationPaths _appPaths;
private readonly IDirectoryService _directoryService;
private readonly IMediaStreamRepository _mediaStreamRepository;
private readonly IMediaAttachmentRepository _mediaAttachmentRepository;
private readonly ConcurrentDictionary<string, ILiveStream> _openStreams = new ConcurrentDictionary<string, ILiveStream>(StringComparer.OrdinalIgnoreCase);
private readonly AsyncNonKeyedLocker _liveStreamLocker = new(1);
private readonly JsonSerializerOptions _jsonOptions = JsonDefaults.Options;
@@ -69,7 +75,9 @@ namespace Emby.Server.Implementations.Library
IFileSystem fileSystem,
IUserDataManager userDataManager,
IMediaEncoder mediaEncoder,
IDirectoryService directoryService)
IDirectoryService directoryService,
IMediaStreamRepository mediaStreamRepository,
IMediaAttachmentRepository mediaAttachmentRepository)
{
_appHost = appHost;
_itemRepo = itemRepo;
@@ -82,6 +90,8 @@ namespace Emby.Server.Implementations.Library
_localizationManager = localizationManager;
_appPaths = applicationPaths;
_directoryService = directoryService;
_mediaStreamRepository = mediaStreamRepository;
_mediaAttachmentRepository = mediaAttachmentRepository;
}
public void AddParts(IEnumerable<IMediaSourceProvider> providers)
@@ -89,9 +99,9 @@ namespace Emby.Server.Implementations.Library
_providers = providers.ToArray();
}
public List<MediaStream> GetMediaStreams(MediaStreamQuery query)
public IReadOnlyList<MediaStream> GetMediaStreams(MediaStreamQuery query)
{
var list = _itemRepo.GetMediaStreams(query);
var list = _mediaStreamRepository.GetMediaStreams(query);
foreach (var stream in list)
{
@@ -113,10 +123,20 @@ namespace Emby.Server.Implementations.Library
return true;
}
if (stream.IsPgsSubtitleStream)
{
return true;
}
if (stream.IsVobSubSubtitleStream)
{
return true;
}
return false;
}
public List<MediaStream> GetMediaStreams(Guid itemId)
public IReadOnlyList<MediaStream> GetMediaStreams(Guid itemId)
{
var list = GetMediaStreams(new MediaStreamQuery
{
@@ -126,7 +146,7 @@ namespace Emby.Server.Implementations.Library
return GetMediaStreamsForItem(list);
}
private List<MediaStream> GetMediaStreamsForItem(List<MediaStream> streams)
private IReadOnlyList<MediaStream> GetMediaStreamsForItem(IReadOnlyList<MediaStream> streams)
{
foreach (var stream in streams)
{
@@ -140,13 +160,13 @@ namespace Emby.Server.Implementations.Library
}
/// <inheritdoc />
public List<MediaAttachment> GetMediaAttachments(MediaAttachmentQuery query)
public IReadOnlyList<MediaAttachment> GetMediaAttachments(MediaAttachmentQuery query)
{
return _itemRepo.GetMediaAttachments(query);
return _mediaAttachmentRepository.GetMediaAttachments(query);
}
/// <inheritdoc />
public List<MediaAttachment> GetMediaAttachments(Guid itemId)
public IReadOnlyList<MediaAttachment> GetMediaAttachments(Guid itemId)
{
return GetMediaAttachments(new MediaAttachmentQuery
{
@@ -154,9 +174,10 @@ namespace Emby.Server.Implementations.Library
});
}
public async Task<List<MediaSourceInfo>> GetPlaybackMediaSources(BaseItem item, User user, bool allowMediaProbe, bool enablePathSubstitution, CancellationToken cancellationToken)
public async Task<IReadOnlyList<MediaSourceInfo>> GetPlaybackMediaSources(BaseItem item, User user, bool allowMediaProbe, bool enablePathSubstitution, CancellationToken cancellationToken)
{
var mediaSources = GetStaticMediaSources(item, enablePathSubstitution, user);
ResolveSymlinkPaths(mediaSources, enablePathSubstitution);
// If file is strm or main media stream is missing, force a metadata refresh with remote probing
if (allowMediaProbe && mediaSources[0].Type != MediaSourceType.Placeholder
@@ -173,6 +194,7 @@ namespace Emby.Server.Implementations.Library
cancellationToken).ConfigureAwait(false);
mediaSources = GetStaticMediaSources(item, enablePathSubstitution, user);
ResolveSymlinkPaths(mediaSources, enablePathSubstitution);
}
var dynamicMediaSources = await GetDynamicMediaSources(item, cancellationToken).ConfigureAwait(false);
@@ -207,12 +229,21 @@ namespace Emby.Server.Implementations.Library
list.Add(source);
}
return SortMediaSources(list);
var preferredId = mediaSources.Count > 0 && Guid.TryParse(mediaSources[0].Id, out var topSourceId)
? topSourceId
: item.Id;
return SortMediaSources(list, preferredId).ToArray();
}
/// <inheritdoc />>
public MediaProtocol GetPathProtocol(string path)
{
if (string.IsNullOrEmpty(path))
{
return MediaProtocol.File;
}
if (path.StartsWith("Rtsp", StringComparison.OrdinalIgnoreCase))
{
return MediaProtocol.Rtsp;
@@ -300,9 +331,31 @@ namespace Emby.Server.Implementations.Library
}
}
/// <summary>
/// Resolves symlinked file paths on the supplied sources to the real on-disk target.
/// Skipped when <paramref name="enablePathSubstitution"/> is set because the path may
/// already have been rewritten to a UNC/URL meant for the client to consume directly.
/// </summary>
private static void ResolveSymlinkPaths(IReadOnlyList<MediaSourceInfo> sources, bool enablePathSubstitution)
{
if (enablePathSubstitution)
{
return;
}
foreach (var source in sources)
{
if (source.Protocol == MediaProtocol.File
&& FileSystemHelper.ResolveLinkTarget(source.Path, returnFinalTarget: true) is { Exists: true } target)
{
source.Path = target.FullName;
}
}
}
private static void SetKeyProperties(IMediaSourceProvider provider, MediaSourceInfo mediaSource)
{
var prefix = provider.GetType().FullName.GetMD5().ToString("N", CultureInfo.InvariantCulture) + LiveStreamIdDelimeter;
var prefix = provider.GetType().FullName.GetMD5().ToString("N", CultureInfo.InvariantCulture) + LiveStreamIdDelimiter;
if (!string.IsNullOrEmpty(mediaSource.OpenToken) && !mediaSource.OpenToken.StartsWith(prefix, StringComparison.OrdinalIgnoreCase))
{
@@ -327,7 +380,7 @@ namespace Emby.Server.Implementations.Library
return sources.FirstOrDefault(i => string.Equals(i.Id, mediaSourceId, StringComparison.OrdinalIgnoreCase));
}
public List<MediaSourceInfo> GetStaticMediaSources(BaseItem item, bool enablePathSubstitution, User user = null)
public IReadOnlyList<MediaSourceInfo> GetStaticMediaSources(BaseItem item, bool enablePathSubstitution, User user = null)
{
ArgumentNullException.ThrowIfNull(item);
@@ -337,6 +390,12 @@ namespace Emby.Server.Implementations.Library
if (user is not null)
{
sources = sources
.Where(source => !Guid.TryParse(source.Id, out var sourceId)
|| sourceId.Equals(item.Id)
|| _libraryManager.GetItemById<BaseItem>(sourceId, user) is not null)
.ToArray();
foreach (var source in sources)
{
SetDefaultAudioAndSubtitleStreamIndices(item, source, user);
@@ -351,6 +410,59 @@ namespace Emby.Server.Implementations.Library
source.SupportsDirectStream = user.HasPermission(PermissionKind.EnablePlaybackRemuxing);
}
}
sources = SetAlternateVersionResumeStates(item, sources, user);
}
return sources;
}
/// <summary>
/// When the queried item is a primary, moves the most recently played version to the front so
/// that resuming without an explicit source selection plays the version that was last watched.
/// A directly queried alternate version keeps its own source first. Per-user playback position
/// is not surfaced on the source itself; it is carried by each version's own UserData.
/// </summary>
/// <param name="item">The queried item.</param>
/// <param name="sources">The item's media sources.</param>
/// <param name="user">The user.</param>
/// <returns>The media sources, reordered when a version drives resume.</returns>
private IReadOnlyList<MediaSourceInfo> SetAlternateVersionResumeStates(BaseItem item, IReadOnlyList<MediaSourceInfo> sources, User user)
{
// For a video, multiple sources means alternate versions.
if (item is not Video video || sources.Count < 2)
{
return sources;
}
var versions = video.GetAllVersions();
if (versions.Count < 2)
{
return sources;
}
var userDataByVersion = _userDataManager.GetUserDataBatch(versions, user);
var dataBySourceId = new Dictionary<string, UserItemData>(versions.Count, StringComparer.OrdinalIgnoreCase);
foreach (var version in versions)
{
if (userDataByVersion.TryGetValue(version.Id, out var data))
{
dataBySourceId[version.Id.ToString("N", CultureInfo.InvariantCulture)] = data;
}
}
// Reorder only for a resumable (in-progress) version;
// a completed version has no position to resume, so it must not be pulled to the front here.
var resumeSource = VersionPlaybackSelector.SelectMostRecentlyPlayed(
sources,
source => source.Id is not null ? dataBySourceId.GetValueOrDefault(source.Id) : null,
data => data.PlaybackPositionTicks > 0);
if (resumeSource is not null && !video.PrimaryVersionId.HasValue && !ReferenceEquals(sources[0], resumeSource))
{
var reordered = new List<MediaSourceInfo>(sources.Count) { resumeSource };
reordered.AddRange(sources.Where(s => !ReferenceEquals(s, resumeSource)));
return reordered;
}
return sources;
@@ -366,7 +478,7 @@ namespace Emby.Server.Implementations.Library
var culture = _localizationManager.FindLanguageInfo(language);
if (culture is not null)
{
return culture.ThreeLetterISOLanguageNames;
return culture.Name.Contains('-', StringComparison.OrdinalIgnoreCase) ? [culture.Name] : culture.ThreeLetterISOLanguageNames;
}
return [language];
@@ -374,7 +486,8 @@ namespace Emby.Server.Implementations.Library
private void SetDefaultSubtitleStreamIndex(MediaSourceInfo source, UserItemData userData, User user, bool allowRememberingSelection)
{
if (userData.SubtitleStreamIndex.HasValue
if (userData is not null
&& userData.SubtitleStreamIndex.HasValue
&& user.RememberSubtitleSelections
&& user.SubtitleMode != SubtitlePlaybackMode.None
&& allowRememberingSelection)
@@ -404,22 +517,63 @@ namespace Emby.Server.Implementations.Library
MediaStreamSelector.SetSubtitleStreamScores(source.MediaStreams, preferredSubs, user.SubtitleMode, audioLanguage);
}
private void SetDefaultAudioStreamIndex(MediaSourceInfo source, UserItemData userData, User user, bool allowRememberingSelection)
private void SetDefaultAudioStreamIndex(MediaSourceInfo source, UserItemData userData, User user, bool allowRememberingSelection, string originalLanguage)
{
if (userData.AudioStreamIndex.HasValue && user.RememberAudioSelections && allowRememberingSelection)
if (userData is not null && userData.AudioStreamIndex.HasValue && user.RememberAudioSelections && allowRememberingSelection)
{
var index = userData.AudioStreamIndex.Value;
// Make sure the saved index is still valid
if (source.MediaStreams.Any(i => i.Type == MediaStreamType.Audio && i.Index == index))
{
source.DefaultAudioStreamIndex = index;
source.DefaultAudioIndexSource = AudioIndexSource.User;
return;
}
}
var preferredAudio = NormalizeLanguage(user.AudioLanguagePreference);
if (string.Equals(user.AudioLanguagePreference, "OriginalLanguage", StringComparison.OrdinalIgnoreCase))
{
if (user.PlayDefaultAudioTrack)
{
source.DefaultAudioStreamIndex = MediaStreamSelector.GetDefaultAudioStreamIndex(
source.MediaStreams,
NormalizeLanguage(originalLanguage),
user.PlayDefaultAudioTrack);
return;
}
var originalIndex = source.MediaStreams.FindIndex(i => i.Type == MediaStreamType.Audio && i.IsOriginal);
if (!string.IsNullOrWhiteSpace(originalLanguage) && originalIndex != -1)
{
var mediaLanguageOriginal = source.MediaStreams[originalIndex].Language;
if (NormalizeLanguage(mediaLanguageOriginal).Contains(NormalizeLanguage(originalLanguage).FirstOrDefault()))
{
source.DefaultAudioStreamIndex = originalIndex;
return;
}
}
else if (originalIndex != -1)
{
source.DefaultAudioStreamIndex = originalIndex;
return;
}
}
var preferredAudio = string.Equals(user.AudioLanguagePreference, "OriginalLanguage", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrWhiteSpace(originalLanguage)
? NormalizeLanguage(originalLanguage)
: NormalizeLanguage(user.AudioLanguagePreference);
source.DefaultAudioStreamIndex = MediaStreamSelector.GetDefaultAudioStreamIndex(source.MediaStreams, preferredAudio, user.PlayDefaultAudioTrack);
if (user.PlayDefaultAudioTrack)
{
source.DefaultAudioIndexSource |= AudioIndexSource.Default;
}
if (preferredAudio.Count > 0)
{
source.DefaultAudioIndexSource |= AudioIndexSource.Language;
}
}
public void SetDefaultAudioAndSubtitleStreamIndices(BaseItem item, MediaSourceInfo source, User user)
@@ -429,11 +583,13 @@ namespace Emby.Server.Implementations.Library
if (mediaType == MediaType.Video)
{
var userData = item is null ? new UserItemData() : _userDataManager.GetUserData(user, item);
var userData = item is null ? null : _userDataManager.GetUserData(user, item);
var allowRememberingSelection = item is null || item.EnableRememberingTrackSelections;
SetDefaultAudioStreamIndex(source, userData, user, allowRememberingSelection);
var originalLanguage = item?.GetInheritedOriginalLanguage();
SetDefaultAudioStreamIndex(source, userData, user, allowRememberingSelection, originalLanguage);
SetDefaultSubtitleStreamIndex(source, userData, user, allowRememberingSelection);
}
else if (mediaType == MediaType.Audio)
@@ -447,25 +603,32 @@ namespace Emby.Server.Implementations.Library
}
}
private static List<MediaSourceInfo> SortMediaSources(IEnumerable<MediaSourceInfo> sources)
private static IEnumerable<MediaSourceInfo> SortMediaSources(IEnumerable<MediaSourceInfo> sources, Guid preferredItemId = default)
{
return sources.OrderBy(i =>
{
if (i.VideoType.HasValue && i.VideoType.Value == VideoType.VideoFile)
// The source belonging to the queried item sorts first so it stays the default that gets played.
var preferredId = preferredItemId.IsEmpty()
? null
: preferredItemId.ToString("N", CultureInfo.InvariantCulture);
return sources
.OrderByDescending(i => preferredId is not null && string.Equals(i.Id, preferredId, StringComparison.OrdinalIgnoreCase))
.ThenBy(i =>
{
return 0;
}
if (i.VideoType.HasValue && i.VideoType.Value == VideoType.VideoFile)
{
return 0;
}
return 1;
}).ThenBy(i => i.Video3DFormat.HasValue ? 1 : 0)
.ThenByDescending(i =>
{
var stream = i.VideoStream;
return 1;
})
.ThenBy(i => i.Video3DFormat.HasValue ? 1 : 0)
.ThenByDescending(i =>
{
var stream = i.VideoStream;
return stream?.Width ?? 0;
})
.Where(i => i.Type != MediaSourceType.Placeholder)
.ToList();
return stream?.Width ?? 0;
})
.Where(i => i.Type != MediaSourceType.Placeholder);
}
public async Task<Tuple<LiveStreamResponse, IDirectStreamProvider>> OpenLiveStreamInternal(LiveStreamRequest request, CancellationToken cancellationToken)
@@ -634,7 +797,7 @@ namespace Emby.Server.Implementations.Library
}
catch (Exception ex)
{
_logger.LogDebug(ex, "_jsonSerializer.DeserializeFromFile threw an exception.");
_logger.LogDebug(ex, "Error parsing cached media info.");
}
finally
{
@@ -658,17 +821,17 @@ namespace Emby.Server.Implementations.Library
mediaInfo = await _mediaEncoder.GetMediaInfo(
new MediaInfoRequest
{
MediaSource = mediaSource,
MediaType = isAudio ? DlnaProfileType.Audio : DlnaProfileType.Video,
ExtractChapters = false
},
{
MediaSource = mediaSource,
MediaType = isAudio ? DlnaProfileType.Audio : DlnaProfileType.Video,
ExtractChapters = false
},
cancellationToken).ConfigureAwait(false);
if (cacheFilePath is not null)
{
Directory.CreateDirectory(Path.GetDirectoryName(cacheFilePath));
FileStream createStream = File.Create(cacheFilePath);
FileStream createStream = AsyncFile.Create(cacheFilePath);
await using (createStream.ConfigureAwait(false))
{
await JsonSerializer.SerializeAsync(createStream, mediaInfo, _jsonOptions, cancellationToken).ConfigureAwait(false);
@@ -771,9 +934,13 @@ namespace Emby.Server.Implementations.Library
{
ArgumentException.ThrowIfNullOrEmpty(id);
// TODO probably shouldn't throw here but it is kept for "backwards compatibility"
var info = GetLiveStreamInfo(id) ?? throw new ResourceNotFoundException();
return Task.FromResult(new Tuple<MediaSourceInfo, IDirectStreamProvider>(info.MediaSource, info as IDirectStreamProvider));
var info = GetLiveStreamInfo(id);
if (info is null)
{
return Task.FromResult<Tuple<MediaSourceInfo, IDirectStreamProvider>>(new Tuple<MediaSourceInfo, IDirectStreamProvider>(null, null));
}
return Task.FromResult<Tuple<MediaSourceInfo, IDirectStreamProvider>>(new Tuple<MediaSourceInfo, IDirectStreamProvider>(info.MediaSource, info as IDirectStreamProvider));
}
public ILiveStream GetLiveStreamInfo(string id)
@@ -800,7 +967,7 @@ namespace Emby.Server.Implementations.Library
return result.Item1;
}
public async Task<List<MediaSourceInfo>> GetRecordingStreamMediaSources(ActiveRecordingInfo info, CancellationToken cancellationToken)
public async Task<IReadOnlyList<MediaSourceInfo>> GetRecordingStreamMediaSources(ActiveRecordingInfo info, CancellationToken cancellationToken)
{
var stream = new MediaSourceInfo
{
@@ -823,10 +990,7 @@ namespace Emby.Server.Implementations.Library
await new LiveStreamHelper(_mediaEncoder, _logger, _appPaths)
.AddMediaInfoWithProbe(stream, false, false, cancellationToken).ConfigureAwait(false);
return new List<MediaSourceInfo>
{
stream
};
return [stream];
}
public async Task CloseLiveStream(string id)
@@ -858,11 +1022,11 @@ namespace Emby.Server.Implementations.Library
{
ArgumentException.ThrowIfNullOrEmpty(key);
var keys = key.Split(LiveStreamIdDelimeter, 2);
var keys = key.Split(LiveStreamIdDelimiter, 2);
var provider = _providers.FirstOrDefault(i => string.Equals(i.GetType().FullName.GetMD5().ToString("N", CultureInfo.InvariantCulture), keys[0], StringComparison.OrdinalIgnoreCase));
var splitIndex = key.IndexOf(LiveStreamIdDelimeter, StringComparison.Ordinal);
var splitIndex = key.IndexOf(LiveStreamIdDelimiter, StringComparison.Ordinal);
var keyId = key.Substring(splitIndex + 1);
return (provider, keyId);
@@ -3,7 +3,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Jellyfin.Data.Enums;
using Jellyfin.Database.Implementations.Enums;
using Jellyfin.Extensions;
using MediaBrowser.Model.Entities;
@@ -39,46 +39,48 @@ namespace Emby.Server.Implementations.Library
return null;
}
// Sort in the following order: Default > No tag > Forced
var sortedStreams = streams
.Where(i => i.Type == MediaStreamType.Subtitle)
.OrderByDescending(x => x.IsExternal)
.ThenByDescending(x => x.IsForced && string.Equals(x.Language, audioTrackLanguage, StringComparison.OrdinalIgnoreCase))
.ThenByDescending(x => x.IsForced)
.ThenByDescending(x => x.IsDefault)
.ThenByDescending(x => preferredLanguages.Contains(x.Language, StringComparison.OrdinalIgnoreCase))
.ThenByDescending(x => !x.IsForced && MatchesPreferredLanguage(x.Language, preferredLanguages))
.ThenByDescending(x => x.IsForced && MatchesPreferredLanguage(x.Language, preferredLanguages))
.ThenByDescending(x => x.IsForced && IsLanguageUndefined(x.Language))
.ThenByDescending(x => x.IsForced)
.ToList();
MediaStream? stream = null;
if (mode == SubtitlePlaybackMode.Default)
{
// Load subtitles according to external, forced and default flags.
stream = sortedStreams.FirstOrDefault(x => x.IsExternal || x.IsForced || x.IsDefault);
// Load subtitles according to external, default and forced flags.
stream = sortedStreams.FirstOrDefault(x => x.IsExternal || x.IsDefault || x.IsForced);
}
else if (mode == SubtitlePlaybackMode.Smart)
{
// Only attempt to load subtitles if the audio language is not one of the user's preferred subtitle languages.
// If no subtitles of preferred language available, use default behaviour.
// If no subtitles of preferred language available, use none.
// If the audio language is one of the user's preferred subtitle languages behave like OnlyForced.
if (!preferredLanguages.Contains(audioTrackLanguage, StringComparison.OrdinalIgnoreCase))
{
stream = sortedStreams.FirstOrDefault(x => preferredLanguages.Contains(x.Language, StringComparison.OrdinalIgnoreCase)) ??
sortedStreams.FirstOrDefault(x => x.IsExternal || x.IsForced || x.IsDefault);
stream = sortedStreams.FirstOrDefault(x => MatchesPreferredLanguage(x.Language, preferredLanguages));
}
else
{
// Respect forced flag.
stream = sortedStreams.FirstOrDefault(x => x.IsForced);
stream = BehaviorOnlyForced(sortedStreams, preferredLanguages).FirstOrDefault();
}
}
else if (mode == SubtitlePlaybackMode.Always)
{
// Always load (full/non-forced) subtitles of the user's preferred subtitle language if possible, otherwise default behaviour.
stream = sortedStreams.FirstOrDefault(x => !x.IsForced && preferredLanguages.Contains(x.Language, StringComparison.OrdinalIgnoreCase)) ??
sortedStreams.FirstOrDefault(x => x.IsExternal || x.IsForced || x.IsDefault);
// Always load (full/non-forced) subtitles of the user's preferred subtitle language if possible, otherwise OnlyForced behaviour.
stream = sortedStreams.FirstOrDefault(x => !x.IsForced && MatchesPreferredLanguage(x.Language, preferredLanguages)) ??
BehaviorOnlyForced(sortedStreams, preferredLanguages).FirstOrDefault();
}
else if (mode == SubtitlePlaybackMode.OnlyForced)
{
// Only load subtitles that are flagged forced.
stream = sortedStreams.FirstOrDefault(x => x.IsForced);
// Load subtitles that are flagged forced of the user's preferred subtitle language or with an undefined language
stream = BehaviorOnlyForced(sortedStreams, preferredLanguages).FirstOrDefault();
}
return stream?.Index;
@@ -110,40 +112,72 @@ namespace Emby.Server.Implementations.Library
if (mode == SubtitlePlaybackMode.Default)
{
// Prefer embedded metadata over smart logic
filteredStreams = sortedStreams.Where(s => s.IsForced || s.IsDefault)
// Load subtitles according to external, default, and forced flags.
filteredStreams = sortedStreams.Where(s => s.IsExternal || s.IsDefault || s.IsForced)
.ToList();
}
else if (mode == SubtitlePlaybackMode.Smart)
{
// Prefer smart logic over embedded metadata
// Only attempt to load subtitles if the audio language is not one of the user's preferred subtitle languages, otherwise OnlyForced behavior.
if (!preferredLanguages.Contains(audioTrackLanguage, StringComparison.OrdinalIgnoreCase))
{
filteredStreams = sortedStreams.Where(s => !s.IsForced && preferredLanguages.Contains(s.Language, StringComparison.OrdinalIgnoreCase))
filteredStreams = sortedStreams.Where(s => MatchesPreferredLanguage(s.Language, preferredLanguages))
.ToList();
}
else
{
filteredStreams = BehaviorOnlyForced(sortedStreams, preferredLanguages);
}
}
else if (mode == SubtitlePlaybackMode.Always)
{
// Always load the most suitable full subtitles
filteredStreams = sortedStreams.Where(s => !s.IsForced).ToList();
// Always load (full/non-forced) subtitles of the user's preferred subtitle language if possible, otherwise OnlyForced behavior.
filteredStreams = sortedStreams.Where(s => !s.IsForced && MatchesPreferredLanguage(s.Language, preferredLanguages))
.ToList() ?? BehaviorOnlyForced(sortedStreams, preferredLanguages);
}
else if (mode == SubtitlePlaybackMode.OnlyForced)
{
// Always load the most suitable full subtitles
filteredStreams = sortedStreams.Where(s => s.IsForced).ToList();
// Load subtitles that are flagged forced of the user's preferred subtitle language or with an undefined language
filteredStreams = BehaviorOnlyForced(sortedStreams, preferredLanguages);
}
// Load forced subs if we have found no suitable full subtitles
var iterStreams = filteredStreams is null || filteredStreams.Count == 0
? sortedStreams.Where(s => s.IsForced && string.Equals(s.Language, audioTrackLanguage, StringComparison.OrdinalIgnoreCase))
: filteredStreams;
// If filteredStreams is null, initialize it as an empty list to avoid null reference errors
filteredStreams ??= new List<MediaStream>();
foreach (var stream in iterStreams)
foreach (var stream in filteredStreams)
{
stream.Score = GetStreamScore(stream, preferredLanguages);
}
}
private static bool MatchesPreferredLanguage(string language, IReadOnlyList<string> preferredLanguages)
{
// If preferredLanguages is empty, treat it as "any language" (wildcard)
return preferredLanguages.Count == 0 ||
preferredLanguages.Contains(language, StringComparison.OrdinalIgnoreCase);
}
private static bool IsLanguageUndefined(string language)
{
// Check for null, empty, or known placeholders
return string.IsNullOrEmpty(language) ||
language.Equals("und", StringComparison.OrdinalIgnoreCase) ||
language.Equals("unknown", StringComparison.OrdinalIgnoreCase) ||
language.Equals("undetermined", StringComparison.OrdinalIgnoreCase) ||
language.Equals("mul", StringComparison.OrdinalIgnoreCase) ||
language.Equals("zxx", StringComparison.OrdinalIgnoreCase);
}
private static List<MediaStream> BehaviorOnlyForced(IEnumerable<MediaStream> sortedStreams, IReadOnlyList<string> preferredLanguages)
{
return sortedStreams
.Where(s => s.IsForced && (MatchesPreferredLanguage(s.Language, preferredLanguages) || IsLanguageUndefined(s.Language)))
.OrderByDescending(s => MatchesPreferredLanguage(s.Language, preferredLanguages))
.ThenByDescending(s => IsLanguageUndefined(s.Language))
.ToList();
}
internal static int GetStreamScore(MediaStream stream, IReadOnlyList<string> languagePreferences)
{
var index = languagePreferences.FindIndex(x => string.Equals(x, stream.Language, StringComparison.OrdinalIgnoreCase));
@@ -2,9 +2,11 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using Jellyfin.Data.Entities;
using Jellyfin.Data.Enums;
using Jellyfin.Database.Implementations.Entities;
using Jellyfin.Database.Implementations.Enums;
using Jellyfin.Extensions;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities;
@@ -24,37 +26,35 @@ namespace Emby.Server.Implementations.Library
_libraryManager = libraryManager;
}
public List<BaseItem> GetInstantMixFromSong(Audio item, User? user, DtoOptions dtoOptions)
public IReadOnlyList<BaseItem> GetInstantMixFromSong(Audio item, User? user, DtoOptions dtoOptions)
{
var list = new List<BaseItem>
{
item
};
var instantMixItems = GetInstantMixFromGenres(item.Genres, user, dtoOptions);
list.AddRange(GetInstantMixFromGenres(item.Genres, user, dtoOptions));
return list;
return [item, .. instantMixItems.Where(i => !i.Id.Equals(item.Id))];
}
/// <inheritdoc />
public List<BaseItem> GetInstantMixFromArtist(MusicArtist artist, User? user, DtoOptions dtoOptions)
public IReadOnlyList<BaseItem> GetInstantMixFromArtist(MusicArtist artist, User? user, DtoOptions dtoOptions)
{
return GetInstantMixFromGenres(artist.Genres, user, dtoOptions);
}
public List<BaseItem> GetInstantMixFromAlbum(MusicAlbum item, User? user, DtoOptions dtoOptions)
public IReadOnlyList<BaseItem> GetInstantMixFromAlbum(MusicAlbum item, User? user, DtoOptions dtoOptions)
{
return GetInstantMixFromGenres(item.Genres, user, dtoOptions);
}
public List<BaseItem> GetInstantMixFromFolder(Folder item, User? user, DtoOptions dtoOptions)
public IReadOnlyList<BaseItem> GetInstantMixFromFolder(Folder item, User? user, DtoOptions dtoOptions)
{
var genres = item
.GetRecursiveChildren(user, new InternalItemsQuery(user)
{
IncludeItemTypes = [BaseItemKind.Audio],
DtoOptions = dtoOptions
})
.GetRecursiveChildren(
user,
new InternalItemsQuery(user)
{
IncludeItemTypes = [BaseItemKind.Audio],
DtoOptions = dtoOptions
},
out _)
.Cast<Audio>()
.SelectMany(i => i.Genres)
.Concat(item.Genres)
@@ -63,12 +63,12 @@ namespace Emby.Server.Implementations.Library
return GetInstantMixFromGenres(genres, user, dtoOptions);
}
public List<BaseItem> GetInstantMixFromPlaylist(Playlist item, User? user, DtoOptions dtoOptions)
public IReadOnlyList<BaseItem> GetInstantMixFromPlaylist(Playlist item, User? user, DtoOptions dtoOptions)
{
return GetInstantMixFromGenres(item.Genres, user, dtoOptions);
}
public List<BaseItem> GetInstantMixFromGenres(IEnumerable<string> genres, User? user, DtoOptions dtoOptions)
public IReadOnlyList<BaseItem> GetInstantMixFromGenres(IEnumerable<string> genres, User? user, DtoOptions dtoOptions)
{
var genreIds = genres.DistinctNames().Select(i =>
{
@@ -85,7 +85,7 @@ namespace Emby.Server.Implementations.Library
return GetInstantMixFromGenreIds(genreIds, user, dtoOptions);
}
public List<BaseItem> GetInstantMixFromGenreIds(Guid[] genreIds, User? user, DtoOptions dtoOptions)
public IReadOnlyList<BaseItem> GetInstantMixFromGenreIds(Guid[] genreIds, User? user, DtoOptions dtoOptions)
{
return _libraryManager.GetItemList(new InternalItemsQuery(user)
{
@@ -97,7 +97,7 @@ namespace Emby.Server.Implementations.Library
});
}
public List<BaseItem> GetInstantMixFromItem(BaseItem item, User? user, DtoOptions dtoOptions)
public IReadOnlyList<BaseItem> GetInstantMixFromItem(BaseItem item, User? user, DtoOptions dtoOptions)
{
if (item is MusicGenre)
{
@@ -29,28 +29,79 @@ namespace Emby.Server.Implementations.Library
throw new ArgumentException("String can't be empty.", nameof(attribute));
}
var attributeIndex = str.IndexOf(attribute, StringComparison.OrdinalIgnoreCase);
// Must be at least 3 characters after the attribute =, ], any character,
// then we offset it by 1, because we want the index and not length.
var maxIndex = str.Length - attribute.Length - 2;
while (attributeIndex > -1 && attributeIndex < maxIndex)
// Allow tmdb as an alias for tmdbid, tvdb for tvdbid, etc.
// The code below only supports aliases for attributes in the form of "<alias>id".
ReadOnlySpan<char> shortAttr = attribute switch
{
var attributeEnd = attributeIndex + attribute.Length;
if (attributeIndex > 0
&& str[attributeIndex - 1] == '['
&& (str[attributeEnd] == '=' || str[attributeEnd] == '-'))
_ when attribute.Equals("tmdbid", StringComparison.OrdinalIgnoreCase) => "tmdb",
_ when attribute.Equals("tvdbid", StringComparison.OrdinalIgnoreCase) => "tvdb",
_ when attribute.Equals("imdbid", StringComparison.OrdinalIgnoreCase) => "imdb",
_ => ReadOnlySpan<char>.Empty
};
for (int strIndex = 0, attributeIndex = 0; attributeIndex > -1;)
{
// We may want to use imdbid pattern matching later, so we don't want to modify the original 'str'.
var subStr = str[strIndex..];
int attributeEnd = 0;
if (shortAttr.Length > 0)
{
var closingIndex = str[attributeEnd..].IndexOf(']');
// Must be at least 1 character before the closing bracket.
if (closingIndex > 1)
{
return str[(attributeEnd + 1)..(attributeEnd + closingIndex)].Trim().ToString();
}
// If we are using an alias it should be shorter (and a prefix), so let's search for that.
attributeIndex = subStr.IndexOf(shortAttr, StringComparison.OrdinalIgnoreCase);
attributeEnd = attributeIndex + shortAttr.Length;
}
else
{
attributeIndex = subStr.IndexOf(attribute, StringComparison.OrdinalIgnoreCase);
attributeEnd = attributeIndex + attribute.Length;
}
str = str[attributeEnd..];
attributeIndex = str.IndexOf(attribute, StringComparison.OrdinalIgnoreCase);
// The next iteration should start at the end of the attribute we just found.
// If attributeIndex < 0, the loop will end and strIndex won't be used again.
strIndex += attributeEnd;
if (attributeIndex > 0)
{
var attributeOpener = subStr[attributeIndex - 1];
var attributeCloser = attributeOpener switch
{
'[' => ']',
'(' => ')',
'{' => '}',
_ => '\0'
};
if (attributeCloser != '\0')
{
if (shortAttr.Length > 0
&& attributeEnd + 1 < subStr.Length
&& (subStr[attributeEnd] is 'i' or 'I')
&& (subStr[attributeEnd + 1] is 'd' or 'D'))
{
// We were searching for a shortened attribute, but it's followed by "id" - let's skip it.
attributeEnd += 2;
}
// attributeEnd points at '='.
// We need at least 1 more character and the closing bracket after that.
if (attributeEnd + 2 < subStr.Length && (subStr[attributeEnd] is '=' or '-'))
{
var closingIndex = subStr[attributeEnd..].IndexOf(attributeCloser);
// Must be at least 1 character before the closing bracket.
if (closingIndex > 1)
{
var trimmed = subStr[(attributeEnd + 1)..(attributeEnd + closingIndex)].Trim();
if (trimmed.Length > 0)
{
return trimmed.ToString();
}
}
}
}
}
}
// for imdbid we also accept pattern matching
@@ -0,0 +1,146 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using Jellyfin.Extensions;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.IO;
using Microsoft.Extensions.Logging;
namespace Emby.Server.Implementations.Library;
/// <summary>
/// IPathManager implementation.
/// </summary>
public class PathManager : IPathManager
{
private readonly ILogger<PathManager> _logger;
private readonly IServerConfigurationManager _config;
private readonly IApplicationPaths _appPaths;
/// <summary>
/// Initializes a new instance of the <see cref="PathManager"/> class.
/// </summary>
/// <param name="logger">The logger.</param>
/// <param name="config">The server configuration manager.</param>
/// <param name="appPaths">The application paths.</param>
public PathManager(
ILogger<PathManager> logger,
IServerConfigurationManager config,
IApplicationPaths appPaths)
{
_logger = logger;
_config = config;
_appPaths = appPaths;
}
private string SubtitleCachePath => Path.Combine(_appPaths.DataPath, "subtitles");
private string AttachmentCachePath => Path.Combine(_appPaths.DataPath, "attachments");
/// <inheritdoc />
public string? GetAttachmentPath(string mediaSourceId, string fileName)
{
var folder = GetAttachmentFolderPath(mediaSourceId);
if (folder is null)
{
return null;
}
var safeName = PathHelper.GetSafeLeafFileName(fileName);
if (safeName is null)
{
_logger.LogWarning("Rejecting attachment filename '{FileName}' for MediaSource {MediaSourceId}: not a valid leaf name.", fileName, mediaSourceId);
return null;
}
return Path.Combine(folder, safeName);
}
/// <inheritdoc />
public string? GetAttachmentFolderPath(string mediaSourceId)
{
if (!Guid.TryParse(mediaSourceId, out var parsed))
{
_logger.LogDebug("MediaSource Id '{MediaSourceId}' is not a GUID; no on-disk attachment folder.", mediaSourceId);
return null;
}
var id = parsed.ToString("D", CultureInfo.InvariantCulture).AsSpan();
return Path.Join(AttachmentCachePath, id[..2], id);
}
/// <inheritdoc />
public string? GetSubtitleFolderPath(string mediaSourceId)
{
if (!Guid.TryParse(mediaSourceId, out var parsed))
{
_logger.LogDebug("MediaSource Id '{MediaSourceId}' is not a GUID; no on-disk subtitle folder.", mediaSourceId);
return null;
}
var id = parsed.ToString("D", CultureInfo.InvariantCulture).AsSpan();
return Path.Join(SubtitleCachePath, id[..2], id);
}
/// <inheritdoc />
public string? GetSubtitlePath(string mediaSourceId, int streamIndex, string extension)
{
var folder = GetSubtitleFolderPath(mediaSourceId);
return folder is null ? null : Path.Combine(folder, streamIndex.ToString(CultureInfo.InvariantCulture) + extension);
}
/// <inheritdoc />
public string GetTrickplayDirectory(BaseItem item, bool saveWithMedia = false)
{
var id = item.Id.ToString("D", CultureInfo.InvariantCulture).AsSpan();
return saveWithMedia
? Path.Combine(item.ContainingFolderPath, Path.ChangeExtension(Path.GetFileName(item.Path), ".trickplay"))
: Path.Join(_config.ApplicationPaths.TrickplayPath, id[..2], id);
}
/// <inheritdoc/>
public string GetChapterImageFolderPath(BaseItem item)
{
return Path.Combine(item.GetInternalMetadataPath(), "chapters");
}
/// <inheritdoc/>
public string GetChapterImagePath(BaseItem item, long chapterPositionTicks)
{
var filename = item.DateModified.Ticks.ToString(CultureInfo.InvariantCulture) + "_" + chapterPositionTicks.ToString(CultureInfo.InvariantCulture) + ".jpg";
return Path.Combine(GetChapterImageFolderPath(item), filename);
}
/// <inheritdoc/>
public IReadOnlyList<string> GetExtractedDataPaths(BaseItem item)
{
var mediaSourceId = item.Id.ToString("N", CultureInfo.InvariantCulture);
List<string> paths = [];
var attachmentFolder = GetAttachmentFolderPath(mediaSourceId);
if (attachmentFolder is not null)
{
paths.Add(attachmentFolder);
}
var subtitleFolder = GetSubtitleFolderPath(mediaSourceId);
if (subtitleFolder is not null)
{
paths.Add(subtitleFolder);
}
paths.Add(GetTrickplayDirectory(item, false));
if (!string.IsNullOrEmpty(item.Path))
{
paths.Add(GetTrickplayDirectory(item, true));
}
paths.Add(GetChapterImageFolderPath(item));
return paths;
}
}
@@ -39,7 +39,7 @@ namespace Emby.Server.Implementations.Library
item.GetParents().Any(i => i.IsLocked);
// Make sure DateCreated and DateModified have values
var fileInfo = directoryService.GetFile(item.Path);
var fileInfo = directoryService.GetFileSystemEntry(item.Path);
if (fileInfo is null)
{
return false;
@@ -136,23 +136,33 @@ namespace Emby.Server.Implementations.Library
if (config.UseFileCreationTimeForDateAdded)
{
// directoryService.getFile may return null
if (info is not null)
var fileCreationDate = info?.CreationTimeUtc;
if (fileCreationDate is not null)
{
var dateCreated = info.CreationTimeUtc;
if (dateCreated.Equals(DateTime.MinValue))
var dateCreated = fileCreationDate;
if (dateCreated == DateTime.MinValue)
{
dateCreated = DateTime.UtcNow;
}
item.DateCreated = dateCreated;
item.DateCreated = dateCreated.Value;
}
}
else
{
item.DateCreated = DateTime.UtcNow;
}
if (info is not null && !info.IsDirectory)
{
item.Size = info.Length;
}
var fileModificationDate = info?.LastWriteTimeUtc;
if (fileModificationDate.HasValue)
{
item.DateModified = fileModificationDate.Value;
}
}
}
}
@@ -3,6 +3,7 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using Emby.Naming.Audio;
using Emby.Naming.Common;
using Jellyfin.Data.Enums;
using MediaBrowser.Controller.Entities.Audio;
@@ -85,6 +86,7 @@ namespace Emby.Server.Implementations.Library.Resolvers.Audio
}
var albumResolver = new MusicAlbumResolver(_logger, _namingOptions, _directoryService);
var albumParser = new AlbumParser(_namingOptions);
var directories = args.FileSystemChildren.Where(i => i.IsDirectory);
@@ -100,6 +102,12 @@ namespace Emby.Server.Implementations.Library.Resolvers.Audio
}
}
// If the folder is a multi-disc folder, then it is not an artist folder
if (albumParser.IsMultiPart(fileSystemInfo.FullName))
{
return;
}
// If we contain a music album assume we are an artist folder
if (albumResolver.IsMusicAlbum(fileSystemInfo.FullName, _directoryService))
{
@@ -1,16 +1,14 @@
#nullable disable
#pragma warning disable CS1591
using System;
using System.IO;
using System.Linq;
using Emby.Naming.Book;
using Jellyfin.Data.Enums;
using Jellyfin.Extensions;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Resolvers;
using MediaBrowser.Model.Entities;
namespace Emby.Server.Implementations.Library.Resolvers.Books
{
@@ -18,7 +16,7 @@ namespace Emby.Server.Implementations.Library.Resolvers.Books
{
private readonly string[] _validExtensions = { ".azw", ".azw3", ".cb7", ".cbr", ".cbt", ".cbz", ".epub", ".mobi", ".pdf" };
protected override Book Resolve(ItemResolveArgs args)
protected override Book? Resolve(ItemResolveArgs args)
{
var collectionType = args.GetCollectionType();
@@ -35,20 +33,26 @@ namespace Emby.Server.Implementations.Library.Resolvers.Books
var extension = Path.GetExtension(args.Path.AsSpan());
if (_validExtensions.Contains(extension, StringComparison.OrdinalIgnoreCase))
if (!_validExtensions.Contains(extension, StringComparison.OrdinalIgnoreCase))
{
// It's a book
return new Book
{
Path = args.Path,
IsInMixedFolder = true
};
return null;
}
return null;
var result = BookFileNameParser.Parse(Path.GetFileNameWithoutExtension(args.Path));
return new Book
{
Path = args.Path,
Name = result.Name ?? string.Empty,
IndexNumber = result.Index,
ParentIndexNumber = result.ParentIndex,
ProductionYear = result.Year,
SeriesName = result.SeriesName ?? Path.GetFileName(Path.GetDirectoryName(args.Path)),
IsInMixedFolder = true,
};
}
private Book GetBook(ItemResolveArgs args)
private Book? GetBook(ItemResolveArgs args)
{
var bookFiles = args.FileSystemChildren.Where(f =>
{
@@ -59,15 +63,23 @@ namespace Emby.Server.Implementations.Library.Resolvers.Books
StringComparison.OrdinalIgnoreCase);
}).ToList();
// Don't return a Book if there is more (or less) than one document in the directory
// directory is only considered a book when it contains exactly one supported file
// other library structures with multiple books to a directory will get picked up as individual files
if (bookFiles.Count != 1)
{
return null;
}
var result = BookFileNameParser.Parse(Path.GetFileName(args.Path));
return new Book
{
Path = bookFiles[0].FullName
Path = bookFiles[0].FullName,
Name = result.Name ?? string.Empty,
IndexNumber = result.Index,
ParentIndexNumber = result.ParentIndex,
ProductionYear = result.Year,
SeriesName = result.SeriesName ?? string.Empty,
};
}
}
@@ -32,8 +32,8 @@ namespace Emby.Server.Implementations.Library.Resolvers
: base(logger, namingOptions, directoryService)
{
_namingOptions = namingOptions;
_trailerResolvers = new IItemResolver[] { new GenericVideoResolver<Trailer>(logger, namingOptions, directoryService) };
_videoResolvers = new IItemResolver[] { this };
_trailerResolvers = [new GenericVideoResolver<Trailer>(logger, namingOptions, directoryService, parseName: true)];
_videoResolvers = [this];
}
protected override Video Resolve(ItemResolveArgs args)
@@ -54,12 +54,13 @@ namespace Emby.Server.Implementations.Library.Resolvers
_ => _videoResolvers
};
public bool TryGetExtraTypeForOwner(string path, VideoFileInfo ownerVideoFileInfo, [NotNullWhen(true)] out ExtraType? extraType)
public bool TryGetExtraTypeForOwner(string path, VideoFileInfo ownerVideoFileInfo, [NotNullWhen(true)] out ExtraType? extraType, [NotNullWhen(true)] out ExtraRule? extraRule, string? libraryRoot = "")
{
var extraResult = GetExtraInfo(path, _namingOptions);
if (extraResult.ExtraType is null)
var extraResult = GetExtraInfo(path, _namingOptions, libraryRoot);
if (extraResult.ExtraType is null || extraResult.Rule is null)
{
extraType = null;
extraRule = null;
return false;
}
@@ -88,6 +89,7 @@ namespace Emby.Server.Implementations.Library.Resolvers
}
extraType = extraResult.ExtraType;
extraRule = extraResult.Rule;
return isValid;
}

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