Automatisk FLAC til MP3 mirror sync

marsboer

Hi-Fi freak
Ble medlem
04.04.2010
Innlegg
4.356
Antall liker
1.701
Sted
Phobos
Jeg fant ingen gode løsninger for å lage et automatisk oppdatert MP3 mirror av FLAC-biblioteket mitt som også inkluderer mappestruktur og alle metafiler med cover art og tilsvarende, så jeg lagde et script som gjør jobben på en smart og helautomatisk måte slik at dette kan gå raskt og effektivt selv på massive FLAC bibliotek uten interaksjon med brukeren. Scriptet fungerer kun for Linux og er tiltenkt å kjøre direkte på serveren med FLAC-biblioteket. Uansett tenkte jeg at dette kunne være av generell interesse selv om målgruppen sikkert er smal. Informasjon om scriptet finnes her: https://wiki.proikt.com/wiki/index.php/FLAC_to_MP3_mirror_sync
 

Class

Hi-Fi freak
Ble medlem
11.03.2009
Innlegg
2.763
Antall liker
496
Sted
Vestfold
Torget vurderinger
7
Jeg gjorde noe lignende med samme programvare for en tid tilbake da jeg hadde mobil med Android og det var masete med musikken i Apple Lossless.
Håper noen vil finne det nyttig, takk.
 

H.R

Hi-Fi freak
Ble medlem
14.12.2008
Innlegg
8.078
Antall liker
6.491
Sted
Jessheim | Ullensaker
Torget vurderinger
5
Nice. Dette er forøvrig innbygget som default i vortexbox. Der er også automatisk flac til ALAC default. Kun å merke checkboxen for hver enkelt.
 

marsboer

Hi-Fi freak
Ble medlem
04.04.2010
Innlegg
4.356
Antall liker
1.701
Sted
Phobos
Da har jeg lagt til en del nødvendig funksjonalitet:

- Lagt til støtte for de aller fleste tags jeg benytter meg av
- Lagt til støtte for vorbis sine multi tags, f.eks flere artist/genre/albumartist tags, med id3v2s (ikke like bra) standardiserte metode med ' / ' separator, noe som tolkes korrekt i de fleste ordentlige avspillerprogrammer.
- Automatisk downmixing av surround opptak til 2 channel vha SoX
- Automatisk resampling av alt over 44.1kHz til 44.1kHz vha SoX' high quality resamplingsalgoritme (standard 2 ch 44.1kHz filer blir selvsagt ikke resamplet)

Bortsett fra et par manglende tags av mindre viktig betydning til formålet med mp3-filene (WORK og COMPILATION) og det at jeg ikke har lagt til automatisk kalkulering av replaygain (som jeg ikke benytter meg av uansett) så er dette nå nær perfeksjon for mitt bruk. Jeg skal imidlertid se på disse tingene en dag.
 

bambadoo

Æresmedlem
Moderator
Ble medlem
11.10.2002
Innlegg
22.082
Antall liker
10.481
Sted
Lørenskog
Torget vurderinger
16
Nydelig Marsboer. Kommer til å prøve denne. Har selv "batchet" med foobar for å gjøre dette tidligere men ikke fått det heeeeelt til. Bare 99%
 

marsboer

Hi-Fi freak
Ble medlem
04.04.2010
Innlegg
4.356
Antall liker
1.701
Sted
Phobos
Da har jeg ryddet opp skikkelig i tag-mekanismen og jeg har gått over til eyed3 i stedet for id3v2 som verktøy for tagging på grunn av mangler ved sistnevnte. Nå støttes alle tags og jeg har implementert støtte for absolutt alle jeg benytter i mitt bibliotek, både i enkel og multi tag versjoner. Ved hjelp av litt bash-magi med associative arrays (holdt på å skrive om scriptet til python fordi bash tradisjonelt kun støttet endimensjonale arrays, noe som suger til akkurat denne typen jobber) har jeg lagt til to arrays i toppen av scriptet, henholdsvis "tags" og "user_defined_tags", eller "TXXX"-tags på id3-språket. Her kan dere selv legge til vorbis->id3 mappinger og scriptet vil automatisk benytte seg av dem om dere mangler noe fra default oppsettet.

Æ, Ø og Å er også fullt støttet. Jeg endte opp med id3v2.3 og latin1 som tegnsett fordi dette var den eneste kombinasjoen som fungerte 100% i så godt som alle media playere, inklusive windows media player.
 

