15 Commits

Author SHA1 Message Date
43ad0fa955 playmusic: 添加播放音乐文件的功能
- 新增 test.py 文件- 实现了通过 os.startfile 方法播放指定音乐文件的功能
- 目前播放的音乐文件为 "国风堂#哦漏 - 知我.mp3"
2025-08-30 22:08:09 +08:00
9e424631a9 feat:移除部分音乐平台支持并优化现有功能
-移除了酷狗音乐、汽水音乐和小粉音乐的支持
- 优化了 Kuwo 和 QQ音乐的 API 调用,添加了 key 参数
-修复了删除歌曲时的错误处理,提高了程序的稳定性
- 更新了版本号至 4.3.0
2025-08-30 22:07:58 +08:00
ea0cc35f84 fix(version_info): 更新版本日志至 v4.3.0- 修复了 QQ 音乐和酷我音乐源无法使用的问题
- 移除了汽水音乐、小粉音乐和酷狗音乐源
- 修复了音乐删除时异常弹窗的问题
-修复了路径设置异常保存的问题- 修复了部分音质无法正常播放的问题
- 更新了版本号和发布日期
2025-08-30 22:07:48 +08:00
8fd22e05d2 refactor(ifm_json): 更新音乐平台 API 地址并移除部分平台配置
- 更新 QQ音乐和 KUWO 音乐的 API 地址
- 移除 KUGOU、DOUYIN 和 XIAOFEN音乐平台的配置
2025-08-30 22:07:35 +08:00
a59ea236d5 chore(version_info): 更新软件版本和下载链接
- 版本号从 4.2.7 升级到 4.3.0
- 更新了对应的软件下载链接
2025-08-30 22:07:27 +08:00
2ba7e62ef0 feat(WANGYIYUN): 添加音乐下载密钥并更新版本号
- 在请求网易云音乐时添加了特定的密钥参数
- 将软件版本号从 4.2.6 升级到 4.2.7
2025-06-09 15:41:35 +08:00
9985d44424 chore: 排除 venv 文件夹
- 在项目配置文件中添加 venv 文件夹为排除对象
- 保持 .venv 和 venv 两个虚拟环境文件夹都被排除
2025-06-09 15:41:24 +08:00
867a49b2a2 fix:修复网易云音乐下载源无法正常使用的问题
- 更新版本号至 v4.2.7
- 修改更新日期为 2025.6.9- 更新更新日志内容
2025-06-09 15:41:14 +08:00
19219015a6 refactor(ifm_json): 更新网易云音乐 API 地址
- 将旧的 API 地址 "https://www.hhlqilongzhu.cn/api/dg_wyymusic.php" 替换为新的 "https://sdkapi.hhlqilongzhu.cn/api/dgMusic_wyy"
-保留了原有的音质选项配置
2025-06-09 15:41:05 +08:00
09d10ea8c6 chore(version): 更新软件版本至4.2.7
-将版本号从4.2.6修改为4.2.7
- 更新了软件的下载链接地址
2025-06-09 15:40:52 +08:00
e841dcb2d0 fix(version_info): 更新 v3.6.2 版本下载链接和密码
- 更新 v3.6.2 版本的下载链接和提取密码
- 修复搜索函数搜索失败问题
-修复主题参数读取异常
- 优化搜索函数
2025-05-09 00:38:40 +08:00
3b8f1fcb5d ci: 更新版本列表中的下载链接和密码
- 更新 v3.6.1 版本的下载链接和密码
- 更新 v3.6.2 版本的下载链接和密码
2025-05-09 00:30:39 +08:00
d92cabc97d fix:修复删除音乐时异常弹窗的问题
- 更新版本号至 v4.2.6- 解决了用户在删除歌曲时出现的异常弹窗问题- 优化了删除操作的稳定性,提升了用户体验
2025-05-04 17:35:41 +08:00
648dd7e090 chore(version): 更新软件版本至4.2.6
-将版本号从4.2.5修改为4.2.6
- 更新NFLmusic安装包链接地址
2025-05-04 17:35:33 +08:00
9b9282b0c8 fix(NFLmusic): 修复删除歌曲时的 IndexError
- 修复了删除歌曲时可能出现的 IndexError异常
- 更新了列表框中歌曲的删除逻辑
-将软件版本号从 4.2.5 升级到4.2.6
2025-05-04 17:32:52 +08:00
7 changed files with 46 additions and 111 deletions

1
.idea/NFLmusic.iml generated
View File

@ -3,6 +3,7 @@
<component name="NewModuleRootManager"> <component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$"> <content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.venv" /> <excludeFolder url="file://$MODULE_DIR$/.venv" />
<excludeFolder url="file://$MODULE_DIR$/venv" />
</content> </content>
<orderEntry type="jdk" jdkName="Python 3.6 (NFLmusic)" jdkType="Python SDK" /> <orderEntry type="jdk" jdkName="Python 3.6 (NFLmusic)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />

