@echo off
setlocal enabledelayedexpansion

:: =====================================================
:: Windows Batch (.bat) version - Video Mosaic Script
:: =====================================================

:: ====================== CONFIG ======================
set "inputFilename=The_Scarlet_Empress_1934_a_film_directed_by_Josef_von_Sternberg_with_Marlene_Dietrich_John_Lodge_Louise_Dresser_Sam_Jaffe-1378964146886.mp4"
set "metadataTitle=The.Scarlet.Empress.1934"

set scaleSize_x=436
set scaleSize_y=320
set fileType=webm

set EXTRACTCLIPS=true
set COMBINECLIPS=false
set CREATEMOSAIC=true
set RANDOM_TIMECODES=false
set TESTRANDOM=false

set LOG_FILENAME=log_file.txt

:: Arrays (9 clips)
set out_Filenames[0]=input1
set out_Filenames[1]=input2
set out_Filenames[2]=input3
set out_Filenames[3]=input4
set out_Filenames[4]=input5
set out_Filenames[5]=input6
set out_Filenames[6]=input7
set out_Filenames[7]=input8
set out_Filenames[8]=input9

set out_Timejumps[0]=00:00:58
set out_Timejumps[1]=00:04:58
set out_Timejumps[2]=00:04:49
set out_Timejumps[3]=00:10:56
set out_Timejumps[4]=00:20:29
set out_Timejumps[5]=00:21:18
set out_Timejumps[6]=00:23:41
set out_Timejumps[7]=00:24:10
set out_Timejumps[8]=00:28:18

set out_Timelength[0]=00:00:05
set out_Timelength[1]=00:00:05
set out_Timelength[2]=00:00:05
set out_Timelength[3]=00:00:05
set out_Timelength[4]=00:00:05
set out_Timelength[5]=00:00:05
set out_Timelength[6]=00:00:05
set out_Timelength[7]=00:00:05
set out_Timelength[8]=00:00:05

set out_bitRates[0]=2M
set out_bitRates[1]=2M
set out_bitRates[2]=2M
set out_bitRates[3]=2M
set out_bitRates[4]=2M
set out_bitRates[5]=2M
set out_bitRates[6]=2M
set out_bitRates[7]=2M
set out_bitRates[8]=2M

set out_subtitles[0]=null
set out_subtitles[1]=null
set out_subtitles[2]=null
set out_subtitles[3]=null
set out_subtitles[4]=null
set out_subtitles[5]=null
set out_subtitles[6]=null
set out_subtitles[7]=null
set out_subtitles[8]=null

set ss_Timejump=00:00:01
set /a "scaleSize_x3=%scaleSize_x%*3"
set /a "scaleSize_y3=%scaleSize_y%*3"
set "scaleSize=%scaleSize_x%x%scaleSize_y%"

:: =====================================================
:: 0. TEST RANDOM (optional)
if "%TESTRANDOM%"=="true" (
    echo ===================== >> %LOG_FILENAME%
    echo %date% %time% >> %LOG_FILENAME%
    echo TESTRANDOM >> %LOG_FILENAME%
    for /l %%i in (0,1,10) do (
        set /a sec=!random! %% 60
        set /a min=!random! %% 60
        set /a hou=!random! %% 2
        echo. >> %LOG_FILENAME%
        echo %%i >> %LOG_FILENAME%
        echo !hou!:!min!:!sec! >> %LOG_FILENAME%
    )
    echo ===================== >> %LOG_FILENAME%
)

