marsboers FLAC-scripts (Linux)

marsboer

Hi-Fi freak
Ble medlem
04.04.2010
Innlegg
4.356
Antall liker
1.701
Sted
Phobos
Etter forespørsel legger jeg her ut to bash-scripts jeg har skrevet fra scratch for å utføre tre vanlige oppgaver for å alltid ha et 100% optimalt FLAC-bibliotek.
Disse scriptene kjører man i kommandolinjen i Linux og krever at man har FLAC installert. FLAC kan vanligvis installeres direkte via pakkebrønner i de fleste OS. Det er viktig at man også får med metaflac verktøyet. Dette er i hvertfall med som standard i Debian som jeg selv kjører.

I Debian installerer man FLAC med "aptitude install flac"

Jeg regner med at dette er noe som bare er interessant for de aller færreste, men det er nå så.
Av en eller annen grunn kommenterer jeg alltid på engelsk når jeg scripter men det får dere leve med.

SCRIPT 1: flac_test
Poenget med dette scriptet er bare å gå gjennom alle FLAC-filer som finnes innenfor den angitte mappelokasjonen med undermapper og kjøre en FLAC-test på dem. Denne testen går ut på å kjøre en ordinær dekoding av fila, men uten å faktisk skrive noe data. Hensikten med dette er å finne alle FLAC-filer som har en eller annen feil. Disse feilene kan gi seg utslag i at applikasjoner/squeezeboxer med flere får problemer eller henger. Jeg kan f.eks tenke meg at det kan oppstå problemer i forbindelse med spoling og tidsangivelse i en sang om filen ikke er helt i orden. Dette kan også tyde på at et eller annet har blitt gjort feil i rippeprosessen. Dette er et svært enkelt script som genererer en fil som inneholder alle filene med feil. Denne listen printes ut til skjerm som en oppsummering når scriptet har testet alle FLAC-filene i den angitte mappestrukturen.

Bruk:
./flac_test <sti til mappestruktur med FLAC-filer som skal testes>

Husk chmod +x for å gjøre scriptet kjørbart

Kode:
#!/bin/bash
#
# Author: Hans-Kristian Bakke
# Date: 05.08.2010
#
####

ERRORS="$HOME/flac_test.log"

rm -f "$ERRORS"

find "$1" -iname *.flac -print0 | while read -d $'\0' FILE
do
	flac -t "$FILE"
	if ! [ $? -eq 0 ]
	then
		echo "-> $FILE" >> "$ERRORS"
	fi
done

if [ -e "$ERRORS" ]
then
	echo -e "\n---\n\nThe following files failed the FLAC decode test:"
	cat "$ERRORS"
	echo -e "\n"
fi
Scriptet ligger også vedlagt (i UNIX-format, så filen må åpnes i f.eks notepad++ eller wordpad for å vises korrekt)
 

Vedlegg

marsboer

Hi-Fi freak
Ble medlem
04.04.2010
Innlegg
4.356
Antall liker
1.701
Sted
Phobos
marsboer FLAC-scripts (Linux)

SCRIPT 2: flac_reencode

ADVARSEL:
Dette scriptet tar vare på alle tags gjennom reenkodingsprosessen, men IKKE cover art om dette er lagt i tagen i stedet for en .jpg-fil eller tilsvarende. Jeg benytter kun folder.jpg og tilsvarende selv og ønsker derfor å være sikker på at ingen av filene mine har cover art i tags. Dette er med andre ord en bevisst "rensende" feature basert på min egen ønskede bruk.
Den som ønsker det motsatt står fritt til å modifisere scriptet.

BRUK:
-> ./flac_reencode <sti til mappestruktur med FLAC-filer>
Dette kan ta laaang tid avhengig av antallet filer, så jeg anbefaler å kjøre scriptet med f.eks screen, som lar deg åpne et nytt konsoll som du kan koble deg fra og senere koble deg til igjen uten at det som kjører der avbrytes.

