aboutsummaryrefslogtreecommitdiff
path: root/scripts/music/split-album.sh
blob: d7a23a4c10102ed10009b1129fb87ab9e9fd77f5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#!/usr/bin/env bash

MUSIC_DIR="$HOME/Downloads/music";
EXT=opus;

AUDIO_FILE="$1";
TIMESTAMPS_FILE="$2";

ALBUM_ARTIST=$(echo "$TIMESTAMPS_FILE" | sed -e 's/^.*\///g' -e 's/\.splits$//');

ARTIST="$(echo $ALBUM_ARTIST | awk -F' - ' '{print $1}')";
ALBUM="$(echo $ALBUM_ARTIST | awk -F' - ' '{print $2}')";

OUT_DIR="$MUSIC_DIR/$ARTIST/$ALBUM";
[[ ! -d "$OUT_DIR" ]] && mkdir -p "$OUT_DIR";

AUDIOINFO=$(mediainfo "$AUDIO_FILE" --Output=JSON);
DURATION=$(echo -e "$AUDIOINFO" | jq -r '.media.track[0].Duration');

TOTAL_TRACKS=$(cat "$TIMESTAMPS_FILE" | wc -l);

add_tags() { ~/scripts/music/tag.sh "$@"; }

padd() { printf "%0${2:-2}d" $(echo $1 | cut -d'.' -f1); }

to_timestamp() {
  local duration=$1;
  local hours=$(echo "$duration / 3600" | bc);
  duration=$(echo "$duration % 3600" | bc);
  local mins=$(echo "$duration / 60" | bc);
  local secs=$(echo "$duration % 60" | bc);
  echo "$(padd $hours):$(padd $mins):$(padd $secs)";
}

starttime="";
music="";
index=0;

(cat "$TIMESTAMPS_FILE"; echo "<<END") | while read split; do
  if [[ ! -z "$split" ]]; then
    if [[ "$split" == "<<END" ]]; then
      endtime=$(to_timestamp $DURATION);
    else
      endtime="$(echo $split | cut -d' ' -f1)";
      nextmusic="$(echo $split | cut -d' ' -f 2-)";
    fi;

    if [[ ! -z "$music" ]]; then
      output="$OUT_DIR/$(padd $index) - $music.$EXT";
      echo "$starttime - $endtime ($output)";
      ffmpeg \
        -nostdin -y \
        -loglevel -8 \
        -i "$AUDIO_FILE" \
        -ss "$starttime" \
        -to "$endtime" \
        -vn "$output" && \
      add_tags \
        -a "$ARTIST" \
        -A "$ALBUM" \
        -t "$music" \
        -n "$music" \
        -N "$TOTAL_TRACKS" \
        "$output" \
      ;
    fi;

    music=$nextmusic;
    starttime=$endtime;
    index=$((index + 1));
  fi;
done;