Compare commits

...

587 Commits

Author SHA1 Message Date
fabriciodeuner
ae1dd5b1fc Translated using Weblate (Portuguese)
Some checks failed
OpenAPI / OpenAPI - HEAD (push) Has been cancelled
OpenAPI / OpenAPI - BASE (push) Has been cancelled
OpenAPI / OpenAPI - Difference (push) Has been cancelled
OpenAPI / OpenAPI - Publish Unstable Spec (push) Has been cancelled
OpenAPI / OpenAPI - Publish Stable Spec (push) Has been cancelled
Tests / run-tests (macos-latest) (push) Has been cancelled
Tests / run-tests (ubuntu-latest) (push) Has been cancelled
Tests / run-tests (windows-latest) (push) Has been cancelled
Project Automation / Project board (push) Has been cancelled
Merge Conflict Labeler / Labeling (push) Has been cancelled
CodeQL / Analyze (csharp) (push) Failing after 4m47s
Stale Issue Labeler / Check for stale issues (push) Has been skipped
Stale PR Check / Check PRs with merge conflicts (push) Has been skipped
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
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
619 changed files with 9060 additions and 4094 deletions

View File

@ -3,7 +3,7 @@
"isRoot": true,
"tools": {
"dotnet-ef": {
"version": "8.0.4",
"version": "8.0.8",
"commands": [
"dotnet-ef"
]

View File

@ -1,58 +1,131 @@
name: Issue Report
description: File an issue report
title: "[Issue]: "
labels: [bug, triage]
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 first to troubleshoot with volunteers, before creating a report. The links can be found [here](https://jellyfin.org/contact/).
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.9.11+
- 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.]
@ -87,21 +160,22 @@ body:
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 +183,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.

View File

@ -20,18 +20,18 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
- name: Setup .NET
uses: actions/setup-dotnet@4d6c8fcf3c8f7a60068d26b594648e99df24cee3 # v4.0.0
uses: actions/setup-dotnet@6bd8b7f7774af54e05809fcc5431931b3eb1ddee # v4.0.1
with:
dotnet-version: '8.0.x'
- name: Initialize CodeQL
uses: github/codeql-action/init@d39d31e687223d841ef683f52467bd88e9b21c14 # v3.25.3
uses: github/codeql-action/init@4dd16135b69a43b6c8efb853346f8437d92d3c93 # v3.26.6
with:
languages: ${{ matrix.language }}
queries: +security-extended
- name: Autobuild
uses: github/codeql-action/autobuild@d39d31e687223d841ef683f52467bd88e9b21c14 # v3.25.3
uses: github/codeql-action/autobuild@4dd16135b69a43b6c8efb853346f8437d92d3c93 # v3.26.6
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@d39d31e687223d841ef683f52467bd88e9b21c14 # v3.25.3
uses: github/codeql-action/analyze@4dd16135b69a43b6c8efb853346f8437d92d3c93 # v3.26.6

149
.github/workflows/ci-compat.yml vendored Normal file
View File

@ -0,0 +1,149 @@
name: ABI Compatibility
on:
pull_request_target:
permissions: {}
jobs:
abi-head:
name: ABI - HEAD
runs-on: ubuntu-latest
permissions: read-all
steps:
- name: Checkout repository
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
with:
ref: ${{ github.event.pull_request.head.sha }}
repository: ${{ github.event.pull_request.head.repo.full_name }}
- name: Build
run: |
dotnet build Jellyfin.Server -o ./out
- name: Upload Head
uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0
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@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
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: Build
run: |
dotnet build Jellyfin.Server -o ./out
- name: Upload Head
uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0
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_target' }}
runs-on: ubuntu-latest
needs:
- abi-head
- abi-base
steps:
- name: Download abi-head
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
with:
name: abi-head
path: abi-head
- name: Download abi-base
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
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; do
COMPAT_OUTPUT="$( { apicompat --left ./abi-base/${file} --right ./abi-head/${file}; } 2>&1 )"
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@3eae4d37986fb5a8592848f6a574fdf654e61f9e # v3.1.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@71345be0265236311c031f5c7866368bd1eff043 # v4.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@71345be0265236311c031f5c7866368bd1eff043 # v4.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>

View File

@ -3,6 +3,8 @@ on:
push:
branches:
- master
tags:
- 'v*'
pull_request_target:
permissions: {}
@ -14,18 +16,18 @@ jobs:
permissions: read-all
steps:
- name: Checkout repository
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
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
uses: actions/setup-dotnet@6bd8b7f7774af54e05809fcc5431931b3eb1ddee # v4.0.1
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
uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0
with:
name: openapi-head
retention-days: 14
@ -39,7 +41,7 @@ jobs:
permissions: read-all
steps:
- name: Checkout repository
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
with:
ref: ${{ github.event.pull_request.head.sha }}
repository: ${{ github.event.pull_request.head.repo.full_name }}
@ -53,13 +55,13 @@ jobs:
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
uses: actions/setup-dotnet@6bd8b7f7774af54e05809fcc5431931b3eb1ddee # v4.0.1
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
uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0
with:
name: openapi-base
retention-days: 14
@ -78,12 +80,12 @@ jobs:
- openapi-base
steps:
- name: Download openapi-head
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
with:
name: openapi-head
path: openapi-head
- name: Download openapi-base
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
with:
name: openapi-base
path: openapi-base
@ -99,11 +101,24 @@ jobs:
- id: read-diff
name: Read openapi-diff output
run: |
# Read and fix markdown
body=$(cat openapi-changes.md)
body="${body//'%'/'%25'}"
body="${body//$'\n'/'%0A'}"
body="${body//$'\r'/'%0D'}"
echo ::set-output name=body::$body
# Write to workflow summary
echo "$body" >> $GITHUB_STEP_SUMMARY
# Set ApiChanged var
if [ "$body" != '' ]; then
echo "ApiChanged=1" >> "$GITHUB_OUTPUT"
else
echo "ApiChanged=0" >> "$GITHUB_OUTPUT"
fi
# Add header/footer for diff comment
echo '<!--openapi-diff-workflow-comment-->' > openapi-changes-reply.md
echo "<details>" >> openapi-changes-reply.md
echo "<summary>Changes in OpenAPI specification found. Expand to see details.</summary>" >> openapi-changes-reply.md
echo "" >> openapi-changes-reply.md
echo "$body" >> openapi-changes-reply.md
echo "" >> openapi-changes-reply.md
echo "</details>" >> openapi-changes-reply.md
- name: Find difference comment
uses: peter-evans/find-comment@3eae4d37986fb5a8592848f6a574fdf654e61f9e # v3.1.0
id: find-comment
@ -113,22 +128,15 @@ jobs:
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 != '' }}
if: ${{ steps.read-diff.outputs.ApiChanged == '1' }}
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>
body-path: openapi-changes-reply.md
- 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 != '' }}
if: ${{ steps.read-diff.outputs.ApiChanged == '0' && steps.find-comment.outputs.comment-id != '' }}
with:
issue-number: ${{ github.event.pull_request.number }}
comment-id: ${{ steps.find-comment.outputs.comment-id }}
@ -138,11 +146,9 @@ jobs:
No changes to OpenAPI specification found. See history of this comment for previous changes.
publish:
publish-unstable:
name: OpenAPI - Publish Unstable Spec
if: |
github.event_name != 'pull_request_target' &&
contains(github.repository_owner, 'jellyfin')
if: ${{ github.event_name != 'pull_request_target' && !startsWith(github.ref, 'refs/tags/v') && contains(github.repository_owner, 'jellyfin') }}
runs-on: ubuntu-latest
needs:
- openapi-head
@ -152,7 +158,7 @@ jobs:
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
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
with:
name: openapi-head
path: openapi-head
@ -201,3 +207,65 @@ jobs:
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:
- openapi-head
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@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
with:
name: openapi-head
path: openapi-head
- name: Upload openapi.json (stable) 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/stable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}"
- name: Move openapi.json (stable) 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}/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

View File

@ -19,9 +19,9 @@ jobs:
runs-on: "${{ matrix.os }}"
steps:
- uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
- uses: actions/setup-dotnet@4d6c8fcf3c8f7a60068d26b594648e99df24cee3 # v4.0.0
- uses: actions/setup-dotnet@6bd8b7f7774af54e05809fcc5431931b3eb1ddee # v4.0.1
with:
dotnet-version: ${{ env.SDK_VERSION }}
@ -34,7 +34,7 @@ jobs:
--verbosity minimal
- name: Merge code coverage results
uses: danielpalme/ReportGenerator-GitHub-Action@2a2d60ea1c7e811f54684179af6ac1ae8c1ce69a # 5.2.5
uses: danielpalme/ReportGenerator-GitHub-Action@e3af7259842d9c814021ea121f85526e0872b25f # v5.3.9
with:
reports: "**/coverage.cobertura.xml"
targetdir: "merged/"

View File

@ -24,7 +24,7 @@ jobs:
reactions: '+1'
- name: Checkout the latest code
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
with:
token: ${{ secrets.JF_BOT_TOKEN }}
fetch-depth: 0
@ -51,7 +51,7 @@ jobs:
reactions: eyes
- name: Checkout the latest code
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
with:
token: ${{ secrets.JF_BOT_TOKEN }}
fetch-depth: 0
@ -128,11 +128,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: pull in script
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
with:
repository: jellyfin/jellyfin-triage-script
- name: install python
uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0
uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 # v5.2.0
with:
python-version: '3.12'
cache: 'pip'

View File

@ -10,11 +10,11 @@ jobs:
issues: write
steps:
- name: pull in script
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
with:
repository: jellyfin/jellyfin-triage-script
- name: install python
uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0
uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 # v5.2.0
with:
python-version: '3.12'
cache: 'pip'

View File

@ -15,7 +15,7 @@ jobs:
if: ${{ github.repository == 'jellyfin/jellyfin' }}
steps:
- name: Apply label
uses: eps1lon/actions-label-merge-conflict@e62d7a53ff8be8b97684bffb6cfbbf3fc1115e2e # v3.0.0
uses: eps1lon/actions-label-merge-conflict@1b1b1fcde06a9b3d089f3464c96417961dde1168 # v3.0.2
if: ${{ github.event_name == 'push' || github.event_name == 'pull_request_target'}}
with:
dirtyLabel: 'merge conflict'

View File

@ -33,7 +33,7 @@ jobs:
yq-version: v4.9.8
- name: Checkout Repository
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
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@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
with:
ref: ${{ env.TAG_BRANCH }}

View File

@ -65,6 +65,7 @@
- [joshuaboniface](https://github.com/joshuaboniface)
- [JustAMan](https://github.com/JustAMan)
- [justinfenn](https://github.com/justinfenn)
- [JPVenson](https://github.com/JPVenson)
- [KerryRJ](https://github.com/KerryRJ)
- [Larvitar](https://github.com/Larvitar)
- [LeoVerto](https://github.com/LeoVerto)
@ -183,6 +184,11 @@
- [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)
# Emby Contributors
@ -255,3 +261,4 @@
- [JPUC1143](https://github.com/Jpuc1143/)
- [0x25CBFC4F](https://github.com/0x25CBFC4F)
- [Robert Lützner](https://github.com/rluetzner)
- [Nathan McCrina](https://github.com/nfmccrina)

View File

@ -4,52 +4,50 @@
</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="7.0.1" />
<PackageVersion Include="AutoFixture.AutoMoq" Version="4.18.1" />
<PackageVersion Include="AutoFixture.Xunit2" Version="4.18.1" />
<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="BlurHashSharp.SkiaSharp" Version="1.3.3" />
<PackageVersion Include="BlurHashSharp" Version="1.3.3" />
<PackageVersion Include="CommandLineParser" Version="2.9.1" />
<PackageVersion Include="coverlet.collector" Version="6.0.2" />
<PackageVersion Include="Diacritics" Version="3.3.29" />
<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="ICU4N.Transliterator" Version="60.1.0-alpha.356" />
<PackageVersion Include="IDisposableAnalyzers" Version="4.0.7" />
<PackageVersion Include="IDisposableAnalyzers" Version="4.0.8" />
<PackageVersion Include="Jellyfin.XmlTv" Version="10.8.0" />
<PackageVersion Include="libse" Version="4.0.5" />
<PackageVersion Include="LrcParser" Version="2023.524.0" />
<PackageVersion Include="libse" Version="4.0.8" />
<PackageVersion Include="LrcParser" Version="2024.0728.2" />
<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.AspNetCore.Authorization" Version="8.0.8" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="8.0.8" />
<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.Data.Sqlite" Version="8.0.8" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.8" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="8.0.8" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.8" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.8" />
<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.Binder" Version="8.0.2" />
<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.Diagnostics.HealthChecks.EntityFrameworkCore" Version="8.0.8" />
<PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks" Version="8.0.8" />
<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="Microsoft.NET.Test.Sdk" Version="17.11.1" />
<PackageVersion Include="MimeTypes" Version="2.4.0" />
<PackageVersion Include="Mono.Nat" Version="3.0.4" />
<PackageVersion Include="Moq" Version="4.18.4" />
@ -59,12 +57,12 @@
<PackageVersion Include="prometheus-net.AspNetCore" Version="8.2.1" />
<PackageVersion Include="prometheus-net.DotNetRuntime" Version="4.4.0" />
<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="Serilog.AspNetCore" Version="8.0.2" />
<PackageVersion Include="Serilog.Enrichers.Thread" Version="4.0.0" />
<PackageVersion Include="Serilog.Settings.Configuration" Version="8.0.2" />
<PackageVersion Include="Serilog.Sinks.Async" Version="2.0.0" />
<PackageVersion Include="Serilog.Sinks.Console" Version="6.0.0" />
<PackageVersion Include="Serilog.Sinks.File" Version="6.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" />
@ -73,20 +71,21 @@
<PackageVersion Include="SkiaSharp.NativeAssets.Linux" Version="2.88.8" />
<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="Svg.Skia" Version="2.0.0.1" />
<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="System.Text.Json" Version="8.0.4" />
<PackageVersion Include="System.Threading.Tasks.Dataflow" Version="8.0.1" />
<PackageVersion Include="TagLibSharp" Version="2.3.0" />
<PackageVersion Include="z440.atl.core" Version="6.4.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.runner.visualstudio" Version="2.8.2" />
<PackageVersion Include="Xunit.SkippableFact" Version="1.4.13" />
<PackageVersion Include="xunit" Version="2.7.1" />
<PackageVersion Include="xunit" Version="2.9.0" />
</ItemGroup>
</Project>

View File

@ -36,7 +36,7 @@
<PropertyGroup>
<Authors>Jellyfin Contributors</Authors>
<PackageId>Jellyfin.Naming</PackageId>
<VersionPrefix>10.9.0</VersionPrefix>
<VersionPrefix>10.10.0</VersionPrefix>
<RepositoryUrl>https://github.com/jellyfin/jellyfin</RepositoryUrl>
<PackageLicenseExpression>GPL-3.0-only</PackageLicenseExpression>
</PropertyGroup>

View File

@ -107,7 +107,7 @@ namespace Emby.Naming.ExternalFiles
pathInfo.Language = 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);

View File

@ -24,6 +24,8 @@ namespace Emby.Naming.TV
"stagione"
};
private static readonly char[] _splitChars = ['.', '_', ' ', '-'];
/// <summary>
/// Attempts to parse season number from path.
/// </summary>
@ -83,14 +85,9 @@ namespace Emby.Naming.TV
}
}
if (filename.StartsWith("s", StringComparison.OrdinalIgnoreCase))
if (TryGetSeasonNumberFromPart(filename, out int seasonNumber))
{
var testFilename = filename.AsSpan().Slice(1);
if (int.TryParse(testFilename, NumberStyles.Integer, CultureInfo.InvariantCulture, out var val))
{
return (val, true);
}
return (seasonNumber, true);
}
// Look for one of the season folder names
@ -108,10 +105,10 @@ namespace Emby.Naming.TV
}
}
var parts = filename.Split(new[] { '.', '_', ' ', '-' }, StringSplitOptions.RemoveEmptyEntries);
var parts = filename.Split(_splitChars, StringSplitOptions.RemoveEmptyEntries);
foreach (var part in parts)
{
if (TryGetSeasonNumberFromPart(part, out int seasonNumber))
if (TryGetSeasonNumberFromPart(part, out seasonNumber))
{
return (seasonNumber, true);
}

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;
}
}

View File

@ -1,4 +1,4 @@
using System.Diagnostics.CodeAnalysis;
using System.Diagnostics.CodeAnalysis;
using System.Text.RegularExpressions;
namespace Emby.Naming.Video;

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>

View File

@ -104,6 +104,6 @@ namespace Emby.Server.Implementations.AppBase
/// Gets the folder path to the temp directory within the cache folder.
/// </summary>
/// <value>The temp directory.</value>
public string TempDirectory => Path.Combine(CachePath, "temp");
public string TempDirectory => Path.Join(Path.GetTempPath(), "jellyfin");
}
}

View File

@ -40,6 +40,7 @@ using Jellyfin.MediaEncoding.Hls.Playlist;
using Jellyfin.Networking.Manager;
using Jellyfin.Networking.Udp;
using Jellyfin.Server.Implementations;
using Jellyfin.Server.Implementations.MediaSegments;
using MediaBrowser.Common;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.Events;
@ -401,7 +402,12 @@ namespace Emby.Server.Implementations
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");
@ -422,7 +428,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();
@ -552,6 +558,8 @@ namespace Emby.Server.Implementations
serviceCollection.AddScoped<DynamicHlsHelper>();
serviceCollection.AddScoped<IClientEventLogger, ClientEventLogger>();
serviceCollection.AddSingleton<IDirectoryService, DirectoryService>();
serviceCollection.AddSingleton<IMediaSegmentManager, MediaSegmentManager>();
}
/// <summary>
@ -635,6 +643,7 @@ namespace Emby.Server.Implementations
UserView.TVSeriesManager = Resolve<ITVSeriesManager>();
UserView.CollectionManager = Resolve<ICollectionManager>();
BaseItem.MediaSourceManager = Resolve<IMediaSourceManager>();
BaseItem.MediaSegmentManager = Resolve<IMediaSegmentManager>();
CollectionFolder.XmlSerializer = _xmlSerializer;
CollectionFolder.ApplicationHost = this;
}
@ -664,7 +673,8 @@ namespace Emby.Server.Implementations
GetExports<IMetadataService>(),
GetExports<IMetadataProvider>(),
GetExports<IMetadataSaver>(),
GetExports<IExternalId>());
GetExports<IExternalId>(),
GetExports<IExternalUrlProvider>());
Resolve<IMediaSourceManager>().AddParts(GetExports<IMediaSourceProvider>());
}

View File

@ -19,7 +19,8 @@ namespace Emby.Server.Implementations
{ FfmpegAnalyzeDurationKey, "200M" },
{ PlaylistsAllowDuplicatesKey, bool.FalseString },
{ BindToUnixSocketKey, bool.FalseString },
{ SqliteCacheSizeKey, "20000" }
{ SqliteCacheSizeKey, "20000" },
{ FfmpegSkipValidationKey, bool.FalseString }
};
}
}

View File

@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
using System.Threading;
using Jellyfin.Extensions;
using Microsoft.Data.Sqlite;
using Microsoft.Extensions.Logging;
@ -13,6 +14,8 @@ namespace Emby.Server.Implementations.Data
public abstract class BaseSqliteRepository : IDisposable
{
private bool _disposed = false;
private SemaphoreSlim _writeLock = new SemaphoreSlim(1, 1);
private SqliteConnection _writeConnection;
/// <summary>
/// Initializes a new instance of the <see cref="BaseSqliteRepository"/> class.
@ -28,17 +31,6 @@ namespace Emby.Server.Implementations.Data
/// </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>
@ -64,7 +56,7 @@ namespace Emby.Server.Implementations.Data
/// <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.
/// The default (-1) is overridden to prevent unconstrained WAL size, as reported by users.
/// </summary>
/// <value>The journal size limit.</value>
protected virtual int? JournalSizeLimit => 134_217_728; // 128MiB
@ -98,9 +90,55 @@ namespace Emby.Server.Implementations.Data
}
}
protected SqliteConnection GetConnection()
protected ManagedConnection GetConnection(bool readOnly = false)
{
var connection = new SqliteConnection($"Filename={DbFilePath}");
if (!readOnly)
{
_writeLock.Wait();
if (_writeConnection is not null)
{
return new ManagedConnection(_writeConnection, _writeLock);
}
var writeConnection = new SqliteConnection($"Filename={DbFilePath};Pooling=False");
writeConnection.Open();
if (CacheSize.HasValue)
{
writeConnection.Execute("PRAGMA cache_size=" + CacheSize.Value);
}
if (!string.IsNullOrWhiteSpace(LockingMode))
{
writeConnection.Execute("PRAGMA locking_mode=" + LockingMode);
}
if (!string.IsNullOrWhiteSpace(JournalMode))
{
writeConnection.Execute("PRAGMA journal_mode=" + JournalMode);
}
if (JournalSizeLimit.HasValue)
{
writeConnection.Execute("PRAGMA journal_size_limit=" + JournalSizeLimit.Value);
}
if (Synchronous.HasValue)
{
writeConnection.Execute("PRAGMA synchronous=" + (int)Synchronous.Value);
}
if (PageSize.HasValue)
{
writeConnection.Execute("PRAGMA page_size=" + PageSize.Value);
}
writeConnection.Execute("PRAGMA temp_store=" + (int)TempStore);
return new ManagedConnection(_writeConnection = writeConnection, _writeLock);
}
var connection = new SqliteConnection($"Filename={DbFilePath};Mode=ReadOnly");
connection.Open();
if (CacheSize.HasValue)
@ -135,17 +173,17 @@ namespace Emby.Server.Implementations.Data
connection.Execute("PRAGMA temp_store=" + (int)TempStore);
return connection;
return new ManagedConnection(connection, null);
}
public SqliteCommand PrepareStatement(SqliteConnection connection, string sql)
public SqliteCommand PrepareStatement(ManagedConnection connection, string sql)
{
var command = connection.CreateCommand();
command.CommandText = sql;
return command;
}
protected bool TableExists(SqliteConnection connection, string name)
protected bool TableExists(ManagedConnection connection, string name)
{
using var statement = PrepareStatement(connection, "select DISTINCT tbl_name from sqlite_master");
foreach (var row in statement.ExecuteQuery())
@ -159,7 +197,7 @@ namespace Emby.Server.Implementations.Data
return false;
}
protected List<string> GetColumnNames(SqliteConnection connection, string table)
protected List<string> GetColumnNames(ManagedConnection connection, string table)
{
var columnNames = new List<string>();
@ -174,7 +212,7 @@ namespace Emby.Server.Implementations.Data
return columnNames;
}
protected void AddColumn(SqliteConnection connection, string table, string columnName, string type, List<string> existingColumnNames)
protected void AddColumn(ManagedConnection connection, string table, string columnName, string type, List<string> existingColumnNames)
{
if (existingColumnNames.Contains(columnName, StringComparison.OrdinalIgnoreCase))
{
@ -207,6 +245,24 @@ namespace Emby.Server.Implementations.Data
return;
}
if (dispose)
{
_writeLock.Wait();
try
{
_writeConnection.Dispose();
}
finally
{
_writeLock.Release();
}
_writeLock.Dispose();
}
_writeConnection = null;
_writeLock = null;
_disposed = true;
}
}

View File

@ -0,0 +1,62 @@
#pragma warning disable CS1591
using System;
using System.Collections.Generic;
using System.Threading;
using Microsoft.Data.Sqlite;
namespace Emby.Server.Implementations.Data;
public sealed class ManagedConnection : IDisposable
{
private readonly SemaphoreSlim? _writeLock;
private SqliteConnection _db;
private bool _disposed = false;
public ManagedConnection(SqliteConnection db, SemaphoreSlim? writeLock)
{
_db = db;
_writeLock = writeLock;
}
public SqliteTransaction BeginTransaction()
=> _db.BeginTransaction();
public SqliteCommand CreateCommand()
=> _db.CreateCommand();
public void Execute(string commandText)
=> _db.Execute(commandText);
public SqliteCommand PrepareStatement(string sql)
=> _db.PrepareStatement(sql);
public IEnumerable<SqliteDataReader> Query(string commandText)
=> _db.Query(commandText);
public void Dispose()
{
if (_disposed)
{
return;
}
if (_writeLock is null)
{
// Read connections are managed with an internal pool
_db.Dispose();
}
else
{
// Write lock is managed by BaseSqliteRepository
// Don't dispose here
_writeLock.Release();
}
_db = null!;
_disposed = true;
}
}

