feat: 新增杜比全景声支持,重构Cookie管理与项目配置

- 添加前端页面的杜比全景声音质选择选项,更新后端音质参数验证列表
- 适配杜比全景声的编码格式,将dolby音质的encodeType设为mp4
- 重构Cookie管理模块:移除独立的cookie_manager.py,将Cookie读写、解析逻辑迁移至music_api.py,简化qr_login工具实现
- 更新Dockerfile,添加ffmpeg依赖以支持音频转码处理
- 更新requirements.txt依赖配置
- 更新使用文档,调整项目文件结构说明
- 优化项目依赖,移除冗余的cookie_manager模块依赖
This commit is contained in:
Suxiaoqinx
2026-06-21 04:03:28 +08:00
parent 682200c705
commit 3b3383cde5
10 changed files with 823 additions and 1128 deletions
+53 -2
View File
@@ -10,6 +10,7 @@
"""
import json
import os
import urllib.parse
import time
from random import randrange
@@ -177,10 +178,10 @@ class NeteaseAPI:
payload = {
'ids': [song_id],
'level': quality,
'encodeType': 'flac',
'encodeType': 'mp4' if quality == 'dolby' else 'flac',
'header': json.dumps(config),
}
if quality == 'sky':
payload['immerseType'] = 'c51'
@@ -661,6 +662,56 @@ def qr_login() -> Optional[str]:
return manager.qr_login()
# ============ Cookie 工具 ============
DEFAULT_COOKIE_FILE = "cookie.txt"
def load_cookies(path: str = DEFAULT_COOKIE_FILE) -> Dict[str, str]:
"""从 cookie.txt 直接读取并解析为 dict
支持标准 ``NMTID=xxx; _ntes_nnid=xxx; ...`` 格式。
文件不存在或解析失败返回空 dict(不抛异常,调用方决定如何处理)。
"""
if not os.path.isfile(path):
return {}
try:
with open(path, "r", encoding="utf-8") as f:
content = f.read().strip()
except OSError:
return {}
return parse_cookie_string(content)
def parse_cookie_string(cookie_string: str) -> Dict[str, str]:
"""把 ``k1=v1; k2=v2`` 格式字符串解析为 dict
支持 ``;`` 或 ``\\n`` 作为分隔符。
"""
cookies: Dict[str, str] = {}
if not cookie_string:
return cookies
cookie_string = cookie_string.strip()
if not cookie_string:
return cookies
for sep in (";", "\n"):
if sep in cookie_string:
pairs = cookie_string.split(sep)
break
else:
pairs = [cookie_string]
for pair in pairs:
pair = pair.strip()
if not pair or "=" not in pair:
continue
key, value = pair.split("=", 1)
key = key.strip()
value = value.strip()
if key and value:
cookies[key] = value
return cookies
if __name__ == "__main__":
# 测试代码
print("网易云音乐API模块")