# offline_music_player **Repository Path**: wu-binlong/offline_music_player ## Basic Information - **Project Name**: offline_music_player - **Description**: 该仓库是离线音乐播放器,基于用户协同过滤算法(用户播放记录行为)和Pyq5进行开发的应用软件,本系统就有完整的基础功能,并具有Mysql数据库存放数据。 - **Primary Language**: Python - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 8 - **Forks**: 1 - **Created**: 2023-01-02 - **Last Updated**: 2025-02-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # offline_music_player ## 介绍 ​ 信息泛滥的大数据时代,侧面表明了人们的快速增长的个人需求,单一的娱乐方式已经无法满足大部分的需求,而且无用的信息导致人们获取需求的信息效率低。推荐技术就是在这种矛盾下的产物,而推荐技术能够根据用户己有的收听或观看历史,再将其信息与互联网上的海量用户关联,通过相似性比对为用户主动推荐音乐、电影等信息,从而解决了人们在“不明确其所求”情况下的诸多困扰。对于国内,大家也是能常常看到“**猜你喜欢**”、“**为你推荐**”等等,都是推荐技术参与的一部分。 ​ 系统采用的是Python语言进行开发,建立在PyQt5库上的一款基于用户协同过滤算的离线音乐播放器软件,系统内拥有用户管理页面,基础音乐播放系统(上下切换、暂停和拖动播放进度条),还有一个自动识别歌曲上传到数据库的功能与两个推荐页面,在系统之上还建立一个MySql数据库,以便存放用户信息和歌曲信息。本系统还有较大的扩展空间,现在的UI交互界面可能无法满足以后的功能需求,为此我将UI交互界面也上传到里面中,你可以为这个系统设计一个更加完美的离线音乐播放器,当然我也会更新这个离线播放器的其他功能。 ![QQ推荐](./document_image/QQ推荐.png) ![网易推荐](./document_image/网易推荐.png) ## 包含功能 1. 用户登录与用户注册和个人信息的修改; 2. 歌曲/歌名搜索功能; 3. 用户播放记录推荐歌曲和前10首热门音乐播放推荐; 4. 基于Eyed3库的音乐识别歌曲上传; 5. 歌曲收藏与歌曲播放记录; 6. 歌曲暂停、播放、上下切换和拖拽播放进度条。 ## 相关技术 ### PyQt5 ​ PyQt5是Qt框架的Python语言实现,由Riverbank Computing开发,是最强大的GUI库之一。PyQt5则是基于高性能的Qt的GUI控件集,能够跨平台运行在Linux、Window和Mac OS系统上、使用信号槽机制进行通信、对Qt库进行完全封装、可以使用成熟的IDEA进行界面设计,并自动生成可执行的Python代码、提供一整套种类齐全的窗口控件等。 ### EyeD3 ​ EyeD3是一个Python库,用于增加、删除、修改mp3文件中ID3[元数据](https://so.csdn.net/so/search?q=元数据&spm=1001.2101.3001.7020)(即歌曲信息)。它提供了一个[命令行](https://so.csdn.net/so/search?q=命令行&spm=1001.2101.3001.7020)工具(EyeD3)和一个Python库(import EyeD3),可以用来编写自己的应用程序或可从命令行工具调用的插件。 ### 协同过滤算法 ​ 协同过滤推荐算法核心目标是预测并针对性推荐。算法基于分析用户的音乐播放数据、收藏数据,分析用户的个人兴趣基因,从而将用户按照分析结果分成不同的集合,然后将目标用户没有听说过的物品推荐给目标用户。协同过滤算法根据目标主体的不同分成两种,一种是基于用户进行推荐,另一种则是基于物品进行推荐。 ![协同过滤算法](./document_image/协同过滤算法.png) ## 系统功能分布(UI界面架构) ![框架](./document_image/框架.png) 左上位置为**个人信息页面**,当你点进去的会显示你当前的用户名和用户密码,点击对应的文本框会触发提示,你可以输入新的账号与密码,还有一个个人介绍,当你会实现多线程的时候,你会发现这个系统更加有趣。 左上中位置为**歌曲搜索栏**,为优化更好的体验感,你可以点击右边搜索按钮或者点击回车键,显然向文本框加回车触发事件可以大大增加你的调试和体验,搜索栏主要因素是SQL语句,一条like语句的使用,可以大大增加对信息的检索。 左边是**工具栏**,它包含热门音乐、我的收藏、猜你喜欢、播放记录和分享音乐,这个我想我不用一一解释,热门音乐和猜你喜欢是两个推荐模块,一个是利用music_record表进行统计出前10条记录,当然我也想到你的初始化后是没有这个排行榜得,为此我会生成一些假得数据去模拟出真实得排行榜;猜你喜欢就是本次系统得主要核心了,它是计算用户播放记录进行推荐,用户协同算法我会在介绍。如果你不想使用用户播放记录,那你可修改recommend.py文件,这个文件主要是做推荐内容得。分享音乐是使用Eyed3库识别歌曲,加载出tag对象,tag对象会存放歌曲得歌名、时长和歌手。 中间区域是**全部歌曲信息显示页面**,即所有页面显示得窗口。 右下位置是**播放组件**,播放一首歌曲是会显示对应得歌手、歌名和时长上去,其次你可以点击对应按钮切换歌曲。 ## 环境需求 当你想运行整个程序时,那你应该先准备一个Python=3.6.x版本的环境,你可以有两个方式创建这个环境 1. 你可以登录[Python官方网站](https://python.org),从中寻找一个python版本号为3.6的任意一个版本,然后实现本地安装。 2. 你可以在Anaconda软件下,创建一个Python为3.6.x的虚拟环境。【你应该在Anaconda Prompt (Anaconda)控制台中输入下面命令】。 ```conda conda create -n 环境名称 python=3.6 ``` 最终你会获得本次运行下的Python环境。 3. 本次项目使用MySQL作为存储系统,当你没有存在MySQL数据库时,你可以按照下面方式进行安装 ![mysql安装1](./document_image/mysql安装1.png) ![mysql安装2](./document_image/mysql安装2.png) 4. 由于文件内容有限,你需要访问[MySQL安装步骤](https://blog.csdn.net/weixin_52203618/article/details/123882689),完成安装。 5. 当你已经安装完成MySQL数据库,并存在一个超级用户,你需要先创建一个comics数据库,才能使用数据库读取数据,存储数据,你只需对‘database_tool/storage_resources.py’进行你修改,将数据库信息修改成你本地数据库信息; ```python self.connect = pymysql.connect(host='localhost', user='root', password='root', charset='utf8', database='comics') ``` 4. 由于文件内容有限,我将使用以链接方式教你安装MySQL,你可以访问[MySQL安装步骤](https://blog.csdn.net/weixin_52203618/article/details/123882689),完成安装。 5. 当你已经安装完成MySQL数据库,并存在一个超级用户,你需要先创建一个keyboard_shortcuts数据库(由名字不是重要,想必你也明白,当然我会想你提供修改方法,你可以看最后一步),你可以用MySQL数据库自带的终端工具或其他关系型数据库可视化工具创建,那我会提供第一种方法。 6. 使用Win+R键,打开电脑的CMD终端,你应该输入这串命令启动MySQL服务。 ```cmd net start mysql ``` 5. 其次你应该输入这串命令之后,输入你对应的密码 ``` mysql -u root -p ``` 6. 当你下载完,你需要找到music_database.sql,这个文件是创建本系统的数据库和表,最后,你再MySQL shell输入这串命令执行sql文件(你应该注意路径)。 ```mysql source music_database.sql ``` 7. keyboard_shortcuts数据库存储用户和歌曲的两种信息数据,你需要将connect_database/music_tools.py和connect_database/user_tools.py的数据库连接MySQL信息进行修改。本系统的数据库你就拥有了。 ```python self.connect = pymysql.connect(host='localhost', # 本地数据库 port=3306, # 端口 user='root', # 用户名 password='root', # 密码 db='keyboard_shortcuts', # 数据库名称 charset='utf8', # 编码方式,不是主要,可忽略 cursorclass=pymysql.cursors.DictCursor) # 服务器名,不是主要,可忽略 ``` ##### 数据库名修改 你应该打开**music_database.sql**,我相信电脑的**记事本**可以解决这个问题,你需要找到所有的keyboard_shortcuts关键字进行替换成你喜欢的名字,其次你还需去修改我们对应的py文件,这样可以保证不会出错,就在上面一步。 ## 包的依赖 环境的搭建仅仅时第一步,你应该在这个环境下安装以下的第三方库 ```requirements.txt pymysql==1.0.2 pyqt5==5.15.2 eyed3==0.9.6 scipy==1.9.0 pandas==1.4.3 numpy==1.22.4 ``` 如果你想让更快运行到本次项目,那你应该临时使用清华的镜像源,使用方法如下: ```pip pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package ``` ## 表的设计 1. keyboard_shortcuts数据库有四个表,四个表存在一个主键或多个外键,这是保证数据一致性和完整性。首先是我们的**music_info表**,该表是存放音乐信息,包括音乐名字、文件路径、音乐标签、作者、时长、专辑封面和播放时长,我用的仅仅只有音乐名字、文件路径、作者和时长,剩下的属性留给你创新。 ```mysql music_id int primary key auto_increment, music_name varchar(50) audio_path varchar(255) music_label varchar(10) singer varchar(50) introduce varchar(255) picture blob music_duration int ``` 2. 其次是我们的**user_info表**,这表是存放用户所有信息,它的属性有用户名、密码和权限,由于我的开发时间有限,权限无法加到该系统,让这个系统更完美一点。 ```mysql user_id int primary key auto_increment user_name varchar(50) pass_word varchar(10) role int default 0 ``` 3. 还有**music_record表**,该表主要是存放所有用户播放音乐的信息,这也是我们做音乐推荐系统主要读取的表,它包含音乐id、用户id、音乐标签和听歌时长,由于推荐的算法数据是单个播放每一个音乐次数,你可以使用音乐标签和时长来做出不一样的推荐内容。、 ```mysql id int primary key auto_increment user_id int not null music_id int not null music_label varchar(10) listening_time int ``` 4. 最后是我们的**user_collections表**,它是存放所有用户收藏的歌曲信息,它的属性有音乐id、用户id和是否收藏,最后一个属性我并没有使用,我想这个属性能使用上去,可以大大减少我们对数据库的访问和歌曲收藏的唯一性,当然我想到另一个简单的方法,想保证收藏歌曲的唯一性,可以先查询一次,是否存放来判断唯一性。 ```mysql id int primary key auto_increment music_id int not null user_id int not null is_collections varchar(10) ``` ## 如何使用 我想你如果有认真读完上面的内容并完成操作,而不是下载完急忙的运行我的代码,你应该可以减少一定的麻烦。 1. 你应该现在项目根目录下创建audio文件夹存放你的音频,为了更好的显示系统,每一个mp3文件的命名应该为**歌名\_歌名\_音乐标签.mp3**,例如LOVEADE_VIVIZ_流行.mp3。 2. 当你准备好数据下,需要找到connect_database/music_tools.py,运行**load_music()**方法,加载所有音乐数据并将数据导入数据库中。 ![数据](./document_image/数据.png) 3. 最后你可以运行login.py文件,登录成功,你会看到一下画面。 ![界面](./document_image/界面.png)