Yuan-SxMusic

Project Url: jsyjst/Yuan-SxMusic
Introduction: 随心音乐,让心跟着跳动起来!
More: Author   ReportBugs   
Tags:

随心音乐,是一款基于 MVP+Retrofit+EventBus+Glide 的应用,有兴趣的盆友欢迎 Star,Fork!

前言

由于平日里自己是一个很喜欢听音乐的 boy,所以在闲暇时间本着自己的兴趣去开发了这款音乐,中途遇到了很多的困难,但是都是通过自己不断探索下一步一步解决了问题。

实现功能

  • [x] 本地音乐
  • [x] 我的收藏
  • [x] 网络歌曲下载
  • [x] 最近播放
  • [x] 在线搜索歌曲,专辑,在线歌曲播放
  • [x] 专辑歌曲
  • [x] 播放栏,播放进度条
  • [x] 播放界面,歌手图片唱碟
  • [x] 播放控制,暂停,上一首,下一首
  • [x] 歌词显示
  • [x] 播放模式,顺序播放,随机播放,单曲循环
  • [ ] 听模块,包括歌单,排行榜等
  • [ ] 看模块,包括推荐 MV 等

项目展示

动态图

截图

下载(5.0 以上)

apk 下载

项目 Api

下面的请求中如果参数有 songmid,都是得经过搜索歌曲或歌手后才能获得 songmid,然后进行请求。不能获取到 qq 音乐的 vip 或者付费歌曲的播放地址,Api 是通过 fiddler4 爬取网页端 qq 音乐获取的,如失效,请提出issue

搜索

1.搜索歌手/歌曲

请求地址:https://c.y.qq.com

请求示例:https://c.y.qq.com/soso/fcgi-bin/client_search_cp?p=1&n=2&w=泡沫&format=json

说明:关键字为歌手就返回该歌手的歌曲,如果为歌曲就返回该歌曲列表

参数 说明 是否必须 默认值
p 分页 默认为 1
n 请求数量 默认为 10
w 关键字
format 格式化 如果用 Retrofit 的 Json 解析的话记得一定要 format=json

2.搜索专辑

请求地址:https://c.y.qq.com

请求示例:https://c.y.qq.com/soso/fcgi-bin/client_search_cp?p=1&n=2&w=邓紫棋&format=json&t=8

参数 说明 是否必须 默认值
p 分页 默认为 1
n 请求数量 默认为 10
w 关键字
format 格式化 如果用 Retrofit 的 Json 解析的话记得一定要 format=json
t 类别 没有默认值,如果为搜索专辑,则 t 为 8。如果是搜索 mv,t=12。

获取歌手图片

1.根据歌手获取图片

请求地址:http://music.163.com

请求示例:http://music.163.com/api/search/get/web?s=邓紫棋&type=100

说明:请求后将有歌手图片的字段,请求后的 picUrl 和 img1v1Url 就是图片地址

参数 说明 是否必须 默认值
s 歌手
type 类别 无,但必须为 100

!!!注意:有可能在网上能够请求到数据,但在实际代码中请求时却不能返回的情况(自己在开发中碰到),这时候别着急,只需要在网络请求时加上请求头"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36"就能解决问题!

2. 根据 albumMID 获取专辑图片

请求地址:http://y.gtimg.cn

请求示例:http://y.gtimg.cn/music/photo_new/T002R180x180M000003c616O2Zlswm.jpg

说明:请求示例其实有两部分组成,即固定地址+albumMid。

组成 说明
固定地址 http://y.gtimg.cn/music/photo_new/T002R180x180M000 固定值,不需要改变
albumMid 在搜索专辑后,或者搜索歌曲会有 albumMid 这个字段 需要先搜索后得到 albumMid

获取播放地址

请求地址:https://u.y.qq.com

请求示例:https://u.y.qq.com/cgi-bin/musicu.fcg?format=json&data=%7B%22req_0%22%3A%7B%22module%22%3A%22vkey.GetVkeyServer%22%2C%22method%22%3A%22CgiGetVkey%22%2C%22param%22%3A%7B%22guid%22%3A%22358840384%22%2C%22songmid%22%3A%5B%22001X0PDf0W4lBq%22%5D%2C%22songtype%22%3A%5B0%5D%2C%22uin%22%3A%221443481947%22%2C%22loginflag%22%3A1%2C%22platform%22%3A%2220%22%7D%7D%2C%22comm%22%3A%7B%22uin%22%3A%2218585073516%22%2C%22format%22%3A%22json%22%2C%22ct%22%3A24%2C%22cv%22%3A0%7D%7D

说明:这个是根据歌曲 songmid 来获得音乐播放地址的,请求示例很长,在经过多次尝试后,很遗憾的并不能缩减,要想获取播放地址,只需要更改上面高亮字体的 songmid 后的 001X0PDf0W4lBq 即可,至于更改方法很多,比如直接用 Java 的字符串拼接。请求成功后请注意两个字段 purl 和 sip(为数组),歌曲的播放地址就是 sip 数组里的其中一个加上 pur,即 sip[0]+purl(vip 音乐或者版权音乐的 purl 为空)。

1. 请求时的参数说明

参数 说明
songmid 歌曲的 songmid 怎么得到,必须通过上面搜索歌曲后得到,然后更改上面示例的 001X0PDf0W4lBq(泡沫的 songmid)即可,示例的其它地方都不能做更改,也不能删减

2.请求后重要字段解释

播放地址:sip[0]+purl

示例:http://ws.stream.qqmusic.qq.com/C400000HjG8v1DTWRO.m4a?guid=358840384&vkey=852D30CD2DEA9E0AFF9CF700977FAFB413A06486CFE8F72502918665277C5407D8D5AD42039F02329401300003A2853B10816B83C3145159&uin=0&fromtag=66(泡沫)

字段 说明 示例
sip 播放接口地址,目前来说有两个地址,但是很有可能会改变 "sip": [
"http://ws.stream.qqmusic.qq.com/",
"http://isure.stream.qqmusic.qq.com/"
]
purl 里面最重要的就是 vkey 的值,这个值每次请求都不一样 "purl":C400000HjG8v1DTWRO.m4a?guid=358840384&
vkey=852D30CD2DEA9E0AFF9CF700977FAFB413A06486CFE8F7250
2918665277C5407D8D5AD42039F02329401300003A2853B10816B83C3145159
&uin=0&fromtag=66

获取歌词

请求地址:https://c.y.qq.com

请求示例:https://c.y.qq.com/lyric/fcgi-bin/fcg_query_lyric_new.fcg?songmid=000wocYU11tSzS&format=json&nobase64=1

说明:如果你点击了上面的链接的话,你会发现返回的是 -1310 的错误码,这时候请别着急,并不是这个请求 Api 是无效的,只是因为这个获取歌词的 Api 有点特殊,在请求时需要在请求的 header 上加上 Referer 地址就可以了

参数 说明
songmid 歌曲 songmid,需要在搜索歌曲后获取
format 格式,建议加上 format=json
nobase64 敲重点!!!,一定要等于 1,默认是 0,如果没加上的话,返回的歌词将会是乱码,加上后就可以得到歌曲的动态歌词,即带有时间的歌词

!!!敲重点:记得在请求头上加上 Referer:https://y.qq.com/portal/player.html,不然请求会返回 -1310

另外对歌词控件实现有兴趣的可以看看这篇文章 Android 自定义 View-简约风歌词控件

后续

本项目为个人闲暇开发项目,仅供学习借鉴使用,不用做商业用途

Apps
About Me
Google+: Trinea trinea
GitHub: Trinea