View File

@ -183,7 +183,8 @@ namespace Emby.Server.Implementations.Data
"ElPresentFlag",
"BlPresentFlag",
"DvBlSignalCompatibilityId",
"IsHearingImpaired"
"IsHearingImpaired",
"Rotation"
};
private static readonly string _mediaStreamSaveColumnsInsertQuery =
@ -327,7 +328,6 @@ namespace Emby.Server.Implementations.Data
DbFilePath = Path.Combine(_config.ApplicationPaths.DataPath, "library.db");
CacheSize = configuration.GetSqliteCacheSize();
ReadConnectionsCount = Environment.ProcessorCount * 2;
}
/// <inheritdoc />
@ -344,7 +344,7 @@ namespace Emby.Server.Implementations.Data
base.Initialize();
const string CreateMediaStreamsTableCommand
= "create table if not exists mediastreams (ItemId GUID, StreamIndex INT, StreamType TEXT, Codec TEXT, Language TEXT, ChannelLayout TEXT, Profile TEXT, AspectRatio TEXT, Path TEXT, IsInterlaced BIT, BitRate INT NULL, Channels INT NULL, SampleRate INT NULL, IsDefault BIT, IsForced BIT, IsExternal BIT, Height INT NULL, Width INT NULL, AverageFrameRate FLOAT NULL, RealFrameRate FLOAT NULL, Level FLOAT NULL, PixelFormat TEXT, BitDepth INT NULL, IsAnamorphic BIT NULL, RefFrames INT NULL, CodecTag TEXT NULL, Comment TEXT NULL, NalLengthSize TEXT NULL, IsAvc BIT NULL, Title TEXT NULL, TimeBase TEXT NULL, CodecTimeBase TEXT NULL, ColorPrimaries TEXT NULL, ColorSpace TEXT NULL, ColorTransfer TEXT NULL, DvVersionMajor INT NULL, DvVersionMinor INT NULL, DvProfile INT NULL, DvLevel INT NULL, RpuPresentFlag INT NULL, ElPresentFlag INT NULL, BlPresentFlag INT NULL, DvBlSignalCompatibilityId INT NULL, IsHearingImpaired BIT NULL, PRIMARY KEY (ItemId, StreamIndex))";
= "create table if not exists mediastreams (ItemId GUID, StreamIndex INT, StreamType TEXT, Codec TEXT, Language TEXT, ChannelLayout TEXT, Profile TEXT, AspectRatio TEXT, Path TEXT, IsInterlaced BIT, BitRate INT NULL, Channels INT NULL, SampleRate INT NULL, IsDefault BIT, IsForced BIT, IsExternal BIT, Height INT NULL, Width INT NULL, AverageFrameRate FLOAT NULL, RealFrameRate FLOAT NULL, Level FLOAT NULL, PixelFormat TEXT, BitDepth INT NULL, IsAnamorphic BIT NULL, RefFrames INT NULL, CodecTag TEXT NULL, Comment TEXT NULL, NalLengthSize TEXT NULL, IsAvc BIT NULL, Title TEXT NULL, TimeBase TEXT NULL, CodecTimeBase TEXT NULL, ColorPrimaries TEXT NULL, ColorSpace TEXT NULL, ColorTransfer TEXT NULL, DvVersionMajor INT NULL, DvVersionMinor INT NULL, DvProfile INT NULL, DvLevel INT NULL, RpuPresentFlag INT NULL, ElPresentFlag INT NULL, BlPresentFlag INT NULL, DvBlSignalCompatibilityId INT NULL, IsHearingImpaired BIT NULL, Rotation INT NULL, PRIMARY KEY (ItemId, StreamIndex))";
const string CreateMediaAttachmentsTableCommand
= "create table if not exists mediaattachments (ItemId GUID, AttachmentIndex INT, Codec TEXT, CodecTag TEXT NULL, Comment TEXT NULL, Filename TEXT NULL, MIMEType TEXT NULL, PRIMARY KEY (ItemId, AttachmentIndex))";
@ -539,6 +539,8 @@ namespace Emby.Server.Implementations.Data
AddColumn(connection, "MediaStreams", "IsHearingImpaired", "BIT", existingColumnNames);
AddColumn(connection, "MediaStreams", "Rotation", "INT", existingColumnNames);
connection.Execute(string.Join(';', postQueries));
transaction.Commit();
@ -601,7 +603,7 @@ namespace Emby.Server.Implementations.Data
transaction.Commit();
}
private void SaveItemsInTransaction(SqliteConnection db, IEnumerable<(BaseItem Item, List<Guid> AncestorIds, BaseItem TopParent, string UserDataKey, List<string> InheritedTags)> tuples)
private void SaveItemsInTransaction(ManagedConnection db, IEnumerable<(BaseItem Item, List<Guid> AncestorIds, BaseItem TopParent, string UserDataKey, List<string> InheritedTags)> tuples)
{
using (var saveItemStatement = PrepareStatement(db, SaveItemCommandText))
using (var deleteAncestorsStatement = PrepareStatement(db, "delete from AncestorIds where ItemId=@ItemId"))
@ -1047,9 +1049,10 @@ namespace Emby.Server.Implementations.Data
foreach (var part in value.SpanSplit('|'))
{
var providerDelimiterIndex = part.IndexOf('=');
if (providerDelimiterIndex != -1 && providerDelimiterIndex == part.LastIndexOf('='))
// Don't let empty values through
if (providerDelimiterIndex != -1 && part.Length != providerDelimiterIndex + 1)
{
item.SetProviderId(part.Slice(0, providerDelimiterIndex).ToString(), part.Slice(providerDelimiterIndex + 1).ToString());
item.SetProviderId(part[..providerDelimiterIndex].ToString(), part[(providerDelimiterIndex + 1)..].ToString());
}
}
}
@ -1261,7 +1264,7 @@ namespace Emby.Server.Implementations.Data
CheckDisposed();
using (var connection = GetConnection())
using (var connection = GetConnection(true))
using (var statement = PrepareStatement(connection, _retrieveItemColumnsSelectQuery))
{
statement.TryBind("@guid", id);
@ -1298,16 +1301,15 @@ namespace Emby.Server.Implementations.Data
&& type != typeof(Book)
&& type != typeof(LiveTvProgram)
&& type != typeof(AudioBook)
&& type != typeof(Audio)
&& type != typeof(MusicAlbum);
}
private BaseItem GetItem(SqliteDataReader reader, InternalItemsQuery query)
{
return GetItem(reader, query, HasProgramAttributes(query), HasEpisodeAttributes(query), HasServiceName(query), HasStartDate(query), HasTrailerTypes(query), HasArtistFields(query), HasSeriesFields(query));
return GetItem(reader, query, HasProgramAttributes(query), HasEpisodeAttributes(query), HasServiceName(query), HasStartDate(query), HasTrailerTypes(query), HasArtistFields(query), HasSeriesFields(query), false);
}
private BaseItem GetItem(SqliteDataReader reader, InternalItemsQuery query, bool enableProgramAttributes, bool hasEpisodeAttributes, bool hasServiceName, bool queryHasStartDate, bool hasTrailerTypes, bool hasArtistFields, bool hasSeriesFields)
private BaseItem GetItem(SqliteDataReader reader, InternalItemsQuery query, bool enableProgramAttributes, bool hasEpisodeAttributes, bool hasServiceName, bool queryHasStartDate, bool hasTrailerTypes, bool hasArtistFields, bool hasSeriesFields, bool skipDeserialization)
{
var typeString = reader.GetString(0);
@ -1320,7 +1322,7 @@ namespace Emby.Server.Implementations.Data
BaseItem item = null;
if (TypeRequiresDeserialization(type))
if (TypeRequiresDeserialization(type) && !skipDeserialization)
{
try
{
@ -1888,7 +1890,7 @@ namespace Emby.Server.Implementations.Data
CheckDisposed();
var chapters = new List<ChapterInfo>();
using (var connection = GetConnection())
using (var connection = GetConnection(true))
using (var statement = PrepareStatement(connection, "select StartPositionTicks,Name,ImagePath,ImageDateModified from " + ChaptersTableName + " where ItemId = @ItemId order by ChapterIndex asc"))
{
statement.TryBind("@ItemId", item.Id);
@ -1907,7 +1909,7 @@ namespace Emby.Server.Implementations.Data
{
CheckDisposed();
using (var connection = GetConnection())
using (var connection = GetConnection(true))
using (var statement = PrepareStatement(connection, "select StartPositionTicks,Name,ImagePath,ImageDateModified from " + ChaptersTableName + " where ItemId = @ItemId and ChapterIndex=@ChapterIndex"))
{
statement.TryBind("@ItemId", item.Id);
@ -1981,7 +1983,7 @@ namespace Emby.Server.Implementations.Data
transaction.Commit();
}
private void InsertChapters(Guid idBlob, IReadOnlyList<ChapterInfo> chapters, SqliteConnection db)
private void InsertChapters(Guid idBlob, IReadOnlyList<ChapterInfo> chapters, ManagedConnection db)
{
var startIndex = 0;
var limit = 100;
@ -2323,7 +2325,7 @@ namespace Emby.Server.Implementations.Data
columns.Add(builder.ToString());
query.ExcludeItemIds = [..query.ExcludeItemIds, item.Id, ..item.ExtraIds];
query.ExcludeItemIds = [.. query.ExcludeItemIds, item.Id, .. item.ExtraIds];
query.ExcludeProviderIds = item.ProviderIds;
}
@ -2470,7 +2472,7 @@ namespace Emby.Server.Implementations.Data
var commandText = commandTextBuilder.ToString();
using (new QueryTimeLogger(Logger, commandText))
using (var connection = GetConnection())
using (var connection = GetConnection(true))
using (var statement = PrepareStatement(connection, commandText))
{
if (EnableJoinUserData(query))
@ -2538,7 +2540,7 @@ namespace Emby.Server.Implementations.Data
var commandText = commandTextBuilder.ToString();
var items = new List<BaseItem>();
using (new QueryTimeLogger(Logger, commandText))
using (var connection = GetConnection())
using (var connection = GetConnection(true))
using (var statement = PrepareStatement(connection, commandText))
{
if (EnableJoinUserData(query))
@ -2562,7 +2564,7 @@ namespace Emby.Server.Implementations.Data
foreach (var row in statement.ExecuteQuery())
{
var item = GetItem(row, query, hasProgramAttributes, hasEpisodeAttributes, hasServiceName, hasStartDate, hasTrailerTypes, hasArtistFields, hasSeriesFields);
var item = GetItem(row, query, hasProgramAttributes, hasEpisodeAttributes, hasServiceName, hasStartDate, hasTrailerTypes, hasArtistFields, hasSeriesFields, query.SkipDeserialization);
if (item is not null)
{
items.Add(item);
@ -2746,7 +2748,7 @@ namespace Emby.Server.Implementations.Data
var list = new List<BaseItem>();
var result = new QueryResult<BaseItem>();
using var connection = GetConnection();
using var connection = GetConnection(true);
using var transaction = connection.BeginTransaction();
if (!isReturningZeroItems)
{
@ -2774,7 +2776,7 @@ namespace Emby.Server.Implementations.Data
foreach (var row in statement.ExecuteQuery())
{
var item = GetItem(row, query, hasProgramAttributes, hasEpisodeAttributes, hasServiceName, hasStartDate, hasTrailerTypes, hasArtistFields, hasSeriesFields);
var item = GetItem(row, query, hasProgramAttributes, hasEpisodeAttributes, hasServiceName, hasStartDate, hasTrailerTypes, hasArtistFields, hasSeriesFields, false);
if (item is not null)
{
list.Add(item);
@ -2831,7 +2833,7 @@ namespace Emby.Server.Implementations.Data
prepend.Add((ItemSortBy.Random, SortOrder.Ascending));
}
orderBy = query.OrderBy = [..prepend, ..orderBy];
orderBy = query.OrderBy = [.. prepend, .. orderBy];
}
else if (orderBy.Count == 0)
{
@ -2928,7 +2930,7 @@ namespace Emby.Server.Implementations.Data
var commandText = commandTextBuilder.ToString();
var list = new List<Guid>();
using (new QueryTimeLogger(Logger, commandText))
using (var connection = GetConnection())
using (var connection = GetConnection(true))
using (var statement = PrepareStatement(connection, commandText))
{
if (EnableJoinUserData(query))
@ -4477,7 +4479,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
transaction.Commit();
}
private void ExecuteWithSingleParam(SqliteConnection db, string query, Guid value)
private void ExecuteWithSingleParam(ManagedConnection db, string query, Guid value)
{
using (var statement = PrepareStatement(db, query))
{
@ -4510,7 +4512,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
}
var list = new List<string>();
using (var connection = GetConnection())
using (var connection = GetConnection(true))
using (var statement = PrepareStatement(connection, commandText.ToString()))
{
// Run this again to bind the params
@ -4548,7 +4550,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
}
var list = new List<PersonInfo>();
using (var connection = GetConnection())
using (var connection = GetConnection(true))
using (var statement = PrepareStatement(connection, commandText.ToString()))
{
// Run this again to bind the params
@ -4633,7 +4635,7 @@ AND Type = @InternalPersonType)");
return whereClauses;
}
private void UpdateAncestors(Guid itemId, List<Guid> ancestorIds, SqliteConnection db, SqliteCommand deleteAncestorsStatement)
private void UpdateAncestors(Guid itemId, List<Guid> ancestorIds, ManagedConnection db, SqliteCommand deleteAncestorsStatement)
{
if (itemId.IsEmpty())
{
@ -4788,7 +4790,7 @@ AND Type = @InternalPersonType)");
var list = new List<string>();
using (new QueryTimeLogger(Logger, commandText))
using (var connection = GetConnection())
using (var connection = GetConnection(true))
using (var statement = PrepareStatement(connection, commandText))
{
foreach (var row in statement.ExecuteQuery())
@ -4988,8 +4990,8 @@ AND Type = @InternalPersonType)");
var list = new List<(BaseItem, ItemCounts)>();
var result = new QueryResult<(BaseItem, ItemCounts)>();
using (new QueryTimeLogger(Logger, commandText))
using (var connection = GetConnection())
using (var transaction = connection.BeginTransaction(deferred: true))
using (var connection = GetConnection(true))
using (var transaction = connection.BeginTransaction())
{
if (!isReturningZeroItems)
{
@ -5021,7 +5023,7 @@ AND Type = @InternalPersonType)");
foreach (var row in statement.ExecuteQuery())
{
var item = GetItem(row, query, hasProgramAttributes, hasEpisodeAttributes, hasServiceName, hasStartDate, hasTrailerTypes, hasArtistFields, hasSeriesFields);
var item = GetItem(row, query, hasProgramAttributes, hasEpisodeAttributes, hasServiceName, hasStartDate, hasTrailerTypes, hasArtistFields, hasSeriesFields, false);
if (item is not null)
{
var countStartColumn = columns.Count - 1;
@ -5144,12 +5146,12 @@ AND Type = @InternalPersonType)");
list.AddRange(inheritedTags.Select(i => (6, i)));
// Remove all invalid values.
list.RemoveAll(i => string.IsNullOrEmpty(i.Item2));
list.RemoveAll(i => string.IsNullOrWhiteSpace(i.Item2));
return list;
}
private void UpdateItemValues(Guid itemId, List<(int MagicNumber, string Value)> values, SqliteConnection db)
private void UpdateItemValues(Guid itemId, List<(int MagicNumber, string Value)> values, ManagedConnection db)
{
if (itemId.IsEmpty())
{
@ -5168,7 +5170,7 @@ AND Type = @InternalPersonType)");
InsertItemValues(itemId, values, db);
}
private void InsertItemValues(Guid id, List<(int MagicNumber, string Value)> values, SqliteConnection db)
private void InsertItemValues(Guid id, List<(int MagicNumber, string Value)> values, ManagedConnection db)
{
const int Limit = 100;
var startIndex = 0;
@ -5202,12 +5204,6 @@ AND Type = @InternalPersonType)");
var itemValue = currentValueInfo.Value;
// Don't save if invalid
if (string.IsNullOrWhiteSpace(itemValue))
{
continue;
}
statement.TryBind("@Type" + index, currentValueInfo.MagicNumber);
statement.TryBind("@Value" + index, itemValue);
statement.TryBind("@CleanValue" + index, GetCleanValue(itemValue));
@ -5228,24 +5224,25 @@ AND Type = @InternalPersonType)");
throw new ArgumentNullException(nameof(itemId));
}
ArgumentNullException.ThrowIfNull(people);
CheckDisposed();
using var connection = GetConnection();
using var transaction = connection.BeginTransaction();
// First delete chapters
// Delete all existing people first
using var command = connection.CreateCommand();
command.CommandText = "delete from People where ItemId=@ItemId";
command.TryBind("@ItemId", itemId);
command.ExecuteNonQuery();
InsertPeople(itemId, people, connection);
if (people is not null)
{
InsertPeople(itemId, people, connection);
}
transaction.Commit();
}
private void InsertPeople(Guid id, List<PersonInfo> people, SqliteConnection db)
private void InsertPeople(Guid id, List<PersonInfo> people, ManagedConnection db)
{
const int Limit = 100;
var startIndex = 0;
@ -5341,7 +5338,7 @@ AND Type = @InternalPersonType)");
cmdText += " order by StreamIndex ASC";
using (var connection = GetConnection())
using (var connection = GetConnection(true))
{
var list = new List<MediaStream>();
@ -5394,7 +5391,7 @@ AND Type = @InternalPersonType)");
transaction.Commit();
}
private void InsertMediaStreams(Guid id, IReadOnlyList<MediaStream> streams, SqliteConnection db)
private void InsertMediaStreams(Guid id, IReadOnlyList<MediaStream> streams, ManagedConnection db)
{
const int Limit = 10;
var startIndex = 0;
@ -5489,6 +5486,8 @@ AND Type = @InternalPersonType)");
statement.TryBind("@DvBlSignalCompatibilityId" + index, stream.DvBlSignalCompatibilityId);
statement.TryBind("@IsHearingImpaired" + index, stream.IsHearingImpaired);
statement.TryBind("@Rotation" + index, stream.Rotation);
}
statement.ExecuteNonQuery();
@ -5700,13 +5699,22 @@ AND Type = @InternalPersonType)");
item.IsHearingImpaired = reader.TryGetBoolean(43, out var result) && result;
if (item.Type == MediaStreamType.Subtitle)
if (reader.TryGetInt32(44, out var rotation))
{
item.Rotation = rotation;
}
if (item.Type is MediaStreamType.Audio or MediaStreamType.Subtitle)
{
item.LocalizedUndefined = _localization.GetLocalizedString("Undefined");
item.LocalizedDefault = _localization.GetLocalizedString("Default");
item.LocalizedForced = _localization.GetLocalizedString("Forced");
item.LocalizedExternal = _localization.GetLocalizedString("External");
item.LocalizedHearingImpaired = _localization.GetLocalizedString("HearingImpaired");
if (item.Type is MediaStreamType.Subtitle)
{
item.LocalizedUndefined = _localization.GetLocalizedString("Undefined");
item.LocalizedForced = _localization.GetLocalizedString("Forced");
item.LocalizedHearingImpaired = _localization.GetLocalizedString("HearingImpaired");
}
}
return item;
@ -5728,7 +5736,7 @@ AND Type = @InternalPersonType)");
cmdText += " order by AttachmentIndex ASC";
var list = new List<MediaAttachment>();
using (var connection = GetConnection())
using (var connection = GetConnection(true))
using (var statement = PrepareStatement(connection, cmdText))
{
statement.TryBind("@ItemId", query.ItemId);
@ -5778,7 +5786,7 @@ AND Type = @InternalPersonType)");
private void InsertMediaAttachments(
Guid id,
IReadOnlyList<MediaAttachment> attachments,
SqliteConnection db,
ManagedConnection db,
CancellationToken cancellationToken)
{
const int InsertAtOnce = 10;

View File

@ -86,7 +86,7 @@ namespace Emby.Server.Implementations.Data
}
}
private void ImportUserIds(SqliteConnection db, IEnumerable<User> users)
private void ImportUserIds(ManagedConnection db, IEnumerable<User> users)
{
var userIdsWithUserData = GetAllUserIdsWithUserData(db);
@ -107,7 +107,7 @@ namespace Emby.Server.Implementations.Data
}
}
private List<Guid> GetAllUserIdsWithUserData(SqliteConnection db)
private List<Guid> GetAllUserIdsWithUserData(ManagedConnection db)
{
var list = new List<Guid>();
@ -176,7 +176,7 @@ namespace Emby.Server.Implementations.Data
}
}
private static void SaveUserData(SqliteConnection db, long internalUserId, string key, UserItemData userData)
private static void SaveUserData(ManagedConnection 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)"))
{
@ -267,7 +267,7 @@ namespace Emby.Server.Implementations.Data
ArgumentException.ThrowIfNullOrEmpty(key);
using (var connection = GetConnection())
using (var connection = GetConnection(true))
{
using (var statement = connection.PrepareStatement("select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex from UserDatas where key =@Key and userId=@UserId"))
{
@ -333,10 +333,10 @@ namespace Emby.Server.Implementations.Data
/// <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();
var userData = new UserItemData
{
Key = reader.GetString(0)
};
if (reader.TryGetDouble(2, out var rating))
{

View File

@ -1,5 +1,3 @@
#nullable disable
#pragma warning disable CS1591
using System;
@ -83,12 +81,12 @@ namespace Emby.Server.Implementations.Dto
private ILiveTvManager LivetvManager => _livetvManagerFactory.Value;
/// <inheritdoc />
public IReadOnlyList<BaseItemDto> GetBaseItemDtos(IReadOnlyList<BaseItem> items, DtoOptions options, User user = null, BaseItem owner = null)
public IReadOnlyList<BaseItemDto> GetBaseItemDtos(IReadOnlyList<BaseItem> items, DtoOptions options, User? user = null, BaseItem? owner = null)
{
var accessibleItems = user is null ? items : items.Where(x => x.IsVisible(user)).ToList();
var returnItems = new BaseItemDto[accessibleItems.Count];
List<(BaseItem, BaseItemDto)> programTuples = null;
List<(BaseItemDto, LiveTvChannel)> channelTuples = null;
List<(BaseItem, BaseItemDto)>? programTuples = null;
List<(BaseItemDto, LiveTvChannel)>? channelTuples = null;
for (int index = 0; index < accessibleItems.Count; index++)
{
@ -137,7 +135,7 @@ namespace Emby.Server.Implementations.Dto
return returnItems;
}
public BaseItemDto GetBaseItemDto(BaseItem item, DtoOptions options, User user = null, BaseItem owner = null)
public BaseItemDto GetBaseItemDto(BaseItem item, DtoOptions options, User? user = null, BaseItem? owner = null)
{
var dto = GetBaseItemDtoInternal(item, options, user, owner);
if (item is LiveTvChannel tvChannel)
@ -167,7 +165,7 @@ namespace Emby.Server.Implementations.Dto
return dto;
}
private static IList<BaseItem> GetTaggedItems(IItemByName byName, User user, DtoOptions options)
private static IList<BaseItem> GetTaggedItems(IItemByName byName, User? user, DtoOptions options)
{
return byName.GetTaggedItems(
new InternalItemsQuery(user)
@ -177,7 +175,7 @@ namespace Emby.Server.Implementations.Dto
});
}
private BaseItemDto GetBaseItemDtoInternal(BaseItem item, DtoOptions options, User user = null, BaseItem owner = null)
private BaseItemDto GetBaseItemDtoInternal(BaseItem item, DtoOptions options, User? user = null, BaseItem? owner = null)
{
var dto = new BaseItemDto
{
@ -292,7 +290,7 @@ namespace Emby.Server.Implementations.Dto
}
var path = mediaSource.Path;
string fileExtensionContainer = null;
string? fileExtensionContainer = null;
if (!string.IsNullOrEmpty(path))
{
@ -316,7 +314,8 @@ namespace Emby.Server.Implementations.Dto
}
}
public BaseItemDto GetItemByNameDto(BaseItem item, DtoOptions options, List<BaseItem> taggedItems, User user = null)
/// <inheritdoc />
public BaseItemDto GetItemByNameDto(BaseItem item, DtoOptions options, List<BaseItem>? taggedItems, User? user = null)
{
var dto = GetBaseItemDtoInternal(item, options, user);
@ -486,10 +485,10 @@ namespace Emby.Server.Implementations.Dto
return images
.Select(p => GetImageCacheTag(item, p))
.Where(i => i is not null)
.ToArray();
.ToArray()!; // null values got filtered out
}
private string GetImageCacheTag(BaseItem item, ItemImageInfo image)
private string? GetImageCacheTag(BaseItem item, ItemImageInfo image)
{
try
{
@ -508,7 +507,7 @@ namespace Emby.Server.Implementations.Dto
/// <param name="dto">The dto.</param>
/// <param name="item">The item.</param>
/// <param name="user">The requesting user.</param>
private void AttachPeople(BaseItemDto dto, BaseItem item, User user = null)
private void AttachPeople(BaseItemDto dto, BaseItem item, User? user = null)
{
// Ordering by person type to ensure actors and artists are at the front.
// This is taking advantage of the fact that they both begin with A
@ -552,7 +551,7 @@ namespace Emby.Server.Implementations.Dto
var list = new List<BaseItemPerson>();
var dictionary = people.Select(p => p.Name)
Dictionary<string, Person> dictionary = people.Select(p => p.Name)
.Distinct(StringComparer.OrdinalIgnoreCase).Select(c =>
{
try
@ -565,9 +564,9 @@ namespace Emby.Server.Implementations.Dto
return null;
}
}).Where(i => i is not null)
.Where(i => user is null || i.IsVisible(user))
.DistinctBy(x => x.Name, StringComparer.OrdinalIgnoreCase)
.ToDictionary(i => i.Name, StringComparer.OrdinalIgnoreCase);
.Where(i => user is null || i!.IsVisible(user))
.DistinctBy(x => x!.Name, StringComparer.OrdinalIgnoreCase)
.ToDictionary(i => i!.Name, StringComparer.OrdinalIgnoreCase)!; // null values got filtered out
for (var i = 0; i < people.Count; i++)
{
@ -580,7 +579,7 @@ namespace Emby.Server.Implementations.Dto
Type = person.Type
};
if (dictionary.TryGetValue(person.Name, out Person entity))
if (dictionary.TryGetValue(person.Name, out Person? entity))
{
baseItemPerson.PrimaryImageTag = GetTagAndFillBlurhash(dto, entity, ImageType.Primary);
baseItemPerson.Id = entity.Id;
@ -650,7 +649,7 @@ namespace Emby.Server.Implementations.Dto
return _libraryManager.GetGenreId(name);
}
private string GetTagAndFillBlurhash(BaseItemDto dto, BaseItem item, ImageType imageType, int imageIndex = 0)
private string? GetTagAndFillBlurhash(BaseItemDto dto, BaseItem item, ImageType imageType, int imageIndex = 0)
{
var image = item.GetImageInfo(imageType, imageIndex);
if (image is not null)
@ -661,9 +660,14 @@ namespace Emby.Server.Implementations.Dto
return null;
}
private string GetTagAndFillBlurhash(BaseItemDto dto, BaseItem item, ItemImageInfo image)
private string? GetTagAndFillBlurhash(BaseItemDto dto, BaseItem item, ItemImageInfo image)
{
var tag = GetImageCacheTag(item, image);
if (tag is null)
{
return null;
}
if (!string.IsNullOrEmpty(image.BlurHash))
{
dto.ImageBlurHashes ??= new Dictionary<ImageType, Dictionary<string, string>>();
@ -716,7 +720,7 @@ namespace Emby.Server.Implementations.Dto
/// <param name="item">The item.</param>
/// <param name="owner">The owner.</param>
/// <param name="options">The options.</param>
private void AttachBasicFields(BaseItemDto dto, BaseItem item, BaseItem owner, DtoOptions options)
private void AttachBasicFields(BaseItemDto dto, BaseItem item, BaseItem? owner, DtoOptions options)
{
if (options.ContainsField(ItemFields.DateCreated))
{
@ -1097,7 +1101,7 @@ namespace Emby.Server.Implementations.Dto
}
}
BaseItem[] allExtras = null;
BaseItem[]? allExtras = null;
if (options.ContainsField(ItemFields.SpecialFeatureCount))
{
@ -1134,7 +1138,7 @@ namespace Emby.Server.Implementations.Dto
dto.SeasonId = episode.SeasonId;
dto.SeriesId = episode.SeriesId;
Series episodeSeries = null;
Series? episodeSeries = null;
// this block will add the series poster for episodes without a poster
// TODO maybe remove the if statement entirely
@ -1162,8 +1166,10 @@ namespace Emby.Server.Implementations.Dto
}
// Add SeriesInfo
if (item is Series series)
Series? series;
if (item is Series tmp)
{
series = tmp;
dto.AirDays = series.AirDays;
dto.AirTime = series.AirTime;
dto.Status = series.Status?.ToString();
@ -1264,7 +1270,7 @@ namespace Emby.Server.Implementations.Dto
}
}
private BaseItem GetImageDisplayParent(BaseItem currentItem, BaseItem originalItem)
private BaseItem? GetImageDisplayParent(BaseItem currentItem, BaseItem originalItem)
{
if (currentItem is MusicAlbum musicAlbum)
{
@ -1285,7 +1291,7 @@ namespace Emby.Server.Implementations.Dto
return parent;
}
private void AddInheritedImages(BaseItemDto dto, BaseItem item, DtoOptions options, BaseItem owner)
private void AddInheritedImages(BaseItemDto dto, BaseItem item, DtoOptions options, BaseItem? owner)
{
if (!item.SupportsInheritedParentImages)
{
@ -1305,7 +1311,7 @@ namespace Emby.Server.Implementations.Dto
return;
}
BaseItem parent = null;
BaseItem? parent = null;
var isFirst = true;
var imageTags = dto.ImageTags;
@ -1378,7 +1384,7 @@ namespace Emby.Server.Implementations.Dto
}
}
private string GetMappedPath(BaseItem item, BaseItem ownerItem)
private string GetMappedPath(BaseItem item, BaseItem? ownerItem)
{
var path = item.Path;

View File

@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
@ -134,17 +133,18 @@ 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);
dto.ItemId = i.Id;
return dto;
})
.ToArray()

View File

@ -80,12 +80,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 +99,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 +149,26 @@ namespace Emby.Server.Implementations.IO
}
}
/// <inheritdoc />
public void MoveDirectory(string source, string destination)
{
try
{
Directory.Move(source, destination);
}
catch (IOException)
{
// Cross device move requires a copy
Directory.CreateDirectory(destination);
foreach (string file in Directory.GetFiles(source))
{
File.Copy(file, Path.Combine(destination, Path.GetFileName(file)), true);
}
Directory.Delete(source, true);
}
}
/// <summary>
/// Returns a <see cref="FileSystemMetadata"/> object for the specified file or directory path.
/// </summary>
@ -332,11 +347,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 +384,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 +401,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 +429,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 +458,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 +474,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 />

View File

@ -122,6 +122,7 @@ namespace Emby.Server.Implementations.Images
}
await ProviderManager.SaveImage(item, outputPath, mimeType, imageType, null, false, cancellationToken).ConfigureAwait(false);
File.Delete(outputPath);
return ItemUpdateType.ImageUpdate;
}

View File

@ -11,7 +11,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 +32,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
});
}

View File

@ -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();
}
}
}

