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

CDDB - FreeDB

  • Beschreibung
  • Beispiel
  • Anfrage erstellen
  • Antwort
  • 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 eingetragen.

    Beispiel

    Als Beispiel kommt diese CD, deren TOC mit Table of Content (RAW) ermittelt wurde, zum Einsatz:

    Anfrage erstellen

    Hier wurde noch nicht die Spieldauer der CD berechnet. Dies geht so:

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

    Aus dieser Trackliste und der Spieldauer der CD wird eine DiscID errechnet. Auf dieser Seite gibt es das Archiv freedb_howto1.07.zip mit der Datei freedb.howto.txt, welche die Berechnung als C-Quelltext beinhaltet. 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;
      end;
     
    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;
    

    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
    • Die Query
    • Das Hello

    Die Query setzt sich wie folgt zusammen:

    • Die Floskel "?cmd=cddb+query",
    • die DiscID,
    • die Anzahl der Tracks,
    • die Offsets der Tracks (als LBA oder in Frames) und
    • die Spieldauer der CD in Sekunden.

    Und das Hello:

    • Die Floskel "&hello=",
    • der Username,
    • der Hostname,
    • der Clientname,
    • die Version und
    • die 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.

    Im Idealfall ist es der Code 200. Es gibt derzeit drei verschiedene Alben mit der DiscID 840A240B, welche in verschiedenen Genres eingetragen sind. Die Beispiel-CD ist doppelt eingetragen, weshalb man im Beispiel diese Antwort erhält:

    210 Found exact matches, list follows (until terminating `.')
    data 840a240b Mia (Willkommen Im Club) / Willkommen Im Club
    newage 840a240b Mia / Willkommen im Club
    

    Dies bedeutet, dass die CD in den Genres data und newage eingetragen ist und eine zweite Abfrage erfolgen muss. Entweder in 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
    

    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

    Demo, welche Alben mit verschiedenen Interpreten nicht unterscheidet.

    CD Copy Step 1a (podCDCopyStep1a.7z - 486 kb) MD5 (1 kb).
    Compiler: Delphi 7 Personal
    Stand: 27. Juli 2015

    Änderungen an der 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.