feat: 增加 tags 缓存 (#193)
This commit is contained in:
parent
3110c2221b
commit
7c9576874b
@ -235,6 +235,7 @@ docker build -t xiaomusic .
|
|||||||
- XIAOMUSIC_HTTPAUTH_USERNAME 配置 web 控制台用户,对应后台的 【web控制台账户】
|
- XIAOMUSIC_HTTPAUTH_USERNAME 配置 web 控制台用户,对应后台的 【web控制台账户】
|
||||||
- XIAOMUSIC_HTTPAUTH_PASSWORD 配置 web 控制台密码,对应后台的 【web控制台密码】
|
- XIAOMUSIC_HTTPAUTH_PASSWORD 配置 web 控制台密码,对应后台的 【web控制台密码】
|
||||||
- XIAOMUSIC_CONF_PATH 用来存放配置文件的目录,对应后台的 【配置文件目录】,记得把目录映射到主机,默认为 `/app/config` ,具体见 <https://github.com/hanxi/xiaomusic/issues/74>
|
- XIAOMUSIC_CONF_PATH 用来存放配置文件的目录,对应后台的 【配置文件目录】,记得把目录映射到主机,默认为 `/app/config` ,具体见 <https://github.com/hanxi/xiaomusic/issues/74>
|
||||||
|
- XIAOMUSIC_TAG_CACHE_DIR 用来音乐 tag 缓存,默认为空(不缓存)
|
||||||
- XIAOMUSIC_DISABLE_DOWNLOAD 设为 true 时关闭下载功能,对应后台的 【关闭下载功能】,见 <https://github.com/hanxi/xiaomusic/issues/82>
|
- XIAOMUSIC_DISABLE_DOWNLOAD 设为 true 时关闭下载功能,对应后台的 【关闭下载功能】,见 <https://github.com/hanxi/xiaomusic/issues/82>
|
||||||
- XIAOMUSIC_USE_MUSIC_API 设为 true 时使用 player_play_music 接口播放音乐,对应后台的 【触屏版兼容模式】,用于兼容不能播放的型号,如果发现需要设置这个选项的时候请告知我加一下设备型号,方便以后不用设置。 见 <https://github.com/hanxi/xiaomusic/issues/30>
|
- XIAOMUSIC_USE_MUSIC_API 设为 true 时使用 player_play_music 接口播放音乐,对应后台的 【触屏版兼容模式】,用于兼容不能播放的型号,如果发现需要设置这个选项的时候请告知我加一下设备型号,方便以后不用设置。 见 <https://github.com/hanxi/xiaomusic/issues/30>
|
||||||
- XIAOMUSIC_KEYWORDS_PLAY 用来播放歌曲的口令前缀,对应后台的 【播放歌曲口令】,默认是 "播放歌曲,放歌曲" ,可以用英文逗号分割配置多个
|
- XIAOMUSIC_KEYWORDS_PLAY 用来播放歌曲的口令前缀,对应后台的 【播放歌曲口令】,默认是 "播放歌曲,放歌曲" ,可以用英文逗号分割配置多个
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
"music_path": "music",
|
"music_path": "music",
|
||||||
"download_path": "",
|
"download_path": "",
|
||||||
"conf_path": null,
|
"conf_path": null,
|
||||||
|
"tag_cache_dir": null,
|
||||||
"hostname": "192.168.2.5",
|
"hostname": "192.168.2.5",
|
||||||
"port": 8090,
|
"port": 8090,
|
||||||
"public_port": 0,
|
"public_port": 0,
|
||||||
|
@ -84,6 +84,7 @@ class Config:
|
|||||||
) # 只能是music目录下的子目录
|
) # 只能是music目录下的子目录
|
||||||
download_path: str = os.getenv("XIAOMUSIC_DOWNLOAD_PATH", "music/download")
|
download_path: str = os.getenv("XIAOMUSIC_DOWNLOAD_PATH", "music/download")
|
||||||
conf_path: str = os.getenv("XIAOMUSIC_CONF_PATH", "conf")
|
conf_path: str = os.getenv("XIAOMUSIC_CONF_PATH", "conf")
|
||||||
|
tag_cache_dir: str = os.getenv("XIAOMUSIC_TAG_CACHE_DIR", None)
|
||||||
hostname: str = os.getenv("XIAOMUSIC_HOSTNAME", "192.168.2.5")
|
hostname: str = os.getenv("XIAOMUSIC_HOSTNAME", "192.168.2.5")
|
||||||
port: int = int(os.getenv("XIAOMUSIC_PORT", "8090")) # 监听端口
|
port: int = int(os.getenv("XIAOMUSIC_PORT", "8090")) # 监听端口
|
||||||
public_port: int = int(os.getenv("XIAOMUSIC_PUBLIC_PORT", 0)) # 歌曲访问端口
|
public_port: int = int(os.getenv("XIAOMUSIC_PUBLIC_PORT", 0)) # 歌曲访问端口
|
||||||
@ -246,3 +247,13 @@ class Config:
|
|||||||
os.makedirs(self.conf_path)
|
os.makedirs(self.conf_path)
|
||||||
filename = os.path.join(self.conf_path, "setting.json")
|
filename = os.path.join(self.conf_path, "setting.json")
|
||||||
return filename
|
return filename
|
||||||
|
|
||||||
|
@property
|
||||||
|
def tag_cache_path(self):
|
||||||
|
if self.tag_cache_dir is None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
if not os.path.exists(self.tag_cache_dir):
|
||||||
|
os.makedirs(self.tag_cache_dir)
|
||||||
|
filename = os.path.join(self.tag_cache_dir, "tag_cache.json")
|
||||||
|
return filename
|
||||||
|
@ -437,10 +437,47 @@ class XiaoMusic:
|
|||||||
encoded_name = urllib.parse.quote(filename)
|
encoded_name = urllib.parse.quote(filename)
|
||||||
return f"{self.hostname}:{self.public_port}/music/{encoded_name}"
|
return f"{self.hostname}:{self.public_port}/music/{encoded_name}"
|
||||||
|
|
||||||
|
# 给前端调用
|
||||||
|
def refresh_music_tag(self):
|
||||||
|
filename = self.config.tag_cache_path
|
||||||
|
if filename is not None:
|
||||||
|
# 清空 cache
|
||||||
|
with open(filename, "w", encoding="utf-8") as f:
|
||||||
|
json.dump({}, f, ensure_ascii=False, indent=2)
|
||||||
|
self.log.info(f"刷新:已清空 tag cache")
|
||||||
|
else:
|
||||||
|
self.log.info(f"刷新:tag cache 未启用")
|
||||||
|
#TODO: 优化性能?
|
||||||
|
self._gen_all_music_list()
|
||||||
|
self.log.debug(f"刷新:已重建 tag cache")
|
||||||
|
|
||||||
|
def try_load_from_tag_cache(self) -> dict:
|
||||||
|
filename = self.config.tag_cache_path
|
||||||
|
tag_cache = {}
|
||||||
|
if filename is not None:
|
||||||
|
if os.path.exists(filename):
|
||||||
|
with open(filename, "r", encoding="utf-8") as f:
|
||||||
|
tag_cache = json.load(f)
|
||||||
|
self.log.info(f"已从【{filename}】加载 tag cache")
|
||||||
|
else:
|
||||||
|
self.log.info(f"【{filename}】tag cache 已启用,但文件不存在")
|
||||||
|
else:
|
||||||
|
self.log.info(f"加载:tag cache 未启用")
|
||||||
|
return tag_cache
|
||||||
|
|
||||||
|
def try_save_tag_cache(self):
|
||||||
|
filename = self.config.tag_cache_path
|
||||||
|
if filename is not None:
|
||||||
|
with open(filename, "w", encoding="utf-8") as f:
|
||||||
|
json.dump(self.all_music_tags, f, ensure_ascii=False, indent=2)
|
||||||
|
self.log.info(f"保存:tag cache 已保存到【{filename}】")
|
||||||
|
else:
|
||||||
|
self.log.info(f"保存:tag cache 未启用")
|
||||||
|
|
||||||
# 获取目录下所有歌曲,生成随机播放列表
|
# 获取目录下所有歌曲,生成随机播放列表
|
||||||
def _gen_all_music_list(self):
|
def _gen_all_music_list(self):
|
||||||
self.all_music = {}
|
self.all_music = {}
|
||||||
self.all_music_tags = {}
|
self.all_music_tags = self.try_load_from_tag_cache()
|
||||||
all_music_by_dir = {}
|
all_music_by_dir = {}
|
||||||
local_musics = traverse_music_directory(
|
local_musics = traverse_music_directory(
|
||||||
self.music_path,
|
self.music_path,
|
||||||
@ -464,7 +501,10 @@ class XiaoMusic:
|
|||||||
filename = os.path.basename(file)
|
filename = os.path.basename(file)
|
||||||
(name, _) = os.path.splitext(filename)
|
(name, _) = os.path.splitext(filename)
|
||||||
self.all_music[name] = file
|
self.all_music[name] = file
|
||||||
self.all_music_tags[name] = get_audio_metadata(file)
|
if name not in self.all_music_tags:
|
||||||
|
self.all_music_tags[name] = {
|
||||||
|
k: str(v) for k, v in get_audio_metadata(file).items()}
|
||||||
|
print(f"加载 {name} tag")
|
||||||
all_music_by_dir[dir_name][name] = True
|
all_music_by_dir[dir_name][name] = True
|
||||||
self.log.debug(f"_gen_all_music_list {name}:{dir_name}:{file}")
|
self.log.debug(f"_gen_all_music_list {name}:{dir_name}:{file}")
|
||||||
|
|
||||||
@ -505,6 +545,9 @@ class XiaoMusic:
|
|||||||
if not (v.startswith("http") or v.startswith("https")):
|
if not (v.startswith("http") or v.startswith("https")):
|
||||||
self._extra_index_search[v] = k
|
self._extra_index_search[v] = k
|
||||||
|
|
||||||
|
# 刷新 tag cache
|
||||||
|
self.try_save_tag_cache()
|
||||||
|
|
||||||
def _append_custom_play_list(self):
|
def _append_custom_play_list(self):
|
||||||
if not self.config.custom_play_list_json:
|
if not self.config.custom_play_list_json:
|
||||||
return
|
return
|
||||||
@ -537,6 +580,7 @@ class XiaoMusic:
|
|||||||
continue
|
continue
|
||||||
self.all_music[name] = url
|
self.all_music[name] = url
|
||||||
# TODO: 网络歌曲获取歌曲额外信息
|
# TODO: 网络歌曲获取歌曲额外信息
|
||||||
|
# if name not in self.all_music_tags:
|
||||||
# self.all_music_tags[name] = get_audio_metadata(url)
|
# self.all_music_tags[name] = get_audio_metadata(url)
|
||||||
one_music_list.append(name)
|
one_music_list.append(name)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user