Projekte > Audio-CD (CDDA) > CDDB - Music Brainz

CDDB - Music Brainz

  • Beschreibung
  • Beispiel
  • DiscID kalkulieren
  • Anfrage erstellen
  • Antwort
  • Coverbild
  • Demo
  • LibDiscId
  • Änderungen
  • Beschreibung

    Music Brainz ist eine freie Alternative zu FreeDB. Sie ist zwar nicht so umfangreich, bietet dafür jedoch mehr Informationen.

    Beispiel

    Es kommt wieder die BeispielCD zum Einsatz:

    DiscID kalkulieren

    Die nachfolgende Kalkulation funktioniert vermutlich nicht bei AudioCDs mit Datentracks. Dies habe ich noch nicht kontrolliert.

    Aus dieser Tabelle werden folgende Daten für den ersten Schritt der Kalkulation entnommen.

    • Nummer des ersten Tracks (1 Byte)
    • Nummer des letzten Tracks (1 Byte)
    • Lead-Out-Startadresse in Frames (4 Byte)
    • Startadressen von 99 Tracks in Frames (4 Byte)

    Die Werte werden als Hexstrings verwendet. Startadressen für nicht existierende Tracks werden mit 0 angegeben, damit am Ende die Länge des Strings stimmt. Im Beispiel sieht der String so aus (Es handelt sich um eine Zeile):

      010B
      0002F94C0000009600004A7600009BA50000F1BF000130A1000180570001BECF0001FBBC00024089
      0002791B0002C4DD0000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000000000000000000000000000
    

    Von diesem String wird ein SHA1-Hash ebenfalls als String ermittelt:

      6'#$7F'Óˣܷ¡M'#7#$B'èTh"3
    

    Da dieser String schwer lesbar ist, wird ein modifizierter base64-Hash gebildet. So ergibt sich für das Beispiel diese Music Brainz DiscID:

      izZ_08uj3LehTQcLw4moVGgiM4M-
    

    Die Kalkulation sieht so aus:

    type
      TAddr = Array[0..3] of Byte; // 0 - Zero, 1 - Minute, 2 - Second, 3 - Frame
     
    type
      TTrack = record
        Audio     : Boolean;
        Number    : Byte;
        Start     : TAddr;
      end;
     
    type
      TSession = record
        FirstTrack : Byte;
        LastTrack  : Byte;
        LeadOut    : TAddr;
        Track      : Array of TTrack;
      end;
     
    function MusicBrainzCalculateDiscID(aSession: TSession): String;
    var
      temp : String;
      num  : Cardinal;
      i    : Byte;
    begin
      temp := Format('%2.2x%2.2x', [aSession.FirstTrack, aSession.LastTrack]);
      if Length(aCD.Track) > 0
      then begin
        num  := msf2frames(aSession.LeadOut);
        temp := temp + Format('%8.8x', [num]);
        for i := 0 to 98
        do begin
          if i < Length(aSession.Track)
          then temp := temp + Format('%8.8x', [msf2frames(aSession.Track[i].Start)])
          else temp := temp + Format('%8.8x', [0]);
        end;
      end;
      Temp := CalcHash2(Temp, haSHA1);
      Result := rfc822_binary(temp);
    end;
    

    Für die Ermittlung des SHA1-Hashes benutze ich derzeit eine der vielen Routinen aus dem Internet. Die Hilfsfunktion für die Ermittlung des modifizierter base64-Hash ist eine Übersetzung aus der base64.c von Music Brainz. Dabei wurde eine Vereinfachung vorgenommen, weil der SHA1-Hash immer 20 Byte ist und die Quellstringlänge ein Vielfaches von drei betragen muss:

    function rfc822_binary(src: AnsiString): String;
    const
      v = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._';
    var
      ret  : PAnsiChar;
      d    : PAnsiChar;
      s    : PAnsiChar;
      srcl : Cardinal;
      len  : Cardinal;
      i    : Cardinal;
    begin
      srcl := Length(src);
      s    := PAnsiChar(src);
      i    := ((srcl + 2) div 3) * 4;
      len  := i + 2 * ((i div 60) + 1);
      ret  := AllocMem(len);
      d    := ret;
      for i := 0 to srcl div 3
      do begin
        d[0] := v[(Byte(s[0]) shr 2) + 1];
        d[1] := v[((Byte(s[0]) shl 4) or (Byte(s[1]) shr 4)) and $3F + 1];
        d[2] := v[((Byte(s[1]) shl 2) or (Byte(s[2]) shr 6)) and $3F + 1];
        if srcl > 2
        then d[3] := v[Byte(s[2]) and $3F + 1]
        else d[3] := '-';
        inc(d, 4);
        inc(s, 3);
        dec(srcl, 3);
      end;
      d[0] := #0;
      Result := ret;
      FreeMem(ret);
    end;
    

    Anfrage erstellen

    Nun muss eine Anfrage zusammengestellt werden. Die Elemente sind

    • Der Server: http://musicbrainz.org,
    • der Path auf dem Server: /ws/2/discid/,
    • die DiscID und
    • das lookup: ?inc=<Parameter>

    Die Parameter, welche hier Verwendung finden:

    • artist-credits - Angaben zum Interpreten.
    • recordings - Angaben zu den Tracks

    Die Anfrage sieht für das Beispiel so aus:

    http://musicbrainz.org/ws/2/discid/izZ_08uj3LehTQcLw4moVGgiM4M-
                           ?inc=artist-credits+recordings
    

    Antwort

    Mit etwas Glück erhält man als Antwort eine XML-Datei. Dies ist nicht sicher selbst wenn die CD in der Datenbank enthalten ist. Ein Beispiel dafür ist Annett Louisan - Das optimale Leben. In der Datenbank sind vier Editionen enthalten. Die Tour Edition kann man unter der ReleaseID 0e1ca5c0-3306-4859-a6bf-dd014fdf7ef3 finden, jedoch bleibt die Suche nach der DiscId IRq8RCRST.T_GKd0PeVJ0FHLkjM- erfolglos. Hier aber die Antwort auf die BeispielCD:

    <?xml version="1.0" encoding="UTF-8"?>
    <metadata xmlns="http://musicbrainz.org/ns/mmd-2.0#">
     <disc id="izZ_08uj3LehTQcLw4moVGgiM4M-">
      <sectors>194892</sectors>
      <release-list count="1">
       <release id="e3f9ee18-1d62-47d2-a607-a88186419f22">
        <title>Willkommen im Club</title>
        <status>Official</status>
        <quality>normal</quality>
        <text-representation>
         <language>deu</language>
         <script>Latn</script>
        </text-representation>
        <artist-credit>
         <name-credit>
          <artist id="6a0f0a74-8689-4bf6-aa8e-6a954ac5f0cb">
           <name>MIA.</name>
           <sort-name>MIA.</sort-name>
           <disambiguation>German rock/pop group</disambiguation>
          </artist>
         </name-credit>
        </artist-credit>
        <date>2008-09-05</date>
        <country>DE</country>
        <asin>B001DCVP1M</asin>
        <medium-list count="1">
         <medium>
          <position>1</position>
          <format>CD</format>
          <disc-list count="1">
           <disc id="izZ_08uj3LehTQcLw4moVGgiM4M-">
            <sectors>194892</sectors>
           </disc>
          </disc-list>
          <track-list count="11" offset="0">
           <track>
            <position>1</position>
            <length>252160</length>
            <recording id="f408b915-14d5-4d5a-af24-1c550ba362c1">
             <title>Kapitän</title>
             <length>252160</length>
             <artist-credit>
              <name-credit>
               <artist id="6a0f0a74-8689-4bf6-aa8e-6a954ac5f0cb">
                <name>MIA.</name>
                <sort-name>MIA.</sort-name>
                <disambiguation>German rock/pop group</disambiguation>
               </artist>
              </name-credit>
             </artist-credit>
            </recording>
           </track>
           <track>
            <position>2</position>
            <length>277106</length>
            <recording id="c626ea3e-3c2b-4d66-b15b-b2cecc943808">
             <title>Mein Freund</title>
             <length>277106</length>
             <artist-credit>
              <name-credit>
               <artist id="6a0f0a74-8689-4bf6-aa8e-6a954ac5f0cb">
                <name>MIA.</name>
                <sort-name>MIA.</sort-name>
                <disambiguation>German rock/pop group</disambiguation>
               </artist>
              </name-credit>
             </artist-credit>
            </recording>
           </track>
           <track>
            <position>3</position>
            <length>293893</length>
            <recording id="63ac2087-e692-45d2-ae53-f5e62a43d673">
             <title>Mausen</title>
             <length>293893</length>
             <artist-credit>
              <name-credit>
               <artist id="6a0f0a74-8689-4bf6-aa8e-6a954ac5f0cb">
                <name>MIA.</name>
                <sort-name>MIA.</sort-name>
                <disambiguation>German rock/pop group</disambiguation>
               </artist>
              </name-credit>
             </artist-credit>
            </recording>
           </track>
           <track>
            <position>4</position>
            <length>214640</length>
            <recording id="287f85bf-5f1f-4502-bbbe-c432d2df5aac">
             <title>Du</title>
             <length>214640</length>
             <artist-credit>
              <name-credit>
               <artist id="6a0f0a74-8689-4bf6-aa8e-6a954ac5f0cb">
                <name>MIA.</name>
                <sort-name>MIA.</sort-name>
                <disambiguation>German rock/pop group</disambiguation>
               </artist>
              </name-credit>
             </artist-credit>
            </recording>
           </track>
           <track>
            <position>5</position>
            <length>272080</length>
            <recording id="42bb7fea-ec41-41d2-9062-fd3349312b64">
             <title>100 Prozent</title>
             <length>272080</length>
             <artist-credit>
              <name-credit>
               <artist id="6a0f0a74-8689-4bf6-aa8e-6a954ac5f0cb">
                <name>MIA.</name>
                <sort-name>MIA.</sort-name>
                <disambiguation>German rock/pop group</disambiguation>
               </artist>
              </name-credit>
             </artist-credit>
            </recording>
           </track>
           <track>
            <position>6</position>
            <length>213226</length>
            <recording id="7d93b753-101a-4208-b0f6-40fdc43b1e04">
             <title>Magisch</title>
             <length>213226</length>
             <artist-credit>
              <name-credit>
               <artist id="6a0f0a74-8689-4bf6-aa8e-6a954ac5f0cb">
                <name>MIA.</name>
                <sort-name>MIA.</sort-name>
                <disambiguation>German rock/pop group</disambiguation>
               </artist>
              </name-credit>
             </artist-credit>
            </recording>
           </track>
           <track>
            <position>7</position>
            <length>207960</length>
            <recording id="9cfc8692-56f2-42c7-bb40-ea82c79e2831">
             <title>Deinetwegen</title>
             <length>207960</length>
             <artist-credit>
              <name-credit>
               <artist id="6a0f0a74-8689-4bf6-aa8e-6a954ac5f0cb"
                >name>MIA.</name>
                <sort-name>MIA.</sort-name>
                <disambiguation>German rock/pop group</disambiguation>
               </artist>
              </name-credit>
             </artist-credit>
            </recording>
           </track>
           <track>
            <position>8</position>
            <length>234840</length>
            <recording id="aea7f9c5-01cd-4759-bc19-ce7908f5e33d">
             <title>Verfolger</title>
             <length>234840</length>
             <artist-credit>
              <name-credit>
               <artist id="6a0f0a74-8689-4bf6-aa8e-6a954ac5f0cb">
                <name>MIA.</name>
                <sort-name>MIA.</sort-name>
                <disambiguation>German rock/pop group</disambiguation>
               </artist>
              </name-credit>
             </artist-credit>
            </recording>
           </track>
           <track>
            <position>9</position>
            <length>193093</length>
            <recording id="842661c2-3c90-4e3c-a58d-01283a2186b1">
             <title>Glücksstern</title>
              <length>193093</length>
              <artist-credit>
               <name-credit>
                <artist id="6a0f0a74-8689-4bf6-aa8e-6a954ac5f0cb">
                 <name>MIA.</name>
                 <sort-name>MIA.</sort-name>
                 <disambiguation>German rock/pop group</disambiguation>
                </artist>
               </name-credit>
              </artist-credit>
             </recording>
            </track>
            <track>
             <position>10</position>
             <length>258586</length>
             <recording id="1d4eefec-bd79-45b6-ae8d-a5c1e055a9cf">
              <title>Halt still</title>
              <length>258586</length>
              <artist-credit>
               <name-credit>
                <artist id="6a0f0a74-8689-4bf6-aa8e-6a954ac5f0cb">
                 <name>MIA.</name>
                 <sort-name>MIA.</sort-name>
                 <disambiguation>German rock/pop group</disambiguation>
                </artist>
               </name-credit>
              </artist-credit>
             </recording>
            </track>
            <track>
             <position>11</position>
             <length>178973</length>
             <recording id="a12da983-d3a0-46bf-bb29-686eae2b3c1f">
              <title>Die Aussicht</title>
              <length>178973</length>
              <artist-credit>
               <name-credit>
                <artist id="6a0f0a74-8689-4bf6-aa8e-6a954ac5f0cb">
                 <name>MIA.</name>
                 <sort-name>MIA.</sort-name>
                 <disambiguation>German rock/pop group</disambiguation>
               </artist>
              </name-credit>
             </artist-credit>
            </recording>
           </track>
          </track-list>
         </medium>
        </medium-list>
       </release>
      </release-list>
     </disc>
    </metadata>
    

    Daraus lassen sich verschiedene Informationen auslesen. Unter anderen der Titel und der Interpret der CD und der einzelnen Titel. Desweiteren die ReleaseID, die ASIN (Amazon Standard Identification Number) und die EAN (European Article Number). Letztere fehlt im Beispiel, obwohl die CD einen Barcode besitzt. Der Inhalt der Datei kann sich auch ändern. Die hier ist von Dezember 2011. Bei einer Abfrage im Juli 2018 sind auch für Tracks ID-Nummer angegeben.

    Coverbild

    Nun kann man sich die Seite zu dem Album ansehen. Dazu muss man nur dem Pfad zu den Releases die ReleaseID hinzufügen. Im Beispiel ist der Link:

    http://musicbrainz.org/release/e3f9ee18-1d62-47d2-a607-a88186419f22
    

    Dort gibt es neben den Informationen, welche oben abgefragt wurden, auch ein Coverbild. Dazu muss der Link aus dem Seitenquelltext extrahiert werden.

    Bei meinen Tests im April 2012 stand in dem DIV-Tag jeweils nur der Link zum Cover. Jetzt steht dort ein Script, aus welchem der Link extrahiert werden muss.

    Demo

    Eine Demo dazu. Mit der BeispielCD sieht sie so aus:

    Music Brainz (pcddaMusicBrainz.7z - 270 kb) MD5 (1 kb).
    Compiler: Turbo Delphi (Weil Delphi 7 Personal kein XML unterstützt.)
    Stand: 15. August 2018

    Änderungen an der Demo

    15.08.2018Fehler: Zwei kleine logische Fehler beseitigt.
    14.08.2018Änderung: Die TOC wird nicht mehr in der Unit uMusciBrainz gelesen.
    Änderung: Für den Download der Dateien wird die selbe Routine wie bei FreeDB verwendet.
    21.07.2018Änderung: Neue Oberfläche und MusicBrainz in einer eigenen Klasse.
    28.07.2015Änderung: Für SHA1 wird nun WinCrypt verwendet.
    Änderung: Austausch der Downloadroutine.
    Änderung: Anzeige der DiscID und der ReleaseID.
    25.07.2015Hinzu: Splash Screen.
    Änderung: Optische Details.
    10.06.2012Fehler: Bei den Helferlein zur Berechnung der Titellänge fehlte eine Klammer.

     

    LibDiscId

    Music Brainz bietet eine libdiscid an. Damit kann man sich zu einer Audio CD die Music Brainz DiscID sowie die FreeDB DiscID ermitteln lassen. Unten gibt es die derzeit aktuelle discid.dll sowie eine kleine GUI.

    LibDiscId (pcddaLibDiscId.7z - 212 kb) MD5 (1 kb).
    Compiler: Delphi 7 Personal
    Stand: 21. Juli 2018