Go CLI to calculate total media duraton in directories
github.com
github.com
Also, you might wanna limit concurrency[0] instead of spawning many ffprobe instances at the ~same time.
[0]: https://github.com/sourcegraph/conc
In another note, ChatGPT suggests this shell command to do the same thing. It doesn't process files in parallel though.
find . -name "*.mp4" -print0 | \
xargs -0 -I {} ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 {} | \
awk '{sum += $1} END {print sum}'Although I seriously doubt data hoarders care about that. A movie will be eventually watched someday. If they run out of space, they'll get another drive. Storage is cheap.
You wanna know how long will it take you to finish that lecture playlist you just downloaded. You're a teacher and want to show some videos but you're limited in time. You want to know how many hours of music you've got.
find . -type f -print0 | \
xargs -0 -I {} ffprobe -v quiet -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 {} | \
awk '{s += $1} END {printf "%d:%.2d:%.2d\n", s/3600, s%3600/60, s%3600%60}' F:films> ls -rec -file | gec video | gvi | ndur
372:18:09
where:- `ls -rec -file` gets all files recursively under CWD (F:films)
- `gec video` selects video files via extension (gec -> Get-ExtensionCategory)
- `gvi` uses FFPROBE to get video info in custom object (gvi -> Get-VideoInfo)
- `ndur` sums Duration property of objects and converts seconds to 'hhh:mm:ss'
Most people I've shown this have found the syntax and aliases confusing and non-intuitive. They prefer the find/xargs/awk incantations, which, I'm told, are more elegant, correct and precise. After that, I'm usually speechless.
That's like those hacking scenes where they do:
$ ./hack
Are those `gec`, `gvi`, certainly `ndur` isn't, part of pwsh default installation? If not how much works it needs to implement them? You may quickly find out why peeps prefer the Unix incantations. (Also will assume only one of those two approaches come with manuals for commands run.) F:films> filter probe_format {
ffprobe $_.fullname -v error -show_entries format=duration -of json |
convertfrom-json | % format
}
F:films> ls -file -rec | ? extension -in .mp4,.avi,.mkv | probe_format |
measure -sum duration | % { New-TimeSpan -Seconds $_.sum } | % tostring
15.12:18:09 # same result as before (15days+12hours, etc.)
Even this makes much more sense to me than the Unix equivalent. I realize that Bash/AWK was better than CMD.EXE batch files, but, come on...