mirror of
https://github.com/neosubhamoy/neodlp.git
synced 2026-03-22 18:15:50 +05:30
Compare commits
9 Commits
v0.4.2
...
180d295062
@@ -2,7 +2,7 @@
|
||||
Type=Application
|
||||
|
||||
Name=NeoDLP
|
||||
Comment=Modern video/audio downloader based on yt-dlp with browser integration.
|
||||
Comment=Modern feature-rich video/audio downloader based on yt-dlp.
|
||||
Icon=com.neosubhamoy.neodlp
|
||||
Exec=neodlp
|
||||
Terminal=false
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<component type="desktop-application">
|
||||
<id>com.neosubhamoy.neodlp</id>
|
||||
<name>NeoDLP</name>
|
||||
<summary>Modern video/audio downloader based on yt-dlp with browser integration</summary>
|
||||
<summary>Modern feature-rich video/audio downloader based on yt-dlp</summary>
|
||||
<developer id="com.neosubhamoy">
|
||||
<name>Subhamoy Biswas</name>
|
||||
</developer>
|
||||
@@ -15,7 +15,7 @@
|
||||
<p>
|
||||
NeoDLP is a cross-platform desktop application designed for downloading videos and audio from various online sources based on yt-dlp.
|
||||
|
||||
It offers modern user interface, lots of customization options and seamless browser integration.
|
||||
It offers modern user interface, lots of features and customization options.
|
||||
</p>
|
||||
</description>
|
||||
<launchable type="desktop-id">com.neosubhamoy.neodlp.desktop</launchable>
|
||||
@@ -39,8 +39,8 @@
|
||||
</screenshots>
|
||||
<content_rating type="oars-1.1" />
|
||||
<releases>
|
||||
<release version="0.4.2" date="2026-03-03">
|
||||
<url type="details">https://github.com/neosubhamoy/neodlp/releases/tag/v0.4.2</url>
|
||||
<release version="0.4.3" date="2026-03-05">
|
||||
<url type="details">https://github.com/neosubhamoy/neodlp/releases/tag/v0.4.3</url>
|
||||
</release>
|
||||
</releases>
|
||||
</component>
|
||||
|
||||
@@ -40,6 +40,11 @@
|
||||
"args": true,
|
||||
"sidecar": true
|
||||
},
|
||||
{
|
||||
"name": "yt-dlp",
|
||||
"cmd": "yt-dlp",
|
||||
"args": true
|
||||
},
|
||||
{
|
||||
"name": "ffmpeg",
|
||||
"cmd": "ffmpeg",
|
||||
@@ -105,6 +110,11 @@
|
||||
"args": true,
|
||||
"sidecar": true
|
||||
},
|
||||
{
|
||||
"name": "yt-dlp",
|
||||
"cmd": "yt-dlp",
|
||||
"args": true
|
||||
},
|
||||
{
|
||||
"name": "ffmpeg",
|
||||
"cmd": "ffmpeg",
|
||||
@@ -119,6 +129,21 @@
|
||||
"name": "deno",
|
||||
"cmd": "deno",
|
||||
"args": true
|
||||
},
|
||||
{
|
||||
"name": "pkexec",
|
||||
"cmd": "pkexec",
|
||||
"args": true
|
||||
},
|
||||
{
|
||||
"name": "powershell",
|
||||
"cmd": "powershell",
|
||||
"args": true
|
||||
},
|
||||
{
|
||||
"name": "sh",
|
||||
"cmd": "sh",
|
||||
"args": true
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"identifier": "com.neosubhamoy.neodlp",
|
||||
"build": {
|
||||
"beforeDevCommand": "cargo build --manifest-path=./src-tauri/msghost/Cargo.toml && npm run dev",
|
||||
"beforeBuildCommand": "cargo build --release --manifest-path=./src-tauri/msghost/Cargo.toml && npm run build",
|
||||
"beforeDevCommand": "npm run dev",
|
||||
"beforeBuildCommand": "npm run build",
|
||||
"devUrl": "http://localhost:1420",
|
||||
"frontendDist": "../dist"
|
||||
},
|
||||
@@ -37,12 +37,7 @@
|
||||
"icons/icon.ico"
|
||||
],
|
||||
"externalBin": [
|
||||
"binaries/yt-dlp",
|
||||
"binaries/ffmpeg",
|
||||
"binaries/ffprobe",
|
||||
"binaries/aria2c",
|
||||
"binaries/deno",
|
||||
"binaries/neodlp-pot"
|
||||
"binaries/deno"
|
||||
],
|
||||
"resources": {
|
||||
"resources/plugins/yt-dlp-plugins/": "yt-dlp-plugins/"
|
||||
|
||||
@@ -257,7 +257,10 @@ export default function App({ children }: { children: React.ReactNode }) {
|
||||
const fetchYtDlpVersion = async () => {
|
||||
setIsFetchingYtDlpVersion(true);
|
||||
try {
|
||||
const command = Command.sidecar('binaries/yt-dlp', ['--version']);
|
||||
const isFlatpak = await invoke<boolean>('is_flatpak');
|
||||
const command = isFlatpak
|
||||
? Command.create('sh', ['-c', `yt-dlp --version`])
|
||||
: Command.sidecar('binaries/yt-dlp', ['--version']);
|
||||
const output = await command.execute();
|
||||
if (output.code === 0) {
|
||||
const version = output.stdout.trim();
|
||||
|
||||
@@ -1403,6 +1403,8 @@ function AppPoTokenSettings() {
|
||||
function AppNotificationSettings() {
|
||||
const { saveSettingsKey } = useSettings();
|
||||
|
||||
const isFlatpak = useEnvironmentStore(state => state.isFlatpak);
|
||||
|
||||
const enableNotifications = useSettingsPageStatesStore(state => state.settings.enable_notifications);
|
||||
const updateNotification = useSettingsPageStatesStore(state => state.settings.update_notification);
|
||||
const downloadCompletionNotification = useSettingsPageStatesStore(state => state.settings.download_completion_notification);
|
||||
@@ -1416,6 +1418,7 @@ function AppNotificationSettings() {
|
||||
<Switch
|
||||
id="enable-notifications"
|
||||
checked={enableNotifications}
|
||||
disabled={isFlatpak}
|
||||
onCheckedChange={async (checked) => {
|
||||
if (checked) {
|
||||
const granted = await isPermissionGranted();
|
||||
@@ -1441,7 +1444,7 @@ function AppNotificationSettings() {
|
||||
id="update-notification"
|
||||
checked={updateNotification}
|
||||
onCheckedChange={(checked) => saveSettingsKey('update_notification', checked)}
|
||||
disabled={!enableNotifications}
|
||||
disabled={!enableNotifications || isFlatpak}
|
||||
/>
|
||||
<Label htmlFor="update-notification">App Updates</Label>
|
||||
</div>
|
||||
@@ -1450,7 +1453,7 @@ function AppNotificationSettings() {
|
||||
id="download-completion-notification"
|
||||
checked={downloadCompletionNotification}
|
||||
onCheckedChange={(checked) => saveSettingsKey('download_completion_notification', checked)}
|
||||
disabled={!enableNotifications}
|
||||
disabled={!enableNotifications || isFlatpak}
|
||||
/>
|
||||
<Label htmlFor="download-completion-notification">Download Completion</Label>
|
||||
</div>
|
||||
@@ -1813,7 +1816,7 @@ function AppInfoSettings() {
|
||||
<TriangleAlert className="size-4 stroke-primary" />
|
||||
<AlertTitle className="text-sm">Flatpak Sandbox Detected!</AlertTitle>
|
||||
<AlertDescription className="text-xs">
|
||||
It looks like you are running NeoDLP in a Flatpak sandbox. Some features like changing download folder, revealing completed downloads in explorer and automatic yt-dlp updates are not available in Flatpak due to sandbox restrictions. To use these features, please install the native build (DEB, RPM or AUR) of NeoDLP.
|
||||
It looks like you are running NeoDLP in a Flatpak sandbox. Some features like browser integration, desktop notifications, changing download folder, revealing completed downloads in explorer, automatic yt-dlp updates and auto-launch on startup are not available in Flatpak due to sandbox restrictions. To use these features, please install the native linux build (DEB, RPM or AUR) of NeoDLP.
|
||||
</AlertDescription>
|
||||
</Alert>
|
||||
) : isAppimage ? (
|
||||
@@ -1821,7 +1824,7 @@ function AppInfoSettings() {
|
||||
<TriangleAlert className="size-4 stroke-primary" />
|
||||
<AlertTitle className="text-sm">Appimage Environment Detected!</AlertTitle>
|
||||
<AlertDescription className="text-xs">
|
||||
Looks like you are using NeoDLP Appimage. NeoDLP's browser integration features are not available on Appimage environment due to it's limitations. To use NeoDLP's browser integration features please install the native build (DEB, RPM or AUR) of NeoDLP.
|
||||
Looks like you are using NeoDLP Appimage. NeoDLP's browser integration features are not available on Appimage environment due to it's limitations. To use NeoDLP's browser integration features please install the native linux build (DEB, RPM or AUR) of NeoDLP.
|
||||
</AlertDescription>
|
||||
</Alert>
|
||||
) : (
|
||||
|
||||
@@ -196,7 +196,10 @@ export default function useDownloader() {
|
||||
}
|
||||
}
|
||||
|
||||
const command = Command.sidecar('binaries/yt-dlp', args);
|
||||
const isFlatpak = await invoke<boolean>('is_flatpak');
|
||||
const command = isFlatpak
|
||||
? Command.create('sh', ['-c', `yt-dlp ${args.map(arg => `'${arg.replace(/'/g, "'\\''")}'`).join(' ')}`])
|
||||
: Command.sidecar('binaries/yt-dlp', args);
|
||||
|
||||
let jsonOutput = '';
|
||||
|
||||
@@ -557,7 +560,10 @@ export default function useDownloader() {
|
||||
}
|
||||
|
||||
console.log('Starting download with args:', args);
|
||||
const command = Command.sidecar('binaries/yt-dlp', args);
|
||||
const isFlatpak = await invoke<boolean>('is_flatpak');
|
||||
const command = isFlatpak
|
||||
? Command.create('sh', ['-c', `yt-dlp ${args.map(arg => `'${arg.replace(/'/g, "'\\''")}'`).join(' ')}`])
|
||||
: Command.sidecar('binaries/yt-dlp', args);
|
||||
|
||||
command.on('close', async (data) => {
|
||||
if (data.code !== 0) {
|
||||
|
||||
@@ -21,20 +21,20 @@ export function useLinuxRegisterer() {
|
||||
const isFlatpak = await invoke<boolean>('is_flatpak');
|
||||
const resourceDirPath = isFlatpak ? '/app/lib/neodlp' : await resourceDir();
|
||||
const homeDirPath = await homeDir();
|
||||
const flatpakChromeManifestContent = {
|
||||
name: "com.neosubhamoy.neodlp",
|
||||
description: "NeoDLP MsgHost",
|
||||
path: `${homeDirPath}/.local/bin/neodlp-msghost`,
|
||||
type: "stdio",
|
||||
allowed_origins: ["chrome-extension://mehopeailfjmiloiiohgicphlcgpompf/"]
|
||||
};
|
||||
const flatpakFirefoxManifestContent = {
|
||||
name: "com.neosubhamoy.neodlp",
|
||||
description: "NeoDLP MsgHost",
|
||||
path: `${homeDirPath}/.local/bin/neodlp-msghost`,
|
||||
type: "stdio",
|
||||
allowed_extensions: ["neodlp@neosubhamoy.com"]
|
||||
};
|
||||
// const flatpakChromeManifestContent = {
|
||||
// name: "com.neosubhamoy.neodlp",
|
||||
// description: "NeoDLP MsgHost",
|
||||
// path: `${homeDirPath}/.local/bin/neodlp-msghost`,
|
||||
// type: "stdio",
|
||||
// allowed_origins: ["chrome-extension://mehopeailfjmiloiiohgicphlcgpompf/"]
|
||||
// };
|
||||
// const flatpakFirefoxManifestContent = {
|
||||
// name: "com.neosubhamoy.neodlp",
|
||||
// description: "NeoDLP MsgHost",
|
||||
// path: `${homeDirPath}/.local/bin/neodlp-msghost`,
|
||||
// type: "stdio",
|
||||
// allowed_extensions: ["neodlp@neosubhamoy.com"]
|
||||
// };
|
||||
|
||||
const filesToCopy: FileMap[] = [
|
||||
{ source: 'yt-dlp-plugins/bgutil-ytdlp-pot-provider/yt_dlp_plugins/extractor/getpot_bgutil.py', destination: 'yt-dlp-plugins/bgutil-ytdlp-pot-provider/yt_dlp_plugins/extractor/getpot_bgutil.py', dir: 'yt-dlp-plugins/bgutil-ytdlp-pot-provider/yt_dlp_plugins/extractor/' },
|
||||
@@ -43,18 +43,22 @@ export function useLinuxRegisterer() {
|
||||
];
|
||||
|
||||
const filesToCopyFlatpak: FileMap[] = [
|
||||
{ source: 'chrome.json', destination: '.config/google-chrome/NativeMessagingHosts/com.neosubhamoy.neodlp.json', dir: '.config/google-chrome/NativeMessagingHosts/', content: JSON.stringify(flatpakChromeManifestContent) },
|
||||
{ source: 'chrome.json', destination: '.config/chromium/NativeMessagingHosts/com.neosubhamoy.neodlp.json', dir: '.config/chromium/NativeMessagingHosts/', content: JSON.stringify(flatpakChromeManifestContent) },
|
||||
{ source: 'firefox.json', destination: '.mozilla/native-messaging-hosts/com.neosubhamoy.neodlp.json', dir: '.mozilla/native-messaging-hosts/', content: JSON.stringify(flatpakFirefoxManifestContent) },
|
||||
{ source: 'neodlp-msghost', destination: '.local/bin/neodlp-msghost', dir: '.local/bin/' },
|
||||
// { source: 'chrome.json', destination: '.config/google-chrome/NativeMessagingHosts/com.neosubhamoy.neodlp.json', dir: '.config/google-chrome/NativeMessagingHosts/', content: JSON.stringify(flatpakChromeManifestContent) },
|
||||
// { source: 'chrome.json', destination: '.config/chromium/NativeMessagingHosts/com.neosubhamoy.neodlp.json', dir: '.config/chromium/NativeMessagingHosts/', content: JSON.stringify(flatpakChromeManifestContent) },
|
||||
// { source: 'firefox.json', destination: '.mozilla/native-messaging-hosts/com.neosubhamoy.neodlp.json', dir: '.mozilla/native-messaging-hosts/', content: JSON.stringify(flatpakFirefoxManifestContent) },
|
||||
// { source: 'neodlp-msghost', destination: '.local/bin/neodlp-msghost', dir: '.local/bin/' },
|
||||
{ source: 'yt-dlp-plugins/bgutil-ytdlp-pot-provider/yt_dlp_plugins/extractor/getpot_bgutil.py', destination: '.var/app/com.neosubhamoy.neodlp/config/yt-dlp-plugins/bgutil-ytdlp-pot-provider/yt_dlp_plugins/extractor/getpot_bgutil.py', dir: '.var/app/com.neosubhamoy.neodlp/config/yt-dlp-plugins/bgutil-ytdlp-pot-provider/yt_dlp_plugins/extractor/' },
|
||||
{ source: 'yt-dlp-plugins/bgutil-ytdlp-pot-provider/yt_dlp_plugins/extractor/getpot_bgutil_cli.py', destination: '.var/app/com.neosubhamoy.neodlp/config/yt-dlp-plugins/bgutil-ytdlp-pot-provider/yt_dlp_plugins/extractor/getpot_bgutil_cli.py', dir: '.var/app/com.neosubhamoy.neodlp/config/yt-dlp-plugins/bgutil-ytdlp-pot-provider/yt_dlp_plugins/extractor/' },
|
||||
{ source: 'yt-dlp-plugins/bgutil-ytdlp-pot-provider/yt_dlp_plugins/extractor/getpot_bgutil_http.py', destination: '.var/app/com.neosubhamoy.neodlp/config/yt-dlp-plugins/bgutil-ytdlp-pot-provider/yt_dlp_plugins/extractor/getpot_bgutil_http.py', dir: '.var/app/com.neosubhamoy.neodlp/config/yt-dlp-plugins/bgutil-ytdlp-pot-provider/yt_dlp_plugins/extractor/' },
|
||||
];
|
||||
|
||||
if (isFlatpak) {
|
||||
for (const file of filesToCopyFlatpak) {
|
||||
const sourcePath = await join(resourceDirPath, file.source);
|
||||
const destinationDir = await join(homeDirPath, file.dir);
|
||||
const destinationPath = await join(homeDirPath, file.destination);
|
||||
const escapedContent = file.content?.replace(/'/g, `'\\''`) || '';
|
||||
const copyCommand = Command.create('sh', ['-c', `cp "${sourcePath}" "${destinationPath}"`]);
|
||||
const copyCommand = Command.create('sh', ['-c', `mkdir -p "${destinationDir}" && cp "${sourcePath}" "${destinationPath}"`]);
|
||||
const writeCommand = Command.create('sh', ['-c', `printf '%s' '${escapedContent}' > "${destinationPath}"`]);
|
||||
|
||||
if (file.content) {
|
||||
|
||||
@@ -17,7 +17,12 @@ export default function usePotServer() {
|
||||
};
|
||||
|
||||
const startPotServer = async (port?: number) => {
|
||||
const runCommand = Command.sidecar('binaries/neodlp-pot', [
|
||||
const isFlatpak = await invoke<boolean>('is_flatpak');
|
||||
const runCommand = isFlatpak
|
||||
? Command.create('sh', [
|
||||
'-c', `/app/bin/neodlp-pot server --port ${port ? port.toString() : potServerPort.toString()}`
|
||||
])
|
||||
: Command.sidecar('binaries/neodlp-pot', [
|
||||
'server',
|
||||
'--port',
|
||||
port ? port.toString() : potServerPort.toString(),
|
||||
|
||||
@@ -21,7 +21,13 @@ export function useYtDlpUpdater() {
|
||||
setIsUpdatingYtDlp(true);
|
||||
LOG.info('NEODLP', 'Updating yt-dlp to latest version');
|
||||
try {
|
||||
const command = currentPlatform === 'linux' && !isFlatpak ? Command.create('pkexec', ['yt-dlp', '--update-to', ytDlpUpdateChannel]) : Command.sidecar('binaries/yt-dlp', ['--update-to', ytDlpUpdateChannel]);
|
||||
const command = currentPlatform === 'linux' && isFlatpak
|
||||
? ytDlpUpdateChannel === 'nightly'
|
||||
? Command.create('sh', ['-c', 'pip3 install -U --pre "yt-dlp[default,curl-cffi]"'])
|
||||
: Command.create('sh', ['-c', 'pip3 install -U "yt-dlp[default,curl-cffi]"'])
|
||||
: currentPlatform === 'linux'
|
||||
? Command.create('pkexec', ['yt-dlp', '--update-to', ytDlpUpdateChannel])
|
||||
: Command.sidecar('binaries/yt-dlp', ['--update-to', ytDlpUpdateChannel]);
|
||||
const output = await command.execute();
|
||||
if (output.code === 0) {
|
||||
console.log("yt-dlp updated successfully:", output.stdout);
|
||||
|
||||
Reference in New Issue
Block a user