一個線上音樂軟體的故事(三、音樂從哪裡來?)
音樂從哪裡來?
現在網際網路提供開放音樂API介面的平臺還是比較多的,比如:百度音樂API介面、騰訊音樂API介面、蝦米音樂API介面甚至中國移動都曾經有過音樂API介面,有興趣可以度娘一下,還有很多知名不知名的網際網路平臺都提供音樂API的介面。
經過音樂數量、音樂品質、使用者數量、開發複雜度等方面的比較,最終選擇了騰訊QQ音樂作為音樂源。但是騰訊的API是在移動裝置上對QQ音樂軟體的呼叫,對於我等開發桌面應用來說,依然沒有什麼用處,無奈之下只能直接分析QQ線上音樂的有關介面。
經過天(分)人(析)交(請)戰(求),得出以下幾個基本介面及其使用方法:
一、音樂資訊搜尋
主要是獲取音樂的基本資訊,如:歌曲名稱、media_mid
音樂資訊的搜尋地址:
上面的請求地址中有三個引數:
{0}表示頁碼。
{1}表示每頁顯示的記錄數量。
{2}表示要搜尋的關鍵字,多個關鍵字可以用空格分開。
這個請求發出之後,伺服器會響應一個包含搜尋結果的JSON字串,在這個字串中包含了音樂的所有資訊,格式和資訊的含義這裡暫不逐一說明,只說我們需要用到的部分,基本資訊如下:
Albumid:專輯ID編號。
Albummid:專輯MID編號,在獲取專輯封面圖片等資訊時,都需要用這個引數。
Albumname:專輯名稱。
Songid:音樂ID編號。
Songmid:音樂MID編號,在獲取播放KEY和音樂資料時,需要用到這個引數。
Songname:音樂名稱。
Interval:音樂時間長度,單位是秒。
Pubtime:音樂釋出時間。
Songurl:音樂介紹頁面的地址,指向音樂資訊的Web頁面。
Nt:不是非常清楚這個引數的含義和作用,我是用來作為獲取音樂資訊的GUID。
Singer:歌手或表演者資訊,是個陣列,包含了歌手的姓名、MID等資訊。
二、獲取音樂播放KEY資訊
從騰訊搜尋到的所有音樂資訊中並沒有包含音樂的直接播放地址,真正的音樂地址需要通過獲取播放KEY之後才能組織出來,繼續分析獲取播放KEY的請求:
上面這個請求地址有四個引數,其中兩個引數相同,具體含義是:
{0}上一步獲得的音樂MID。
{1}音樂的副檔名,預設是m4a。
{2}GUID,一個隨機數,但是要保留,在下一步中還要使用,這個軟體中是使用上一步獲取的Nt引數作為GUID。
這個請求也是返回一個JSON字串。但這個字串會包含MusicJsonCallback()函式的回撥,解析之前要先刪除這部分回撥文字。
這個JSON物件的主要引數說明如下:
Code:響應碼,成功響應0,其他為錯誤,同時會包含錯誤資訊
Filename:檔名
Songmid:音樂MID,和上面請求引數中的MID相同
Vkey:播放碼,這是這次請求獲得的最重要的引數,它用於組織音樂源地址
三、組織音樂源地址
有了上面取得的Filename、VKEY資訊之後,再結合上一步的GUID,就能組織出一個音樂源的請求地址,基本格式如下:
http://dl.stream.qqmusic.qq.com/{0}?vkey={1}&guid={2}&fromtag=66
音樂地址是固定的,裡面有三個引數,具體含義是:
{0}檔名,在上一步請求中獲得
{1}VKEY,播放KEY資訊,在上一步請求中獲得
{2}GUID,必須與上一步傳送給伺服器的請求GUID相同
該請求直接返回可以播放的音訊資料,可以在支援HTML5的瀏覽器中直接播放。此地址也作為音樂下載地址使用。
四、獲取專輯封面圖片
有了音樂源之後,音樂是可以播放了,但還要顯示專輯封面圖片,才能與主流播放器一樣,組織出完整的播放介面。騰訊音樂有專門的專輯封面圖片伺服器,可以通過下面的請求獲得封面圖片資料:
https://y.gtimg.cn/music/photo_new/T002R{0}x{0}M000{1}.jpg?max_age=2592000
這個請求包含兩個引數:
{0}圖片的尺寸,騰訊提供的專輯封面圖片都是正方形,而且尺寸固定為三種:90x90、180x180、300x300。
{1}專輯MID,在第一步中已經獲得該資訊
這個請求直接返回圖片資料,可以直接在瀏覽器中顯示。