View File

@ -1,4 +1,5 @@
#pragma warning disable CS1591
#pragma warning disable CA5394
using System;
using System.Collections.Concurrent;
@ -16,6 +17,7 @@ using Emby.Server.Implementations.Library.Resolvers;
using Emby.Server.Implementations.Library.Validators;
using Emby.Server.Implementations.Playlists;
using Emby.Server.Implementations.ScheduledTasks.Tasks;
using Emby.Server.Implementations.Sorting;
using Jellyfin.Data.Entities;
using Jellyfin.Data.Enums;
using Jellyfin.Extensions;
@ -667,7 +669,7 @@ namespace Emby.Server.Implementations.Library
if (parent is not null)
{
var multiItemResolvers = resolvers is null ? MultiItemResolvers : resolvers.OfType<IMultiItemResolver>().ToArray();
var multiItemResolvers = resolvers is null ? MultiItemResolvers : resolvers.OfType<IMultiItemResolver>();
foreach (var resolver in multiItemResolvers)
{
@ -1029,7 +1031,7 @@ namespace Emby.Server.Implementations.Library
}
}
private async Task ValidateTopLibraryFolders(CancellationToken cancellationToken, bool removeRoot = false)
public async Task ValidateTopLibraryFolders(CancellationToken cancellationToken, bool removeRoot = false)
{
await RootFolder.RefreshMetadata(cancellationToken).ConfigureAwait(false);
@ -1528,7 +1530,7 @@ namespace Emby.Server.Implementations.Library
{
var userViews = UserViewManager.GetUserViews(new UserViewQuery
{
UserId = user.Id,
User = user,
IncludeHidden = true,
IncludeExternalContent = allowExternalContent
});
@ -1710,13 +1712,19 @@ namespace Emby.Server.Implementations.Library
/// <inheritdoc />
public IEnumerable<BaseItem> Sort(IEnumerable<BaseItem> items, User? user, IEnumerable<ItemSortBy> sortBy, SortOrder sortOrder)
{
var isFirst = true;
IOrderedEnumerable<BaseItem>? orderedItems = null;
foreach (var orderBy in sortBy.Select(o => GetComparer(o, user)).Where(c => c is not null))
{
if (isFirst)
if (orderBy is RandomComparer)
{
var randomItems = items.ToArray();
Random.Shared.Shuffle(randomItems);
items = randomItems;
// Items are no longer ordered at this point, so set orderedItems back to null
orderedItems = null;
}
else if (orderedItems is null)
{
orderedItems = sortOrder == SortOrder.Descending
? items.OrderByDescending(i => i, orderBy)
@ -1728,8 +1736,6 @@ namespace Emby.Server.Implementations.Library
? orderedItems!.ThenByDescending(i => i, orderBy)
: orderedItems!.ThenBy(i => i, orderBy); // orderedItems is set during the first iteration
}
isFirst = false;
}
return orderedItems ?? items;
@ -1738,8 +1744,6 @@ namespace Emby.Server.Implementations.Library
/// <inheritdoc />
public IEnumerable<BaseItem> Sort(IEnumerable<BaseItem> items, User? user, IEnumerable<(ItemSortBy OrderBy, SortOrder SortOrder)> orderBy)
{
var isFirst = true;
IOrderedEnumerable<BaseItem>? orderedItems = null;
foreach (var (name, sortOrder) in orderBy)
@ -1750,7 +1754,15 @@ namespace Emby.Server.Implementations.Library
continue;
}
if (isFirst)
if (comparer is RandomComparer)
{
var randomItems = items.ToArray();
Random.Shared.Shuffle(randomItems);
items = randomItems;
// Items are no longer ordered at this point, so set orderedItems back to null
orderedItems = null;
}
else if (orderedItems is null)
{
orderedItems = sortOrder == SortOrder.Descending
? items.OrderByDescending(i => i, comparer)
@ -1762,8 +1774,6 @@ namespace Emby.Server.Implementations.Library
? orderedItems!.ThenByDescending(i => i, comparer)
: orderedItems!.ThenBy(i => i, comparer); // orderedItems is set during the first iteration
}
isFirst = false;
}
return orderedItems ?? items;
@ -1884,7 +1894,7 @@ namespace Emby.Server.Implementations.Library
try
{
var index = item.GetImageIndex(img);
image = await ConvertImageToLocal(item, img, index, removeOnFailure: true).ConfigureAwait(false);
image = await ConvertImageToLocal(item, img, index, true).ConfigureAwait(false);
}
catch (ArgumentException)
{
@ -2715,33 +2725,9 @@ namespace Emby.Server.Implementations.Library
public string GetPathAfterNetworkSubstitution(string path, BaseItem? ownerItem)
{
string? newPath;
if (ownerItem is not null)
{
var libraryOptions = GetLibraryOptions(ownerItem);
if (libraryOptions is not null)
{
foreach (var pathInfo in libraryOptions.PathInfos)
{
if (path.TryReplaceSubPath(pathInfo.Path, pathInfo.NetworkPath, out newPath))
{
return newPath;
}
}
}
}
var metadataPath = _configurationManager.Configuration.MetadataPath;
var metadataNetworkPath = _configurationManager.Configuration.MetadataNetworkPath;
if (path.TryReplaceSubPath(metadataPath, metadataNetworkPath, out newPath))
{
return newPath;
}
foreach (var map in _configurationManager.Configuration.PathSubstitutions)
{
if (path.TryReplaceSubPath(map.From, map.To, out newPath))
if (path.TryReplaceSubPath(map.From, map.To, out var newPath))
{
return newPath;
}
@ -2812,8 +2798,10 @@ namespace Emby.Server.Implementations.Library
}
_itemRepository.UpdatePeople(item.Id, people);
await SavePeopleMetadataAsync(people, cancellationToken).ConfigureAwait(false);
if (people is not null)
{
await SavePeopleMetadataAsync(people, cancellationToken).ConfigureAwait(false);
}
}
public async Task<ItemImageInfo> ConvertImageToLocal(BaseItem item, ItemImageInfo image, int imageIndex, bool removeOnFailure)
@ -3058,15 +3046,6 @@ namespace Emby.Server.Implementations.Library
SyncLibraryOptionsToLocations(virtualFolderPath, libraryOptions);
foreach (var originalPathInfo in libraryOptions.PathInfos)
{
if (string.Equals(mediaPath.Path, originalPathInfo.Path, StringComparison.Ordinal))
{
originalPathInfo.NetworkPath = mediaPath.NetworkPath;
break;
}
}
CollectionFolder.SaveLibraryOptions(virtualFolderPath, libraryOptions);
}

View File

@ -113,6 +113,11 @@ namespace Emby.Server.Implementations.Library
return true;
}
if (stream.IsPgsSubtitleStream)
{
return true;
}
return false;
}
@ -374,7 +379,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)
@ -406,7 +412,7 @@ namespace Emby.Server.Implementations.Library
private void SetDefaultAudioStreamIndex(MediaSourceInfo source, UserItemData userData, User user, bool allowRememberingSelection)
{
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
@ -429,7 +435,7 @@ 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;

View File

@ -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;

View File

@ -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))
{

View File

@ -68,11 +68,7 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies
var justName = Path.GetFileName(item.Path.AsSpan());
var id = justName.GetAttributeValue("tmdbid");
if (!string.IsNullOrEmpty(id))
{
item.SetProviderId(MetadataProvider.Tmdb, id);
}
item.TrySetProviderId(MetadataProvider.Tmdb, id);
}
}
}

View File

@ -373,22 +373,14 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies
{
// Check for TMDb id
var tmdbid = justName.GetAttributeValue("tmdbid");
if (!string.IsNullOrWhiteSpace(tmdbid))
{
item.SetProviderId(MetadataProvider.Tmdb, tmdbid);
}
item.TrySetProviderId(MetadataProvider.Tmdb, tmdbid);
}
if (!string.IsNullOrEmpty(item.Path))
{
// Check for IMDb id - we use full media path, as we can assume that this will match in any use case (whether id in parent dir or in file name)
var imdbid = item.Path.AsSpan().GetAttributeValue("imdbid");
if (!string.IsNullOrWhiteSpace(imdbid))
{
item.SetProviderId(MetadataProvider.Imdb, imdbid);
}
item.TrySetProviderId(MetadataProvider.Imdb, imdbid);
}
}
}

View File

@ -54,7 +54,8 @@ namespace Emby.Server.Implementations.Library.Resolvers.TV
{
IndexNumber = seasonParserResult.SeasonNumber,
SeriesId = series.Id,
SeriesName = series.Name
SeriesName = series.Name,
Path = seasonParserResult.IsSeasonFolder ? path : null
};
if (!season.IndexNumber.HasValue || !seasonParserResult.IsSeasonFolder)
@ -78,27 +79,16 @@ namespace Emby.Server.Implementations.Library.Resolvers.TV
}
}
if (season.IndexNumber.HasValue)
if (season.IndexNumber.HasValue && string.IsNullOrEmpty(season.Name))
{
var seasonNumber = season.IndexNumber.Value;
if (string.IsNullOrEmpty(season.Name))
{
var seasonNames = series.SeasonNames;
if (seasonNames.TryGetValue(seasonNumber, out var seasonName))
{
season.Name = seasonName;
}
else
{
season.Name = seasonNumber == 0 ?
args.LibraryOptions.SeasonZeroDisplayName :
string.Format(
CultureInfo.InvariantCulture,
_localization.GetLocalizedString("NameSeasonNumber"),
seasonNumber,
args.LibraryOptions.PreferredMetadataLanguage);
}
}
season.Name = seasonNumber == 0 ?
args.LibraryOptions.SeasonZeroDisplayName :
string.Format(
CultureInfo.InvariantCulture,
_localization.GetLocalizedString("NameSeasonNumber"),
seasonNumber,
args.LibraryOptions.PreferredMetadataLanguage);
}
return season;

View File

@ -186,46 +186,25 @@ namespace Emby.Server.Implementations.Library.Resolvers.TV
var justName = Path.GetFileName(path.AsSpan());
var imdbId = justName.GetAttributeValue("imdbid");
if (!string.IsNullOrEmpty(imdbId))
{
item.SetProviderId(MetadataProvider.Imdb, imdbId);
}
item.TrySetProviderId(MetadataProvider.Imdb, imdbId);
var tvdbId = justName.GetAttributeValue("tvdbid");
if (!string.IsNullOrEmpty(tvdbId))
{
item.SetProviderId(MetadataProvider.Tvdb, tvdbId);
}
item.TrySetProviderId(MetadataProvider.Tvdb, tvdbId);
var tvmazeId = justName.GetAttributeValue("tvmazeid");
if (!string.IsNullOrEmpty(tvmazeId))
{
item.SetProviderId(MetadataProvider.TvMaze, tvmazeId);
}
item.TrySetProviderId(MetadataProvider.TvMaze, tvmazeId);
var tmdbId = justName.GetAttributeValue("tmdbid");
if (!string.IsNullOrEmpty(tmdbId))
{
item.SetProviderId(MetadataProvider.Tmdb, tmdbId);
}
item.TrySetProviderId(MetadataProvider.Tmdb, tmdbId);
var anidbId = justName.GetAttributeValue("anidbid");
if (!string.IsNullOrEmpty(anidbId))
{
item.SetProviderId("AniDB", anidbId);
}
item.TrySetProviderId("AniDB", anidbId);
var aniListId = justName.GetAttributeValue("anilistid");
if (!string.IsNullOrEmpty(aniListId))
{
item.SetProviderId("AniList", aniListId);
}
item.TrySetProviderId("AniList", aniListId);
var aniSearchId = justName.GetAttributeValue("anisearchid");
if (!string.IsNullOrEmpty(aniSearchId))
{
item.SetProviderId("AniSearch", aniSearchId);
}
item.TrySetProviderId("AniSearch", aniSearchId);
}
}
}

View File

