@echo off
:SET ECHO FOR GENERATED BATS
SET ECHO=OFF

: This bat will convert AVC/AAC.flv files to AVC/AC3.mkv files 
: and H.263/MP3 and VP6/MP3.flv files to MPEG-4 DIVX/MP3.mp4 files.
: This should make these files playable and streamable with all players.
: Some of these files from Hulu and YouTube etc do not jump well with MPC, 
: abort WMP and the AVC/AAC files will not stream in VLC, so are better converted.

if "%~x1"==".flv" goto :getrate

echo Source is not an .flv file. Exiting...
pause
goto :exit 

:getrate

: Check if Rate data is already in file header.
C:\Programs\MediaInfo_CLI\MediaInfo.exe --Inform=Video;%%FrameRate%% %1 > C:\TEMP\media.txt
: Read MI Value string back in 
set /p RATE= < C:\TEMP\media.txt
if .%RATE% == . goto :getmetadatarate
ECHO.
ECHO FRAME RATE OF %RATE% FPS LOADED FROM MEDIAINFO DATA
ECHO.
: Here we have header rate so we do not need to mux it in with mkvmerge
set merge=YES

goto :getformat


: Check if framerate or videoframerate is in flv Metadata 
: ------------------------------------------------------- 
: ffmpeg will not insert the avc frame rate into the mkv header
: from the flv metadata or use the -r option to do so, and so
: we need to extract it from the flv metadata and add it with mkvmerge.

:getmetadatarate
set merge=YES

:Get the rate out of metadata into one data line
C:\Programs\FFMPEG\ffmpeg.exe -i %1          2> C:\Temp\Meta.txt
TYPE C:\Temp\Meta.txt | FIND "framerate" > C:\TEMP\Rate.txt
: ADD AN EOL
ECHO.>> C:\TEMP\Rate.txt

: Create C:\TEMP\Rate.BAT WITH this line
: Enter the new time: videoframerate : nn
ECHO @ECHO %ECHO%			     > C:\TEMP\Rate.Bat
TYPE C:\Temp\Rate.txt | TIME | FIND "Enter" >> C:\TEMP\Rate.Bat

: CREATE C:\TEMP\ENTER.BAT TO SET Rate IN  RATE ENVIRONMENT Variable 
: RATE IS THE 6th Parameter
>  C:\TEMP\ENTER.BAT ECHO @ECHO %ECHO%
>> C:\TEMP\ENTER.BAT ECHO IF NOT .%%6 == . SET RATE=%%6

: CALL C:\TEMP\NAME.BAT TO RUN C:\TEMP\ENTER.BAT & SET FILENAME IN RATE VARIABLE
:SET DEFAULT DIRECTORY FOR "ENTER.BAT"
C:
CD C:\TEMP
CALL C:\TEMP\Rate.Bat

: ----------------------------------------------------------------
 
: Verify we now have a videoframe rate
if .%RATE% == . goto :getmimetadata
ECHO.
ECHO FRAME RATE OF %RATE% FPS LOADED FROM FFMPEG METADATA
ECHO.
GOTO :getformat

:getmimetadata
: Last try is to get Framerate from Mediainfo Metadata
: Note MI has no query for Metadata - Dump all info

C:\Programs\MediaInfo_CLI\MediaInfo.exe %1 > C:\TEMP\Meta.txt
TYPE C:\Temp\Meta.txt | FIND "framerate" > C:\TEMP\Rate.txt
: ADD AN EOL
ECHO.>> C:\TEMP\Rate.txt

: Create C:\TEMP\Rate.BAT WITH this line
: Enter the new time: videoframerate : nn
ECHO @ECHO %ECHO%			     > C:\TEMP\Rate.Bat
TYPE C:\Temp\Rate.txt | TIME | FIND "Enter" >> C:\TEMP\Rate.Bat

: CREATE C:\TEMP\ENTER.BAT TO SET Rate IN  RATE ENVIRONMENT Variable 
: RATE IS THE 6th Parameter
>  C:\TEMP\ENTER.BAT ECHO @ECHO %ECHO%
>> C:\TEMP\ENTER.BAT ECHO IF NOT .%%6 == . SET RATE=%%6

: CALL C:\TEMP\NAME.BAT TO RUN C:\TEMP\ENTER.BAT & SET FILENAME IN RATE VARIABLE
:SET DEFAULT DIRECTORY FOR "ENTER.BAT"
C:
CD C:\TEMP
CALL C:\TEMP\Rate.Bat

: ----------------------------------------------------------------
 
: Verify we now have a videoframe rate

if NOT .%RATE% == . ECHO FRAME RATE OF %RATE% FPS LOADED FROM MEDIAINFO METADATA
if NOT .%RATE% == . GOTO :getformat
ECHO.
echo .flv METADATA DOES NOT CONTAIN FRAME RATE.
ECHO A FRAME RATE OF 15 FPS IS ASSUMED.
ECHO.
SET RATE=15

:getformat
: Check for AVC, VP6 or H263 Video Stream.
C:\Programs\MediaInfo_CLI\MediaInfo.exe --Inform=Video;%%Format%% %1 > C:\TEMP\media.txt
: Read MI Value string back in 
set /p format= < C:\TEMP\media.txt
 
