diff --git a/src/assets/images/neosubhamoy.jpg b/src/assets/images/neosubhamoy.jpg new file mode 100644 index 0000000..0db452d Binary files /dev/null and b/src/assets/images/neosubhamoy.jpg differ diff --git a/src/assets/images/yt-dlp-logo.png b/src/assets/images/yt-dlp-logo.png deleted file mode 100644 index 9a78dd3..0000000 Binary files a/src/assets/images/yt-dlp-logo.png and /dev/null differ diff --git a/src/components/footer.tsx b/src/components/footer.tsx index 6c32028..c3e7fa7 100644 --- a/src/components/footer.tsx +++ b/src/components/footer.tsx @@ -3,6 +3,7 @@ import { isActive } from "@/utils"; import { config } from "@/config"; import { useSettingsPageStatesStore } from "@/services/store"; import { Github, Globe, Heart } from "lucide-react"; +import { IndianFlagLogo } from "@/components/icons/india"; export default function Footer() { const location = useLocation(); @@ -15,7 +16,7 @@ export default function Footer() {
{config.appName} v{appVersion} - © {new Date().getFullYear()}  |  MIT License - Made with by {config.appAuthor} + Proudly Made with in India
diff --git a/src/components/icons/india.tsx b/src/components/icons/india.tsx new file mode 100644 index 0000000..be76251 --- /dev/null +++ b/src/components/icons/india.tsx @@ -0,0 +1,27 @@ +export function IndianFlagLogo({ className }: { className?: string }) { + return ( + + + + + + + + + + + + + + + + + + + + + + + + ); +} diff --git a/src/components/pages/downloader/bottomBar.tsx b/src/components/pages/downloader/bottomBar.tsx index f3567ec..f206ada 100644 --- a/src/components/pages/downloader/bottomBar.tsx +++ b/src/components/pages/downloader/bottomBar.tsx @@ -203,7 +203,7 @@ function DownloadConfigDialog({ selectedFormatFileType }: DownloadConfigDialogPr
- +
state.settings.embed_video_metadata); @@ -1252,6 +1259,188 @@ function AppDebugSettings() { ); } +function AppInfoSettings() { + const appVersion = useSettingsPageStatesStore(state => state.appVersion); + + const binDepsList = [ + { key: 'yt-dlp', name: 'YT-DLP', desc: 'The core video/audio downloading engine', url: 'https://github.com/yt-dlp/yt-dlp', license: 'Unlicense', licenseUrl: 'https://github.com/yt-dlp/yt-dlp/blob/master/LICENSE' }, + { key: 'ffmpeg', name: 'FFmpeg', desc: 'Multimedia framework for handling video/audio processing', url: 'https://ffmpeg.org/', license: 'LGPLv2.1+', licenseUrl: 'https://ffmpeg.org/legal.html' }, + { key: 'ffprobe', name: 'FFprobe', desc: 'Multimedia stream analyzer for retrieving media information', url: 'https://ffmpeg.org/ffprobe.html', license: 'LGPLv2.1+', licenseUrl: 'https://ffmpeg.org/legal.html' }, + { key: 'deno', name: 'Deno', desc: 'The modern JavaScript/TypeScript runtime', url: 'https://deno.land/', license: 'MIT', licenseUrl: 'https://github.com/denoland/deno/blob/main/LICENSE.md' }, + { key: 'aria2', name: 'Aria2', desc: 'Lightweight multi-protocol & multi-source download utility', url: 'https://aria2.github.io/', license: 'GPLv2+', licenseUrl: 'https://github.com/aria2/aria2/blob/master/COPYING' }, + ]; + const langDepsList = [ + { key: 'tauri', name: 'Tauri', desc: 'Framework for building cross-platform, tiny and blazing fast binaries', url: 'https://tauri.app/', license: 'MIT, Apache-2.0', licenseUrl: 'https://github.com/tauri-apps/tauri/blob/dev/LICENSE_MIT' }, + { key: 'react', name: 'React', desc: 'The library for web and native user interfaces', url: 'https://reactjs.org/', license: 'MIT', licenseUrl: 'https://github.com/facebook/react/blob/main/LICENSE' }, + { key: 'rust', name: 'Rust', desc: 'A language empowering everyone to build reliable and efficient software', url: 'https://www.rust-lang.org/', license: 'MIT, Apache-2.0', licenseUrl: 'https://github.com/rust-lang/rust/blob/main/LICENSE-APACHE' }, + { key: 'typescript', name: 'TypeScript', desc: 'Typed superset of JavaScript that compiles to plain JavaScript', url: 'https://www.typescriptlang.org/', license: 'Apache-2.0', licenseUrl: 'https://github.com/microsoft/TypeScript/blob/main/LICENSE.txt' }, + { key: 'tailwindcss', name: 'Tailwind CSS', desc: 'A utility-first CSS framework for rapidly building custom designs', url: 'https://tailwindcss.com/', license: 'MIT', licenseUrl: 'https://github.com/tailwindlabs/tailwindcss/blob/main/LICENSE' }, + { key: 'vite', name: 'Vite', desc: 'Next Generation Frontend Tooling', url: 'https://vitejs.dev/', license: 'MIT', licenseUrl: 'https://github.com/vitejs/vite/blob/main/LICENSE' }, + { key: 'sqlite3', name: 'SQLite3', desc: 'A C library that implements a small, fast, self-contained SQL database engine', url: 'https://www.sqlite.org/', license: 'Public', licenseUrl: 'https://www.sqlite.org/copyright.html' }, + ]; + const libDepsList = [ + { key: 'shadcn-ui', name: 'shadcn/ui', desc: 'Beautifully designed components built with Radix UI and Tailwind CSS', url: 'https://ui.shadcn.com/', license: 'MIT', licenseUrl: 'https://github.com/shadcn-ui/ui/blob/main/LICENSE.md' }, + { key: 'lucide-icons', name: 'Lucide Icons', desc: 'A simple and consistent icon system for web applications', url: 'https://lucide.dev/', license: 'ISC', licenseUrl: 'https://github.com/lucide-icons/lucide/blob/main/LICENSE' }, + { key: 'tanstack-react-query', name: 'TanStack React Query', desc: 'Powerful asynchronous state management tool', url: 'https://tanstack.com/query/latest', license: 'MIT', licenseUrl: 'https://github.com/TanStack/query/blob/main/LICENSE' }, + { key: 'zustand', name: 'Zustand', desc: 'A small, fast and scalable bearbones state-management solution', url: 'https://zustand-demo.pmnd.rs/', license: 'MIT', licenseUrl: 'https://github.com/pmndrs/zustand/blob/main/LICENSE' }, + { key: 'zod', name: 'Zod', desc: 'TypeScript-first schema declaration and validation library', url: 'https://zod.dev/', license: 'MIT', licenseUrl: 'https://github.com/colinhacks/zod/blob/main/LICENSE' }, + { key: 'react-router', name: 'React Router', desc: 'Declarative routing for React applications', url: 'https://reactrouter.com/', license: 'MIT', licenseUrl: 'https://github.com/remix-run/react-router/blob/main/LICENSE.md' }, + { key: 'react-hook-form', name: 'React Hook Form', desc: 'Performant, flexible and extensible forms with easy-to-use validation', url: 'https://react-hook-form.com/', license: 'MIT', licenseUrl: 'https://github.com/react-hook-form/react-hook-form/blob/master/LICENSE' }, + { key: 'sonner', name: 'Sonner', desc: 'A beautiful, simple and customizable notification library for React', url: 'https://sonner.emilkowal.ski/', license: 'MIT', licenseUrl: 'https://github.com/emilkowalski/sonner/blob/main/LICENSE.md' }, + { key: 'es-toolkit' , name: 'ES Toolkit', desc: 'State-of-the-art JavaScript utility library', url: 'https://es-toolkit.dev/', license: 'MIT', licenseUrl: 'https://github.com/toss/es-toolkit/blob/main/LICENSE' }, + { key: 'tokio', name: 'Tokio', desc: 'An asynchronous runtime for the Rust programming language', url: 'https://tokio.rs/', license: 'MIT', licenseUrl: 'https://github.com/tokio-rs/tokio/blob/master/LICENSE' }, + { key: 'reqwest', name: 'Reqwest', desc: 'An easy and powerful HTTP Client for Rust', url: 'https://crates.io/crates/reqwest', license: 'MIT, Apache-2.0', licenseUrl: 'https://github.com/seanmonstar/reqwest/blob/master/LICENSE-APACHE' }, + { key: 'serde', name: 'Serde', desc: 'A framework for serializing and deserializing Rust data structures', url: 'https://serde.rs/', license: 'MIT, Apache-2.0', licenseUrl: 'https://github.com/serde-rs/serde/blob/master/LICENSE-MIT' }, + { key: 'sqlx', name: 'SQLx', desc: 'An async, pure Rust SQL crate', url: 'https://crates.io/crates/sqlx', license: 'MIT, Apache-2.0', licenseUrl: 'https://github.com/launchbadge/sqlx/blob/main/LICENSE-APACHE' }, + { key: 'directories', name: 'Directories', desc: 'A Rust library for platform-specific standard locations', url: 'https://crates.io/crates/directories', license: 'MIT, Apache-2.0', licenseUrl: 'https://codeberg.org/dirs/directories-rs/src/branch/main/LICENSE-APACHE' }, + ]; + + function DependencyItem(dep: { key: string, name: string; desc: string; url: string; license: string; licenseUrl: string }) { + return ( +
+
+

+ + {dep.name} + + + + +

+

{dep.desc}

+
+ + {dep.license} + +
+ ); + } + + return ( + <> +
+ +
+ +
+
+ {config.appName} v{appVersion} + The Next-Gen Truly Cross-Platform Video/Audio Downloader + + + + + + + +

+ Privacy Policy +

+ Terms of Use +
+
+
+
+
+

Developer

+

Meet the Creator & Lead-Developer of NeoDLP

+ +
+ + + SB + + + Verified + + +
+
+ {config.appAuthor} +

Full-Stack Developer

+
+
+ + +
+
+
+

Bug Report

+

Noticed any bug or inconsistencies? Report it to help us improve

+
+ + + + +
+
+
+

License and Usage

+

License and usage terms of NeoDLP

+
+

NeoDLP is a Fully Open-Source Software Licensed under the MIT license. Anyone can view, modify, use (personal and commercial) or distribute it's sources without any extra permission (Just include the LICENSE file :)

+

DISCLAIMER: NeoDLP facilitates Downloading from various Online Platforms which have their own Policies and Terms of Use, Downloading and using Copyrighted Content from these Sites for Commercial pourposes are not allowed by most Platforms without prior Permission (We absolutely do not promote this kinds of activity), You should use the downloaded content wisely and solely at your own responsibility.

+ + + + + + + + + Dependencies + Major dependencies of NeoDLP + +
+

External Binaries

+ {binDepsList.map((dep) => ( + + ))} +

Languages, Frameworks & Tooling

+ {langDepsList.map((dep) => ( + + ))} +

Notable Libraries

+ {libDepsList.map((dep) => ( + + ))} +
+
+
+ +
+
+
+ + ); +} + export function ApplicationSettings() { const activeSubAppTab = useSettingsPageStatesStore(state => state.activeSubAppTab); const setActiveSubAppTab = useSettingsPageStatesStore(state => state.setActiveSubAppTab); @@ -1270,6 +1459,21 @@ export function ApplicationSettings() { const { saveSettingsKey } = useSettings(); const { updateYtDlp } = useYtDlpUpdater(); + const tabsList = [ + { key: 'general', label: 'General', icon: Wrench, component: }, + { key: 'appearance', label: 'Appearance', icon: WandSparkles, component: }, + { key: 'folders', label: 'Folders', icon: Folder, component: }, + { key: 'formats', label: 'Formats', icon: FileVideo, component: }, + { key: 'embedding', label: 'Embedding', icon: FilePen, component: }, + { key: 'network', label: 'Network', icon: Wifi, component: }, + { key: 'cookies', label: 'Cookies', icon: Cookie, component: }, + { key: 'sponsorblock', label: 'Sponsorblock', icon: ShieldMinus, component: }, + { key: 'notifications', label: 'Notifications', icon: BellRing, component: }, + { key: 'commands', label: 'Commands', icon: SquareTerminal, component: }, + { key: 'debug', label: 'Debug', icon: Bug, component: }, + { key: 'info', label: 'Info', icon: Info, component: }, + ]; + return ( <> @@ -1337,118 +1541,22 @@ export function ApplicationSettings() { onValueChange={setActiveSubAppTab} > - ( + - General - - - Appearance - - - Folders - - - Formats - - - Metadata - - - Network - - - Cookies - - - Sponsorblock - - - Notifications - - - Commands - - - Debug - + > + {tab.label} + + ))} -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
+ {tabsList.map((tab) => ( + + {tab.component} + + ))}
diff --git a/src/components/pages/settings/extensionSettings.tsx b/src/components/pages/settings/extensionSettings.tsx index a29d7c7..4d97ceb 100644 --- a/src/components/pages/settings/extensionSettings.tsx +++ b/src/components/pages/settings/extensionSettings.tsx @@ -14,6 +14,7 @@ import { zodResolver } from "@hookform/resolvers/zod" import { Form, FormControl, FormField, FormItem, FormMessage } from "@/components/ui/form"; import { invoke } from "@tauri-apps/api/core"; import { SlidingButton } from "@/components/custom/slidingButton"; +import clsx from "clsx"; const websocketPortSchema = z.object({ port: z.coerce.number({ @@ -205,6 +206,11 @@ export function ExtensionSettings() { const isRestartingWebSocketServer = useSettingsPageStatesStore(state => state.isRestartingWebSocketServer); const setIsRestartingWebSocketServer = useSettingsPageStatesStore(state => state.setIsRestartingWebSocketServer); + const tabsList = [ + { key: "install", label: "Install", icon: ArrowDownToLine, component: }, + { key: "port", label: "Port", icon: EthernetPort, component: }, + ]; + return ( <> @@ -266,28 +272,22 @@ export function ExtensionSettings() { onValueChange={setActiveSubExtTab} > - - Install - - - Port - + {tabsList.map((tab) => ( + + {tab.label} + + ))}
- - - - - - + {tabsList.map((tab) => ( + + {tab.component} + + ))}
diff --git a/src/config.ts b/src/config.ts index 30c2ab6..2af1fc3 100644 --- a/src/config.ts +++ b/src/config.ts @@ -3,6 +3,8 @@ export const config = { appPkgName: "com.neosubhamoy.neodlp", appHomepage: "https://neodlp.neosubhamoy.com", appRepo: "neosubhamoy/neodlp", - appAuthor: "Subhamoy", + appSupportEmail: "support@neodlp.neosubhamoy.com", + appAuthor: "Subhamoy Biswas", appAuthorUrl: "https://neosubhamoy.com", -} \ No newline at end of file + appAuthorSponsorUrl: "https://buymeacoffee.com/neosubhamoy", +} diff --git a/src/pages/downloader.tsx b/src/pages/downloader.tsx index 4dce06a..78b0163 100644 --- a/src/pages/downloader.tsx +++ b/src/pages/downloader.tsx @@ -284,8 +284,9 @@ export default function DownloaderPage() { {!isMetadataLoading && !videoUrl && (