Skip to content

Instantly share code, notes, and snippets.

@abakum
Last active June 3, 2016 11:17
Show Gist options
  • Save abakum/4813bd2749b4cb3dee15b062942b4f50 to your computer and use it in GitHub Desktop.
Save abakum/4813bd2749b4cb3dee15b062942b4f50 to your computer and use it in GitHub Desktop.
@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