-> screen
-> ./flac_reencode <sti til mappestruktur med FLAC-filer>
-> Gå ut av det nye konsollet ved å trykke CTRL-A og deretter CTRL-D (A gjør at screen vet at man skal sende en kommando til screen selv, mens D detacher konsollet og går tilbake til opprinnelig shell

For å reattache senere
-> screen -r

--------------------

Dette scriptet kan kjøres i 2 modus, avhengig av hva ALL er satt til i scriptet.

Den første, ALL="0", sjekker flac-versjonen på den installerte FLAC-codecen og går deretter gjennom alle FLAC-filer i valgt mappestruktur og sjekker versjonen på hver fil. Om det detekteres at en fil har enn annen versjon enn den installerte versjonen reenkodes fila.

--------------------

ALL="1" reenkoder alle filer uavhengig av versjon.
Formålet med å gjøre denne tilsynelatende meningsløse operasjonen er flere:

- Kun FLAC-tagene (også kjent som Vorbis comments) blir tatt vare på gjennom reenkodingen. Det vil si at de FLAC-filene som feilaktig har blitt tagget med id3-tags i tillegg til FLAC-tagene nå får kun det ene og korrekte tag-formatet. Filer som har begge disse tag-typene satt vil ofte ha problemer med at kun den ene typen vises i avspiller- eller tagprogrammet slik at du selv om du er sikker på å ha fjernet eller korrigert en eller annet tag likevel ikke blir kvitt den feilaktige tagen når du spiller av FLAC-filen. Dette avfeies ofte som en bug, men skyldes nesten alltid at man har skjulte id3-tager som har blitt lagt inn av feilkonfigurerte rippeprogrammer (mest vanlig før)

- Man får alle FLAC-filene lagret med samme kompresjonsgrad. FLAC-utviklerne selv anbefaler verdien 5 (som er default) og det er ingen grunn til å øke komprimeringsgraden. Jeg har selv gjort forsøk med verdi 9 (høyeste kompresjon) noe som kun ga besparelser på noen kilobyte, og langt i fra på megabyte skalaen. Enkodingstiden økte imidlertid drastisk. Om man er uenig med valget av 5 så kan man endre dette i flac-enkoding kommandoen i scriptet. Det ryktes at de høyeste kompresjonsverdiene kan gi noen problemer på avspillere som Squeezebox, men dette er ikke bekreftet av meg selv.

- Scriptet drar ikke med seg cover art fra tags. Med andre ord er man sikker på at ingen av filene har dette i tagen etter reenkoding, noe som gjør at man unngår konflikter der det er (potensielt ulik) cover art både i tag og i folderen i form av en folder.jpg-fil eller tilsvarende

- Man finner eventuelle feil (samme som flac_test). Disse blir rapportert i en sluttlogg slik som flac_test og må sjekkes ut manuelt i etterkant.

- Scriptet fjerner alle variasjoner av skrivemåter på FLAC-endelsene og sørger for at alle filer ender opp med .flac (og ikke .FLAC .flAC osv)

--------------------


Dette scriptet er vesentlig lengre og mer avansert enn flac_test. Ikke fordi selve operasjonen som gjøres er så mye mer avansert, men rett og slett fordi jeg må håndtere at scriptet kan bli avbrutt av ymse årsaker under eksekvering. Om dette hadde skjedd uten mekanismer for å håndtere uventet avbrudd ville man ha sittet igjen med halvferdige og ødelagte FLAC-filer, kanskje uten tags, uten noen god indikasjon på dette.
Scriptet er laget slik at man trygt kan avbryte scriptet med en restart, shutdown, kill eller CTRL-C mens det kjører. Scriptet vil da rydde opp i eventuelle temporære filer før det avslutter, slik at det ikke blir liggende igjen uønskede rester i strukturen. Man må da begynne helt på nytt igjen neste gang man kjører scriptet.

Worst case scenario er at man overstyrer kill-kommandoens standard SIGTERM-signal med KILL (9) signalet, eller en hard reset/shutdown, type umiddelbart strømbrudd. Da vil ikke scriptet kunne kjøre cleanup funksjonen for de temporære filene og man vil kunne sitte igjen med en <filnavn>.flac.bak fil, en <filnavn>.wav fil eller en uferdig <filnavn>.flac fil i mappen scriptet sto i da det ble terminert.
Om dette skulle skje er det slik at .bak-filen alltid er den originale filen i uendret form, så det er denne du ønsker å rename til .flac igjen og ta vare på.

TEST (for deres egen del):
Jeg anbefaler at dere tar en kopi av et album og tester scriptet på denne kopien før dere slipper det løs på hele samlingen. Det utviser ingen bugs som jeg vet om hos meg, men man vet aldri. Test også å avbryte scriptet med CTRL-C og sjekk at det ikke ligger igjen noen halvenkodede eller temporære filer. Om dere ønsker å teste feilhåndteringen kan dere åpne en av FLAC-filene i testalbumet i nano og slette noen tilfeldig valgte linjer i filen. Bare én linje holder for å trigge feil i dekodingen. Sjekk også at alle tags er beholdt.


Kode:
#!/bin/bash
#
# Author: Hans-Kristian Bakke
# Date: 06.08.2010
#
####
#
# WARNING:
# This script does not preserve cover art embedded in tags through the reencode. All other tags are preserved
#
# DEPENDENCIES:
# This script requires that you have FLAC (including metaflac) installed ("aptitude install flac" in Debian)
#
####

# Set ALL to 1 if you want to reencode all FLAC-files regardless of version.
# Set to 0 if you only want to reencode FLAC files encoded with previous versions of the FLAC encoder

ALL="0"

####

CUR_VERS=`flac -v | awk '/ / {print $2}'`
ERRORS="/tmp/flac_errors"
rm -f "$ERRORS"

function fail_decode() {
	echo "-> Decoding of "$FILE" failed" >> "$ERRORS"
	echo -e "-> Cleaning up temporary files..."
	rm -f "$WAV"
	rm -f /tmp/tmp_tag
	echo "-> OK"
}

function fail_encode() {
	echo "-> Encoding of "$WAV" failed" >> "$ERRORS"
	echo -e "-> Cleaning up temporary files..."
	rm -f "$NEWFILE"
	rm -f "$WAV"
	mv "$FILE.bak" "$FILE"
	rm -f /tmp/tmp_tag
	echo "-> OK"
}

function sig_decode() {
	echo -e "\n\nScript terminated by user!"
	fail_decode
	exit 1
}

function sig_encode() {
	echo -e "\n\nScript terminated by user!"
	fail_encode
	exit 1
}

find "$1" -iname *.flac -print0 | while read -d $'\0' FILE
do
	if [ $ALL == "0" ]
	then
		FLAC_VER=`metaflac --show-vendor-tag "$FILE" | awk '/ / {print $3}'`
		echo "(FLAC v$FLAC_VER) $FILE"
	fi

	if [ $ALL == "1" -o "$FLAC_VER" != "$CUR_VERS" ]
	then

		NAME="`echo $FILE | sed 's/..\{4\}$//'`"
		NEWFILE="$NAME.flac"
		WAV="$NAME.wav"

		# DECODE
		trap sig_decode SIGINT SIGTERM

		metaflac --export-tags-to=/tmp/tmp_tag "$FILE"

		flac -d "$FILE"
		ERR=$?

		if [ $ERR -eq 0 ]
	    then
			mv "$FILE" "$FILE.bak"
	    else
			fail_decode
			continue
		fi

		# ENCODE
		trap sig_encode SIGINT SIGTERM

		flac "$WAV"
		ERR=$?

		if [ $ERR -eq 0 ]
	    then
			rm -f "$WAV"
			rm -f "$FILE.bak"
		else
			fail_encode
			continue
		fi

		metaflac --import-tags-from=/tmp/tmp_tag "$NEWFILE"

		rm -f /tmp/tmp_tag

		trap - SIGINT SIGTERM
	fi
done

if [ -e "$ERRORS" ]
then
	echo -e "\n---\n\nThe following errors were detected:"
	cat "$ERRORS"
	echo -e "\n"
fi
 

Vedlegg

H.R

Hi-Fi freak
Ble medlem
14.12.2008
Innlegg
8.084
Antall liker
6.539
Sted
Jessheim | Ullensaker
Torget vurderinger
5
marsboer FLAC-scripts (Linux)

Glitrende!
Morro at du gidder å legge dette ut. Gleder meg til å teste ut dette!
 

Ludo

Hi-Fi freak
Ble medlem
08.08.2008
Innlegg
3.031
Antall liker
544
Sted
Sandefjord
Torget vurderinger
1
marsboer FLAC-scripts (Linux)

Dette er bra, tusen takk! En flott ressurs er du :)

Har lagt inn på serveren nå, kjører flac_test.sh as we speak! :)
 

Mbare

Hi-Fi freak
Ble medlem
25.02.2003
Innlegg
2.436
Antall liker
11
marsboer FLAC-scripts (Linux)

Strålende. Tester ut det første scriptet nå og det funker som faen, ser det ut som. Takk!
 

marsboer

Hi-Fi freak
Ble medlem
04.04.2010
Innlegg
4.356
Antall liker
1.701
Sted
Phobos
Jeg gjorde en ørliten endring i script 1. Jeg byttet ut -name *.flac med -iname *.flac. Dette er ikke et must, men gjør at de som eventuelt har FLAC-endelser med store bokstaver, eller en blanding av store og små, også blir tatt med. (i-en står for case insensitive)
 
Topp Bunn