21 Commits

Author SHA1 Message Date
99857387dc feat(music): 新增聚合音乐搜索下载源
- 添加了酷狗音乐下载源
-修复了部分已知问题- 提升了音乐搜索的准确性和下载速度
-优化了用户界面的交互体验- 增强了对不同音频格式的支持
- 改进了错误处理机制,提高稳定性
2025-10-03 16:18:49 +08:00
d1aac65f25 chore(version): 更新版本信息至4.3.3
- 将版本号从4.3.2更新到4.3.3
- 更新了主程序更新包的下载链接
- 更新了完整安装包的下载链接至新版本
2025-10-03 16:18:38 +08:00
08da529d84 feat(NFLmusic): 添加聚合搜索功能支持- 新增 JUHE 搜索选项,支持通过聚合接口获取音乐数据
- 调整歌词下载逻辑以适配新接口返回结构
- 修改歌曲列表展示逻辑,兼容不同平台的数据字段
- 更新版本号至4.3.3
- 在搜索菜单中增加“聚合搜索”入口并映射为 JUHE 标识
2025-10-03 16:16:23 +08:00
a47c00e991 chore(env): 更新Python SDK配置
- 调整项目模块配置中的Python SDK引用名称
- 移除虚拟环境目录的重复排除配置
- 统一Python运行环境的命名规范
2025-10-03 16:16:13 +08:00
8aae403c86 chore(project): 更新项目JDK配置- 将项目JDK名称从"Python 3.6 (NFLmusic)"简化为"Python3.6"- 保持JDK类型为"Python SDK"不变
- 确保项目根管理器版本号仍为2
2025-10-03 16:16:00 +08:00
938f63a073 feat(config): 更新音乐源配置并调整默认选择
- 添加聚合音乐源及其默认音质配置
- 将默认音乐源从酷我调整为QQ音乐
- 更新音乐源配置结构以支持新选项
2025-10-03 16:15:52 +08:00
84ece943ee fix(KUGOU): 修复酷狗音乐搜索时的空格问题
- 在发送请求前,移除歌曲名称中的空格
- 提高了酷狗音乐搜索的准确性
2025-09-06 22:28:40 +08:00
5a6e7651ed fix(version_info): 更新 NFLmusic v4.3.2 版本下载链接
- 修改了版本信息文件中的下载链接地址
-从旧链接 http://pan.nanfengling.cn/f/pvdsV/NFLmusicv4.3.2.exe
- 更新为新链接 http://pan.nanfengling.cn/f/gj0UE/NFLmusicv4.3.2.exe
2025-09-06 22:28:32 +08:00
aa5c31c257 feat(NFLmusic): 添加酷狗音乐支持
- 新增酷狗音乐的歌曲搜索和播放功能- 更新音乐搜索逻辑,支持酷狗音乐的接口
- 优化歌曲信息获取,包括歌名、歌手和歌词
- 版本升级到 4.3.2
2025-09-06 21:30:53 +08:00
7e30ddb51a feat(version_info): 更新版本信息和功能
- 版本号从 v4.3.1 升级到 v4.3.2
- 发布日期从 2025.8.31 更新为 2025.9.6
- 新增酷狗音乐下载源,扩展了音乐下载的渠道
- 修复部分已知问题,提升软件稳定性
2025-09-06 21:30:39 +08:00
a7b76fb2fe feat(ifm_json): 添加酷狗音乐支持
- 在音质字典中添加酷狗音乐的音质选项
- 在音乐平台列表中增加酷狗音乐的 API地址和音质映射
2025-09-06 21:30:26 +08:00
a237e3d73d build: 更新版本信息和下载链接
- 版本号从4.3.1 修改为4.3.2
- 更新 NFLmusic 软件的下载链接
2025-09-06 21:30:15 +08:00
33fc1144f4 feat(version): 更新版本信息
- 新增 v4.3.1 版本
- 新增 QQ 音乐标准音质
- 修复部分已知问题
- 移除旧版本 v4.3.0 的更新日志
2025-08-31 14:18:05 +08:00
2b931f7012 feat(version): 更新版本信息
- 新增 v4.3.1 版本
- 新增 QQ 音乐标准音质
- 修复部分已知问题
- 移除旧版本 v4.3.0 的更新日志
2025-08-31 14:17:59 +08:00
1849a77190 chore(release): 更新版本信息至 4.3.1- 版本号从 4.3.0 修改为 4.3.1
- 更新 NFLmusic 应用程序的下载链接
2025-08-31 14:17:49 +08:00
c76ea6af80 feat(nflmusic): 更新音质选项并移除冗余音质描述
- 移除了 KUGOU、DOUYIN 和 XIAOFEN 的冗余音质描述
- 在 QQ 音乐中添加了"标准音质"选项
2025-08-31 14:10:33 +08:00
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
7 changed files with 69 additions and 93 deletions