if ".%format%" == ".AVC"    goto :CONVERTAVC
if ".%format%" == ".VP6"    goto :CONVERTVP6
if ".%format%" == ".H.263"  goto :CONVERTVP6

echo .flv file does not contain AVC, VP6 or H.263 video stream. Exiting ....
pause
goto :exit

:CONVERTVP6
: CONVERT VP6 and H.263 VIDEO TO AVC and AUDIO to AC3 into .mkv file

echo.
echo This .flv file contains %format% video and does not need to be converted.
echo. 
set /p Quit= Enter Q to quit or just enter to proceed.  
if .%Quit% == .Q goto :exit
if .%Quit% == .q goto :exit

: Ensure output does not exist.
if exist %1.mkv erase %1.mkv
if exist %1.avi erase %1.avi

: Need to specify aspect ratio to ffmpeg so get current value
C:\Programs\MediaInfo_CLI\MediaInfo.exe --Inform=Video;%%DisplayAspectRatio%% %1 > C:\TEMP\media.txt
: Read MI Value string back in 
set /p aspect= < C:\TEMP\media.txt
ECHO aspect=%aspect%.
: std = 1.333  wide = 1.787 mid point = 1.53
set AR=4:3
if %aspect% == 1.333  set AR=4:3
if %aspect% == 1.787  set AR=16:9
if %aspect% GEQ 1.6   set AR=16:9

: Need to specify scale to ffmpeg so get current value
C:\Programs\MediaInfo_CLI\MediaInfo.exe --Inform=Video;%%Width%% %1 > C:\TEMP\media.txt
: Read MI Value string back in 
set /p width= < C:\TEMP\media.txt
echo width=%width%.
if .width == . set scale=640 
set /a width=%width%/2
set /a width=%width%*2

C:\Programs\MediaInfo_CLI\MediaInfo.exe --Inform=Video;%%Height%% %1 > C:\TEMP\media.txt
: Read MI Value string back in 
set /p height= < C:\TEMP\media.txt
echo height=%height%.
if .height == . set height=360
set /a height=%height%/2
set /a height=%height%*2

set scale=%width%x%height%


: Need to specify bitrate to ffmpeg so get current value
C:\Programs\MediaInfo_CLI\MediaInfo.exe --Inform=Video;%%BitRate%% %1 > C:\TEMP\media.txt
: Read MI Value string back in 
set /p bitrate= < C:\TEMP\media.txt
echo bitrate=%bitrate%.
if .bitrate == . set bitrate=1000

: Need to specify duration to ffmpeg so get current value
C:\Programs\MediaInfo_CLI\MediaInfo.exe --Inform=Video;%%Duration/String3%% %1 > C:\TEMP\media.txt
: Read MI Value string back in 
set /p duration= < C:\TEMP\media.txt
echo duration=%duration%
if .duration == . set duration=01:00:00

set preset="C:\Programs\FFMPEG\Share\ffmpeg\libx264-medium.ffpreset"

"C:\Programs\FFMPEG\ffmpeg.exe" -i %1 -vcodec mpeg4 -vtag xvid -b %bitrate% -r %rate% -aspect %aspect% -s %scale% -t %duration% -acodec copy %1.avi

:"C:\Programs\FFMPEG\ffmpeg.exe" -i %1 -vcodec libx264 -fpre %preset% -b %bitrate% -r %rate% -aspect %aspect% -s %scale% -t %duration% -acodec ac3 -ar 48000 -ab 160kb -ac 2 %1.mkv

goto :exit


:CONVERTAVC
: COPY VIDEO and CONVERT AUDIO TO AC3 into .mkv file

if %MERGE% == YES goto :mergerate

: Ensure output does not exist.
if exist %1.mkv erase %1.mkv 

"C:\Programs\FFMPEG\ffmpeg.exe" -i %1 -f matroska -vcodec copy -acodec ac3 -ar 48000 -ab 160kb -ac 2 %1.mkv 

goto :exit
 
:mergerate
: Erase interim file
if exist C:\TEMP\NORATE.MKV erase C:\TEMP\NORATE.MKV
: Ensure final output does not exist.
if exist %1.mkv erase %1.mkv 
 
"C:\Programs\FFMPEG\ffmpeg.exe" -i %1 -f matroska -vcodec copy -acodec ac3 -ar 48000 -ab 160kb -ac 2 C:\TEMP\NORATE.MKV

: Now use mkvmerge to insert framerate in mkv header

Echo.
Echo Now Adding Video FrameRate of %RATE% to mkv %1 Header with mkvmerge.

"C:\Program Files (x86)\MKVtoolnix\mkvmerge.exe" --quiet -o %1.mkv --default-duration 1:%RATE%fps C:\TEMP\NORATE.MKV > nul


:exit

:cleanup
if exist C:\TEMP\NORATE.MKV erase C:\TEMP\NORATE.MKV > nul
if exist C:\Temp\ENTER.BAT erase C:\Temp\ENTER.BAT
if exist C:\Temp\Meta.txt erase C:\Temp\Meta.txt
if exist C:\Temp\Rate.BAT erase C:\Temp\Rate.BAT
if exist C:\Temp\Rate.txt erase C:\Temp\Rate.txt
if exist C:\Temp\ENTER.BAT erase C:\Temp\ENTER.BAT

Echo.
echo Conversion Complete

if .%ECHO% == .ON Pause

PAUSE