@ -1,10 +1,7 @@
#nullable disable
#pragma warning disable CS1591
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.Threading;
using Jellyfin.Data.Entities;
@ -32,6 +29,12 @@ namespace Emby.Server.Implementations.Library
private readonly IUserManager _userManager;
private readonly IUserDataRepository _repository;
/// <summary>
/// Initializes a new instance of the <see cref="UserDataManager"/> class.
/// </summary>
/// <param name="config">Instance of the <see cref="IServerConfigurationManager"/> interface.</param>
/// <param name="userManager">Instance of the <see cref="IUserManager"/> interface.</param>
/// <param name="repository">Instance of the <see cref="IUserDataRepository"/> interface.</param>
public UserDataManager(
IServerConfigurationManager config,
IUserManager userManager,
@ -42,15 +45,10 @@ namespace Emby.Server.Implementations.Library
_repository = repository;
}
public event EventHandler<UserDataSaveEventArgs> UserDataSaved;
public void SaveUserData(Guid userId, BaseItem item, UserItemData userData, UserDataSaveReason reason, CancellationToken cancellationToken)
{
var user = _userManager.GetUserById(userId);
SaveUserData(user, item, userData, reason, cancellationToken);
}
/// <inheritdoc />
public event EventHandler<UserDataSaveEventArgs>? UserDataSaved;
/// <inheritdoc />
public void SaveUserData(User user, BaseItem item, UserItemData userData, UserDataSaveReason reason, CancellationToken cancellationToken)
{
ArgumentNullException.ThrowIfNull(userData);
@ -81,6 +79,7 @@ namespace Emby.Server.Implementations.Library
});
}
/// <inheritdoc />
public void SaveUserData(User user, BaseItem item, UpdateUserItemDataDto userDataDto, UserDataSaveReason reason)
{
ArgumentNullException.ThrowIfNull(user);
@ -128,39 +127,7 @@ namespace Emby.Server.Implementations.Library
SaveUserData(user, item, userData, reason, CancellationToken.None);
}
/// <summary>
/// Save the provided user data for the given user. Batch operation. Does not fire any events or update the cache.
/// </summary>
/// <param name="userId">The user id.</param>
/// <param name="userData">The user item data.</param>
/// <param name="cancellationToken">The cancellation token.</param>
public void SaveAllUserData(Guid userId, UserItemData[] userData, CancellationToken cancellationToken)
{
var user = _userManager.GetUserById(userId);
_repository.SaveAllUserData(user.InternalId, userData, cancellationToken);
}
/// <summary>
/// Retrieve all user data for the given user.
/// </summary>
/// <param name="userId">The user id.</param>
/// <returns>A <see cref="List{UserItemData}"/> containing all of the user's item data.</returns>
public List<UserItemData> GetAllUserData(Guid userId)
{
var user = _userManager.GetUserById(userId);
return _repository.GetAllUserData(user.InternalId);
}
public UserItemData GetUserData(Guid userId, Guid itemId, List<string> keys)
{
var user = _userManager.GetUserById(userId);
return GetUserData(user, itemId, keys);
}
public UserItemData GetUserData(User user, Guid itemId, List<string> keys)
private UserItemData GetUserData(User user, Guid itemId, List<string> keys)
{
var userId = user.InternalId;
@ -186,7 +153,7 @@ namespace Emby.Server.Implementations.Library
};
}
return null;
throw new UnreachableException();
}
/// <summary>
@ -198,27 +165,18 @@ namespace Emby.Server.Implementations.Library
return internalUserId.ToString(CultureInfo.InvariantCulture) + "-" + itemId.ToString("N", CultureInfo.InvariantCulture);
}
/// <inheritdoc />
public UserItemData GetUserData(User user, BaseItem item)
{
return GetUserData(user, item.Id, item.GetUserDataKeys());
}
public UserItemData GetUserData(Guid userId, BaseItem item)
{
return GetUserData(userId, item.Id, item.GetUserDataKeys());
}
/// <inheritdoc />
public UserItemDataDto GetUserDataDto(BaseItem item, User user)
{
var userData = GetUserData(user, item);
var dto = GetUserItemDataDto(userData);
item.FillUserDataDtoValues(dto, userData, null, user, new DtoOptions());
return dto;
}
=> GetUserDataDto(item, null, user, new DtoOptions());
/// <inheritdoc />
public UserItemDataDto GetUserDataDto(BaseItem item, BaseItemDto itemDto, User user, DtoOptions options)
public UserItemDataDto GetUserDataDto(BaseItem item, BaseItemDto? itemDto, User user, DtoOptions options)
{
var userData = GetUserData(user, item);
var dto = GetUserItemDataDto(userData);

View File

@ -16,7 +16,6 @@ using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.LiveTv;
using MediaBrowser.Model.Channels;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Globalization;
using MediaBrowser.Model.Library;
using MediaBrowser.Model.Querying;
@ -27,17 +26,15 @@ namespace Emby.Server.Implementations.Library
{
private readonly ILibraryManager _libraryManager;
private readonly ILocalizationManager _localizationManager;
private readonly IUserManager _userManager;
private readonly IChannelManager _channelManager;
private readonly ILiveTvManager _liveTvManager;
private readonly IServerConfigurationManager _config;
public UserViewManager(ILibraryManager libraryManager, ILocalizationManager localizationManager, IUserManager userManager, IChannelManager channelManager, ILiveTvManager liveTvManager, IServerConfigurationManager config)
public UserViewManager(ILibraryManager libraryManager, ILocalizationManager localizationManager, IChannelManager channelManager, ILiveTvManager liveTvManager, IServerConfigurationManager config)
{
_libraryManager = libraryManager;
_localizationManager = localizationManager;
_userManager = userManager;
_channelManager = channelManager;
_liveTvManager = liveTvManager;
_config = config;
@ -45,11 +42,7 @@ namespace Emby.Server.Implementations.Library
public Folder[] GetUserViews(UserViewQuery query)
{
var user = _userManager.GetUserById(query.UserId);
if (user is null)
{
throw new ArgumentException("User id specified in the query does not exist.", nameof(query));
}
var user = query.User;
var folders = _libraryManager.GetUserRootFolder()
.GetChildren(user, true)
@ -125,14 +118,14 @@ namespace Emby.Server.Implementations.Library
{
var channelResult = _channelManager.GetChannelsInternalAsync(new ChannelQuery
{
UserId = query.UserId
UserId = user.Id
}).GetAwaiter().GetResult();
var channels = channelResult.Items;
list.AddRange(channels);
if (_liveTvManager.GetEnabledUsers().Select(i => i.Id).Contains(query.UserId))
if (_liveTvManager.GetEnabledUsers().Select(i => i.Id).Contains(user.Id))
{
list.Add(_liveTvManager.GetInternalLiveTvFolder(CancellationToken.None));
}
@ -207,9 +200,7 @@ namespace Emby.Server.Implementations.Library
public List<Tuple<BaseItem, List<BaseItem>>> GetLatestItems(LatestItemsQuery request, DtoOptions options)
{
var user = _userManager.GetUserById(request.UserId);
var libraryItems = GetItemsForLatestItems(user, request, options);
var libraryItems = GetItemsForLatestItems(request.User, request, options);
var list = new List<Tuple<BaseItem, List<BaseItem>>>();

View File

@ -1 +1,3 @@
{}
{
"Albums": "аальбомқәа"
}

View File

@ -5,12 +5,12 @@
"Favorites": "Gunstelinge",
"HeaderFavoriteShows": "Gunsteling Vertonings",
"ValueSpecialEpisodeName": "Spesiale - {0}",
"HeaderAlbumArtists": "Kunstenaars se Album",
"HeaderAlbumArtists": "Album kunstenaars",
"Books": "Boeke",
"HeaderNextUp": "Volgende",
"Movies": "Flieks",
"Shows": "Televisie Reekse",
"HeaderContinueWatching": "Kyk Verder",
"HeaderContinueWatching": "Hou aan kyk",
"HeaderFavoriteEpisodes": "Gunsteling Episodes",
"Photos": "Foto's",
"Playlists": "Snitlyste",
@ -19,7 +19,7 @@
"Sync": "Sinkroniseer",
"HeaderFavoriteSongs": "Gunsteling Liedjies",
"Songs": "Liedjies",
"DeviceOnlineWithName": "{0} is gekoppel",
"DeviceOnlineWithName": "{0} is aanlyn",
"DeviceOfflineWithName": "{0} is ontkoppel",
"Collections": "Versamelings",
"Inherit": "Ontvang",
@ -61,7 +61,7 @@
"NotificationOptionPluginInstalled": "Inprop module geïnstalleer",
"NotificationOptionPluginError": "Inprop module het misluk",
"NotificationOptionNewLibraryContent": "Nuwe inhoud bygevoeg",
"NotificationOptionInstallationFailed": "Installering het misluk",
"NotificationOptionInstallationFailed": "Installasie mislukking",
"NotificationOptionCameraImageUploaded": "Kamera foto is opgelaai",
"NotificationOptionAudioPlaybackStopped": "Oudio terugspeel het gestop",
"NotificationOptionAudioPlayback": "Oudio terugspeel het begin",
@ -86,9 +86,9 @@
"HomeVideos": "Tuis Videos",
"HeaderRecordingGroups": "Groep Opnames",
"Genres": "Genres",
"FailedLoginAttemptWithUserName": "Mislukte aansluiting van {0}",
"FailedLoginAttemptWithUserName": "Mislukte aanmeldpoging van {0}",
"ChapterNameValue": "Hoofstuk {0}",
"CameraImageUploadedFrom": "'n Nuwe kamera photo opgelaai van {0}",
"CameraImageUploadedFrom": "'n Nuwe kamera foto is opgelaai vanaf {0}",
"AuthenticationSucceededWithUserName": "{0} suksesvol geverifieer",
"Albums": "Albums",
"TasksChannelsCategory": "Internet kanale",
@ -114,8 +114,8 @@
"TaskRefreshChapterImagesDescription": "Maak kleinkiekeis (fotos) vir films wat hoofstukke het.",
"TaskRefreshChapterImages": "Verkry Hoofstuk Beelde",
"Undefined": "Ongedefineerd",
"Forced": "Geforseer",
"Default": "Oorspronklik",
"Forced": "Geforseerd",
"Default": "Standaard",
"TaskCleanActivityLogDescription": "Verwyder aktiwiteitsaantekeninge ouer as die opgestelde ouderdom.",
"TaskCleanActivityLog": "Maak Aktiwiteitsaantekeninge Skoon",
"TaskOptimizeDatabaseDescription": "Komprimeer databasis en verkort vrye ruimte. As hierdie taak uitgevoer word nadat die media versameling geskandeer is of ander veranderings aangebring is wat databasisaanpassings impliseer, kan dit die prestasie verbeter.",
@ -125,5 +125,9 @@
"External": "Ekstern",
"HearingImpaired": "gehoorgestremd",
"TaskRefreshTrickplayImages": "Genereer Fopspeel Beelde",
"TaskRefreshTrickplayImagesDescription": "Skep fopspeel voorskou vir videos in aangeskakelde media versameling."
"TaskRefreshTrickplayImagesDescription": "Skep fopspeel voorskou vir videos in aangeskakelde media versameling.",
"TaskAudioNormalizationDescription": "Skandeer lêers vir oudio-normaliseringsdata.",
"TaskAudioNormalization": "Odio Normalisering",
"TaskCleanCollectionsAndPlaylists": "Maak versamelings en snitlyste skoon",
"TaskCleanCollectionsAndPlaylistsDescription": "Verwyder items uit versamelings en snitlyste wat nie meer bestaan nie."
}

View File

@ -1,17 +1,17 @@
{
"Albums": "البومات",
"Albums": "ألبومات",
"AppDeviceValues": "تطبيق: {0}, جهاز: {1}",
"Application": "تطبيق",
"Artists": "الفنانين",
"Artists": "الفنانون",
"AuthenticationSucceededWithUserName": "نجحت عملية التوثيق بـ {0}",
"Books": "الكتب",
"CameraImageUploadedFrom": "رُفعت صورة الكاميرا الجديدة من {0}",
"Channels": "القنوات",
"ChapterNameValue": "الفصل {0}",
"Collections": "التجميعات",
"Collections": "المجموعات",
"DeviceOfflineWithName": "قُطِع الاتصال ب{0}",
"DeviceOnlineWithName": "{0} متصل",
"FailedLoginAttemptWithUserName": "محاولة تسجيل الدخول فشلت من {0}",
"FailedLoginAttemptWithUserName": "محاولة تسجيل الدخول فاشلة من {0}",
"Favorites": "المفضلة",
"Folders": "المجلدات",
"Genres": "التصنيفات",
@ -130,5 +130,6 @@
"TaskCleanCollectionsAndPlaylists": "حذف المجموعات وقوائم التشغيل",
"TaskCleanCollectionsAndPlaylistsDescription": "حذف عناصر من المجموعات وقوائم التشغيل التي لم تعد موجودة.",
"TaskAudioNormalization": "تطبيع الصوت",
"TaskAudioNormalizationDescription": "مسح الملفات لتطبيع بيانات الصوت."
"TaskAudioNormalizationDescription": "مسح الملفات لتطبيع بيانات الصوت.",
"TaskDownloadMissingLyrics": "تنزيل عبارات القصيدة"
}

View File

@ -52,7 +52,7 @@
"UserDownloadingItemWithValues": "{0} спампоўваецца {1}",
"TaskOptimizeDatabase": "Аптымізаваць базу дадзеных",
"Artists": "Выканаўцы",
"UserOfflineFromDevice": "{0} адключыўся ад {1}",
"UserOfflineFromDevice": "{0} адлучыўся ад {1}",
"UserPolicyUpdatedWithName": "Палітыка карыстальніка абноўлена для {0}",
"TaskCleanActivityLogDescription": "Выдаляе старэйшыя за зададзены ўзрост запісы ў журнале актыўнасці.",
"TaskRefreshChapterImagesDescription": "Стварае мініяцюры для відэа, якія маюць раздзелы.",
@ -66,7 +66,7 @@
"AppDeviceValues": "Прыкладанне: {0}, Прылада: {1}",
"Books": "Кнігі",
"CameraImageUploadedFrom": "Новая выява камеры была загружана з {0}",
"DeviceOfflineWithName": "{0} адключыўся",
"DeviceOfflineWithName": "{0} адлучыўся",
"DeviceOnlineWithName": "{0} падлучаны",
"Forced": "Прымусова",
"HeaderRecordingGroups": "Групы запісаў",
@ -127,5 +127,7 @@
"TaskRefreshTrickplayImages": "Стварыце выявы Trickplay",
"TaskRefreshTrickplayImagesDescription": "Стварае прагляд відэаролікаў для Trickplay у падключаных бібліятэках.",
"TaskCleanCollectionsAndPlaylists": "Ачысціце калекцыі і спісы прайгравання",
"TaskCleanCollectionsAndPlaylistsDescription": "Выдаляе элементы з калекцый і спісаў прайгравання, якія больш не існуюць."
"TaskCleanCollectionsAndPlaylistsDescription": "Выдаляе элементы з калекцый і спісаў прайгравання, якія больш не існуюць.",
"TaskAudioNormalizationDescription": "Сканіруе файлы на прадмет нармалізацыі гуку.",
"TaskAudioNormalization": "Нармалізацыя гуку"
}

View File

@ -130,5 +130,7 @@
"TaskCleanCollectionsAndPlaylistsDescription": "Esborra elements de col·leccions i llistes de reproducció que ja no existeixen.",
"TaskCleanCollectionsAndPlaylists": "Neteja col·leccions i llistes de reproducció",
"TaskAudioNormalization": "Normalització d'Àudio",
"TaskAudioNormalizationDescription": "Escaneja arxius per dades de normalització d'àudio."
"TaskAudioNormalizationDescription": "Escaneja arxius per dades de normalització d'àudio.",
"TaskDownloadMissingLyricsDescription": "Baixar lletres de les cançons",
"TaskDownloadMissingLyrics": "Baixar lletres que falten"
}

View File

@ -22,7 +22,7 @@
"HeaderFavoriteEpisodes": "Oblíbené epizody",
"HeaderFavoriteShows": "Oblíbené seriály",
"HeaderFavoriteSongs": "Oblíbená hudba",
"HeaderLiveTV": "Živý přenos",
"HeaderLiveTV": "TV vysílání",
"HeaderNextUp": "Další díly",
"HeaderRecordingGroups": "Skupiny nahrávek",
"HomeVideos": "Domácí videa",
@ -130,5 +130,7 @@
"TaskCleanCollectionsAndPlaylists": "Pročistit kolekce a seznamy přehrávání",
"TaskCleanCollectionsAndPlaylistsDescription": "Odstraní neexistující položky z kolekcí a seznamů přehrávání.",
"TaskAudioNormalization": "Normalizace zvuku",
"TaskAudioNormalizationDescription": "Skenovat soubory za účelem normalizace zvuku."
"TaskAudioNormalizationDescription": "Skenovat soubory za účelem normalizace zvuku.",
"TaskDownloadMissingLyrics": "Stáhnout chybějící texty k písni",
"TaskDownloadMissingLyricsDescription": "Stáhne texty k písni"
}

View File

@ -17,7 +17,7 @@
"Genres": "Genrer",
"HeaderAlbumArtists": "Albumkunstnere",
"HeaderContinueWatching": "Fortsæt afspilning",
"HeaderFavoriteAlbums": "Favoritalbummer",
"HeaderFavoriteAlbums": "Favoritalbum",
"HeaderFavoriteArtists": "Favoritkunstnere",
"HeaderFavoriteEpisodes": "Yndlingsafsnit",
"HeaderFavoriteShows": "Yndlingsserier",
@ -87,21 +87,21 @@
"UserOnlineFromDevice": "{0} er online fra {1}",
"UserPasswordChangedWithName": "Adgangskode er ændret for brugeren {0}",
"UserPolicyUpdatedWithName": "Brugerpolitikken er blevet opdateret for {0}",
"UserStartedPlayingItemWithValues": "{0} har påbegyndt afspilning af {1}",
"UserStartedPlayingItemWithValues": "{0} afspiller {1} på {2}",
"UserStoppedPlayingItemWithValues": "{0} har afsluttet afspilning af {1} på {2}",
"ValueHasBeenAddedToLibrary": "{0} er blevet tilføjet til dit mediebibliotek",
"ValueSpecialEpisodeName": "Special - {0}",
"VersionNumber": "Version {0}",
"TaskDownloadMissingSubtitlesDescription": "Søger på internettet efter manglende undertekster baseret på metadata-konfigurationen.",
"TaskDownloadMissingSubtitles": "Hent manglende undertekster",
"TaskUpdatePluginsDescription": "Henter og installerer opdateringer for plugins, som er indstillet til at blive opdateret automatisk.",
"TaskDownloadMissingSubtitles": "Hentede medie mangler undertekster",
"TaskUpdatePluginsDescription": "Henter og installerer opdateringer for plugins, som er konfigurerede til at blive opdateret automatisk.",
"TaskUpdatePlugins": "Opdater Plugins",
"TaskCleanLogsDescription": "Sletter log-filer som er mere end {0} dage gamle.",
"TaskCleanLogs": "Ryd Log-mappe",
"TaskRefreshLibraryDescription": "Scanner dit mediebibliotek for nye filer og opdateret metadata.",
"TaskRefreshLibrary": "Scan Mediebibliotek",
"TaskCleanCacheDescription": "Sletter cache-filer som systemet ikke længere bruger.",
"TaskCleanCache": "Ryd Cache-mappe",
"TaskCleanCache": "Ryd cache-mappe",
"TasksChannelsCategory": "Internetkanaler",
"TasksApplicationCategory": "Applikation",
"TasksLibraryCategory": "Bibliotek",
@ -128,5 +128,9 @@
"TaskRefreshTrickplayImages": "Generér Trickplay Billeder",
"TaskRefreshTrickplayImagesDescription": "Laver trickplay forhåndsvisninger for videoer i aktiverede biblioteker.",
"TaskCleanCollectionsAndPlaylists": "Ryd op i samlinger og afspilningslister",
"TaskCleanCollectionsAndPlaylistsDescription": "Fjerner enheder fra samlinger og afspilningslister der ikke eksisterer længere."
"TaskCleanCollectionsAndPlaylistsDescription": "Fjerner elementer fra samlinger og afspilningslister der ikke eksisterer længere.",
"TaskAudioNormalizationDescription": "Skanner filer for data vedrørende audio-normalisering.",
"TaskAudioNormalization": "Audio-normalisering",
"TaskDownloadMissingLyricsDescription": "Hentede sange mangler sangtekster",
"TaskDownloadMissingLyrics": "Hentede medie mangler sangtekster"
}

View File

@ -126,9 +126,11 @@
"External": "Extern",
"HearingImpaired": "Hörgeschädigt",
"TaskRefreshTrickplayImages": "Trickplay-Bilder generieren",
"TaskRefreshTrickplayImagesDescription": "Erstellt eine Trickplay-Vorschau für Videos in aktivierten Bibliotheken.",
"TaskRefreshTrickplayImagesDescription": "Erstellt ein Trickplay-Vorschauen für Videos in aktivierten Bibliotheken.",
"TaskCleanCollectionsAndPlaylists": "Sammlungen und Playlisten aufräumen",
"TaskCleanCollectionsAndPlaylistsDescription": "Lösche nicht mehr vorhandene Einträge aus den Sammlungen und Playlisten.",
"TaskAudioNormalization": "Audio Normalisierung",
"TaskAudioNormalizationDescription": "Durchsucht Dateien nach Audionormalisierungsdaten."
"TaskAudioNormalizationDescription": "Durchsucht Dateien nach Audionormalisierungsdaten.",
"TaskDownloadMissingLyricsDescription": "Lädt Songtexte herunter",
"TaskDownloadMissingLyrics": "Fehlende Songtexte herunterladen"
}

View File

@ -126,5 +126,9 @@
"External": "Εξωτερικό",
"HearingImpaired": "Με προβλήματα ακοής",
"TaskRefreshTrickplayImages": "Δημιουργήστε εικόνες Trickplay",
"TaskRefreshTrickplayImagesDescription": "Δημιουργεί προεπισκοπήσεις trickplay για βίντεο σε ενεργοποιημένες βιβλιοθήκες."
"TaskRefreshTrickplayImagesDescription": "Δημιουργεί προεπισκοπήσεις trickplay για βίντεο σε ενεργοποιημένες βιβλιοθήκες.",
"TaskAudioNormalization": "Ομοιομορφία ήχου",
"TaskAudioNormalizationDescription": "Ανίχνευση αρχείων για δεδομένα ομοιομορφίας ήχου.",
"TaskCleanCollectionsAndPlaylists": "Καθαρισμός συλλογών και λιστών αναπαραγωγής",
"TaskCleanCollectionsAndPlaylistsDescription": "Αφαιρούνται στοιχεία από τις συλλογές και τις λίστες αναπαραγωγής που δεν υπάρχουν πλέον."
}

View File

@ -130,5 +130,7 @@
"TaskCleanCollectionsAndPlaylists": "Clean up collections and playlists",
"TaskCleanCollectionsAndPlaylistsDescription": "Removes items from collections and playlists that no longer exist.",
"TaskAudioNormalization": "Audio Normalisation",
"TaskAudioNormalizationDescription": "Scans files for audio normalisation data."
"TaskAudioNormalizationDescription": "Scans files for audio normalisation data.",
"TaskDownloadMissingLyrics": "Download missing lyrics",
"TaskDownloadMissingLyricsDescription": "Downloads lyrics for songs"
}

View File

@ -13,7 +13,7 @@
"DeviceOfflineWithName": "{0} has disconnected",
"DeviceOnlineWithName": "{0} is connected",
"External": "External",
"FailedLoginAttemptWithUserName": "Failed login try from {0}",
"FailedLoginAttemptWithUserName": "Failed login attempt from {0}",
"Favorites": "Favorites",
"Folders": "Folders",
"Forced": "Forced",
@ -122,6 +122,8 @@
"TaskCleanTranscodeDescription": "Deletes transcode files more than one day old.",
"TaskRefreshChannels": "Refresh Channels",
"TaskRefreshChannelsDescription": "Refreshes internet channel information.",
"TaskDownloadMissingLyrics": "Download missing lyrics",
"TaskDownloadMissingLyricsDescription": "Downloads lyrics for songs",
"TaskDownloadMissingSubtitles": "Download missing subtitles",
"TaskDownloadMissingSubtitlesDescription": "Searches the internet for missing subtitles based on metadata configuration.",
"TaskOptimizeDatabase": "Optimize database",
@ -129,5 +131,9 @@
"TaskKeyframeExtractor": "Keyframe Extractor",
"TaskKeyframeExtractorDescription": "Extracts keyframes from video files to create more precise HLS playlists. This task may run for a long time.",
"TaskCleanCollectionsAndPlaylists": "Clean up collections and playlists",
"TaskCleanCollectionsAndPlaylistsDescription": "Removes items from collections and playlists that no longer exist."
"TaskCleanCollectionsAndPlaylistsDescription": "Removes items from collections and playlists that no longer exist.",
"TaskExtractMediaSegments": "Media Segment Scan",
"TaskExtractMediaSegmentsDescription": "Extracts or obtains media segments from MediaSegment enabled plugins.",
"TaskMoveTrickplayImages": "Migrate Trickplay Image Location",
"TaskMoveTrickplayImagesDescription": "Moves existing trickplay files according to the library settings."
}

View File

@ -0,0 +1 @@
{}

View File

@ -124,5 +124,13 @@
"External": "Externo",
"TaskKeyframeExtractorDescription": "Extrae Fotogramas Clave de los archivos de vídeo para crear Listas de Reprodución HLS más precisas. Esta tarea puede durar mucho tiempo.",
"TaskKeyframeExtractor": "Extractor de Fotogramas Clave",
"HearingImpaired": "Discapacidad Auditiva"
"HearingImpaired": "Discapacidad Auditiva",
"TaskRefreshTrickplayImages": "Generar imágenes de Trickplay",
"TaskRefreshTrickplayImagesDescription": "Crea vistas previas de reproducción engañosa para videos en bibliotecas habilitadas.",
"TaskAudioNormalization": "Normalización de audio",
"TaskAudioNormalizationDescription": "Escanea archivos en busca de datos de normalización de audio.",
"TaskCleanCollectionsAndPlaylists": "Limpiar colecciones y listas de reproducción",
"TaskCleanCollectionsAndPlaylistsDescription": "Elimina elementos de colecciones y listas de reproducción que ya no existen.",
"TaskDownloadMissingLyrics": "Descargar letra faltante",
"TaskDownloadMissingLyricsDescription": "Descarga letras de canciones"
}

View File

@ -11,7 +11,7 @@
"Collections": "Colecciones",
"DeviceOfflineWithName": "{0} se ha desconectado",
"DeviceOnlineWithName": "{0} está conectado",
"FailedLoginAttemptWithUserName": "Intento fallido de inicio de sesión desde {0}",
"FailedLoginAttemptWithUserName": "Intento fallido de inicio de sesión de {0}",
"Favorites": "Favoritos",
"Folders": "Carpetas",
"Genres": "Géneros",
@ -124,5 +124,12 @@
"TaskKeyframeExtractorDescription": "Extrae los cuadros clave de los archivos de vídeo para crear listas HLS más precisas. Esta tarea puede tardar un buen rato.",
"TaskKeyframeExtractor": "Extractor de Cuadros Clave",
"External": "Externo",
"HearingImpaired": "Discapacidad Auditiva"
"HearingImpaired": "Discapacidad Auditiva",
"TaskRefreshTrickplayImagesDescription": "Crea previsualizaciones para la barra de reproducción en las bibliotecas habilitadas.",
"TaskRefreshTrickplayImages": "Generar imágenes de la barra de reproducción",
"TaskAudioNormalization": "Normalización de audio",
"TaskAudioNormalizationDescription": "Analiza los archivos para normalizar el audio.",
"TaskCleanCollectionsAndPlaylists": "Limpieza de colecciones y listas de reproducción",
"TaskCleanCollectionsAndPlaylistsDescription": "Quita elementos que ya no existen de colecciones y listas de reproducción.",
"TaskDownloadMissingLyrics": "descargar letras que faltan"
}

View File

@ -11,7 +11,7 @@
"Collections": "Colecciones",
"DeviceOfflineWithName": "{0} se ha desconectado",
"DeviceOnlineWithName": "{0} está conectado",
"FailedLoginAttemptWithUserName": "Error al intentar iniciar sesión desde {0}",
"FailedLoginAttemptWithUserName": "Intento fallido de inicio de sesión de {0}",
"Favorites": "Favoritos",
"Folders": "Carpetas",
"Genres": "Géneros",
@ -130,5 +130,7 @@
"TaskCleanCollectionsAndPlaylists": "Limpiar colecciones y listas de reproducción",
"TaskCleanCollectionsAndPlaylistsDescription": "Elimina elementos de colecciones y listas de reproducción que ya no existen.",
"TaskAudioNormalization": "Normalización de audio",
"TaskAudioNormalizationDescription": "Escanear archivos para obtener datos de normalización."
"TaskAudioNormalizationDescription": "Escanear archivos para obtener datos de normalización.",
"TaskDownloadMissingLyricsDescription": "Descargar letras para las canciones",
"TaskDownloadMissingLyrics": "Descargar letras faltantes"
}

View File

