Commit Graph

269 Commits

Author SHA1 Message Date
unkin-agent baa16b6586 fix: make transcode leases ownership-checked and cleanup-aware
Cleanup never matched a live session because the controller registered empty
manifest and segment paths, renewal was a read-modify-write that could revert a
takeover, and the takeover script compared an ISO date to a number, so it errored.

- populate the session record's manifest and segment paths from the playlist path
- renew the lease via a Lua compare-and-set on the owning pod
- store the lease expiry as unix milliseconds so the scripts can compare it
- retain the session record past its lease so an orphan can still be taken over
- test the Redis store against a real Redis, including the renew-vs-takeover race
- drop the live stream record nothing ever read back
2026-09-12 10:19:29 +10:00
unkin-agent 6ccabd4c72 feat(hls): register transcode sessions and renew their lease
A transcode that is not in the store is invisible to the other replicas, so the
HLS entry points have to publish and hold the lease themselves.

- register the play session in the store when ffmpeg starts
- renew the lease on a background loop and delete the session when it ends
- shorten segments and bound the playlist window when resuming a stored session
- add RecoverySegmentLengthSeconds and RecoverySegmentBufferCount encoding options
2026-09-11 23:56:35 +10:00
gnattu e2586eed9b Fix concurrent ffmpeg segment racing
This is a nasty one. The failure mode is:

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

To fix this:

we lock transcoding job state changes and segment handling per playlist, and use a thread safe counter to track how many http responses are still using each job’s segments. A job is only stopped or replaced once that counter reaches zero.
2026-08-05 00:33:42 +08:00
Cody Robibero f865910a90 Merge pull request #17298 from WizardOfYendor1/fix/livetv-published-stream-urls
Fix Live TV returning unreachable "server-local" streaming URLs to clients.
2026-08-02 14:23:49 -04:00
Cody Robibero 635fd0433d Merge pull request #17370 from zerafachris/fix/item-update-null-optional-fields
fix: don't throw ArgumentNullException on partial UpdateItem payloads (#17366)
2026-07-21 18:17:22 -04:00
Cody Robibero 370170bab0 Merge pull request #17369 from Shadowghost/harden-startup-wizard
Prevent unauthenticated re-run of the startup wizard on misconfiguration
2026-07-21 18:17:08 -04:00
zerafachris 53e58d8b1b Make ItemUpdateController.UpdateItem internal instead of reflection
Addresses review feedback from @Bond-009 on PR #17370: the test helper
InvokeUpdateItem was invoking the private UpdateItem(BaseItemDto, BaseItem)
method via reflection. Jellyfin.Api.csproj already grants
InternalsVisibleTo("Jellyfin.Api.Tests"), so the method is changed to
internal and the test now calls it directly, removing the
GetMethod/Invoke boilerplate.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-21 08:51:30 +02:00
WizardOfYendor1 97e666c566 Append base URL if the published server URL override omits it. Fleshed out unit tests to cover that and https->http reverse proxy scenario(s). 2026-07-17 14:59:46 -04:00
zerafachris 5cd3d7ebb7 fix: don't throw ArgumentNullException on partial UpdateItem payloads (#17366)
BaseItemDto.Genres, .Tags, and .ProviderIds are plain auto-properties with
no default initializer, so they deserialize to null when a client omits
them from a partial POST /Items/{itemId} body. The OpenAPI spec documents
every BaseItemDto field as optional, but ItemUpdateController.UpdateItem
fed these three properties straight into Distinct()/Select()/ToList()
without a null check, so a request that (for example) only sets Tags
throws ArgumentNullException("source") once it reaches the unguarded
Genres line, before Tags is even processed.

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

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

