portability, NONUMBER SEPARATOR and VERBOSITY variables, numbers from 00

master
Karchnu 2021-04-05 01:41:16 +02:00
parent 824bbc7d6f
commit 8d25557220
1 changed files with 89 additions and 50 deletions

View File

@ -18,23 +18,23 @@ reverse_word_order(){
# bc is mandatory: arythmetic operations are very limited in ash. # bc is mandatory: arythmetic operations are very limited in ash.
get_seconds(){ get_seconds(){
local n=0 number_position=0
local v=0 value=0
values=$(echo "$*" | sed 's/:/\ values=$(echo "$*" | sed 's/:/\
/g' | sed "s/^0//") /g' | sed "s/^0//")
for i in $(reverse_word_order $values); do for i in $(reverse_word_order $values); do
case $n in case $number_position in
0) v=$(echo "$v + $i " | bc);; 0) value=$(echo "$value + $i " | bc);;
1) v=$(echo "$v + (60 * $i)" | bc);; 1) value=$(echo "$value + (60 * $i)" | bc);;
2) v=$(echo "$v + (3600 * $i)" | bc);; 2) value=$(echo "$value + (3600 * $i)" | bc);;
*) echo "invalid timecode $*"; exit 1;; *) echo "invalid timecode $*"; exit 1;;
esac esac
n=$((n+1)) number_position=$((number_position+1))
done done
echo $v echo $value
} }
# Get a more usable time representation for the beginning and the end of songs. # Get a more usable time representation for the beginning and the end of songs.
@ -44,66 +44,80 @@ get_values(){
time_file="$2" time_file="$2"
total_length=$(soxi -D "${audio_file}" | sed "s/\..*//") # integer values only total_length=$(soxi -D "${audio_file}" | sed "s/\..*//") # integer values only
n=0 track_number=1
while read X; do while read X; do
if [ $n -ne 0 ]; then if [ $track_number -ne 1 ]; then
to=$(get_time $X) to_unformatted=$(get_time $X)
to_s=$(get_seconds $to) to_s=$(get_seconds $to_unformatted)
echo -e "$from_s\t$to_s\t$title" echo "$from_s $to_s $title"
fi fi
#echo $X from_unformatted=$(get_time $X)
from=$(get_time $X) from_s=$(get_seconds $from_unformatted)
from_s=$(get_seconds $from)
title=$(get_title $X) title=$(get_title $X)
if [ -z "${WITH_NUMBER}" ]; then if [ "$NONUMBER" = "" ]; then
: track_n=$track_number
else if [ $track_number -lt 10 ]; then
title="${n}${WITH_NUMBER}${title}" track_n="0$track_number"
fi
title="${track_n}${SEPARATOR}${title}"
fi fi
n=$(echo $n + 1 | bc) track_number=$(echo $track_number + 1 | bc)
done < "${time_file}" done < "${time_file}"
echo -e "$from_s\t$total_length\t$title" echo "$from_s $total_length $title"
} }
run_ffmpeg(){ run_ffmpeg(){
local file=$1 file=$1
local from=$2 from=$2
local duration=$3 duration=$3
local title=$4 final_title=$4
if [ "${SIMULATION}" = 1 ]; then LOG_LEVEL="-loglevel error"
[ -z "${QUIET}" ] && echo "ffmpeg -loglevel error -ss '$from' -t '$duration' -i '${file}' '${title}'" FROM="-ss $from"
else DURATION="-t $duration"
[ -z "${QUIET}" ] && echo "ffmpeg -loglevel error -ss '$from' -t '$duration' -i '${file}' '${title}'" INPUT_FILE="-i $file"
$(< /dev/null ffmpeg -loglevel quiet -ss "$from" -t "$duration" -i "${file}" "${title}") OUTPUT_FILE="$final_title"
case "v$VERBOSITY" in
v0)
;;
v1)
echo "extracting '$final_title'"
;;
v2)
echo "ffmpeg $LOG_LEVEL $FROM $DURATION $INPUT_FILE '$OUTPUT_FILE'"
;;
*)
echo "verbosity is not set properly" >&2
exit 1
;;
esac
if [ "$SIMULATION" = "" ]; then
$(< /dev/null ffmpeg $LOG_LEVEL $FROM $DURATION $INPUT_FILE "$OUTPUT_FILE")
fi fi
} }
rip(){ rip(){
n=0 track_start_s=0
from=0 track_end_s=0
to=0
audio_file="$1" audio_file="$1"
time_file="$2" time_file="$2"
[ "$FORMAT" = "" ] && echo "default format: opus" && FORMAT="opus"
#echo "from to duration title"
get_values "$audio_file" "$time_file" | while read LINE; do get_values "$audio_file" "$time_file" | while read LINE; do
from=$(echo $LINE | cut -d ' ' -f 1) track_start_s=$(echo $LINE | cut -d ' ' -f 1)
to=$(echo $LINE | cut -d ' ' -f 2) track_end_s=$(echo $LINE | cut -d ' ' -f 2)
title=$(echo $LINE | cut -d ' ' -f 3-) track_title=$(echo $LINE | cut -d ' ' -f 3-)
duration=$(echo "$to - $from" | bc) track_duration=$(echo "$track_end_s - $track_start_s" | bc)
run_ffmpeg "${audio_file}" "${from}" "${duration}" "${title}.${FORMAT}" run_ffmpeg "${audio_file}" "${track_start_s}" "${track_duration}" "${track_title}.${FORMAT}"
n=$((n + 1))
done done
} }
@ -115,11 +129,15 @@ usage(){
echo "song-list line format example: 1:30 My second track of the playlist" echo "song-list line format example: 1:30 My second track of the playlist"
echo "show output format: start end title" echo "show output format: start end title"
echo echo
echo "envvar: SIMULATION [0|1] (do not invoke ffmpeg)" echo "envvar: SIMULATION, if non empty, do not invoke ffmpeg"
echo "envvar: FORMAT [mp3,ogg,opus,…] (see the ffmpeg documentation)" echo "envvar: NONUMBER, if non empty, do not write song number"
echo "envvar: WITH_NUMBER [separator] (not null = write song number, with this separator)" echo "envvar: FORMAT [mp3,ogg,opus,…], see the ffmpeg documentation"
echo " example: WITH_NUMBER=_ Song names will be 1_song.opus 2_song.opus…" echo "envvar: SEPARATOR [separator] (default: ' - '), write song number, with this separator"
echo "envvar: QUIET (if set to any value, ffmpeg commands are not displayed)" echo " example with SEPARATOR='_': song names will be 01_song.opus 02_song.opus…"
echo "envvar: VERBOSITY [0-3] (default: 1)"
echo " VERBOSITY 0: no output exept errors from ffmpeg"
echo " VERBOSITY 1: simple indications on the current track being extracted"
echo " VERBOSITY 2: print actual ffmpeg commands the script currently runs"
} }
if [ $# -lt 1 ]; then if [ $# -lt 1 ]; then
@ -130,12 +148,32 @@ fi
command=$1 command=$1
shift shift
if [ "$FORMAT" = "" ]; then
echo "default FORMAT: opus"
FORMAT="opus"
fi
if [ "$VERBOSITY" = "" ]; then
echo "default VERBOSITY: 1"
VERBOSITY=1
fi
# Assume that there should be a separator.
if [ "$SEPARATOR" = "" ]; then
echo "default SEPARATOR: ' - '"
SEPARATOR=" - "
fi
if [ "$SIMULATION" != "" ]; then
echo "SIMULATION envvar is set: this is a simulation."
fi
case "x-${command}" in case "x-${command}" in
x-show) x-show)
# Takes the audio file in first parameter # Takes the audio file in first parameter
if [ $# -ne 2 ]; then if [ $# -ne 2 ]; then
echo "Usage: $0 show music-file time-stamps-file" echo "Usage: $0 show music-file time-stamps-file" >&2
exit 1 exit 1
fi fi
@ -146,12 +184,13 @@ case "x-${command}" in
# Takes the audio file in first parameter # Takes the audio file in first parameter
if [ $# -ne 2 ]; then if [ $# -ne 2 ]; then
echo "Usage: $0 show music-file time-stamps-file" echo "Usage: $0 show music-file time-stamps-file" >&2
exit 1 exit 1
fi fi
rip "$1" "$2" rip "$1" "$2"
;; ;;
*) *)
usage 1>&2 usage 1>&2
exit 1 exit 1