在线查询CD
一、概述
CDDB的全稱是CD database,翻譯過來就是“CD數(shù)據(jù)庫”。正如字面意思一樣,CDDB其實(shí)就是一個(gè)網(wǎng)絡(luò)數(shù)據(jù)庫,世界各地的音樂愛好者、CD出版商都可以通過網(wǎng)絡(luò)向這個(gè)數(shù)據(jù)庫提交CD信息,也可以通過網(wǎng)絡(luò)從這個(gè)數(shù)據(jù)庫查詢CD信息,包括CD的專輯(Album)名稱、演奏者(Artist)、出版年份(Year)、曲風(fēng)(Genre)、每條音軌的標(biāo)題(Title)等。
CDDB的作用包括,但是不限于:
我寫這篇文章的目的,當(dāng)然不可能是希望促進(jìn)音樂D版事業(yè)的發(fā)展,只是希望通過對常見CDDB的介紹,讓大家對它們的特點(diǎn)及查詢方法有所了解,在需要的時(shí)候能夠及時(shí)從CDDB獲取有用的信息,當(dāng)然這些信息必須也只能用于合法的目的。
二、常見CDDB
1、freedb
官方網(wǎng)站:http://www.freedb.org
查詢頁面:http://www.freedb.org/freedb_search.php
中文支持:很爛
著名用戶:EAC(Exact Audio Copy),foobar
freedb是一個(gè)非盈利性組織,該組織維護(hù)freedb網(wǎng)站及其CD數(shù)據(jù)庫,供大家免費(fèi)查詢CD信息。如果您發(fā)現(xiàn)freedb的CD數(shù)據(jù)庫里沒有的CD,也可以手工輸入信息提交給freedb,充實(shí)它的數(shù)據(jù)庫,體現(xiàn)“人人為我,我為人人”的原則。
freedb不僅可以免費(fèi)查詢,而且它的所有查詢協(xié)議都是公開的,在其網(wǎng)站上有詳細(xì)的說明,因此使用freedb的免費(fèi)軟件很多,包括EAC、foobar在內(nèi)的一些軟件都用它查詢CD信息,所以人氣較旺。
除了協(xié)議公開外,freedb甚至連數(shù)據(jù)庫內(nèi)容都公開了:從這里可以免費(fèi)下載到freedb的完整數(shù)據(jù)庫供離線查詢使用。這種事情大概只有以free開頭的網(wǎng)站才會(huì)做,.com網(wǎng)站是做不出來的。
不過freedb這種完全靠音樂愛好者提交信息的運(yùn)行模式也給它的內(nèi)容帶來了一些限制。從我自己使用的情況看,freedb查詢國外版權(quán)的CD(包括國內(nèi)從國外引進(jìn)版權(quán)的CD)基本上問題不大,但是國內(nèi)版權(quán)的基本上就沒有了,可能和國內(nèi)音樂愛好者較少向freedb提供信息有關(guān)。
另外我對它的中文支持評價(jià)為“很爛”,是指:
- 在它的查詢頁面上,如果直接輸入中文作為關(guān)鍵字,什么也查不到。
- 從它提供的開發(fā)文檔看,從CDDB Protocol Level 6開始支持UTF-8編碼,但是目前大多數(shù)軟件都采用CDDB Protocol Level 6以前版本的協(xié)議,所以目前支持中文關(guān)鍵字查詢freedb的軟件還沒看到。
- 如果按照CDID(從CD各音軌起始位置、長度計(jì)算出來的CD標(biāo)識,相當(dāng)于CD的“指紋”,在CDDB里通常用來標(biāo)識每張CD)查詢,可以查詢出freedb里有的中文CD信息,但是由于計(jì)算CDID需要讀取光盤,因此這個(gè)只能在軟件里實(shí)現(xiàn)(如foobar等),在查詢網(wǎng)頁上很難做到。
2、Gracenote
官方網(wǎng)站:http://www.gracenote.com
查詢頁面:http://www.gracenote.com/music/
中文支持:很好
著名用戶:Real Player
Gracenote這個(gè)名字對某些人來說可能有點(diǎn)陌生,但是它的前身cddb.org卻是大名鼎鼎,號稱網(wǎng)上最早、最大、最全的CDDB。不過cddb.org代表的是充滿理想的免費(fèi)共享主義時(shí)代,現(xiàn)在已經(jīng)改成商業(yè)化運(yùn)營模式的.com,所以干脆連名字都改成專有的了。
如果想在軟件中集成查詢Gracenote的CDDB功能,必須取得Gracenote的許可。免費(fèi)許可比較難申請,至少我的申請就沒有得到回應(yīng),所以Gracenote在免費(fèi)軟件中很少見,多用于商業(yè)軟件,如Real Player。
Gracenote對中文的支持很好:
- 通過網(wǎng)頁查詢時(shí),不僅支持中文關(guān)鍵字,而且輸入簡體關(guān)鍵字,連繁體CD信息都能查出來。
- 在通過Gracenote提供的控件編程查詢某些歐洲發(fā)行的CD信息時(shí),如果遇到特殊西歐字符,Gracenote會(huì)自動(dòng)轉(zhuǎn)換成帶聲調(diào)的漢語拼音字符,方便在中文環(huán)境下顯示。這個(gè)功能似乎是Gracenote獨(dú)有,在其它地方我還沒有見過。后來俺在寫解決cue文件亂碼的軟件CueCode時(shí),把這招學(xué)了過來,嘿嘿……
從我個(gè)人使用的情況看,Gracenote的數(shù)據(jù)量無疑超過freedb,和微軟的CDDB相比則各有千秋:國外的CD可能兩個(gè)都差不多,國內(nèi)的有時(shí)Gracenote查得出,微軟查不出,有時(shí)則相反。
3、微軟CDDB
官方網(wǎng)站:據(jù)說正在建設(shè)中,尚未正式公布,估計(jì)是http://metaservices.windowsmedia.com
查詢頁面:未正式公布,下面URL是我從Windows Media Player里抓出來的,有效期不敢保證:
http://metaservices.windowsmedia.com/CDWizard/CDWizard1.asp
中文支持:很好
著名用戶:Windows Media Player
這個(gè)是微軟自己的CD數(shù)據(jù)庫,Windows Media Player就是從這上面查找CD信息的。有錢人做事畢竟不同,感覺微軟的數(shù)據(jù)庫比freedb全多了,而且時(shí)常可以查到CD的封面圖片,估計(jì)是直接從CD廠商獲取的數(shù)據(jù)。不過到目前為止,微軟尚未公布CD查詢的接口規(guī)范,也沒有說是否允許免費(fèi)使用,因此除了微軟自己的Windows Media Player外,還沒有見過哪個(gè)公開發(fā)表的軟件使用這個(gè)CDDB。
在中文支持方面,微軟的CDDB也不錯(cuò):
- 通過網(wǎng)頁查詢時(shí),不僅支持中文關(guān)鍵字,連頁面都是中文的,這點(diǎn)比Gracenote強(qiáng)。
- 偶爾能查到中文CD的封面。
三、編程相關(guān)
上面說的都是直接通過IE查詢,但是有些查詢是不能通過IE進(jìn)行的,只能按照CDDB的查詢協(xié)議開發(fā)專門的查詢軟件。下面討論的就是這方面的技術(shù),僅供有興趣的人參考。
1、查詢過程
通常通過網(wǎng)頁查詢CDDB,都是先輸入某些關(guān)鍵字,如歌曲或?qū)]嬅Q、歌手或樂隊(duì)名稱等,然后點(diǎn)“查詢”,等待進(jìn)入查詢結(jié)果頁面后,再點(diǎn)擊列出的專輯名稱,查看專輯內(nèi)容。
在編程實(shí)現(xiàn)CD查詢時(shí),按照上述關(guān)鍵字進(jìn)行查詢只是部分情況,大多數(shù)軟件是按照光盤本身的信息進(jìn)行查詢,如EAC、foobar、Real Player、Windows Media Player,都是在用戶將CD插入光驅(qū)后,自動(dòng)讀取光盤信息,組合成CDID,然后提交給CDDB進(jìn)行查詢,很少有需要用戶自己輸入關(guān)鍵字的時(shí)候。
對于freedb和Gracenote來說,由于CD專輯信息都是網(wǎng)友自己上傳的(Gracenote商業(yè)化運(yùn)作后可能直接從CD出版商獲取數(shù)據(jù),但是免費(fèi)時(shí)代的底子應(yīng)該還有保留),難免會(huì)出現(xiàn)重復(fù),并且CDID算法本身也可能產(chǎn)生碰撞,因此在freedb和Gracenote的開發(fā)文檔中,都要求開發(fā)者必須處理“模糊(fuzzy)”——其實(shí)就是重復(fù)的查詢結(jié)果。通常的處理方式就是象EAC一樣,彈出一個(gè)列表讓用戶自己選。查詢freedb的軟件可能要自己寫這段代碼,Gracenote提供的控件本身就包含了對重復(fù)結(jié)果的選擇界面。
對于微軟CDDB來說,我還沒有發(fā)現(xiàn)過有重復(fù)的現(xiàn)象。可能是因?yàn)槲④浿苯訌脑糃D出版商那里拿數(shù)據(jù),CDID算法也比較嚴(yán)格,所以查詢結(jié)果比較精確吧,Maybe……
2、TOC和CDID
前面說過,按照CD本身的信息查詢CDDB,需要讀取光盤信息,產(chǎn)生一個(gè)CDID(CD 的唯一標(biāo)識號),然后以此為關(guān)鍵字進(jìn)行查詢。
在freedb的開發(fā)文檔中,CDID被稱為DISCID,在這里有詳細(xì)的算法說明。在看過這個(gè)算法后,我又分析過Gracenote、微軟CDDB的CDID算法,發(fā)現(xiàn)他們的算法都差不多:
雖然算法大同小異,但是計(jì)算出來的結(jié)果不太一樣:freedb的CDID只有32位,Gracenote、微軟CDDB的都長達(dá)128位!俺曾經(jīng)懷疑這可能也是freedb的查詢結(jié)果重復(fù)率比較高、查詢結(jié)果不甚準(zhǔn)確的原因之一,不過很難證實(shí)。另外從TOC映射到CDID明顯是一個(gè)不對稱hash過程,難免有碰撞,因此也就需要允許模糊查詢。
那么如果手上沒有CD,只有從CD抓出來的APE和cue文件,能不能計(jì)算CDID并且據(jù)此查詢CDDB呢?
答案是:多數(shù)情況下可以,少數(shù)情況下不行。
原因就在于按照目前cue文件格式的規(guī)定,cue文件中缺少兩樣關(guān)鍵的東西:
第一個(gè)不足會(huì)影響CD刻錄,兩個(gè)不足合起來則會(huì)影響CDID的計(jì)算,從而影響CDDB查詢。
為了解決這個(gè)問題,通常的做法是:
在做出這兩個(gè)假設(shè)后,大多數(shù)情況下就能按照APE+cue從CDDB查詢到CD信息,畢竟就算有點(diǎn)走樣,還有模糊查詢在支撐,但是少數(shù)情況下還是會(huì)出問題:
所以在能夠生成、識別cue文件的軟件全面改進(jìn)以補(bǔ)全上面說的兩個(gè)信息之前,只能祈禱下載到的盤都是從2秒處開始,ape文件也是從真正的原盤,而不是轉(zhuǎn)換出來的刻錄盤上抓出來的(轉(zhuǎn)換刻盤可能改變最后一軌長度)。
這個(gè)問題也可以這樣描述:假設(shè)您買到一張CD,把CD插進(jìn)光驅(qū)后如果能用Windows Media Player直接查到它的信息,俺不敢肯定這張CD是不是D出來的;但是如果從光盤直接查查不到,但是在Windows Media Player里輸入專輯名稱、演奏者、歌曲名稱等等卻能查到這張CD,那么俺敢和您打賭一分錢:這張CD十之八九是J商自己從APE,甚至MP3翻刻的。freedb、Gracenote由于有模糊查詢,不太精確的翻刻還有可能蒙混過去,微軟CDDB則很難混過去。
關(guān)于cue文件的問題,我以前曾寫過一篇《cue文件的不足》,發(fā)布在伊美姬網(wǎng)怡紅快綠音樂論壇,不過似乎應(yīng)者寥寥。
3、編程接口
freedb的查詢協(xié)議是完全公開的,相關(guān)技術(shù)文檔見這里。已經(jīng)有很多人按照協(xié)議寫過相關(guān)的查詢代碼了,有些還開源,可以直接拿來用。如俺寫FreeMP3Tag時(shí),就用了PJ Naughter的MfcCDDB,不過對其中socket連接部分做了改進(jìn),以增加連接的成功率。
Gracenote的編程接口更簡單:到這里申請一個(gè)Non-Commercial ID,即可下載一個(gè)ActiveX控件,并且附帶各種開發(fā)語言的使用例子,將這個(gè)控件嵌入您自己的運(yùn)用,再仿照例子調(diào)用一下查詢接口就可以了。麻煩的是在開發(fā)完成后,如果要正式發(fā)行您開發(fā)出來的軟件,還需要另外再申請正式的發(fā)行ID。不知道別人有沒有申請到,反正我的申請是一直沒有回音。
微軟的查詢接口一直沒有公開,所以也沒有什么直接相關(guān)的文檔或代碼可供參考。不過對于任何一個(gè)能夠看懂HTML源代碼的人來說,只要看一下Windows Media Player和服務(wù)器的交互過程,要猜出來也不是很難。
4、中文支持探討
如果按CDID查詢CD,當(dāng)然不存在中文問題,因?yàn)镃DID只是從TOC計(jì)算出來的一堆數(shù)字。但是按照關(guān)鍵字(專輯名稱、歌曲名稱、演奏者等)查詢時(shí),如前所述,三個(gè)CDDB的支持程度有所不同。在這里我想探討一下其原因。
我個(gè)人認(rèn)為中文問題的核心是編碼問題:用戶輸入的中文關(guān)鍵字必須發(fā)送給CDDB服務(wù)器,IE在發(fā)送中文關(guān)鍵字的時(shí)候,因?yàn)橹形木幋a的高位為1,因此必須先對中文進(jìn)行編碼,服務(wù)器收到查詢請求后,再對IE的編碼進(jìn)行解碼。這樣一個(gè)編碼->解碼的過程,要求解碼器必須確切知道編碼器所使用的代碼頁。很不幸的是,freedb在這方面做得并不好,所以解碼后就全亂套了。舉個(gè)簡單的例子,用戶輸入“鄧麗君”,IE按照簡體中文編碼成UTF8發(fā)送出去,但是freedb服務(wù)器在收到這個(gè)查詢請求后,并不知道這個(gè)UTF8字符串是從簡體中文編碼得來的,因此只能按照它自己設(shè)定的一個(gè)代碼頁進(jìn)行解碼,比如說按日語進(jìn)行解碼,解出來的還會(huì)是“鄧麗君”這三個(gè)字嗎?如果關(guān)鍵字錯(cuò)誤,自然查詢不到。
下面是三個(gè)CDDB查詢“鄧麗君”的結(jié)果URL:
http://www.freedb.org/freedb_search.php?words=%26%2337011%3B%26%2320029%3B%26%2321531%3B&allfields=NO&fields=artist&fields=title&allcats=YES&grouping=none
http://www.gracenote.com/music/search-adv.html?q=&qartist=%E9%82%93%E4%B8%BD%E5%90%9B&qdisc=&qtrack=&n=10&x=49&y=15
http://metaservices.windowsmedia.com/CDWizard/CDWizard2.asp?WMPFriendly=true&locale=804&SearchType=Artist&SearchString=-28525,20029,21531&MODE=DISPLAYARTISTALBUMS&AlbumID=&ArtistID={B50F45AB-1870-480A-B1E6-6C626B98709B}&Version=1.0&sVolume=1&sCDTOC=
微軟SearchString中的內(nèi)容是“鄧麗君”三個(gè)字的十進(jìn)制unicode編碼,gracenote的qartist的內(nèi)容為“鄧麗君”的3字節(jié)UTF-8編碼,掩碼位為:
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
freedb的編碼就猜不出來了。
其實(shí)通過網(wǎng)頁查詢的時(shí)候,IE在發(fā)送給CDDB服務(wù)器的HTTP請求頭中都會(huì)包含下面這一行:Accept-Language: zh-cn
我猜微軟、gracenote就是據(jù)此判斷查詢請求來自簡體中文頁面,而freedb沒有做這個(gè)判斷。微軟在判斷出來后,干脆把簡體中文的LCID(804)放到URL的locale字段(簡體中文版Windows XP注冊表HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Nls/Language項(xiàng)下的Default值就是804)。
總結(jié)
- 上一篇: WMTS服务及地图瓦片原理
- 下一篇: IntelliJ IDEA 好用插件之M