從網(wǎng)易云音樂緩存文件得到 MP3

最近想獲取幾首好聽的網(wǎng)易云音樂文件,但是不是會員,只有緩存文件,而且經(jīng)過加工了的。
以前獲取過某k歌的緩存文件,直接修改后綴名就行了,但是網(wǎng)易云音樂不行,sigh

下面開始探索網(wǎng)易云音樂之旅:D

目錄

  • 解密緩存文件
  • 獲得歌曲信息
  • 獲取歌詞
    • lyric文件
    • 利用API獲取歌詞
  • 成果
    • 完整代碼
  • 感想
  • 注意
  • And finally

解密緩存文件

在手機上的緩存文件在 netease/cloudmusic/Cache/Music1
觀察可以發(fā)現(xiàn),歌曲緩存文件包括兩個,一個是index文件.idx!,另一個是歌曲文件,index文件和歌詞文件(歌曲id命名)都是txt文件,可以直接打開,而歌曲文件.uc!打開錯誤。緩存文件是修改過的。如圖:

file

進一步地,緩存文件和源文件大小一樣大,所以沒有經(jīng)過壓縮,最簡單的想法是異或運算,這樣最簡單,加密,解密一樣的操作。逐個嘗試,發(fā)現(xiàn)每字節(jié)和0xa3異或即可,得到正確的文件,可以播放,哈哈 :smiley: 下面是代碼,注意用bytearray修改bytes

with open (fileName,'rb') as f:
    btay = bytearray(f.read())
with open(newFile,'wb') as out:
    for i,j in enumerate(btay):
        btay[i] = j ^ 0xa3
    out.write(bytes(btay))

獲得歌曲信息

為了給歌曲文件正確命名,我想獲得歌曲題目和歌手信息。雖然.idx!索引文件包含一些屬性,但是沒有歌曲標(biāo)題和歌手,不過重要的是musicId,這是歌曲的唯一標(biāo)識。然后發(fā)現(xiàn).idx! .uc!文件都是以id開頭的,且歌詞文件是id命名的。

可以用這個 api 來獲取信息
https://api.imjad.cn/cloudmusic/?type=detail&id=1234132

還有另一種方法,mp3等文件格式有一些metadata (元素?fù)?jù)),mp3文件的 id3 tag里面就包含標(biāo)題,歌手。這是wiki的介紹

mp3

然后找python模塊,網(wǎng)上說eyeD3比較好用,但是我安裝好后提示libmagic找不到,搜索問題未能解決(如果你有解決辦法,請告訴我,十分感謝), 然后用的mutagen模塊,這個模塊能操作很多格式的文件,這是效果

id3

獲取歌詞

有兩種方法

lyric文件

這是歌詞文件內(nèi)容

file

從這個文件中讀取。 解析這個文件,由于沒有統(tǒng)一的鍵,所以可以用正則表達(dá)式r'(lyric|lrc|klyric|kalaokLyric|tlyric)\s*[\'\"]:\s*[\'\"]\s*\[')來檢查是否有歌詞內(nèi)容

# self.hasLrcPt= re.compile(r'(lyric|lrc|klyric|kalaokLyric|tlyric)\s*[\'\"]:\s*[\'\"]\s*\[')
# self.lrcKey = 'lyric|lrc|klyric|kalaokLyric|tlyric'.split('|')

def noLrc(self,s):
        '''judge if a dict or a string  has lyrics'''
        if isinstance(s,str):
            return self.hasLrcPt.search(s) is  None
        else:
            return not  reduce(or_,[i in s and s[i]!='' for i in self.lrcKey]) 

檢查到有歌詞后,可以發(fā)現(xiàn)每句是這樣的

[0:09.000]平安夜,褻瀆的夜晚\n

最開始用的r'\[\d+,\d+\](\(\d+,\d+\)(\w))+\n'),然而總是匹配不到,在交互模式又匹配得很精確,在這里浪費了很多時間,最后發(fā)現(xiàn)是\n的問題,在正則表達(dá)式中要用\\n,作為字符串在交互模式下打印出來只顯示了\n, :weary: , 心累 ,改為r'\[\d+:\d+\.\d+\](.*?)\\n'.

利用API獲取歌詞

利用上面的 api , 傳遞 lyric 參數(shù)即可

注意由于是緩存文件,有極少的音樂可能id3 tag以及 api 都沒有信息,對于這些,我直接用的id命名

成果

  • 展示
display.gif
  • 運行輸出
  • 歌詞


  • MP3


完整代碼

github

感想

:flushed: (羞澀
有時看書有點沒有耐心,想實踐,然而如果沒有掌握好知識,實踐的話就會踩很多坑,甚至可能還爬不起來有些坑。 還差得遠(yuǎn)呢,還得加油哦!

注意

  • 有極少數(shù)的緩存文件 在 api 中沒有信息, 在 id3 tag 中也沒有, 這些歌曲我用的 id 來命令
  • 最新更新都在github上, 博客很少更新, 所以使用前最好去讀一下 github 的 readme

And finally

warning

(學(xué)習(xí)使用異或加密 :see_no_evil:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 使用GIT SUBTREE集成項目到子目錄 使用場景 例如,在項目Game中有一個子目錄AI。Game和AI分別是...
    anddygon閱讀 1,152評論 0 0
  • 在回上古界的途中,洛白真神一念思索這手串,想自己未蘇醒或許是件好事。一念又覺得或許她這樣的命運注定萬世孤獨一身,不...
    嚒嚒噠閱讀 260評論 0 0
  • (一) 出了舞蹈室的門,天已經(jīng)微微黑...
    夏天的子道閱讀 372評論 0 0

友情鏈接更多精彩內(nèi)容