点歌功能再次优化

This commit is contained in:
liuwei
2026-01-26 14:38:13 +08:00
parent ec7d93aa4a
commit 512b94150d
2 changed files with 178 additions and 44 deletions

143
test/music.py Normal file
View File

@@ -0,0 +1,143 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
网易云音乐点歌工具 - 字段提取版
功能:搜索歌曲 → 获取第一首 → 调用 /Song_V1 → 提取点歌所需字段
"""
import requests
import json
from urllib.parse import unquote
BASE_URL = "http://192.168.2.170:5000"
def search_and_extract_song(keyword: str = "学不会", level: str = "standard"):
"""
完整流程:
1. 调用 /Search 搜索歌曲
2. 取第一首歌曲
3. 调用 /Song_V1 获取播放链接等详情
4. 提取你需要的字段
返回示例:
{
"song_name": "学不会",
"singer_name": "林俊杰",
"play_url": "http://m802.music.126.net/...",
"pic_url": "https://p2.music.126.net/...jpg",
"data_url": "http://m802.music.126.net/...", # 与 play_url 相同
"lyric": "...",
"song_id": "108134",
"album_name": "学不会"
}
"""
try:
# Step 1: 搜索歌曲
search_url = f"{BASE_URL}/Search"
params = {"keywords": keyword}
resp = requests.get(search_url, params=params, timeout=10)
resp.raise_for_status()
search_data = resp.json()
if not search_data.get("success") or search_data.get("status") != 200:
return {"error": f"搜索失败: {search_data.get('message')}"}
songs = search_data.get("data", [])
if not songs:
return {"error": "没有找到相关歌曲"}
first_song = songs[0]
song_id = str(first_song.get("id", ""))
# Step 2: 获取歌曲详细信息(关键)
detail_url = f"{BASE_URL}/Song_V1"
detail_params = {
"url": song_id,
"level": level, # standard / exhigh / lossless
"type": "json"
}
detail_resp = requests.get(detail_url, params=detail_params, timeout=15)
detail_resp.raise_for_status()
detail_data = detail_resp.json()
if not detail_data.get("success") or detail_data.get("status") != 200:
return {"error": f"获取歌曲详情失败: {detail_data.get('message')}"}
song_info = detail_data.get("data", {})
# Step 3: 提取你需要的字段
result = {
"song_name": song_info.get("name", first_song.get("name", "")),
"singer_name": song_info.get("ar_name", first_song.get("artist_string", first_song.get("artists", ""))),
"play_url": song_info.get("url", ""),
"pic_url": song_info.get("pic", first_song.get("picUrl", "")),
"data_url": song_info.get("url", ""), # 你要求与 play_url 相同
"lyric": song_info.get("lyric", ""),
"song_id": song_info.get("id", song_id),
"album_name": song_info.get("al_name", first_song.get("album", "")),
"size": song_info.get("size", "")
}
# 清理空值
for key in list(result.keys()):
if result[key] == "":
del result[key]
return result
except requests.exceptions.RequestException as e:
return {"error": f"网络请求失败: {str(e)}"}
except Exception as e:
return {"error": f"未知错误: {str(e)}"}
def print_song_info(result):
"""美化打印结果"""
if "error" in result:
print(f"{result['error']}")
return
print("\n" + "=" * 60)
print("🎵 点歌信息提取成功")
print("=" * 60)
print(f"歌曲名称 : {result.get('song_name', '未知')}")
print(f"演唱歌手 : {result.get('singer_name', '未知')}")
print(f"专辑名称 : {result.get('album_name', '未知')}")
print(f"歌曲ID : {result.get('song_id', '未知')}")
if result.get("size"):
print(f"文件大小 : {result.get('size')}")
print(f"\n▶️ 播放地址 (play_url):")
print(result.get("play_url", ""))
print(f"\n🖼️ 封面图片 (pic_url):")
print(result.get("pic_url", ""))
print(f"\n📁 数据地址 (data_url):")
print(result.get("data_url", ""))
if result.get("lyric"):
print(f"\n📝 歌词长度: {len(result['lyric'])} 字符")
print("歌词预览:")
print(result['lyric'][:300] + "..." if len(result['lyric']) > 300 else result['lyric'])
# ====================== 主函数 ======================
if __name__ == "__main__":
print("网易云音乐点歌字段提取工具")
print("输入歌曲名称(回车使用默认“学不会”):")
keyword = input().strip()
if not keyword:
keyword = "学不会"
print(f"\n正在搜索: {keyword} ...\n")
result = search_and_extract_song(keyword=keyword, level="standard")
print_song_info(result)
# 如果你想直接得到字典用于你的点歌工具
# print("\n返回给点歌工具的字典")
# print(json.dumps(result, ensure_ascii=False, indent=2))