2
.idea/NFLmusic.iml generated
View File

@ -5,7 +5,7 @@
<excludeFolder url="file://$MODULE_DIR$/.venv" /> <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" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
</component> </component>
</module> </module>

2
.idea/misc.xml generated
View File

@ -3,5 +3,5 @@
<component name="Black"> <component name="Black">
<option name="sdkName" value="Python 3.6 (NFLmusic)" /> <option name="sdkName" value="Python 3.6 (NFLmusic)" />
</component> </component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.6 (NFLmusic)" project-jdk-type="Python SDK" /> <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.6" project-jdk-type="Python SDK" />
</project> </project>

View File

@ -91,7 +91,6 @@ def detect_change():
jsondata["theme"] != tmla.get(la)[var1.get()] or jsondata["theme"] != tmla.get(la)[var1.get()] or
jsondata["path"] != var2.get() jsondata["path"] != var2.get()
): ):
changed = True changed = True
@ -143,7 +142,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:
@ -177,7 +176,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"]
@ -188,38 +187,29 @@ def download_music(song_name, choose):
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": elif choice == "KUGOU":
resp = requests.get(f"{url}?gm={song_name}&n={choose}&num=60&type=json&quality={br}") song_name = song_name.replace(" ", "")
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()["lyrics"] lrc = resp.json()["lyrics"]
except Exception as e: except Exception as e:
print(f"download_kugou_lrc: {e}") print(f"download_kg_lrc: {e}")
lrc = "" lrc = ""
music_name = resp.json()["title"] music_name = resp.json()["title"]
singer = resp.json()["singer"] singer = resp.json()["singer"]
music_url = resp.json()["music_url"] music_url = resp.json()["music_url"]
elif choice == "DOUYIN": elif choice == "JUHE":
resp = requests.get(f"{url}?msg={song_name}&n={choose}&num=50&type=json") song_name = song_name.replace(" ", "")
resp = requests.get(f"{url}?msg={song_name}&n={choose}&num=60&type=json&key=Dragon5B887C2DC41AD03C93F06BAF4B7888C3")
resp.close() resp.close()
try: try:
lrc = resp.json()["data"]["lrc"] lrc = resp.json()["data"]["lyric"]
except Exception as e: except Exception as e:
print(f"download_qishui_lrc: {e}") print(f"download_kg_lrc: {e}")
lrc = "" lrc = ""
music_name = resp.json()["data"]["title"] music_name = resp.json()["data"]["title"]
singer = resp.json()["data"]["singer"] singer = resp.json()["data"]["singer"]
music_url = resp.json()["data"]["url"] 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,46 +317,40 @@ 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&key=Dragon5B887C2DC41AD03C93F06BAF4B7888C3" 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": elif choice == "KUGOU":
url1 = f"{url}?gm={song_name}&num=60&type=json" url1 = f"{url}?msg={song_name.replace(' ', '')}&num=60&type=json&key=Dragon5B887C2DC41AD03C93F06BAF4B7888C3"
elif choice == "DOUYIN": elif choice == "JUHE":
url1 = f"{url}?msg={song_name}&num=50&type=json" url1 = f"{url}?msg={song_name.replace(' ', '')}&num=60&type=json&key=Dragon5B887C2DC41AD03C93F06BAF4B7888C3"
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()
resp.close() resp.close()
last_search_target = song_name last_search_target = song_name
for index in range(len(jsondata)): for index in range(len(jsondata["data"])):
if choice == "KUWO": if choice == "KUWO":
full_name = jsondata[index]["songname"] full_name = jsondata["data"][index]["songname"]
artist = jsondata[index]["singer"] artist = jsondata["data"][index]["singer"]
album = jsondata[index]["song_rid"] album = jsondata["data"][index]["song_rid"]
elif choice == "WANGYIYUN": elif choice == "WANGYIYUN":
full_name = jsondata[index]["title"] full_name = jsondata["data"][index]["title"]
artist = jsondata[index]["singer"] artist = jsondata["data"][index]["singer"]
album = jsondata[index]["songid"] album = jsondata["data"][index]["songid"]
elif choice == "QQ": elif choice == "QQ":
full_name = jsondata[index]["song_title"] full_name = jsondata["data"][index]["song_title"]
artist = jsondata[index]["song_singer"] artist = jsondata["data"][index]["song_singer"]
album = "" album = ""
elif choice == "KUGOU": elif choice == "KUGOU":
full_name = jsondata["data"][index]["title"]
artist = jsondata["data"][index]["singer"]
album = ""
elif choice == "JUHE":
full_name = jsondata[index]["title"] full_name = jsondata[index]["title"]
artist = jsondata[index]["singer"] artist = jsondata[index]["singer"]
album = "" album = jsondata[index]["app"]
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
@ -444,10 +428,11 @@ 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]]) del music_dir[listbox1.curselection()[0]]
listbox1.delete(listbox1.curselection()[0]) listbox1.delete(listbox1.curselection()[0])
except: except Exception as e:
print(e, type(e))
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_no_permission", )) message=lang.get(la, "mbox.text.delete_fail_no_permission", ))
except FileNotFoundError: except FileNotFoundError:
@ -511,9 +496,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
@ -596,9 +579,9 @@ def settings():
jsondata["br"][choice] = var.get() jsondata["br"][choice] = var.get()
jsondata["playing_mode"] = playingmode jsondata["playing_mode"] = playingmode
save_jsondata() save_jsondata()
tkinter.messagebox.showinfo(message=lang.get(la, "mbox.text.restart"), tkinter.messagebox.showinfo(message=lang.get(la, "mbox.text.restart"),
title=lang.get(la, "mbox.title.restart", )) title=lang.get(la, "mbox.title.restart", ))
restart0() restart0()
else: else:
page = will_page page = will_page
if page == "homepage": if page == "homepage":
@ -1331,7 +1314,7 @@ def search_local_song():
time.sleep(1) time.sleep(1)
version = "4.2.7" version = "4.3.3"
poem = "" poem = ""
appdata = os.getenv("APPDATA") appdata = os.getenv("APPDATA")
make_resource() make_resource()
@ -1693,11 +1676,10 @@ themeLabel.place(x=10, y=25)
# 基本设置 # 基本设置
repo_dict = { repo_dict = {
"酷我音乐": "KUWO", "酷我音乐": "KUWO",
"网易云音乐": "WANGYIYUN",
"QQ音乐": "QQ", "QQ音乐": "QQ",
"网易云音乐": "WANGYIYUN",
"酷狗音乐": "KUGOU", "酷狗音乐": "KUGOU",
"汽水音乐": "DOUYIN", "聚合搜索": "JUHE"
"小粉音乐": "XIAOFEN"
} }
repo_dict_reverse = {} repo_dict_reverse = {}
for repo in repo_dict: for repo in repo_dict:

