<feed xmlns='http://www.w3.org/2005/Atom'>
<title>jellyfin/MediaBrowser.MediaEncoding/Subtitles, branch v12.0-rc3</title>
<subtitle>Unnamed repository; edit this file 'description' to name the repository.
</subtitle>
<id>https://git.b0n.dev/jellyfin/atom?h=v12.0-rc3</id>
<link rel='self' href='https://git.b0n.dev/jellyfin/atom?h=v12.0-rc3'/>
<link rel='alternate' type='text/html' href='https://git.b0n.dev/jellyfin/'/>
<updated>2026-07-21T12:52:59Z</updated>
<entry>
<title>Fix subtitle encoding for local files (#17281)</title>
<updated>2026-07-21T12:52:59Z</updated>
<author>
<name>Tim Eisele</name>
<email>Tim_Eisele@web.de</email>
</author>
<published>2026-07-21T12:52:59Z</published>
<link rel='alternate' type='text/html' href='https://git.b0n.dev/jellyfin/commit/?id=ed61acc19a958ceaf8de6f6f0f481b2b5370463a'/>
<id>urn:sha1:ed61acc19a958ceaf8de6f6f0f481b2b5370463a</id>
<content type='text'>
* Fix subtitle encoding

* Add short-circuit

* Use IsTextFormat

* Update MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs

Co-authored-by: Bond-009 &lt;bond.009@outlook.com&gt;

---------

Co-authored-by: Bond-009 &lt;bond.009@outlook.com&gt;</content>
</entry>
<entry>
<title>Merge pull request #17342 from LTe/fix-subtitle-conversion-race</title>
<updated>2026-07-20T23:51:44Z</updated>
<author>
<name>Cody Robibero</name>
<email>cody@robibe.ro</email>
</author>
<published>2026-07-20T23:51:44Z</published>
<link rel='alternate' type='text/html' href='https://git.b0n.dev/jellyfin/commit/?id=f2b9c6896960e98ddbd88f2aabd1459315fec86c'/>
<id>urn:sha1:f2b9c6896960e98ddbd88f2aabd1459315fec86c</id>
<content type='text'>
Fix race condition in concurrent subtitle conversion</content>
</entry>
<entry>
<title>Prevent ffmpeg from hanging extracting subtitles (#17297)</title>
<updated>2026-07-17T21:23:57Z</updated>
<author>
<name>Marc Brooks</name>
<email>IDisposable@gmail.com</email>
</author>
<published>2026-07-17T21:23:57Z</published>
<link rel='alternate' type='text/html' href='https://git.b0n.dev/jellyfin/commit/?id=cab108a8395bca7afbc0f0b587b55c13d4bc0d2a'/>
<id>urn:sha1:cab108a8395bca7afbc0f0b587b55c13d4bc0d2a</id>
<content type='text'>
* Prevent ffmpeg from hanging extracting subtitles
Add `RunSubtitleExtractionProcess` to unify the external
_ffmpeg_ process handling and error management.
Add a `-nostdin` flag that prevents _ffmpeg_ from reading from
_stdin_ and blocking on an inherited stdin handle (e.g. when
Jellyfin runs as a service under NSSM), which otherwise hangs
subtitle extraction forever when _ffmpeg_ blocks on any
keyboard-interaction read until the timeout (30 minutes).
Close the redirected _stdin_ to ensure immediage EOF.
Drain the _stderr_ to a string and log it, to ensure we don't block
the _ffmpeg_ process on errors that exceed the pipe length.
Pass `-y` to _ffmpeg_ to ensure it overwrites any existing output file
without prompting for confirmation.

* Address review comments
Make sure we always drain stderr.
Make sure the timeout also honors the cancellationToken.
Make sure when we get cancelled we don't log it as a ffmpeg error.</content>
</entry>
<entry>
<title>Fix race condition in concurrent subtitle conversion</title>
<updated>2026-07-15T12:55:55Z</updated>
<author>
<name>Piotr Niełacny</name>
<email>piotr.nielacny@gmail.com</email>
</author>
<published>2026-07-15T12:55:55Z</published>
<link rel='alternate' type='text/html' href='https://git.b0n.dev/jellyfin/commit/?id=6e3c1874936b767754cd9267749f35b27f2ae65f'/>
<id>urn:sha1:6e3c1874936b767754cd9267749f35b27f2ae65f</id>
<content type='text'>
SubtitleEncoder.ConvertSubtitles parsed subtitles with libse's static
Subtitle.Parse, which iterates a statically cached list of shared
SubtitleFormat instances. Format parsers keep mutable per-parse state on
the instance, so concurrent subtitle requests corrupted each other's
output (cues mixed across streams and languages, truncated files) or
failed with NullReferenceException when format detection broke down and
Subtitle.Parse returned null.

Parse through the injected ISubtitleParser instead. SubtitleEditParser
instantiates a fresh format parser per call, so requests no longer share
state. Its Parse method now returns the libse Subtitle directly (the
SubtitleTrackInfo flattening was unused since the SubtitleEdit writer
rework) so the writers keep full fidelity such as ASS styling.
</content>
</entry>
<entry>
<title>Fix incorrect protocol used for subtitle charset detection</title>
<updated>2026-07-11T21:33:06Z</updated>
<author>
<name>theguymadmax</name>
<email>theguymadmax@proton.me</email>
</author>
<published>2026-07-11T21:33:06Z</published>
<link rel='alternate' type='text/html' href='https://git.b0n.dev/jellyfin/commit/?id=e2d9d592bcf8ee0d6391d093f8e5d428145e9b6b'/>
<id>urn:sha1:e2d9d592bcf8ee0d6391d093f8e5d428145e9b6b</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Merge remote-tracking branch 'upstream/master' into fix-external-sub-invalidation</title>
<updated>2026-06-05T21:41:05Z</updated>
<author>
<name>Shadowghost</name>
<email>Ghost_of_Stone@web.de</email>
</author>
<published>2026-06-05T19:26:08Z</published>
<link rel='alternate' type='text/html' href='https://git.b0n.dev/jellyfin/commit/?id=a96824f25759a21635157e6a97f364161fadcefa'/>
<id>urn:sha1:a96824f25759a21635157e6a97f364161fadcefa</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Fix subtitle replacement not invalidating cache</title>
<updated>2026-06-05T12:14:27Z</updated>
<author>
<name>Shadowghost</name>
<email>Ghost_of_Stone@web.de</email>
</author>
<published>2026-05-28T17:55:15Z</published>
<link rel='alternate' type='text/html' href='https://git.b0n.dev/jellyfin/commit/?id=efb0336369a2738825f0f0940c3d969c94a81d4e'/>
<id>urn:sha1:efb0336369a2738825f0f0940c3d969c94a81d4e</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Prefer subtitle extension over codec</title>
<updated>2026-06-01T18:57:59Z</updated>
<author>
<name>Bond_009</name>
<email>bond.009@outlook.com</email>
</author>
<published>2026-06-01T18:57:59Z</published>
<link rel='alternate' type='text/html' href='https://git.b0n.dev/jellyfin/commit/?id=d69de6ccc4cc1e3f6309364ea65efd92e8f91bf0'/>
<id>urn:sha1:d69de6ccc4cc1e3f6309364ea65efd92e8f91bf0</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Write subtitles using SubtitleEdit (#16805)</title>
<updated>2026-06-01T17:43:57Z</updated>
<author>
<name>Bond-009</name>
<email>bond.009@outlook.com</email>
</author>
<published>2026-06-01T17:43:57Z</published>
<link rel='alternate' type='text/html' href='https://git.b0n.dev/jellyfin/commit/?id=54463929d0d63ec42a1246565ddbe896a1393e55'/>
<id>urn:sha1:54463929d0d63ec42a1246565ddbe896a1393e55</id>
<content type='text'>
* Write subtitles using SubtitleEdit

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

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

* Clean up ConvertSubtitles

* Add JsonWriter back</content>
</entry>
<entry>
<title>Add support for VobSub subtitle streams (#16552)</title>
<updated>2026-05-31T15:18:25Z</updated>
<author>
<name>Neptune</name>
<email>al@altqx.com</email>
</author>
<published>2026-05-31T15:18:25Z</published>
<link rel='alternate' type='text/html' href='https://git.b0n.dev/jellyfin/commit/?id=6f0ff89bdcc1961ec630f43f012528ab79022a9f'/>
<id>urn:sha1:6f0ff89bdcc1961ec630f43f012528ab79022a9f</id>
<content type='text'>
* Add support for VobSub subtitle streams

* update logic to determine separate extraction for VobSub subtitles

* simplify VobSub extraction logic and fix ffmpeg command

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

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

* remove redundant VobSub format check

* fix type errors</content>
</entry>
</feed>
