2012-10-21 26 views
2

我正在創建一個Perl腳本,它將以一種格式artist/album/mp3file將mp3文件移動到我的音樂文件夾中。現在有可能我的一些mp3文件沒有album tag,所以我想查詢MusicBrainz數據庫來檢索給定的track title & artist的專輯元數據。Perl:如何從MusicBrainz檢索專輯元數據?

我正在使用WebService::MusicBrainz Perl模塊完成此任務,但我無法看到任何提供相冊元數據信息的方法。我當前的代碼是:

use WebService::MusicBrainz::Track; 

my $ws = WebService::MusicBrainz::Track->new(); 
my $response = $ws->search({ ARTIST => 'Ryan Adams', TITLE => 'when the stars go blue' }); 

my $track = $response->track(); 
print $track->title(), " - ", $track->artist()->name(), "\n"; 

say $track->id(); 

那麼,如何讓我的專輯信息使用MusicBrainz的給定的軌道,如果它是不可能的我有哪些替代方案?

回答

4

首先,你想要的是添加元數據到MP3,這是人們最常見的使用場景。 「正常」的方式是使用Musicbrainz Tagger,在那裏打開這些文件並使用界面來附加正確的元數據。 建議(gui)工具是Musicbrain Picard

我還想聲明Perl模塊正在使用MusicBrainz的現在已棄用的Web Service Version 1。 該Web服務有一些問題,因爲它是針對另一個數據庫方案製作的,而不是現在在MusicBrainz上使用的方案。

但是,目前的Web Service Version 2只有一個python庫可用:python-musicbrainzngs

你仍然可以使用Perl模塊,但是如果遇到「奇怪」的問題,這可能是原因。


這是Web服務一般是如何工作的(以及它如何應該直接申請Perl模塊,作爲該Web服務的包裝): 你的搜索給出了這樣的:

http://musicbrainz.org/ws/1/track/?artist=%22Ryan%20Adams%22&title=%22when%20the%20stars%20go%20blue%22

您會看到該曲目的錄音列表。這些重新編碼發生在多個版本(ReleaseList)上。 你可以忽略這些,因爲它們是「編譯」類型。你可能想要「專輯」發行。

您可能會問自己爲什麼在列表中有多個具有相同名稱的專輯發行。 這是因爲MusicBrainz上的「發行版」是發行事件和一些媒介的組合。 您可能有美國版本和德國豪華版等等。 所有這些版本都在一個「發佈組」中。

您可能需要此「發佈組」的名稱,該發佈組通常也是此組中每個發佈的名稱。

您可能想了解一下MusicBrainz Database的結構。


這只是當然的基本用例。 您可能會在藝術家/標題,多個或丟失的相冊發佈組和其他內容中遇到拼寫錯誤。 然而,總的來說,它應該工作,你可以將「問題」案例放在一個特殊的目錄中,並在Picard中使用它們。 皮卡德還具有識別每個 「音樂分析」(PUIDs,Acoustids)


編輯文件的其他方式:

my @tracklist = $response->track_list(); 
foreach my $track (@tracklist) { 
    print $track->title(), " - ", $track->artist()->name(), "\n"; 
    my @releaselist = $track->release_list(); 
    foreach my $release (@releaselist) { 
    print " ", $release->title(), " - ", $release->type(); 
    } 
} 

一般應工作,但事實並非如此。它爲您提供了所有響應的跟蹤,但不知何故它無法從release_list()中提取發佈。可能是因爲架構發生了變化或者perl模塊被破壞了。

+1

你應該可以在這裏發佈鏈接作爲評論。否則,把它們寫成'hXXp:// ...',而有更多代表的人可以爲你修復它們。 –

+0

接收我的第一票給了我足夠的聲望 - >增加了鏈接 – JonnyJD

+0

很好聽。歡迎來到stackoverflow! –