Sort videos by length, demand efficiency and, if possible, reliability

this is used mediainfo

to extract the properties of the video and then to check the length of the tracks and sort the video accordingly for 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. could this be shortened to a few lines? also as a side note, this track length check is not very reliable as sometimes videos have the wrong track integrated (usually subtitles), which means that the wrong extra track length will determine where the video should go.

this is how mediainfo outputs data to a file vdata

. the duration of the video track should always be on 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

      

+3


source to share


1 answer


One could convert the convention 𝑛 h 𝑛𝑛 min 𝑛𝑛 s

to an integer by replacing "h", "min" and "s" with their mathematical equivalents, using string substitution, then using set /a

to compute it all in seconds. After you reach that whole number, divide by 60 to get minutes.

Also, there is no need to dump the output mediainfo

to a text file. Just write it down 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 is a better tool out there for scraping the duration of video files. ffprobe

(part of the FFmpeg package) will allow you to get the global video duration in seconds .microseconds with the following command:



ffprobe -v quiet -show_entries "format=duration" -of csv "filename.mkv"

      

The result looks like this:

format, 5028.080000

As in the example mediainfo

above, use a loop for /f

to print the output 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\
)

      

+2


source







All Articles