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

    Als Beispiel kommt die selbe CD wie bei der FreeDB zum Einatz:

    DiscID kalkulieren

    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)

    Es werden nur Angaben der Audiosession verwendet. Eine eventuell vorhandene Datensession wird nicht berücksichtigt. 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 das Beispiel:

    <?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.

    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

    Damit sieht die Demo so aus:

    CD Copy Step 1b (podCDCopyStep1b.7z - 546 kb) MD5 (1 kb).
    Compiler: Turbo Delphi
    Stand: 28. Juli 2015

    Änderungen an der Demo

    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 (podLibDiscId.7z - 203 kb) MD5 (1 kb).
    Compiler: Delphi 7 Personal
    Stand: 28. Juli 2015