@ -112,7 +112,7 @@
"CameraImageUploadedFrom": "Una nueva imagen de cámara ha sido subida desde {0}",
"AuthenticationSucceededWithUserName": "{0} autenticado con éxito",
"Application": "Aplicación",
"AppDeviceValues": "App: {0}, Dispositivo: {1}",
"AppDeviceValues": "Aplicación: {0}, Dispositivo: {1}",
"TaskCleanActivityLogDescription": "Elimina las entradas del registro de actividad anteriores al periodo configurado.",
"TaskCleanActivityLog": "Limpiar registro de actividades",
"Undefined": "Sin definir",
@ -125,5 +125,11 @@
"TaskKeyframeExtractor": "Extractor de Fotogramas Clave",
"HearingImpaired": "Discapacidad auditiva",
"TaskRefreshTrickplayImagesDescription": "Crea previsualizaciones para la barra de reproducción en las bibliotecas habilitadas.",
"TaskRefreshTrickplayImages": "Generar imágenes de la barra de reproducción"
"TaskRefreshTrickplayImages": "Generar imágenes de la barra de reproducción",
"TaskAudioNormalization": "Normalización de audio",
"TaskCleanCollectionsAndPlaylistsDescription": "Quita elementos que ya no existen de colecciones y listas de reproducción.",
"TaskAudioNormalizationDescription": "Analiza los archivos para normalizar el audio.",
"TaskCleanCollectionsAndPlaylists": "Limpieza de colecciones y listas de reproducción",
"TaskDownloadMissingLyrics": "Descargar letra faltante",
"TaskDownloadMissingLyricsDescription": "Descarga letras de canciones"
}

View File

@ -12,14 +12,118 @@
"Application": "Aplicación",
"AppDeviceValues": "App: {0}, Dispositivo: {1}",
"HeaderContinueWatching": "Continuar Viendo",
"HeaderAlbumArtists": "Artistas del Álbum",
"HeaderAlbumArtists": "Artistas del álbum",
"Genres": "Géneros",
"Folders": "Carpetas",
"Favorites": "Favoritos",
"FailedLoginAttemptWithUserName": "Intento de inicio de sesión fallido de {0}",
"FailedLoginAttemptWithUserName": "Intento de inicio de sesión fallido desde {0}",
"HeaderFavoriteSongs": "Canciones Favoritas",
"HeaderFavoriteEpisodes": "Episodios Favoritos",
"HeaderFavoriteArtists": "Artistas Favoritos",
"External": "Externo",
"Default": "Predeterminado"
"Default": "Predeterminado",
"Movies": "Películas",
"MessageNamedServerConfigurationUpdatedWithValue": "La sección {0} de la configuración ha sido actualizada",
"MixedContent": "Contenido mixto",
"Music": "Música",
"NotificationOptionCameraImageUploaded": "Imagen de la cámara subida",
"NotificationOptionServerRestartRequired": "Se necesita reiniciar el servidor",
"NotificationOptionVideoPlayback": "Reproducción de video iniciada",
"Sync": "Sincronizar",
"Shows": "Series",
"UserDownloadingItemWithValues": "{0} está descargando {1}",
"UserOfflineFromDevice": "{0} se ha desconectado desde {1}",
"UserOnlineFromDevice": "{0} está en línea desde {1}",
"TasksChannelsCategory": "Canales de Internet",
"TaskRefreshChannelsDescription": "Actualiza la información de canales de Internet.",
"TaskDownloadMissingSubtitles": "Descargar subtítulos faltantes",
"TaskOptimizeDatabaseDescription": "Compacta la base de datos y libera espacio. Ejecutar esta tarea después de escanear la biblioteca o hacer otros cambios que impliquen modificaciones en la base de datos puede mejorar el rendimiento.",
"TaskKeyframeExtractorDescription": "Extrae Fotogramas Clave de los archivos de vídeo para crear Listas de Reproducción HLS más precisas. Esta tarea puede durar mucho tiempo.",
"TaskAudioNormalization": "Normalización de audio",
"TaskAudioNormalizationDescription": "Escanear archivos para la normalización de data.",
"TaskCleanCollectionsAndPlaylists": "Limpiar colecciones y listas de reproducción",
"TaskCleanCollectionsAndPlaylistsDescription": "Remover elementos de colecciones y listas de reproducción que no existen.",
"TvShows": "Series de TV",
"UserStartedPlayingItemWithValues": "{0} está reproduciendo {1} en {2}",
"TaskRefreshChannels": "Actualizar canales",
"Photos": "Fotos",
"HeaderFavoriteShows": "Programas favoritos",
"TaskCleanActivityLog": "Limpiar registro de actividades",
"UserPasswordChangedWithName": "Se ha cambiado la contraseña para el usuario {0}",
"System": "Sistema",
"User": "Usuario",
"Forced": "Forzado",
"PluginInstalledWithName": "{0} ha sido instalado",
"HeaderFavoriteAlbums": "Álbumes favoritos",
"TaskUpdatePlugins": "Actualizar Plugins",
"Latest": "Recientes",
"UserStoppedPlayingItemWithValues": "{0} ha terminado de reproducir {1} en {2}",
"Songs": "Canciones",
"NotificationOptionPluginError": "Falla de plugin",
"ScheduledTaskStartedWithName": "{0} iniciado",
"TasksApplicationCategory": "Aplicación",
"UserDeletedWithName": "El usuario {0} ha sido eliminado",
"TaskRefreshChapterImages": "Extraer imágenes de los capítulos",
"TaskUpdatePluginsDescription": "Descarga e instala actualizaciones para plugins que están configurados para actualizarse automáticamente.",
"TaskRefreshPeopleDescription": "Actualiza metadatos de actores y directores en tu biblioteca de medios.",
"NotificationOptionUserLockedOut": "Usuario bloqueado",
"TaskCleanTranscodeDescription": "Elimina archivos transcodificados que tengan más de un día.",
"TaskCleanTranscode": "Limpiar el directorio de transcodificaciones",
"NotificationOptionPluginUpdateInstalled": "Actualización de plugin instalada",
"NotificationOptionAudioPlaybackStopped": "Reproducción de audio detenida",
"TasksLibraryCategory": "Biblioteca",
"NotificationOptionPluginInstalled": "Plugin instalado",
"UserPolicyUpdatedWithName": "La política de usuario ha sido actualizada para {0}",
"VersionNumber": "Versión {0}",
"HeaderNextUp": "A continuación",
"ValueHasBeenAddedToLibrary": "{0} se ha añadido a tu biblioteca",
"LabelIpAddressValue": "Dirección IP: {0}",
"NameSeasonNumber": "Temporada {0}",
"NotificationOptionNewLibraryContent": "Nuevo contenido agregado",
"Plugin": "Plugin",
"NotificationOptionAudioPlayback": "Reproducción de audio iniciada",
"NotificationOptionTaskFailed": "Falló la tarea programada",
"LabelRunningTimeValue": "Tiempo en ejecución: {0}",
"SubtitleDownloadFailureFromForItem": "Falló la descarga de subtítulos desde {0} para {1}",
"TaskRefreshLibrary": "Escanear biblioteca de medios",
"ServerNameNeedsToBeRestarted": "{0} debe ser reiniciado",
"TasksMaintenanceCategory": "Mantenimiento",
"ProviderValue": "Proveedor: {0}",
"UserCreatedWithName": "El usuario {0} ha sido creado",
"PluginUninstalledWithName": "{0} ha sido desinstalado",
"ValueSpecialEpisodeName": "Especial - {0}",
"ScheduledTaskFailedWithName": "{0} falló",
"TaskCleanLogs": "Limpiar directorio de registros",
"NameInstallFailed": "Falló la instalación de {0}",
"UserLockedOutWithName": "El usuario {0} ha sido bloqueado",
"TaskRefreshLibraryDescription": "Escanea tu biblioteca de medios para encontrar archivos nuevos y actualizar los metadatos.",
"StartupEmbyServerIsLoading": "El servidor Jellyfin está cargando. Por favor, intente de nuevo en un momento.",
"Playlists": "Listas de reproducción",
"TaskDownloadMissingSubtitlesDescription": "Busca subtítulos faltantes en Internet basándose en la configuración de metadatos.",
"MessageServerConfigurationUpdated": "Se ha actualizado la configuración del servidor",
"TaskRefreshPeople": "Actualizar personas",
"NotificationOptionVideoPlaybackStopped": "Reproducción de video detenida",
"HeaderLiveTV": "TV en vivo",
"NameSeasonUnknown": "Temporada desconocida",
"NotificationOptionInstallationFailed": "Fallo de instalación",
"NotificationOptionPluginUninstalled": "Plugin desinstalado",
"TaskCleanCache": "Limpiar directorio caché",
"TaskRefreshChapterImagesDescription": "Crea miniaturas para videos que tienen capítulos.",
"Inherit": "Heredar",
"HeaderRecordingGroups": "Grupos de grabación",
"ItemAddedWithName": "{0} fue agregado a la biblioteca",
"TaskOptimizeDatabase": "Optimizar base de datos",
"TaskKeyframeExtractor": "Extractor de Fotogramas Clave",
"HearingImpaired": "Discapacidad auditiva",
"HomeVideos": "Videos caseros",
"ItemRemovedWithName": "{0} fue removido de la biblioteca",
"MessageApplicationUpdated": "El servidor Jellyfin ha sido actualizado",
"MessageApplicationUpdatedTo": "El servidor Jellyfin ha sido actualizado a {0}",
"MusicVideos": "Videos musicales",
"NewVersionIsAvailable": "Una nueva versión de Jellyfin está disponible para descargar.",
"PluginUpdatedWithName": "{0} ha sido actualizado",
"Undefined": "Sin definir",
"TaskCleanActivityLogDescription": "Elimina las entradas del registro de actividad anteriores al periodo configurado.",
"TaskCleanCacheDescription": "Elimina archivos caché que ya no son necesarios para el sistema.",
"TaskCleanLogsDescription": "Elimina archivos de registro con más de {0} días de antigüedad."
}

View File

@ -125,5 +125,9 @@
"TaskKeyframeExtractorDescription": "Eraldab videofailidest võtmekaadreid, et luua täpsemaid HLS-i esitusloendeid. See ülesanne võib kesta pikka aega.",
"TaskKeyframeExtractor": "Võtmekaadri ekstraktor",
"TaskRefreshTrickplayImages": "Loo eelvaate pildid",
"TaskRefreshTrickplayImagesDescription": "Loob eelvaated videotele, kus lubatud."
"TaskRefreshTrickplayImagesDescription": "Loob eelvaated videotele, kus lubatud.",
"TaskAudioNormalization": "Heli Normaliseerimine",
"TaskAudioNormalizationDescription": "Skaneerib faile heli normaliseerimise andmete jaoks.",
"TaskCleanCollectionsAndPlaylistsDescription": "Eemaldab kogumikest ja esitusloenditest asjad, mida enam ei eksisteeri.",
"TaskCleanCollectionsAndPlaylists": "Puhasta kogumikud ja esitusloendid"
}

View File

@ -128,5 +128,9 @@
"TaskRefreshTrickplayImages": "تولید تصاویر Trickplay",
"TaskRefreshTrickplayImagesDescription": "تولید پیش‌نمایش های trickplay برای ویدیو های فعال شده در کتابخانه.",
"TaskCleanCollectionsAndPlaylists": "پاکسازی مجموعه ها و لیست پخش",
"TaskCleanCollectionsAndPlaylistsDescription": "موارد را از مجموعه ها و لیست پخش هایی که دیگر وجود ندارند حذف میکند."
"TaskCleanCollectionsAndPlaylistsDescription": "موارد را از مجموعه ها و لیست پخش هایی که دیگر وجود ندارند حذف میکند.",
"TaskAudioNormalizationDescription": "بررسی فایل برای داده‌های نرمال کردن صدا.",
"TaskDownloadMissingLyrics": "دانلود متن‌های ناموجود",
"TaskDownloadMissingLyricsDescription": "دانلود متن شعر‌ها",
"TaskAudioNormalization": "نرمال کردن صدا"
}

View File

@ -127,5 +127,7 @@
"TaskRefreshTrickplayImages": "Luo Trickplay-kuvat",
"TaskRefreshTrickplayImagesDescription": "Luo Trickplay-esikatselut käytössä olevien kirjastojen videoista.",
"TaskCleanCollectionsAndPlaylistsDescription": "Poistaa kohteet kokoelmista ja soittolistoista joita ei ole enää olemassa.",
"TaskCleanCollectionsAndPlaylists": "Puhdista kokoelmat ja soittolistat"
"TaskCleanCollectionsAndPlaylists": "Puhdista kokoelmat ja soittolistat",
"TaskAudioNormalization": "Äänenvoimakkuuden normalisointi",
"TaskAudioNormalizationDescription": "Etsii tiedostoista äänenvoimakkuuden normalisointitietoja."
}

View File

@ -69,7 +69,7 @@
"HeaderLiveTV": "Live TV",
"HeaderFavoriteSongs": "Mga Paboritong Kanta",
"HeaderFavoriteShows": "Mga Paboritong Pelikula",
"HeaderFavoriteEpisodes": "Mga Paboritong Episode",
"HeaderFavoriteEpisodes": "Mga Paboritong Yugto",
"HeaderFavoriteArtists": "Mga Paboritong Artista",
"HeaderFavoriteAlbums": "Mga Paboritong Album",
"HeaderContinueWatching": "Magpatuloy sa Panonood",

View File

@ -11,7 +11,7 @@
"Collections": "Collections",
"DeviceOfflineWithName": "{0} s'est déconnecté",
"DeviceOnlineWithName": "{0} est connecté",
"FailedLoginAttemptWithUserName": "Tentative de connexion échoué par {0}",
"FailedLoginAttemptWithUserName": "Tentative de connexion échouée par {0}",
"Favorites": "Favoris",
"Folders": "Dossiers",
"Genres": "Genres",
@ -39,7 +39,7 @@
"MixedContent": "Contenu mixte",
"Movies": "Films",
"Music": "Musique",
"MusicVideos": "Vidéos musicales",
"MusicVideos": "Vidéoclips",
"NameInstallFailed": "échec d'installation de {0}",
"NameSeasonNumber": "Saison {0}",
"NameSeasonUnknown": "Saison Inconnue",
@ -128,5 +128,7 @@
"TaskRefreshTrickplayImages": "Générer des images Trickplay",
"TaskRefreshTrickplayImagesDescription": "Crée des aperçus Trickplay pour les vidéos dans les médiathèques activées.",
"TaskCleanCollectionsAndPlaylists": "Nettoyer les collections et les listes de lecture",
"TaskCleanCollectionsAndPlaylistsDescription": "Supprimer les liens inexistants des collections et des listes de lecture"
"TaskCleanCollectionsAndPlaylistsDescription": "Supprime les éléments des collections et des listes de lecture qui n'existent plus.",
"TaskAudioNormalization": "Normalisation audio",
"TaskAudioNormalizationDescription": "Analyse les fichiers à la recherche de données de normalisation audio."
}

View File

@ -15,7 +15,7 @@
"Favorites": "Favoris",
"Folders": "Dossiers",
"Genres": "Genres",
"HeaderAlbumArtists": "Artistes de l'album",
"HeaderAlbumArtists": "Artistes d'albums",
"HeaderContinueWatching": "Continuer de regarder",
"HeaderFavoriteAlbums": "Albums favoris",
"HeaderFavoriteArtists": "Artistes préférés",
@ -130,5 +130,7 @@
"TaskCleanCollectionsAndPlaylists": "Nettoyer les collections et les listes de lecture",
"TaskCleanCollectionsAndPlaylistsDescription": "Supprime les éléments des collections et des listes de lecture qui n'existent plus.",
"TaskAudioNormalization": "Normalisation audio",
"TaskAudioNormalizationDescription": "Analyse les fichiers à la recherche de données de normalisation audio."
"TaskAudioNormalizationDescription": "Analyse les fichiers à la recherche de données de normalisation audio.",
"TaskDownloadMissingLyricsDescription": "Téléchargement des paroles des chansons",
"TaskDownloadMissingLyrics": "Télécharger les paroles des chansons manquantes"
}

View File

@ -1,3 +1,16 @@
{
"Albums": "Albaim"
"Albums": "Albaim",
"Artists": "Ealaíontóir",
"AuthenticationSucceededWithUserName": "{0} fíordheimhnithe",
"Books": "leabhair",
"CameraImageUploadedFrom": "Tá íomhá ceamara nua uaslódáilte ó {0}",
"Channels": "Cainéil",
"ChapterNameValue": "Caibidil {0}",
"Collections": "Bailiúcháin",
"Default": "Mainneachtain",
"DeviceOfflineWithName": "scoireadh {0}",
"DeviceOnlineWithName": "{0} ceangailte",
"External": "Forimeallach",
"FailedLoginAttemptWithUserName": "Iarracht ar theip ar fhíordheimhniú ó {0}",
"Favorites": "Ceanáin"
}

View File

@ -126,5 +126,9 @@
"External": "חיצוני",
"HearingImpaired": "לקוי שמיעה",
"TaskRefreshTrickplayImages": "יצירת תמונות המחשה",
"TaskRefreshTrickplayImagesDescription": "יוצר תמונות המחשה לסרטונים שפעילים בספריות."
"TaskRefreshTrickplayImagesDescription": "יוצר תמונות המחשה לסרטונים שפעילים בספריות.",
"TaskAudioNormalization": "נרמול שמע",
"TaskCleanCollectionsAndPlaylistsDescription": "מנקה פריטים לא קיימים מאוספים ורשימות השמעה.",
"TaskAudioNormalizationDescription": "מחפש קבצי נורמליזציה של שמע.",
"TaskCleanCollectionsAndPlaylists": "מנקה אוספים ורשימות השמעה"
}

View File

@ -14,7 +14,7 @@
"Forced": "बलपूर्वक",
"Folders": "फ़ोल्डर",
"Favorites": "पसंदीदा",
"FailedLoginAttemptWithUserName": "{0} से लॉगिन असफल हुआ",
"FailedLoginAttemptWithUserName": "{0} से संप्रवेश असफल हुआ",
"DeviceOnlineWithName": "{0} कनेक्ट हो गया है",
"DeviceOfflineWithName": "{0} डिस्कनेक्ट हो गया है",
"Default": "प्राथमिक",
@ -125,5 +125,7 @@
"TaskDownloadMissingSubtitlesDescription": "मेटाडेटा कॉन्फ़िगरेशन के आधार पर लापता उपशीर्षक के लिए इंटरनेट खोजता है।",
"TaskKeyframeExtractorDescription": "अधिक सटीक एचएलएस प्लेलिस्ट बनाने के लिए वीडियो फ़ाइलों से मुख्य-फ़्रेम निकालता है। यह कार्य लंबे समय तक चल सकता है।",
"TaskRefreshTrickplayImages": "ट्रिकप्लै चित्रों को सृजन करे",
"TaskRefreshTrickplayImagesDescription": "नियत संग्रहों में चलचित्रों का ट्रीकप्लै दर्शनों को सृजन करे."
"TaskRefreshTrickplayImagesDescription": "नियत संग्रहों में चलचित्रों का ट्रीकप्लै दर्शनों को सृजन करे.",
"TaskAudioNormalization": "श्रव्य सामान्यीकरण",
"TaskAudioNormalizationDescription": "श्रव्य सामान्यीकरण के लिए फाइलें अन्वेषण करें"
}

View File

@ -11,7 +11,7 @@
"Collections": "Kolekcije",
"DeviceOfflineWithName": "{0} je prekinuo vezu",
"DeviceOnlineWithName": "{0} je povezan",
"FailedLoginAttemptWithUserName": "Neuspjeli pokušaj prijave od {0}",
"FailedLoginAttemptWithUserName": "Neuspješan pokušaj prijave od {0}",
"Favorites": "Favoriti",
"Folders": "Mape",
"Genres": "Žanrovi",
@ -126,5 +126,9 @@
"TaskOptimizeDatabaseDescription": "Sažima bazu podataka i uklanja prazan prostor. Pokretanje ovog zadatka, može poboljšati performanse nakon provođenja indeksiranja biblioteke ili provođenja drugih promjena koje utječu na bazu podataka.",
"HearingImpaired": "Oštećen sluh",
"TaskRefreshTrickplayImages": "Generiraj Trickplay Slike",
"TaskRefreshTrickplayImagesDescription": "Kreira trickplay pretpreglede za videe u omogućenim knjižnicama."
"TaskRefreshTrickplayImagesDescription": "Kreira trickplay pretpreglede za videe u omogućenim knjižnicama.",
"TaskAudioNormalization": "Normalizacija zvuka",
"TaskAudioNormalizationDescription": "Skenira datoteke u potrazi za podacima o normalizaciji zvuka.",
"TaskCleanCollectionsAndPlaylistsDescription": "Uklanja stavke iz zbirki i popisa za reprodukciju koje više ne postoje.",
"TaskCleanCollectionsAndPlaylists": "Očisti zbirke i popise za reprodukciju"
}

View File

@ -18,14 +18,14 @@
"HeaderAlbumArtists": "Album előadók",
"HeaderContinueWatching": "Megtekintés folytatása",
"HeaderFavoriteAlbums": "Kedvenc Albumok",
"HeaderFavoriteArtists": "Kedvenc előadók",
"HeaderFavoriteEpisodes": "Kedvenc epizódok",
"HeaderFavoriteShows": "Kedvenc sorozatok",
"HeaderFavoriteSongs": "Kedvenc dalok",
"HeaderFavoriteArtists": "Kedvenc Előadók",
"HeaderFavoriteEpisodes": "Kedvenc Epizódok",
"HeaderFavoriteShows": "Kedvenc Sorozatok",
"HeaderFavoriteSongs": "Kedvenc Dalok",
"HeaderLiveTV": "Élő TV",
"HeaderNextUp": "Következik",
"HeaderRecordingGroups": "Felvételi csoportok",
"HomeVideos": "Otthoni videók",
"HeaderRecordingGroups": "Felvevő Csoportok",
"HomeVideos": "Otthoni Videók",
"Inherit": "Örökölt",
"ItemAddedWithName": "{0} hozzáadva a könyvtárhoz",
"ItemRemovedWithName": "{0} eltávolítva a könyvtárból",

View File

@ -81,7 +81,7 @@
"Movies": "Film",
"MessageServerConfigurationUpdated": "Konfigurasi server telah diperbarui",
"MessageNamedServerConfigurationUpdatedWithValue": "Bagian konfigurasi server {0} telah diperbarui",
"FailedLoginAttemptWithUserName": "Gagal melakukan login dari {0}",
"FailedLoginAttemptWithUserName": "Gagal upaya login dari {0}",
"CameraImageUploadedFrom": "Sebuah gambar kamera baru telah diunggah dari {0}",
"DeviceOfflineWithName": "{0} telah terputus",
"DeviceOnlineWithName": "{0} telah terhubung",
@ -125,5 +125,9 @@
"External": "Luar",
"HearingImpaired": "Gangguan Pendengaran",
"TaskRefreshTrickplayImages": "Hasilkan Gambar Trickplay",
"TaskRefreshTrickplayImagesDescription": "Buat pratinjau trickplay untuk video di perpustakaan yang diaktifkan."
"TaskRefreshTrickplayImagesDescription": "Buat pratinjau trickplay untuk video di perpustakaan yang diaktifkan.",
"TaskAudioNormalizationDescription": "Pindai file untuk data normalisasi audio.",
"TaskAudioNormalization": "Normalisasi Audio",
"TaskCleanCollectionsAndPlaylists": "Bersihkan koleksi dan daftar putar",
"TaskCleanCollectionsAndPlaylistsDescription": "Menghapus item dari koleksi dan daftar putar yang sudah tidak ada."
}

View File

@ -17,7 +17,7 @@
"Genres": "Stefnur",
"Folders": "Möppur",
"Favorites": "Uppáhalds",
"FailedLoginAttemptWithUserName": "{0} reyndi að auðkenna sig",
"FailedLoginAttemptWithUserName": "{0} mistókst að auðkenna sig",
"DeviceOnlineWithName": "{0} hefur tengst",
"DeviceOfflineWithName": "{0} hefur aftengst",
"Collections": "Söfn",
@ -123,5 +123,11 @@
"TaskRefreshChapterImages": "Plokka kafla-myndir",
"TaskCleanActivityLogDescription": "Eyðir virkniskráningarfærslum sem hafa náð settum hámarksaldri.",
"Forced": "Þvingað",
"External": "Útvær"
"External": "Útvær",
"TaskRefreshTrickplayImagesDescription": "Býr til hraðspilunarmyndir fyrir myndbönd í virkum söfnum.",
"TaskRefreshTrickplayImages": "Búa til hraðspilunarmyndir",
"TaskAudioNormalization": "Hljóðstöðlun",
"TaskAudioNormalizationDescription": "Leitar að hljóðstöðlunargögnum í skrám.",
"TaskCleanCollectionsAndPlaylists": "Hreinsa söfn og spilunarlista",
"TaskCleanCollectionsAndPlaylistsDescription": "Fjarlægir hluti úr söfnum og spilalistum sem eru ekki lengur til."
}