View File

@ -143,7 +143,7 @@ def download_music(song_name, choose):
progressbar.place(x=10, y=300) progressbar.place(x=10, y=300)
br = br_dict[var.get()] br = br_dict[var.get()]
if choice == "KUWO": if choice == "KUWO":
resp = requests.get(f"{url}?msg={song_name}&n={choose}&br={br}&num=60&type=json") resp = requests.get(f"{url}?msg={song_name}&n={choose}&br={br}&num=60&type=json&key=Dragon5B887C2DC41AD03C93F06BAF4B7888C3")
resp.close() resp.close()
id = resp.json()["link"].rsplit("/", 1)[1] id = resp.json()["link"].rsplit("/", 1)[1]
try: try:
@ -163,7 +163,7 @@ def download_music(song_name, choose):
singer = resp.json()["song_singer"] singer = resp.json()["song_singer"]
music_url = resp.json()["flac_url"] music_url = resp.json()["flac_url"]
elif choice == "WANGYIYUN": elif choice == "WANGYIYUN":
resp = requests.get(f"{url}?gm={song_name}&n={choose}&br={br}&num=60&type=json") resp = requests.get(f"{url}?gm={song_name}&n={choose}&br={br}&num=60&type=json&key=Dragon5B887C2DC41AD03C93F06BAF4B7888C3")
resp.close() resp.close()
id = resp.json()["link"].rsplit("=", 1)[1] id = resp.json()["link"].rsplit("=", 1)[1]
try: try:
@ -177,7 +177,7 @@ def download_music(song_name, choose):
singer = resp.json()["singer"] singer = resp.json()["singer"]
music_url = resp.json()["music_url"] music_url = resp.json()["music_url"]
elif choice == "QQ": elif choice == "QQ":
resp = requests.get(f"{url}?msg={song_name}&n={choose}&num=60&type=json&br={br}") resp = requests.get(f"{url}?msg={song_name}&n={choose}&num=60&type=json&br={br}&key=Dragon5B887C2DC41AD03C93F06BAF4B7888C3")
resp.close() resp.close()
try: try:
lrc = resp.json()["data"]["lyric"] lrc = resp.json()["data"]["lyric"]
@ -187,39 +187,6 @@ def download_music(song_name, choose):
music_name = resp.json()["data"]["song_name"] music_name = resp.json()["data"]["song_name"]
singer = resp.json()["data"]["song_singer"] singer = resp.json()["data"]["song_singer"]
music_url = resp.json()["data"]["music_url"] music_url = resp.json()["data"]["music_url"]
elif choice == "KUGOU":
resp = requests.get(f"{url}?gm={song_name}&n={choose}&num=60&type=json&quality={br}")
resp.close()
try:
lrc = resp.json()["lyrics"]
except Exception as e:
print(f"download_kugou_lrc: {e}")
lrc = ""
music_name = resp.json()["title"]
singer = resp.json()["singer"]
music_url = resp.json()["music_url"]
elif choice == "DOUYIN":
resp = requests.get(f"{url}?msg={song_name}&n={choose}&num=50&type=json")
resp.close()
try:
lrc = resp.json()["data"]["lrc"]
except Exception as e:
print(f"download_qishui_lrc: {e}")
lrc = ""
music_name = resp.json()["data"]["title"]
singer = resp.json()["data"]["singer"]
music_url = resp.json()["data"]["url"]
elif choice == "XIAOFEN":
resp = requests.get(f"{url}?msg={song_name}&n={choose}&num=60&type=json&br={br}")
resp.close()
try:
lrc = resp.json()["lrc"]
except Exception as e:
print(f"download_xiaofen_lrc: {e}")
lrc = ""
music_name = resp.json()["title"]
singer = resp.json()["singer"]
music_url = resp.json()["music_url"]
else: else:
lrc = "" lrc = ""
lrc = lrc.replace("\\n", "\n") lrc = lrc.replace("\\n", "\n")
@ -327,17 +294,11 @@ def get_data_without_blocking(song_name):
button0["state"] = "disabled" button0["state"] = "disabled"
songlist.delete(*songlist.get_children()) songlist.delete(*songlist.get_children())
if choice == "KUWO": if choice == "KUWO":
url1 = f"{url}?msg={song_name}&num=60&type=json" url1 = f"{url}?msg={song_name}&num=60&type=json&key=Dragon5B887C2DC41AD03C93F06BAF4B7888C3"
elif choice == "WANGYIYUN": elif choice == "WANGYIYUN":
url1 = f"{url}?gm={song_name}&num=60&type=json" url1 = f"{url}?gm={song_name}&num=60&type=json&key=Dragon5B887C2DC41AD03C93F06BAF4B7888C3"
elif choice == "QQ": elif choice == "QQ":
url1 = f"{url}?msg={song_name}&num=60&type=json" url1 = f"{url}?msg={song_name}&num=60&type=json&key=Dragon5B887C2DC41AD03C93F06BAF4B7888C3"
elif choice == "KUGOU":
url1 = f"{url}?gm={song_name}&num=60&type=json"
elif choice == "DOUYIN":
url1 = f"{url}?msg={song_name}&num=50&type=json"
elif choice == "XIAOFEN":
url1 = f"{url}?msg={song_name}&num=60&type=json"
resp = requests.get(url1) resp = requests.get(url1)
jsondata = resp.json()["data"] jsondata = resp.json()["data"]
resp.close() resp.close()
@ -355,18 +316,6 @@ def get_data_without_blocking(song_name):
full_name = jsondata[index]["song_title"] full_name = jsondata[index]["song_title"]
artist = jsondata[index]["song_singer"] artist = jsondata[index]["song_singer"]
album = "" album = ""
elif choice == "KUGOU":
full_name = jsondata[index]["title"]
artist = jsondata[index]["singer"]
album = ""
elif choice == "DOUYIN":
full_name = jsondata[index]["title"]
artist = jsondata[index]["singer"]
album = ""
elif choice == "XIAOFEN":
full_name = jsondata[index]["title"]
artist = jsondata[index]["singer"]
album = ""
songlist.insert("", "end", values=(full_name, artist, album)) songlist.insert("", "end", values=(full_name, artist, album))
except requests.exceptions.JSONDecodeError: except requests.exceptions.JSONDecodeError:
resp_text = resp.text resp_text = resp.text
@ -430,26 +379,27 @@ def delete():
os.remove(abs_path_lrc) os.remove(abs_path_lrc)
except: except:
pass pass
music_dir_without_endswith.remove(filtered_list[listbox1.curselection()[0]]) music_dir_without_endswith.remove(listbox1.get(0, END)[listbox1.curselection()[0]])
music_dir.remove(music_dir[listbox1.curselection()[0]]) music_dir.remove(music_dir[listbox1.curselection()[0]])
listbox1.delete(listbox1.curselection()[0]) listbox1.delete(listbox1.curselection()[0])
except IndexError: except IndexError:
tkinter.messagebox.showwarning(title=lang.get(la, "mbox.title.delete_fail"), tkinter.messagebox.showwarning(title=lang.get(la, "mbox.title.delete_fail"),
message=lang.get(la, "mbox.text.delete_fail_no_target", )) message=lang.get(la, "mbox.text.delete_fail_no_target", ))
except PermissionError: except PermissionError:
try: # try:
stopmusic() stopmusic()
os.remove(abs_path) os.remove(abs_path)
try: try:
os.remove(abs_path_lrc) os.remove(abs_path_lrc)
except: except:
pass pass
music_dir_without_endswith.remove(filtered_list[listbox1.curselection()[0]]) music_dir_without_endswith.remove(listbox1.get(0, END)[listbox1.curselection()[0]])
music_dir.remove(music_dir[listbox1.curselection()[0]]) del music_dir[listbox1.curselection()[0]]
listbox1.delete(listbox1.curselection()[0]) listbox1.delete(listbox1.curselection()[0])
except: # except Exception as e:
tkinter.messagebox.showerror(title=lang.get(la, "mbox.title.delete_fail"), # print(e, type(e))
message=lang.get(la, "mbox.text.delete_fail_no_permission", )) # tkinter.messagebox.showerror(title=lang.get(la, "mbox.title.delete_fail"),
# message=lang.get(la, "mbox.text.delete_fail_no_permission", ))
except FileNotFoundError: except FileNotFoundError:
tkinter.messagebox.showerror(title=lang.get(la, "mbox.title.delete_fail"), tkinter.messagebox.showerror(title=lang.get(la, "mbox.title.delete_fail"),
message=lang.get(la, "mbox.text.delete_fail_not_found", )) message=lang.get(la, "mbox.text.delete_fail_not_found", ))
@ -511,9 +461,7 @@ def playmusic(music_path):
try: try:
music_player.play_music(music_path) music_player.play_music(music_path)
except pygame.error: except pygame.error:
tkinter.messagebox.showerror(title=lang.get(la, "mbox.title.play_fail"), os.startfile(music_path)
message=lang.get(la, "mbox.text.play_fail_unrecognized_format",
{"_file_": music_name}))
except: except:
pass pass
@ -1331,7 +1279,7 @@ def search_local_song():
time.sleep(1) time.sleep(1)
version = "4.2.5" version = "4.3.0"
poem = "" poem = ""
appdata = os.getenv("APPDATA") appdata = os.getenv("APPDATA")
make_resource() make_resource()
@ -1695,9 +1643,6 @@ repo_dict = {
"酷我音乐": "KUWO", "酷我音乐": "KUWO",
"网易云音乐": "WANGYIYUN", "网易云音乐": "WANGYIYUN",
"QQ音乐": "QQ", "QQ音乐": "QQ",
"酷狗音乐": "KUGOU",
"汽水音乐": "DOUYIN",
"小粉音乐": "XIAOFEN"
} }
repo_dict_reverse = {} repo_dict_reverse = {}
for repo in repo_dict: for repo in repo_dict:

View File

@ -17,28 +17,19 @@ usercache = {
} }
api_data = { api_data = {
"QQ": ["https://www.hhlqilongzhu.cn/api/dg_QQmusicflac.php", "QQ": ["https://sdkapi.hhlqilongzhu.cn/api/QQmusic/",
{ {
"臻品母带": 10,
"SQ无损": 1, "SQ无损": 1,
"HQ高音质": 2 "HQ高音质": 2
} }
], ],
"KUWO": ["https://www.hhlqilongzhu.cn/api/dg_kuwomusic.php", "KUWO": ["https://sdkapi.hhlqilongzhu.cn/api/dgMusic_kuwo/",
{ {
"无损音质": 1, "无损音质": 1,
"高品音质": 2, "高品音质": 2
} }
], ],
"KUGOU": ["https://www.hhlqilongzhu.cn/api/dg_kgmusic.php", "WANGYIYUN": ["https://sdkapi.hhlqilongzhu.cn/api/dgMusic_wyy",
{
"蝰蛇全景声": "viper_atmos",
"无损音质": "flac",
"HQ高品音质": 320,
"标准音质": 128
}
],
"WANGYIYUN": ["https://www.hhlqilongzhu.cn/api/dg_wyymusic.php",
{ {
"标准音质": 1, "标准音质": 1,
"极高音质": 2, "极高音质": 2,
@ -49,17 +40,6 @@ api_data = {
"超清母带": 7 "超清母带": 7
} }
], ],
"DOUYIN": ["https://www.hhlqilongzhu.cn/api/dg_douyinmusic.php",
{
"HQ高音质": 2,
}
],
"XIAOFEN": ["https://www.hhlqilongzhu.cn/api/dg_mgmusic_24bit.php",
{
"无损音质": 1,
"高品音质": 2,
}
],
} }

4
test.py Normal file
View File

@ -0,0 +1,4 @@
import os
audio_file = "C:/Users/Administrator/Music/国风堂#哦漏 - 知我.mp3"
os.startfile(audio_file)

View File

@ -1,3 +1,3 @@
4.2.5 4.3.0
http://pan.nanfengling.cn/f/4Qc2/update.exe http://pan.nanfengling.cn/f/4Qc2/update.exe
http://pan.nanfengling.cn/f/lWPTv/NFLmusicv4.2.5.exe http://pan.nanfengling.cn/f/3mDtN/NFLmusicv4.3.0.exe

View File

@ -1,5 +1,10 @@
v4.2.5 - 2025.5.4 v4.3.0 - 2025.8.30
修复了用户删除歌曲后频繁刷新的问题 修复了QQ音乐酷我音乐源无法使用的问题
移除汽水音乐,小粉音乐,酷狗音乐源
修复了音乐删除时异常弹窗的问题
修复了路径设置异常保存的问题
修复了部分音质无法正常播放的问题
(其实就是换成系统关联播放器而已 (ˉ▽ˉ;)...)
本产品是南凤科技旗下的音乐下载器 本产品是南凤科技旗下的音乐下载器
旨在提升用户体验, 旨在提升用户体验,

View File

@ -18,16 +18,16 @@
{ {
"version": "v3.6.1", "version": "v3.6.1",
"upload_time": "2024年3月1日", "upload_time": "2024年3月1日",
"url": "https://wwo.lanzout.com/iHciX21mccmh", "url": "https://wwtx.lanzoup.com/iclud2vq9y2f",
"password": "chai", "password": "eeof",
"log": "整合了下载源\n优化了数据格式", "log": "整合了下载源\n优化了数据格式",
"brief": "2条优化" "brief": "2条优化"
}, },
{ {
"version": "v3.6.2", "version": "v3.6.2",
"upload_time": "2024年3月15日", "upload_time": "2024年3月15日",
"url": "https://wwo.lanzout.com/i1byb21mcdfg", "url": "https://wwtx.lanzoup.com/itI4r2vqa5mh",
"password": "2dqj", "password": "ey80",
"log": "修复了搜索函数搜索失败问题\n修复了主题参数读取异常\n优化了搜索函数", "log": "修复了搜索函数搜索失败问题\n修复了主题参数读取异常\n优化了搜索函数",
"brief": "2条修复,1条优化" "brief": "2条修复,1条优化"
}, },