@echo off setlocal EnableExtensions REM ANSI colors (needs Windows 10+ console VT or Windows Terminal) for /f %%a in ('powershell -nop -c "[char]0x1b"') do set "ESC=%%a" set "RST=%ESC%[0m" set "BLD=%ESC%[1m" set "DIM=%ESC%[2m" set "RED=%ESC%[91m" set "GRN=%ESC%[92m" set "YLW=%ESC%[93m" set "BLU=%ESC%[94m" set "MAG=%ESC%[95m" set "CYN=%ESC%[96m" set "GRY=%ESC%[90m" set "WHT=%ESC%[97m" REM Always use 'nathan' as NAS username set NASUSER=nathan REM Menu for operation selection echo. echo %BLD%%YLW%Select operation:%RST% echo %CYN%1.%RST% Generate thumbnails only echo %CYN%2.%RST% SSH cleanup only echo %CYN%3.%RST% Both (generate thumbnails + SSH cleanup) echo %CYN%4.%RST% Fix OneDrive thumbnail override %DIM%(NEW^)%RST% echo. set /p CHOICE=%CYN%Enter your choice ^(1-4^): %RST% if "%CHOICE%"=="1" goto THUMBS_ONLY if "%CHOICE%"=="2" goto SSH_ONLY if "%CHOICE%"=="3" goto BOTH if "%CHOICE%"=="4" goto FIX_ONEDRIVE echo %RED%Invalid choice. Exiting.%RST% exit /b :THUMBS_ONLY REM Prompt for Windows path set /p WINPATH=%CYN%Enter the full Windows path to your NAS directory ^(e.g., R:\YouTube\Streams\MixerTwitch^): %RST% if "%WINPATH%"=="" ( echo %RED%No path provided. Exiting.%RST% exit /b ) REM Convert Windows path to NAS path and pre-seed eaDir_tmp from @eaDir on NAS set "RELPATH=%WINPATH:~3%" set "RELPATH=%RELPATH:\=/%" set "NASPATH=/volume1/Hydra/%RELPATH%" echo %GRN%Uploading extract_eadir_to_tmp.sh to NAS and seeding...%RST% if not exist "%~dp0extract_eadir_to_tmp.sh" ( echo %RED%ERROR: extract_eadir_to_tmp.sh not found next to this batch file.%RST% goto END ) ssh Hydra "cat > ~/extract_eadir_to_tmp.sh" < "%~dp0extract_eadir_to_tmp.sh" ssh Hydra "bash -lc 'if command -v dos2unix >/dev/null 2>&1; then dos2unix -f ~/extract_eadir_to_tmp.sh; else tr -d \"\r\" < ~/extract_eadir_to_tmp.sh > ~/extract_eadir_to_tmp.sh.tmp && mv ~/extract_eadir_to_tmp.sh.tmp ~/extract_eadir_to_tmp.sh; fi; chmod +x ~/extract_eadir_to_tmp.sh; ~/extract_eadir_to_tmp.sh \"%NASPATH%\" || true'" REM Run psthumbgen.py python psthumbgen.py --directory "%WINPATH%" goto END :SSH_ONLY REM Prompt for Windows path set /p WINPATH=%CYN%Enter the full Windows path to your NAS directory ^(e.g., R:\YouTube\Streams\MixerTwitch^): %RST% if "%WINPATH%"=="" ( echo %RED%No path provided. Exiting.%RST% exit /b ) REM Convert Windows path to NAS path set "RELPATH=%WINPATH:~3%" set "RELPATH=%RELPATH:\=/%" set "NASPATH=/volume1/Hydra/%RELPATH%" echo %GRY%DEBUG: WINPATH = %WINPATH%%RST% echo %GRY%DEBUG: RELPATH = %RELPATH%%RST% echo %GRY%DEBUG: NASPATH = %NASPATH%%RST% echo. call :WIN_REMOVE_LOCAL_EADIR REM Ensure nascleanup.sh exists on NAS (upload + fix line endings), then run it echo %GRN%Uploading nascleanup.sh to NAS and running cleanup...%RST% if not exist "%~dp0nascleanup.sh" ( echo %RED%ERROR: nascleanup.sh not found next to this batch file.%RST% goto END ) ssh Hydra "cat > ~/nascleanup.sh" < "%~dp0nascleanup.sh" ssh Hydra "bash -lc 'if command -v dos2unix >/dev/null 2>&1; then dos2unix -f ~/nascleanup.sh; else tr -d \"\r\" < ~/nascleanup.sh > ~/nascleanup.sh.tmp && mv ~/nascleanup.sh.tmp ~/nascleanup.sh; fi; chmod +x ~/nascleanup.sh; ~/nascleanup.sh \"%NASPATH%\"'" if errorlevel 1 ( echo %RED%ERROR: nascleanup failed on NAS - check promote ^(eaDir_tmp -^> @eaDir^) messages above.%RST% echo %YLW%Keeping eaDir_tmp on the share so you can retry without re-running FFmpeg.%RST% call :PRINT_HYDRA_CLEAR_EADIR ) else ( call :WIN_REMOVE_LOCAL_EADIR_TMP ) goto END :BOTH REM Prompt for Windows path set /p WINPATH=%CYN%Enter the full Windows path to your NAS directory ^(e.g., R:\YouTube\Streams\MixerTwitch^): %RST% if "%WINPATH%"=="" ( echo %RED%No path provided. Exiting.%RST% exit /b ) REM Convert Windows path to NAS path set "RELPATH=%WINPATH:~3%" set "RELPATH=%RELPATH:\=/%" set "NASPATH=/volume1/Hydra/%RELPATH%" echo %GRY%DEBUG: WINPATH = %WINPATH%%RST% echo %GRY%DEBUG: RELPATH = %RELPATH%%RST% echo %GRY%DEBUG: NASPATH = %NASPATH%%RST% echo. REM Pre-seed eaDir_tmp from @eaDir on NAS before generation echo %GRN%Uploading extract_eadir_to_tmp.sh to NAS and seeding...%RST% if not exist "%~dp0extract_eadir_to_tmp.sh" ( echo %RED%ERROR: extract_eadir_to_tmp.sh not found next to this batch file.%RST% goto END ) ssh Hydra "cat > ~/extract_eadir_to_tmp.sh" < "%~dp0extract_eadir_to_tmp.sh" ssh Hydra "bash -lc 'if command -v dos2unix >/dev/null 2>&1; then dos2unix -f ~/extract_eadir_to_tmp.sh; else tr -d \"\r\" < ~/extract_eadir_to_tmp.sh > ~/extract_eadir_to_tmp.sh.tmp && mv ~/extract_eadir_to_tmp.sh.tmp ~/extract_eadir_to_tmp.sh; fi; chmod +x ~/extract_eadir_to_tmp.sh; ~/extract_eadir_to_tmp.sh \"%NASPATH%\" || true'" REM Run psthumbgen.py python psthumbgen.py --directory "%WINPATH%" REM Clear old @eaDir on the share via SMB (helps when NAS cp hits Permission denied on root-owned dirs) call :WIN_REMOVE_LOCAL_EADIR REM SSH cleanup commands (run separately) REM Ensure nascleanup.sh exists on NAS (upload + fix line endings), then run it echo %GRN%Uploading nascleanup.sh to NAS and running cleanup...%RST% if not exist "%~dp0nascleanup.sh" ( echo %RED%ERROR: nascleanup.sh not found next to this batch file.%RST% goto END ) ssh Hydra "cat > ~/nascleanup.sh" < "%~dp0nascleanup.sh" ssh Hydra "bash -lc 'if command -v dos2unix >/dev/null 2>&1; then dos2unix -f ~/nascleanup.sh; else tr -d \"\r\" < ~/nascleanup.sh > ~/nascleanup.sh.tmp && mv ~/nascleanup.sh.tmp ~/nascleanup.sh; fi; chmod +x ~/nascleanup.sh; ~/nascleanup.sh \"%NASPATH%\"'" if errorlevel 1 ( echo %RED%ERROR: nascleanup failed on NAS - check promote ^(eaDir_tmp -^> @eaDir^) messages above.%RST% echo %YLW%Keeping eaDir_tmp on the share so you can retry without re-running FFmpeg.%RST% call :PRINT_HYDRA_CLEAR_EADIR ) else ( call :WIN_REMOVE_LOCAL_EADIR_TMP ) goto END :FIX_ONEDRIVE echo. echo %BLD%%MAG%=================================================================%RST% echo %BLD%%MAG% FIX ONEDRIVE THUMBNAIL OVERRIDE %RST% echo %BLD%%MAG%=================================================================%RST% echo. echo %WHT%This will fix OneDrive overriding your custom thumbnails with%RST% echo %WHT%generic file icons for unsupported formats like .blend files.%RST% echo. echo %CYN%What this does:%RST% echo %GRY% - Disables OneDrive cloud thumbnail providers%RST% echo %GRY% - Restores local thumbnail priority%RST% echo %GRY% - Prevents future thumbnail cache deletion%RST% echo. set /p CONFIRM=%YLW%Continue? ^(y/n^): %RST% if /i not "%CONFIRM%"=="y" goto END echo. echo %GRN%Running PowerShell script to fix OneDrive thumbnail override...%RST% echo. REM Check if PowerShell script exists if not exist "fix_thumbnail_override.ps1" ( echo %RED%ERROR: fix_thumbnail_override.ps1 not found in current directory.%RST% echo %YLW%Please ensure the PowerShell script is in the same folder as this batch file.%RST% pause goto END ) REM Run PowerShell script as administrator powershell -ExecutionPolicy Bypass -Command "Start-Process PowerShell -ArgumentList '-ExecutionPolicy Bypass -File \"%~dp0fix_thumbnail_override.ps1\"' -Verb RunAs" echo. echo %GRN%OneDrive thumbnail override fix initiated.%RST% echo %GRY%Please check the PowerShell window for progress and results.%RST% echo. echo %CYN%After the fix completes:%RST% echo %GRY% 1. Restart your computer%RST% echo %GRY% 2. Re-run your thumbnail generation process%RST% echo %GRY% 3. Your custom thumbnails should now have priority!%RST% echo. goto END REM Print ssh Hydra command to wipe @eaDir when NAS cleanup failed (matches NASPATH from pasted R:\ path). :PRINT_HYDRA_CLEAR_EADIR if "%NASPATH%"=="" goto :eof echo %MAG%To clear locked @eaDir on Hydra: ssh in first.%RST% echo %GRY%Permission denied lines above name nested paths ^(e.g. editDesc, gameplay^).%RST% echo %GRY%Clear every @eaDir under the SAME folder you passed to nascleanup ^(NASPATH below^),%RST% echo %GRY%not only the subpath from the first error line.%RST% echo %BLD%%YLW% sudo find "%NASPATH%" -depth -type d -name '@eaDir' -exec sudo rm -rf {} +%RST% goto :eof REM Remove folder-level @eaDir on the pasted Windows path (same files as NAS over SMB). :WIN_REMOVE_LOCAL_EADIR if "%WINPATH%"=="" goto :eof if exist "%WINPATH%\@eaDir" ( echo %CYN%Removing "%WINPATH%\@eaDir" via Windows ^(SMB share^)...%RST% rd /s /q "%WINPATH%\@eaDir" 2>nul if exist "%WINPATH%\@eaDir" ( echo %YLW%WARNING: Could not remove @eaDir; try PowerShell as admin or delete in Explorer.%RST% ) ) goto :eof REM Remove every eaDir_tmp under pasted path (including subfolders e.g. gameplay\eaDir_tmp). :WIN_REMOVE_LOCAL_EADIR_TMP if "%WINPATH%"=="" goto :eof echo %CYN%Removing all eaDir_tmp folders under "%WINPATH%" ^(recursive, SMB^)...%RST% if not exist "%~dp0remove_eadir_tmp_recursive.ps1" ( echo %RED%ERROR: remove_eadir_tmp_recursive.ps1 not found next to this batch file.%RST% goto :eof ) powershell -NoProfile -ExecutionPolicy Bypass -File "%~dp0remove_eadir_tmp_recursive.ps1" "%WINPATH%" goto :eof :END echo %DIM%Press any key to continue . . .%RST% pause >nul