View File

@ -51,10 +51,10 @@
"NotificationOptionCameraImageUploaded": "Immagine fotocamera caricata",
"NotificationOptionInstallationFailed": "Installazione fallita",
"NotificationOptionNewLibraryContent": "Nuovo contenuto aggiunto",
"NotificationOptionPluginError": "Errore del Plug-in",
"NotificationOptionPluginInstalled": "Plug-in installato",
"NotificationOptionPluginUninstalled": "Plug-in disinstallato",
"NotificationOptionPluginUpdateInstalled": "Aggiornamento del plug-in installato",
"NotificationOptionPluginError": "Errore del plugin",
"NotificationOptionPluginInstalled": "Plugin installato",
"NotificationOptionPluginUninstalled": "Plugin disinstallato",
"NotificationOptionPluginUpdateInstalled": "Aggiornamento plugin installato",
"NotificationOptionServerRestartRequired": "Riavvio del server necessario",
"NotificationOptionTaskFailed": "Operazione pianificata fallita",
"NotificationOptionUserLockedOut": "Utente bloccato",
@ -68,10 +68,10 @@
"PluginUpdatedWithName": "{0} è stato aggiornato",
"ProviderValue": "Provider: {0}",
"ScheduledTaskFailedWithName": "{0} fallito",
"ScheduledTaskStartedWithName": "{0} avviati",
"ScheduledTaskStartedWithName": "{0} avviato",
"ServerNameNeedsToBeRestarted": "{0} deve essere riavviato",
"Shows": "Serie TV",
"Songs": "Canzoni",
"Songs": "Brani",
"StartupEmbyServerIsLoading": "Jellyfin server si sta avviando. Per favore riprova più tardi.",
"SubtitleDownloadFailureForItem": "Impossibile scaricare i sottotitoli per {0}",
"SubtitleDownloadFailureFromForItem": "Impossibile scaricare i sottotitoli da {0} per {1}",
@ -83,52 +83,54 @@
"UserDeletedWithName": "L'utente {0} è stato rimosso",
"UserDownloadingItemWithValues": "{0} sta scaricando {1}",
"UserLockedOutWithName": "L'utente {0} è stato bloccato",
"UserOfflineFromDevice": "{0} si è disconnesso su {1}",
"UserOfflineFromDevice": "{0} si è disconnesso da {1}",
"UserOnlineFromDevice": "{0} è online su {1}",
"UserPasswordChangedWithName": "La password è stata cambiata per l'utente {0}",
"UserPolicyUpdatedWithName": "La policy dell'utente è stata aggiornata per {0}",
"UserStartedPlayingItemWithValues": "{0} ha avviato la riproduzione di \"{1}\" su {2}",
"UserStartedPlayingItemWithValues": "{0} ha avviato la riproduzione di {1} su {2}",
"UserStoppedPlayingItemWithValues": "{0} ha interrotto la riproduzione di {1} su {2}",
"ValueHasBeenAddedToLibrary": "{0} è stato aggiunto alla tua libreria multimediale",
"ValueSpecialEpisodeName": "Speciale - {0}",
"VersionNumber": "Versione {0}",
"TaskRefreshChannelsDescription": "Aggiorna le informazioni dei canali Internet.",
"TaskRefreshChannelsDescription": "Aggiorna le informazioni dei canali internet.",
"TaskDownloadMissingSubtitlesDescription": "Cerca su internet i sottotitoli mancanti basandosi sulle configurazioni dei metadati.",
"TaskDownloadMissingSubtitles": "Scarica i sottotitoli mancanti",
"TaskRefreshChannels": "Aggiorna i canali",
"TaskCleanTranscodeDescription": "Cancella i file di transcode più vecchi di un giorno.",
"TaskCleanTranscode": "Svuota la cartella del transcoding",
"TaskUpdatePluginsDescription": "Scarica e installa gli aggiornamenti per i plugin che sono stati configurati per essere aggiornati contemporaneamente.",
"TaskUpdatePlugins": "Aggiorna i Plugin",
"TaskRefreshPeopleDescription": "Aggiorna i metadati per gli attori e registi nella tua libreria multimediale.",
"TaskRefreshPeople": "Aggiornamento Persone",
"TaskRefreshChannels": "Aggiorna canali",
"TaskCleanTranscodeDescription": "Cancella i file di transcodifica più vecchi di un giorno.",
"TaskCleanTranscode": "Svuota la cartella della transcodifica",
"TaskUpdatePluginsDescription": "Scarica e installa gli aggiornamenti per i plugin configurati per l'aggiornamento automatico.",
"TaskUpdatePlugins": "Aggiorna i plugin",
"TaskRefreshPeopleDescription": "Aggiorna i metadati degli attori e registi nella tua libreria.",
"TaskRefreshPeople": "Aggiorna Persone",
"TaskCleanLogsDescription": "Rimuovi i file di log più vecchi di {0} giorni.",
"TaskCleanLogs": "Pulisci la cartella dei log",
"TaskRefreshLibraryDescription": "Analizza la tua libreria multimediale per nuovi file e rinnova i metadati.",
"TaskRefreshLibrary": "Scan Librerie",
"TaskRefreshChapterImagesDescription": "Crea le thumbnail per i video che hanno capitoli.",
"TaskRefreshLibraryDescription": "Scansiona la libreria alla ricerca di nuovi file e aggiorna i metadati.",
"TaskRefreshLibrary": "Scansione della libreria",
"TaskRefreshChapterImagesDescription": "Crea le miniature per i video che hanno capitoli.",
"TaskRefreshChapterImages": "Estrai immagini capitolo",
"TaskCleanCacheDescription": "Cancella i file di cache non più necessari al sistema.",
"TaskCleanCache": "Pulisci la directory della cache",
"TaskCleanCache": "Pulisci la cartella della cache",
"TasksChannelsCategory": "Canali su Internet",
"TasksApplicationCategory": "Applicazione",
"TasksLibraryCategory": "Libreria",
"TasksMaintenanceCategory": "Manutenzione",
"TaskCleanActivityLog": "Attività di Registro Completate",
"TaskCleanActivityLogDescription": "Elimina gli inserimenti nel registro delle attività più vecchie delletà configurata.",
"TaskCleanActivityLogDescription": "Elimina le voci del registro delle attività più vecchie delletà configurata.",
"Undefined": "Non Definito",
"Forced": "Forzato",
"Default": "Predefinito",
"TaskOptimizeDatabaseDescription": "Compatta Database e tronca spazi liberi. Eseguire questa azione dopo la scansione o dopo aver fatto altri cambiamenti inerenti il database potrebbe aumentarne la performance.",
"TaskOptimizeDatabase": "Ottimizza Database",
"TaskOptimizeDatabaseDescription": "Compatta database e tronca spazi liberi. Eseguire questa azione dopo la scansione o dopo aver fatto altre modifiche inerenti il database potrebbe aumentarne le prestazioni.",
"TaskOptimizeDatabase": "Ottimizza database",
"TaskKeyframeExtractor": "Estrattore di Keyframe",
"TaskKeyframeExtractorDescription": "Estrae i keyframe dai video per creare migliori playlist HLS. Questa procedura potrebbe richiedere molto tempo.",
"External": "Esterno",
"HearingImpaired": "con problemi di udito",
"HearingImpaired": "Non Udenti",
"TaskRefreshTrickplayImages": "Genera immagini Trickplay",
"TaskRefreshTrickplayImagesDescription": "Crea anteprime trickplay per i video nelle librerie abilitate.",
"TaskCleanCollectionsAndPlaylists": "Ripulire le raccolte e le playlist",
"TaskCleanCollectionsAndPlaylistsDescription": "Rimuove gli elementi dalle raccolte e dalle playlist che non esistono più.",
"TaskAudioNormalization": "Normalizzazione Audio",
"TaskAudioNormalizationDescription": "Scansione files per normalizzazione audio."
"TaskCleanCollectionsAndPlaylists": "Ripulire le collezioni e le playlist",
"TaskCleanCollectionsAndPlaylistsDescription": "Rimuove gli elementi dalle collezioni e dalle playlist che non esistono più.",
"TaskAudioNormalization": "Normalizzazione dell'audio",
"TaskAudioNormalizationDescription": "Scansiona i file alla ricerca dei dati per la normalizzazione dell'audio.",
"TaskDownloadMissingLyricsDescription": "Scarica testi per le canzoni",
"TaskDownloadMissingLyrics": "Scarica testi mancanti"
}

View File

@ -1,3 +1,133 @@
{
"Albums": "Albums"
"Albums": "អាលប៊ុម",
"MessageApplicationUpdatedTo": "ម៉ាស៊ីនមេនៃJellyfinត្រូវបានអាប់ដេតទៅកាន់ {0}",
"MessageNamedServerConfigurationUpdatedWithValue": "ការកំណត់ម៉ាស៊ីនមេ ផ្នែក {0} ត្រូវបានអាប់ដេត",
"MessageServerConfigurationUpdated": "ការកំណត់ម៉ាស៊ីនមេត្រូវបានអាប់ដេត",
"AppDeviceValues": "កម្មវិធី: {0}, ឧបករណ៍: {1}",
"MixedContent": "មាតិកាចម្រុះ",
"UserLockedOutWithName": "អ្នកប្រើប្រាស់ {0} ត្រូវ​បាន​ផ្អាក",
"Application": "កម្មវិធី",
"Artists": "សិល្បករ",
"AuthenticationSucceededWithUserName": "{0} បានផ្ទៀងផ្ទាត់ដោយជោគជ័យ",
"Books": "សៀវភៅ",
"NameSeasonNumber": "រដូវកាលទី {0}",
"NotificationOptionPluginInstalled": "Plugin បានដំឡើងរួច",
"CameraImageUploadedFrom": "រូបភាពកាមេរ៉ាថ្មីត្រូវបានបង្ហោះពី {0}",
"Channels": "ប៉ុស្ត៍",
"ChapterNameValue": "ជំពូក {0}",
"Collections": "បណ្តុំ",
"External": "ខាងក្រៅ",
"Default": "លំនាំដើម",
"NotificationOptionInstallationFailed": "ការដំឡើងមិនបានសម្រេច",
"DeviceOfflineWithName": "{0} បានផ្តាច់",
"Folders": "ថតឯកសារ",
"DeviceOnlineWithName": "{0} បានភ្ចាប់",
"HearingImpaired": "ខ្សោយការស្តាប់",
"HomeVideos": "វីឌីអូថតខ្លួនឯង",
"Favorites": "ចំណូលចិត្ត",
"HeaderFavoriteEpisodes": "ភាគដែលចូលចិត្ត",
"Forced": "បង្ខំ",
"Genres": "ប្រភេទ",
"HeaderFavoriteArtists": "សិល្បករដែលចូលចិត្ត",
"NotificationOptionApplicationUpdateAvailable": "កម្មវិធី យើងអាចអាប់ដេតបាន",
"NotificationOptionApplicationUpdateInstalled": "កម្មវិធី ដែលបានដំឡើងរួច",
"NotificationOptionAudioPlaybackStopped": "ការ​ចាក់សម្លេងបានផ្អាក",
"HeaderContinueWatching": "បន្តមើល",
"HeaderFavoriteAlbums": "អាល់ប៊ុមដែលចូលចិត្ត",
"HeaderFavoriteShows": "រឿងភាគដែលចូលចិត្ត",
"NewVersionIsAvailable": "មានជំនាន់ថ្មី ម៉ាស៊ីនមេJellyfin អាចទាញយកបាន.",
"HeaderAlbumArtists": "សិល្បករអាល់ប៊ុម",
"NotificationOptionCameraImageUploaded": "រូបភាពពីកាំមេរ៉ាបានអាប់ឡូតរួច",
"HeaderFavoriteSongs": "ចម្រៀងដែលចូលចិត្ត",
"HeaderNextUp": "បន្ទាប់",
"HeaderLiveTV": "ទូរទស្សន៍ផ្សាយផ្ទាល់",
"Movies": "រឿង",
"HeaderRecordingGroups": "ក្រុមនៃការថត",
"Music": "តន្ត្រី",
"Inherit": "មរតក",
"MusicVideos": "វីដេអូតន្ត្រី",
"NameInstallFailed": "{0} ការដំឡើងបានបរាជ័យ",
"NotificationOptionNewLibraryContent": "មាតិកាថ្មីៗត្រូវបានបន្ថែម",
"ItemAddedWithName": "{0} ត្រូវបានបន្ថែមទៅបណ្ណាល័យ",
"NameSeasonUnknown": "រដូវកាលមិនច្បាស់លាស់",
"ItemRemovedWithName": "{0} ត្រូវបានដកចេញពីបណ្ណាល័យ",
"LabelIpAddressValue": "លេខ IP: {0}",
"LabelRunningTimeValue": "ពេលវេលាកំពុងដំណើរការ: {0}",
"Latest": "ចុងក្រោយ",
"NotificationOptionAudioPlayback": "ការ​ចាក់​សំឡេង​បាន​ចាប់ផ្ដើម",
"NotificationOptionPluginError": "Plugin មិនដំណើរការ",
"NotificationOptionPluginUninstalled": "Plugin បានលុបចេញរួច",
"MessageApplicationUpdated": "ម៉ាស៊ីនមេនៃJellyfinត្រូវបានអាប់ដេត",
"NotificationOptionPluginUpdateInstalled": "Plugin អាប់ដេតបានដំឡើងរួច",
"NotificationOptionUserLockedOut": "អ្នកប្រើប្រាស់ត្រូវបានជាប់គាំង",
"NotificationOptionServerRestartRequired": "តម្រូវឱ្យចាប់ផ្ដើមម៉ាស៊ីនមេឡើងវិញ",
"Photos": "រូបថត",
"Playlists": "បញ្ជីចាក់",
"Plugin": "Plugin",
"PluginInstalledWithName": "{0} ត្រូវបានដំឡើង",
"NotificationOptionTaskFailed": "កិច្ចការដែលបានគ្រោងទុកបានបរាជ័យ",
"PluginUpdatedWithName": "{0} ត្រូវបានអាប់ដេត",
"NotificationOptionVideoPlayback": "ការចាក់វីដេអូបានចាប់ផ្តើម",
"Songs": "ចម្រៀង",
"ScheduledTaskStartedWithName": "{0} បានចាប់ផ្តើម",
"NotificationOptionVideoPlaybackStopped": "ការ​ចាក់​វីដេអូ​បាន​បញ្ឈប់",
"PluginUninstalledWithName": "{0} ត្រូវបានលុបចេញ",
"Shows": "រឿងភាគ",
"ProviderValue": "អ្នកផ្តល់សេវា: {0}",
"SubtitleDownloadFailureFromForItem": "សាប់ថាយថលបានបរាជ័យក្នុងការទាញយកពី {0} នៃ {1}",
"Sync": "ធ្វើអោយដំណាលគ្នា",
"System": "ប្រព័ន្ធ",
"TvShows": "កម្មវិធីទូរទស្សន៍",
"ScheduledTaskFailedWithName": "{0} បានបរាជ័យ",
"Undefined": "មិនបានកំណត់",
"User": "អ្នកប្រើប្រាស់",
"UserCreatedWithName": "អ្នកប្រើប្រាស់ {0} ត្រូវបានបង្កើតឡើង",
"ServerNameNeedsToBeRestarted": "{0} ចាំបាច់ត្រូវចាប់ផ្តើមឡើងវិញ",
"StartupEmbyServerIsLoading": "ម៉ាស៊ីនមេJellyfin កំពុងដំណើរការ. សូមព្យាយាមម្តងទៀតក្នុងពេលឆាប់ៗនេះ.",
"UserDeletedWithName": "អ្នកប្រើប្រាស់ {0} ត្រូវបានលុបចេញ",
"UserOnlineFromDevice": "{0} បានឃើញអនឡានពី {1}",
"UserDownloadingItemWithValues": "{0} កំពុងទាញយក {1}",
"UserOfflineFromDevice": "{0} បានផ្តាច់ចេញពី {1}",
"UserStartedPlayingItemWithValues": "{0} កំពុងចាក់ {1} នៅលើ {2}",
"TaskRefreshChapterImagesDescription": "បង្កើតរូបភាពតូចៗសម្រាប់វីដេអូដែលមានតាមជំពូក.",
"VersionNumber": "កំណែ {0}",
"TasksMaintenanceCategory": "តំហែរទាំ",
"TasksLibraryCategory": "បណ្ណាល័យ",
"TasksApplicationCategory": "កម្មវិធី",
"TaskCleanActivityLog": "សម្អាតកំណត់ហេតុសកម្មភាព",
"UserPasswordChangedWithName": "ពាក្យសម្ងាត់ត្រូវបានផ្លាស់ប្តូរសម្រាប់អ្នកប្រើប្រាស់ {0}",
"TaskCleanCache": "សម្អាតបញ្ជីឃ្លាំងសម្ងាត់",
"TaskRefreshChapterImages": "ដកស្រង់រូបភាពតាមជំពូក",
"UserPolicyUpdatedWithName": "គោលការណ៍អ្នកប្រើប្រាស់ត្រូវបានធ្វើបច្ចុប្បន្នភាពសម្រាប់ {0}",
"UserStoppedPlayingItemWithValues": "{0} បានបញ្ចប់ការចាក់ {1} នៅលើ {2}",
"ValueHasBeenAddedToLibrary": "{0} ត្រូវបានបញ្ចូលទៅក្នុងបណ្ណាល័យរឿងរបស់អ្នក",
"ValueSpecialEpisodeName": "ពិសេស - {0}",
"TasksChannelsCategory": "ប៉ុស្តតាមអ៊ីនធឺណិត",
"TaskAudioNormalization": "ធ្វើឱ្យមានតន្ត្រីមានសម្លេងស្មើគ្នា",
"TaskCleanActivityLogDescription": "លុបកំណត់ហេតុសកម្មភាពចាស់ជាងអាយុដែលបានកំណត់រចនាសម្ព័ន្ធ.",
"TaskCleanCacheDescription": "លុបឯកសារឃ្លាំងសម្ងាត់លែងត្រូវការដោយប្រព័ន្ធ.",
"TaskRefreshLibraryDescription": "ស្កេនបណ្ណាល័យរឿងរបស់អ្នក សម្រាប់ឯកសារថ្មីៗ និងmetadata ឡើងវិញ.",
"TaskCleanLogsDescription": "លុបឯកសារកំណត់ហេតុដែលមានអាយុកាលលើសពី {0} ថ្ងៃ.",
"TaskRefreshPeopleDescription": "ធ្វើបច្ចុប្បន្នភាព metadata សម្រាប់តួសម្តែង និងអ្នកដឹកនាំនៅក្នុងបណ្ណាល័យរឿងរបស់អ្នក.",
"TaskOptimizeDatabaseDescription": "បង្រួម Database និង Truncate free space. ដំណើរការកិច្ចការនេះ បន្ទាប់ពីការស្កេនបណ្ណាល័យ ឬធ្វើការផ្លាស់ប្តូរផ្សេងទៀត ដែលបញ្ជាក់ថា ការកែប្រែ Database អាចធ្វើឱ្យដំណើរការប្រសើរឡើង.",
"TaskRefreshTrickplayImages": "បង្កើតបណ្តុំរូបភាពតាម Trickplay",
"TaskRefreshTrickplayImagesDescription": "បង្កើត​ trickplay previews សម្រាប់​វីដេអូ​ក្នុង​បណ្ណាល័យ​ដែល​បានបង្ហាញ.",
"TaskKeyframeExtractorDescription": "ស្រង់យកFrame គន្លឹះៗពីវីដេអូ ដើម្បីបង្កើតបញ្ជីចាក់ HLS ច្បាស់លាស់ជាងមុន. កិច្ចការនេះអាចនឹងដំណើរការយូរ.",
"FailedLoginAttemptWithUserName": "បរាជ័យក្នុងការព្យាយាមចូលពី {0}",
"TaskCleanTranscode": "សម្អាតថតឯកសារ Transcode",
"TaskRefreshChannelsDescription": "Refreshes ព័ត៌មានបណ្តាញអ៊ីនធឺណិត.",
"TaskDownloadMissingSubtitles": "ទាញយកសាប់ថាយថលដែលបាត់",
"TaskRefreshChannels": "Refresh ឆានែល",
"TaskKeyframeExtractor": "ការញែក Keyframe",
"TaskAudioNormalizationDescription": "ស្កែនឯកសារសម្រាប់ធ្វើឱ្យមានតន្ត្រីមានសម្លេងស្មើគ្នា.",
"TaskRefreshLibrary": "ស្កេនបណ្ណាល័យរឿង",
"TaskCleanLogs": "សម្អាត Log Directory",
"TaskRefreshPeople": "Refresh អ្នកប្រើប្រាស់",
"TaskUpdatePlugins": "ធ្វើបច្ចុប្បន្នភាព Plugins",
"TaskUpdatePluginsDescription": "ទាញយក និងដំឡើងបច្ចុប្បន្នភាពសម្រាប់Plugins ដែលត្រូវបាន Config ដើម្បីធ្វើបច្ចុប្បន្នភាពដោយស្វ័យប្រវត្តិ.",
"TaskCleanTranscodeDescription": "លុបឯកសារ Transcode ដែលលើសពីមួយថ្ងៃ.",
"TaskDownloadMissingSubtitlesDescription": "ស្វែងរកតាមអ៊ីនធឺណិត សម្រាប់សាប់ថាយថល ដែលបាត់ដោយផ្អែកលើ metadata.",
"TaskOptimizeDatabase": "ធ្វើឱ្យ Database ប្រសើរឡើង",
"TaskCleanCollectionsAndPlaylistsDescription": "លុបរបស់របរចេញពីបណ្តុំ និងបញ្ជីចាក់ដែលលែងមាន.",
"TaskCleanCollectionsAndPlaylists": "សម្អាតបណ្តុំ និងបញ្ជីចាក់"
}

View File

@ -125,5 +125,10 @@
"TaskKeyframeExtractor": "키프레임 추출",
"External": "외부",
"HearingImpaired": "청각 장애",
"TaskCleanCollectionsAndPlaylists": "컬렉션과 재생목록 정리"
"TaskCleanCollectionsAndPlaylists": "컬렉션과 재생목록 정리",
"TaskAudioNormalization": "오디오의 볼륨 수준을 일정하게 조정",
"TaskAudioNormalizationDescription": "오디오의 볼륨 수준을 일정하게 조정하기 위해 파일을 스캔합니다.",
"TaskRefreshTrickplayImages": "비디오 탐색용 미리보기 썸네일 생성",
"TaskRefreshTrickplayImagesDescription": "활성화된 라이브러리에서 비디오의 트릭플레이 미리보기를 생성합니다.",
"TaskCleanCollectionsAndPlaylistsDescription": "더 이상 존재하지 않는 컬렉션 및 재생 목록에서 항목을 제거합니다."
}

View File

