#!/usr/bin/perl -w use strict; use feature qw(say); use String::ShellQuote; my $file = shell_quote($ARGV[0]); my $out = $ARGV[1]; my $title = $ARGV[2]; my $ffprobe = "/usr/bin/ffprobe"; open(my $h, "-|", "$ffprobe $file 2>&1") or die "horribly"; my $duration; while(<$h>){ if(m#Duration: (\d+:\d+:\d+)\..*#){ $duration = $1; last; } } my ($hours, $minutes, $seconds) = split(':', $duration); my $numtracks = ($hours * 60 + $minutes) / 20 + 1; my $ctr = 1; my $last = 0; my $splitat = "-t 00:20:00"; for (my $i = 0; $i <= $hours; $i++){ for(my $j = 0; $j < 60; $j += 20){ my $start = sprintf("%02i:%02i:00", $i, $j); if($i == $hours and $j + 20 > $minutes){ #$end = sprintf("%02i:%02i:00", $i, $minutes + 1); $splitat = " "; $last = 1; } my $trackno = sprintf("%02i", $ctr); my $outname = sprintf("%s - %02i.mp3", $out, $ctr); my $titstr = sprintf("%s - %02i of %02i", $title, $ctr, $numtracks); say "ffmpeg -ss $start -i $file -acodec copy -vn $splitat -metadata track=\"$trackno\" -metadata title=\"$titstr\" \"$outname\""; last if($last); $ctr++; } }