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

前面说了把主界面的总体设计说了,接下来说一下调用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()<<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();                    //歌曲的url

                            if(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歌词的内容。

上一篇:界面的整体布局
下一篇:歌词显示
项目源码下载地址:https://download.csdn.net/download/qq_37141865/10703635

猜你喜欢

转载自blog.csdn.net/qq_37141865/article/details/82951998