@ -0,0 +1,135 @@
{
"Collections": "Kuntellow",
"DeviceOfflineWithName": "{0} re anjunyas",
"External": "A-ves",
"Folders": "Plegellow",
"HeaderFavoriteAlbums": "Albomow Drudh",
"HeaderFavoriteArtists": "Artydhyon Drudh",
"HeaderFavoriteEpisodes": "Towlennow Drudh",
"HeaderFavoriteSongs": "Kanow Drudh",
"HeaderRecordingGroups": "Bagasow Rekordya",
"HearingImpaired": "Klewans Aperys",
"HomeVideos": "Gwydhyow Tre",
"Inherit": "Herya",
"LabelRunningTimeValue": "Prys ow ponya: {0}",
"Latest": "Diwettha",
"MessageApplicationUpdated": "Servell Jellyfin re beu nowedhys",
"MessageApplicationUpdatedTo": "Servell Jellyfin re beu nowedhys dhe {0}",
"MessageNamedServerConfigurationUpdatedWithValue": "Rann dewisyans servell {0} re beu nowedhys",
"MixedContent": "Dalgh kemmyskys",
"Movies": "Fylmow",
"MusicVideos": "Gwydhyow Ilow",
"NameSeasonUnknown": "Seson Anwodhvedhys",
"NotificationOptionAudioPlayback": "Seneans dallethys",
"NotificationOptionAudioPlaybackStopped": "Seneans hedhys",
"NotificationOptionPluginError": "Defowt ystynnans",
"NotificationOptionPluginUninstalled": "Ystynnans anynstallys",
"NotificationOptionPluginUpdateInstalled": "Nowedheans ystynnans ynstallys",
"Application": "Gweythres",
"Favorites": "Moyha Kerys",
"Forced": "Konstrynys",
"Albums": "Albomow",
"Books": "Lyvrow",
"Channels": "Kanolyow",
"AppDeviceValues": "App: {0}, Devis: {1}",
"Artists": "Artyhdyon",
"HeaderAlbumArtists": "Albom artydhyon",
"HeaderNextUp": "Nessa",
"CameraImageUploadedFrom": "Skeusen kamera nowydh re beu ughkargys a-dhyworth {0}",
"ChapterNameValue": "Chaptra {0}",
"FailedLoginAttemptWithUserName": "Assay omgelm fyllys a-dhyworth {0}",
"AuthenticationSucceededWithUserName": "{0} omgelmys yn sewen",
"Default": "Defowt",
"DeviceOnlineWithName": "{0} yw junys",
"ItemRemovedWithName": "{0} a veu dileys a-dhyworth an lyverva",
"LabelIpAddressValue": "Trigva PK: {)}",
"Music": "Ilow",
"HeaderContinueWatching": "Pesya Ow Kweles",
"NameSeasonNumber": "Seson {0}",
"NotificationOptionApplicationUpdateInstalled": "Nowedheans gweythres ynstallys",
"NotificationOptionCameraImageUploaded": "Skeusen kamera ughkargys",
"HeaderFavoriteShows": "Diskwedhyansow Drudh",
"HeaderLiveTV": "PW Yn Fyw",
"MessageServerConfigurationUpdated": "Dewisyans servell re beu nowedhys",
"ItemAddedWithName": "{0} a veu keworrys dhe'n lyverva",
"NameInstallFailed": "{0} ynstallyans fyllys",
"NotificationOptionNewLibraryContent": "Dalgh nowydh keworrys",
"NewVersionIsAvailable": "Yma versyon nowydh a Servell Jellyfin neb yw kavadow rag iskarga.",
"NotificationOptionApplicationUpdateAvailable": "Nowedheans gweythres kavadow",
"NotificationOptionInstallationFailed": "Defowt ynstallyans",
"Genres": "Eghennow",
"NotificationOptionPluginInstalled": "Ystynnans ynstallys",
"NotificationOptionServerRestartRequired": "Dastalleth servell yw res",
"StartupEmbyServerIsLoading": "Yma Servell Jellyfin ow kargya. Assay arta yn berr mar pleg.",
"SubtitleDownloadFailureFromForItem": "Istitlow a fyllis iskarga a-dhyworth {0] rag {1}",
"System": "Kevreyth",
"User": "Devnydhyer",
"UserDeletedWithName": "Devnydhyer {0} re beu dileys",
"UserLockedOutWithName": "Devnydhyer {0} re beu alhwedhys yn-mes",
"UserStoppedPlayingItemWithValues": "{0} re worfennas gwari {1} war {2}",
"UserOfflineFromDevice": "{0} re anjunyas a-dhyworth {1}",
"UserOnlineFromDevice": "{0} yw warlinen a-dhyworth {1}",
"NotificationOptionUserLockedOut": "Devnydhyer yw alhwedhys yn-mes",
"Photos": "Skeusennow",
"Playlists": "Rolyow-gwari",
"Plugin": "Ystynnans",
"PluginInstalledWithName": "{0} a veu ynstallys",
"UserPolicyUpdatedWithName": "Polici devnydhyer re beu nowedhys rag {0}",
"PluginUpdatedWithName": "{0} a veu nowedhys",
"ScheduledTaskFailedWithName": "{0} a fyllis",
"Songs": "Kanow",
"Sync": "Kesseni",
"TvShows": "Towlennow PW",
"Undefined": "Anstyrys",
"UserCreatedWithName": "Devnydhyer {0} re beu gwruthys",
"UserDownloadingItemWithValues": "Yma {0} owth iskarga {1}",
"UserPasswordChangedWithName": "Ger-tremena re beu chanjys rag devnydhyer {0}",
"UserStartedPlayingItemWithValues": "Yma {0} ow kwari {1} war {2}",
"ValueHasBeenAddedToLibrary": "{0} re beu keworrys dhe'th lyverva media",
"VersionNumber": "Versyon {0}",
"TasksLibraryCategory": "Lyverva",
"TaskCleanActivityLog": "Glanhe Kovlyver Gwrians",
"TaskRefreshPeople": "Disegha Tus",
"TaskRefreshLibrary": "Arhwilas Lyverva Media",
"TaskCleanTranscodeDescription": "Y hwra dilea restrennow treylya neg a veu gwrys kyns nans yw dydh.",
"NotificationOptionVideoPlaybackStopped": "Gwareans gwydhyow yw hedhys",
"NotificationOptionVideoPlayback": "Gwareans gwydhyow yw dallethys",
"PluginUninstalledWithName": "{0} a veu anynstallys",
"NotificationOptionTaskFailed": "Defowt oberen towlennys",
"ProviderValue": "Provier: {0}",
"ScheduledTaskStartedWithName": "{0} a dhallathas",
"ServerNameNeedsToBeRestarted": "Yma edhom dhe {0} a vos dastallathys",
"ValueSpecialEpisodeName": "Arbennik - {0}",
"TasksMaintenanceCategory": "Mentons",
"TasksApplicationCategory": "Gweythres",
"TasksChannelsCategory": "Kanolyow Kesrosweyth",
"TaskCleanLogs": "Glanhe Kevarwodhyador Kovlyver",
"TaskAudioNormalization": "Normalheans Klewans",
"TaskRefreshChannels": "Disegha Kanolyow",
"TaskCleanTranscode": "Glanhe Kevarwodhyador Treylya",
"TaskUpdatePlugins": "Nowedhi Ystynansow",
"Shows": "Diskwedhyansow",
"TaskCleanCache": "Glanhe Kevarwodhyador Gwithva",
"TaskCleanActivityLogDescription": "Y hwra dilea lin kovlyver gwrians kottha ages an bloodh dewisys.",
"TaskCleanCacheDescription": "Y hwra dilea restrennow gwithva nag yw res rag an kevreyth.",
"TaskRefreshPeopleDescription": "Y hwra nowedhi metadata rag gwarioryon ha kevarwodhoryon yn dha lyverva media.",
"TaskRefreshChapterImages": "Kuntel Imajys Chaptra",
"TaskRefreshChapterImagesDescription": "Y hwra ewines meus rag gwydhyowyow gans chaptraow.",
"TaskRefreshTrickplayImagesDescription": "Y hwra kynwelyow trickplay rag gwydhyowyow yn lyvervaow gallosegys.",
"TaskRefreshTrickplayImages": "Dinythi Imajys Trickplay",
"TaskCleanLogsDescription": "Y hwra dilea restrennow kovlyver a veu gwrys kyns nans yw {0} dydh.",
"TaskDownloadMissingLyrics": "Iskarga geryow kellys",
"TaskUpdatePluginsDescription": "Y hwra iskarga hag ynstallya nowedheansow rag ystynansow neb yw dewisys dhe nowedhi yn awtomatek.",
"TaskDownloadMissingSubtitles": "Iskarga istitlow kellys",
"TaskRefreshChannelsDescription": "Y hwra disegha kedhlow kanolyow kesrosweyth.",
"TaskDownloadMissingLyricsDescription": "Y hwra iskarga geryow rag kanow",
"TaskDownloadMissingSubtitlesDescription": "Y hwra hwilas an kesrosweyth rag istitlow kellys a-dhywoth dewisyans metadata.",
"TaskOptimizeDatabase": "Gwellhe selvanylyon",
"TaskOptimizeDatabaseDescription": "Y hwra kesstrotha ha berrhe efander rydh. Martesen y hwra gwellhe gwryth mar kwre'ta an oberen ma wosa ty dhe arhwilas an lyverva, po neb chanj aral neb a brof chanjyansow selvanylyon.",
"TaskAudioNormalizationDescription": "Y hwra arhwilas restrennow rag manylyon normalheans klewans.",
"TaskRefreshLibraryDescription": "Y hwra arhwilas dha lyverva media rag restrennow nowydh ha disegha metamanylyon.",
"TaskCleanCollectionsAndPlaylists": "Glanhe kuntellow ha rolyow-gwari",
"TaskKeyframeExtractor": "Estennell Framalhwedh",
"TaskCleanCollectionsAndPlaylistsDescription": "Y hwra dilea taklow a-dhyworth kuntellow ha rolyow-gwari na vos na moy.",
"TaskKeyframeExtractorDescription": "Y hwra kuntel framyowalhwedh a-dhyworth restrennow gwydhyowyow rag gul rolyow-gwari HLS moy poran. Martesen y hwra an oberen ma ow ponya rag termyn hir."
}

View File

@ -17,7 +17,7 @@
"Inherit": "Pārmantot",
"AppDeviceValues": "Lietotne: {0}, Ierīce: {1}",
"VersionNumber": "Versija {0}",
"ValueHasBeenAddedToLibrary": "{0} ir ticis pievienots jūsu multvides bibliotēkai",
"ValueHasBeenAddedToLibrary": "{0} tika pievienots jūsu multvides bibliotēkai",
"UserStoppedPlayingItemWithValues": "{0} ir beidzis atskaņot {1} uz {2}",
"UserStartedPlayingItemWithValues": "{0} atskaņo {1} uz {2}",
"UserPasswordChangedWithName": "Lietotāja {0} parole tika nomainīta",
@ -95,7 +95,7 @@
"TaskRefreshChapterImages": "Izvilkt nodaļu attēlus",
"TasksApplicationCategory": "Lietotne",
"TasksLibraryCategory": "Bibliotēka",
"TaskDownloadMissingSubtitlesDescription": "Internetā meklē trūkstošus subtitrus balstoties uz metadatu uzstādījumiem.",
"TaskDownloadMissingSubtitlesDescription": "Meklē internetā trūkstošos subtitrus, pamatojoties uz metadatu konfigurāciju.",
"TaskDownloadMissingSubtitles": "Lejupielādēt trūkstošos subtitrus",
"TaskRefreshChannelsDescription": "Atjauno interneta kanālu informāciju.",
"TaskRefreshChannels": "Atjaunot kanālus",
@ -105,8 +105,8 @@
"TaskUpdatePlugins": "Atjaunot paplašinājumus",
"TaskRefreshPeopleDescription": "Atjauno metadatus aktieriem un direktoriem jūsu multivides bibliotēkā.",
"TaskRefreshPeople": "Atjaunot cilvēkus",
"TaskCleanLogsDescription": "Nodzēš logdatnes, kas ir senākas par {0} dienām.",
"TaskCleanLogs": "Iztīrīt logdatņu mapi",
"TaskCleanLogsDescription": "Nodzēš žurnāla ierakstus, kas ir senāki par {0} dienām.",
"TaskCleanLogs": "Iztīrīt žurnālu mapi",
"TaskRefreshLibraryDescription": "Skenē jūsu multivides bibliotēku, lai atrastu jaunas datnes, un atsvaidzina metadatus.",
"TaskRefreshLibrary": "Skenēt multivides bibliotēku",
"TaskRefreshChapterImagesDescription": "Izveido sīktēlus priekš video ar sadaļām.",
@ -125,5 +125,9 @@
"TaskKeyframeExtractor": "Atslēgkadru ekstraktors",
"TaskKeyframeExtractorDescription": "Ekstraktē atslēgkadrus no video failiem lai izveidotu precīzākus HLS atskaņošanas sarakstus. Šis process var būt ilgs.",
"TaskRefreshTrickplayImages": "Ģenerēt partīšanas attēlus",
"TaskRefreshTrickplayImagesDescription": "Izveido priekšskatījumus videoklipu pārtīšanai iespējotajās bibliotēkās."
"TaskRefreshTrickplayImagesDescription": "Izveido priekšskatījumus videoklipu pārtīšanai iespējotajās bibliotēkās.",
"TaskAudioNormalization": "Audio normalizācija",
"TaskCleanCollectionsAndPlaylistsDescription": "Noņem vairs neeksistējošus vienumus no kolekcijām un atskaņošanas sarakstiem.",
"TaskAudioNormalizationDescription": "Skanē failus priekš audio normālizācijas informācijas.",
"TaskCleanCollectionsAndPlaylists": "Notīrīt kolekcijas un atskaņošanas sarakstus"
}

View File

@ -6,7 +6,7 @@
"ChapterNameValue": "അധ്യായം {0}",
"DeviceOfflineWithName": "{0} വിച്ഛേദിച്ചു",
"DeviceOnlineWithName": "{0} ബന്ധിപ്പിച്ചു",
"FailedLoginAttemptWithUserName": "{0} - എന്നതിൽ നിന്നുള്ള പ്രവേശന ശ്രമം പരാജയപ്പെട്ടു",
"FailedLoginAttemptWithUserName": "{0}ൽ നിന്നുള്ള പ്രവേശന ശ്രമം പരാജയപ്പെട്ടു",
"Forced": "നിർബന്ധിച്ചു",
"HeaderFavoriteAlbums": "പ്രിയപ്പെട്ട ആൽബങ്ങൾ",
"HeaderFavoriteArtists": "പ്രിയപ്പെട്ട കലാകാരന്മാർ",
@ -125,5 +125,9 @@
"TaskKeyframeExtractorDescription": "കൂടുതൽ കൃത്യമായ HLS പ്ലേലിസ്റ്റുകൾ സൃഷ്‌ടിക്കുന്നതിന് വീഡിയോ ഫയലുകളിൽ നിന്ന് കീഫ്രെയിമുകൾ എക്‌സ്‌ട്രാക്‌റ്റ് ചെയ്യുന്നു. ഈ പ്രവർത്തനം പൂർത്തിയാവാൻ കുറച്ചധികം സമയം എടുത്തേക്കാം.",
"TaskKeyframeExtractor": "കീഫ്രെയിം എക്സ്ട്രാക്റ്റർ",
"TaskCleanCollectionsAndPlaylistsDescription": "നിലവിലില്ലാത്ത ശേഖരങ്ങളിൽ നിന്നും പ്ലേലിസ്റ്റുകളിൽ നിന്നും ഇനങ്ങൾ നീക്കംചെയ്യുന്നു.",
"TaskCleanCollectionsAndPlaylists": "ശേഖരങ്ങളും പ്ലേലിസ്റ്റുകളും വൃത്തിയാക്കുക"
"TaskCleanCollectionsAndPlaylists": "ശേഖരങ്ങളും പ്ലേലിസ്റ്റുകളും വൃത്തിയാക്കുക",
"TaskAudioNormalization": "സാധാരണ ശബ്ദ നിലയിലെത്തിലെത്തിക്കുക",
"TaskAudioNormalizationDescription": "സാധാരണ ശബ്ദ നിലയിലെത്തിലെത്തിക്കുന്ന ഡാറ്റയ്ക്കായി ഫയലുകൾ സ്കാൻ ചെയ്യുക.",
"TaskRefreshTrickplayImages": "ട്രിക്ക് പ്ലേ ചിത്രങ്ങൾ സൃഷ്ടിക്കുക",
"TaskRefreshTrickplayImagesDescription": "പ്രവർത്തനക്ഷമമാക്കിയ ലൈബ്രറികളിൽ വീഡിയോകൾക്കായി ട്രിക്ക്പ്ലേ പ്രിവ്യൂകൾ സൃഷ്ടിക്കുന്നു."
}

View File

@ -126,5 +126,11 @@
"External": "Ekstern",
"HearingImpaired": "Hørselshemmet",
"TaskRefreshTrickplayImages": "Generer Trickplay bilder",
"TaskRefreshTrickplayImagesDescription": "Oppretter trickplay-forhåndsvisninger for videoer i aktiverte biblioteker."
"TaskRefreshTrickplayImagesDescription": "Oppretter trickplay-forhåndsvisninger for videoer i aktiverte biblioteker.",
"TaskCleanCollectionsAndPlaylists": "Rydd kolleksjoner og spillelister",
"TaskAudioNormalization": "Lyd Normalisering",
"TaskAudioNormalizationDescription": "Skan filer for lyd normaliserende data",
"TaskCleanCollectionsAndPlaylistsDescription": "Fjerner elementer fra kolleksjoner og spillelister som ikke lengere finnes",
"TaskDownloadMissingLyrics": "Last ned manglende tekster",
"TaskDownloadMissingLyricsDescription": "Last ned sangtekster"
}

View File

@ -11,7 +11,7 @@
"Collections": "Collecties",
"DeviceOfflineWithName": "Verbinding met {0} is verbroken",
"DeviceOnlineWithName": "{0} is verbonden",
"FailedLoginAttemptWithUserName": "Mislukte inlogpoging van {0}",
"FailedLoginAttemptWithUserName": "Mislukte aanmeldpoging van {0}",
"Favorites": "Favorieten",
"Folders": "Mappen",
"Genres": "Genres",
@ -25,7 +25,7 @@
"HeaderLiveTV": "Live TV",
"HeaderNextUp": "Volgende",
"HeaderRecordingGroups": "Opnamegroepen",
"HomeVideos": "Thuis video's",
"HomeVideos": "Homevideo's",
"Inherit": "Erven",
"ItemAddedWithName": "{0} is toegevoegd aan de bibliotheek",
"ItemRemovedWithName": "{0} is verwijderd uit de bibliotheek",
@ -124,11 +124,13 @@
"TaskKeyframeExtractorDescription": "Haalt keyframes uit videobestanden om preciezere HLS-afspeellijsten te maken. Deze taak kan lang duren.",
"TaskKeyframeExtractor": "Keyframes uitpakken",
"External": "Extern",
"HearingImpaired": "Slechthorend",
"HearingImpaired": "Slechthorenden",
"TaskRefreshTrickplayImages": "Trickplay-afbeeldingen genereren",
"TaskRefreshTrickplayImagesDescription": "Creëert trickplay-voorvertoningen voor video's in bibliotheken waarvoor dit is ingeschakeld.",
"TaskCleanCollectionsAndPlaylists": "Collecties en afspeellijsten opruimen",
"TaskCleanCollectionsAndPlaylistsDescription": "Verwijdert niet langer bestaande items uit collecties en afspeellijsten.",
"TaskAudioNormalization": "Geluidsnormalisatie",
"TaskAudioNormalizationDescription": "Scant bestanden op gegevens voor geluidsnormalisatie."
"TaskAudioNormalizationDescription": "Scant bestanden op gegevens voor geluidsnormalisatie.",
"TaskDownloadMissingLyrics": "Ontbrekende liedteksten downloaden",
"TaskDownloadMissingLyricsDescription": "Downloadt liedteksten"
}

View File

@ -118,5 +118,6 @@
"Undefined": "Udefinert",
"Forced": "Tvungen",
"Default": "Standard",
"External": "Ekstern"
"External": "Ekstern",
"HearingImpaired": "Nedsett høyrsel"
}

View File

@ -104,7 +104,7 @@
"Forced": "ਮਜਬੂਰ",
"Folders": "ਫੋਲਡਰ",
"Favorites": "ਮਨਪਸੰਦ",
"FailedLoginAttemptWithUserName": "{0} ਤੋਂ ਲਾਗਇਨ ਕੋਸ਼ਿਸ਼ ਫੇਲ ਹੋਈ",
"FailedLoginAttemptWithUserName": "{0} ਤੋਂ ਲਾਗਇਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਫੇਲ ਹੋਈ",
"DeviceOnlineWithName": "{0} ਜੁੜਿਆ ਹੋਇਆ ਹੈ",
"DeviceOfflineWithName": "{0} ਡਿਸਕਨੈਕਟ ਹੋ ਗਿਆ ਹੈ",
"Default": "ਡਿਫੌਲਟ",
@ -119,5 +119,6 @@
"AppDeviceValues": "ਐਪ: {0}, ਜੰਤਰ: {1}",
"Albums": "ਐਲਬਮਾਂ",
"TaskOptimizeDatabase": "ਡਾਟਾਬੇਸ ਅਨੁਕੂਲ ਬਣਾਓ",
"External": "ਬਾਹਰੀ"
"External": "ਬਾਹਰੀ",
"HearingImpaired": "ਸੁਨਣ ਵਿਚ ਕਮਜ਼ੋਰ"
}

View File

@ -11,7 +11,7 @@
"Collections": "Kolekcje",
"DeviceOfflineWithName": "{0} został rozłączony",
"DeviceOnlineWithName": "{0} połączył się",
"FailedLoginAttemptWithUserName": "Próba logowania przez {0} zakończona niepowodzeniem",
"FailedLoginAttemptWithUserName": "Nieudana próba logowania przez {0}",
"Favorites": "Ulubione",
"Folders": "Foldery",
"Genres": "Gatunki",
@ -98,8 +98,8 @@
"TaskRefreshChannels": "Odśwież kanały",
"TaskCleanTranscodeDescription": "Usuwa transkodowane pliki starsze niż 1 dzień.",
"TaskCleanTranscode": "Wyczyść folder transkodowania",
"TaskUpdatePluginsDescription": "Pobiera i instaluje aktualizacje dla pluginów, które są skonfigurowane do automatycznej aktualizacji.",
"TaskUpdatePlugins": "Aktualizuj pluginy",
"TaskUpdatePluginsDescription": "Pobiera i instaluje aktualizacje wtyczek, które są skonfigurowane do automatycznej aktualizacji.",
"TaskUpdatePlugins": "Aktualizuj wtyczki",
"TaskRefreshPeopleDescription": "Odświeża metadane o aktorów i reżyserów w Twojej bibliotece mediów.",
"TaskRefreshPeople": "Odśwież obsadę",
"TaskCleanLogsDescription": "Kasuje pliki logów starsze niż {0} dni.",
@ -130,5 +130,7 @@
"TaskCleanCollectionsAndPlaylistsDescription": "Usuwa elementy z kolekcji i list odtwarzania, które już nie istnieją.",
"TaskCleanCollectionsAndPlaylists": "Oczyść kolekcje i listy odtwarzania",
"TaskAudioNormalization": "Normalizacja dźwięku",
"TaskAudioNormalizationDescription": "Skanuje pliki w poszukiwaniu danych normalizacji dźwięku."
"TaskAudioNormalizationDescription": "Skanuje pliki w poszukiwaniu danych normalizacji dźwięku.",
"TaskDownloadMissingLyrics": "Pobierz brakujące słowa",
"TaskDownloadMissingLyricsDescription": "Pobierz słowa piosenek"
}

View File

@ -130,5 +130,7 @@
"TaskCleanCollectionsAndPlaylists": "Limpe coleções e playlists",
"TaskCleanCollectionsAndPlaylistsDescription": "Remove itens de coleções e playlists que não existem mais.",
"TaskAudioNormalization": "Normalização de áudio",
"TaskAudioNormalizationDescription": "Verifica arquivos em busca de dados de normalização de áudio."
"TaskAudioNormalizationDescription": "Examina os ficheiros em busca de dados de normalização de áudio.",
"TaskDownloadMissingLyricsDescription": "Baixar letras para músicas",
"TaskDownloadMissingLyrics": "Baixar letra faltante"
}

View File

@ -129,5 +129,7 @@
"TaskCleanCollectionsAndPlaylistsDescription": "Remove itens de coleções e listas de reprodução que já não existem.",
"TaskCleanCollectionsAndPlaylists": "Limpar coleções e listas de reprodução",
"TaskAudioNormalizationDescription": "Analisa os ficheiros para obter dados de normalização de áudio.",
"TaskAudioNormalization": "Normalização de áudio"
"TaskAudioNormalization": "Normalização de áudio",
"TaskDownloadMissingLyrics": "Baixar letras faltantes",
"TaskDownloadMissingLyricsDescription": "Baixa letras para músicas"
}

View File

