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

2019-07-13 09:22发布

前面说了把主界面的总体设计说了,接下来说一下调用API获取歌曲的url以及歌词等信息。首先我使用的是酷狗的API(调用其他音乐平台的API方法也基本都是差不多的),这个API呢也是我百度找到的。http://songsearch.kugou.com/song_search_v2?keyword=&page=&pagesize=&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_filter=0 其中keyword表示你要搜索的内容(可以是歌手名,也可以是歌曲名字),page表示页数(默认第一页),pagesize表示一页的歌曲数量(默认20首)。其他的就不重要了,也可以去百度了解下。
比如搜索“周杰伦”,在浏览器中输入:http://songsearch.kugou.com/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后访问http://www.kugou.com/yy/index.php?r=play/getdata&hash= &album_id= &_=1497972864535 其中hash后面跟的就是前面我们得到的FileHash,album_id后面就是跟我们前面得到的AlbumID。 比如周杰伦的告白气球。http://www.kugou.com/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和FileHash network_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("http://songsearch.kugou.com/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("http://www.kugou.com/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()< 基本上都是这些内容了,得到了歌曲的url以及lrc歌词的内容。 上一篇:界面的整体布局
下一篇:歌词显示
项目源码下载地址:https://download.csdn.net/download/qq_37141865/10703635