目录

前言

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

二、效果图

三、源码

1.下载歌曲

2.播放

四、源码地址


前言

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

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

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

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

二、效果图

使用方法:

  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实战项目 - 随意听音乐闹钟相关推荐

  1. 迅为-i.MX6ULL开发板-QT实战项目DHT11网络编程实战练习(一)

    迅为-i.MX6ULL开发板-QT实战项目DHT11&网络编程实战练习(一) 发布时间:2021-7-2 09:49    发布者:落风 |编辑 文章目录1 项目前准备2 软件流程图3 Lin ...

  2. Qt实战项目:高精度表达式计算器Qt

    高精度表达式计算器Qt 表达式计算器是一个由C++ with QT编写的应用程序.这个计算器旨在通过引入表达式计算的概念解决Windows默认计算器显示不直观的问题,提供了普通型计算器.科学型计算器的 ...

  3. Qt实战项目学习2———学生管理系统(1)

    注:参照编程小鱼酱教程 特别感谢博主教学 一.登陆界面设计及主界面设计 1.登录按钮实现 登陆界面自定义信号  并发射信号 signals://成功登录发送信号void sendLoginSucces ...

  4. Vue3+node.js网易云音乐实战项目(五)

    推荐歌单详细页面顶部 1.推荐歌单详细页面 1.1.导航条和背景 1.2.头像和简介 1.3.头部完整代码 1.4.链接 实现效果 1.推荐歌单详细页面 1.1.导航条和背景 推荐歌单页面做好后,我们 ...

  5. Vue3+node.js网易云音乐实战项目(三)

    页面 一.头部导航栏布局 二.轮播图的实现 三.请求网易的banner图 四 链接 一.头部导航栏布局 首先我们看最上面这里的布局,大致可分为三个模块,顶部左边,顶部中间,顶部右边 那么我们在comp ...

  6. 【Qt实战派学习群】 建立啦!

    建了一个Qt学习群,供大家交流学习. 群文件提供博客源码免费下载! 还有大量Qt实战项目源码.程序员工具.电子书等学习资料! 群号码:1149411109 (若满加2群:917341904) 群名称: ...

  7. 练手项目|Node.js实战——轻松实现听歌识曲

    黑马程序员视频库 播妞QQ号:3077485083 传智播客旗下互联网资讯.学习资源免费分享平台 前端作为当下非常火的职业之一,播妞身边有很多小伙伴在学习前端,但是大部分人在自学过程中十分盲目,不知道 ...

  8. Vue3+node.js网易云音乐实战项目(七)

    底部播放按钮和播放功能的实现 1.底部播放组件 2.音乐播放与暂停 3.切换歌曲 其他页面可以看我页面专栏 Vue3实战项目-网易云APP . 大家觉得有些地方可以写的更好写法可以给我留言私信,我会去 ...

  9. python 播放本地音乐_实战项目—python实现本地音乐播放器

    随着网络的发展,我们已经很少将音乐下载到本地,而是直接在线听歌,方便而又直接.也许你用的音乐播放器是这个 也许是这个 这都不是重点,今天我们要用python自己打造一款音乐播放器. 具体思路 使用py ...

最新文章

  1. python免费试听-哈尔滨Python人工智能课程免费试听
  2. 手把手教你自己写一个js表单验证框架
  3. 在虚拟机上为红帽7Linux设置中文输入法
  4. kswapd0 挖矿_bioset linux_linux bioset 进程 腾讯云
  5. Photoshop的绘图工具
  6. java jps都卡死,java长时间运行后,jps失效
  7. HDU 折线分割平面
  8. UVA10465 Homer Simpson【递推】
  9. 20200608每日一句
  10. idea64.exe.vmoptions 参数意义
  11. 阿里巴巴矢量图标库的引入——symbol类型的使用——阿里图标组件封装
  12. 比较好的论坛(个人认为)
  13. go 对象json转map
  14. 米家扫地机器人充满电需要多长时间_【米家智能扫地机器人使用总结】APP|充电|电量|滚刷|厚度_摘要频道_什么值得买...
  15. Android电子白板
  16. 【时间序列】ICDE 2021丨时间序列相关研究论文汇总
  17. 伤寒杂病论.辨太阳病脉证并治(中)
  18. 粒子群优化算法和python代码_Python编程实现粒子群算法(PSO)详解
  19. 经典算法:二叉树的建立
  20. 无基础怎么学习java虚拟机,0基础学习Java ——Java 虚拟机结构(上)

热门文章

  1. 狼组CTF web-baby.php
  2. 安装Win7+Ubuntu双系统
  3. 有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛...
  4. 比科奇在MWC 23上为全球市场带来高性能低功耗的商用5G小基站和最新技术方案
  5. 治疗鼻炎最好的偏方大全 还怕鼻炎治不好?
  6. Virtualenv or Anaconda?Python虚拟环境最佳实践
  7. threshold计算机英语,计算机专业英语
  8. 标日初级下 第25课 笔记
  9. Realtek HD Audio Driver, Error Code:0xE0000100
  10. 【ML学习笔记】17:多元正态分布下极大似然估计最小错误率贝叶斯决策