Van egy Lifetime PlexPass-om, pár forintért vettem sok-sok éve, nagyon akciós volt. Mostanság fedeztem fel a PlexAmp-et, amivel mobilhálózatról is tudom bármikor a zenéket hallhatni, vagy wifi-n akár változatlan minésőgben. Kis nézelődés után egy jó megoldás lenne a roon szerver, de az drágának tűnik most első ránézésre (majd egyszer jobban ránézek).
Úgy döntöttem, hogy begrabb-elem a CD gyűjteményünket, 16 bit, 44.1 kHz, stereo, ez nagyon jó, és flac formátumban a Plex music alá. A grabbelést egy régi Dell Vostro 1015 laptoppal végeztem (ebben volt az egyetlen CD drive itthon). Xubuntu minimal-t tettem fel rá, a CD grabbelést az asunder programmal csináltam. A CD-ket sima wav-be rippelem, és mehet is a NAS-ra egy SAMBA-val megosztott könyvtárba.
A wav-okat már a saját gépemen ffmpeg-gel tömörítettem flac-re, ez a shell script, amit használtam hozzá:
flac.sh:
#!/bin/bash
for file in *.wav; do
[ -e "$file" ] || continue
outfile="${file%.*}.flac"
ffmpeg -y -i "$file" -c:a flac -compression_level 8 "$outfile"
done
A wav-okat tartalmazó album könyvtárban elindítom a shell script-et, és az ffmpeg szépen átkonvertálja flac formátumra.
Felmerült a kérdés, hogy rendes metaadatok kellenének a zenékhez, minimum: Előadó, CD információk, track listák, számról információk, CD borító. Itt jött a képbe az AcoustID és a MusicBrainz.
A MusicBrainz egy közösségi adatbázis, ahol a kiadványokhoz, előadókhoz és trackekhez tartozó információkat bárki hozzáadhatja és javíthatja. Rengeteg CD album van fent, nehéz olyanba belefutni, amit nem találsz meg.
Az AcoustID segítségével az egyes számokhoz akusztikus ujjlenyomat készíthető (Chromaprint nevű algoritmussal, hasonlót használ a Shazam is), amit a MusicBrainz adatbázis is használ. Ez azért hasznos, mert így akkor is megtalálja a rendszer, hogy melyik számról van szó, ha a fájlnév vagy a metaadat hiányos vagy hibás.
A tagelést a MusicBrainz Picard nevű alkalmazással csináltam, ami automatikusan lekérdezi az AcoustID-t és a MusicBrainz adatokat. Itt minden számhoz hozzákerül az előadó neve, a dal címe, az album adatai, borító stb. A MusicBrainz a MusicBrainz Picard alkalmazással teljes, ha olyan CD-be futsz bele, ami még nincs benne a MusicBrainz adatbázisba, akkor a konkrét számok újlenyomathoz rendelésében segít.
A musicbrainz adatmodellje (egyszerűsítve) a következő:
Artist <--1..n--> Recording
Artist <--n..m--> Release
Release-group <--1..n--> Release
Release <--1..n--> Track
Track <--n..1--> Recording
- Tehát van egy Artist egyedünk. Ez tartalmazza az előadót, név, kép, stb...
- Ehhez Release-ek vannak rendelve, ezek lehetnek pl a CD-k. De van olyan Release is, például a válogatások, amikben több Artist-je van. A release-nek, például CD-nek van kiadója, katalógus száma, kiadási éve, vonalkódja, és ezek az infók egy CD esetén rajta vannak a CD oldalán.
- A release-group fogja össze az egyes release-eket (kiadások információit) egy albumból. Itt lehet megadni pl az infót, hogy az ide tartozó release-ek például "filmzene", vagy alcímet, stb... (ami a grouphoz tartozik logikailag)
- Az egyes release-ekhez Track-ek tartoznak: név, hossz.
- A track-ekhez a konkrét recording-ok tartoznak. A recordingnak van Chromaprint fingerprint-je (AcoustID) például, és egy recording több release-ben, vagy release-group-ban is felhasználható.
Egy ismert CD megtag-eléséhez érdemes a Google-ben, vagy a MusicBrainz-ben rákeresni a release group-ra, vagy release-re közvetlen. A release group-ból már könnyen kiválasztható a release. Ez például a "The Killers - Sam's Town" release group-ja: https://musicbrainz.org/release-group/e5ae2682-f6cb-327d-9e5e-8e055fb5b… ezen belül katalógus számmal, és vonalkóddal kiválaszthatom az adott albumot, ami már a konkrét CD-met reprezentálja. Láttam a release group oldalon a kiadót is (VERTIGO), a kiadás dátumát, és a release-hez rendelt ország: XE - Europe. Ez mind segített a választásban: https://musicbrainz.org/release/8561f3c3-4415-4613-ad22-009d150644c5 - ezt a konkrét URL-t a MusicBrainz Picard-ban tudom használni majd, a tag-elésre.
Példa egy teljesen új album felvételére a MusicBrainz-be
Vegyünk egy bonyolultabb példát, amikor nem létezik az album a MusicBrainz adatbázisában. Egy ilyenbe futottam, egy válogatás CD, magyar kiadás, "Rock Dreams '70" válogatást, ami különböző előadók számait tartalmazza (Deep Purple, Led Zeppelin, John Lennon stb.), én adtam hozzá: https://musicbrainz.org/release/33378d1d-6f48-416e-8a87-ac2f02e4e5e6
Előfeltételek
A következőkre van szükség
- AcoustID regisztráció. A regisztrációt követően kapsz egy API tokent. (Teljesen ingyenes szolgáltatás.)
- Szükség van a chromaprint számoló tool-ra, amit külön lehet telepíteni: chomaprint-fpcalc. Én OpenSuse Thumbleweed alatt így tettem fel: sudo zypper install chromaprint-fpcalc
- MusicBrainz regisztráció
- MusicBrainz Picard - desktop program: https://picard.musicbrainz.org/downloads/
- python installálása a gépedre, tudj virtual enveket csinálni: https://www.w3schools.com/python/python_virtualenv.asp
Release információk megadása
Miután regisztráltál a MusicBrainz webfelületén, új release-t az "Edit / Add release", vagy "Edit / Add Various Artists release" menüpontban adhatsz hozzá, egy wizard szerű beviteli képenyőn. Nekem egy válogatás CD-m van, így ez utóbbit használtam.
A screenshot-on látható, hogy az Add release első képernyőjén kell hozzáadni a Release nevét, meglévő vagy új relese-group rendelhetem, a típust (album), a másodlagos típust (compilation), a kiadás státuszát, a kiadás dátumát, A label mezőbe a kiadót, a CD katalógus számot, a vonalkódot, és a CD tokját, pl: Jewel Case.
Track-ek felvitele
A next gombra átvisz a felület a képernyőre, ahol a track-eket veszem fel. Ezt egy textbox-ba kényelmesen beírhatom. Nekem a következő fájlok készültek el a konvertálással:
01 - Deep Purple - Child in Time.flac
02 - Led Zeppelin - Thank You.flac
03 - The Beatles - Let It Be.flac
04 - The Rolling Stones - Angie.flac
05 - Simon & Garfunkel - Bridge Over Troubled Water.flac
06 - Elton John - Daniel.flac
07 - John Lennon - Imagine.flac
08 - T. Rex - Children of the Revolution.flac
09 - Nilsson - Without You.flac
10 - George Harrison - My Sweet Lord.flac
11 - Joe Cocker - You Are So Beautiful.flac
12 - Doors - Riders on the Storm.flac
13 - The Free - Fire and Water.flac
14 - Uriah Heep - July Morning.flac
Ezt a következő kis python scripttel alakítottam a megadott formátumra:
#!/usr/bin/env python3
import sys
import os
from mutagen.flac import FLAC
def format_time(seconds):
minutes = int(seconds // 60)
secs = int(seconds % 60)
return f"{minutes}:{secs:02d}"
def main(path):
files = sorted([f for f in os.listdir(path) if f.endswith(".flac")])
for i, fname in enumerate(files, 1):
audio = FLAC(os.path.join(path, fname))
length = format_time(audio.info.length)
# fájlnévből: "01 - Előadó - Cím.flac"
base = os.path.splitext(fname)[0]
parts = base.split(" - ", 2)
if len(parts) == 3:
_, artist, title = parts
else:
artist, title = "Unknown", base
print(f"{i}. {title} - {artist} ({length})")
if __name__ == "__main__":
if len(sys.argv) != 2:
print(f"Használat: {sys.argv[0]} <könyvtár>")
sys.exit(1)
main(sys.argv[1])
A programhoz a mutagen nevű python library-t kellett telepíteni, ez a track-ek hosszának kinyeréséhez kellett:
pip install mutagen
Kimenet:
1. Child in Time - Deep Purple (10:18)
2. Thank You - Led Zeppelin (4:50)
3. Let It Be - The Beatles (4:04)
4. Angie - The Rolling Stones (4:34)
5. Bridge Over Troubled Water - Simon & Garfunkel (4:52)
6. Daniel - Elton John (3:53)
7. Imagine - John Lennon (3:03)
8. Children of the Revolution - T. Rex (2:28)
9. Without You - Nilsson (3:19)
10. My Sweet Lord - George Harrison (4:38)
11. You Are So Beautiful - Joe Cocker (2:40)
12. Riders on the Storm - Doors (7:05)
13. Fire and Water - The Free (4:00)
14. July Morning - Uriah Heep (10:22)
Pont az, amit a MusicBrainz elvár. Ilyen kis python programok írására tökéletes a chatgpt a vibe-coding-gal :), gyakorlatilag 30 másodperc alatt megvan a megoldás. Aki megriadna a program/script írástól: Igazából tool használat szintű a dolog, nem kell programozni tudni, látod mi a bemenet, és jó kimenetet ad az elkészült program.
Tracklista szerkesztés
A tracklist szerkesztésnél a beparse-olt artist-okat kellett megerősítenem, itt a nagyító ikonra kattintva rögtön kiválasztotta a program a tényleges artist-ot. Ezt ha nem teszem meg, akkor nem engedi a release-t elmenteni, és a TAB nevénél egy felkiáltó jellel (sárga háttérrel) jelzi a felület, hogy hiba van.
Track-ek, recording-ok összerendelése
A következő képernyőn a track-ekhez tudunk választani recording-okat, vagy kiválaszthatjuk, hogy új recording-ot vegyen fel. Mi nem tudjuk, hogy a CD-n melyik rekording van fent, ezért újat vettem fel. Később itt jön a képbe (többek között) MusicBrainz Picard desktop alkalmazás, ami a chromaprint fingerprint-et feltölti a megadott/megtalált recording-okhoz. Tehát a tényleges hangmintával a desktop alkalmazásban végzem el az összerendelést, és a desktop alkalmazással rendelem a recording-okat az albumhoz (release-hez), amit a web felületen felvettem.
Release mentése, edit note
A release végleges mentéséhez meg kell adni egy "Edit note"-ot, itt érdemes megadni, hogy honnan szedted az infót. Én pl ezt írtam: "Info taken from my own CD (Rock Dreams ’70, jewel case). Tracklist and credits transcribed directly from booklet and back cover."
Cover art
Ezt utólag adtam meg, de ezt is a Release-nél kell felvenni, a "Cover arts" tab-on. A CD front borítóját a telefonommal fényképeztem le, a Microsoft Lens alkalmazás segítésgével. Ezt töltöttem fel. Ez az alkalmazás szépen körbevágta/beforgatta a képet.
Tag-elés MusicBrainz Picard segítségével
Van egy toolbár, a szükséges funkciókra. A lekérdezés funkciót akkor használod, ha már van pl a számhoz fingerprint vagy egyéb ID-k, metaadatok rendelve (a musicbrainz ID-ket is elmenti a metaadatokba a program). A keresés funkciót (egy ujjlenyomat ikon) a chromaprint újlenyomat generáláshoz, és ezzel való kereséshez használhatod.
Szintén a toolbáron van jobb oldalon teljesen egy beviteli mező, ahol megadhatod az albumot, előadót, vagy számot. Mi itt adjuk meg a release URL-t amit felvettünk a web felületen: https://musicbrainz.org/release/33378d1d-6f48-416e-8a87-ac2f02e4e5e6
Vagy a toolbár-on egy "Submit AcoustIDS" gomb: ezzel tudjuk majd az albumhoz/track-ekhez rendelt zenék Chromaprint ujjlenyomatát feltölteni az AcoustID-be, MusicBrainz-be. A funkció használatához meg kell adni az AcoustID tokent a Beállítások menüben.
Megnyitás után (én kijelöltem a fájlokat a fájlkezelőben, jobb egér gomb, Open with Picard) a kategorizálatlan fájlok a bal oldali panelen jelennek meg.
Jobb oldalon a fingerprint alapján megtalált albumok vannak + az az album, amit az URL-rel behívtunk.
A tag-elés a következő módon néz ki:
A bal oldali tag-eletlen számokat ráhuzzuk egérrel a jobb oldali kiválasztott (most felvett) album track-jeire. Előfordulhat, hogy a zenét rossz albumhoz automatikusan felvette a MusicBrainz Picard (chromaprint alapján megtalálta), ilyenkor át kell húzni a saját albumunk megfelelő track-jére a számot, vagy vissza lehet tenni kategorizálatlan track-ként, és úgy áthuzni a megfelelő helyre.
Plex
Elkészült az albumunk, amit felmásolhatunk a plex alá, ahol beolvastatjuk az új könyvtárakat, és az album meg is jelenik.
Egy kis kockulás (kitérő): AcoustID, MusicBrainz integráció saját alkalmazással
Ha valaki saját app-ot szeretne fejleszteni, akkor az AcoustID alatt fel kell venni egy alkalmazás tokent is.
A saját python példákat megosztom, amikkel kisérleteztem.
A requirements.txt tartalma:
python-dotenv
requests
musicbrainzngs
mutagen
Könyvtárak telepítése:
pip install -r requirements.txt
Az API key-t ne commitold fel, tedd egy .env fájlba. Ennek a betöltése:
load_dotenv()
api_key = os.getenv("ACOUSTID_API_KEY")
Chromaprint ujjlenyomat számoló meghívása:
def get_fingerprint(path: str):
if not os.path.exists(path):
raise FileNotFoundError(f"A fájl nem található: {path}")
try:
out = subprocess.check_output(["fpcalc", "-json", "-length", "120", path], text=True)
except FileNotFoundError:
raise RuntimeError("Az fpcalc parancs nem található.")
except subprocess.CalledProcessError as e:
raise RuntimeError(f"fpcalc hiba: {e}")
data = json.loads(out)
return data["fingerprint"], int(data["duration"])
A rutin visszaadja az ujjlenyomatot, és a szám hosszát másodpercben.
Az acoustid lekérdezése fingerprint alapján (amivel a musicbrainz-ben lehet keresni)
def lookup_acoustid(self, fingerprint: str, duration: int):
url = "https://api.acoustid.org/v2/lookup"
params = {
"client": self.api_key,
"duration": duration,
"fingerprint": fingerprint,
"meta": "recordings",
}
r = requests.post(url, params=params, timeout=20)
r.raise_for_status()
result = r.json()
recordings = []
for res in result.get("results", []):
score = res.get("score")
for rec in res.get("recordings", []):
recordings.append({
"id": rec["id"],
"duration": duration * 1000,
"score": score,
})
return recordings
Ez egy egyszerű POST, visszaadhat egy vagy több találatot. Át kell adni a szám hosszát, az ujjlenyomatot, hogy milyen metaadat csoportokat akarunk lekérdezni (recordings).
Visszakapunk pár alap metaadaott, mint pl a musicbrainz id-je a recording-nak (avagy az acoust ID), a score (hogy mennyire egyezik a találat), és a szám hosszát (itt szoroztam ezerrel, hogy ms-ban legyen, a musicbrainz már úgy tárolja)
A MusicBrainz lekrédezéshez a musicbrainzng python library-t használtam:
def musicbrainz_lookup(self, recording_id: str, fingerprint: str, duration: int, score: float):
print(f"Looking up recording {recording_id}")
result = musicbrainzngs.get_recording_by_id(
recording_id,
includes=["artists", "releases", "media", "isrcs"],
)
rec = result["recording"]
artist = rec["artist-credit"][0]["artist"]
artist_data = {
"id": artist["id"],
"name": artist["name"],
}
isrcs = rec.get("isrc-list", [])
mb_duration_ms = rec.get("length")
track = {
"musicbrainz_trackid": rec["id"],
"track_title": rec.get("title"),
"fingerprint": fingerprint,
"isrcs": isrcs,
"duration": duration,
"musicbrainz_duration": mb_duration_ms,
}
albums = []
for release in rec.get("release-list", []):
if "artist-credit" in release:
album_artist = release["artist-credit"][0]["artist"]
album_artist_id = album_artist["id"]
album_artist_name = album_artist["name"]
else:
album_artist_id = artist_data["id"]
album_artist_name = artist_data["name"]
print(f"Get release details {release["id"]}")
release_details = musicbrainzngs.get_release_by_id(
release["id"],
includes=["recordings"]
)
album_track_length = None
for medium in release_details["release"].get("medium-list", []):
for track_item in medium.get("track-list", []):
if track_item.get("recording", {}).get("id") == rec["id"]:
album_track_length = (
track_item.get("recording", {}).get("length")
or track_item.get("length")
or track_item.get("track_or_recording_length")
)
break
if album_track_length:
break
albums.append({
"id": release["id"],
"title": release.get("title"),
"date": release.get("date"),
"country": release.get("country"),
"status": release.get("status"),
"barcode": release.get("barcode"),
"album_artist_id": album_artist_id,
"album_artist": album_artist_name,
"album_track_length": album_track_length,
"score": score,
})
return {
"track": track,
"artist": artist_data,
"albums": albums,
}
def find_tracks_by_fingerprint(self, fingerprint: str, duration: int):
recordings = self.lookup_acoustid(fingerprint, duration)
all_results = []
for rec in recordings:
all_results.append(
self.musicbrainz_lookup(rec["id"], fingerprint, duration * 1000, rec["score"])
)
return all_results
Ez lekérdezi az alap információkat a recording-hoz. Artist, Album, Track, és egyesével minden track hosszát. A musicbrainz API limit-je egy hívás másodpercenként. Ezt a library betartja (az AcoustID esetén több hívást is lehet másodpercenként, de ott is van limit).
A saját program írásakor megoldandó feladatok:
A chroma fingerprint két teljesen eltérő szám esetén is lehet ugyanaz. Pl.: Queen - Bohemian Rhapsody - egy Kylie Minogue számot is megtalált nekem. Ötletek, hogy lehet ezt automatikusan szűrni:
- Meglévő fájlnevek - és MusicBrainz metaadatok összevetése
- Könyvtárban lévő fájlok, és teljes album összevetése
- A track-ek/recording-ok hosszai egyezzenek
---
A legtöbb albumom már be van grabbelve, CD-minőségben, szépen megtagelve, borítóval, ott szól a PlexAmp-ban, bárhol is vagyok. A különbség az mp3-as gyűjteményemhez képest óriási - sokkal tisztábban, részletgazdagabban szólnak ezek a felvételek. Ráadásul nem kicsi nosztalgia van benne, a saját, kézzel válogatott CD-imet hallgathatom modern formában.
Egyetlen dolog hiányzik: a régi lemezboltok. Online bolt ugyan van, de Magyarországról sokszor elérhetetlen: például a Qobuz vagy a 7digital nem igazán működik nálunk. A ProStudioMasters-ban ugyan sikerült vásárolnom (44,1 kHz / 16 bit, 96 kHz / 24 bit, sőt 192 kHz-es és DSD kiadások is vannak), de más jó alternatívát még keresek.
Én szívesen kifizetek pár ezer forintot egy jó albumért, főleg ha jobb minőségben kaphatom meg. Az élmény és a minőség bőven megéri. Ismersz olyan boltot, ahol érdemes vásárolni? :) Van valakinek tapasztalata ezzel?
Köszi, hogy elolvastad.
- dlaszlo blogja
- A hozzászóláshoz be kell jelentkezni
- 274 megtekintés
Hozzászólások
https://cdpince.hu/ - (Korábban is.., de fél éven belül még volt innen rendelésem.., - teljesítették.)
- A hozzászóláshoz be kell jelentkezni
Köszi szépen, jól hangzik. Meg fogom nézni, miket vehetek tőlük.
- A hozzászóláshoz be kell jelentkezni
https://jokercddvdbolt.unas.hu/
A Bp. XIII. Radnóti Miklós utcában van, érdemes lemenni (pince) böngészni. A Király utcában is van hasonló, meg a Bartók Béla úton, ezeket még csak tervezem, hogy felkeresem.
- A hozzászóláshoz be kell jelentkezni
Én is elkezdtem az utóbbi években venni néhány CD-t. Ezek 80-as, 90-es évekbeli, eredeti CD-k, nem remasterelt változatok, amik a streamszolgáltatóknál elérhetők. A cdrdao csomagban lévő, és a cdparanoia-t használó cdda2wav segítségével RIP-elem a CD-t egy .flac fájlban, plusz .cue sheet, és ennyi. Saját szkriptet írtam erre. Ezt általában tovább konvertálom, sávokra szétszedve ogg Vorbisba, 320 kbps kerül, ha telóról akarom hallgatni. A tag-elésről is saját szkript gondoskodik.
Ajánlom, hogy akinek van egy kis CD gyűjteménye, még régről, ne dobja ki, jön vissza a divatba, nő az értéke, főleg, ha eredeti kiadás, 20+ évvel ezelőttről.
“Windows 95/98: 32 bit extension and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company that can't stand 1 bit of competition.”
- A hozzászóláshoz be kell jelentkezni
Ajánlom, hogy akinek van egy kis CD gyűjteménye, még régről, ne dobja ki, jön vissza a divatba, nő az értéke, főleg, ha eredeti kiadás, 20+ évvel ezelőttről.
Ráadásul van, hogy ezek jobb minőségűek, mint a remastered változat (dinamikusabb és kevésbé kompresszált az eredeti).
- A hozzászóláshoz be kell jelentkezni
Én egyszerűbben szoktam csinálni. Debian alatt van egy abcde nevű csomag, tulajdonképpen egy scriptgyűjtemény. A konfigurációjában egyszer be kell állítani, hogy milyen formátumban szeretnéd a file-okat (mp3-tól wav, flac, ogg, bármi), honnan próbálja megkeresni az adatokat hozz (Musicbrainz vagy valami lokális adatbázis, esetleg CD-TEXT a lemezről) Ha megtalálja, akkor a taggelhető formátumokat el is intézi, szintén megadható, hogy a file-neveket hogyan képezze, stb. Ha ez egyszer megvan, akkor annyi a feladat, hogy CD be, abcde parancs kiad, és onnantól csak várni kell. Borítót én sose szedtem le, de a man alapján tudja.
- A hozzászóláshoz be kell jelentkezni
Szintén zenész, plex pass, cd gyűjtemény, régi őskövület befogva rippelni (Thinkpad r61e), annyi hogy én nem mentem ennyire bele, asunder, cddb, aztán ment a háziszeróra a flac.
Lehet kedvet kapok és én is kipimpelem a gyűjteményt, úgyis mostanában megszaporodtak a cd vásárlásaim.
- A hozzászóláshoz be kell jelentkezni
Nagyon múlt századi vagyok: kiveszem a CD-t, berakom a fizikai lejátszóba, és meghallgatom.
Mindazonáltal köszönöm a leírást, hasznos volt!
- A hozzászóláshoz be kell jelentkezni