diff --git a/backend/appsettings/serializers.py b/backend/appsettings/serializers.py index 70564465..957bfe48 100644 --- a/backend/appsettings/serializers.py +++ b/backend/appsettings/serializers.py @@ -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( diff --git a/backend/appsettings/src/config.py b/backend/appsettings/src/config.py index 2fb9247a..f0d324de 100644 --- a/backend/appsettings/src/config.py +++ b/backend/appsettings/src/config.py @@ -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, diff --git a/backend/download/src/yt_dlp_handler.py b/backend/download/src/yt_dlp_handler.py index 2221390d..09848b5c 100644 --- a/backend/download/src/yt_dlp_handler.py +++ b/backend/download/src/yt_dlp_handler.py @@ -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: diff --git a/frontend/src/api/loader/loadAppsettingsConfig.ts b/frontend/src/api/loader/loadAppsettingsConfig.ts index 19091533..8b15da17 100644 --- a/frontend/src/api/loader/loadAppsettingsConfig.ts +++ b/frontend/src/api/loader/loadAppsettingsConfig.ts @@ -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; diff --git a/frontend/src/pages/SettingsApplication.tsx b/frontend/src/pages/SettingsApplication.tsx index 3ad87975..e97f55b4 100644 --- a/frontend/src/pages/SettingsApplication.tsx +++ b/frontend/src/pages/SettingsApplication.tsx @@ -57,6 +57,7 @@ const SettingsApplication = () => { const [downloadsFormatSort, setDownloadsFormatSort] = useState(null); const [downloadsExtractorLang, setDownloadsExtractorLang] = useState(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. +
  • + Embed subtitles adds the subtitles to the mp4 file. +
  • )} @@ -605,6 +610,16 @@ const SettingsApplication = () => { updateCallback={handleUpdateConfig} /> +
    +
    +

    Embed Subtitles

    +
    + +
    )} diff --git a/frontend/src/stores/AppSettingsStore.ts b/frontend/src/stores/AppSettingsStore.ts index 844285e5..84cfb730 100644 --- a/frontend/src/stores/AppSettingsStore.ts +++ b/frontend/src/stores/AppSettingsStore.ts @@ -23,6 +23,7 @@ export const useAppSettingsStore = create(set => ({ format: null, format_sort: null, add_metadata: false, + add_subtitles: false, add_thumbnail: false, subtitle: null, subtitle_source: null,