Add script and config
This commit is contained in:
parent
5df0f6515d
commit
615079070a
102
ffmpeg-mka-thumbnailer
Executable file
102
ffmpeg-mka-thumbnailer
Executable file
@ -0,0 +1,102 @@
|
||||
#!/usr/bin/zsh
|
||||
|
||||
help_args=(-h --help)
|
||||
if [[ "${@:*help_args}" != "" ]] {
|
||||
cat <<-END
|
||||
ffmpeg-mka-thumbnailer
|
||||
Extract album cover art from Matroska audio files (.mka)
|
||||
|
||||
Usage:
|
||||
ffmpeg-mka-thumbnailer [OPTIONS] -i <INPUT FILE> -o <OUTPUT FILE>
|
||||
|
||||
Options:
|
||||
-h, --help Show this help text
|
||||
-i <INPUT FILE> Matroska audio file to read
|
||||
-o <OUTPUT FILE> Where to write the output
|
||||
-s <SIZE> Not implemented yet
|
||||
END
|
||||
exit 1
|
||||
}
|
||||
|
||||
required_args=(-i -o)
|
||||
if [[ "${==${(o)@:*required_args}}" != "-i -o" ]] {
|
||||
supplied_args=("${@:*required_args}")
|
||||
for p ("${(@)required_args:|supplied_args}") {
|
||||
echo "Missing argument $p" >&2
|
||||
}
|
||||
exit 1
|
||||
}
|
||||
|
||||
input=
|
||||
output=
|
||||
|
||||
while [[ $# -gt 0 ]] {
|
||||
case "$1" {
|
||||
-i)
|
||||
input="$2"
|
||||
shift
|
||||
;;
|
||||
-o)
|
||||
output="$2"
|
||||
shift
|
||||
;;
|
||||
-s)
|
||||
echo "-s is not implemented yet" >&2
|
||||
exit 1
|
||||
;;
|
||||
*)
|
||||
echo "Unrecognized option $1" >&2
|
||||
exit 1
|
||||
;;
|
||||
}
|
||||
|
||||
shift
|
||||
}
|
||||
|
||||
if [[ ! (-r "$input" && -f "$input") ]] {
|
||||
echo "Input $input is not a readable file" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
dir="$(dirname "$output")"
|
||||
if [[ ! (-d "$dir" && -w "$dir") ]] {
|
||||
echo "Output $output is not under a writable directory" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
attachment_streams="$(ffprobe -of json -v error -select_streams t -show_streams "$input" | jq -c)"
|
||||
|
||||
if [[ "$(echo -n "$attachment_streams" | jq ".streams | length")" -lt 1 ]] {
|
||||
echo "Input does not have any attachment streams" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
attachment_filename="$(echo -n "$attachment_streams" | jq -r '[.streams[] | select((.tags.filename | (startswith("cover") or startswith("small_cover"))) and (.tags.mimetype | startswith("image/")))] | sort_by(.index) | first | .tags.filename | strings')"
|
||||
|
||||
if [[ "$attachment_filename" = "" ]] {
|
||||
echo "No suitable attachment found" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
prev_pwd="$(pwd)"
|
||||
tmpdir="$(mktemp -d)"
|
||||
tmpdir_success=$?
|
||||
if [[ $tmpdir_success -ne 0 ]] {
|
||||
echo "Could not create temporary directory" >&2
|
||||
exit 1
|
||||
} else {
|
||||
cd "$tmpdir"
|
||||
}
|
||||
|
||||
return_code=0
|
||||
repeat 1 {
|
||||
ffmpeg -v error -dump_attachment:t "$attachment_filename" -f matroska -i "$input" -t 0 -f null null || { return_code=$?; break }
|
||||
if [[ "${attachment_filename##*.}" = "${output##*.}" || ("${attachment_filename##*.}" =~ ^jpe?g$ && "${output##*.}" =~ ^jpe?g$) ]] {
|
||||
mv "$attachment_filename" "$output"
|
||||
} else {
|
||||
convert "$attachment_filename" "$output" || { return_code=$?; break }
|
||||
}
|
||||
}
|
||||
cd "$prev_pwd"
|
||||
rm -rf "$tmpdir"
|
||||
exit $return_code
|
4
ffmpeg-mka.thumbnailer
Normal file
4
ffmpeg-mka.thumbnailer
Normal file
@ -0,0 +1,4 @@
|
||||
[Thumbnailer Entry]
|
||||
TryExec=ffmpeg-mka-thumbnailer
|
||||
Exec=ffmpeg-mka-thumbnailer -i %i -o %o
|
||||
MimeType=audio/x-matroska;
|
Loading…
Reference in New Issue
Block a user