From fbadbb001eb57fefddbfddcbb5f62e0c66f7836d Mon Sep 17 00:00:00 2001 From: Subhamoy Biswas Date: Fri, 11 Jul 2025 13:20:59 +0530 Subject: [PATCH] (feat): added metadata and thumbnail embeding option in settings --- src/App.tsx | 16 +++++++++++++ src/pages/settings.tsx | 51 +++++++++++++++++++++++++++++++++++++----- src/services/store.ts | 6 +++++ src/types/settings.ts | 3 +++ 4 files changed, 70 insertions(+), 6 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index e10dc16..384e2f4 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -59,6 +59,9 @@ export default function App({ children }: { children: React.ReactNode }) { const PROXY_URL = useSettingsPageStatesStore(state => state.settings.proxy_url); const VIDEO_FORMAT = useSettingsPageStatesStore(state => state.settings.video_format); const AUDIO_FORMAT = useSettingsPageStatesStore(state => state.settings.audio_format); + const EMBED_VIDEO_METADATA = useSettingsPageStatesStore(state => state.settings.embed_video_metadata); + const EMBED_AUDIO_METADATA = useSettingsPageStatesStore(state => state.settings.embed_audio_metadata); + const EMBED_AUDIO_THUMBNAIL = useSettingsPageStatesStore(state => state.settings.embed_audio_thumbnail); const appWindow = getCurrentWebviewWindow() const navigate = useNavigate(); @@ -194,6 +197,19 @@ export default function App({ children }: { children: React.ReactNode }) { } } + if (fileType !== 'unknown' && (EMBED_VIDEO_METADATA || EMBED_AUDIO_METADATA)) { + if (EMBED_VIDEO_METADATA && (fileType === 'video+audio' || fileType === 'video')) { + args.push('--embed-metadata'); + } + if (EMBED_AUDIO_METADATA && fileType === 'audio') { + args.push('--embed-metadata'); + } + } + + if (EMBED_AUDIO_THUMBNAIL && fileType === 'audio') { + args.push('--embed-thumbnail'); + } + if (resumeState) { args.push('--continue'); } else { diff --git a/src/pages/settings.tsx b/src/pages/settings.tsx index 7b6cb61..c0473a9 100644 --- a/src/pages/settings.tsx +++ b/src/pages/settings.tsx @@ -7,7 +7,7 @@ import { Switch } from "@/components/ui/switch"; import { Label } from "@/components/ui/label"; import { Button } from "@/components/ui/button"; import { useToast } from "@/hooks/use-toast"; -import { ArrowDownToLine, ArrowRight, EthernetPort, ExternalLink, FileVideo, Folder, FolderOpen, Loader2, LucideIcon, Monitor, Moon, Radio, RotateCcw, RotateCw, Sun, Terminal, WandSparkles, Wifi, Wrench } from "lucide-react"; +import { ArrowDownToLine, ArrowRight, EthernetPort, ExternalLink, FileVideo, Folder, FolderOpen, Info, Loader2, LucideIcon, Monitor, Moon, Radio, RotateCcw, RotateCw, Sun, Terminal, WandSparkles, Wifi, Wrench } from "lucide-react"; import { cn } from "@/lib/utils"; import { useEffect } from "react"; import { useTheme } from "@/providers/themeProvider"; @@ -64,6 +64,9 @@ export default function SettingsPage() { const proxyUrl = useSettingsPageStatesStore(state => state.settings.proxy_url); const videoFormat = useSettingsPageStatesStore(state => state.settings.video_format); const audioFormat = useSettingsPageStatesStore(state => state.settings.audio_format); + const embedVideoMetadata = useSettingsPageStatesStore(state => state.settings.embed_video_metadata); + const embedAudioMetadata = useSettingsPageStatesStore(state => state.settings.embed_audio_metadata); + const embedAudioThumbnail = useSettingsPageStatesStore(state => state.settings.embed_audio_thumbnail); const websocketPort = useSettingsPageStatesStore(state => state.settings.websocket_port); const isChangingWebSocketPort = useSettingsPageStatesStore(state => state.isChangingWebSocketPort); const setIsChangingWebSocketPort = useSettingsPageStatesStore(state => state.setIsChangingWebSocketPort); @@ -302,6 +305,11 @@ export default function SettingsPage() { value="formats" className="data-[state=active]:bg-primary data-[state=active]:text-primary-foreground justify-start px-3 py-1.5 gap-2" > Formats + Metadata Network
- +

Max Parallel Downloads

Set maximum number of allowed parallel downloads

@@ -333,7 +341,7 @@ export default function SettingsPage() { />
- +

Theme

Choose app interface theme

@@ -356,7 +364,7 @@ export default function SettingsPage() {
- +

Download Folder

Set default download folder (directory)

@@ -389,7 +397,7 @@ export default function SettingsPage() {
- +

Video Format

Choose in which format the final video file will be saved

@@ -445,7 +453,38 @@ export default function SettingsPage() {
- + +
+

Embed Metadata

+

Wheather to embed metadata in video/audio files (info, chapters)

+
+ saveSettingsKey('embed_video_metadata', checked)} + /> + +
+
+ saveSettingsKey('embed_audio_metadata', checked)} + /> + +
+
+
+

Embed Thumbnail in Audio

+

Wheather to embed thumbnail in audio files (as cover art)

+ saveSettingsKey('embed_audio_thumbnail', checked)} + /> +
+
+

Proxy

Use proxy for downloads, Unblocks blocked sites in your region (Download speed may affect, Some sites may not work)

diff --git a/src/services/store.ts b/src/services/store.ts index 64cd6be..405ccaa 100644 --- a/src/services/store.ts +++ b/src/services/store.ts @@ -112,6 +112,9 @@ export const useSettingsPageStatesStore = create((set) proxy_url: '', video_format: 'auto', audio_format: 'auto', + embed_video_metadata: false, + embed_audio_metadata: true, + embed_audio_thumbnail: true, websocket_port: 53511 }, isUsingDefaultSettings: true, @@ -148,6 +151,9 @@ export const useSettingsPageStatesStore = create((set) proxy_url: '', video_format: 'auto', audio_format: 'auto', + embed_video_metadata: false, + embed_audio_metadata: true, + embed_audio_thumbnail: true, websocket_port: 53511 }, isUsingDefaultSettings: true diff --git a/src/types/settings.ts b/src/types/settings.ts index 3365ae8..6547ddc 100644 --- a/src/types/settings.ts +++ b/src/types/settings.ts @@ -14,6 +14,9 @@ export interface Settings { proxy_url: string; video_format: string; audio_format: string; + embed_video_metadata: boolean; + embed_audio_metadata: boolean; + embed_audio_thumbnail: boolean; // extension settings websocket_port: number; } \ No newline at end of file