Browse Source

Add booksplit script from LukeSmithxyz/voidrice

Frans Bergman 3 years ago
parent
commit
b44d10bc55
2 changed files with 113 additions and 0 deletions
  1. 46 0
      .scripts/booksplit
  2. 67 0
      .scripts/tag

+ 46 - 0
.scripts/booksplit

@@ -0,0 +1,46 @@
+#!/bin/sh
+
+# Requires ffmpeg (audio splitting) and my `tag` wrapper script.
+
+[ ! -f "$2" ] && printf "The first file should be the audio, the second should be the timecodes.\\n" && exit
+
+echo "Enter the album/book title:"; read -r booktitle
+
+echo "Enter the artist/author:"; read -r author
+
+echo "Enter the publication year:"; read -r year
+
+inputaudio="$1"
+
+# Get a safe file name from the book.
+escbook="$(echo "$booktitle" | iconv -cf UTF-8 -t ASCII//TRANSLIT | tr -d '[:punct:]' | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | sed "s/-\+/-/g;s/\(^-\|-\$\)//g")"
+
+! mkdir -p "$escbook" && echo "Do you have write access in this directory?" && exit 1
+
+# As long as the extension is in the tag script, it'll work.
+ext="opus"
+#ext="${1#*.}"
+
+# Get the total number of tracks from the number of lines.
+total="$(wc -l < "$2")"
+
+while read -r x;
+do
+	end="$(echo "$x" | cut -d' ' -f1)"
+
+	[ -n "$start" ] &&
+	echo "From $start to $end; $track $title"
+	file="$escbook/$(printf "%.2d" "$track")-$esctitle.$ext"
+	[ -n "$start" ] && echo "Splitting \"$title\"..." &&
+   	ffmpeg -nostdin -y -loglevel error -i "$inputaudio" -ss "$start" -to "$end" -vn -c copy "$file" &&
+	echo "Tagging \"$title\"..." && tag -a "$author" -A "$booktitle" -t "$title" -n "$track" -N "$total" -d "$year" "$file"
+	title="$(echo "$x" | cut -d' ' -f 2-)"
+	esctitle="$(echo "$title" | iconv -cf UTF-8 -t ASCII//TRANSLIT | tr -d '[:punct:]' | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | sed "s/-\+/-/g;s/\(^-\|-\$\)//g")"
+	track="$((track+1))"
+	start="$end"
+done < "$2"
+# The last track must be done outside the loop.
+echo "From $start to the end: $title"
+file="$escbook/$(printf "%.2d" "$track")-$esctitle.$ext"
+echo "Splitting \"$title\"..." && ffmpeg -nostdin -y -loglevel error -i "$inputaudio" -ss "$start" -vn -c copy "$file" &&
+		echo "Tagging \"$title\"..." && tag -a "$author" -A "$booktitle" -t "$title" -n "$track" -N "$total" -d "$year" "$file"

+ 67 - 0
.scripts/tag

@@ -0,0 +1,67 @@
+#!/bin/sh
+
+err() { echo "Usage:
+	tag [OPTIONS] file
+Options:
+	-a: artist/author
+	-t: song/chapter title
+	-A: album/book title
+	-n: track/chapter number
+	-N: total number of tracks/chapters
+	-d: year of publication
+	-g: genre
+	-c: comment
+You will be prompted for title, artist, album and track if not given." && exit 1 ;}
+
+while getopts "a:t:A:n:N:d:g:c:f:" o; do case "${o}" in
+	a) artist="${OPTARG}" ;;
+	t) title="${OPTARG}" ;;
+	A) album="${OPTARG}" ;;
+	n) track="${OPTARG}" ;;
+	N) total="${OPTARG}" ;;
+	d) date="${OPTARG}" ;;
+	g) genre="${OPTARG}" ;;
+	c) comment="${OPTARG}" ;;
+	f) file="${OPTARG}" ;;
+	*) printf "Invalid option: -%s\\n" "$OPTARG" && err ;;
+esac done
+
+shift $((OPTIND - 1))
+
+file="$1"
+
+[ ! -f "$file" ] && echo "Provide file to tag." && err
+
+[ -z "$title" ] && echo "Enter a title." && read -r title
+[ -z "$artist" ] && echo "Enter an artist." && read -r artist
+[ -z "$album" ] && echo "Enter an album." && read -r album
+[ -z "$track" ] && echo "Enter a track number." && read -r track
+
+case "$file" in
+	*.ogg) echo "Title=$title
+Artist=$artist
+Album=$album
+Track=$track
+Total=$total
+Date=$date
+Genre=$genre
+Comment=$comment" | vorbiscomment -w "$file" ;;
+	*.opus) echo "Title=$title
+Artist=$artist
+Album=$album
+Track=$track
+Total=$total
+Date=$date
+Genre=$genre
+Comment=$comment" | opustags -i -S "$file" ;;
+	*.mp3) eyeD3 -Q --remove-all -a "$artist" -A "$album" -t "$title" -n "$track" -N "$total" -Y "$date" "$file" ;;
+	*.flac) echo "TITLE=$title
+ARTIST=$artist
+ALBUM=$album
+TRACKNUMBER=$track
+TOTALTRACKS=$total
+DATE=$date
+GENRE=$genre
+DESCRIPTION=$comment" | metaflac --remove-all-tags --import-tags-from=- "$file" ;;
+	*) echo "File type not implemented yet." ;;
+esac