marsboer

Hi-Fi freak
Ble medlem
04.04.2010
Innlegg
4.356
Antall liker
1.701
Sted
Phobos
hadde det kjørt greit på windows hadde det jo vert fint :)
Hvis jeg lager en python-versjon av scriptet så er det i det minste teoretisk mulig. eyed3 har en python ekvivalent og man klarer vel å få inn både flac, lame, rsync og sox på Windows. Jeg ser imidlertid for meg at dette blir et skikkelig grisete opplegg og siden jeg ikke har bruk for en Windows-versjon selv så kommer jeg ikke til å bruke tid på det. Jeg er imidlertid glad i python, så det er mulig det blir en python variant, men optimalisert for Linux en dag. Egentlig bare for å få penere kode :)
 

marsboer

Hi-Fi freak
Ble medlem
04.04.2010
Innlegg
4.356
Antall liker
1.701
Sted
Phobos
Da er målet nådd 100% og replay gain tagging er også implementert, inkludert både track og album gain (album gain forutsetter at alle filer som tilhører samme album eller disk ligger i samme mappe). Jeg har imidlertid gjort replay gain enkel å slå av for de som ikke benytter funksjonaliteten, siden det legger til en god del tid på første sync.
Versjon 1.1.0 er gjeldende versjon og den mangler nå ingen funksjonalitet i forhold til mitt opprinnelige mål.

mp3gain er lagt til som en avhengighet for replay gain tagging forresten.
 
N

nb

Gjest
Stilig - skal benytte meg av dette ved anledning. Hadde tenkt å skrive noe selv, men da mine scriptingkunnskaper ligger "litt" under ditt nivå hadde jeg nok aldri fått til noe med så mye funksjonalitet. Takk for vel utført arbeide! (har ikke testet men tar det for gitt at dette funker som tiltenkt....)
 

nma

Hi-Fi freak
Ble medlem
07.12.2003
Innlegg
4.696
Antall liker
518
Torget vurderinger
1
Helt konge! Hadde det vært mulig å gjort det om til å gjenkjenne både flac og alac (via ffmpeg/libav)? Det hadde jo vært veldig fint for oss mac-infiserte.
 

marsboer

