Last active
June 3, 2016 11:17
-
-
Save abakum/4813bd2749b4cb3dee15b062942b4f50 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@echo off | |
setlocal enableDelayedExpansion | |
set debug= | |
set Yandex=y: | |
set Google=z: | |
rem Please do not use path with space | |
set unxU=%Yandex%\PortableApps\UnxUtils\usr\local\wbin | |
set x64=32 | |
if EXIST "%windir%\SysWOW64" set x64=64 | |
set msys=c:\msys%x64%\usr\bin | |
set mingw=c:\msys%x64%\mingw%x64%\bin | |
if "%x64%" == "32" set x64= | |
set cygwin=c:\cygwin%x64%\usr\bin | |
set mkvTN=%Yandex%\PortableApps\mkvToolNix%x64% | |
set ffMPG=%Yandex%\PortableApps\ffMpeg%x64%\bin | |
set lang=rus | |
set codePage=1251 | |
chcp %codePage%>nul | |
set TPUB=Константин Абакумов | |
set CP=UTF-8 | |
ver | find /I "XP" > nul && set CP=Windows-%codePage% | |
title %* | |
cls | |
echo Например: | |
echo файл "d:\av\2015\20150517 Отчетный\00005.MTS" из видеокамеры | |
echo Если файл "d:\av\2015\20150517 Отчетный\descript.ion" содержит комментарий для 00005.MTS: | |
echo 00005.MTS 00:01:01.880 00:02:49.000 Не слышно песен#TPE1 Юлия Абакумова#THANKS_TO Елена Михеева#TIT3 Люби Россию в непогоду#TCOM Эдуард Артемьев#TEXT Валерий Шумилин\n00:02:54.200 00:05:30.200 Под высоким куполом#TPE1 TPE1 Хор Миллеровской ДШИ#TPE2 Галина Брылёва#TPE3 Елена Михеева#TIT3 Россия Матушка#TCOM Оксана Кривова#TEXT Наталья Бондарева | |
echo 01)Будет создан .cut файл "d:\av\2015\20150517 Отчетный\00005.MTS.cut" (в этом случае редактировать его нет смысла) | |
echo Или если комментария нет, но файл "d:\av\2015\20150517 Отчетный\00005.MTS.cut" содержит: | |
echo 00:01:01.880 00:02:49.000 Не слышно песен#TPE1 Юлия Абакумова#THANKS_TO Елена Михеева#TIT3 Люби Россию в непогоду#TCOM Эдуард Артемьев#TEXT Валерий Шумилин | |
echo 00:02:54.200 00:05:30.200 Под высоким куполом#TPE1 Хор Миллеровской ДШИ#TPE2 Галина Брылёва#TPE3 Елена Михеева#TIT3 Россия Матушка#TCOM Оксана Кривова#TEXT Наталья Бондарева | |
echo Если строка комментария или .cut файла начинается с ' то эта часть не выполняется ('00:02:54.200 ...) | |
echo Если часть начинается с начала файла вместо 00:00:00.000 ставим - (- 00:02:49.000 ...) | |
echo Если часть идёт до конца файла ставим (00:01:01.880 - ...) | |
echo Если часть идёт до конца файла и заканчивается в следующем файле ставим (00:01:01.880 00006.MTS ...) и будет создан файл "d:\av\2015\20150517 Отчетный\00005_.mkv" | |
echo Если несколько исполнителей отделяем их слэшем (... #TPE1 Юлия Абакумова/Хор Миллеровской ДШИ) | |
echo Если первым тэгом идёт #Исполнитель (а не #TPE1 Исполнитель), то .mp3 файлы 8) не создадутся | |
echo После запуска cut.bat "d:\av\2015\20150517 Отчетный\00005.MTS" (например через sendTo), | |
echo или после запуска cut.bat "d:\av\2015\20150517 Отчетный\00005.MTS.cut" (через sendTo или через ассоциацию .cut файла c cut.bat): | |
echo 02)Появится .dur файл. Удаление его приведёт к обновление 4)-8) | |
echo 03)descript.ion (в его отсутствии .cut файл) будут синхронизированы с облачным диском для проектов '%Yandex%' | |
echo 04)Появятся файлы субтитров "20150517 Отчетный 1431 Не слышно песен.srt" и "20150517 Отчетный 1432 Под высоким куполом.srt" в UTF-8 (для XP без recode.exe в 'Windows-%codePage%') | |
echo 05)Появятся файлы чаптеров "00005 Не слышно песен.xml" и "00005 Под высоким куполом.xml" | |
echo 06)Появятся файлы тэгов "00005#Не слышно песен.xml" и "00005#Под высоким куполом.xml" | |
echo 07)Появятся файлы mkv "d:\av\2015\20150517 Отчетный 1431 Не слышно песен.mkv" и "d:\av\2015\20150517 Отчетный 1432 Под высоким куполом.mkv" | |
echo 08)Появятся файлы mp3 "d:\av\2015\20150517 Отчетный 1431 Не слышно песен.mp3" и "d:\av\2015\20150517 Отчетный 1432 Под высоким куполом.mp3" | |
echo 09)В плэйлисты "d:\av\2015\20150517 Отчетный.X.m3u8" (где X mkv и mp3) "d:\av\2015\20150517 Отчетный\20150517 Отчетный.X.Y" (где X mkv, mp3 и mp4 а Y m3u, xspf) добавятся файлы 7) 8) | |
echo 10)Файлы на облачном диске для медиафайлов '%Google%' "%Google%\av\2015\*.mkv" будут переименованы в "%Google%\av\2015\*.mp4" | |
echo 11)Файлы субтитров "d:\av\2015\20150517 Отчетный\*.srt" синхронизуются с облачным диском для медиафайлов '%Google%' | |
echo 12)Плэйлист "d:\av\2015\20150517 Отчетный\20150517 Отчетный.mp4.xspf" синхронизуется с облачным диском для медиафайлов '%Google%' | |
echo Файлы 4) 5) 6) можно редактировать и запускать "d:\av\2015\20150517 Отчетный\00005.MTS.cut" | |
echo Если в исходном файле name.ext нет видео то появится промежуточный файл name.ext.mkv и 2x2.png если нет all.jpg или name.jpg | |
call :unxU mkvmerge | |
call :unxU mkvpropedit | |
call :unxU ffmpeg | |
call :unxU ffprobe | |
call :unxU recode | |
if DEFINED recodeU ( | |
set base64=!recodeU! -q /64 | |
set toUTF8=!recodeU! Windows-%codePage%..UTF-8 | |
) else ( | |
call :unxU iconv | |
if DEFINED iconvU set toUTF8=!iconvU! -s -f Windows-%codePage% -t UTF-8 | |
call :unxU base64 | |
if DEFINED base64U ( | |
set base64=!base64U! -di | |
) else ( | |
call :unxU openssl | |
if DEFINED opensslU set base64=!opensslU! base64 -d | |
) | |
) | |
call :unxU touch | |
call :unxU date | |
echo. | |
echo %0 %* | |
cd /d "%~dp1" | |
echo %CD% | |
:random | |
set x=%random% | |
if EXIST %x%.xml goto random | |
if EXIST %x%.cut goto random | |
for /f "tokens=*" %%P in ("%cd%") do ( | |
set parent=%%~nP | |
set dpp=%%~dpP | |
set pp=%%~pP | |
) | |
if DEFINED debug echo parent=%parent% dpp=%dpp% pp=%pp% | |
set copyD=1 | |
:main | |
if DEFINED debug echo :main %1 | |
set copyC=1 | |
set ext=%~x1 | |
if /i "%ext%"==".cut" ( | |
for /f "tokens=*" %%N in ("%~n1") do ( | |
set name=%%~nN | |
set ext=%%~xN | |
) | |
) else ( | |
set name=%~n1 | |
) | |
set P1=%~p1 | |
set ne=%name%%ext% | |
set cueSheet=%ne%.cut | |
set dur="%ne%.dur" | |
call :fromCloud | |
if EXIST descript.ion ( | |
call :toClouD | |
call :csc | |
set found= | |
for /f "useBackQ tokens=*" %%D in (descript.ion) do ( | |
set rest=%%D | |
call :descr !rest:,=.! | |
) | |
) | |
if not DEFINED found if EXIST "%cueSheet%" ( | |
call :toClouC | |
call :cutting | |
) | |
shift | |
if not "%~1"=="" goto main | |
call :toGoogle mp4Xspf | |
call :toGoogle mp4M3u8 | |
title Чтобы видеть кириллицу установите TrueType шрифт для консоли, а заодно и размер окна. Рекомендую 160x50 | |
pause | |
del %x%.xml %x%.cut 2>nul | |
goto end | |
:toGoogle | |
if DEFINED debug echo %0 %* | |
if "!%1!"=="" goto end | |
call :date "!%1!" "%Google%%pp%!%1!" | |
if DEFINED doIt call :log xcopy "!%1!" "%Google%%pp%" /Y | |
goto end | |
:fromCloud | |
if DEFINED debug echo %0 %* | |
if EXIST "%Yandex%%P1%descript.ion" ( | |
if DEFINED copyD ( | |
call :date "%Yandex%%P1%descript.ion" descript.ion | |
if DEFINED doIt ( | |
attrib -h descript.ion | |
call :log xcopy "%Yandex%%P1%descript.ion" "%cd%\" /H /K /Y | |
set copyD= | |
) | |
) | |
) else if EXIST "%Yandex%%P1%%cueSheet%" ( | |
if DEFINED copyC ( | |
call :date "%Yandex%%P1%%cueSheet%" "%cd%\%cueSheet%" | |
if DEFINED doIt ( | |
call :log xcopy "%Yandex%%P1%%cueSheet%" "%cd%\" /Y | |
set copyC= | |
) | |
) | |
) | |
goto end | |
:toClouD | |
if DEFINED debug echo %0 %* | |
if DEFINED copyD ( | |
call :date descript.ion "%Yandex%%P1%descript.ion" | |
if DEFINED doIt ( | |
attrib -h "%Yandex%%P1%descript.ion" | |
call :log xcopy descript.ion "%Yandex%%P1%" /H /K /Y | |
set copyD= | |
) | |
) | |
goto end | |
:toClouC | |
if DEFINED debug echo %0 %* | |
if DEFINED copyC ( | |
call :date "%cd%\%cueSheet%" "%Yandex%%P1%%cueSheet%" | |
if DEFINED doIt ( | |
call :log xcopy "%cueSheet%" "%Yandex%%P1%" /Y | |
set copyC= | |
) | |
) | |
goto end | |
:csc | |
if DEFINED debug echo %0 %* | |
set csc= | |
if EXIST "%cueSheet%" for /f "useBackQ tokens=*" %%C in ("%cueSheet%") do ( | |
set csc=!csc!%%C\n | |
) | |
set csc=!csc:~0,-2! | |
goto end | |
:unxU | |
if DEFINED debug echo %0 %* | |
set %1U=%unxU%\%1.exe | |
if EXIST !%1U! ( | |
goto end | |
) else ( | |
set %1U=%msys%\%1.exe | |
if EXIST !%1U! ( | |
goto end | |
) else ( | |
set %1U=%mingw%\%1.exe | |
if EXIST !%1U! ( | |
goto end | |
) else ( | |
set %1U=%cygwin%\%1.exe | |
if EXIST !%1U! ( | |
goto end | |
) else ( | |
set %1U=%mkvTN%\%1.exe | |
if EXIST !%1U! ( | |
goto end | |
) else ( | |
set %1U=%ffMPG%\%1.exe | |
if EXIST !%1U! ( | |
goto end | |
) else ( | |
set %1U= | |
echo Нет %1.exe из https://ffmpeg.zeranoe.com/builds в '%ffMPG%' | |
) | |
echo Нет %1.exe из https://mkvtoolnix.download/windows в '%mkvTN%' | |
) | |
echo Нет %1.exe из https://cygwin.com/install.html в '%cygwin%' | |
) | |
echo Нет %1.exe из https://sourceforge.net/projects/msys2 в '%mingw%' | |
) | |
echo Нет %1.exe из https://sourceforge.net/projects/msys2 в '%msys%' | |
) | |
echo Нет %1.exe из http://sourceforge.net/projects/unxutils в '%unxU%' | |
) | |
goto end | |
:descr | |
if DEFINED debug echo %0 %* | |
if /i not "%~1"=="%ne%" goto end | |
set found=1 | |
set rest=%~2 | |
:loop | |
if DEFINED debug echo %0 %* | |
shift | |
if "%~2"=="" goto skip | |
set rest=!rest! %~2 | |
goto loop | |
:skip | |
if DEFINED debug echo %0 %* | |
if not "!rest:\n=!"=="!rest!" set rest=!rest:~0,-2! | |
if "!rest!"=="!csc!" ( | |
call :cutting | |
goto end | |
) | |
if EXIST "%cueSheet%" ( | |
if EXIST %x%.cut del %x%.cut 2>nul | |
ren "%cueSheet%" %x%.cut | |
) | |
call :parse "!rest:\n=" "!" | |
goto end | |
:parse | |
if DEFINED debug echo %0 %* | |
>> "%cueSheet%" echo %~1 | |
shift | |
if "%~1"=="" ( | |
call :cutting | |
goto end | |
) | |
goto parse | |
:cutting | |
if DEFINED debug echo %0 %* | |
rem type "%cueSheet%" | |
call :dur | |
set i=0 | |
for /f "useBackQ tokens=1,2*" %%a in ("%cueSheet%") do ( | |
echo %0 %%a %%b %%c | |
set fake= | |
set oldTags= | |
set oldABD= | |
set newTags= | |
set newABD= | |
set j=0 | |
if EXIST %x%.cut ( | |
find "%%a %%b %%c" %x%.cut >nul && set fake=1 | |
if not DEFINED fake for /f "useBackQ tokens=*" %%o in ("%x%.cut") do ( | |
if !i! == !j! ( | |
if "%%a %%b %%c"=="%%o" ( | |
set fake=1 | |
) else for /f "tokens=1* delims=#" %%p in ("%%o") do ( | |
set oldABD=%%p | |
if not DEFINED oldABD set oldABD=_ | |
set oldTags=%%q | |
if not DEFINED oldTags set oldTags=_ | |
) | |
) | |
set /a j=!j!+1 | |
) | |
) | |
set /a i=!i!+1 | |
for /f "tokens=1* delims=#" %%d in ("%%c") do ( | |
set title=%%d | |
set n=%name% !title! | |
if DEFINED oldABD if not "!oldABD!"=="%%a %%b %%d" ( | |
set newABD=1 | |
for /f "tokens=2*" %%y in ("!oldABD!") do del "%dpp%*%%z.mkv" "%dpp%*%%z.mp3" "*%%z.srt" "*%%z.xml" 2>nul | |
) | |
set tags=%%e | |
if DEFINED oldTags if not "!oldTags!"=="%%e" set newTags=1 | |
set doMP3=1 | |
if DEFINED tags ( | |
if not "!tags:~0,4!"=="TPE1" ( | |
set tags=TPE1 !tags! | |
set doMP3= | |
) | |
) else set doMP3= | |
) | |
set from=%%a | |
set to=%%b | |
call :ft | |
call :ni | |
call :tg | |
call :srt | |
call :xml | |
call :snd | |
if DEFINED img if DEFINED snd if not EXIST "%ne%!snd!" call :log %ffmpegU% -v error -framerate 1 -loop 1 -i "!img!" -i "%ne%!flac!" -c:v libx264 -tune stillimage -pix_fmt yuv420p -force_key_frames "expr:gte(t,n_forced)" -c:a copy -shortest "%ne%!snd!" | |
call :mkv | |
call :mp3 | |
) | |
goto end | |
:dur | |
if DEFINED debug echo %0 %* | |
set flac= | |
if EXIST "%ne%.flac" set flac=.flac else ( | |
%ffprobeU% -v error -of csv=p=0 -show_entries format=duration "%ne%" | find /I "N/A" > nul && ( | |
set flac=.flac | |
call :log %ffmpegU% -v error -i "%ne%" "%ne%!flac!" | |
) | |
) | |
if not EXIST %dur% ( | |
if DEFINED dateU ( | |
"%dateU%" -r "%ne%" +"%%d.%%m.%%Y %%H:%%M:%%S" | |
) else if "%CP%"=="UTF-8" ( | |
forfiles /m "%ne%" /c "cmd /c echo @fdate @ftime" | |
) else ( | |
for %%C in ("%ne%") do echo %%~tC:0 | |
) | |
%ffprobeU% -v quiet -of csv=p=0 -show_entries format=duration "%ne%!flac!" | |
)>%dur% | |
for /f "useBackQ tokens=1-6 delims=.: " %%o in (%dur%) do ( | |
rem echo %%o %%p %%q %%r %%s %%t | |
if "%%q"=="" ( | |
set /a sBegin=!sEnd!-%%o | |
if !sBegin! LSS 0 set /a sBegin=0 | |
) else ( | |
call :unZ %%r | |
set /a sEnd=3600*!unZ! | |
call :unZ %%s | |
set /a sEnd+=60*!unZ! | |
call :unZ %%t | |
set /a sEnd+=!unZ! | |
) | |
) | |
rem echo sBegin=!sBegin! sEnd=!sEnd! | |
goto end | |
:ft | |
if DEFINED debug echo %0 %* | |
if "!from:~0,1!"=="'" ( | |
set from=!from:~1! | |
set fake=2 | |
) | |
set from=!from:,=.! | |
set from=!from:_=! | |
set from=!from:-=! | |
if not DEFINED from ( | |
set /a mSec=0 | |
set sync= | |
call :ti | |
) else ( | |
call :mSec from | |
set sync=--sync 0:!mSec! | |
call :ti | |
) | |
call :append !to! | |
set to=!to:,=.! | |
set to=!to:_=! | |
set to=!to:-=! | |
if DEFINED to call :mSec to | |
if not "!from!"=="!to!" ( | |
set ft=--split parts:!from!-!to! | |
) | |
goto end | |
:ni | |
if DEFINED debug echo %0 %* | |
set ni=!ti! !title! | |
set nn=%cd% !ni! | |
set fmkv=%Google%%pp%%parent% !ni! | |
set rmp4="%parent% !ni!.mp4" | |
set mp4="!fmkv!.mp4" | |
set fmkv="!fmkv!.mkv" | |
goto end | |
:tg | |
if DEFINED debug echo %0 %* | |
set TALB= | |
set TYER= | |
set TDAT= | |
set TRCK= | |
set TPE1= | |
set TPE2= | |
set TPE3= | |
set TIT2= | |
set TIT3= | |
set TCOM= | |
set TEXT= | |
set KEYWORDS=%TPUB% | |
if DEFINED tags call :tags "!tags:#=" "!" | |
if not DEFINED TALB set TALB=%parent%& call :keywords %parent% | |
if not DEFINED TYER set TYER=%parent:~0,4%& call :keywords %parent:~0,4% | |
if not DEFINED TDAT set TDAT=%parent:~6,2%%parent:~4,2% | |
if not DEFINED TRCK ( | |
set TRCK=!ti! | |
) else ( | |
set ti=!TRCK! | |
call :ni | |
) | |
set tag="!n!#.xml" | |
if EXIST !tag! del !tag! 2>nul | |
set tag="%name%#!title!.xml" | |
if not DEFINED TIT2 set TIT2=!title!&call :keywords !title! | |
if not DEFINED TIT3 set TIT3=%parent% !ni! | |
call :date %dur% !tag! | |
if DEFINED found ( | |
if DEFINED newABD set doIt=1 | |
if DEFINED newTags set doIt=1 | |
) else call :date "%cueSheet%" !tag! 1 | |
if not EXIST !tag! set doIt=1& set fake= | |
if DEFINED fake ( | |
call :fake !tag! | |
) else if DEFINED doIt ( | |
set ALBUM=50 | |
set TRACK=30 | |
echo ^<?xml version="1.0" encoding="Windows-%codePage%"?^>^<Tags^>^<Tag^>^<Targets^>^<TargetTypeValue^>!ALBUM!^</TargetTypeValue^>^</Targets^> | |
echo ^<Simple^>^<Name^>TITLE^</Name^>^<String^>!TALB!^</String^>^</Simple^> | |
echo ^<Simple^>^<Name^>TALB^</Name^>^<String^>!TALB!^</String^>^</Simple^> | |
echo ^<Simple^>^<Name^>TYER^</Name^>^<String^>!TYER!^</String^>^</Simple^> | |
echo ^<Simple^>^<Name^>TDAT^</Name^>^<String^>!TDAT!^</String^>^</Simple^> | |
echo ^<Simple^>^<Name^>DATE_RECORDED^</Name^>^<String^>!TYER!-!TDAT:~2,2!-!TDAT:~0,2!^</String^>^</Simple^> | |
echo ^</Tag^>^<Tag^>^<Targets^>^<TargetTypeValue^>!TRACK!^</TargetTypeValue^>^</Targets^> | |
echo ^<Simple^>^<Name^>PART_NUMBER^</Name^>^<String^>!TRCK!^</String^>^</Simple^> | |
echo ^<Simple^>^<Name^>ARTIST^</Name^>^<String^>!TPE1!^</String^>^</Simple^> | |
echo ^<Simple^>^<Name^>TPE2^</Name^>^<String^>!TPE2!^</String^>^</Simple^> | |
echo ^<Simple^>^<Name^>PERFORMER^</Name^>^<String^>!TPE3!^</String^>^</Simple^> | |
echo ^<Simple^>^<Name^>TITLE^</Name^>^<String^>!TIT2!^</String^>^</Simple^> | |
echo ^<Simple^>^<Name^>TIT3^</Name^>^<String^>!TIT3!^</String^>^</Simple^> | |
echo ^<Simple^>^<Name^>COMPOSER^</Name^>^<String^>!TCOM!^</String^>^</Simple^> | |
echo ^<Simple^>^<Name^>TEXT^</Name^>^<String^>!TEXT!^</String^>^</Simple^> | |
echo ^<Simple^>^<Name^>PUBLISHER^</Name^>^<String^>%TPUB%^</String^>^</Simple^> | |
echo ^<Simple^>^<Name^>KEYWORDS^</Name^>^<String^>!KEYWORDS!^</String^>^</Simple^> | |
if EXIST %x%.xml ( | |
type %x%.xml | |
del %x%.xml 2>nul | |
) | |
echo ^</Tag^>^</Tags^> | |
) > !tag! | |
goto end | |
:srt | |
if DEFINED debug echo %0 %* | |
set sr=%parent% !ni!.srt | |
set srt="!sr!" | |
call :date %dur% !srt! | |
if DEFINED found ( | |
if DEFINED newABD set doIt=1 | |
) else call :date "%cueSheet%" !srt! 1 | |
if not EXIST !srt! set doIt=1& set fake= | |
if DEFINED fake ( | |
call :fake !srt! | |
) else if DEFINED doIt ( | |
echo 1 | |
echo 00:00:05,000 --^> 00:00:10,000 | |
if "%CP%" == "UTF-8" ( | |
call :utf8 %parent% | |
call :utf8 !ni! | |
) else ( | |
echo %parent% | |
echo !ni! | |
) | |
) > !srt! | |
echo if EXIST !fmkv! rename !fmkv! !rmp4! | |
if EXIST !fmkv! rename !fmkv! !rmp4! | |
if EXIST !mp4! call :toGoogle sr | |
goto end | |
:xml | |
if DEFINED debug echo %0 %* | |
set xml="!n!.xml" | |
call :date %dur% !xml! | |
if DEFINED found ( | |
if DEFINED newABD set doIt=1 | |
) else call :date "%cueSheet%" !xml! 1 | |
if not EXIST !xml! set doIt=1& set fake= | |
if DEFINED fake ( | |
call :fake !xml! | |
) else if DEFINED doIt ( | |
echo ^<?xml version="1.0" encoding="Windows-%codePage%"?^>^<Chapters^>^<EditionEntry^>^<ChapterAtom^> | |
if not DEFINED from set from=00:00:00.000 | |
echo ^<ChapterTimeStart^>!from!^</ChapterTimeStart^> | |
if not DEFINED to set to=00:15:00.000 | |
echo ^<ChapterTimeEnd^>!to!^</ChapterTimeEnd^>^<ChapterDisplay^> | |
echo ^<ChapterString^>%parent% !ni!^</ChapterString^>^<ChapterLanguage^>%lang%^</ChapterLanguage^>^</ChapterDisplay^>^</ChapterAtom^>^</EditionEntry^>^</Chapters^> | |
) > !xml! | |
goto end | |
:mkv | |
if DEFINED debug echo %0 %* | |
set mkv="!nn!.mkv" | |
call :date !xml! !mkv! | |
call :date !srt! !mkv! 1 | |
if not DEFINED doIt ( | |
call :date !tag! !mkv! 1 | |
if not DEFINED fake if DEFINED doIt ( | |
call :log %mkvPropEditU% !mkv! -t all:!tag! | |
set doIt= | |
) | |
) | |
if DEFINED fake ( | |
rem if !fake!==1 | |
call :fake !mkv! | |
) else if DEFINED doIt call :log %mkvMergeU% -o !mkv! --language 1:%lang% "(" "%ne%!snd!" ")" --chapters !xml! !ft! --sub-charset 0:%CP% --default-track 0:yes --language 0:%lang% !sync! "(" !srt! ")" --global-tags !tag! --title "!title!" --track-order 0:0,0:1,1:0,0:2 --disable-track-statistics-tags | |
call :m3u mkv | |
call :m3u mp4 | |
goto end | |
:mp3 | |
if DEFINED debug echo %0 %* | |
if DEFINED doMP3 ( | |
set mp3="!nn!.mp3" | |
call :date !mkv! !mp3! | |
if DEFINED fake ( | |
rem if !fake!==1 | |
call :fake !mp3! | |
) else if DEFINED doIt ( | |
set mp3opt=-ac 2 -c:a libmp3lame -q:a 0 | |
%ffprobeU% -v error -select_streams a:0 -show_entries stream=codec_name -of default=nw=1:nk=1 !mkv! | find /I "mp3" > nul && set mp3opt=-c:a copy | |
call :log %ffmpegU% -v error -i !mkv! -vn !mp3opt! -id3v2_version 3 -y !mp3! | |
) | |
call :m3u mp3 | |
) | |
goto end | |
:tst | |
if not ERRORLEVEL 1 ( | |
call :log %ffmpegU% -v error -i !mkv! -vn -c:a copy -id3v2_version 3 -y !mp3! | |
) else ( | |
call :log %ffmpegU% -v error -i !mkv! -vn -ac 2 -c:a libmp3lame -q:a 2 -id3v2_version 3 -y !mp3! | |
) | |
goto end | |
:unZ | |
if DEFINED debug echo %0 %* | |
set unZ=%1 | |
if "!unZ:~0,1!"=="0" set unZ=!unZ:~1! | |
if "!unZ:~0,1!"=="0" set unZ=!unZ:~1! | |
if "!unZ!"=="" set unZ=0 | |
rem echo unZ=!unZ! | |
goto end | |
:ti | |
if DEFINED debug echo %0 %* | |
set /a sec=!sBegin!+!mSec!/1000 | |
set /a ti=!sec!/3600*100+!sec!%%3600/60 | |
if !ti! LSS 10 ( | |
set ti=000!ti! | |
) else if !ti! LSS 100 ( | |
set ti=00!ti! | |
) else if !ti! LSS 1000 set ti=0!ti! | |
if DEFINED debug echo %0 ti=!ti! | |
goto end | |
:mSec | |
if DEFINED debug echo %0 %* | |
for /f "tokens=1* delims=." %%m in ("!%1!") do ( | |
if "%%n"=="" ( | |
set /a mSec=0 | |
set %1=!%1!.000 | |
) else ( | |
call :unZ %%n | |
set /a mSec=!unZ! | |
) | |
for /f "tokens=1,2,3 delims=:" %%j in ("%%m") do ( | |
if "%%l"=="" ( | |
call :unZ %%j | |
set /a mSec+=60000*!unZ! | |
call :unZ %%k | |
set /a mSec+=1000*!unZ! | |
set %1=00:!%1! | |
) else ( | |
call :unZ %%j | |
set /a mSec+=3600000*!unZ! | |
call :unZ %%k | |
set /a mSec+=60000*!unZ! | |
call :unZ %%l | |
set /a mSec+=1000*!unZ! | |
) | |
) | |
) | |
if DEFINED debug echo %0 mSec=!mSec! | |
goto end | |
:fake | |
if DEFINED debug echo %0 %* | |
if not EXIST %1 goto end | |
if DEFINED touchU ( | |
call :log %touchU% %1 | |
) else call :log copy /b %1 +,, | |
goto end | |
:date | |
if DEFINED debug echo %0 %* | |
if "%~3"=="" set doIt= | |
if not EXIST %2 set doIt=1& goto end | |
if DEFINED dateU ( | |
for /f "useBackQ delims=" %%A in (`%dateU% -r "%~1" +%%y%%m%%d%%H%%M`) do set aD=%%A | |
for /f "useBackQ delims=" %%B in (`%dateU% -r "%~2" +%%y%%m%%d%%H%%M`) do set bD=%%B | |
) else ( | |
for %%A in (%1) do set aD=%%~tA | |
set aD=!aD:~8,2!!aD:~3,2!!aD:~0,2!!aD:~11,2!!aD:~14,2! | |
for %%B in (%2) do set bD=%%~tB | |
set bD=!bD:~8,2!!bD:~3,2!!bD:~0,2!!bD:~11,2!!bD:~14,2! | |
) | |
if !aD! GTR !bD! set doIt=1 | |
if DEFINED debug echo %0 aD=!aD! bD=!bD! doIt=!doIt! | |
goto end | |
:pl | |
echo ^<?xml version="1.0" encoding="%1"?^>^<playlist version="1" xmlns="http://xspf.org/ns/0/"^> | |
goto end | |
:m3u | |
if DEFINED debug echo %0 %* | |
set m3u=%parent%.%1.m3u | |
set m3u8=%parent%.%1.m3u8 | |
set xspf=%parent%.%1.xspf | |
if %1==mp4 ( | |
set mp4Xspf=!xspf! | |
set mp4M3u8=!m3u8! | |
) else ( | |
set m3u8=%dpp%!m3u8! | |
) | |
if not EXIST "!%1!" goto end | |
set body=%1.xspf | |
if EXIST "!body!" ( | |
rem find /c "^>!TRCK!^<" "!body!" > nul | |
find /c "^>%parent%^</album^>^<trackNum^>!TRCK!^</trackNum^>^<creator^>!TPE1!^</creator^>^<title^>!TIT2!^</title^>^<location^>%parent% !ni!.%1^<" "!body!" > nul | |
if not ERRORLEVEL 1 goto end | |
) else ( | |
del "!m3u!" "!m3u8!" "!xspf!" 2>nul | |
echo ^<title^>%parent%^</title^>^<trackList^>> !body! | |
) | |
echo ^<track^>^<album^>%parent%^</album^>^<trackNum^>!TRCK!^</trackNum^>^<creator^>!TPE1!^</creator^>^<title^>!TIT2!^</title^>^<location^>%parent% !ni!.%1^</location^>^</track^>>> !body! | |
( | |
if DEFINED toUTF8 ( | |
call :pl UTF-8 | |
type !body!|%toUTF8% | |
) else ( | |
call :pl Windows-%codePage% | |
type !body! | |
) | |
echo ^</trackList^>^</playlist^> | |
) > !xspf! | |
rem if %1==mp4 goto end | |
if not EXIST "!m3u8!" ( | |
echo 77u/I0VYVE0zVQ0K | %base64% | |
) > "!m3u8!" | |
( | |
call :utf8 #EXTINF:-1 group-title="%parent%", !TPE1! - !TIT2! | |
call :utf8 %parent% !ni!.%1 | |
) >> "!m3u8!" | |
rem if not %1==mp3 goto end | |
if not EXIST "!m3u!" echo #EXTM3U> "!m3u! | |
( | |
echo #EXTINF:-1 group-title="%parent%", !TPE1! - !TIT2! | |
echo %parent% !ni!.%1 | |
) >> "!m3u!" | |
goto end | |
:tags | |
if DEFINED debug echo %0 %* | |
call :tag %~1 | |
shift | |
if "%~1"=="" goto end | |
goto tags | |
:keywords | |
if DEFINED debug echo %0 %* | |
for /f "tokens=1* delims=/" %%K in ("%*") do ( | |
if "%%K"=="" goto end | |
echo !KEYWORDS! | find "%%K" >nul || set KEYWORDS=!KEYWORDS!, %%K | |
if not "%%L"=="" call :keywords %%L | |
) | |
goto end | |
:tag | |
if DEFINED debug echo %0 %* | |
for /f "tokens=1*" %%T in ("%*") do ( | |
set tagN=%%T | |
set tagC=%%U | |
) | |
call :keywords !tagC! | |
if /i "!tagN!"=="TALB" set TALB=!tagC!& goto end | |
if /i "!tagN!"=="TYER" set TYER=!tagC!& goto end | |
if /i "!tagN!"=="TDAT" set TDAT=!tagC!& goto end | |
if /i "!tagN!"=="TRCK" set TRCK=!tagC!& goto end | |
if /i "!tagN!"=="TPE1" set TPE1=!tagC!& goto end | |
if /i "!tagN!"=="TPE2" set TPE2=!tagC!& goto end | |
if /i "!tagN!"=="TPE3" set TPE3=!tagC!& goto end | |
if /i "!tagN!"=="TIT2" set TIT2=!tagC!& goto end | |
if /i "!tagN!"=="TIT3" set TIT3=!tagC!& goto end | |
if /i "!tagN!"=="TCOM" set TCOM=!tagC!& goto end | |
if /i "!tagN!"=="TEXT" set TEXT=!tagC!& goto end | |
>>%x%.xml echo ^<Simple^>^<Name^>!tagN!^</Name^>^<String^>!tagC!^</String^>^</Simple^> | |
goto end | |
:append | |
if DEFINED debug echo %0 %* | |
if not EXIST "%*" goto end | |
if not EXIST "%name%_.mkv" call :log %mkvMergeU% -o "%name%_.mkv" "(" "%ne%!snd!" ")" + "(" "%*" ")" --disable-track-statistics-tags --split parts:!from!- | |
pause | |
exit | |
:utf8 | |
if DEFINED debug echo %0 %* | |
if DEFINED toUTF8 ( | |
echo %*|%toUTF8% | |
) else if "%CP%%"=="UTF-8" ( | |
chcp 65001>nul& cmd/c echo %* | |
chcp %codePage%>nul | |
) else ( | |
echo %* | |
) | |
goto end | |
:snd | |
set img= | |
set snd= | |
%ffprobeU% -v error -select_streams v:0 -show_entries stream=codec_type -of default=nw=1:nk=1 "%ne%" | find /I "video" > nul || ( | |
set snd=.mkv | |
set img="%name%.jpg" | |
if EXIST !img! goto end | |
set img=all.jpg | |
if EXIST !img! goto end | |
set img=2x2.png | |
if not EXIST 2x2.png echo iVBORw0KGgoAAAANSUhEUgAAAAIAAAACAQMAAABIeJ9nAAAABlBMVEUAAAD///+l2Z/dAAAAD0lEQVQI1wEEAPv/AAAAAAAEAAE/r3YFAAAAAElFTkSuQmCC | %base64% > 2x2.png | |
) | |
goto end | |
:log | |
echo %* | |
if not DEFINED debug %* | |
:end | |
endlocal |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment