this uses mediainfo to extract video properties and then checks track lengths and sorts the video accordingly to either long or short directories.
mediainfo.exe %1 >%temp%\vdata
type %temp%\vdata | find ": 9 h" >nul && move %1 long && goto next
type %temp%\vdata | find ": 8 h" >nul && move %1 long && goto next
type %temp%\vdata | find ": 7 h" >nul && move %1 long && goto next
type %temp%\vdata | find ": 6 h" >nul && move %1 long && goto next
type %temp%\vdata | find ": 5 h" >nul && move %1 long && goto next
type %temp%\vdata | find ": 4 h" >nul && move %1 long && goto next
type %temp%\vdata | find ": 3 h" >nul && move %1 long && goto next
type %temp%\vdata | find ": 2 h" >nul && move %1 long && goto next
type %temp%\vdata | find ": 1 h" >nul && move %1 long && goto next
type %temp%\vdata | find ": 59 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 58 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 57 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 56 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 55 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 54 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 53 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 52 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 51 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 50 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 49 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 48 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 47 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 46 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 45 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 44 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 43 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 42 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 41 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 40 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 39 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 38 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 37 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 36 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 35 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 34 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 33 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 32 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 31 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 30 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 29 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 28 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 27 min" >nul && move %1 long && goto next
type %temp%\vdata | find ": 26 min" >nul && move %1 long && goto next
:: sort long making of videos, leave short ones for manual checkup
echo "%~n1" | find /i "making of " >nul && goto next
type %temp%\vdata | find ": 25 min" >nul && move %1 short && goto next
type %temp%\vdata | find ": 24 min" >nul && move %1 short && goto next
type %temp%\vdata | find ": 23 min" >nul && move %1 short && goto next
type %temp%\vdata | find ": 22 min" >nul && move %1 short && goto next
type %temp%\vdata | find ": 21 min" >nul && move %1 short && goto next
type %temp%\vdata | find ": 20 min" >nul && move %1 short && goto next
type %temp%\vdata | find ": 19 min" >nul && move %1 short && goto next
type %temp%\vdata | find ": 18 min" >nul && move %1 short && goto next
type %temp%\vdata | find ": 17 min" >nul && move %1 short && goto next
type %temp%\vdata | find ": 16 min" >nul && move %1 short && goto next
type %temp%\vdata | find ": 15 min" >nul && move %1 short && goto next
type %temp%\vdata | find ": 14 min" >nul && move %1 short && goto next
type %temp%\vdata | find ": 13 min" >nul && move %1 short && goto next
type %temp%\vdata | find ": 12 min" >nul && move %1 short && goto next
type %temp%\vdata | find ": 11 min" >nul && move %1 short && goto next
type %temp%\vdata | find ": 10 min" >nul && move %1 short && goto next
type %temp%\vdata | find ": 9 min" >nul && move %1 short && goto next
type %temp%\vdata | find ": 8 min" >nul && move %1 short && goto next
type %temp%\vdata | find ": 7 min" >nul && move %1 short && goto next
type %temp%\vdata | find ": 6 min" >nul && move %1 short && goto next
type %temp%\vdata | find ": 5 min" >nul && move %1 short && goto next
type %temp%\vdata | find ": 4 min" >nul && move %1 short && goto next
type %temp%\vdata | find ": 3 min" >nul && move %1 short && goto next
type %temp%\vdata | find ": 2 min" >nul && move %1 short && goto next
type %temp%\vdata | find ": 1 min" >nul && move %1 short && goto next
type %temp%\vdata | find ": 59 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 58 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 57 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 56 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 55 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 54 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 53 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 52 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 51 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 50 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 49 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 48 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 47 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 46 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 45 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 44 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 43 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 42 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 41 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 40 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 39 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 38 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 37 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 36 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 35 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 34 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 33 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 32 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 31 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 30 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 29 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 28 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 27 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 26 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 25 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 24 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 23 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 22 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 21 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 20 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 19 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 18 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 17 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 16 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 15 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 14 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 13 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 12 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 11 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 10 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 9 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 8 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 7 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 6 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 5 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 4 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 3 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 2 s " >nul && move %1 short && goto next
type %temp%\vdata | find ": 1 s " >nul && move %1 short && goto next
:next
as you can see it is very inefficient. can this be reduced to a few lines? also as a side note this track length check is not very reliable since sometimes videos have the wrong track integrated (usually subtitles), meaning the incorrect length of the additional track will determine where the video should go.
this is how mediainfo outputs data to to the vdata file. the video track duration should always be at line 7.
General
Unique ID : 46047801939398570510895581797401581513 (0x22A47BEB8AA8348EF96251DF04E557C9)
Complete name : Tomorrowland 2017 GoPro.mp4
Format : Matroska
Format version : Version 4 / Version 2
File size : 3.86 GiB
Duration : 1 h 0 min
Overall bit rate : 9 074 kb/s
Writing application : Lavf57.41.100
Writing library : Lavf57.41.100 / Lavf57.41.100
Video
ID : 1
Format : HEVC
Format/Info : High Efficiency Video Coding
Format profile : Main@L4@Main
Codec ID : V_MPEGH/ISO/HEVC
Duration : 1 h 0 min
Width : 1 920 pixels
Height : 1 080 pixels
Display aspect ratio : 16:9
Frame rate mode : Constant
Frame rate : 25.000 FPS
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Writing library : x265 1.9:[Windows][GCC 5.2.0][64 bit] 8bit
Encoding settings : wpp / ctu=64 / min-cu-size=8 / max-tu-size=32 / tu-intra-depth=1 / tu-inter-depth=1 / me=1 / subme=1 / merange=57 / no-rect / no-amp / max-merge=2 / temporal-mvp / early-skip / rdpenalty=0 / no-tskip / no-tskip-fast / strong-intra-smoothing / no-lossless / no-cu-lossless / no-constrained-intra / fast-intra / open-gop / no-temporal-layers / interlace=0 / keyint=250 / min-keyint=25 / scenecut=40 / rc-lookahead=15 / lookahead-slices=6 / bframes=4 / bframe-bias=0 / b-adapt=0 / ref=2 / limit-refs=3 / no-limit-modes / weightp / no-weightb / aq-mode=1 / qg-size=32 / aq-strength=1.00 / cbqpoffs=0 / crqpoffs=0 / rd=2 / psy-rd=2.00 / rdoq-level=0 / psy-rdoq=0.00 / signhide / deblock / sao / no-sao-non-deblock / b-pyramid / cutree / no-intra-refresh / rc=crf / crf=21.0 / qcomp=0.60 / qpmin=0 / qpmax=51 / qpstep=4 / ipratio=1.40 / pbratio=1.30
Language : English
Default : Yes
Forced : No
DURATION : 01:00:58.103000000
Audio
ID : 2
Format : AAC
Format/Info : Advanced Audio Codec
Format profile : LC
Codec ID : A_AAC
Duration : 1 h 0 min
Channel(s) : 2 channels
Channel positions : Front: L R
Sampling rate : 44.1 kHz
Frame rate : 43.066 FPS (1024 spf)
Compression mode : Lossy
Delay relative to video : -743 ms
Writing library : Lavc57.48.101 aac
Default : Yes
Forced : No
DURATION : 01:00:58.028000000
It would be possible to convert the 𝑛 h 𝑛𝑛 min 𝑛𝑛 s convention to an integer by replacing "h", "min", and "s" with their mathematical equivalents using string substitution, then using set /a to math the whole thing into seconds. Once you have that seconds integer, divide by 60 to get minutes.
Also, there's no need to dump the output of mediainfo to a text file. Just capture it with for /f.
@echo off & setlocal
set "video=%~f1"
rem // Change "args" to whatever arguments mediainfo requires. I don't know its syntax.
for /f "tokens=2*" %%I in (
'mediainfo args "%video%" ^| findstr /irc:"Duration.*[0-9] [hms]"'
) do if not defined duration set "duration=%%J"
set "duration=%duration: h=*3600%"
set "duration=%duration: min=*60%"
set "duration=%duration: s=%"
set /a "minutes=%duration: =+% / 60"
if %minutes% leq 25 (
move "%video%" short\
) else (
move "%video%" long\
)
... or similar.
There's a better tool for scraping the duration of video files, though. ffprobe (a part of the FFmpeg package) will let you get the video's global duration in seconds.microseconds with the following command:
ffprobe -v quiet -show_entries "format=duration" -of csv "filename.mkv"
Output resembles this:
format,5028.080000
As with the mediainfo example above, use a for /f loop to capture the output of ffprobe.
@echo off & setlocal
set "video=%~f1"
for /f "tokens=2 delims=,." %%I in (
'ffprobe -v quiet -show_entries "format=duration" -of csv "%video%"`
) do set /a "minutes = %%~I / 60"
if %minutes% leq 25 (
move "%video%" short\
) else (
move "%video%" long\
)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With