View File

@ -5,39 +5,30 @@ usercache = {
"br": { "br": {
"QQ": "HQ高音质", "QQ": "HQ高音质",
"KUWO": "高品音质", "KUWO": "高品音质",
"KUGOU": "HQ高品音质",
"WANGYIYUN": "极高音质", "WANGYIYUN": "极高音质",
"DOUYIN": "HQ高音质", "KUGOU": "音质",
"XIAOFEN": "高品音质" "JUHE": "默认音质"
}, },
"choice": "KUWO", "choice": "QQ",
"auto_update": True, "auto_update": True,
"playing_mode": 0, "playing_mode": 0,
"auto_play": False "auto_play": False
} }
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,
"标准音质": 10
} }
], ],
"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",
{
"蝰蛇全景声": "viper_atmos",
"无损音质": "flac",
"HQ高品音质": 320,
"标准音质": 128
}
],
"WANGYIYUN": ["https://sdkapi.hhlqilongzhu.cn/api/dgMusic_wyy", "WANGYIYUN": ["https://sdkapi.hhlqilongzhu.cn/api/dgMusic_wyy",
{ {
"标准音质": 1, "标准音质": 1,
@ -49,17 +40,16 @@ api_data = {
"超清母带": 7 "超清母带": 7
} }
], ],
"DOUYIN": ["https://www.hhlqilongzhu.cn/api/dg_douyinmusic.php", "KUGOU": ["https://sdkapi.hhlqilongzhu.cn/api/dgMusic_kugou/",
{ {
"HQ高音质": 2, "音质": 1
} }
], ],
"XIAOFEN": ["https://www.hhlqilongzhu.cn/api/dg_mgmusic_24bit.php", "JUHE": ["https://sdkapi.hhlqilongzhu.cn/api/juhe_dgmusic/",
{ {
"无损音质": 1, "默认音质": 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.7 4.3.3
http://pan.nanfengling.cn/f/4Qc2/update.exe http://pan.nanfengling.cn/f/4Qc2/update.exe
http://pan.nanfengling.cn/f/MdkhO/NFLmusicv4.2.7.exe http://pan.nanfengling.cn/f/bBXfv/NFLmusicv4.3.3.exe

View File

@ -1,5 +1,5 @@
v4.2.7 - 2025.6.9 v4.3.3 - 2025.10.3
修复了网易云音乐下载源无法正常使用的问题 新增了聚合音乐搜索下载源
本产品是南凤科技旗下的音乐下载器 本产品是南凤科技旗下的音乐下载器
旨在提升用户体验, 旨在提升用户体验,