libgugemusic: Google Music Streaming & Download

Basic structure

Google (China) Music website frontend is very traditional:

http://www.google.cn/music/song?id=S2894c9e5fc5df536
http://www.google.cn/music/album?id=B700dfba92c77567d
http://www.google.cn/music/artist?id=A21d5906abfad070c

Streaming

Google (China) Music service includes an online player made with Flex. The Streaming of .mp3 files & .lrc lyrics files is powered by ChinaCache. Here's a sample streaming query with XML result

In the URL query, parameter sig=7df9df980d74d35d28efe461842d76f1 refers to: MD5.hash(KeyContainer.PLAYER_KEY + param1.id);,

where KeyContainer.PLAYER_KEYM is defined at com.google.music.projectm.player.generated.KeyContainer.as as follows:

package com.google.music.projectm.player.generated
{

    public class KeyContainer extends Object
    {
        static public const PLAYER_KEY:String = "eca5badc586962b6521ffa54d9d731b0";

        public function KeyContainer()
        {
            return;
        }
    }
}

So the pseudo algorism for sig is:

md5("eca5badc586962b6521ffa54d9d731b0" + "S40dbcfe0c610fa09") = "7df9df980d74d35d28efe461842d76f1"

Download

Download is pretty easy, just try this link:

http://www.google.cn/music/top100/musicdownload?id=Sc623893aee83dfb4

and parse the <a> element:

<a href="/music/top100/url?q=http%3A%2F%2Ffile1.top100.cn%2F200905031622%2FFA4C7C8006CDB6F605DE00A4714A421A%2FSpecial_28506%2FWTF.mp3&ct=rdl&cad=dl&ei=V1T9SdDnNpuYsAKE8ua6AQ&sig=9EC3F52AC3B1F3857871AAF885AD2A2D"><img src="http://www.gstatic.cn/top100/images/download_icon.png" alt="" style="border: none;"></a>

libgugemusic

libgugemusic.py is a simple library for interacting with Google (China) Music service written in pure Python

Example:

>>> import libgugemusic
>>> libgugemusic.download_mp3_by_id('S40dbcfe0c610fa09')
'http://file3.top100.cn/200905031859/42B67F4B5A23786601DB7781B75E509A/Special_12
3690/%E8%8A%B1%E8%9D%B4%E8%9D%B6.mp3'
>>> libgugemusic.stream_mp3_by_id('S40dbcfe0c610fa09')
{'songUrl': 'http://audio2.top100.cn/200905031859/6186071D9F22FB7C15048C81BE0241
7B/streaming2/Special_123690/%E8%8A%B1%E8%9D%B4%E8%9D%B6.mp3', 'lyricsUrl': 'htt
p://lyric.top100.cn/Special_123690/M0123690001.lrc', 'label': '\xe5\x8d\x8e\xe7\
xba\xb3\xe5\x94\xb1\xe7\x89\x87\xe5\x85\xac\xe5\x8f\xb8(Warner Music)', 'provide
rId': 'M0123690001', 'albumThumbnailLink': 'http://www.gstatic.cn/base_media?q=h
ttp://pic.top100.cn/SpecialImg/middle_special_123690.jpg&size=2&hl=cn&am
p;fact=194&dhm=8bddb8f1'}

You can get libgugemusic.py on my Google Code SVN repository

I'll expand this library with music location function, and finally integrate Google (China) Music service with Last.FM radio.getPlaylist as an alternative to Last.FM, Pandora & Spotify.

标签: , ,

4 条评论 发表在“libgugemusic: Google Music Streaming & Download”上

  1. bones7456 说到:

    干得不错,也许你对这个感兴趣? http://code.google.com/p/gmbox/
    我写的介绍: http://li2z.cn/2009/04/10/gmbox_alpha/
    现在代码还有点乱,需要整理一下下...有兴趣加入不?

  2. lonevan 说到:

    'http://audio2.top100.cn/200905031859/6186071D9F22FB7C15048C81BE0241
    7B/streaming2/Special_123690/%E8%8A%B1%E8%9D%B4%E8%9D%B6.mp3'

    how can you get the string ,i think it is generated automatically..is the method you metioned (md5calc)?

    hope your reply

  3. lonevan 说到:

    something wrong happened..
    http://www.google.cn/music/songstreaming?id=Sb2d24d397df415ec&client=&output=xml&sig=69bcae919b622a999868c5425eb7a591&cad=pl_player
    like the url above,hashlib.md5(PLAYER_KEY + id) != sig..
    was the PLAYER_KEY changed?

留下回复