mirror of
https://github.com/captn3m0/Scripts.git
synced 2024-09-27 22:22:53 +00:00
68 lines
1.7 KiB
PHP
Executable File
68 lines
1.7 KiB
PHP
Executable File
#!/usr/bin/php
|
|
<?php
|
|
|
|
/**
|
|
|
|
This script generates split-audiobook files for each track using a copy-pasted version
|
|
of the Audible tracklist from the Audible web player
|
|
|
|
The file format is:
|
|
|
|
CHAPTER1
|
|
01:25:50
|
|
Chapter 2 title goes here
|
|
00:01:12
|
|
Chapter 3 title goes here
|
|
01:25:54
|
|
End Credits
|
|
00:00:59
|
|
|
|
This is exactly what you'll get if you copy-paste the listing from the web player.
|
|
|
|
Unfortunately, I've found that for very long Audiobooks, this isn't precise enough and the errors add up.
|
|
*/
|
|
|
|
if(count($argv) != 3) {
|
|
die("Please run as split-by-audible audio.m4a listing.txt\n");
|
|
}
|
|
|
|
$INPUT_FILE=$argv[1];
|
|
$listing=$argv[2];
|
|
|
|
is_readable($INPUT_FILE) or die("$INPUT_FILE not readable\n");
|
|
is_readable($listing) or die("$listing not readable\n");
|
|
|
|
$startTime = 0;
|
|
$inputData = file($listing);
|
|
|
|
$endingDuration = '00:00:00';
|
|
|
|
$chapterId = 1;
|
|
|
|
function timeStampToSeconds($str_time) {
|
|
sscanf($str_time, "%d:%d:%d", $hours, $minutes, $seconds);
|
|
return isset($hours) ? $hours * 3600 + $minutes * 60 + $seconds : $minutes * 60 + $seconds;
|
|
}
|
|
|
|
for($i = 0;$i<count($inputData);$i++) {
|
|
|
|
// This chapter starts at the ending time of the previous one.
|
|
$startTime = $startTime + timeStampToSeconds($endingDuration);
|
|
|
|
// Get the chapter name
|
|
$chapter = trim($inputData[$i]);
|
|
// Get the ending time and advance the line
|
|
$endingDuration = trim($inputData[++$i]);
|
|
|
|
$endTime = $startTime + timeStampToSeconds($endingDuration);
|
|
|
|
$index = str_pad($chapterId, 3, '0', STR_PAD_LEFT);
|
|
$title = "$index - $chapter";
|
|
echo "$title ($startTime - $endTime)\n";
|
|
|
|
$filename = "$title.m4a";
|
|
|
|
`ffmpeg -hide_banner -loglevel panic -vsync 2 -i "$INPUT_FILE" -dn -sn -ss "$startTime" -to "$endTime" -vn -metadata title="$title" -acodec copy "$filename" </dev/null`;
|
|
$chapterId++;
|
|
}
|