embed subtitles

This commit is contained in:
bmcdonough 2025-09-16 17:12:41 -04:00
parent f4c78e32f7
commit cf3b3891eb
6 changed files with 32 additions and 0 deletions

View File

@ -44,6 +44,7 @@ class AppConfigDownloadsSerializer(
format = serializers.CharField(allow_null=True)
format_sort = serializers.CharField(allow_null=True)
add_metadata = serializers.BooleanField()
add_subtitles = serializers.BooleanField()
add_thumbnail = serializers.BooleanField()
subtitle = serializers.CharField(allow_null=True)
subtitle_source = serializers.ChoiceField(

View File

@ -35,6 +35,7 @@ class DownloadsConfigType(TypedDict):
format: str | None
format_sort: str | None
add_metadata: bool
add_subtitles: bool
add_thumbnail: bool
subtitle: str | None
subtitle_source: Literal["user", "auto"] | None
@ -85,6 +86,7 @@ class AppConfig:
"format": None,
"format_sort": None,
"add_metadata": False,
"add_subtitles": False,
"add_thumbnail": False,
"subtitle": None,
"subtitle_source": None,

View File

@ -161,9 +161,11 @@ class VideoDownloader(DownloaderBase):
"progress_hooks": [self._progress_hook],
"noprogress": True,
"continuedl": True,
"writesubtitles": False,
"writethumbnail": False,
"noplaylist": True,
"color": "no_color",
"subtitleslangs": [],
}
def _build_obs_user(self):
@ -216,6 +218,16 @@ class VideoDownloader(DownloaderBase):
)
self.obs["writethumbnail"] = True
if self.config["downloads"]["add_subtitles"]:
postprocessors.append(
{
"key": "FFmpegEmbedSubtitle",
"already_have_subtitle": True,
}
)
self.obs["subtitleslangs"] = [self.config["downloads"]["subtitle"]]
self.obs["writesubtitles"] = True
self.obs["postprocessors"] = postprocessors
def _set_overwrites(self, obs: dict, channel_id: str) -> None:

View File

@ -16,6 +16,7 @@ export type AppSettingsConfigType = {
format: string | null;
format_sort: string | null;
add_metadata: boolean;
add_subtitles: boolean;
add_thumbnail: boolean;
subtitle: string | null;
subtitle_source: string | null;

View File

@ -57,6 +57,7 @@ const SettingsApplication = () => {
const [downloadsFormatSort, setDownloadsFormatSort] = useState<string | null>(null);
const [downloadsExtractorLang, setDownloadsExtractorLang] = useState<string | null>(null);
const [embedMetadata, setEmbedMetadata] = useState(false);
const [embedSubtitles, setEmbedSubtitles] = useState(false);
const [embedThumbnail, setEmbedThumbnail] = useState(false);
// Subtitles
@ -115,6 +116,7 @@ const SettingsApplication = () => {
setDownloadsFormatSort(appSettingsConfigData?.downloads.format_sort || null);
setDownloadsExtractorLang(appSettingsConfigData?.downloads.extractor_lang || null);
setEmbedMetadata(appSettingsConfigData?.downloads.add_metadata || false);
setEmbedSubtitles(appSettingsConfigData?.downloads.add_subtitles || false);
setEmbedThumbnail(appSettingsConfigData?.downloads.add_thumbnail || false);
// Subtitles
@ -547,6 +549,9 @@ const SettingsApplication = () => {
Indexing subtitles add the fulltext to the ES index. Not recommended on low
end hardware.
</li>
<li>
Embed subtitles adds the subtitles to the mp4 file.
</li>
</ul>
</div>
)}
@ -605,6 +610,16 @@ const SettingsApplication = () => {
updateCallback={handleUpdateConfig}
/>
</div>
<div className="settings-box-wrapper">
<div>
<p>Embed Subtitles</p>
</div>
<ToggleConfig
name="downloads.add_subtitles"
value={embedSubtitles}
updateCallback={handleUpdateConfig}
/>
</div>
</>
)}
</div>

View File

@ -23,6 +23,7 @@ export const useAppSettingsStore = create<AppSettingsState>(set => ({
format: null,
format_sort: null,
add_metadata: false,
add_subtitles: false,
add_thumbnail: false,
subtitle: null,
subtitle_source: null,