Hi-Fi freak
Ble medlem
04.04.2010
Innlegg
4.356
Antall liker
1.701
Sted
Phobos
Etterhvert som scriptet har pløyd gjennom samlingen min så jeg at spesielt taggingen feilet i noen få tilfeller. Det viste seg at det var en rekke problemer med filnavn som inneholdt bash-spesialtegn som $, flere dasher etterhverandre '' eller ''''', mange spaces etter hverandre og filnavn med [] som senere ble brukt i regexer i scriptet (hvor disse har spesiell betydning). Jeg har nå gjort svært grundige tester med de mest brutale filnavn jeg kunne finne på og scriptet har nå fått en rekke fikser for å håndtere disse uten feil (som jeg finner i hvertfall). Selv om svært få filer har disse problemnavnene, så ville scriptet i versjon 1.1.0 likevel ende opp med en fil uten ordentlig tag som likevel får korrekt timestamp slik at den ikke blir syncet i neste runde. I tillegg til å fikse problemene jeg fant har jeg har nå endret scriptet slik at filen aldri vil få riktig timestamp dersom taggingen feiler, slik at eventuelle skjulte problemer i det minste vil forårsake at filene blir konstant syncet på nytt ved neste anledning i håp om at problemet blir ordnet.

I tillegg har jeg fjernet et potensielt timing problem hvor man med v1.1.0 kunne risikere at man ved lange syncejobber kunne klare å endre på en flac mellom henholdsvis enkodingsdelen og replaygaindelen uten at dette ble tatt høyde for slik at filen ikke ble syncet på nytt neste runde. Nå er ikke dette noe tema lenger.

v1.1.1 ligger nå ute. Ingen ny funksjonalitet, men en rekke småproblemer som kunne gå utover integriteten til mp3-mirroret er ordnet. Jeg anbefaler derfor på det sterkeste å benytte denne versjonen, og faktisk også regenerere eventuelt påbegynte mp3-mirror operasjoner (dvs slette mp3-mappen og begynnet på nytt) for å være helt sikker på at du ikke har noen manglende eller feilaktige tags.
 

marsboer

Hi-Fi freak
Ble medlem
04.04.2010
Innlegg
4.356
Antall liker
1.701
Sted
Phobos
Helt konge! Hadde det vært mulig å gjort det om til å gjenkjenne både flac og alac (via ffmpeg/libav)? Det hadde jo vært veldig fint for oss mac-infiserte.
Nå som jeg i utgangspunktet er "ferdig" med scriptet, med mindre jeg ser noen flere bugs som må fikses, så kan jeg godt sjekke ut hvor ille det blir å inkludere støtte for alac. Selve reenkodingen og sync-delen er jeg ikke bekymret for i det hele tatt, men tags skal jo også håndteres 100% korrekt fra det formatet alac benytter. Jeg må sjekke ut hvor brukbare linux-verktøyene for dette er.
 

marsboer

Hi-Fi freak
Ble medlem
04.04.2010
Innlegg
4.356
Antall liker
1.701
Sted
Phobos
Og da viser bash seg nok en gang fra sin verste side. Det viser seg at en del ting som er akseptert i tags langt i fra er like aksepterbart når man vil ha 100% gjengivelse av tagen når den fôres via kommandolinjen. Jeg holder på å fikse de av dem jeg har kommet over nå (tags med backticks og double quotes lager morro kombinert med bash-kommandolinje). Det fine er om du har kjørt 1.1.1 på jobben til nå, siden filene det gjelder uansett resynces neste gang fordi taggingen ikke gikk helt i orden. Du trenger derfor ikke starte på nytt slik som fra 1.1.0 til 1.1.1. Jeg kommer snart med en ny versjon. awk kommandoen som sørger for å tilpasse tagene slik at de blir spiselige for bash og eyeD3 begynner å bli stygg nå :D

Jeg kjenner lysten til å ommøblere scriptet til en python variant blir større og større. Bash og escaping er et helvete når ting blir litt komplisert med så random input som tags og kreative filnavn hvor bash spesielle karakterer er tillatte bokstaver.
 
Sist redigert:

marsboer

Hi-Fi freak
Ble medlem
04.04.2010
Innlegg
4.356
Antall liker
1.701
Sted
Phobos
Da er v 1.1.2 ute. Fikser tagging-issues dersom tags inneholder helt spesifikke bash-spesialtegn.

Når scriptet klarer konstruerte filbaneutfordringer som dette så regner jeg med at det meste skal være luket ut, men det kan ligge noen godsaker på lur i tags enda:
Kode:
"Z:\Temp\Dev\music [mp3] $$$ æ''''      '$''\Björk$ ``` ''''         ``\2004 - Medúlla [24bit 96kHz]\07 - Moments Musicaux. Op. 16 - no. 4 Presto ''' `````      $$$$$$$ []]{]} - Copy.mp3"

Det eneste problemet jeg ser nå er denne, som kun gjelder dersom latin1 er valgt som tegnencoding: https://wiki.proikt.com/wiki/index.php/FLAC_to_MP3_mirror_sync#Troubleshooting
Dette er imidlertid ikke en bug, men et valg man må ta i forhold til kompabilitet.
 

marsboer

Hi-Fi freak
Ble medlem
04.04.2010
Innlegg
4.356
Antall liker
1.701
Sted
Phobos
Det viste seg at det var den noe gamle versjonen av eyeD3 i Debian repositoryene som lagde kvalm med unicode hos meg. Med siste version av eyeD3 fungerer alt strøkent. Versjonen er imidlertid ikke kompatibel med gamle eyeD3 versjoner syntaxmessig noe som medfører at siste versjon 1.1.3 av mp3-mirror ikke kan brukes med den gamle eyed3. Standard encoding er nå endret til UTF16 og alt fungerer svært bra også i windows media player. Med andre ord spiser scriptet nå alt av karakterer og tegn jeg klarer å kaste på det og det spytter ut kompatible tags.

Det skulle være den siste brikken (latin1 -> utf16, og fjerne bugen i eyeD3 med unicode karakterer i user-defined-tags)

https://wiki.proikt.com/wiki/index.php/FLAC_to_MP3_mirror_sync#Download_the_script
 
Sist redigert:

marsboer