:: =====================================================
:: 1. EXTRACT CLIPS
if "%EXTRACTCLIPS%"=="true" (
    set libVid=libvpx
    :: set libVid=libvpx-vp9

    echo ===================== >> %LOG_FILENAME%
    echo %date% %time% >> %LOG_FILENAME%
    echo new_log_file >> %LOG_FILENAME%
    echo %metadataTitle% >> %LOG_FILENAME%
    echo %scaleSize% >> %LOG_FILENAME%

    for /l %%i in (0,1,8) do (
        if "%RANDOM_TIMECODES%"=="true" (
            set /a sec=!random! %% 60
            set /a min=!random! %% 60
            set /a hou=!random! %% 2
            set "timejump=!hou!:!min!:!sec!"
        ) else (
            set "timejump=!out_Timejumps[%%i]!"
        )

        set "timelength=!out_Timelength[%%i]!"
        set "bitrate=!out_bitRates[%%i]!"
        set "subs=!out_subtitles[%%i]!"

        echo =====================
        echo !out_Filenames[%%i]!
        echo !timejump!
        echo !timelength!
        echo ===================== >> %LOG_FILENAME%
        echo !out_Filenames[%%i]! >> %LOG_FILENAME%
        echo !timejump! >> %LOG_FILENAME%
        echo !timelength! >> %LOG_FILENAME%
        echo ===================== >> %LOG_FILENAME%

        echo Processing !out_Filenames[%%i]! at !timejump! for !timelength!

        :: Pass 1
        ffmpeg -ss !timejump! -i "%inputFilename%" ^
               -c:v !libVid! -b:v !bitrate! -s %scaleSize% ^
               -ss %ss_Timejump% -t !timelength! ^
               -vf !subs! -sn -an ^
               -metadata title="%metadataTitle%" ^
               -f %fileType% -y -pass 1 -passlogfile "pass_%%i" NUL

        :: Pass 2
        ffmpeg -ss !timejump! -i "%inputFilename%" ^
               -c:v !libVid! -b:v !bitrate! -s %scaleSize% ^
               -ss %ss_Timejump% -t !timelength! ^
               -vf !subs! -sn -an ^
               -metadata title="%metadataTitle%" ^
               -f %fileType% -y -pass 2 -passlogfile "pass_%%i" "!out_Filenames[%%i]!.%fileType%"
    )
)

:: =====================================================
:: 3. CREATE 3x3 MOSAIC
if "%CREATEMOSAIC%"=="true" (
    set mosaic_bitRate=1.5M
    set mosaic_libVid=libvpx-vp9

    echo Creating 3x3 mosaic...

    :: Build the complex filter (long but necessary)
    set "filter=nullsrc=size=%scaleSize_x3%x%scaleSize_y3% [base];"
    set "filter=!filter! [0:v] setpts=PTS-STARTPTS, scale=%scaleSize% [v0];"
    set "filter=!filter! [1:v] setpts=PTS-STARTPTS, scale=%scaleSize% [v1];"
    set "filter=!filter! [2:v] setpts=PTS-STARTPTS, scale=%scaleSize% [v2];"
    set "filter=!filter! [3:v] setpts=PTS-STARTPTS, scale=%scaleSize% [v3];"
    set "filter=!filter! [4:v] setpts=PTS-STARTPTS, scale=%scaleSize% [v4];"
    set "filter=!filter! [5:v] setpts=PTS-STARTPTS, scale=%scaleSize% [v5];"
    set "filter=!filter! [6:v] setpts=PTS-STARTPTS, scale=%scaleSize% [v6];"
    set "filter=!filter! [7:v] setpts=PTS-STARTPTS, scale=%scaleSize% [v7];"
    set "filter=!filter! [8:v] setpts=PTS-STARTPTS, scale=%scaleSize% [v8];"
    set "filter=!filter! [base][v0] overlay=shortest=1:x=0:y=0 [tmp1];"
    set "filter=!filter! [tmp1][v1] overlay=shortest=1:x=%scaleSize_x%:y=0 [tmp2];"
    set "filter=!filter! [tmp2][v2] overlay=shortest=1:x=%scaleSize_x%*2:y=0 [tmp3];"
    set "filter=!filter! [tmp3][v3] overlay=shortest=1:x=0:y=%scaleSize_y% [tmp4];"
    set "filter=!filter! [tmp4][v4] overlay=shortest=1:x=%scaleSize_x%:y=%scaleSize_y% [tmp5];"
    set "filter=!filter! [tmp5][v5] overlay=shortest=1:x=%scaleSize_x%*2:y=%scaleSize_y% [tmp6];"
    set "filter=!filter! [tmp6][v6] overlay=shortest=1:x=0:y=%scaleSize_y%*2 [tmp7];"
    set "filter=!filter! [tmp7][v7] overlay=shortest=1:x=%scaleSize_x%:y=%scaleSize_y%*2 [tmp8];"
    set "filter=!filter! [tmp8][v8] overlay=shortest=1:x=%scaleSize_x%*2:y=%scaleSize_y%*2"

    ffmpeg -i input1.%fileType% -i input2.%fileType% -i input3.%fileType% ^
           -i input4.%fileType% -i input5.%fileType% -i input6.%fileType% ^
           -i input7.%fileType% -i input8.%fileType% -i input9.%fileType% ^
           -filter_complex "!filter!" ^
           -c:v !mosaic_libVid! -b:v !mosaic_bitRate! ^
           -metadata title="%metadataTitle%" ^
           -y "mosaic_3x3.%fileType%"

    echo Mosaic created: mosaic_3x3.%fileType%
)

echo.
echo Script finished.
pause