1. 程式人生 > >基於QT的網路音樂播放器(三)

基於QT的網路音樂播放器(三)

得到AlbumID和FileHash後訪問http://www.kugou.com/yy/index.php?r=play/getdata&hash= &album_id= &_=1497972864535 其中hash後面跟的就是前面我們得到的FileHash,album_id後面就是跟我們前面得到的AlbumID。

    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歌詞的內容。

上一篇:介面的整體佈局 下一篇:歌詞顯示