1
|
#!/bin/bash
|
2
|
#
|
3
|
# Convert all flac files to mp3 @ 128k using lame
|
4
|
#
|
5
|
# Thanks to http://blog.tordeu.com/?p=184 for snippets
|
6
|
#
|
7
|
if [ $1 ]; then
|
8
|
do_artist=$1
|
9
|
else
|
10
|
do_artist=""
|
11
|
fi
|
12
|
base_dir="${HOME}/Music"
|
13
|
high_dir="flac"
|
14
|
tmpy=/tmp/flac_downto_128k
|
15
|
bits_out=128
|
16
|
out_dir="mp3-${bits_out}kbit-resampled"
|
17
|
# Some stat counters
|
18
|
let n_artists=0
|
19
|
let n_albums=0
|
20
|
let n_tracks=0
|
21
|
let n_artists_r=0
|
22
|
let n_albums_r=0
|
23
|
let n_tracks_r=0
|
24
|
let n_artists_c=0
|
25
|
let n_albums_c=0
|
26
|
let n_tracks_c=0
|
27
|
last_artist=""
|
28
|
last_album=""
|
29
|
# Create a tmp directory for dumps
|
30
|
if [ ! -d "${tmpy}" ]; then
|
31
|
mkdir ${tmpy}
|
32
|
fi
|
33
|
# Scan through all of the high quality directories
|
34
|
for this_high_dir in ${high_dir}
|
35
|
do
|
36
|
# Scan for artists
|
37
|
echo "Scanning ${this_high_dir} directory ..."
|
38
|
ls -1 "${base_dir}/${this_high_dir}" > ${tmpy}/${this_high_dir}
|
39
|
# Scan for albums
|
40
|
while read artist
|
41
|
do
|
42
|
if [ "${do_artist}" = "" ] || [ "${do_artist}" = "${artist}" ]; then
|
43
|
let n_artists=$n_artists+1
|
44
|
# Scan for tracks
|
45
|
echo " Found ${artist} - scanning for albums ..."
|
46
|
artist_clean=`echo ${artist//[ \[\]()&;\'\"\,\’:*?]/_} | tr -s _ _ `
|
47
|
if [ "${artist}" != "${artist_clean}" ]; then
|
48
|
echo " Renaming ${artist} to ${artist_clean}"
|
49
|
mv "${base_dir}/${this_high_dir}/${artist}" "${base_dir}/${this_high_dir}/${artist_clean}"
|
50
|
artist=${artist_clean}
|
51
|
let n_artists_r=$n_artists_r+1
|
52
|
fi
|
53
|
ls -1 "${base_dir}/${this_high_dir}/${artist}" > ${tmpy}/${this_high_dir}-${artist}
|
54
|
while read album
|
55
|
do
|
56
|
let n_albums=$n_albums+1
|
57
|
echo " Found ${album} - scanning for tracks ..."
|
58
|
album_clean=`echo ${album//[ \[\]()&;\'\"\,\’:*?]/_} | tr -s _ _ `
|
59
|
if [ "${album}" != "${album_clean}" ]; then
|
60
|
echo " Renaming ${album} to ${album_clean}"
|
61
|
mv "${base_dir}/${this_high_dir}/${artist}/${album}" "${base_dir}/${this_high_dir}/${artist}/${album_clean}"
|
62
|
album=${album_clean}
|
63
|
let n_albums_r=$n_albums_r+1
|
64
|
fi
|
65
|
ls -1 "${base_dir}/${this_high_dir}/${artist}/${album}" > ${tmpy}/${this_high_dir}-${artist}-${album}
|
66
|
# Now the fun bit ... let's start re-encoding the track we've just found
|
67
|
while read track
|
68
|
do
|
69
|
track_clean=`echo ${track//[ \[\]()&;\'\"\,\’:*?]/_} | tr -s _ _ `
|
70
|
if [ "${track}" != "${track_clean}" ]; then
|
71
|
echo " Renaming ${track} to ${track_clean}"
|
72
|
mv "${base_dir}/${this_high_dir}/${artist}/${album}/${track}" "${base_dir}/${this_high_dir}/${artist}/${album}/${track_clean}"
|
73
|
track=${track_clean}
|
74
|
let n_tracks_r=$n_tracks_r+1
|
75
|
fi
|
76
|
this_source="${base_dir}/${this_high_dir}/${artist}/${album}/${track}"
|
77
|
this_dest=`echo ${base_dir}/${out_dir}/${artist}/${album}/${track} | sed 's/.flac/.mp3/g'`
|
78
|
# Check that it's a FLAC file
|
79
|
if [ `file "${this_source}" | grep -c "FLAC audio bitstream data"` = "1" ]; then
|
80
|
let n_tracks=$n_tracks+1
|
81
|
# Check the datestamps
|
82
|
source_date=`stat -c %Y "${this_source}"`
|
83
|
if [ -f "${this_dest}" ]; then
|
84
|
dest_date=`stat -c %Y "${this_dest}"`
|
85
|
else
|
86
|
dest_date=0
|
87
|
fi
|
88
|
# Only encode or copy if dest is older than source
|
89
|
if [ ${dest_date} -lt ${source_date} ]; then
|
90
|
##############################################
|
91
|
# Time to do what we were sent here to do!!! #
|
92
|
##############################################
|
93
|
# Get tag data from source.
|
94
|
# Artist
|
95
|
s_artist=`metaflac --show-tag=ARTIST "${this_source}" | awk -F "=" '{print $2}'`
|
96
|
# Album
|
97
|
s_album=`metaflac --show-tag=ALBUM "${this_source}" | awk -F "=" '{print $2}'`
|
98
|
# Track title
|
99
|
s_track=`metaflac --show-tag=TITLE "${this_source}" | awk -F "=" '{print $2}'`
|
100
|
# Genre
|
101
|
s_genre=`metaflac --show-tag=GENRE "${this_source}" | awk -F "=" '{print $2}'`
|
102
|
# Year
|
103
|
s_year=`metaflac --show-tag=DATE "${this_source}" | awk -F "=" '{print $2}' | awk -F "-" '{print $1}'`
|
104
|
# Track number
|
105
|
s_track_no=`metaflac --show-tag=TRACKNUMBER "${this_source}" | awk -F "=" '{print $2}'`
|
106
|
if [ `expr length "$s_track_no"` -eq 1 ]; then
|
107
|
s_track_no="0${s_track_no}"
|
108
|
fi
|
109
|
d_args="--ta \"${s_artist}\" --tg \"${s_genre}\" --tl \"${s_album}\""
|
110
|
d_args="${d_args} --tn \"${s_track_no}\" --tt \"${s_track}\""
|
111
|
if [ ! ${s_year} = "" ]; then
|
112
|
d_args="${d_args} --ty \"${s_year}\""
|
113
|
fi
|
114
|
# Create the directory if it doesn't exist
|
115
|
if [ ! -d "${base_dir}/${out_dir}/${artist}/${album}" ]; then
|
116
|
mkdir -p "${base_dir}/${out_dir}/${artist}/${album}"
|
117
|
fi
|
118
|
# Now re-encode
|
119
|
echo " Re-encoding ${track} (to mp3-${bits_out}kbit)"
|
120
|
#echo "flac -c -d \"${this_source}\" 2>/dev/null | lame -B 128 -V 4 ${d_args} - \"${this_dest}\" 2>/dev/null"
|
121
|
eval "flac -c -d \"${this_source}\" 2>/dev/null | lame -B 128 -V 4 ${d_args} - \"${this_dest}\" 2>/dev/null"
|
122
|
let n_tracks_c=$n_tracks_c+1
|
123
|
if [ "${artist}" != "${last_artist}" ]; then
|
124
|
let n_artists_c=$n_artists_c+1
|
125
|
fi
|
126
|
if [ "${album}" != "${last_album}" ]; then
|
127
|
let n_albums_c=$n_albums_c+1
|
128
|
fi
|
129
|
last_artist=${artist}
|
130
|
last_album=${album}
|
131
|
##########################
|
132
|
# Wasn't that simple?!?! #
|
133
|
##########################
|
134
|
else
|
135
|
echo " Skipping ${track} (file up-to-date)"
|
136
|
fi
|
137
|
else
|
138
|
# Not a flac, so just copy (if not already up-to-date)
|
139
|
# Check the datestamps
|
140
|
source_date=`stat -c %Y "${this_source}"`
|
141
|
if [ -f "${this_dest}" ]; then
|
142
|
dest_date=`stat -c %Y "${this_dest}"`
|
143
|
else
|
144
|
dest_date=0
|
145
|
fi
|
146
|
# Copy or skip?
|
147
|
if [ ${dest_date} -lt ${source_date} ]; then
|
148
|
# Create the directory if it doesn't exist
|
149
|
if [ ! -d "${base_dir}/${out_dir}/${artist}/${album}" ]; then
|
150
|
mkdir -p "${base_dir}/${out_dir}/${artist}/${album}"
|
151
|
fi
|
152
|
echo " Copying ${track} as not a flac"
|
153
|
cp "${this_source}" "${this_dest}"
|
154
|
else
|
155
|
echo " Skipping ${track} (file up-to-date)"
|
156
|
fi
|
157
|
fi
|
158
|
done <${tmpy}/${this_high_dir}-${artist}-${album}
|
159
|
done <${tmpy}/${this_high_dir}-${artist}
|
160
|
fi
|
161
|
done <${tmpy}/${this_high_dir}
|
162
|
done
|
163
|
echo ""
|
164
|
echo "Found ${n_tracks} tracks in ${n_albums} albums from ${n_artists} artists"
|
165
|
echo "Renamed ${n_tracks_r} tracks, ${n_albums_r} albums and ${n_artists_r} artists"
|
166
|
echo "Converted ${n_tracks_c} tracks in ${n_albums_c} albums from ${n_artists_c} artists"
|
167
|
echo ""
|
168
|
# Now clean up the tmp area
|
169
|
""rm -f -R ${tmpy}
|