QT实战项目 - 随意听音乐闹钟

目录

前言

一、随意听音乐闹钟是什么?

二、效果图

三、源码

1.下载歌曲

2.播放

四、源码地址


前言

办公室中午午休结束闹铃,每次都需要手动去选择一首喜欢的歌曲,然后点击播放,一首歌放完,再关闭播放器,十分麻烦。我希望有一款播放器能设定定时播放,播放内容就是一首随机歌曲,然后我查询市面主流播放器,都无此功能,即使有定时,也只支持播放指定的播放列表中文件,并且还不能限制仅播一首,为什么没有呢,难道我的需求很奇葩。。。

作为程序员的我,怎能忍受,说干就干。。。

一、随意听音乐闹钟是什么?

  1. 他是一个闹钟程序,目前仅做了PC版
  2. 这个闹钟到点后会去网上随机下载一首歌曲,然后播放,播放结束

二、效果图

QT实战项目 - 随意听音乐闹钟_第1张图片

使用方法:

  1. 启动软件,默认自动开机启动
  2. 直接修改你需要的闹钟时间
  3. 开始享受吧

三、源码

1.下载歌曲

去哪里下载歌曲,是本软件最大的难点,好人再这里,感谢UomgAPI提供API支持。

UomgAPI主页:https://api.uomg.com

网易云音乐随机歌曲下载API:https://api.uomg.com/doc-rand.music.html

有了API的加持,下载就很容易了,该软件默认获取网易云音乐热播榜歌曲

注意,在歌曲下载的时候,url被重定向了,我们需要手动处理下,篇幅有限,代码就只贴部分关键代码,下面会给源码地址,开源

bool RandomMusicClock::getMusic()
{
	QNetworkRequest request;
	request.setUrl(QUrl("http://api.uomg.com/api/rand.music?sort=热歌榜&format=json"));
	m_getMusicReply = m_pManager->get(request);
	connect(m_getMusicReply, SIGNAL(finished()), this, SLOT(sltHttpFinished())); 
	return true;
}



bool RandomMusicClock::startDownloadFile()
{
	QDir dir;
	dir.mkpath(m_strSaveDir);

	m_strFilePath = m_strSaveDir + "/" + m_strName + ".mp3";

	m_pFile = new QFile(m_strFilePath);
	if (!m_pFile->open(QIODevice::WriteOnly))
	{
		insertLog(QString("创建文件失败 %1").arg(m_strFilePath));
		delete m_pFile;
		m_pFile = NULL;
		return false;
	}

	m_url = QUrl::fromUserInput(m_strUrl);
	QNetworkRequest request;
	request.setUrl(m_url);
	m_downloadReply = m_pManager->get(request);
	connect(m_downloadReply, SIGNAL(finished()), this, SLOT(sltHttpFinished())); 
	connect(m_downloadReply, SIGNAL(readyRead()), this, SLOT(sltHttpReadyRead())); 
	connect(m_downloadReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(sltHttpError(QNetworkReply::NetworkError))); 
	//connect(m_downloadReply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(sltDownloadProgress(qint64, qint64))); 
	return true;
}


void RandomMusicClock::sltHttpFinished()
{
	QNetworkReply* reply = (QNetworkReply*)sender();
	if (reply == m_downloadReply)
	{
		if (m_pFile)
		{
			m_pFile->flush(); 
			m_pFile->close(); 
			delete m_pFile; 
			m_pFile = NULL; 
		}
		const QVariant redirectionTarget = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
		reply->deleteLater();
		reply = nullptr;

		if (!redirectionTarget.isNull()) 
		{
			const QUrl redirectedUrl = m_url.resolved(redirectionTarget.toUrl());
			QFile file(m_strFilePath);
			if (file.exists())
			{
				file.remove();
			}
			m_strUrl = redirectedUrl.toString();
			startDownloadFile();
			return;
		}
		else
		{
			playUrl(m_strFilePath);
		}
	}
	else if (reply == m_getMusicReply)
	{
		if (reply->error() == QNetworkReply::NoError)
		{
			QByteArray bytes = reply->readAll();
			reply->deleteLater();
			reply = nullptr;
			if (!parseMusic(bytes))
			{
				return;
			}
				insertLog("开始下载歌曲文件");
			if (!startDownloadFile())
			{
				return;
			}

		}
		else
		{
			reply->deleteLater();
			reply = nullptr;
			insertLog(QString("获取音乐信息失败,错误码:%1").arg((int)reply->error()));
			return;
		}
	}
	else
	{
		reply->deleteLater();
		reply = nullptr;
	}

}

void RandomMusicClock::sltHttpReadyRead()
{
	if (m_pFile)
	{
		m_pFile->write(m_downloadReply->readAll());
	}
}

 

2.播放

MP3文件播放就是有qt的QMediaPlayer即可。比较容易,qt的官方示例中也有比较完整的例子,我的播放代码基本都来源于qt官方示例。上代码,

void RandomMusicClock::playUrl(const QUrl &url)
{
	insertLog("播放歌曲");
	ui.toolButton_play->setEnabled(true);
	if (url.isLocalFile()) {
		const QString filePath = url.toLocalFile();
		ui.label_info->setText(QDir::toNativeSeparators(filePath));
		m_strFileName = QFileInfo(filePath).fileName();
	} else {
		ui.label_info->setText(url.toString());
		m_strFileName.clear();
	}
	if (m_mediaPlayer.state() == QMediaPlayer::PlayingState)
		m_mediaPlayer.stop();
	m_mediaPlayer.setMedia(url);
	m_mediaPlayer.play();
}
 

四、源码地址

https://gitee.com/redchairman/random-music-clock.git

git里有windows安装包,可以直接下载安装使用

 

你可能感兴趣的:(QT开发,随意听,音乐,闹钟,QT)