Hi-Fi freak
Ble medlem
04.04.2010
Innlegg
4.356
Antall liker
1.701
Sted
Phobos
Det dukker stadig opp noen bugs på grunn av uventet oppførsel i programmer scriptet er avhengig av. Det viser seg at mp3gain benytter RVA2-tagen for å detektere om filen har replaygain kalkulert eller ikke. Siden RVA2 kun er id3v2.4 kompatibel, og jeg vil ha 2.3 på grunn av kompatibilitet med blant annet Windows Media Player og det meste annet, må denne taggen fjernes etter at mp3gain har gjort jobben sin. Dette medførte da at mp3gain kalkulerte replaygain for alle filer ved hver gjennomkjøring, noe som ble tidkrevende. For sikkerhets skyld overskriver ikke mp3gain de eksisterende tagene om RVA2 mangler heller, bare legger til nye og identiske for hver gjennomkjøring, noe som gjør at det hoper seg opp med tags. Uansett så har jeg nå laget en egen deteksjonsalgoritme for dette, uavhengig av idiotlogikken i mp3gain, slik at man får pålitelig oppførsel på replaygain med id3v2.3. Jeg la da også til en logikk som medfører at replaygain rekalkuleres for alle filene i albumet (mappen) selv om kun en fil er endret/mangler tags, for å være sikker på at replaygain_album_* har korrekte verdier.

I tillegg har jeg nå gjort scriptet case insensitivt på flac-suffixet for å være litt mer brukervennlig for de som ikke har stålkontroll på filnavn i biblioteket. Selve filnavnmatchingen er case sensitiv, slik at endringer på case i filnavnet på FLAC-filen blir syncet over til mp3-mirroret, men selve .flac filendelsen kan nå skrives på hvilken som helst måte og likevel bli syncet.

Legg til litt forenkling av kode så har vi v1.1.5 av mp3-mirror.sh: http://www.marsboer.net/shared/mp3-mirror/v1.1.5/mp3-mirror.sh
 

marsboer

Hi-Fi freak
Ble medlem
04.04.2010
Innlegg
4.356
Antall liker
1.701
Sted
Phobos
Da har jeg laget en ny optimalisering av scriptet, nemlig parallellisering for å utnytte multi-CPUer bedre.

Siden scriptet baserer seg på å pipe output fra SoX direkte inn i Lame så er det slik at scriptet allerede var parallellisert noe i form av at lame encodingen og flac-dekodingen/sox-prosesseringen skjedde i ulike prosesser og dermed ble parallellisert. Men nå har jeg skrevet om scriptet slik at hele reenkodingsprosessen, både deteksjon av endrede filer, reenkoding og tagging, skjer i parallell med et egendefinert antall samtidige prosesser. Siden dekoding/enkoding allerede er parallellisert bør man ikke velge alle CPUer, men N-1 fungerer fantastisk her med min quad core, dvs 3 samtidige prosesser.

I tillegg har jeg parallellisert replaygain delen, slik at også dette kan fungere på samme måte. Dette gjøres imidlertid på per directory basis for å kunne benytte replaygain_album_* logikken i mp3gain direkte. Det vil si at man f.eks replaygainer 3 directories i parallell.

Som en konsekvens av all parallelliseringen er nå output fra alle underprosesser fjernet, og kun en enkel (fargelagt) statusmelding printes til skjerm for hver fil som prosesseres. Alt annet blir tilfeldig kaos.

Alt i alt er scriptet nå lynraskt, både på sjekk av eksisterende filer som ikke trenger å endres (siden dette også skjer i parallell), og på alle de tunge prosessene.
Jeg skal imidlertid teste det noe mer før jeg frigir den nye varianten, men jeg ser ingen problemer sålangt.
 

tore_v1

Hi-Fi freak
Ble medlem
19.09.2007
Innlegg
2.181
Antall liker
102
Torget vurderinger
2
Hadde jeg hatt en linux-basert filserver (jeg har en QNAP 659+ Pro II) hadde jeg antakeligvis vært evig takknemlig. Jeg er i stedet imponert over hva du får til - og givergleden din ved at du deler dette fritt med resten av forum!

Hat-tip to marsboer.
 

coolbiz

Hi-Fi freak
Ble medlem
31.03.2006
Innlegg
9.169
Antall liker
4.758
Sted
Sydvestlandet
Torget vurderinger
2
Glimrende, marsboer! Jeg hadde så smått begynt å knote sammen et perl-script for å gjøre dette, men nå sparer du meg for den jobben.

Takker & bukker.
 

marsboer

Hi-Fi freak
Ble medlem
04.04.2010
Innlegg
4.356
Antall liker
1.701
Sted
Phobos
v2.1.0 er ute. Ingen bugfixer av noe slag, men en opprydding og refaktorering av koden, samt integrasjon av 1-prosess verbosity direkte i parallell-versjonen slik at jeg slipper å ha to versjoner av scriptet.

