Files
ebook2audiobook/ebook2audiobook.cmd
unknown e4e3f12178 ...
2025-02-15 19:26:17 -08:00

218 lines
6.1 KiB
Batchfile
Executable File

@echo off
setlocal enabledelayedexpansion
:: Capture all arguments into ARGS
set "ARGS=%*"
set "NATIVE=native"
set "FULL_DOCKER=full_docker"
set "SCRIPT_MODE=%NATIVE%"
set "SCRIPT_DIR=%~dp0"
set "PYTHON_VERSION=3.12"
set "PYTHON_ENV=python_env"
set "CURRENT_ENV="
set "PROGRAMS_LIST=calibre ffmpeg nodejs espeak-ng"
set "TMP=%SCRIPT_DIR%\tmp"
set "TEMP=%SCRIPT_DIR%\tmp"
set "CONDA_URL=https://repo.anaconda.com/miniconda/Miniconda3-latest-Windows-x86_64.exe"
set "CONDA_INSTALLER=%TEMP%\Miniconda3-latest-Windows-x86_64.exe"
set "CONDA_INSTALL_DIR=%USERPROFILE%\miniconda3"
set "CONDA_PATH=%USERPROFILE%\miniconda3\bin"
set "CONDA_ACTIVATE=%CONDA_INSTALL_DIR%\condabin\conda.bat"
set "ESPEAK_DATA_PATH=%USERPROFILE%\scoop\apps\espeak-ng\current\eSpeak NG\espeak-ng-data"
set "PATH=%USERPROFILE%\scoop\shims;%CONDA_PATH%;%CONDA_INSTALL_DIR%\condabin;%PATH%"
set "PROGRAMS_CHECK=0"
set "CONDA_CHECK_STATUS=0"
set "CONDA_RUN_INIT=0"
set "DOCKER_CHECK_STATUS=0"
set "HELP_FOUND=%ARGS:--help=%"
:: Refresh environment variables (append registry Path to current PATH)
for /f "tokens=2,*" %%A in ('reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path') do (
set "PATH=%%B;%PATH%"
)
cd /d "%SCRIPT_DIR%"
:: Check if running inside Docker
if defined CONTAINER (
echo Running in %FULL_DOCKER% mode
set "SCRIPT_MODE=%FULL_DOCKER%"
goto main
)
echo Running in %SCRIPT_MODE% mode
goto conda_check
:conda_check
set "conda_version="
where /Q conda
if %errorlevel% neq 0 (
call rmdir /s /q "%CONDA_INSTALL_DIR%" 2>nul
set "CONDA_CHECK_STATUS=1"
) else (
:: Check if running in a Conda environment
if defined CONDA_DEFAULT_ENV (
set "CURRENT_ENV=%CONDA_PREFIX%"
)
:: Check if running in a Python virtual environment
if defined VIRTUAL_ENV (
set "CURRENT_ENV=%VIRTUAL_ENV%"
)
for /f "delims=" %%i in ('where /Q python') do (
if defined CONDA_PREFIX (
if /i "%%i"=="%CONDA_PREFIX%\Scripts\python.exe" (
set "CURRENT_ENV=%CONDA_PREFIX%"
break
)
) else if defined VIRTUAL_ENV (
if /i "%%i"=="%VIRTUAL_ENV%\Scripts\python.exe" (
set "CURRENT_ENV=%VIRTUAL_ENV%"
break
)
)
)
if not "%CURRENT_ENV%"=="" (
echo Current python virtual environment detected: %CURRENT_ENV%.
echo This script runs with its own virtual env and must be out of any other virtual environment when it's launched.
goto failed
)
call :programs_check
)
goto dispatch
:programs_check
set "missing_prog_array="
for %%p in (%PROGRAMS_LIST%) do (
set "prog=%%p"
if "%%p"=="nodejs" set "prog=node"
where /Q !prog!
if errorlevel 1 (
echo %%p is not installed.
set "missing_prog_array=!missing_prog_array! %%p"
)
)
if not "!missing_prog_array!"=="" (
set "PROGRAMS_CHECK=1"
goto install_components
)
goto dispatch
:docker_check
where /Q docker
if %errorlevel% neq 0 (
set "DOCKER_CHECK_STATUS=1"
) else (
:: Verify Docker is running
call docker info >nul 2>&1
if %errorlevel% neq 0 (
set "DOCKER_CHECK_STATUS=1"
) else (
goto dispatch
)
)
goto install_components
:install_components
:: Install Scoop if not already installed
where /Q scoop
if %errorlevel% neq 0 (
echo Scoop is not installed. Installing Scoop...
powershell -NoProfile -ExecutionPolicy Bypass -Command "iwr -useb get.scoop.sh | iex"
call refreshenv
call scoop install git
call scoop bucket add extras
call scoop bucket known
)
:: Install missing packages if any
if not "%PROGRAMS_CHECK%"=="0" (
echo Installing %missing_prog_array%
call scoop install %missing_prog_array%
set "PROGRAMS_CHECK=0"
set "missing_prog_array="
)
:: Install Conda if not already installed
if not "%CONDA_CHECK_STATUS%"=="0" (
echo Installing Conda...
call powershell -Command "[System.Environment]::SetEnvironmentVariable('Path', [System.Environment]::GetEnvironmentVariable('Path','Machine') + ';' + [System.Environment]::GetEnvironmentVariable('Path','User'),'Process')"
echo Downloading Conda installer...
call powershell -Command "Invoke-WebRequest -Uri %CONDA_URL% -OutFile "%CONDA_INSTALLER%"
"%CONDA_INSTALLER%" /InstallationType=JustMe /RegisterPython=0 /AddToPath=1 /S /D=%CONDA_INSTALL_DIR%
if exist "%CONDA_ACTIVATE%" (
echo Conda installed successfully.
set "CONDA_RUN_INIT=1"
set "CONDA_CHECK_STATUS=0"
)
)
:: Install Docker if not already installed
if not "%DOCKER_CHECK_STATUS%"=="0" (
echo Docker is not installed. Installing it now...
call scoop install docker-cli
call scoop install docker-engine
call where /Q docker
if %errorlevel% equ 0 (
echo Starting Docker Engine...
net start com.docker.service >nul 2>&1
if %errorlevel% equ 0 (
echo Docker installed and started successfully.
set "DOCKER_CHECK_STATUS=0"
)
)
)
goto dispatch
:dispatch
if "%PROGRAMS_CHECK%"=="0" (
if "%CONDA_CHECK_STATUS%"=="0" (
if "%DOCKER_CHECK_STATUS%"=="0" (
goto main
) else (
goto failed
)
)
)
echo PROGRAMS_CHECK: %PROGRAMS_CHECK%
echo CONDA_CHECK_STATUS: %CONDA_CHECK_STATUS%
echo DOCKER_CHECK_STATUS: %DOCKER_CHECK_STATUS%
timeout /t 5 /nobreak >nul
goto install_components
:main
if "%SCRIPT_MODE%"=="%FULL_DOCKER%" (
call python %SCRIPT_DIR%\app.py --script_mode %SCRIPT_MODE% %ARGS%
) else (
if "%CONDA_RUN_INIT%"=="1" (
call conda init
set "CONDA_RUN_INIT=0"
)
if not exist "%SCRIPT_DIR%\%PYTHON_ENV%" (
call conda create --prefix "%SCRIPT_DIR%\%PYTHON_ENV%" python=%PYTHON_VERSION% -y
call conda activate "%SCRIPT_DIR%\%PYTHON_ENV%"
call python -m pip cache purge
call python -m pip install --upgrade pip
for /f %%p in (requirements.txt) do (
echo Installing %%p...
python -m pip install --upgrade --no-cache-dir --progress-bar=on %%p
)
echo ✅ All required packages are installed.
) else (
call conda activate "%SCRIPT_DIR%\%PYTHON_ENV%"
)
call python "%SCRIPT_DIR%\app.py" --script_mode %SCRIPT_MODE% %ARGS%
call conda deactivate
)
exit /b
:failed
echo ebook2audiobook is not correctly installed or run.
exit /b
endlocal
pause