Signed-off-by: zerafachris <christopher.zerafa@blocklabs.io>
2026-07-17 17:20:30 +02:00
Shadowghost 62a5ded920 Prevent unauthenticated re-run of the startup wizard on misconfiguration 2026-07-17 17:14:27 +02:00
WizardOfYendor1 a3ec1a3712 Add Live TV published URL regression coverage 2026-07-10 20:27:10 -04:00
WizardOfYendor1 6bbd6dcd44 Resolve Live TV client stream URLs per request 2026-07-10 20:26:29 -04:00
Marc Brooks 95cebffa87 Add tests
Also fixed a sibling directory that matches the prefix.
2026-06-28 16:26:35 -05:00
Shadowghost 6c931dcdda Keep the queried item's media source as the playback default 2026-06-07 23:06:48 +02:00
Shadowghost bd70e0ca34 Upgrade to xunit v3 2026-04-19 18:41:39 +02:00
Bond_009 9e480f6efb Update to .NET 10.0 2026-01-14 18:55:47 +01:00
JPVenson fe2596dc0e Add Full system backup feature (#13945) 2025-05-18 18:39:04 -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
JPVenson 42bdb22bfb Fixed namespaces 2025-03-25 16:45:00 +01:00
JPVenson 160020c551 WIP fixed namespaces 2025-03-25 15:30:22 +00:00
JPVenson d8030147ff Merge remote-tracking branch 'jellyfinorigin/master' into feature/DatabaseRefactor 2025-02-19 18:25:00 +00:00
Bond-009 2db0750abb Make the JsonConverters for delimited arrays more generic (#13396)
* Make the JsonConverters for delimited arrays more generic

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

* Ignore warnings
2025-02-13 20:24:55 -07:00
JPVenson dfdef511a5 Merge remote-tracking branch 'jellyfinorigin/master' into feature/pgsql_provider 2025-02-05 18:32:13 +00:00
Bond-009 00b66a06ea Enable nullable for AuthorizationInfo (#13485) 2025-02-04 17:10:39 -07:00
JPVenson aa811eb1e3 Prepared Seperation of Database components for future multi provider support 2025-01-26 20:45:28 +00: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
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
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
Cody Robibero 92eb9e3a94 Always grant access for Administrator role 2024-04-11 06:11:46 -06:00
beakerandjake d82d025b24 Add unit test for log file not found 2024-02-03 19:10:08 -07:00
Bond_009 7bf831da62 Fix tests 2023-12-18 22:02:31 +01:00
Bond_009 0fd36a5bf1 Fix warnings in test projects 2023-11-14 21:14:23 +01:00
Chris H 3fd505a454 Validate AuthenticationProviderId and PasswordResetProviderId (#10553) 2023-11-10 07:51:44 -07:00
Cody Robibero c7a94d48ae Convert ItemSortBy to enum (#9765)
* Convert ItemSortBy to enum

* Rename Unknown to Default
2023-11-09 14:00:13 -07:00
Bond-009 b16033df03 Fix fuzz projects (#10416) 2023-10-22 09:01:51 -06:00
Bond_009 084e0bf450 Fix error in test preventing Moq update (#10096) 2023-08-08 14:17:46 +02:00
Stepan Goremykin 26958162d0 Remove unused using directives 2023-04-06 19:17:28 +02:00
Cody Robibero 4873d2a54d Fix auth endpoints using api key (#9408) 2023-02-27 05:48:37 -07:00
Cody Robibero a527034ebe Validate requested user id (#8812) 2023-02-17 23:16:08 +01:00
Bond_009 60f41b80f6 Verify ContentType of uploaded images 2023-02-16 15:08:01 +01:00
cvium 52e2776d8e Merge branch 'master' into simplify_authz
# Conflicts:
#	Jellyfin.Api/Auth/SyncPlayAccessPolicy/SyncPlayAccessHandler.cs
2023-02-12 22:59:48 +01:00
Bond-009 6fb2fac6e4 Always run code analyzers for tests projects (#9304) 2023-02-12 10:54:55 -07:00
cvium 209edd38a4 refactor: simplify authz 2023-02-09 13:51:37 +01:00
Zoltan Csizmadia e0519189b2 Use Directory.Packages.props (#9135)
Co-authored-by: Zoltan Csizmadia <CsizmadiaZ@valassis.com>
2023-02-04 10:15:08 -07:00
renovate[bot] e408da4651 chore(deps): update dependency microsoft.codeanalysis.bannedapianalyzers to v3.3.4 (#9117)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-18 04:16:59 -07:00
Patrick Barron 663854bc1e Update test dependencies (#9094) 2023-01-14 13:15:36 -07:00
Bond_009 227aa0540b Update Microsoft.AspNetCore.Mvc.Testing to 7.0.0 2022-12-07 17:01:28 +01:00
Bond_009 fd9dc1e308 Update deps 2022-12-07 16:56:32 +01:00
Bond_009 236dd650d0 Update projects to .net7 2022-12-07 16:42:05 +01:00
Bond_009 52194f56b5 Replace != null with is not null 2022-12-05 15:01:13 +01:00