@echo off setlocal enabledelayedexpansion REM FastCompress v1.0 - Windows CMD Edition REM Interactive video compression tool using FFmpeg REM Author: Faiz Intifada REM Platform: Windows 7+ REM ============================================================================ REM Configuration REM ============================================================================ set "SCRIPT_DIR=%~dp0" set "FFMPEG_PATH=" set "SELECTED_FILE=" set "SUPPORTED_FORMATS=mp4 mkv avi mov webm" REM ============================================================================ REM Main Script REM ============================================================================ :main cls call :print_header echo [1/5] Checking FFmpeg availability... call :check_ffmpeg if "!FFMPEG_PATH!"=="" ( echo X FFmpeg not found! call :show_ffmpeg_install_menu if errorlevel 1 exit /b 1 cls call :print_header echo [1/5] Checking FFmpeg availability... echo + FFmpeg installed successfully! ) else ( echo + FFmpeg found: !FFMPEG_PATH! ) echo. echo [2/5] Scanning for video files... echo * Scanning: %SCRIPT_DIR% call :scan_video_files if errorlevel 1 ( echo. echo [ERROR] No video files found in current folder! echo. echo Supported formats: %SUPPORTED_FORMATS% echo. echo Please navigate to a folder containing video files and run again. echo. pause exit /b 1 ) echo + Found !VIDEO_COUNT! video file(s) REM Select video file call :show_file_selection_menu if errorlevel 1 ( echo. echo Operation cancelled. echo. pause exit /b 0 ) echo. echo + Selected: !SELECTED_FILENAME! (!SELECTED_SIZE! MB) REM Show compression menu call :show_compression_menu if errorlevel 1 exit /b 1 REM Get compression parameters call :get_compression_parameters !MENU_CHOICE! REM Compress video call :compress_video if errorlevel 1 ( echo. echo ====================================================== echo. echo COMPRESSION FAILED echo. echo ====================================================== echo. echo X Video compression failed. Check errors above. ) else ( echo. echo ====================================================== echo. echo COMPRESSION COMPLETED! echo. echo ====================================================== echo. echo + Your compressed video is ready to use! ) echo. echo ------------------------------------------------------ echo FastCompress v1.0 ^| by Faiz Intifada echo. pause exit /b 0 REM ============================================================================ REM Functions REM ============================================================================ :print_header echo. echo ====================================================== echo. echo FastCompress v1.0 echo Video Compression Made Easy echo. echo by Faiz Intifada echo. echo ====================================================== echo. goto :eof :check_ffmpeg REM Check if ffmpeg is in PATH where ffmpeg >nul 2>&1 if !errorlevel! equ 0 ( for /f "delims=" %%i in ('where ffmpeg') do set "FFMPEG_PATH=%%i" goto :eof ) REM Check in script directory if exist "%SCRIPT_DIR%ffmpeg.exe" ( set "FFMPEG_PATH=%SCRIPT_DIR%ffmpeg.exe" goto :eof ) set "FFMPEG_PATH=" goto :eof :show_ffmpeg_install_menu echo. echo ====================================================== echo FFmpeg Required echo ====================================================== echo. echo FastCompress needs FFmpeg to compress videos. echo. echo Options: echo 1. Auto-download FFmpeg (~130 MB, recommended) echo 2. View manual installation instructions echo 3. Exit echo. :ffmpeg_menu_loop set /p "choice=Select option (1-3): " if "%choice%"=="1" ( call :install_ffmpeg if errorlevel 1 ( echo. echo Installation failed. Please try manual installation. echo. pause exit /b 1 ) goto :eof ) if "%choice%"=="2" ( call :show_manual_install_instructions echo. echo After installing FFmpeg, please run this script again. echo. pause exit /b 1 ) if "%choice%"=="3" ( echo. echo Exiting... exit /b 1 ) echo Invalid selection. Please enter 1-3. goto :ffmpeg_menu_loop :install_ffmpeg echo. echo ====================================================== echo Installing FFmpeg echo ====================================================== echo. echo [1/4] Downloading FFmpeg... echo Source: GitHub BtbN/FFmpeg-Builds echo Size: ~130 MB (this may take a few minutes) echo. echo Downloading... Please wait (no progress bar in CMD) echo. REM Use PowerShell to download set "FFMPEG_URL=https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-win64-gpl.zip" set "TEMP_ZIP=%TEMP%\ffmpeg_temp.zip" set "TARGET_PATH=%SCRIPT_DIR%ffmpeg.exe" powershell -Command "$ProgressPreference = 'SilentlyContinue'; try { Invoke-WebRequest -Uri '%FFMPEG_URL%' -OutFile '%TEMP_ZIP%' -UseBasicParsing -ErrorAction Stop; exit 0 } catch { exit 1 }" if errorlevel 1 ( echo X Download failed! echo. echo Please check your internet connection. del "%TEMP_ZIP%" >nul 2>&1 exit /b 1 ) echo + Download completed! echo. echo [2/4] Extracting FFmpeg... REM Use PowerShell to extract powershell -Command "try { Add-Type -AssemblyName System.IO.Compression.FileSystem; [System.IO.Compression.ZipFile]::ExtractToDirectory('%TEMP_ZIP%', '%TEMP%\ffmpeg_extract'); exit 0 } catch { exit 1 }" if errorlevel 1 ( echo X Extraction failed! del "%TEMP_ZIP%" >nul 2>&1 exit /b 1 ) REM Find ffmpeg.exe in extracted files for /r "%TEMP%\ffmpeg_extract" %%f in (ffmpeg.exe) do ( copy "%%f" "%TARGET_PATH%" >nul 2>&1 set "FOUND=1" goto :found_ffmpeg ) :found_ffmpeg if not defined FOUND ( echo X ffmpeg.exe not found in archive! rd /s /q "%TEMP%\ffmpeg_extract" >nul 2>&1 del "%TEMP_ZIP%" >nul 2>&1 exit /b 1 ) echo + Extraction completed! echo. echo [3/4] Installing FFmpeg... echo + FFmpeg installed to: %TARGET_PATH% echo. echo [4/4] Verifying installation... REM Test ffmpeg "%TARGET_PATH%" -version >nul 2>&1 if errorlevel 1 ( echo ! Verification failed, but file exists ) else ( echo + FFmpeg is working correctly! ) REM Cleanup rd /s /q "%TEMP%\ffmpeg_extract" >nul 2>&1 del "%TEMP_ZIP%" >nul 2>&1 echo. echo ====================================================== echo Installation Successful! echo ====================================================== echo. set "FFMPEG_PATH=%TARGET_PATH%" pause exit /b 0 :show_manual_install_instructions cls echo. echo ====================================================== echo Manual FFmpeg Installation echo ====================================================== echo. echo Option A: Portable (Recommended) echo 1. Download FFmpeg from: echo https://github.com/BtbN/FFmpeg-Builds/releases echo. echo 2. Extract the zip file echo. echo 3. Copy ffmpeg.exe to this folder: echo %SCRIPT_DIR% echo. echo Option B: System-wide echo 1. Download FFmpeg from: echo https://ffmpeg.org/download.html echo. echo 2. Extract and add to Windows PATH echo. echo 3. Restart Command Prompt echo. goto :eof :scan_video_files set "VIDEO_COUNT=0" set "VIDEO_LIST=" for %%e in (%SUPPORTED_FORMATS%) do ( for %%f in ("%SCRIPT_DIR%*.%%e") do ( if exist "%%f" ( set /a VIDEO_COUNT+=1 set "VIDEO_!VIDEO_COUNT!=%%~f" set "VIDEO_NAME_!VIDEO_COUNT!=%%~nxf" REM Get file size for %%s in ("%%f") do set "SIZE=%%~zs" set /a "SIZE_MB=!SIZE! / 1048576" set "VIDEO_SIZE_!VIDEO_COUNT!=!SIZE_MB!" ) ) ) if !VIDEO_COUNT! equ 0 exit /b 1 exit /b 0 :show_file_selection_menu if !VIDEO_COUNT! equ 1 ( echo. echo [3/5] Video file detected echo. echo File: !VIDEO_NAME_1! echo Size: !VIDEO_SIZE_1! MB echo. set /p "response=Proceed with this file? (y/n): " if /i "!response!"=="y" ( set "SELECTED_FILE=!VIDEO_1!" set "SELECTED_FILENAME=!VIDEO_NAME_1!" set "SELECTED_SIZE=!VIDEO_SIZE_1!" exit /b 0 ) else ( exit /b 1 ) ) REM Multiple files cls call :print_header echo [3/5] Select video to compress echo ====================================================== echo Enter number to select echo ====================================================== echo. for /l %%i in (1,1,!VIDEO_COUNT!) do ( echo %%i. !VIDEO_NAME_%%i! - !VIDEO_SIZE_%%i! MB ) echo. set /p "file_choice=Enter number (1-!VIDEO_COUNT!): " REM Validate choice if !file_choice! lss 1 exit /b 1 if !file_choice! gtr !VIDEO_COUNT! exit /b 1 set "SELECTED_FILE=!VIDEO_%file_choice%!" set "SELECTED_FILENAME=!VIDEO_NAME_%file_choice%!" set "SELECTED_SIZE=!VIDEO_SIZE_%file_choice%!" exit /b 0 :show_compression_menu echo. echo [4/5] Select compression quality echo. echo ====================================================== echo VIDEO COMPRESSION OPTIONS echo ====================================================== echo. echo 1. High Quality (CRF 23, ~80%% original size) echo Preset: medium, Audio: 192k echo. echo 2. Medium Quality (CRF 28, ~60%% original size) echo Preset: medium, Audio: 128k echo. echo 3. Low Quality (CRF 32, ~40%% original size) echo Preset: fast, Audio: 96k echo. echo 4. Custom Settings echo Manual CRF and preset configuration echo. :compression_menu_loop set /p "MENU_CHOICE=Select option (1-4): " if "%MENU_CHOICE%"=="1" exit /b 0 if "%MENU_CHOICE%"=="2" exit /b 0 if "%MENU_CHOICE%"=="3" exit /b 0 if "%MENU_CHOICE%"=="4" exit /b 0 echo Invalid selection. Please enter 1-4. goto :compression_menu_loop :get_compression_parameters set "choice=%1" if "%choice%"=="1" ( set "CRF=23" set "PRESET=medium" set "AUDIO_BITRATE=192k" set "QUALITY_NAME=High Quality" goto :eof ) if "%choice%"=="2" ( set "CRF=28" set "PRESET=medium" set "AUDIO_BITRATE=128k" set "QUALITY_NAME=Medium Quality" goto :eof ) if "%choice%"=="3" ( set "CRF=32" set "PRESET=fast" set "AUDIO_BITRATE=96k" set "QUALITY_NAME=Low Quality" goto :eof ) if "%choice%"=="4" ( echo. echo [CUSTOM SETTINGS] echo. :crf_input_loop set /p "CRF=Enter CRF value (0-51, lower = better quality): " if !CRF! lss 0 goto :crf_input_loop if !CRF! gtr 51 goto :crf_input_loop echo. echo Available presets: echo 1. ultrafast (fastest, larger file) echo 2. fast echo 3. medium (balanced) echo 4. slow (slower, better compression) echo. :preset_input_loop set /p "preset_choice=Select preset (1-4): " if "!preset_choice!"=="1" set "PRESET=ultrafast" if "!preset_choice!"=="2" set "PRESET=fast" if "!preset_choice!"=="3" set "PRESET=medium" if "!preset_choice!"=="4" set "PRESET=slow" if not defined PRESET goto :preset_input_loop REM Calculate audio bitrate if !CRF! leq 25 ( set "AUDIO_BITRATE=192k" ) else if !CRF! leq 30 ( set "AUDIO_BITRATE=128k" ) else ( set "AUDIO_BITRATE=96k" ) set "QUALITY_NAME=Custom (CRF !CRF!, !PRESET!)" goto :eof ) goto :eof :compress_video REM Generate output filename for %%f in ("%SELECTED_FILE%") do ( set "OUTPUT_DIR=%%~dpf" set "OUTPUT_NAME=%%~nf_compressed%%~xf" ) set "OUTPUT_FILE=%OUTPUT_DIR%%OUTPUT_NAME%" REM Check if output exists if exist "%OUTPUT_FILE%" ( echo. echo [WARNING] Output file already exists: echo %OUTPUT_FILE% echo. set /p "overwrite=Overwrite existing file? (y/n): " if /i not "!overwrite!"=="y" ( echo. echo Operation cancelled. exit /b 1 ) ) echo. echo [5/5] Confirmation echo. echo ====================================================== echo Input File: %SELECTED_FILENAME% echo Output File: %OUTPUT_NAME% echo Quality: %QUALITY_NAME% echo Settings: CRF %CRF%, Preset %PRESET%, Audio %AUDIO_BITRATE% echo ====================================================== echo. set /p "confirm=Proceed with compression? (y/n): " if /i not "!confirm!"=="y" ( echo. echo Operation cancelled. exit /b 1 ) echo. echo ====================================================== echo STARTING COMPRESSION echo ====================================================== echo. echo Quality: %QUALITY_NAME% echo Input: %SELECTED_FILE% echo Output: %OUTPUT_FILE% echo. echo Compressing... This may take a while echo (Progress not shown in CMD - please wait) echo. REM Get start time set "START_TIME=%time%" REM Run FFmpeg "%FFMPEG_PATH%" -i "%SELECTED_FILE%" -vcodec libx264 -crf %CRF% -preset %PRESET% -acodec aac -b:a %AUDIO_BITRATE% -y "%OUTPUT_FILE%" >nul 2>&1 if errorlevel 1 ( echo. echo X Compression failed! exit /b 1 ) echo + Compression completed successfully! REM Get file sizes for %%s in ("%SELECTED_FILE%") do set "INPUT_BYTES=%%~zs" for %%s in ("%OUTPUT_FILE%") do set "OUTPUT_BYTES=%%~zs" set /a "INPUT_MB=!INPUT_BYTES! / 1048576" set /a "OUTPUT_MB=!OUTPUT_BYTES! / 1048576" set /a "REDUCTION=100 - (!OUTPUT_BYTES! * 100 / !INPUT_BYTES!)" echo. echo File Size Comparison: echo Original: !INPUT_MB! MB echo Compressed: !OUTPUT_MB! MB echo Reduction: !REDUCTION!%% echo. echo Output saved to: %OUTPUT_FILE% exit /b 0