diff --git a/src/frontend/src/components/FormatProfileForm.tsx b/src/frontend/src/components/FormatProfileForm.tsx index 2333669..45cdd83 100644 --- a/src/frontend/src/components/FormatProfileForm.tsx +++ b/src/frontend/src/components/FormatProfileForm.tsx @@ -9,6 +9,17 @@ const CODEC_OPTIONS = ['Any', 'AAC', 'MP3', 'OPUS', 'FLAC'] as const; const BITRATE_OPTIONS = ['Any', 'Best', '320k', '256k', '192k', '128k'] as const; const CONTAINER_OPTIONS = ['Any', 'MP4', 'MKV', 'WEBM', 'MP3'] as const; +const SPONSORBLOCK_CATEGORIES = [ + { value: 'sponsor', label: 'Sponsor' }, + { value: 'selfpromo', label: 'Self-Promotion' }, + { value: 'interaction', label: 'Interaction' }, + { value: 'intro', label: 'Intro' }, + { value: 'outro', label: 'Outro' }, + { value: 'preview', label: 'Preview' }, + { value: 'music_offtopic', label: 'Music (Off-Topic)' }, + { value: 'filler', label: 'Filler' }, +] as const; + // ── Types ── export interface FormatProfileFormValues { @@ -98,7 +109,11 @@ export function FormatProfileForm({ const [embedSubtitles, setEmbedSubtitles] = useState(profile?.embedSubtitles ?? false); const [embedChapters, setEmbedChapters] = useState(profile?.embedChapters ?? false); const [embedThumbnail, setEmbedThumbnail] = useState(profile?.embedThumbnail ?? false); - const [sponsorBlockRemove, setSponsorBlockRemove] = useState(profile?.sponsorBlockRemove ?? ''); + const [sponsorBlockCategories, setSponsorBlockCategories] = useState>(() => { + const raw = profile?.sponsorBlockRemove ?? ''; + if (!raw.trim()) return new Set(); + return new Set(raw.split(',').map((s) => s.trim()).filter(Boolean)); + }); const [outputTemplate, setOutputTemplate] = useState(profile?.outputTemplate ?? ''); const TEMPLATE_VARIABLES = ['platform', 'channel', 'title', 'date', 'year', 'month', 'contentType', 'id', 'ext'] as const; @@ -147,11 +162,11 @@ export function FormatProfileForm({ embedSubtitles, embedChapters, embedThumbnail, - sponsorBlockRemove: sponsorBlockRemove.trim() || null, + sponsorBlockRemove: sponsorBlockCategories.size > 0 ? [...sponsorBlockCategories].join(',') : null, outputTemplate: outputTemplate.trim() || null, }); }, - [name, videoResolution, audioCodec, audioBitrate, containerFormat, isDefault, subtitleLanguages, embedSubtitles, embedChapters, embedThumbnail, sponsorBlockRemove, outputTemplate, onSubmit], + [name, videoResolution, audioCodec, audioBitrate, containerFormat, isDefault, subtitleLanguages, embedSubtitles, embedChapters, embedThumbnail, sponsorBlockCategories, outputTemplate, onSubmit], ); return ( @@ -328,21 +343,58 @@ export function FormatProfileForm({ - {/* SponsorBlock Remove */} + {/* SponsorBlock Remove — checkbox group */}
-