Fiddler爬取Api之网络歌曲歌词功能

pull/1/head
jsyjst 6 years ago
parent d78d869dc1
commit 215d708346

@ -35,5 +35,10 @@ public class Api {
public static final String JPG=".jpg";
//专辑详细
public static final String ALBUM_DETAIL="v8/fcg-bin/fcg_v8_album_info_cp.fcg?format=json";
//歌词
public static final String SONG_LRC ="soso/fcgi-bin/client_search_cp?p=1&n=30&format=json&t=7";//搜索歌词
public static final String ONLINE_SONG_LRC="https://c.y.qq.com/lyric/fcgi-bin/fcg_query_lyric_new.fcg?format=json&nobase64=1";//根据qq音乐的mid获取歌词
}

@ -5,6 +5,8 @@ package com.example.musicplayer.app;
*/
public class Constant {
public static final String TAG = "jsyjst";
public static final int OFFSET=30;
public static final int TYPE_SONG=1;
public static final int TYPE_ALBUM=2;
@ -14,12 +16,6 @@ public class Constant {
public static final int LIST_TYPE_LOVE=2;
public static final int LIST_TYPE_HISTORY=3;
public static final int HISTORY_MAX_SIZE=100;
public static final String LOCAL_IMG="local_img";
public static final String SEARCH_SONG= "search_song";
public static final String SEARCH_SONG_MORE= "search_song_more";
public static final String SEARCH_ALBUM="search_album";
public static final String SEARCH_ALBUM_MORE="search_album_more";
public static final String ALBUM="album";
//布局
@ -46,4 +42,9 @@ public class Constant {
//TAG
public static final String TAG_ERROR = "error";
//网络与非网络歌曲
public static final int SONG_ONLINE=0;
public static final int SONG_LOCAL=1;
}

@ -18,11 +18,14 @@ public interface IPlayContract {
void showLoveAnim(); //喜欢的动画
void saveToLoveSuccess();//保存到我喜欢数据库成功
void sendUpdateCollection(); //发送广播更新收藏列表
void showLrcMessage(String lrc,String id); //显示歌词获取信息
void showLrcMessage(String lrc); //显示歌词获取信息
void showLrc(String lrc);//显示歌词
void getLrcError();//获取不到歌词
}
interface Presenter extends IPresenter<View> {
void getSingerImg(String singer,String song,long duration);
void getLrcUrl(String song, long duration);
void getLrc(String songName, String songId,long duration); //搜索歌词
void getSongOnlineLrc(String songId);//获取网络歌曲
void queryLove(String songId);//查询我喜欢的数据库中有没这首歌
void saveToLove(Song song); //添加到我喜欢的表

@ -0,0 +1,30 @@
package com.example.musicplayer.entiy;
/**
* <pre>
* author :
* time : 2019/09/04
* desc : qq
* </pre>
*/
public class OnlineSongLrc {
private int code;
private String lyric;
public void setLyric(String lyric) {
this.lyric = lyric;
}
public void setCode(int code) {
this.code = code;
}
public int getCode() {
return code;
}
public String getLyric() {
return lyric;
}
}

@ -0,0 +1,345 @@
package com.example.musicplayer.entiy;
import com.google.gson.annotations.SerializedName;
import java.util.List;
/**
* <pre>
* author :
* time : 2019/09/04
* desc :
* </pre>
*/
public class SongLrc {
/**
* code : 0
* data : {"keyword":"说谎","lyric":{"curnum":1,"curpage":1,"list":[{"albumid":54250,"albummid":"004YodY33zsWTT","albumname":"感官/世界","albumname_hilight":"感官/世界","alertid":23,"belongCD":0,"cdIdx":6,"chinesesinger":0,"content":"说谎 (거짓말) (《杜拉拉升职记》电视剧插曲|《针尖上的天使》电影主题曲) - 林宥嘉 (Yoga Lin)\\n 词:施人诚\\n 曲:李双飞\\n 是有过几个不错对象\\n 说起来并不寂寞孤单\\n 可能我浪荡让人家不安\\n 才会结果都阵亡\\n 我没有什么阴影魔障\\n 你千万不要放在心上\\n 我又不脆弱何况那算什么伤\\n 反正爱情不就都这样\\n 我没有说谎我何必说谎\\n 你懂我的我对你从来就不会假装\\n 我哪有说谎\\n 请别以为你有多难忘\\n 笑是真的不是我逞强\\n 我好久没来这间餐厅\\n 没想到已经换了装潢\\n 角落那窗口闻的到玫瑰花香\\n 被你一说是有些印象\\n 我没有说谎我何必说谎\\n 你知道的我缺点之一就是很健忘\\n 我哪有说谎\\n 是很感谢今晚的相伴\\n 但我竟然有些不习惯\\n 我没有说谎我何必说谎\\n 爱一个人没爱到难道就会怎么样\\n 别说我说谎\\n 人生已经如此的艰难\\n 有些事情就不要拆穿\\n 我没有说谎是爱情说谎\\n 它带你来骗我说\\n 渴望的有 可能有希望\\n 我没有说谎\\n 祝你做个幸福的新娘\\n 我的心事请你就遗忘","docid":"12084758858355992521","download_url":"http://soso.music.qq.com/fcgi-bin/fcg_download_lrc.q?song=说谎&singer=林宥嘉&down=1&songid=638596&docid=12084758858355992521","interval":266,"isonly":0,"lyric":" 我哪有<em>说谎<\/em>\\n 请别以为你有多难忘\\n 笑是真的不是我逞强\\n","media_mid":"000W95Fk3lAVxV","msgid":14,"nt":3842743252,"pay":{"payalbum":0,"payalbumprice":0,"paydownload":1,"payinfo":1,"payplay":0,"paytrackmouth":1,"paytrackprice":200},"preview":{"trybegin":73557,"tryend":104291,"trysize":0},"pubtime":1256832000,"pure":0,"singer":[{"id":11606,"mid":"001f0VyZ1hmWZ1","name":"林宥嘉","name_hilight":"林宥嘉"}],"size128":4264898,"size320":10652912,"sizeape":27291116,"sizeflac":28067207,"sizeogg":5800490,"songid":638596,"songmid":"000W95Fk3lAVxV","songname":"说谎","songname_hilight":"<em>说谎<\/em>","strMediaMid":"000W95Fk3lAVxV","stream":1,"switch":636675,"t":1,"tag":11,"type":0,"ver":0,"vid":""}],"totalnum":246},"priority":0,"qc":[],"tab":7,"taglist":[],"totaltime":0,"zhida":{"chinesesinger":0,"type":0}}
* message :
* notice :
* subcode : 0
* time : 1567575160
* tips :
*/
private int code;
private DataBean data;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public DataBean getData() {
return data;
}
public void setData(DataBean data) {
this.data = data;
}
public static class DataBean {
/**
* keyword :
* lyric : {"curnum":1,"curpage":1,"list":[{"albumid":54250,"albummid":"004YodY33zsWTT","albumname":"感官/世界","albumname_hilight":"感官/世界","alertid":23,"belongCD":0,"cdIdx":6,"chinesesinger":0,"content":"说谎 (거짓말) (《杜拉拉升职记》电视剧插曲|《针尖上的天使》电影主题曲) - 林宥嘉 (Yoga Lin)\\n 词:施人诚\\n 曲:李双飞\\n 是有过几个不错对象\\n 说起来并不寂寞孤单\\n 可能我浪荡让人家不安\\n 才会结果都阵亡\\n 我没有什么阴影魔障\\n 你千万不要放在心上\\n 我又不脆弱何况那算什么伤\\n 反正爱情不就都这样\\n 我没有说谎我何必说谎\\n 你懂我的我对你从来就不会假装\\n 我哪有说谎\\n 请别以为你有多难忘\\n 笑是真的不是我逞强\\n 我好久没来这间餐厅\\n 没想到已经换了装潢\\n 角落那窗口闻的到玫瑰花香\\n 被你一说是有些印象\\n 我没有说谎我何必说谎\\n 你知道的我缺点之一就是很健忘\\n 我哪有说谎\\n 是很感谢今晚的相伴\\n 但我竟然有些不习惯\\n 我没有说谎我何必说谎\\n 爱一个人没爱到难道就会怎么样\\n 别说我说谎\\n 人生已经如此的艰难\\n 有些事情就不要拆穿\\n 我没有说谎是爱情说谎\\n 它带你来骗我说\\n 渴望的有 可能有希望\\n 我没有说谎\\n 祝你做个幸福的新娘\\n 我的心事请你就遗忘","docid":"12084758858355992521","download_url":"http://soso.music.qq.com/fcgi-bin/fcg_download_lrc.q?song=说谎&singer=林宥嘉&down=1&songid=638596&docid=12084758858355992521","interval":266,"isonly":0,"lyric":" 我哪有<em>说谎<\/em>\\n 请别以为你有多难忘\\n 笑是真的不是我逞强\\n","media_mid":"000W95Fk3lAVxV","msgid":14,"nt":3842743252,"pay":{"payalbum":0,"payalbumprice":0,"paydownload":1,"payinfo":1,"payplay":0,"paytrackmouth":1,"paytrackprice":200},"preview":{"trybegin":73557,"tryend":104291,"trysize":0},"pubtime":1256832000,"pure":0,"singer":[{"id":11606,"mid":"001f0VyZ1hmWZ1","name":"林宥嘉","name_hilight":"林宥嘉"}],"size128":4264898,"size320":10652912,"sizeape":27291116,"sizeflac":28067207,"sizeogg":5800490,"songid":638596,"songmid":"000W95Fk3lAVxV","songname":"说谎","songname_hilight":"<em>说谎<\/em>","strMediaMid":"000W95Fk3lAVxV","stream":1,"switch":636675,"t":1,"tag":11,"type":0,"ver":0,"vid":""}],"totalnum":246}
* priority : 0
* qc : []
* tab : 7
* taglist : []
* totaltime : 0
* zhida : {"chinesesinger":0,"type":0}
*/
private LyricBean lyric;
public LyricBean getLyric() {
return lyric;
}
public void setLyric(LyricBean lyric) {
this.lyric = lyric;
}
public static class LyricBean {
/**
* curnum : 1
* curpage : 1
* list : [{"albumid":54250,"albummid":"004YodY33zsWTT","albumname":"感官/世界","albumname_hilight":"感官/世界","alertid":23,"belongCD":0,"cdIdx":6,"chinesesinger":0,"content":"说谎 (거짓말) (《杜拉拉升职记》电视剧插曲|《针尖上的天使》电影主题曲) - 林宥嘉 (Yoga Lin)\\n 词:施人诚\\n 曲:李双飞\\n 是有过几个不错对象\\n 说起来并不寂寞孤单\\n 可能我浪荡让人家不安\\n 才会结果都阵亡\\n 我没有什么阴影魔障\\n 你千万不要放在心上\\n 我又不脆弱何况那算什么伤\\n 反正爱情不就都这样\\n 我没有说谎我何必说谎\\n 你懂我的我对你从来就不会假装\\n 我哪有说谎\\n 请别以为你有多难忘\\n 笑是真的不是我逞强\\n 我好久没来这间餐厅\\n 没想到已经换了装潢\\n 角落那窗口闻的到玫瑰花香\\n 被你一说是有些印象\\n 我没有说谎我何必说谎\\n 你知道的我缺点之一就是很健忘\\n 我哪有说谎\\n 是很感谢今晚的相伴\\n 但我竟然有些不习惯\\n 我没有说谎我何必说谎\\n 爱一个人没爱到难道就会怎么样\\n 别说我说谎\\n 人生已经如此的艰难\\n 有些事情就不要拆穿\\n 我没有说谎是爱情说谎\\n 它带你来骗我说\\n 渴望的有 可能有希望\\n 我没有说谎\\n 祝你做个幸福的新娘\\n 我的心事请你就遗忘","docid":"12084758858355992521","download_url":"http://soso.music.qq.com/fcgi-bin/fcg_download_lrc.q?song=说谎&singer=林宥嘉&down=1&songid=638596&docid=12084758858355992521","interval":266,"isonly":0,"lyric":" 我哪有<em>说谎<\/em>\\n 请别以为你有多难忘\\n 笑是真的不是我逞强\\n","media_mid":"000W95Fk3lAVxV","msgid":14,"nt":3842743252,"pay":{"payalbum":0,"payalbumprice":0,"paydownload":1,"payinfo":1,"payplay":0,"paytrackmouth":1,"paytrackprice":200},"preview":{"trybegin":73557,"tryend":104291,"trysize":0},"pubtime":1256832000,"pure":0,"singer":[{"id":11606,"mid":"001f0VyZ1hmWZ1","name":"林宥嘉","name_hilight":"林宥嘉"}],"size128":4264898,"size320":10652912,"sizeape":27291116,"sizeflac":28067207,"sizeogg":5800490,"songid":638596,"songmid":"000W95Fk3lAVxV","songname":"说谎","songname_hilight":"<em>说谎<\/em>","strMediaMid":"000W95Fk3lAVxV","stream":1,"switch":636675,"t":1,"tag":11,"type":0,"ver":0,"vid":""}]
* totalnum : 246
*/
private int curnum;
private int curpage;
private int totalnum;
private List<ListBean> list;
public int getCurnum() {
return curnum;
}
public void setCurnum(int curnum) {
this.curnum = curnum;
}
public int getCurpage() {
return curpage;
}
public void setCurpage(int curpage) {
this.curpage = curpage;
}
public int getTotalnum() {
return totalnum;
}
public void setTotalnum(int totalnum) {
this.totalnum = totalnum;
}
public List<ListBean> getList() {
return list;
}
public void setList(List<ListBean> list) {
this.list = list;
}
public static class ListBean {
/**
* albumid : 54250
* albummid : 004YodY33zsWTT
* albumname : /
* albumname_hilight : /
* alertid : 23
* belongCD : 0
* cdIdx : 6
* chinesesinger : 0
* content : () (|使) - (Yoga Lin)\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 穿\n \n \n \n \n \n
* docid : 12084758858355992521
* download_url : http://soso.music.qq.com/fcgi-bin/fcg_download_lrc.q?song=说谎&singer=林宥嘉&down=1&songid=638596&docid=12084758858355992521
* interval : 266
* isonly : 0
* lyric : <em></em>\n \n \n
* media_mid : 000W95Fk3lAVxV
* msgid : 14
* nt : 3842743252
* pay : {"payalbum":0,"payalbumprice":0,"paydownload":1,"payinfo":1,"payplay":0,"paytrackmouth":1,"paytrackprice":200}
* preview : {"trybegin":73557,"tryend":104291,"trysize":0}
* pubtime : 1256832000
* pure : 0
* singer : [{"id":11606,"mid":"001f0VyZ1hmWZ1","name":"林宥嘉","name_hilight":"林宥嘉"}]
* size128 : 4264898
* size320 : 10652912
* sizeape : 27291116
* sizeflac : 28067207
* sizeogg : 5800490
* songid : 638596
* songmid : 000W95Fk3lAVxV
* songname :
* songname_hilight : <em></em>
* strMediaMid : 000W95Fk3lAVxV
* stream : 1
* switch : 636675
* t : 1
* tag : 11
* type : 0
* ver : 0
* vid :
*/
private int chinesesinger;
private String content;
private int interval;
private int pubtime;
private int sizeogg;
private int songid;
private String songmid;
private String songname;
@SerializedName("switch")
private int switchX;
private int t;
private int tag;
private int type;
private int ver;
private String vid;
private List<SingerBean> singer;
public int getChinesesinger() {
return chinesesinger;
}
public void setChinesesinger(int chinesesinger) {
this.chinesesinger = chinesesinger;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public int getInterval() {
return interval;
}
public void setInterval(int interval) {
this.interval = interval;
}
public int getPubtime() {
return pubtime;
}
public void setPubtime(int pubtime) {
this.pubtime = pubtime;
}
public int getSizeogg() {
return sizeogg;
}
public void setSizeogg(int sizeogg) {
this.sizeogg = sizeogg;
}
public int getSongid() {
return songid;
}
public void setSongid(int songid) {
this.songid = songid;
}
public String getSongmid() {
return songmid;
}
public void setSongmid(String songmid) {
this.songmid = songmid;
}
public String getSongname() {
return songname;
}
public void setSongname(String songname) {
this.songname = songname;
}
public int getSwitchX() {
return switchX;
}
public void setSwitchX(int switchX) {
this.switchX = switchX;
}
public int getT() {
return t;
}
public void setT(int t) {
this.t = t;
}
public int getTag() {
return tag;
}
public void setTag(int tag) {
this.tag = tag;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public int getVer() {
return ver;
}
public void setVer(int ver) {
this.ver = ver;
}
public String getVid() {
return vid;
}
public void setVid(String vid) {
this.vid = vid;
}
public List<SingerBean> getSinger() {
return singer;
}
public void setSinger(List<SingerBean> singer) {
this.singer = singer;
}
public static class SingerBean {
/**
* id : 11606
* mid : 001f0VyZ1hmWZ1
* name :
* name_hilight :
*/
private int id;
private String mid;
private String name;
private String name_hilight;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getMid() {
return mid;
}
public void setMid(String mid) {
this.mid = mid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getName_hilight() {
return name_hilight;
}
public void setName_hilight(String name_hilight) {
this.name_hilight = name_hilight;
}
}
}
}
}
}

@ -3,9 +3,11 @@ package com.example.musicplayer.model;
import com.example.musicplayer.entiy.Album;
import com.example.musicplayer.entiy.AlbumSong;
import com.example.musicplayer.entiy.LocalSong;
import com.example.musicplayer.entiy.OnlineSongLrc;
import com.example.musicplayer.entiy.SearchSong;
import com.example.musicplayer.entiy.SingerImg;
import com.example.musicplayer.entiy.Song;
import com.example.musicplayer.entiy.SongLrc;
import com.example.musicplayer.entiy.SongUrl;
import com.example.musicplayer.model.db.DbHelper;
import com.example.musicplayer.model.db.DbHelperImpl;
@ -49,13 +51,13 @@ public class DataModel implements NetworkHelper, DbHelper {
}
@Override
public Observable<SearchSong> search(String seek) {
return mNetworkHelper.search(seek);
public Observable<SongLrc> getLrc(String seek) {
return mNetworkHelper.getLrc(seek);
}
@Override
public Observable<String> getLrc(String id) {
return mNetworkHelper.getLrc(id);
public Observable<OnlineSongLrc> getOnlineSongLrc(String songId) {
return mNetworkHelper.getOnlineSongLrc(songId);
}
@Override

@ -2,8 +2,11 @@ package com.example.musicplayer.model.https;
import com.example.musicplayer.entiy.Album;
import com.example.musicplayer.entiy.AlbumSong;
import com.example.musicplayer.entiy.OnlineSong;
import com.example.musicplayer.entiy.OnlineSongLrc;
import com.example.musicplayer.entiy.SearchSong;
import com.example.musicplayer.entiy.SingerImg;
import com.example.musicplayer.entiy.SongLrc;
import com.example.musicplayer.entiy.SongUrl;
import io.reactivex.Observable;
@ -20,8 +23,8 @@ public interface NetworkHelper {
Observable<AlbumSong> getAlbumSong(String id); //得到专辑
Observable<SearchSong> search(String seek, int offset); //搜索歌曲
Observable<Album> searchAlbum(String seek,int offset);//搜索照片
Observable<SearchSong> search(String seek);//根据关键字搜索
Observable<String> getLrc(String id);//获取歌词
Observable<SongLrc> getLrc(String seek);//获取歌词
Observable<OnlineSongLrc> getOnlineSongLrc(String songId);//获取网络歌曲的歌词
Observable<SingerImg> getSingerImg(String singer);//获取歌手头像
Observable<SongUrl> getSongUrl(String data);//获取播放地址
}

@ -2,8 +2,11 @@ package com.example.musicplayer.model.https;
import com.example.musicplayer.entiy.Album;
import com.example.musicplayer.entiy.AlbumSong;
import com.example.musicplayer.entiy.OnlineSong;
import com.example.musicplayer.entiy.OnlineSongLrc;
import com.example.musicplayer.entiy.SearchSong;
import com.example.musicplayer.entiy.SingerImg;
import com.example.musicplayer.entiy.SongLrc;
import com.example.musicplayer.entiy.SongUrl;
import com.example.musicplayer.model.https.api.RetrofitService;
@ -40,13 +43,13 @@ public class NetworkHelperImpl implements NetworkHelper {
}
@Override
public Observable<SearchSong> search(String seek) {
return mRetrofitService.search(seek);
public Observable<SongLrc> getLrc(String seek) {
return mRetrofitService.getLrc(seek);
}
@Override
public Observable<String> getLrc(String id) {
return mRetrofitService.getLrc(id);
public Observable<OnlineSongLrc> getOnlineSongLrc(String songId) {
return mRetrofitService.getOnlineSongLrc(songId);
}
@Override

@ -24,6 +24,7 @@ public class RetrofitFactory {
private static Retrofit sRetrofit;
private static Retrofit songUrlRetrofit;
// 创建网络请求Observable
public static RetrofitService createRequest() {
return getRetrofit().create(RetrofitService.class);

@ -3,14 +3,17 @@ package com.example.musicplayer.model.https.api;
import com.example.musicplayer.app.Api;
import com.example.musicplayer.entiy.Album;
import com.example.musicplayer.entiy.AlbumSong;
import com.example.musicplayer.entiy.OnlineSongLrc;
import com.example.musicplayer.entiy.SearchSong;
import com.example.musicplayer.entiy.SingerImg;
import com.example.musicplayer.entiy.SongLrc;
import com.example.musicplayer.entiy.SongUrl;
import io.reactivex.Observable;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.Query;
@ -45,31 +48,31 @@ public interface RetrofitService {
Observable<AlbumSong> getAlbumSong(@Query("albummid")String id);
/**
*
* @param seek
* @return
* songmid{}
* 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%22 +
* songmid%22%3A%5B%22{003wFozn3V3Ra0} +
* %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%221443481947%22%2C%22format%22%3A%22json%22%2C%22ct%22%3A24%2C%22cv%22%3A0%7D%7D
*/
@GET(Api.SEARCH_SONG)
Observable<SearchSong> search(@Query("w") String seek);
@GET(Api.SONG_URL)
Observable<SongUrl> getSongUrl(@Query("data") String data);
/**
*
* @param id id
* @return
* songmidhttps://c.y.qq.com/lyric/fcgi-bin/fcg_query_lyric_new.fcg?songmid=000wocYU11tSzS&format=json&nobase64=1
* headersRefererqq
*/
@GET("lrc?")
Observable<String> getLrc(@Query("id") String id);
@Headers("Referer:https://y.qq.com/portal/player.html")
@GET(Api.ONLINE_SONG_LRC)
Observable<OnlineSongLrc> getOnlineSongLrc(@Query("songmid") String songId);
/**
* https://c.y.qq.com/soso/fcgi-bin/client_search_cp?p=1&n=1&w=说谎&format=json&t=7
* @param seek
*/
@GET(Api.SONG_LRC)
Observable<SongLrc> getLrc(@Query("w") String seek);
@POST("web?csrf_token=&type=100")
@FormUrlEncoded
Observable<SingerImg> getSingerImg(@Field("s")String singer);
/**
* songmid{}
* 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%22 +
* songmid%22%3A%5B%22{003wFozn3V3Ra0} +
* %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%221443481947%22%2C%22format%22%3A%22json%22%2C%22ct%22%3A24%2C%22cv%22%3A0%7D%7D
*/
@GET(Api.SONG_URL)
Observable<SongUrl> getSongUrl(@Query("data") String data);
}

@ -1,13 +1,17 @@
package com.example.musicplayer.presenter;
import com.example.musicplayer.app.Api;
import android.util.Log;
import com.example.musicplayer.app.Constant;
import com.example.musicplayer.base.observer.BaseObserver;
import com.example.musicplayer.base.presenter.BasePresenter;
import com.example.musicplayer.contract.IPlayContract;
import com.example.musicplayer.entiy.SearchSong;
import com.example.musicplayer.entiy.OnlineSong;
import com.example.musicplayer.entiy.OnlineSongLrc;
import com.example.musicplayer.entiy.SingerImg;
import com.example.musicplayer.entiy.Song;
import com.example.musicplayer.entiy.SongLrc;
import com.example.musicplayer.model.https.RetrofitFactory;
import java.util.List;
@ -31,48 +35,64 @@ public class PlayPresenter extends BasePresenter<IPlayContract.View> implements
.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.doOnNext(singerImg -> mView.setSingerImg(singerImg.getResult().getArtists().get(0).getImg1v1Url()))
.observeOn(Schedulers.io())
.flatMap((Function<SingerImg, ObservableSource<SearchSong>>) singerImg -> RetrofitFactory.createRequest().search(song))
.flatMap((Function<SingerImg, ObservableSource<SongLrc>>) singerImg -> RetrofitFactory.createRequest().getLrc(song))
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new BaseObserver<SearchSong>(mView) {
.subscribeWith(new BaseObserver<SongLrc>(mView) {
@Override
public void onNext(SearchSong value) {
public void onNext(SongLrc value) {
super.onNext(value);
if (value.getCode() == 200) {
getSongLrcSuccess(value.getData().getSong().getList(),duration);
getSongLrcSuccess(value.getData().getLyric().getList(),null,duration);
} else {
mView.showLrcMessage(null, null);
mView.showLrcMessage(null);
}
}
@Override
public void onError(Throwable e) {
super.onError(e);
mView.showLrcMessage(null,null);
mView.showLrcMessage(null);
}
})
);
}
@Override
public void getLrcUrl(String song, long duration) {
public void getLrc(String songName, String songId,long duration) {
addRxSubscribe(
mModel.search(song)
mModel.getLrc(songName)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new BaseObserver<SearchSong>(mView){
.subscribeWith(new BaseObserver<SongLrc>(mView){
@Override
public void onNext(SearchSong value) {
public void onNext(SongLrc value) {
super.onNext(value);
if (value.getCode() == 200) {
getSongLrcSuccess(value.getData().getSong().getList(),duration);
if (value.getCode() == 0) {
getSongLrcSuccess(value.getData().getLyric().getList(),songId,duration);
} else {
mView.showLrcMessage(null,null);
mView.showLrcMessage(null);
}
}
})
);
}
@Override
public void getSongOnlineLrc(String songId) {
mModel.getOnlineSongLrc(songId)
.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new BaseObserver<OnlineSongLrc>(mView,false,false){
@Override
public void onNext(OnlineSongLrc onlineSongLrc){
if(onlineSongLrc.getCode() == 0){
mView.showLrc(onlineSongLrc.getLyric());
}else {
mView.getLrcError();
}
}
});
}
@Override
public void queryLove(String songId) {
@ -94,16 +114,24 @@ public class PlayPresenter extends BasePresenter<IPlayContract.View> implements
}
private void getSongLrcSuccess(List<SearchSong.DataBean.SongBean.ListBean> dataBeans, long duration) {
private void getSongLrcSuccess(List<SongLrc.DataBean.LyricBean.ListBean> listBeans, String songId,long duration) {
boolean isLrc =false;
for(SearchSong.DataBean.SongBean.ListBean dataBean : dataBeans){
if(dataBean.getPubtime() == duration){
isLrc = true;
mView.showLrcMessage(Api.LRC_URL+dataBean.getSongmid(),dataBean.getSongmid());
break;
for(SongLrc.DataBean.LyricBean.ListBean listBean : listBeans){
if(null != songId){
if(listBean.getSongmid().equals(songId)){
isLrc = true;
mView.showLrcMessage(listBean.getContent());
break;
}
}else {
if(listBean.getInterval() == duration){
isLrc = true;
mView.showLrcMessage(listBean.getContent());
break;
}
}
}
if(!isLrc) mView.showLrcMessage(Api.LRC_URL+dataBeans.get(0).getSongmid(),
dataBeans.get(0).getSongmid());
if(!isLrc) mView.showLrcMessage(null);
}
}

@ -18,6 +18,7 @@ import android.os.IBinder;
import android.os.Message;
import android.support.annotation.Nullable;
import android.transition.Slide;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
@ -215,7 +216,7 @@ public class PlayActivity extends BaseMvpActivity<PlayPresenter> implements IPla
mCurrentTimeTv.setText(MediaUtil.formatTime(mSong.getCurrentTime()));
mSeekBar.setMax((int) mSong.getDuration());
mSeekBar.setProgress((int) mSong.getCurrentTime());
mDownLoadIv.setVisibility(mSong.isOnline()?View.VISIBLE:View.GONE); //下载按钮是否隐藏
mDownLoadIv.setVisibility(mSong.isOnline() ? View.VISIBLE : View.GONE); //下载按钮是否隐藏
}
@ -243,8 +244,6 @@ public class PlayActivity extends BaseMvpActivity<PlayPresenter> implements IPla
}
private void try2UpdateMusicPicBackground(final Bitmap bitmap) {
new Thread(new Runnable() {
@Override
@ -387,11 +386,11 @@ public class PlayActivity extends BaseMvpActivity<PlayPresenter> implements IPla
mDisc.setOnClickListener(v -> {
if (!isOnline) {
if (getLrcFromLocal().equals("")) {
mPresenter.getLrcUrl(getSongName(), mSong.getDuration());
mPresenter.getLrc(getSongName(), null, mSong.getDuration());
}
showLrc(getLrcFromLocal());
} else {
mPresenter.getLrcUrl(getSongName(), mSong.getDuration());
mPresenter.getSongOnlineLrc(mSong.getSongId());
}
}
);
@ -402,7 +401,7 @@ public class PlayActivity extends BaseMvpActivity<PlayPresenter> implements IPla
});
//歌曲下载
mDownLoadIv.setOnClickListener(v -> {
CommonUtil.showToast(this,"开始下载歌曲");
CommonUtil.showToast(this, "开始下载歌曲");
downLoad(mSong.getUrl(), mSong.getSongName());
});
@ -422,6 +421,7 @@ public class PlayActivity extends BaseMvpActivity<PlayPresenter> implements IPla
private String getSongName() {
Song song = FileHelper.getSong();
assert song != null;
return song.getSongName().trim();
}
@ -497,13 +497,17 @@ public class PlayActivity extends BaseMvpActivity<PlayPresenter> implements IPla
}
@Override
public void showLrcMessage(String lrc, String id) {
public void showLrcMessage(String lrc) {
if (lrc == null) {
CommonUtil.showToast(PlayActivity.this, getString(R.string.get_lrc_fail));
mLrc = null;
} else {
mLrc = lrc;
saveLrcToLocal();
if (isOnline) {
showLrc(lrc);
} else {
mLrc = lrc;
saveLrcToLocal();
}
}
}
@ -520,11 +524,11 @@ public class PlayActivity extends BaseMvpActivity<PlayPresenter> implements IPla
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onSongChanageEvent(SongStatusEvent event){
if(event.getSongStatus() == Constant.SONG_CHANGE){
public void onSongChanageEvent(SongStatusEvent event) {
if (event.getSongStatus() == Constant.SONG_CHANGE) {
mDisc.setVisibility(View.VISIBLE);
mLrcView.setVisibility(View.GONE);
Song mSong = FileHelper.getSong();
mSong = FileHelper.getSong();
mSongTv.setText(mSong.getSongName());
mSingerTv.setText(mSong.getSinger());
mDurationTimeTv.setText(MediaUtil.formatTime(mSong.getDuration()));
@ -671,16 +675,20 @@ public class PlayActivity extends BaseMvpActivity<PlayPresenter> implements IPla
*
* @param lrc
*/
private void showLrc(final String lrc) {
runOnUiThread(()->{
mDisc.setVisibility(View.GONE);
mLrcView.setVisibility(View.VISIBLE);
mLrcView.setLrc(lrc);
mLrcView.setHighLineColor(getResources().getColor(R.color.musicStyle));
mLrcView.setPlayer(mPlayStatusBinder.getMediaPlayer());
mLrcView.init();
});
@Override
public void showLrc(final String lrc) {
mDisc.setVisibility(View.GONE);
mLrcView.setVisibility(View.VISIBLE);
mLrcView.setLrc(lrc);
mLrcView.setHighLineColor(getResources().getColor(R.color.musicStyle));
mLrcView.setPlayer(mPlayStatusBinder.getMediaPlayer());
mLrcView.init();
}
@Override
public void getLrcError() {
showToast(getString(R.string.get_lrc_fail));
}
private void downLoad(String url, String song) {
@ -695,21 +703,21 @@ public class PlayActivity extends BaseMvpActivity<PlayPresenter> implements IPla
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(url).build();
Response response = client.newCall(request).execute();
if (response.isSuccessful()){
if (response.isSuccessful()) {
out = new BufferedOutputStream(new FileOutputStream(songFile));
byte[] bytes = response.body().bytes();
out.write(bytes,0,bytes.length);
out.write(bytes, 0, bytes.length);
out.close();
}
showLoadSuccess();
} catch (IOException e){
} catch (IOException e) {
e.printStackTrace();
}catch (Exception e) {
} catch (Exception e) {
e.printStackTrace();
}finally {
try{
if(out != null) out.close();
}catch (Exception e){
} finally {
try {
if (out != null) out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@ -717,16 +725,14 @@ public class PlayActivity extends BaseMvpActivity<PlayPresenter> implements IPla
}
private void showLoadSuccess(){
runOnUiThread(()->{
CommonUtil.showToast(this,"歌曲下载成功");
private void showLoadSuccess() {
runOnUiThread(() -> {
CommonUtil.showToast(this, "歌曲下载成功");
});
}
@Override
public void onDestroy() {
super.onDestroy();

Loading…
Cancel
Save