https://wiki.proikt.com/wiki/index.php/FLAC_to_MP3_mirror_sync

Nå som koden er "cleanere" i form ser jeg at det å inkludere ALAC-støtte omtrent bare skulle være å lage en tilsvarende funksjon tilsvarende flac_to_mp3 i scriptet, og ellers bare bytte ut flac med alac. Det vil si en ganske triviell greie. Jeg har imidlertid ikke en eneste ALAC-fil å teste med.

Takk for skryt forresten. Jeg håper scriptet gjør nytten for flere. Serveren min går i hvertfall varm av å mose på med over 90% CPU-bruk på alle fire CPU-kjernene her, og resultatet er så langt jeg kan se et 100% perfekt mirror av FLAC-biblioteket mitt og som plukker opp alle typer endringer på filene, uansett karakterer og tags, på raskest mulig vis. Men helt trivielt var det ikke, mest på grunn av bash og spesialtegnproblematikk :)
 
Sist redigert:

marsboer

Hi-Fi freak
Ble medlem
04.04.2010
Innlegg
4.356
Antall liker
1.701
Sted
Phobos
Nå som all funksjonaliteten var på plass og scriptet holder mp3-mirroret av ca 43 000 FLAC filer i sync, var det på tide å optimalisere ytelsen. Førstegangssync er det ikke noe å gjøre med siden tiden benyttes på ren reenkoding og replaygain prosessering. Men i et ferdig syncet bibliotek gikk det imidlertid med mye tid både på å verifisere at eksisterende mp3-filer faktisk hadde en flac ekvivalent og ikke minst sjekking av om replaygain var kalkulert for filene. Siden funksjoanliteten allerede var i boks, kunne jeg nå finne bedre løsninger som er mer effektive enn de mer intuitive og rett-frem løsningene man typisk tyr til når funksjonaliteten først skal implementeres.

- mp3-validering mot flac-ekvivalenten er nå redusert fra å ta ca 6 minutter til 1,6 sek for en enkelt samtidig prosess og fra ca 1:30 min til 1,6 sek for 4 samtidige prosesser, med andre ord en brutal reduksjon.

- sjekking av om filen hadde fått replaygain kalkulert eller ei var det som tok desidert lengst tid siden jeg måtte sjekke om tagene eksisterte. Her har jeg imidlertid gjort om hele tilnærmingen slik at tiden som benyttes til dette nå er ca 0 sekunder i stedet for 14 minutter. Replaygain valideres fremdeles, men på en mye mer effektiv måte som ikke involverer å sjekke tagen i hver eneste fil ved hver sync.

Totalt tar en sync-sjekk av hele FLAC-biblioteket på 1.3TB (gitt ingen endrede filer) nå 1 minutt og 10 sekunder i stedet for 17 minutter som det tok i forrige versjon. Nå er det rett og slett ikke noe særlig mer å hente, siden det er et ønske fra min side at scriptet skal være helt historie- og tilstandsløst slik at det kan avbrytes når som helst og fortsette der det slapp kun basert på selve innholdet i bibliotekene. Med andre ord skal det ikke være noen avhengigheter av databaser eller tilsvarende for å holde på en tilstand eller data mellom syncjobber.

Den nye, langt raskere, logikken finnes i versjon 2.2.0.
https://wiki.proikt.com/wiki/index.php/FLAC_to_MP3_mirror_sync#Download_the_script
 
Sist redigert:

marsboer

Hi-Fi freak
Ble medlem
04.04.2010
Innlegg
4.356
Antall liker
1.701
Sted
Phobos
Cool new stuff in v2.3.0: https://wiki.proikt.com/wiki/index.php/FLAC_to_MP3_mirror_sync#Custom_tag:_FLAC_MD5

Jeg var i siget, så da implementerte jeg dette, inspirert av noe jeg leste på et eller annet forum om et perl-script som er i omløp. Siden et stort flertall av alle endringer på eksisterende filer i et bibliotek er i form av tag endringer, så er dette svært betydningsfull funksjonalitet, spesielt om man massetagger mange filer i slengen.

Det er altså snakk om at scriptet kun retagger filen, i stedet for en full reencode, dersom audiodataene fremdeles er de samme. Replaygain tags kopieres direkte over dersom de tilfredsstiller minimumskravene, slik at man slipper å replaygaine albumet på nytt.
 
Sist redigert:
Topp Bunn