@ -78,7 +78,7 @@
"Genres": "Genuri",
"Folders": "Dosare",
"Favorites": "Favorite",
"FailedLoginAttemptWithUserName": "Încercare de conectare nereușită de la {0}",
"FailedLoginAttemptWithUserName": "Încercare de conectare eșuată pentru {0}",
"DeviceOnlineWithName": "{0} este conectat",
"DeviceOfflineWithName": "{0} s-a deconectat",
"Collections": "Colecții",
@ -125,5 +125,9 @@
"TaskKeyframeExtractor": "Extractor de cadre cheie",
"HearingImpaired": "Ascultare Impară",
"TaskRefreshTrickplayImages": "Generează imagini Trickplay",
"TaskRefreshTrickplayImagesDescription": "Generează previzualizările trickplay pentru videourile din librăriile selectate."
"TaskRefreshTrickplayImagesDescription": "Generează previzualizările trickplay pentru videourile din librăriile selectate.",
"TaskAudioNormalizationDescription": "Scanează fișiere pentru date necesare normalizării sunetului.",
"TaskAudioNormalization": "Normalizare sunet",
"TaskCleanCollectionsAndPlaylists": "Curăță colecțiile și listele de redare",
"TaskCleanCollectionsAndPlaylistsDescription": "Elimină elementele care nu mai există din colecții și liste de redare."
}

View File

@ -11,7 +11,7 @@
"Collections": "Коллекции",
"DeviceOfflineWithName": "{0} - отключено",
"DeviceOnlineWithName": "{0} - подключено",
"FailedLoginAttemptWithUserName": "{0} - попытка входа неудачна",
"FailedLoginAttemptWithUserName": "Неудачная попытка входа с {0}",
"Favorites": "Избранное",
"Folders": "Папки",
"Genres": "Жанры",
@ -31,7 +31,7 @@
"ItemRemovedWithName": "{0} - изъято из медиатеки",
"LabelIpAddressValue": "IP-адрес: {0}",
"LabelRunningTimeValue": "Длительность: {0}",
"Latest": "Последние добавленные",
"Latest": "Последние",
"MessageApplicationUpdated": "Jellyfin Server был обновлён",
"MessageApplicationUpdatedTo": "Jellyfin Server был обновлён до {0}",
"MessageNamedServerConfigurationUpdatedWithValue": "Конфигурация сервера (раздел {0}) была обновлена",
@ -128,5 +128,9 @@
"TaskRefreshTrickplayImages": "Сгенерировать изображения для Trickplay",
"TaskRefreshTrickplayImagesDescription": "Создает предпросмотры для Trickplay для видео в библиотеках, где эта функция включена.",
"TaskCleanCollectionsAndPlaylists": "Очистка коллекций и списков воспроизведения",
"TaskCleanCollectionsAndPlaylistsDescription": "Удаляет элементы из коллекций и списков воспроизведения, которые больше не существуют."
"TaskCleanCollectionsAndPlaylistsDescription": "Удаляет элементы из коллекций и списков воспроизведения, которые больше не существуют.",
"TaskAudioNormalization": "Нормализация звука",
"TaskAudioNormalizationDescription": "Сканирует файлы на наличие данных о нормализации звука.",
"TaskDownloadMissingLyrics": "Загрузить недостающий текст",
"TaskDownloadMissingLyricsDescription": "Загружает текст песен"
}

View File

@ -16,7 +16,7 @@
"Folders": "Mappar",
"Genres": "Genrer",
"HeaderAlbumArtists": "Albumartister",
"HeaderContinueWatching": "Fortsätt titta",
"HeaderContinueWatching": "Fortsätt titta",
"HeaderFavoriteAlbums": "Favoritalbum",
"HeaderFavoriteArtists": "Favoritartister",
"HeaderFavoriteEpisodes": "Favoritavsnitt",
@ -127,5 +127,10 @@
"HearingImpaired": "Hörselskadad",
"TaskRefreshTrickplayImages": "Generera Trickplay-bilder",
"TaskRefreshTrickplayImagesDescription": "Skapar trickplay-förhandsvisningar för videor i aktiverade bibliotek.",
"TaskCleanCollectionsAndPlaylists": "Rensa samlingar och spellistor"
"TaskCleanCollectionsAndPlaylists": "Rensa upp samlingar och spellistor",
"TaskAudioNormalization": "Ljudnormalisering",
"TaskCleanCollectionsAndPlaylistsDescription": "Tar bort objekt från samlingar och spellistor som inte längre finns.",
"TaskAudioNormalizationDescription": "Skannar filer för ljudnormaliseringsdata.",
"TaskDownloadMissingLyrics": "Ladda ner saknad låttext",
"TaskDownloadMissingLyricsDescription": "Laddar ner låttexter"
}

View File

@ -125,5 +125,9 @@
"External": "வெளி",
"HearingImpaired": "செவித்திறன் குறைபாடுடையவர்",
"TaskRefreshTrickplayImages": "முன்னோட்ட படங்களை உருவாக்கு",
"TaskRefreshTrickplayImagesDescription": "செயல்பாட்டில் உள்ள தொகுப்புகளுக்கு முன்னோட்ட படங்களை உருவாக்கும்."
"TaskRefreshTrickplayImagesDescription": "செயல்பாட்டில் உள்ள தொகுப்புகளுக்கு முன்னோட்ட படங்களை உருவாக்கும்.",
"TaskCleanCollectionsAndPlaylists": "சேகரிப்புகள் மற்றும் பிளேலிஸ்ட்களை சுத்தம் செய்யவும்",
"TaskCleanCollectionsAndPlaylistsDescription": "சேகரிப்புகள் மற்றும் பிளேலிஸ்ட்களில் இருந்து உருப்படிகளை நீக்குகிறது.",
"TaskAudioNormalization": "ஆடியோ இயல்பாக்கம்",
"TaskAudioNormalizationDescription": "ஆடியோ இயல்பாக்குதல் தரவுக்காக கோப்புகளை ஸ்கேன் செய்கிறது."
}

View File

@ -123,5 +123,7 @@
"External": "ภายนอก",
"HearingImpaired": "บกพร่องทางการได้ยิน",
"TaskKeyframeExtractor": "ตัวแยกคีย์เฟรม",
"TaskKeyframeExtractorDescription": "แยกคีย์เฟรมจากไฟล์วีดีโอเพื่อสร้างรายการ HLS ให้ถูกต้อง. กระบวนการนี้อาจใช้ระยะเวลานาน"
"TaskKeyframeExtractorDescription": "แยกคีย์เฟรมจากไฟล์วีดีโอเพื่อสร้างรายการ HLS ให้ถูกต้อง. กระบวนการนี้อาจใช้ระยะเวลานาน",
"TaskRefreshTrickplayImages": "สร้างไฟล์รูปภาพสำหรับ Trickplay",
"TaskRefreshTrickplayImagesDescription": "สร้างภาพตัวอย่างของวีดีโอในคลังที่เปิดใช้งาน Trickplay"
}

View File

@ -11,7 +11,7 @@
"Collections": "Koleksiyonlar",
"DeviceOfflineWithName": "{0} bağlantısı kesildi",
"DeviceOnlineWithName": "{0} bağlı",
"FailedLoginAttemptWithUserName": "{0} kullanıcısının giriş denemesi başarısız oldu",
"FailedLoginAttemptWithUserName": "{0} kullanıcısının başarısız oturum açma girişimi",
"Favorites": "Favoriler",
"Folders": "Klasörler",
"Genres": "Türler",

View File

@ -129,5 +129,7 @@
"TaskCleanCollectionsAndPlaylists": "Очистити колекції і списки відтворення",
"TaskCleanCollectionsAndPlaylistsDescription": "Видаляє елементи з колекцій і списків відтворення, які більше не існують.",
"TaskAudioNormalizationDescription": "Сканує файли на наявність даних для нормалізації звуку.",
"TaskAudioNormalization": "Нормалізація аудіо"
"TaskAudioNormalization": "Нормалізація аудіо",
"TaskDownloadMissingLyrics": "Завантажити відсутні тексти пісень",
"TaskDownloadMissingLyricsDescription": "Завантаження текстів пісень"
}

View File

@ -8,5 +8,20 @@
"Channels": "Kanallar",
"Books": "Kitoblar",
"Artists": "Ijrochilar",
"Albums": "Albomlar"
"Albums": "Albomlar",
"AuthenticationSucceededWithUserName": "{0} muvaffaqiyatli tasdiqlandi",
"AppDeviceValues": "Ilova: {0}, Qurilma: {1}",
"Application": "Ilova",
"CameraImageUploadedFrom": "{0}dan yangi kamera rasmi yuklandi",
"DeviceOnlineWithName": "{0} ulangan",
"ItemRemovedWithName": "{0} kutbxonadan o'chirildi",
"External": "Tashqi",
"FailedLoginAttemptWithUserName": "Muvafaqiyatsiz kirishlar soni {0}",
"Forced": "Majburiy",
"ChapterNameValue": "{0}chi bo'lim",
"DeviceOfflineWithName": "{0} aloqa uzildi",
"HeaderLiveTV": "Jonli TV",
"HeaderNextUp": "Keyingisi",
"ItemAddedWithName": "{0} kutbxonaga qo'shildi",
"LabelIpAddressValue": "IP manzil: {0}"
}

View File

@ -103,11 +103,11 @@
"HeaderFavoriteEpisodes": "Tập Phim Yêu Thích",
"HeaderFavoriteArtists": "Nghệ Sĩ Yêu Thích",
"HeaderFavoriteAlbums": "Album Ưa Thích",
"FailedLoginAttemptWithUserName": "Đăng nhập không thành công thử từ {0}",
"FailedLoginAttemptWithUserName": "Nỗ lực đăng nhập không thành công từ {0}",
"DeviceOnlineWithName": "{0} đã kết nối",
"DeviceOfflineWithName": "{0} đã ngắt kết nối",
"ChapterNameValue": "Phân Cảnh {0}",
"Channels": "Các Kênh",
"Channels": "Kênh",
"CameraImageUploadedFrom": "Một hình ảnh máy ảnh mới đã được tải lên từ {0}",
"Books": "Sách",
"AuthenticationSucceededWithUserName": "{0} xác thực thành công",
@ -127,5 +127,9 @@
"TaskRefreshTrickplayImages": "Tạo Ảnh Xem Trước Trickplay",
"TaskRefreshTrickplayImagesDescription": "Tạo bản xem trước trịckplay cho video trong thư viện đã bật.",
"TaskCleanCollectionsAndPlaylists": "Dọn dẹp bộ sưu tập và danh sách phát",
"TaskCleanCollectionsAndPlaylistsDescription": "Xóa các mục khỏi bộ sưu tập và danh sách phát không còn tồn tại."
"TaskCleanCollectionsAndPlaylistsDescription": "Xóa các mục khỏi bộ sưu tập và danh sách phát không còn tồn tại.",
"TaskAudioNormalization": "Chuẩn Hóa Âm Thanh",
"TaskAudioNormalizationDescription": "Quét tập tin để tìm dữ liệu chuẩn hóa âm thanh.",
"TaskDownloadMissingLyricsDescription": "Tải xuống lời cho bài hát",
"TaskDownloadMissingLyrics": "Tải xuống lời bị thiếu"
}

View File

@ -11,7 +11,7 @@
"Collections": "合集",
"DeviceOfflineWithName": "{0} 已断开",
"DeviceOnlineWithName": "{0} 已连接",
"FailedLoginAttemptWithUserName": "从 {0} 尝试登录失败",
"FailedLoginAttemptWithUserName": "来自 {0} 的登录尝试失败",
"Favorites": "我的最爱",
"Folders": "文件夹",
"Genres": "类型",
@ -130,5 +130,7 @@
"TaskCleanCollectionsAndPlaylists": "清理合集和播放列表",
"TaskCleanCollectionsAndPlaylistsDescription": "清理合集和播放列表中已不存在的项目。",
"TaskAudioNormalization": "音频标准化",
"TaskAudioNormalizationDescription": "扫描文件以寻找音频标准化数据。"
"TaskAudioNormalizationDescription": "扫描文件以寻找音频标准化数据。",
"TaskDownloadMissingLyrics": "下载缺失的歌词",
"TaskDownloadMissingLyricsDescription": "下载歌曲歌词"
}

View File

@ -127,5 +127,7 @@
"TaskRefreshTrickplayImages": "生成快轉縮圖",
"TaskRefreshTrickplayImagesDescription": "為啟用快轉縮圖的媒體庫生成快轉縮圖。",
"TaskCleanCollectionsAndPlaylists": "清理系列和播放清單",
"TaskCleanCollectionsAndPlaylistsDescription": "清理系列和播放清單中已不存在的項目。"
"TaskCleanCollectionsAndPlaylistsDescription": "清理系列和播放清單中已不存在的項目。",
"TaskAudioNormalization": "音量標準化",
"TaskAudioNormalizationDescription": "掃描文件以找出音量標準化資料。"
}

View File

@ -321,7 +321,11 @@ namespace Emby.Server.Implementations.Localization
// Try splitting by : to handle "Germany: FSK-18"
if (rating.Contains(':', StringComparison.OrdinalIgnoreCase))
{
return GetRatingLevel(rating.AsSpan().RightPart(':').ToString());
var ratingLevelRightPart = rating.AsSpan().RightPart(':');
if (ratingLevelRightPart.Length != 0)
{
return GetRatingLevel(ratingLevelRightPart.ToString());
}
}
// Handle prefix country code to handle "DE-18"
@ -332,8 +336,12 @@ namespace Emby.Server.Implementations.Localization
// Extract culture from country prefix
var culture = FindLanguageInfo(ratingSpan.LeftPart('-').ToString());
// Check rating system of culture
return GetRatingLevel(ratingSpan.RightPart('-').ToString(), culture?.TwoLetterISOLanguageName);
var ratingLevelRightPart = ratingSpan.RightPart('-');
if (ratingLevelRightPart.Length != 0)
{
// Check rating system of culture
return GetRatingLevel(ratingLevelRightPart.ToString(), culture?.TwoLetterISOLanguageName);
}
}
return null;

View File

@ -1,11 +1,11 @@
Exempt,0
G,0
7+,7
PG,15
M,15
MA,15
MA15+,15
MA 15+,15
PG,16
16+,16
R,18
R18+,18

1 Exempt 0
2 G 0
3 7+ 7
4 PG 15
5 M 15
6 MA 15
7 MA15+ 15
8 MA 15+ 15
PG 16
9 16+ 16
10 R 18
11 R18+ 18

View File

@ -170,8 +170,13 @@ namespace Emby.Server.Implementations.Playlists
private List<Playlist> GetUserPlaylists(Guid userId)
{
var user = _userManager.GetUserById(userId);
var playlistsFolder = GetPlaylistsFolder(userId);
if (playlistsFolder is null)
{
return [];
}
return GetPlaylistsFolder(userId).GetChildren(user, true).OfType<Playlist>().ToList();
return playlistsFolder.GetChildren(user, true).OfType<Playlist>().ToList();
}
private static string GetTargetPath(string path)
@ -184,11 +189,11 @@ namespace Emby.Server.Implementations.Playlists
return path;
}
private IReadOnlyList<BaseItem> GetPlaylistItems(IEnumerable<Guid> itemIds, MediaType playlistMediaType, User user, DtoOptions options)
private IReadOnlyList<BaseItem> GetPlaylistItems(IEnumerable<Guid> itemIds, User user, DtoOptions options)
{
var items = itemIds.Select(_libraryManager.GetItemById).Where(i => i is not null);
return Playlist.GetPlaylistItems(playlistMediaType, items, user, options);
return Playlist.GetPlaylistItems(items, user, options);
}
public Task AddItemToPlaylistAsync(Guid playlistId, IReadOnlyCollection<Guid> itemIds, Guid userId)
@ -208,7 +213,7 @@ namespace Emby.Server.Implementations.Playlists
?? throw new ArgumentException("No Playlist exists with Id " + playlistId);
// Retrieve all the items to be added to the playlist
var newItems = GetPlaylistItems(newItemIds, playlist.MediaType, user, options)
var newItems = GetPlaylistItems(newItemIds, user, options)
.Where(i => i.SupportsAddingToPlaylist);
// Filter out duplicate items, if necessary

View File

@ -1,8 +1,7 @@
#nullable disable
#pragma warning disable CS1591
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
@ -24,51 +23,15 @@ namespace Emby.Server.Implementations.ScheduledTasks
/// </summary>
public class ScheduledTaskWorker : IScheduledTaskWorker
{
/// <summary>
/// The options for the json Serializer.
/// </summary>
private readonly JsonSerializerOptions _jsonOptions = JsonDefaults.Options;
/// <summary>
/// Gets or sets the application paths.
/// </summary>
/// <value>The application paths.</value>
private readonly IApplicationPaths _applicationPaths;
/// <summary>
/// Gets or sets the logger.
/// </summary>
/// <value>The logger.</value>
private readonly ILogger _logger;
/// <summary>
/// Gets or sets the task manager.
/// </summary>
/// <value>The task manager.</value>
private readonly ITaskManager _taskManager;
/// <summary>
/// The _last execution result sync lock.
/// </summary>
private readonly object _lastExecutionResultSyncLock = new object();
private bool _readFromFile = false;
/// <summary>
/// The _last execution result.
/// </summary>
private readonly object _lastExecutionResultSyncLock = new();
private bool _readFromFile;
private TaskResult _lastExecutionResult;
private Task _currentTask;
/// <summary>
/// The _triggers.
/// </summary>
private Tuple<TaskTriggerInfo, ITaskTrigger>[] _triggers;
/// <summary>
/// The _id.
/// </summary>
private string _id;
/// <summary>
@ -104,18 +67,13 @@ namespace Emby.Server.Implementations.ScheduledTasks
InitTriggerEvents();
}
/// <inheritdoc />
public event EventHandler<GenericEventArgs<double>> TaskProgress;
/// <summary>
/// Gets the scheduled task.
/// </summary>
/// <value>The scheduled task.</value>
/// <inheritdoc />
public IScheduledTask ScheduledTask { get; private set; }
/// <summary>
/// Gets the last execution result.
/// </summary>
/// <value>The last execution result.</value>
/// <inheritdoc />
public TaskResult LastExecutionResult
{
get
@ -169,22 +127,13 @@ namespace Emby.Server.Implementations.ScheduledTasks
}
}
/// <summary>
/// Gets the name.
/// </summary>
/// <value>The name.</value>
/// <inheritdoc />
public string Name => ScheduledTask.Name;
/// <summary>
/// Gets the description.
/// </summary>
/// <value>The description.</value>
/// <inheritdoc />
public string Description => ScheduledTask.Description;
/// <summary>
/// Gets the category.
/// </summary>
/// <value>The category.</value>
/// <inheritdoc />
public string Category => ScheduledTask.Category;
/// <summary>
@ -199,10 +148,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
/// <value>The current execution start time.</value>
private DateTime CurrentExecutionStartTime { get; set; }
/// <summary>
/// Gets the state.
/// </summary>
/// <value>The state.</value>
/// <inheritdoc />
public TaskState State
{
get
@ -218,10 +164,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
}
}
/// <summary>
/// Gets the current progress.
/// </summary>
/// <value>The current progress.</value>
/// <inheritdoc />
public double? CurrentProgress { get; private set; }
/// <summary>
@ -247,12 +190,8 @@ namespace Emby.Server.Implementations.ScheduledTasks
}
}
/// <summary>
/// Gets or sets the triggers that define when the task will run.
/// </summary>
/// <value>The triggers.</value>
/// <exception cref="ArgumentNullException"><c>value</c> is <c>null</c>.</exception>
public TaskTriggerInfo[] Triggers
/// <inheritdoc />
public IReadOnlyList<TaskTriggerInfo> Triggers
{
get
{
@ -272,10 +211,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
}
}
/// <summary>
/// Gets the unique id.
/// </summary>
/// <value>The unique id.</value>
/// <inheritdoc />
public string Id
{
get
@ -290,6 +226,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
ReloadTriggerEvents(true);
}
/// <inheritdoc />
public void ReloadTriggerEvents()
{
ReloadTriggerEvents(false);
@ -529,14 +466,14 @@ namespace Emby.Server.Implementations.ScheduledTasks
}
catch
{
return new TaskTriggerInfo[]
{
new TaskTriggerInfo
return
[
new()
{
IntervalTicks = TimeSpan.FromDays(1).Ticks,
Type = TaskTriggerInfo.TriggerInterval
}
};
];
}
}
@ -589,9 +526,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
((TaskManager)_taskManager).OnTaskCompleted(this, result);
}
/// <summary>
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
/// </summary>
/// <inheritdoc />
public void Dispose()
{
Dispose(true);

View File

@ -1,5 +1,3 @@
#pragma warning disable CS1591
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
@ -41,21 +39,16 @@ namespace Emby.Server.Implementations.ScheduledTasks
ScheduledTasks = Array.Empty<IScheduledTaskWorker>();
}
/// <inheritdoc />
public event EventHandler<GenericEventArgs<IScheduledTaskWorker>>? TaskExecuting;
/// <inheritdoc />
public event EventHandler<TaskCompletionEventArgs>? TaskCompleted;
/// <summary>
/// Gets the list of Scheduled Tasks.
/// </summary>
/// <value>The scheduled tasks.</value>
public IScheduledTaskWorker[] ScheduledTasks { get; private set; }
/// <inheritdoc />
public IReadOnlyList<IScheduledTaskWorker> ScheduledTasks { get; private set; }
/// <summary>
/// Cancels if running and queue.
/// </summary>
/// <typeparam name="T">The task type.</typeparam>
/// <param name="options">Task options.</param>
/// <inheritdoc />
public void CancelIfRunningAndQueue<T>(TaskOptions options)
where T : IScheduledTask
{
@ -65,16 +58,14 @@ namespace Emby.Server.Implementations.ScheduledTasks
QueueScheduledTask<T>(options);
}
/// <inheritdoc />
public void CancelIfRunningAndQueue<T>()
where T : IScheduledTask
{
CancelIfRunningAndQueue<T>(new TaskOptions());
}
/// <summary>
/// Cancels if running.
/// </summary>
/// <typeparam name="T">The task type.</typeparam>
/// <inheritdoc />
public void CancelIfRunning<T>()
where T : IScheduledTask
{
@ -82,11 +73,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
((ScheduledTaskWorker)task).CancelIfRunning();
}
/// <summary>
/// Queues the scheduled task.
/// </summary>
/// <typeparam name="T">The task type.</typeparam>
/// <param name="options">Task options.</param>
/// <inheritdoc />
public void QueueScheduledTask<T>(TaskOptions options)
where T : IScheduledTask
{
@ -102,12 +89,14 @@ namespace Emby.Server.Implementations.ScheduledTasks
}
}
/// <inheritdoc />
public void QueueScheduledTask<T>()
where T : IScheduledTask
{
QueueScheduledTask<T>(new TaskOptions());
}
/// <inheritdoc />
public void QueueIfNotRunning<T>()
where T : IScheduledTask
{
@ -119,6 +108,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
}
}
/// <inheritdoc />
public void Execute<T>()
where T : IScheduledTask
{
@ -144,11 +134,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
}
}
/// <summary>
/// Queues the scheduled task.
/// </summary>
/// <param name="task">The task.</param>
/// <param name="options">The task options.</param>
/// <inheritdoc />
public void QueueScheduledTask(IScheduledTask task, TaskOptions options)
{
var scheduledTask = ScheduledTasks.FirstOrDefault(t => t.ScheduledTask.GetType() == task.GetType());
@ -186,10 +172,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
}
}
/// <summary>
/// Adds the tasks.
/// </summary>
/// <param name="tasks">The tasks.</param>
/// <inheritdoc />
public void AddTasks(IEnumerable<IScheduledTask> tasks)
{
var list = tasks.Select(t => new ScheduledTaskWorker(t, _applicationPaths, this, _logger));
@ -197,9 +180,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
ScheduledTasks = ScheduledTasks.Concat(list).ToArray();
}
/// <summary>
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
/// </summary>
/// <inheritdoc />
public void Dispose()
{
Dispose(true);
@ -218,11 +199,13 @@ namespace Emby.Server.Implementations.ScheduledTasks
}
}
/// <inheritdoc />
public void Cancel(IScheduledTaskWorker task)
{
((ScheduledTaskWorker)task).Cancel();
}
/// <inheritdoc />
public Task Execute(IScheduledTaskWorker task, TaskOptions options)
{
return ((ScheduledTaskWorker)task).Execute(options);

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