QT在线音乐播放器
先上几张音乐播放器的图片
(主页图片来源网络)
具体实现及部分代码
搜索歌曲和获取歌曲具体信息的URL,这里说明一点,酷狗音乐现在的反爬虫机制,我们在发送HTTP请求时,需要携带COOKIE才能请求成功,否则会返回 {“status”:0,“err_code”:20010,“data”:[]}的错误请求, 所以这里的COOKIE需要替换成自己浏览器里边的COOKIE
#define COOKIE "填写自己浏览器的COOKIE"
#define PLAYURL "https://wwwapi.kugou.com/yy/index.php?r=play/getdata&hash=%1&album_id=%2"
//如果你的QT没有添加ssl你可以把https改为http,或者百度QT怎么post请求https
#define SEARCHURL "http://songsearch.kugou.com/song_search_v2?keyword=%1&page=%2&pagesize=10"
请求歌曲的FileHash及AlbumID函数,此函数与QPushButton类的点击信号关联
// 请求歌曲filehash及AlbumID
void Widget::on_search_btn_clicked()
{
ui->detail_widget->setCurrentIndex(2);
page = 1;
request->setUrl(QString(search_url).arg(ui->search_edit->text()).arg(page));
// qDebug() << QString(search_url).arg(ui->search_edit->text());
manager->get(*request);
}
请求歌曲filehash及AlbumID的处理函数,此函数与QNetworkAccessManager类的finished信号关联
//当我们把歌曲filehash及id请求回来的同时,我们发起第二次请求--歌曲具体信息请求,此请求会返回歌曲的具体信息(timelength,filesize,img,author_name,song_name等)
void Widget::httpReply(QNetworkReply *reply)
{
QByteArray byte_arr = reply->readAll();
if (!byte_arr.isEmpty())
{
QJsonDocument document = QJsonDocument::fromJson(byte_arr);
QJsonObject json_obj = document.object();
QJsonObject json_obj_data = json_obj.value("data").toObject();
if (!json_obj_data.isEmpty())
{
page_size = json_obj_data.value("pagesize").toInt();
qDebug() << "pagesize" << page_size;
QJsonArray music_list_json = json_obj_data.value("lists").toArray();
if (!music_list_json.isEmpty())
{
for (int i = 0; i < 10; i++)
{
if (music_info[i] == NULL)
{
break;
}
QJsonObject music_name_obj = music_list_json[i].toObject();
music_info[i]->hash = music_name_obj.value("FileHash").toString();
music_info[i]->album_id = music_name_obj.value("AlbumID").toString();
request_music->setUrl(QString(play_url).arg(music_info[i]->hash).arg(music_info[i]->album_id));
request_music->setRawHeader("Cookie", COOKIE);
request_music->setRawHeader("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
manager_music->get(*request_music);
qDebug() << QString(play_url).arg(music_info[i]->hash).arg(music_info[i]->album_id);
}
}
}
}
}
请求歌曲具体信息处理函数
//这里根据自己的需求选择需要保存的内容,这一步会返回歌词,但我选择不保存歌词,因为太浪费内存,后面需要显示歌词的时候再单独请求
void Widget::httpReplyMusicInfo(QNetworkReply *reply)
{
QByteArray byte_arr = reply->readAll();
if (!byte_arr.isEmpty())
{
QJsonDocument document = QJsonDocument::fromJson(byte_arr);
QJsonObject json_obj = document.object();
QJsonObject json_obj_data = json_obj.value("data").toObject();
if (!json_obj_data.isEmpty())
{
int i = 0;
QString hash = json_obj_data.value("hash").toString();
QString id = json_obj_data.value("album_id").toString();
for (i = 0; i < 10; i++)
{
if (hash == music_info[i]->hash && id ==music_info[i]->album_id)
break;
}
if (i == 10)
{
for(int i = 0; i < 10; i++)
{
if (music_item[i] != NULL)
{
delete music_item[i];
music_item[i] = NULL;
}
}
qDebug() << "没有获取到音乐";
return ;
}
music_info[i]->time_length = json_obj_data.value("timelength").toInt();
music_info[i]->file_size = json_obj_data.value("filesize").toInt();
music_info[i]->img_url = json_obj_data.value("img").toString();
music_info[i]->have_mv = json_obj_data.value("have_mv").toInt();
music_info[i]->author_name = json_obj_data.value("author_name").toString();
music_info[i]->song_name = json_obj_data.value("song_name").toString();
music_info[i]->play_url = json_obj_data.value("play_url").toString();
music_info[i]->album_name = json_obj_data.value("album_name").toString();
if (music_item[i] == NULL)
{
music_item[i] = new MyItem(ui->listWidget);
QSize size = music_item[i]->music_item->sizeHint();
music_item[i]->music_item->setSizeHint(QSize(size.width(), 56));
ui->listWidget->addItem(music_item[i]->music_item);
music_item[i]->music_widget->setSizeIncrement(QSize(size.width(), 56));
connect(music_item[i]->paly_btn, SIGNAL(clicked(bool)), this, SLOT(palyBtn()));
connect(music_item[i]->add_btn, SIGNAL(clicked(bool)), this, SLOT(addBtn()));
}
QString null_str;
null_str.clear();
for(int j = 0; j <= i; j++)
null_str += " ";
music_item[i]->paly_btn->setText(null_str);
music_item[i]->add_btn->setText(null_str);
emit requestFinshed(i);
}
}
}
请求网络图片处理函数
//将我们歌曲对应的图片显示到主页下方播放栏和歌词页面
void Widget::httpReplyImg(QNetworkReply *reply)
{
if (reply->error() == QNetworkReply::NoError)
{
QByteArray bytes = reply->readAll();
pm = new QPixmap;
pm->loadFromData(bytes);
QRect rc = ui->label->rect();
QPixmap pm1 = pm->scaled(rc.size(), Qt::KeepAspectRatio);
QRect rc1 = music_img->rect();
QPixmap pm2 = pm->scaled(rc1.size(), Qt::KeepAspectRatio);
// ui->label->setAutoFillBackground(true);
ui->label->setPixmap(pm1);
music_img->setPixmap(pm2);
}
else
{
//出错
}
}
后面还有好多就不一一例举了
对于歌词显示用的是QT的正则匹配,有需要的可以下载参考https://download.youkuaiyun.com/download/LinkerJon/11971061