+ {item.resolved_path &&
Binary: {item.resolved_path}
}
+ {item.expected_sidecar &&
Expected: {item.expected_sidecar}
}
+ {item.error &&
Error: {item.error}
}
+ {item.remediation_hint &&
Tip: {item.remediation_hint}
}
+ {item.stderr_tail &&
stderr
{item.stderr_tail}}
+ {item.daemon_alive != null &&
Daemon process alive: {String(item.daemon_alive)}
}
+ {item.rpc_ready != null &&
RPC ready: {String(item.rpc_ready)}
}
+ {item.rpc_port != null &&
RPC port: {item.rpc_port}
}
+ {item.last_stderr_tail &&
daemon stderr
{item.last_stderr_tail}}
+ {item.expects_internal_dir != null &&
Expects _internal layout: {String(item.expects_internal_dir)}
}
+ {item.has_internal_dir != null &&
_internal directory found: {String(item.has_internal_dir)}
}
+ {item.has_python_framework != null &&
Python runtime found: {String(item.has_python_framework)}
}
+
+ )}
+ >
+ );
+ };
+
const handleCheckForUpdates = async () => {
if (isCheckingForUpdates) return;
@@ -741,64 +770,69 @@ export default function SettingsView() {
Media Downloader & Engines
-
-
-
- Core Downloader (Aria2)
-
-
- Version:
- {aria2Version}
-
-
- Status:
- {getEngineStatus(aria2Version)}
-
-
+ {(() => {
+ const a2 = findEngine('aria2'); const yt = findEngine('ytdlp');
+ const ff = findEngine('ffmpeg'); const dn = findEngine('deno');
+ return (
+
+ {/* aria2 card */}
+
+
+ Core Downloader (Aria2)
+
+
+ Version:
+ {renderEngineVersion(a2)}
+
+
+ Status:
+ {renderEngineStatus(a2)}
+
+ {renderEngineDetails(a2)}
+
-
-
- Media Extractors
-
-
-
- yt-dlp:
- {ytdlpVersion}
- {getEngineStatus(ytdlpVersion)}
-
-
-
- FFmpeg:
- {ffmpegVersion}
- {getEngineStatus(ffmpegVersion)}
-
-
-
- Deno:
- {denoVersion}
- {getEngineStatus(denoVersion)}
-
+ {/* yt-dlp / ffmpeg / deno card */}
+
+
+ Media Extractors
+
+ {[
+ { key: 'ytdlp', item: yt, label: 'yt-dlp' },
+ { key: 'ffmpeg', item: ff, label: 'FFmpeg' },
+ { key: 'deno', item: dn, label: 'Deno' },
+ ].map(({ key, item, label }) => (
+
+
+ {label}:
+ {renderEngineVersion(item)}
+ {renderEngineStatus(item)}
+
+ {renderEngineDetails(item)}
+
+ ))}
-
-
-
+
+
+
+
+
yt-dlp reads browser cookies to bypass video download limits or access restricted media. Firelink does not save browser cookies.
+
-
yt-dlp reads browser cookies to bypass video download limits or access restricted media. Firelink does not save browser cookies.
-
-
+ );
+ })()}
)}
diff --git a/src/ipc.ts b/src/ipc.ts
index a8ed78e..2ba5f6c 100644
--- a/src/ipc.ts
+++ b/src/ipc.ts
@@ -9,6 +9,7 @@ import type { ExtensionDownload } from './bindings/ExtensionDownload';
import type { MediaCookieSource } from './bindings/MediaCookieSource';
import type { MediaMetadata } from './bindings/MediaMetadata';
import type { MetadataResponse } from './bindings/MetadataResponse';
+import type { EngineStatusResult } from './bindings/EngineStatusResult';
import type { PostQueueAction } from './bindings/PostQueueAction';
import type { ReleaseCheckOutcome } from './bindings/ReleaseCheckOutcome';
@@ -55,10 +56,7 @@ type CommandMap = {
args: { url: string; cookieBrowser: string | null; username: string | null; password: string | null };
result: MediaMetadata;
};
- test_ytdlp: { args: undefined; result: string };
- test_aria2c: { args: undefined; result: string };
- test_ffmpeg: { args: undefined; result: string };
- test_deno: { args: undefined; result: string };
+ get_engine_status: { args: undefined; result: EngineStatusResult };
open_file: { args: { path: string }; result: void };
show_in_folder: { args: { path: string }; result: void };
reveal_in_file_manager: { args: { path: string }; result: void };