Ripowanie płyt CD Audio w dystrybucjach Linuksa
W dobie serwisów streamingowych kupowanie płyt CD z muzyka, stało się swoistą cegiełką dla naszych ulubionych artystów. Mimo rozbudowanej biblioteki utworów, albumów czy wykonawców, niektórych tytułów może brakować lub kiedyś one występowały ale ze względu na zawirowania w prawach autorskich przestały być dostępne. Duże serwisy streamingowe raczej starają się posiadać bibliotekę najbardziej topowych utworów aby wygenerować jak najwięcej ruchu. Sam koncept takich serwisów jest fenomenalny. Za drobną opłatą mamy dostęp do bardzo dużej ilość róznej maści muzyki w naprawdę dobrej jakości. Oczywiście te serwisy nie są bez wad, jedną z nich napewno może sposób w jaki strumień dzwięku trafia na nasze urządzenia. Wykorzystywana jest tutaj technologia DRM, która jest zabezpieczeniem nie pozwalającym na odtworzenie utworów poza środowiskiem serwisu. To sprawia, że utwory znajdują się na naszym dysku, ale my poza aplikacjami związanym z tym serwiesem nie możemy nic z tym zrobić istny bloat. Pliki są zaszyfrowane a klucze deszyfrujące są zaszyte w aplikacji. Inną wadą jest czasami poprostu brak tego czego chcielibyśmy posłuchać - wspominałem już o tym. Więc jeśli czegoś tam niema to szukamy na innych serwisach. Niektóre z nich pozwalają na pobranie treści w bardziej lub mniej oficjalny sposób. Więc jeśli chcemy zabezpieczyć je przed potencjalnym zniknięciem, możemy je ściągnąć - co oczywiście nie jest zgodne z literą prawa oraz nie zbyt fair wobec twórcy. Bardziej legalnym sposobem jest zakup albumy w wersji cyfrowej (w formie dostępu do możliwości zapisania utworów na dysku w kilku popularnych formatach) - istnieją do tego specjalne sklepy takie jak np. księgarnie internetowe. Istnieje również serwis streamingowy, który umożliwia jedne darmowy odsłuch albumu, jego zakup w wersji cyfrowej oraz ewentualny zakup innych gadżetów wykonawcy (merchu) takich jak koszulki czy nawet fizyczne nośniki z muzyką. Inną metodą jest najzwyczajniej w świecie zakupić fizyczny nośnik. W tym przypadku prawo autorskie pozwala na utworzenie jednej kopii bezpieczeństwa na użytek własny, ze wzbronieniem rozpowszechniania takiej kopii.
Osobiście moja kolekcja płyt nieco urosła, większość z nich to cegiełki, ale znajduje się w niej kilka rarytasów, których próżno szukać na serwisach streamingowych. Sam nie jestem fanem nośników fizycznych. Zabierają one zmiejsce, mogą ulec zniszczeniu oraz coraz mniej sprzętu, na którym na co dzień operuje posiada możliwość odtworzenia takiej płyty. Póki co jescze istnieje taka możliwość więc po zakupie takiego nośnika przystępuje do utworzenia jego kopii na komputerze. Zgrywanie płyt CD Audio (bo w tym formacie występują płyty kompaktowe z muzyką) nazywane jest ripowaniem. Temat ripowania płyt poruszałem 4 lata temu przy okazji dziennika OpenBSD i wówczas robione było to na tym systemie. Teraz zrobimy to na dystrybucji Linuksa, ja wykorzystam do tego GNU/Linux Debian, natomast Ty możesz wykorzystać do tego dystrybucje, której teraz używasz. Do ripowania płyt wykorzystam polecenie cdda2wav, które znajduje się w pakiecie icedax, chciaż tutaj występuje prostsza opcja z wykorzystaniem pakietu cdparanoia, którego poza zgrywaniem jedną z funkcji jest minimalizacja zniekształceń związanych z uszkodzeniami fizcznego nośnika. Polecenie cdda2wav również wykonuje te czynności, korzystając nawet z biblioteki cdparanoia
W najprostszy sposób płytę możemy zgrać wykorzystując pakiet cdparanoia. Na Debianie jest on do zainstalowania z oficjalnego głównego repozytorium. Po zainstalowaniu pakietu, na początku wydajemy polecenia sprawdzającego nasz napęd CD.
user@debian:~$ cdparanoia -A cdparanoia III release 10.2 (September 11, 2008) Using cdda library version: 10.2 Using paranoia library version: 10.2 Checking /dev/cdrom for cdrom... Testing /dev/cdrom for SCSI/MMC interface SG_IO device: /dev/sr0 CDROM model sensed sensed: TSSTcorp CDDVDW SH-224DB SB01 Checking for SCSI emulation... Drive is ATAPI (using SG_IO host adaptor emulation) Checking for MMC style command set... Drive is MMC style DMA scatter/gather table entries: 1 table entry size: 131072 bytes maximum theoretical transfer: 55 sectors Setting default read size to 27 sectors (63504 bytes). Verifying CDDA command set... Expected command set reads OK. Attempting to set cdrom to full speed... drive returned OK. =================== Checking drive cache/timing behavior =================== Seek/read timing: [44:03.69]: 26ms seek, 0.41ms/sec read [32.7x] [40:00.00]: 27ms seek, 0.41ms/sec read [32.7x] [30:00.00]: 31ms seek, 0.44ms/sec read [30.0x] [20:00.00]: 29ms seek, 0.52ms/sec read [25.7x] [10:00.00]: 33ms seek, 0.63ms/sec read [21.2x] [00:00.00]: 47ms seek, 0.81ms/sec read [16.4x] Analyzing cache behavior... Drive does not cache nonlinear access Drive tests OK with Paranoia.
Teraz chcąc rozpocząć zgrywanie ścieżek audio z płyty wydajemy następujące polecenie:
user@debian:~$ cdparanoia -XB cdparanoia III release 10.2 (September 11, 2008) Ripping from sector 0 (track 1 [0:00.00]) to sector 199309 (track 8 [5:54.11]) outputting to track01.cdda.wav (== PROGRESS == [ | 030137 00 ] == :^D * ==) outputting to track02.cdda.wav (== PROGRESS == [ | 065541 00 ] == :^D * ==) outputting to track03.cdda.wav (== PROGRESS == [ | 072106 00 ] == :^D * ==) outputting to track04.cdda.wav (== PROGRESS == [ | 096500 00 ] == :^D * ==) outputting to track05.cdda.wav (== PROGRESS == [ | 131993 00 ] == :^D * ==) outputting to track06.cdda.wav (== PROGRESS == [ | 154448 00 ] == :^D * ==) outputting to track07.cdda.wav (== PROGRESS == [ | 172747 00 ] == :^D * ==) outputting to track08.cdda.wav (== PROGRESS == [ | 199309 00 ] == :^D * ==) Done.
Podczas zgrywania każdej ze ścieżek wyświeltany jest pasek postępu, na tym pasku zaznaczane również będą ewentualne błedy nośnika. Tak zgrane ściezki przezentują się następujący sposób.
user@debian:~$ ls cdparanoia.log track02.cdda.wav track04.cdda.wav track06.cdda.wav track08.cdda.wav track01.cdda.wav track03.cdda.wav track05.cdda.wav track07.cdda.wav
Teraz pozostało nazwać jakoś te pliki i robota zrobiona. To wszystko. W tym momencie wiemy w jaki sposób możemy zgrywać płyty z muzyką.
Tutaj faktycznie mógłbym skończyć ten artykuł, ale np. załóżmy że mamy 38 płyt. Pół biedy jeśli chcemy je tylko zripować do podpisanego katalogu, ale co jeśli każdy utwór miałby być podpisany w określony sposób. Dajmy na to numerem ścieżki, wykonawcą i tytułem utworu. To przy wyżej opisanym poziomie musimy wyszukać w internecie dany album i zmieniać po kolei nazwy plików, co więcej bieda kiedy nasz album to reedycja oryginalnego albumu a na przestrzeni lat było ich kilka. Tak zdarzają się i takie płyty.
W internecie w czas początku sieci WWW powstała baza danych dla róznych programów służących do zgrywania płyt CD Audio, która zawiera informacje o wykonawcy, albumie oraz utworach. Jeśli jakiegoś albumu nie ma w takiej bazie to może zostać przez posiadacza płyty dodany, bowiem wartością porządkującą w takiej bazie indeks obliczany na podstawie algorytmu, wykorzystującego miedzy innymi długość ścieżek na płycie. Na przestrzeni laty bazy przechodziły wiele perturbacji, co spowodwało że bezproblemowo możemy skorzystać z dwóch źródeł danych - bazy gnudb.org oraz bazy musicbrainz. Oprogramowaniem odpytującym bazę może być wspomniane wcześniej polecenie cdda2wav. Polecenie nawet podczas ripowania odpytuje bazy danych pozostawiając po sobie dwa dodatkowe pliki. Jeden zawiera informacje uzyskane z bazy gnudb.org na podstawie wartości DISCID (audio.cddb). Drugi natomiast jest plikiem w formacie XML, zawierający dane z bazy musicbrainz na podstawie wartości CDINDEX (audio.cdindex). Zgrywanie płyty wraz z odpytaniem bazy możemy przeprowadzić za pomocą następującego polecenia:
$ cdda2wav -vall cddb=1 speed=4 -paranoia paraopts=no-verify -B -D /dev/sr0
Działanie tego polecenia jest podobne, jednak poza plikami dźwiekowymi mamy równie dwa wspomnianie wcześniej pliki.
user@debian:~$ ls audio_01.inf audio_02.wav audio_04.inf audio_05.wav audio_07.inf audio_08.wav audio_01.wav audio_03.inf audio_04.wav audio_06.inf audio_07.wav audio.cddb audio_02.inf audio_03.wav audio_05.inf audio_06.wav audio_08.inf audio.cdindex
W tych plikach mamy wszystkie informacje pozostaje je tylko z nich wyciągnąć.
Ze względu to na, że raczej będę uzupełniać swoją kolekcję o kolejne tytuły, to żeby nie musieć ręcznie opisywać po kolei wszystkich utworów napisałem skrypt, który zrobi to za mnie. Skrypt ten jest również jednym z narzędzi dostępnych w dystrybucji immudex.
#!/bin/bash function XMLScrap() { echo -n $(grep -o "<${1}>.*</${1}>" $2 \ | sed "s,<${1}>,," \ | sed "s,</${1}>,," \ | sed 's,&,and,g'); } function help() { echo "immudex-cdrip - bash script for collection audio tracks from Audio CD."; echo "morketsmerke.org @ 2025"; echo; echo "Usage:"; echo " $ immudex-cdrip --rip-n-rename"; echo; echo "Options:"; echo " --rip-only - Rips audio tracks from Audio CD, without quering CDIndex"; echo " (MusicBrainz) database."; echo; echo " --get-disc-info - Getting info from CDIndex (MusicBrainz) database"; echo " about Audio CD without ripping."; echo; echo " --rip-n-rename - Rips audio tracks from Audio CD, create Artist/Album folders"; echo " and rename tracks according to data get CDIndex (MusicBrainz)"; echo " database (normal usage)."; echo; echo "Script using CDDA2WAV tool from icedax package and libparanoia library (GNU/Linux Debian)."; } function multipleArtistDisc() { FILE="$1"; ARTIST="VA"; ALBUM=$(XMLScrap "Title" $FILE); NUMTRACKS=$(XMLScrap "NumTracks" $FILE); TRACKPATH="${ARTIST} - ${ALBUM}"; mkdir -vp "${TRACKPATH}"; i=1; while [ $i -le $NUMTRACKS ]; do artist=$(grep -o "<Artist>.*</Artist>" $FILE \ | sed -n "${i}p" \ | sed 's,<Artist>,,' \ | sed 's,</Artist>,,'); trackName=$(grep -o "<Name>.*</Name>" $FILE \ | sed -n "${i}p" \ | sed 's,<Name>,,' \ | sed 's,</Name>,,'); if [ $i -lt 10 ]; then trackNumber="0${i}"; else trackNumber=${i}; fi audioFilename="audio_${trackNumber}.wav"; infFilename=$(echo $audioFilename | sed 's/wav/inf/'); mv -v $audioFilename "${TRACKPATH}/${trackNumber}. ${artist} - ${trackName}.wav"; rm -v ${infFilename}; i=$(expr $i + 1); done rm -v audio.cddb; rm -v ${FILE}; } if [ ! -x /usr/bin/cdda2wav ]; then sudo apt-get install icedax cdparanoia -y; fi if [ "$1" ] && [ "$1" = "--rip-only" ]; then cdda2wav -vall cddb=-1 speed=4 -paranoia paraopts=no-verify -B -D /dev/sr0; exit 0; fi if [ "$1" ] && [ "$1" = "--get-disc-info" ]; then cdda2wav -J -D /dev/sr0; exit 0; fi if [ "$1" ] && [ "$1" = "--rip-n-rename" ]; then cdda2wav -vall cddb=1 speed=4 -paranoia paraopts=no-verify -B -D /dev/sr0; FILE="audio.cdindex"; if $(grep -q '<MultipleArtistCD>' $FILE); then multipleArtistDisc $FILE; else ARTIST=$(XMLScrap "Artist" $FILE); ALBUM=$(XMLScrap "Title" $FILE); NUMTRACKS=$(XMLScrap "NumTracks" $FILE); TRACKPATH="${ARTIST}/${ALBUM}"; mkdir -vp "${TRACKPATH}"; i=1; while [ $i -le $NUMTRACKS ]; do trackName=$(grep -o "<Name>.*</Name>" $FILE \ | sed -n "${i}p" \ | sed 's,<Name>,,' \ | sed 's,</Name>,,'); if [ $i -lt 10 ]; then audioFilename="audio_0${i}.wav"; trackNumber="0${i}"; else audioFilename="audio_${i}.wav"; trackNumber="${i}"; fi infFilename=$(echo "$audioFilename" | sed 's/wav/inf/'); mv -v $audioFilename "${TRACKPATH}/${trackNumber}. ${ARTIST} - ${trackName}.wav"; rm -v $infFilename; i=$(expr $i + 1); done rm -v audio.cddb; rm -v audio.cdindex; fi exit 0; fi help;
Źródła:
~xf0r3m