2011-01-02 13 views
3

erhält Kann mir jemand sagen, wie man Spurinformationen von der MusicBrainz Datenbank von einer Audiodatei (mp3, wav, wma, ogg, usw. ...) unter Verwendung des Audiofingerabdruckes erhält. Ich benutze die MusicBrainz Sharp-Bibliothek, aber jede andere Bibliothek ist in Ordnung.Wie man musicbrainz Titelinformationen von der Audiodatei

Ich habe gesehen, dass Sie die libofa-Bibliothek verwenden müssen, dass Sie MusicBrainz Sharp nicht verwenden können, um aus der Audiodatei zu erhalten, aber ich kann nicht herausfinden, wie libofa mit C# zu verwenden ist.

Bitte zeigen Sie einige Beispiele und Code-Schnipsel, um mir zu helfen, weil ich sie nirgendwo finden kann.

Vielen Dank im Voraus!

Antwort

1

Die Sache ist, dass Sie wahrscheinlich libofa einen Fingerabdruck der Audio-Datei zu erhalten verwenden, aber wenn die Datei keine PUID zur Verfügung hat, werden Sie stecken und muss so etwas wie genpuid verwenden, um die Audio-Fingerabdruck AmpliFIND einreichen und warten Sie einen Tag, um eine PUID zu bekommen.

Ich habe versucht, etwas ähnliches vor etwa zwei Jahren, aber irgendwie das Interesse an dem Projekt verloren, wenn ich nicht die IDv3-Tags schreiben, wenn ich mich richtig erinnere. Der Quellcode ist jedoch verfügbar on Bitbucket.

ich im Grunde wrapped libofa mit einem DllImport und auch wrapped genpuid (dh. Die Ausgabe von XML lesen) in der Lage sein den Fingerabdruck zu lesen und die Datei für die Abnahme von Fingerabdrücken einreichen, wenn ich nicht eine von libofa bekommen haben. Ich schrieb auch some code, die Informationen von MusicBrainz unter Verwendung MusicBrainz Sharp liest.

Nun, zumindest war das, was ich damals geplant habe, denke ich. :) Ich hoffe, das hilft dir, dein Problem zu lösen und ich würde gerne ein Update zu diesem Thema sehen.

bearbeiten: Ich habe gerade bemerkt, dass ich ein bug report für mich geschaffen, die im Grunde sagt, dass ich noch eine Implementierung für meine decoder benötigt, was wahrscheinlich ist, warum ich this question in SO erstellt. Also ich denke, ich habe nicht implementiert genpuid fingerprinter nur um in der Lage zu sein, den Fingerabdruck/die Guid zu tun, weil ich nicht die libofa fingerprinter richtig funktionieren.

+0

@Baki: Hat dies geholfen oder benötigen Sie weitere Ratschläge? – hangy

+0

Um ID3-Tags zu schreiben (meinst du wirklich ID3v3? Oder ID3v2?) Kannst du taglib verwenden. Es gibt ein nugget und es ist wirklich nett zu verwenden. –

+0

TagLib funktionierte 2008 nicht wirklich gut mit .NET (und NuGet existierte nicht;)), aber ich nehme an, dass es in seinem Job besser geworden ist. :) – hangy

0

Ich habe den oben beschriebenen umhüllten Genpuid-Ansatz gemacht.

private string GetPUID(string fileName) 
    { 

     Process p; 
     ProcessStartInfo si; 
     string outRow; 
     string puidReturned; 

     string gendPuidPath = @"C:\Program Files\genpuid\genpuid.exe"; 
     string gendPuidKey = "your key here"; 
     System.Text.RegularExpressions.Regex puidRex = new System.Text.RegularExpressions.Regex(@"puid: (\S+)"); // sample: puid: 3c62e009-ec93-1c0f-e078-8829e885df67 
     System.Text.RegularExpressions.Match m; 

     if (File.Exists(gendPuidPath)) 
     { 
      try 
      { 
       si = new ProcessStartInfo(gendPuidPath, gendPuidKey + " \"" + fileName + "\""); 
       si.RedirectStandardOutput = true; 
       si.UseShellExecute = false; 

       p = new Process(); 
       p.StartInfo = si; 
       p.Start(); 

       puidReturned = ""; 
       while ((outRow = p.StandardOutput.ReadLine()) != null) 
       { 
        m = puidRex.Match(outRow); 
        if (m.Success) 
         puidReturned = m.Groups[1].Value; 
        Debug.WriteLine(outRow); 
       } 
       p.WaitForExit(); 
       p.Close(); 

       return puidReturned; 
      } 
      catch (Exception ex) 
      { 
       Debug.WriteLine(ex.Message); 
       Debug.WriteLine(ex.StackTrace); 
       throw new Exception("Unexpexted Error obtaining PUID for file: " + fileName, ex); 
      } 
     } 
     else 
     { 
      Debug.WriteLine("genpuid.exe not found"); 
      return ""; 
     } 
    }