第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > 基于QT的网络音乐播放器(三)

基于QT的网络音乐播放器(三)

时间:2020-03-24 06:04:27

相关推荐

基于QT的网络音乐播放器(三)

前面说了把主界面的总体设计说了,接下来说一下调用API获取歌曲的url以及歌词等信息。首先我使用的是酷狗的API(调用其他音乐平台的API方法也基本都是差不多的),这个API呢也是我百度找到的。/song_search_v2?keyword=&page=&pagesize=&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_filter=0 其中keyword表示你要搜索的内容(可以是歌手名,也可以是歌曲名字),page表示页数(默认第一页),pagesize表示一页的歌曲数量(默认20首)。其他的就不重要了,也可以去百度了解下。

比如搜索“周杰伦”,在浏览器中输入:/song_search_v2?keyword=周杰伦&page=&pagesize=&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_filter=0 就可以得到返回回来的json数据。

通过解析这些json数据我们可以得到一些有用的信息。我用在线解析给大家看一下数据:

这些数据中代表的东西我就不一一说了,其中对我们有用的就是AlbumID和FileHash,因为接下来我们要通过这两个东西来搜索这首歌曲的信息。

得到AlbumID和FileHash后访问/yy/index.php?r=play/getdata&hash= &album_id= &_=1497972864535 其中hash后面跟的就是前面我们得到的FileHash,album_id后面就是跟我们前面得到的AlbumID。

比如周杰伦的告白气球。/yy/index.php?r=play/getdata&hash=5FCE4CBCB96D6025033BCE2025FC3943&album_id=1645030&_=1497972864535

我们同样得到返回的json数据,对它进行解析。

这样我们就得到了歌曲的url以及歌词等信息。

接下来看一下qt调用API的代码:

network_manager = new QNetworkAccessManager();network_request = new QNetworkRequest();//发送请求一得到AlbumID和FileHashnetwork_manager2 = new QNetworkAccessManager();network_request2 = new QNetworkRequest();//发送请求二得到url和歌词等信息connect(network_manager2, &QNetworkAccessManager::finished, this, &KuGou::replyFinished2);connect(network_manager, &QNetworkAccessManager::finished, this, &KuGou::replyFinished);

发送搜索的请求:

void KuGou::search(QString str){//发送歌曲搜索请求QString KGAPISTR1 = QString("/song_search_v2?keyword=""%1&page=&pagesize=&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_filter=0").arg(str);network_request->setUrl(QUrl(KGAPISTR1));network_manager->get(*network_request);}

得到返回的json信息,调用函数进行解析:

void KuGou::replyFinished(QNetworkReply *reply) //发送搜索请求完成,接受到信息,然后进行解析{//获取响应的信息,状态码为200表示正常QVariant status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);//无错误返回if(reply->error() == QNetworkReply::NoError){QByteArray bytes = reply->readAll(); //获取字节QString result(bytes); //转化为字符串parseJson_getAlbumID(result); //自定义方法,解析歌曲数据}else{//处理错误qDebug()<<"处理错误";}}void KuGou::replyFinished2(QNetworkReply *reply) //发送搜索请求完成,接受到信息,然后进行解析 通过歌曲ID搜索{//获取响应的信息,状态码为200表示正常QVariant status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);//无错误返回if(reply->error() == QNetworkReply::NoError){QByteArray bytes = reply->readAll(); //获取字节QString result(bytes); //转化为字符串parseJson_getplay_url(result); //自定义方法,解析歌曲数据}else{//处理错误qDebug()<<"处理错误";}}

解析返回来的json数据:

void KuGou::parseJson_getAlbumID(QString json)//解析接收到的歌曲信息,得到歌曲ID{QByteArray byte_array;QJsonParseError json_error;QJsonDocument parse_doucment = QJsonDocument::fromJson(byte_array.append(json), &json_error);if(json_error.error == QJsonParseError::NoError){if(parse_doucment.isObject()){QJsonObject rootObj = parse_doucment.object();if(rootObj.contains("data")){QJsonValue valuedata = rootObj.value("data");if(valuedata.isObject()){QJsonObject valuedataObject = valuedata.toObject();if(valuedataObject.contains("lists")){QJsonValue valueArray = valuedataObject.value("lists");if (valueArray.isArray()){QJsonArray array = valueArray.toArray();int size = array.size();for(int i = 0;i < size;i++){QJsonValue value = array.at(i);if(value.isObject()){QJsonObject object = value.toObject();if(object.contains("AlbumID")){QJsonValue AlbumID_value = object.take("AlbumID");if(AlbumID_value.isString()){album_idStr = AlbumID_value.toString(); //歌曲ID信息}}if(object.contains("FileHash")){QJsonValue FileHash_value = object.take("FileHash");if(FileHash_value.isString()){hashStr = FileHash_value.toString();//hash}}//通过歌曲ID发送请求,得到歌曲url和歌词QString KGAPISTR1 = QString("/yy/index.php?r=play/getdata&hash=%1&album_id=%2&_=1497972864535").arg(hashStr).arg(album_idStr);network_request2->setUrl(QUrl(KGAPISTR1));network_manager2->get(*network_request2);}}}}}}}}else{qDebug()<<json_error.errorString();}}void KuGou::parseJson_getplay_url(QString json) //解析得到歌曲{QByteArray byte_array;QJsonParseError json_error;QJsonDocument parse_doucment = QJsonDocument::fromJson(byte_array.append(json), &json_error);if(json_error.error == QJsonParseError::NoError){if(parse_doucment.isObject()){QJsonObject rootObj = parse_doucment.object();if(rootObj.contains("data")){QJsonValue valuedata = rootObj.value("data");if(valuedata.isObject()){QJsonObject valuedataObject = valuedata.toObject();QString play_urlStr("");if(valuedataObject.contains("play_url")){QJsonValue play_url_value = valuedataObject.take("play_url");if(play_url_value.isString()){play_urlStr = play_url_value.toString();//歌曲的urlif(play_urlStr!=""){emit mediaAdd(play_urlStr);}}}if(valuedataObject.contains("audio_name")){QJsonValue play_name_value = valuedataObject.take("audio_name");if(play_name_value.isString()){QString play_name = play_name_value.toString();//歌曲名字if(play_urlStr!=""){emit nameAdd(play_name);}}}if(valuedataObject.contains("lyrics")) //lrc{QJsonValue play_url_value = valuedataObject.take("lyrics");if(play_url_value.isString()){QString play_lrcStr = play_url_value.toString();if(play_urlStr!=""){if(play_lrcStr != ""){emit lrcAdd(play_lrcStr);}else{emit lrcAdd("没有歌词");}}}}}}}}}

基本上都是这些内容了,得到了歌曲的url以及lrc歌词的内容。

上一篇:界面的整体布局

下一篇:歌词显示

项目源码下载地址:/download/qq_37141865/10703635

github:/helloMrDjth/QtMusic

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。