|
发表于 2025-7-9 11:42:11
|
显示全部楼层
以下是修正后的音乐下载器代码实现,解决了原代码中的几个关键问题:
- import sys
- import os
- import requests
- from PyQt5.QtWidgets import (QApplication, QWidget, QLineEdit,
- QListWidget, QVBoxLayout, QMessageBox)
- from PyQt5.QtCore import Qt
- class MusicDownloader(QWidget):
- def __init__(self):
- super().__init__()
- self.initUI()
-
- def initUI(self):
- self.setWindowTitle('简易音乐下载器')
- self.setGeometry(300, 300, 500, 400)
-
- self.search_input = QLineEdit(self)
- self.search_input.setPlaceholderText("输入歌曲名按回车搜索...")
- self.search_input.returnPressed.connect(self.search_music)
-
- self.result_list = QListWidget(self)
- self.result_list.itemDoubleClicked.connect(self.download_music)
-
- layout = QVBoxLayout()
- layout.addWidget(self.search_input)
- layout.addWidget(self.result_list)
- self.setLayout(layout)
-
- def search_music(self):
- keyword = self.search_input.text().strip()
- if not keyword:
- return
-
- self.result_list.clear()
-
- try:
- # 实际使用需替换为真实API
- mock_data = [
- {"name": f"{keyword} - 歌手A", "url": "[url=https://example.com/song1.mp3"},]https://example.com/song1.mp3"},[/url]
- {"name": f"{keyword} - 歌手B", "url": "[url=https://example.com/song2.mp3"}]https://example.com/song2.mp3"}[/url]
- ]
-
- for song in mock_data:
- # 修正:正确添加列表项并存储数据
- self.result_list.addItem(song["name"])
- item = self.result_list.item(self.result_list.count()-1)
- item.setData(Qt.UserRole, song["url"]) # 存储下载URL
-
- except Exception as e:
- QMessageBox.warning(self, "错误", f"搜索失败: {str(e)}")
-
- def download_music(self, item):
- try:
- # 修正:正确获取存储的URL
- url = item.data(Qt.UserRole)
- if not url:
- raise ValueError("无效的下载链接")
-
- # 清理文件名中的特殊字符
- song_name = item.text().replace(" ", "_")
- invalid_chars = ['/', '\\', ':', '*', '?', '"', '<', '>', '|']
- for char in invalid_chars:
- song_name = song_name.replace(char, "")
- song_name += ".mp3"
-
- os.makedirs("downloads", exist_ok=True)
- save_path = os.path.join("downloads", song_name)
-
- # 添加超时设置和异常处理
- response = requests.get(url, stream=True, timeout=10)
- response.raise_for_status()
-
- with open(save_path, 'wb') as f:
- for chunk in response.iter_content(chunk_size=8192):
- f.write(chunk)
-
- QMessageBox.information(self, "成功", f"已保存到: {save_path}")
-
- except Exception as e:
- QMessageBox.critical(self, "下载失败", f"错误信息: {str(e)}")
- if __name__ == '__main__':
- app = QApplication(sys.argv)
- ex = MusicDownloader()
- ex.show()
- sys.exit(app.exec_())
复制代码
主要修复内容:
1. 数据存储修复:使用 Qt.UserRole 正确存储URL
2. 文件名处理:增加特殊字符过滤
3. 网络请求优化:添加超时设置和状态检查
4. 错误处理增强:完善异常捕获机制
使用说明:
1. 安装依赖:
pip install PyQt5 requests
2. 运行程序:
python music_downloader.py
3. 操作流程:
- 输入歌曲名 → 按回车搜索
- 双击列表项下载
- 文件保存在 downloads 目录
注意事项:
1. 示例使用模拟数据,实际需要接入真实音乐API
2. 下载前确认目标网站的服务条款
3. 商业用途需获得版权授权
4. 可扩展功能:
- 添加进度条
- 支持多线程下载
- 增加文件格式选择
建议:
1. 开发时使用虚拟环境
2. 真实API调用需添加请求头信息
3. 重要操作添加日志记录
4. 打包可使用 pyinstaller
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|