Commit Graph

147 Commits

Author SHA1 Message Date
unkin-agent 3b60289502 fix(config): read an unusable encoding.xml EncoderPreset as the default
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful
An element the enum cannot parse throws, and the configuration manager
catches that and returns defaults, so one bad preset discarded every other
encoding setting.

- serialize EncoderPreset through a string surrogate in XML
- fall back to auto for an empty, unknown or out-of-range value
2026-09-12 16:26:01 +10:00
gnattu a1910a7b2e Enforce dolby vision transfer check
Dolby vision files having unexpected transfers now also marked as invalid, and it will now get its base video range from its base layer color transfer, as not all invalid dolby vision files are HDR now.
2026-09-06 02:53:52 +08:00
Shadowghost 8eb4964599 Never treat a manifest container as an audio codec or a direct play target 2026-09-02 09:29:48 +02:00
Shadowghost 42c70fba63 Additional fixes
Co-Authored-By: Cody Robibero <cody@robibe.ro>
2026-08-22 08:50:14 +02:00
Shadowghost 7b6ae06f3b Merge remote-tracking branch 'upstream/master' into safeguard-invalid-provider-ids 2026-08-10 23:03:52 +02:00
Shadowghost 8c4dfc0b71 Safeguard against invalid provider ids 2026-08-08 19:49:26 +02:00
vavallee e120b7f2dd Stop image endpoints from upscaling beyond the source resolution
ImageHelper.GetNewImageSize passed the caller-supplied width/height straight
through to SkiaEncoder.EncodeImage, which allocates an SKImageInfo of exactly
that size. Nothing bounded those values against the source image, so a request
like Items/<id>/Images/Primary?width=23100&height=23100 made the server allocate
and resample a 23100x23100 surface from, say, a 600x336 poster: the reporter
measured 100% of a core for 10-15 minutes and 6-12 GB resident per request.
The item images endpoints do not require authentication, so any caller who knows
an item id can trigger this, and varying the size by one pixel misses the cache
every time.

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

Fixes #17056.
2026-08-07 12:33:37 -03:00
altqx d4376e0539 Allow client-rendered graphical subtitles during remux 2026-08-01 22:49:34 +07:00
altqx 8622c3bfb7 Match VobSub MKS subtitle profiles by container 2026-07-03 09:30:22 +07:00
Shadowghost f9644f24d2 Fix tests 2026-06-15 11:42:48 +02:00
Piotr Niełacny 2a689f268b Embed external subtitles into MKV when transcoding
Allow external subtitle files (SRT, ASS, PGS, etc.) to be muxed into
MKV output containers when the device profile requests Embed delivery.

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

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

Fixes #16403
2026-05-19 13:03:07 +02:00
nyanmisaka 6d6dee9492 Add tests for videoRotation profile condition
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2026-05-09 15:20:29 +08:00
Bond-009 b1e2419c65 Merge pull request #16666 from Shadowghost/xunit3
Upgrade to xunit v3
2026-04-24 18:59:31 +02:00
Shadowghost bd70e0ca34 Upgrade to xunit v3 2026-04-19 18:41:39 +02:00
Bond-009 046023b9dd Merge pull request #16380 from LTe/fix-subtitle-extraction-setting
Respect EnableSubtitleExtraction setting in subtitle delivery
2026-04-11 11:37:17 +02:00
Piotr Niełacny 37983c943a Respect EnableSubtitleExtraction setting in subtitle delivery
Wire up EnableSubtitleExtraction config to MediaEncoder.CanExtractSubtitles
so the setting is actually respected. Gate subtitle extraction check behind
PlayMethod.Transcode since DirectPlay has no competing ffmpeg process.

Add parameterized tests for StreamBuilder.GetSubtitleProfile covering
text and graphical codecs, profile format matching, and extraction
setting behavior. Remove misplaced SubtitleEncoder extraction test.
2026-03-13 16:34:44 +01:00
redinsch 3b29375179 Use file-scoped namespace in EnumerableExtensionsTests 2026-03-08 12:02:08 +01:00
redinsch ebb6949ea7 Fix remote image language priority to prefer English over no-language
Previously, images with no language were ranked higher (score 3) than
English images (score 2), causing poorly rated languageless images to
be selected over well-rated English alternatives for posters and logos.

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

