Projekte > Audio-CD (CDDA) > CDDB - FreeDB

CDDB - FreeDB

  • Beschreibung
  • Kategorie(n) erfragen
  • Antwort
  • CD erfragen
  • Informationen
  • Demo
  • Änderungen
  • Beschreibung

    Die FreeDB ist eine freie CD Datenbank, aus welcher man die Informationen zu vielen Audio-CDs abfragen kann. Da dort jeder ohne Registrierung mitmachen kann, sind verschiedene CDs mehrfach mit leicht unterschiedlichen Informationen und mit unterschiedlicher Qualität eingetragen.

    Nachdem die Table of Content ermittelt wurde, wird daraus eine DiscID ermittelt. Mit der DiskID und der Table of Content wird eine erste Anfrage gestellt, um zu erfahren in welcher Kategorie die CD eingetragen ist. Mit einer zweiten Anfrage werden die Innformationen zur CD geholt.

    Kategorie(n) erfragen

    Von der BeispielCD wurde das Inhaltsverzeichnis (TOC) im Kapitel Aufbau ermittelt.

    Für die DiscID benötigt man die Trackdaten sowie die Gesamtspieldauer der CD.

    Um zu erfahren wie die DiscID errechnet wird kann man bei FreeDB das Archiv freedb_howto1.07.zip mit der Datei freedb.howto.txt herunterladen. Darin ist ein C-Quelltext für die Berechnung enthalten. In Delphi sieht diese 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
      TCD = record
        FirstTrack : Byte;
        LastTrack  : Byte;
        Duration   : Cardinal;
        Track      : Array of TTrack;
        LeadOut    : TAddr;
      end;
     
    var
      aCD : TCD;
     
    function FreeDBCalculateDiscID(aCD: TCD): AnsiString;
     
      function cddb_sum(n: Cardinal): Cardinal;
      begin
        Result := 0;
        while (n > 0)
        do begin
          Result := Result + (n mod 10);
          n := n div 10;
        end;
      end;
     
    var
      i : Cardinal;
      n : Cardinal;
    begin
      n := 0;
      i := 0;
     
      while i < Length(aCD.Track)
      do begin
        n := n + cddb_sum((aCD.Track[i].Start[1] * 60) + aCD.Track[i].Start[2]);
        inc(i);
      end;
     
      Result := Format('%8.8x',
                [((n mod $ff) shl 24 or aCD.Duration shl 8 or Length(aCD.Track))]);
    end;
    

    Die Spieldauer berechnet sich:

    aCD.Duration := ((aCD.LeadOut.Min * 60) + aCD.LeadOut.Sec) -
                    ((aCD.Track[Track1].Min * 60) + aCD.Track[Track1].Sec);
    

    Aus obiger TOC ergibt sich die DiscID 840A240B

    Nun muss aus verschiedenen Komponenten eine Abfrage zusammengestellt werden. Diese sind

    • Der Server: http://freedb.freedb.org
    • Der Port: 80
    • Der Path auf dem Server: /~cddb/cddb.cgi
    • Der "Query" bestehend aus
      • Der Floskel "?cmd=cddb+query",
      • der DiscID,
      • der Anzahl der Tracks,
      • den Offsets der Tracks (als LBA oder in Frames) und
      • der Spieldauer der CD in Sekunden.
    • Dem "Hello" bestehend aus
      • Der Floskel "&hello=",
      • dem Usernamen,
      • dem Hostnamen,
      • dem Clientnamen,
      • der Version und
      • der Protokollversion: &proto=5

    Alle Elemente werden durch das Zeichen "+" verbunden. Bei den Offsets und der Spieldauer scheint die FreeDB eine gewisse Toleranz zuzulassen. Auch beim Hello scheint die Anzahl der Parameter auszureichen. Der Username und der Hostname entsprechen der Emailadresse, wobei das "@" durch "+" ersetzt wurde. Im Beispiel würde die einzeilige Abfrage heißen:

    http://freedb.freedb.org/~cddb/cddb.cgi
         ?cmd=cddb+query+840A240B+11+150+19062+39845+61887+77985+98391+114383+
         129980+147593+162075+181469+2596&hello=îch+sofort-mail.de+CDCopy+Beta&proto=5
    

    Antwort

    Als Antwort erhält man eine Textdatei. Das Format ist in der oben genannten Datei freedb.howto.txt beschrieben. Die Datei beginnt mit einem dreistelligen numerischen Code, welcher mit einer 2 beginnen sollte.

    • 200 - Einen genauen Eintrag gefunden..
    • 210 - Mehrere genaue Einträge gefunden, Liste folgt.
    • 211 - Mehrere ungenaue Einträge gefunden, Liste folgt.

    Ab der zweiten Zeile sind die gefundenen CDs aufgeführt. Die Zeilen beginnen jeweils mit der Nennung der Kategorie, in welcher die CD eingetragen ist. Mögliche Kategorien sind:

    • blues (selbsterklärend)
    • classical (selbsterklärend)
    • country (selbsterklärend)
    • data (ISO9660 und anderen DatenCDs)
    • folk (selbsterklärend)
    • jazz (selbsterklärend)
    • newage (selbsterklärend)
    • reggae (selbsterklärend)
    • rock (einschliesslich funk, soul, rap, pop, industrial, metal usw.)
    • soundtrack (Filme, Shows)
    • misc (andere, die nicht in die oben genannten Kategorien passen)
    210 Found exact matches, list follows (until terminating `.')
    data 840a240b Mia (Willkommen Im Club) / Willkommen Im Club
    newage 840a240b Mia / Willkommen im Club
    

    Wie der Inhalt der Datei zeigt, ist die Beispiel-CD zweimal eingetragen. Da nun bekannt ist, dass die CD in den Genres data und newage eingetragen ist, kann man die zweite Abfrage vornehmen.

    CD erfragen

    Nun erfolgt die zweite Abfrage, welche die Informationen zur AudioCD enthält. Entweder im Genre data

    http://freedb.freedb.org/~cddb/cddb.cgi?cmd=cddb+read+data+840A240B
                             &hello=fa+sofort-mail.de+CDCopy+b2&proto=5
    

    oder newage

    http://freedb.freedb.org/~cddb/cddb.cgi?cmd=cddb+read+newage+840A240B
                             &hello=fa+sofort-mail.de+CDCopy+b2&proto=5
    

    Diese Abfrage muss auch vorgenommen werden, wenn die CD nur in einer Kategorie eingetragen ist.

    Informationen

    Nun erhält man die Informationen zur AudioCD. Die Antworten sehen so aus. Dabei bedeutet das \\ die Fortsetztung der vorigen Zeile.

    210 data 840a240b CD database entry
      \\ follows (until terminating `.')
    # xmcd
    #
    # Track frame offsets:
    #      150
    #      19062
    #      39845
    #      61887
    #      77985
    #      98391
    #      114383
    #      129980
    #      147593
    #      162075
    #      181469
    #
    # Disc length: 2598 seconds
    #
    # Revision: 0
    # Processed by: cddbd v1.5.2PL0
      \\ Copyright (c) Steve Scherf et al.
    # Submitted via: audiograbber 1.83.01
    #
    DISCID=840a240b
    DTITLE=Mia (Willkommen Im Club) /
      \\ Willkommen Im Club
    DYEAR=2008
    DGENRE=Pop
    TTITLE0=Kapitän
    TTITLE1=Mein Freund
    TTITLE2=Mausen
    TTITLE3=Du
    TTITLE4=100 %
    TTITLE5=Magisch
    TTITLE6=Deinetwegen
    TTITLE7=Verfolger
    TTITLE8=Glücksstern
    TTITLE9=Halt still
    TTITLE10=Die Aussicht
    EXTD=
    EXTT0=
    EXTT1=
    EXTT2=
    EXTT3=
    EXTT4=
    EXTT5=
    EXTT6=
    EXTT7=
    EXTT8=
    EXTT9=
    EXTT10=
    PLAYORDER=
    
    210 newage 840a240b CD database entry
      \\ follows (until terminating `.')
    # xmcd
    #
    # Track frame offsets:
    #     150
    #     19062
    #     39845
    #     61887
    #     77985
    #     98391
    #     114383
    #     129980
    #     147593
    #     162075
    #     181469
    #
    # Disc length: 2598
    #
    # Revision: 3
    # Processed by: cddbd v1.5.2PL0
      \\ Copyright (c) Steve Scherf et al.
    # Submitted via: BonkEnc v1.0.8
    #
    DISCID=840a240b
    DTITLE=Mia / Willkommen im Club
      \\
    DYEAR=0
    DGENRE=Electronic
    TTITLE0=Kapitän
    TTITLE1=Mein Freund
    TTITLE2=Mausen
    TTITLE3=Du
    TTITLE4=100%
    TTITLE5=Magisch
    TTITLE6=Deinetwegen
    TTITLE7=Verfolger
    TTITLE8=Glücksstern
    TTITLE9=Halt Still
    TTITLE10=Die Aussicht
    EXTD=
    EXTT0=
    EXTT1=
    EXTT2=
    EXTT3=
    EXTT4=
    EXTT5=
    EXTT6=
    EXTT7=
    EXTT8=
    EXTT9=
    EXTT10=
    PLAYORDER=
    

    Die Informationen unterscheiden sich lediglich im Titel und dem Erscheinungsjahr der CD sowie im Titel von Track 4 und dem Genre. Die Kategorie muss sich unterscheiden, da in jeder Kategorie nur eine CD eingetragen werden kann. Dies dürfte ein Kritikpunkt an FreeDB sein.

    Es gibt verschiedene Server, an welche man die Abfrage ebenfalls richten kann:

    Demo

    FreeDB (pcddaFreeDB.7z - 228 kb) MD5 (1 kb).
    Compiler: Delphi 7 Personal
    Stand: 21. Juli 2018

    Änderungen an der Demo

    05.08.2018Änderung: Klassen überarbeitet.
    Änderung: TFreeDB liest die TOC nicht mehr selbst.
    Änderung: Frageformular bei mehreren Eintragungen entfernt. Dafür Auswahl über die Combobox für die Kategorie.
    Fehler: Als Interpret bei den Tracks wurde immer der Interpret der CD verwendet.
    21.07.2018Änderung: Neue Demo.
    27.07.2015Änderung: Lesen der TOC RAW, damit Data Tracks richtig erkannt werden.
    Änderung: Mit Delphi XE5 kompatibel.
    25.07.2015Hinzu: Splash Screen.
    Änderung: Optische Details.