<feed xmlns='http://www.w3.org/2005/Atom'>
<title>jellyfin/tests/Jellyfin.Api.Tests/Controllers, branch master</title>
<subtitle>Unnamed repository; edit this file 'description' to name the repository.
</subtitle>
<id>https://git.lodewillems.com/jellyfin/atom?h=master</id>
<link rel='self' href='https://git.lodewillems.com/jellyfin/atom?h=master'/>
<link rel='alternate' type='text/html' href='https://git.lodewillems.com/jellyfin/'/>
<updated>2026-09-27T20:30:56Z</updated>
<entry>
<title>Backport pull request #18168 from jellyfin/release-12.z</title>
<updated>2026-09-27T20:30:56Z</updated>
<author>
<name>Shadowghost</name>
<email>Shadowghost@users.noreply.github.com</email>
</author>
<published>2026-09-27T20:30:56Z</published>
<link rel='alternate' type='text/html' href='https://git.lodewillems.com/jellyfin/commit/?id=8bce631afa58e553183435b9568e5bac293c1353'/>
<id>urn:sha1:8bce631afa58e553183435b9568e5bac293c1353</id>
<content type='text'>
Serve graphical subtitles as raw files with range support

Original-merge: 4acfd6eb2e19cb8d258b240b01c766229cb1314c

Merged-by: crobibero &lt;cody@robibe.ro&gt;

Backported-by: Cody Robibero &lt;cody@robibe.ro&gt;
</content>
</entry>
<entry>
<title>Fix concurrent ffmpeg segment racing</title>
<updated>2026-08-04T16:33:42Z</updated>
<author>
<name>gnattu</name>
<email>gnattuoc@me.com</email>
</author>
<published>2026-08-04T16:33:42Z</published>
<link rel='alternate' type='text/html' href='https://git.lodewillems.com/jellyfin/commit/?id=e2586eed9b04d501cd5805711cb6ad5553c1816b'/>
<id>urn:sha1:e2586eed9b04d501cd5805711cb6ad5553c1816b</id>
<content type='text'>
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.
</content>
</entry>
<entry>
<title>Merge pull request #17370 from zerafachris/fix/item-update-null-optional-fields</title>
<updated>2026-07-21T22:17:22Z</updated>
<author>
<name>Cody Robibero</name>
<email>cody@robibe.ro</email>
</author>
<published>2026-07-21T22:17:22Z</published>
<link rel='alternate' type='text/html' href='https://git.lodewillems.com/jellyfin/commit/?id=635fd0433d7eb3d6b145a2e41b17785a300eff05'/>
<id>urn:sha1:635fd0433d7eb3d6b145a2e41b17785a300eff05</id>
<content type='text'>
fix: don't throw ArgumentNullException on partial UpdateItem payloads (#17366)</content>
</entry>
<entry>
<title>Merge pull request #17369 from Shadowghost/harden-startup-wizard</title>
<updated>2026-07-21T22:17:08Z</updated>
<author>
<name>Cody Robibero</name>
<email>cody@robibe.ro</email>
</author>
<published>2026-07-21T22:17:08Z</published>
<link rel='alternate' type='text/html' href='https://git.lodewillems.com/jellyfin/commit/?id=370170bab0c74f85f0fd3164193aae06af4a71c1'/>
<id>urn:sha1:370170bab0c74f85f0fd3164193aae06af4a71c1</id>
<content type='text'>
Prevent unauthenticated re-run of the startup wizard on misconfiguration</content>
</entry>
<entry>
<title>Make ItemUpdateController.UpdateItem internal instead of reflection</title>
<updated>2026-07-21T06:51:30Z</updated>
<author>
<name>zerafachris</name>
<email>christopher.zerafa@blocklabs.io</email>
</author>
<published>2026-07-21T06:51:30Z</published>
<link rel='alternate' type='text/html' href='https://git.lodewillems.com/jellyfin/commit/?id=53e58d8b1b61c44405322bf91a8aa230f02b8323'/>
<id>urn:sha1:53e58d8b1b61c44405322bf91a8aa230f02b8323</id>
<content type='text'>
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 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>fix: don't throw ArgumentNullException on partial UpdateItem payloads (#17366)</title>
<updated>2026-07-17T15:20:30Z</updated>
<author>
<name>zerafachris</name>
<email>christopher.zerafa@blocklabs.io</email>
</author>
<published>2026-07-17T15:20:30Z</published>
<link rel='alternate' type='text/html' href='https://git.lodewillems.com/jellyfin/commit/?id=5cd3d7ebb7c8ce5b7cf68b0696543780215a6fff'/>
<id>urn:sha1:5cd3d7ebb7c8ce5b7cf68b0696543780215a6fff</id>
<content type='text'>
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 &lt;christopher.zerafa@blocklabs.io&gt;
</content>
</entry>
<entry>
<title>Prevent unauthenticated re-run of the startup wizard on misconfiguration</title>
<updated>2026-07-17T15:14:27Z</updated>
<author>
<name>Shadowghost</name>
<email>Ghost_of_Stone@web.de</email>
</author>
<published>2026-07-17T15:04:31Z</published>
<link rel='alternate' type='text/html' href='https://git.lodewillems.com/jellyfin/commit/?id=62a5ded9205b10ddaef60ce3e05bf80e79f4c742'/>
<id>urn:sha1:62a5ded9205b10ddaef60ce3e05bf80e79f4c742</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Add tests</title>
<updated>2026-06-28T21:26:35Z</updated>
<author>
<name>Marc Brooks</name>
<email>IDisposable@gmail.com</email>
</author>
<published>2026-06-28T21:26:35Z</published>
<link rel='alternate' type='text/html' href='https://git.lodewillems.com/jellyfin/commit/?id=95cebffa8782e8ce8dc48a15c9723ce9f33cb09c'/>
<id>urn:sha1:95cebffa8782e8ce8dc48a15c9723ce9f33cb09c</id>
<content type='text'>
Also fixed a sibling directory that matches the prefix.
</content>
</entry>
<entry>
<title>Upgrade to xunit v3</title>
<updated>2026-04-19T16:41:39Z</updated>
<author>
<name>Shadowghost</name>
<email>Ghost_of_Stone@web.de</email>
</author>
<published>2026-04-19T16:41:39Z</published>
<link rel='alternate' type='text/html' href='https://git.lodewillems.com/jellyfin/commit/?id=bd70e0ca343c334c03140e66f6c4b9df384187b7'/>
<id>urn:sha1:bd70e0ca343c334c03140e66f6c4b9df384187b7</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Add Full system backup feature (#13945)</title>
<updated>2025-05-19T00:39:04Z</updated>
<author>
<name>JPVenson</name>
<email>github@jpb.email</email>
</author>
<published>2025-05-19T00:39:04Z</published>
<link rel='alternate' type='text/html' href='https://git.lodewillems.com/jellyfin/commit/?id=fe2596dc0e389c0496a384cc1893fddd4742ed37'/>
<id>urn:sha1:fe2596dc0e389c0496a384cc1893fddd4742ed37</id>
<content type='text'>
</content>
</entry>
</feed>