Add unit tests for OrderByLanguageDescending.

Fixes #13310
2026-03-08 11:29:54 +01:00
Cosmin Dumitru 37b50fe13c Fix malformed query string in StreamInfo.ToUrl() causing 500 error via proxies
StreamInfo.ToUrl() generated URLs like `/master.m3u8?&DeviceId=...` (note `?&`)
because `?` was appended to the path and all parameters started with `&`. When
the first optional parameter (DeviceProfileId) was null, the result was a
malformed query string.

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

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

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 21:08:35 +01:00
Bond-009 226da3b371 Fix zh-CN subtitle language display (#15947)
The DisplayTitle property was using .NET's CultureInfo.GetCultures(NeutralCultures)
to resolve language display names. Since zh-CN is a specific culture (not neutral),
it would fall back to the base 'zh' code, resulting in generic 'Chinese' instead
of 'Chinese (Simplified)'.

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

The same pattern is already used for other localized strings like LocalizedDefault
and LocalizedExternal.
2026-01-18 12:19:31 +01:00
Abitofevrything 8d052a6cb1 Merge pull request #15926 from abitofevrything/feat/accurate_hls_seeking
Refactor HLS transcode seeking
2026-01-18 12:17:06 +01:00
ZeusCraft10 9039077286 Fix zh-CN subtitle language display
The DisplayTitle property was using .NET's CultureInfo.GetCultures(NeutralCultures)
to resolve language display names. Since zh-CN is a specific culture (not neutral),
it would fall back to the base 'zh' code, resulting in generic 'Chinese' instead
of 'Chinese (Simplified)'.

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

The same pattern is already used for other localized strings like LocalizedDefault
and LocalizedExternal.
2026-01-05 06:22:44 -05:00
Dmitry Lyzo 940c4e8ba8 Add Dolby Vision tests for Tizen (#12670)
* Fix Tizen H264 profiles

* Add Dolby Vision tests for Tizen

* Allow Dolby Vision fallback layer on Tizen 3+
2025-03-31 17:45:14 -06:00
Bond-009 e9729a536f Use pattern matching for null checks (#13793)
Fix the few that slipped through
2025-03-31 17:38:25 -06:00
Tim Eisele 824bafc32d Fix StreamInfo.ToUrl (#13808) 2025-03-30 21:37:58 -06:00
Tim Eisele 9657708b38 Reduce allocations, simplifed code, faster implementation, included tests - StreamInfo.ToUrl (#9369)
* Rework PR 6168

* Fix test
2025-03-28 06:51:44 -06:00
Dmitry Lyzo cb931e0062 Add profile condition to limit the number of streams (#13583) 2025-03-28 06:51:22 -06:00
renovate[bot] fb5da641f4 Update dependency FsCheck.Xunit to v3 (#13333)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Cody Robibero <cody@robibe.ro>
2025-01-11 09:37:28 -07:00
Shadowghost 5a5da33f44 Apply review suggestions 2024-09-17 23:34:12 +02:00
Shadowghost 2351eeba56 Rework PR 6203 2024-09-17 20:35:23 +02:00
gnattu ffbfd46dea Move progressive tests to old place 2024-09-14 03:28:14 +08:00
gnattu 3d43b834de Remove redundant info 2024-09-14 01:34:06 +08:00
gnattu 118c583bff Add Dolby Vision testing
Signed-off-by: gnattu <gnattuoc@me.com>
2024-09-14 01:23:41 +08:00
gnattu b0e6c357f7 Restore progressive transcoding tests
Signed-off-by: gnattu <gnattuoc@me.com>
2024-09-13 23:26:48 +08:00
gnattu af92b4370f Fix safari test
Signed-off-by: gnattu <gnattuoc@me.com>
2024-09-13 23:19:35 +08:00
gnattu cefcbcb2ac Add mkv h264 ac3 tests
Signed-off-by: gnattu <gnattuoc@me.com>
2024-09-13 23:17:33 +08:00
gnattu edc15c8e92 Add broken fps mkv test
Signed-off-by: gnattu <gnattuoc@me.com>
2024-09-13 18:20:07 +08:00
gnattu 6395f4889d Update unit test for StreamBuilder to reflect current server and clients
Signed-off-by: gnattu <gnattuoc@me.com>
2024-09-13 15:44:03 +08:00
Dmitry Lyzo 3da081ba86 Add audio ranking for transcoding profiles (#12546) 2024-09-09 13:16:58 -06: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
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
Cody Robibero e731250342 Lowercase MediaStreamProtocol for backwards compatibility 2024-03-08 15:29:22 -07:00
Niels van Velzen 407cf5d0bf Add MediaStreamProtocol enum (#10153)
* Add MediaStreamProtocol enum

* Add default handling for enum during deserialization

---------

Co-authored-by: Cody Robibero <cody@robibe.ro>
2024-03-04 16:44:54 -07:00
Bond-009 3bd1a5c557 Merge pull request #11077 from crobibero/svg-to-image
Add support for converting from svg to other image types
2024-03-03 07:59:22 -05:00
Cody Robibero c5e723bccd Add support for converting from svg to other image types 2024-02-28 09:56:02 -07:00
Dmitry Lyzo e1ba9c0f42 test: drop default flag from second audio track
To test more general situation.
Add another HEVC test file with old logic.
2024-02-22 09:38:13 +03:00
Dmitry Lyzo 47b583456a test: collect candidate audio streams if no audio index is specified
To be consistent with the logic of StreamBuilder.
2024-02-22 09:37:59 +03:00
Robert Lützner 2bd85df383 Add missing MIME types for comicbook formats (#11010)
* Correct MIME types for comicbook file extensions

cb7, cba, cbr, cbt and cbz all refer to different types of digital
comicbooks. The last letter of the extension indicates the compression
algorithm that was used: 7zip, arc, rar, tar or zip.

All these filetypes used to have the `application/x-cbr` MIME type
assigned to them. However, that has since been deprecated and was
replaced with

- `application/vnd.comicbook-rar` for rar compressed files and
- `application/vnd.comicbook+zip` for rar compressed files.

Only these two are officially listed by IANA

https://www.iana.org/assignments/media-types/application/vnd.comicbook+zip

. cbr and cbz are by far the most common file extensions for comicbooks.

There's no official MIME type for cb7, cba or cbt files. However, with
rar being a proprietary compression algorithm, FOSS applications will
often refuse to handle files that identify themselves as
`application/x-cbr`, so I decided to assign extension specific MIME
types to them. I've seen these being used by other applications,
specifically comic book readers.

I've read through the docs on iana.org, but haven't figured out why they
chose `-rar`, but `+zip`.

* Add conversions from MIME type to file extensions for comicbook formats

cb7, cba, cbr, cbt and cbz all refer to different types of digital
comicbooks. The last letter of the extension indicates the compression
algorithm that was used: 7zip, arc, rar, tar or zip.

All these filetypes used to have the `application/x-cbr` MIME type
assigned to them. However, that has since been deprecated and was
replaced with

- `application/vnd.comicbook-rar` for rar compressed files and
- `application/vnd.comicbook+zip` for rar compressed files.

Only these two are officially listed by IANA

https://www.iana.org/assignments/media-types/application/vnd.comicbook+zip

. cbr and cbz are by far the most common file extensions for comicbooks.

There's no official MIME type for cb7, cba or cbt files. However, with
rar being a proprietary compression algorithm, FOSS applications will
often refuse to handle files that identify themselves as
`application/x-cbr`, so I decided to assign extension specific MIME
types to them. I've seen these being used by other applications,
specifically comic book readers.

* Update CONTRIBUTORS.md
2024-02-15 23:15:14 +01:00
Dmitry Lyzo 07b9c85f14 test: discard webm from test mkvs if there is an unsupported codec (#10999)
To comply 39088b5ad2, ba877283a1
2024-02-12 07:34:26 -07:00
felix920506 aaa9345a53 Correct m4b mimetype (#10980) 2024-02-10 21:39:30 -07:00