Well, I recently started backing up my not-copyrighted DVDs to hard drive; however the language is sometimes mixed up. In some English is the first, in others it’s German. So, I’ve come up with this little script which fixes it - and puts each file into order.

 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
#!/bin/bash

[ -x /usr/bin/bc ] || exit 1
[ -x /usr/bin/mkvmerge ] || exit 1
[ -x /usr/bin/mediainfo ] || exit 1

for file in $1/*.mkv; do
  # First, run mediainfo on the file.
  TRACK_ORDER="$( mediainfo '--Output=Audio;%ID/String% %Language%x' $file |
    grep -v '^$' )"

  TRACK1_ID="$( echo $TRACK_ORDER | cut -dx -f1 | cut -d  -f1 )"
  TRACK1_LANG="$( echo $TRACK_ORDER | cut -dx -f1 | cut -d  -f2 )"

  TRACK2_ID="$( echo $TRACK_ORDER | cut -dx -f2 | cut -d  -f1 )"
  TRACK2_LANG="$( echo $TRACK_ORDER | cut -dx -f2 | cut -d  -f2 )"

  case $TRACK1_LANG in
    "de") NEEDS_FIX=1 ;;
    *) NEEDS_FIX=0 ;;
  esac

  if [ $NEEDS_FIX -eq 1 ] ; then
    OPTS_1="--language $TRACK1_ID:ger --track-name $TRACK1_ID:German"
    OPTS_2="--default-track $TRACK1_ID:no --forced-track $TRACK1_ID:no"
    OPTS_3="--language $TRACK2_ID:eng --track-name $TRACK2_ID:English"
    OPTS_4="--default-track $TRACK2_ID:yes --forced-track $TRACK2_ID:no"
    OPTS_5="--track-order 0:1,0:$TRACK2_ID,0:$TRACK1_ID"
    OPTS="$OPTS_1 $OPTS_2 $OPTS_3 $OPTS_4 $OPTS_5"
  else
    OPTS_1="--language $TRACK2_ID:ger --track-name $TRACK2_ID:German"
    OPTS_2="--default-track $TRACK2_ID:no --forced-track $TRACK2_ID:no"
    OPTS_3="--language $TRACK1_ID:eng --track-name $TRACK1_ID:English"
    OPTS_4="--default-track $TRACK1_ID:yes --forced-track $TRACK1_ID:no"
    OPTS="$OPTS_1 $OPTS_2 $OPTS_3 $OPTS_4"
  fi

  mkvmerge -o $file.new --language "1:eng" --default-track "1:yes"
    --forced-track "1:no" --audio-tracks "$TRACK1_ID,$TRACK2_ID"
    --video-tracks "1" --no-subtitles --no-track-tags
    --no-global-tags $OPTS $file
done