@echo off
SetLocal EnableDelayedExpansion
set title1=Convert to GIF
title %title1%

if "%~1"=="" ( echo ERROR: NO INPUT & echo  & pause & goto :eof ) else ( title %title1%^: "%~nx1")

:: you can override exe paths here. for example, set "ffmpeg=C:\ffmpeg\bin\ffmpeg.exe"
set "ffmpeg=ffmpeg.exe"

:: only these file extensions will be processed by the script
set supported_formats=avi,bik,flv,m2ts,m4p,m4v,mkv,mov,mp2,mp4,mpg,mpeg,mpe,mpv,mts,qt,swf,wmv,xmf,webm

:: optional default subfolder to output to. for example, set "subfolder=converted"
set subfolder=

:CheckFFMPEG
if not exist "%ffmpeg%" (
	if exist "%~dp0ffmpeg.exe" set "ffmpeg=%~dp0ffmpeg.exe" & goto :CheckFFPROBE
	ffmpeg.exe>nul 2>&1
	if !errorlevel!==9009 CALL :PrintMessage "ERROR: FFMPEG NOT FOUND / INSTALLED. EXITING." & echo  & pause & goto :eof
)

:CountFiles

:: count files
set total=0
for %%F in (%*) do (
	if not "%%~xF"=="" (
		for %%A in (%supported_formats%) do (
			if /i %%~xF==.%%A set /a total=!total!+1
		)
	)
)
if %total%==0 echo  & CALL :PrintMessage "NO FILES TO PROCESS" "EXITING" & pause>nul & goto :eof
if %total% GTR 1 title %title1%^: %total% files

:Resize
if defined width goto :FrameRate
set width=
echo.
set /p width="resize (width) = "
if not "!width!"=="" (
	set "width=!width: =!"
	for /f "delims=1234567890" %%A in ('echo !width!') do ( echo invalid number & goto :Resize )
	if !width! LSS 5 echo invalid number & goto :Resize
)

:FrameRate
if defined framerate goto :ConformFilters
set frate=
echo.
set /p frate="framerate = "
if not "!frate!"=="" (
	set "frate=!frate: =!"
	for /f "delims=1234567890" %%A in ('echo !frate!') do ( echo invalid number & goto :FrameRate)
	if !frate! LSS 1 echo invalid number & goto :FrameRate
	set "newframerate=!frate!"
)

:ConformFilters
if not "!width!"=="" set filters=scale='min(!width!,iw)':-1:flags=lanczos
if not "!newframerate!"=="" ( if "!filters!"=="" ( set filters=fps=!newframerate!) else ( set filters=!filters!,fps=!newframerate!))
if not "!filters!"=="" ( set filters=-vf "!filters!,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse") else ( set filters=-vf "split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse")

:BatchProcess
set current=
for %%F in (%*) do (
	if not "%%~xF"=="" (
		for %%A in (%supported_formats%) do ( if /i %%~xF==.%%A CALL :ProcessFile "%~1")
	)
)
title Finished
goto :eof

:: MAIN ROUTINE
:ProcessFile
if "!current!"=="" ( set current=1) else ( set /a current=!current!+1)
if %total% GTR 1 set "ratio= !current!/!total!"
title %title1%^:!ratio! "%~nx1"
if not "%cd%\"=="%~dp1" cd /d "%~dp1"

:Add_Postfix
if exist "%~n1.gif" (
	for /L %%N in (1,1,1000) do (
		if not exist "%~n1_%%N.gif" ( set "postfix=_%%N" & goto :FFmpeg)
	)
)

:FFmpeg
"%ffmpeg%" -i "%~1" -an !filters! "%~n1!postfix!.gif"
if not !errorlevel!==0 CALL :ErrorSubroutine "!outpath!%~n1%suffix%!postfix!.%ext%"
goto :eof

:: if output file is empty, deletes it. prints some messages. stores goterror var.
:ErrorSubroutine
if "%~z1"=="0" del %1 & ( echo  & echo ERROR: FILE OUTPUT FAILED & echo.)
set goterror=true
pause
goto :eof

:: UTILITIES

:PrintMessage
echo.
echo ---------------------------------------------------------------
echo  %~1
if not "%~2"=="" echo  %~2
if not "%~3"=="" echo  %~3
if not "%~4"=="" echo  %~4
echo ---------------------------------------------------------------
goto :eof
