1
1
mirror of https://github.com/neosubhamoy/pytubepp-helper.git synced 2026-02-04 11:22:22 +05:30

(feat): added support for arch linux

This commit is contained in:
2025-02-20 12:43:35 +05:30
Verified
parent 6d773dfebf
commit f1f7d78c4e
4 changed files with 78 additions and 7 deletions

View File

@@ -49,6 +49,13 @@
"--version" "--version"
] ]
}, },
{
"name": "is-pacman-installed",
"cmd": "pacman",
"args": [
"--version"
]
},
{ {
"name": "is-python3-installed", "name": "is-python3-installed",
"cmd": "python3", "cmd": "python3",

View File

@@ -103,6 +103,7 @@ export function extractVersion(output: string): string | null {
/OS Version:.*Build (\d+)/, // Pattern for Windows build /OS Version:.*Build (\d+)/, // Pattern for Windows build
/apt (\d+\.\d+\.\d+)/, // Pattern for apt /apt (\d+\.\d+\.\d+)/, // Pattern for apt
/(\d+\.\d+\.\d+)/, // Pattern for dnf /(\d+\.\d+\.\d+)/, // Pattern for dnf
/Pacman v(\d+\.\d+\.\d+)/, // Pattern for pacman
/ProductVersion:\s+(\d+\.\d+(\.\d+)?)/, // Pattern for macOS version /ProductVersion:\s+(\d+\.\d+(\.\d+)?)/, // Pattern for macOS version
/Homebrew (\d+\.\d+\.\d+)/, // Pattern for Homebrew /Homebrew (\d+\.\d+\.\d+)/, // Pattern for Homebrew
]; ];

View File

@@ -36,6 +36,10 @@ export default function HomePage() {
installed: false, installed: false,
version: null, version: null,
}, },
pacman: {
installed: false,
version: null,
},
brew: { brew: {
installed: false, installed: false,
version: null, version: null,
@@ -99,6 +103,15 @@ export default function HomePage() {
} }
})); }));
}), }),
isInstalled('pacman', '--version').then((result) => {
setInstalledPrograms((prevState) => ({
...prevState,
pacman: {
installed: result.installed,
version: result.output ? extractVersion(result.output) : null,
}
}));
}),
isInstalled('homebrew', '--version').then((result) => { isInstalled('homebrew', '--version').then((result) => {
setInstalledPrograms((prevState) => ({ setInstalledPrograms((prevState) => ({
...prevState, ...prevState,
@@ -299,7 +312,7 @@ export default function HomePage() {
<p><b>PytubePP:</b> {installedPrograms.pytubepp.installed ? 'installed' : 'not installed'} {installedPrograms.pytubepp.version ? `(${installedPrograms.pytubepp.version})` : ''}</p> <p><b>PytubePP:</b> {installedPrograms.pytubepp.installed ? 'installed' : 'not installed'} {installedPrograms.pytubepp.version ? `(${installedPrograms.pytubepp.version})` : ''}</p>
{installedPrograms.pytubepp.installed ? <CircleCheck className="w-5 h-5 my-2 text-green-400"/> : installedPrograms.pip3.installed ? <Button variant="link" className="text-blue-600 px-0" onClick={async () => { await invoke('install_program', {icommand: 'pip3 install pytubepp || pip3 install pytubepp --break-system-packages'})}}>install</Button> : null} {installedPrograms.pytubepp.installed ? <CircleCheck className="w-5 h-5 my-2 text-green-400"/> : installedPrograms.pip3.installed ? <Button variant="link" className="text-blue-600 px-0" onClick={async () => { await invoke('install_program', {icommand: 'pip3 install pytubepp || pip3 install pytubepp --break-system-packages'})}}>install</Button> : null}
</div> </div>
{(!installedPrograms.apt.installed && (!installedPrograms.python3.installed || !installedPrograms.ffmpeg.installed)) ? {(!installedPrograms.apt.installed && (!installedPrograms.python3.installed || !installedPrograms.ffmpeg.installed || !installedPrograms.nodejs.installed)) ?
<Alert className="mt-5" variant="destructive"> <Alert className="mt-5" variant="destructive">
<CircleAlert className="h-5 w-5" /> <CircleAlert className="h-5 w-5" />
<AlertTitle>APT Not Found</AlertTitle> <AlertTitle>APT Not Found</AlertTitle>
@@ -317,7 +330,7 @@ export default function HomePage() {
</AlertDescription> </AlertDescription>
</Alert> </Alert>
: null} : null}
{(installedPrograms.python3.installed && installedPrograms.ffmpeg.installed && installedPrograms.pytubepp.installed) ? {(installedPrograms.python3.installed && installedPrograms.ffmpeg.installed && installedPrograms.nodejs.installed && installedPrograms.pytubepp.installed) ?
<Alert className="mt-5"> <Alert className="mt-5">
<CircleCheck className="h-5 w-5" /> <CircleCheck className="h-5 w-5" />
<AlertTitle>Ready</AlertTitle> <AlertTitle>Ready</AlertTitle>
@@ -345,7 +358,7 @@ export default function HomePage() {
<p><b>PytubePP:</b> {installedPrograms.pytubepp.installed ? 'installed' : 'not installed'} {installedPrograms.pytubepp.version ? `(${installedPrograms.pytubepp.version})` : ''}</p> <p><b>PytubePP:</b> {installedPrograms.pytubepp.installed ? 'installed' : 'not installed'} {installedPrograms.pytubepp.version ? `(${installedPrograms.pytubepp.version})` : ''}</p>
{installedPrograms.pytubepp.installed ? <CircleCheck className="w-5 h-5 my-2 text-green-400"/> : installedPrograms.pip3.installed ? <Button variant="link" className="text-blue-600 px-0" onClick={async () => { await invoke('install_program', {icommand: 'pip3 install pytubepp || pip3 install pytubepp --break-system-packages'})}}>install</Button> : null} {installedPrograms.pytubepp.installed ? <CircleCheck className="w-5 h-5 my-2 text-green-400"/> : installedPrograms.pip3.installed ? <Button variant="link" className="text-blue-600 px-0" onClick={async () => { await invoke('install_program', {icommand: 'pip3 install pytubepp || pip3 install pytubepp --break-system-packages'})}}>install</Button> : null}
</div> </div>
{(!installedPrograms.dnf.installed && (!installedPrograms.python3.installed || !installedPrograms.ffmpeg.installed)) ? {(!installedPrograms.dnf.installed && (!installedPrograms.python3.installed || !installedPrograms.ffmpeg.installed || !installedPrograms.nodejs.installed)) ?
<Alert className="mt-5" variant="destructive"> <Alert className="mt-5" variant="destructive">
<CircleAlert className="h-5 w-5" /> <CircleAlert className="h-5 w-5" />
<AlertTitle>DNF Not Found</AlertTitle> <AlertTitle>DNF Not Found</AlertTitle>
@@ -363,7 +376,53 @@ export default function HomePage() {
</AlertDescription> </AlertDescription>
</Alert> </Alert>
: null} : null}
{(installedPrograms.python3.installed && installedPrograms.ffmpeg.installed && installedPrograms.pytubepp.installed) ? {(installedPrograms.python3.installed && installedPrograms.ffmpeg.installed && installedPrograms.nodejs.installed && installedPrograms.pytubepp.installed) ?
<Alert className="mt-5">
<CircleCheck className="h-5 w-5" />
<AlertTitle>Ready</AlertTitle>
<AlertDescription>
Everything looks ok! You can close this window now. Make sure it's always running in the background.
</AlertDescription>
</Alert>
: null}
</div>
: distroId && distroPkgMngr && distroPkgMngr === 'pacman' ? /* Section for Arch Linux */
<div className="programstats mt-5 mx-3">
<div className="programitem flex items-center justify-between">
<p><b>Python:</b> {installedPrograms.python3.installed ? 'installed' : 'not installed'} {installedPrograms.python3.version ? `(${installedPrograms.python3.version})` : ''}</p>
{installedPrograms.python3.installed ? installedPrograms.python3.version ? compareVersions(installedPrograms.python3.version, '3.8') < 0 ? <TriangleAlert className="w-5 h-5 my-2 text-orange-400"/> : <CircleCheck className="w-5 h-5 my-2 text-green-400"/> : installedPrograms.pacman.installed ? <Button variant="link" className="text-blue-600 px-0" onClick={async () => { await invoke('install_program', {icommand: 'sudo pacman -Sy python'})}}>install</Button> : <TriangleAlert className="w-5 h-5 my-2 text-orange-400"/> : null}
</div>
<div className="programitem flex items-center justify-between">
<p><b>FFmpeg:</b> {installedPrograms.ffmpeg.installed ? 'installed' : 'not installed'} {installedPrograms.ffmpeg.version ? `(${installedPrograms.ffmpeg.version})` : ''}</p>
{installedPrograms.ffmpeg.installed ? <CircleCheck className="w-5 h-5 my-2 text-green-400"/> : installedPrograms.pacman.installed ? <Button variant="link" className="text-blue-600 px-0" onClick={async () => { await invoke('install_program', {icommand: 'sudo pacman -Sy ffmpeg'})}}>install</Button> : null}
</div>
<div className="programitem flex items-center justify-between">
<p><b>Node.js:</b> {installedPrograms.nodejs.installed ? 'installed' : 'not installed'} {installedPrograms.nodejs.version ? `(${installedPrograms.nodejs.version})` : ''}</p>
{installedPrograms.nodejs.installed ? <CircleCheck className="w-5 h-5 my-2 text-green-400"/> : installedPrograms.pacman.installed ? <Button variant="link" className="text-blue-600 px-0" onClick={async () => { await invoke('install_program', {icommand: 'sudo pacman -Sy nodejs-lts-iron npm'})}}>install</Button> : null}
</div>
<div className="programitem flex items-center justify-between">
<p><b>PytubePP:</b> {installedPrograms.pytubepp.installed ? 'installed' : 'not installed'} {installedPrograms.pytubepp.version ? `(${installedPrograms.pytubepp.version})` : ''}</p>
{installedPrograms.pytubepp.installed ? <CircleCheck className="w-5 h-5 my-2 text-green-400"/> : installedPrograms.pip3.installed ? <Button variant="link" className="text-blue-600 px-0" onClick={async () => { await invoke('install_program', {icommand: 'pip3 install pytubepp || pip3 install pytubepp --break-system-packages'})}}>install</Button> : null}
</div>
{(!installedPrograms.pacman.installed && (!installedPrograms.python3.installed || !installedPrograms.ffmpeg.installed || !installedPrograms.nodejs.installed)) ?
<Alert className="mt-5" variant="destructive">
<CircleAlert className="h-5 w-5" />
<AlertTitle>Pacman Not Found</AlertTitle>
<AlertDescription>
Pacman is required to install necessary packages. Please install it manually for your distro.
</AlertDescription>
</Alert>
: null}
{(!installedPrograms.pip3.installed && !installedPrograms.pytubepp.installed) ?
<Alert className="mt-5" variant="destructive">
<CircleAlert className="h-5 w-5" />
<AlertTitle>PIP Not Found</AlertTitle>
<AlertDescription>
PIP is required to install necessary python packages. Please install it now to continue: <Button variant="link" className="text-blue-600 p-0" onClick={async () => { await invoke('install_program', {icommand: 'sudo pacman -Sy python-pip'})}}>install</Button>
</AlertDescription>
</Alert>
: null}
{(installedPrograms.python3.installed && installedPrograms.ffmpeg.installed && installedPrograms.nodejs.installed && installedPrograms.pytubepp.installed) ?
<Alert className="mt-5"> <Alert className="mt-5">
<CircleCheck className="h-5 w-5" /> <CircleCheck className="h-5 w-5" />
<AlertTitle>Ready</AlertTitle> <AlertTitle>Ready</AlertTitle>
@@ -391,7 +450,7 @@ export default function HomePage() {
<p><b>PytubePP:</b> {installedPrograms.pytubepp.installed ? 'installed' : 'not installed'} {installedPrograms.pytubepp.version ? `(${installedPrograms.pytubepp.version})` : ''}</p> <p><b>PytubePP:</b> {installedPrograms.pytubepp.installed ? 'installed' : 'not installed'} {installedPrograms.pytubepp.version ? `(${installedPrograms.pytubepp.version})` : ''}</p>
{installedPrograms.pytubepp.installed ? <CircleCheck className="w-5 h-5 my-2 text-green-400"/> : installedPrograms.pip.installed ? <Button variant="link" className="text-blue-600 px-0" onClick={async () => { await invoke('install_program', {icommand: 'pip install pytubepp'})}}>install</Button> : null} {installedPrograms.pytubepp.installed ? <CircleCheck className="w-5 h-5 my-2 text-green-400"/> : installedPrograms.pip.installed ? <Button variant="link" className="text-blue-600 px-0" onClick={async () => { await invoke('install_program', {icommand: 'pip install pytubepp'})}}>install</Button> : null}
</div> </div>
{(!installedPrograms.winget.installed && (!installedPrograms.python.installed || !installedPrograms.ffmpeg.installed)) ? {(!installedPrograms.winget.installed && (!installedPrograms.python.installed || !installedPrograms.ffmpeg.installed || !installedPrograms.nodejs.installed)) ?
<Alert className="mt-5" variant="destructive"> <Alert className="mt-5" variant="destructive">
<CircleAlert className="h-5 w-5" /> <CircleAlert className="h-5 w-5" />
<AlertTitle>WinGet Not Found</AlertTitle> <AlertTitle>WinGet Not Found</AlertTitle>
@@ -400,7 +459,7 @@ export default function HomePage() {
</AlertDescription> </AlertDescription>
</Alert> </Alert>
: null} : null}
{(installedPrograms.python.installed && installedPrograms.ffmpeg.installed && installedPrograms.pytubepp.installed) ? {(installedPrograms.python.installed && installedPrograms.ffmpeg.installed && installedPrograms.nodejs.installed && installedPrograms.pytubepp.installed) ?
<Alert className="mt-5"> <Alert className="mt-5">
<CircleCheck className="h-5 w-5" /> <CircleCheck className="h-5 w-5" />
<AlertTitle>Ready</AlertTitle> <AlertTitle>Ready</AlertTitle>
@@ -428,7 +487,7 @@ export default function HomePage() {
<p><b>PytubePP:</b> {installedPrograms.pytubepp.installed ? 'installed' : 'not installed'} {installedPrograms.pytubepp.version ? `(${installedPrograms.pytubepp.version})` : ''}</p> <p><b>PytubePP:</b> {installedPrograms.pytubepp.installed ? 'installed' : 'not installed'} {installedPrograms.pytubepp.version ? `(${installedPrograms.pytubepp.version})` : ''}</p>
{installedPrograms.pytubepp.installed ? <CircleCheck className="w-5 h-5 my-2 text-green-400"/> : installedPrograms.pip3.installed ? <Button variant="link" className="text-blue-600 px-0" onClick={async () => { await invoke('install_program', {icommand: 'pip3 install pytubepp || pip3 install pytubepp --break-system-packages'})}}>install</Button> : null} {installedPrograms.pytubepp.installed ? <CircleCheck className="w-5 h-5 my-2 text-green-400"/> : installedPrograms.pip3.installed ? <Button variant="link" className="text-blue-600 px-0" onClick={async () => { await invoke('install_program', {icommand: 'pip3 install pytubepp || pip3 install pytubepp --break-system-packages'})}}>install</Button> : null}
</div> </div>
{(!installedPrograms.brew.installed && (!installedPrograms.python3.installed || !installedPrograms.ffmpeg.installed)) ? {(!installedPrograms.brew.installed && (!installedPrograms.python3.installed || !installedPrograms.ffmpeg.installed || !installedPrograms.nodejs.installed)) ?
<Alert className="mt-5" variant="destructive"> <Alert className="mt-5" variant="destructive">
<CircleAlert className="h-5 w-5" /> <CircleAlert className="h-5 w-5" />
<AlertTitle>Homebrew Not Found</AlertTitle> <AlertTitle>Homebrew Not Found</AlertTitle>

View File

@@ -24,6 +24,10 @@ export interface InstalledPrograms {
installed: boolean; installed: boolean;
version: string | null; version: string | null;
}; };
pacman: {
installed: boolean;
version: string | null;
};
brew: { brew: {
installed: boolean; installed: boolean;
version: string | null; version: string | null;