feat: 新增自定义个歌单接口 #242

This commit is contained in:
涵曦 2024-11-20 00:09:54 +08:00
parent b2737f745d
commit 0c99f4d537
2 changed files with 111 additions and 29 deletions

View File

@ -468,6 +468,51 @@ async def upload_yt_dlp_cookie(file: UploadFile = File(...)):
} }
class PlayListObj(BaseModel):
name: str = "" # 歌单名
# 新增歌单
@app.post("/playlistadd")
async def playlistadd(data: PlayListObj, Verifcation=Depends(verification)):
ret = xiaomusic.play_list_add(data.name)
if ret:
return {"ret": "OK"}
return {"ret": "Add failed, may be already exist."}
# 移除歌单
@app.post("/playlistdel")
async def playlistdel(data: PlayListObj, Verifcation=Depends(verification)):
ret = xiaomusic.play_list_del(data.name)
if ret:
return {"ret": "OK"}
return {"ret": "Del failed, may be not exist."}
class PlayListMusicObj(BaseModel):
name: str = "" # 歌单名
music_list: list[str] # 歌曲名列表
# 歌单新增歌曲
@app.post("/playlistaddmusic")
async def playlistaddmusic(data: PlayListMusicObj, Verifcation=Depends(verification)):
ret = xiaomusic.play_list_add_music(data.name, data.music_list)
if ret:
return {"ret": "OK"}
return {"ret": "Add failed, may be playlist not exist."}
# 歌单移除歌曲
@app.post("/playlistdelmusic")
async def playlistdelmusic(data: PlayListMusicObj, Verifcation=Depends(verification)):
ret = xiaomusic.play_list_del_music(data.name, data.music_list)
if ret:
return {"ret": "OK"}
return {"ret": "Del failed, may be playlist not exist."}
async def file_iterator(file_path, start, end): async def file_iterator(file_path, start, end):
async with aiofiles.open(file_path, mode="rb") as file: async with aiofiles.open(file_path, mode="rb") as file:
await file.seek(start) await file.seek(start)

View File

@ -75,6 +75,7 @@ class XiaoMusic:
self.all_music_tags = {} # 歌曲额外信息 self.all_music_tags = {} # 歌曲额外信息
self._tag_generation_task = False self._tag_generation_task = False
self._extra_index_search = {} self._extra_index_search = {}
self.custom_play_list = None
# 初始化配置 # 初始化配置
self.init_config() self.init_config()
@ -623,7 +624,6 @@ class XiaoMusic:
self.music_list["所有歌曲"] = [ self.music_list["所有歌曲"] = [
name for name in self.all_music.keys() if name not in self._all_radio name for name in self.all_music.keys() if name not in self._all_radio
] ]
self._append_custom_play_list()
# 网络歌单 # 网络歌单
try: try:
@ -641,9 +641,11 @@ class XiaoMusic:
for _, play_list in self.music_list.items(): for _, play_list in self.music_list.items():
play_list.sort(key=custom_sort_key) play_list.sort(key=custom_sort_key)
# 刷新自定义歌单
self.refresh_custom_play_list()
# 更新每个设备的歌单 # 更新每个设备的歌单
for device in self.devices.values(): self.update_all_playlist()
device.update_playlist()
# 重建索引 # 重建索引
self._extra_index_search = {} self._extra_index_search = {}
@ -655,13 +657,11 @@ class XiaoMusic:
# all_music 更新,重建 tag # all_music 更新,重建 tag
self.try_gen_all_music_tag() self.try_gen_all_music_tag()
def _append_custom_play_list(self): def refresh_custom_play_list(self):
if not self.config.custom_play_list_json:
return
try: try:
custom_play_list = json.loads(self.config.custom_play_list_json) custom_play_list = self.get_custom_play_list()
self.music_list["收藏"] = list(custom_play_list["收藏"]) for k, v in custom_play_list.items():
self.music_list[k] = list(v)
except Exception as e: except Exception as e:
self.log.exception(f"Execption {e}") self.log.exception(f"Execption {e}")
@ -1007,12 +1007,7 @@ class XiaoMusic:
if not name: if not name:
return return
favorites = self.music_list.get("收藏", []) self.play_list_add_music("收藏", name)
if name in favorites:
return
favorites.append(name)
self.save_favorites(favorites)
# 从收藏列表中移除 # 从收藏列表中移除
async def del_from_favorites(self, did="", arg1="", **kwargs): async def del_from_favorites(self, did="", arg1="", **kwargs):
@ -1020,27 +1015,69 @@ class XiaoMusic:
if not name: if not name:
return return
favorites = self.music_list.get("收藏", []) self.play_list_del_music("收藏", name)
if name not in favorites:
return
favorites.remove(name) # 更新每个设备的歌单
self.save_favorites(favorites) def update_all_playlist(self):
for device in self.devices.values():
device.update_playlist()
def save_favorites(self, favorites): def get_custom_play_list(self):
self.music_list["收藏"] = favorites if self.custom_play_list is None:
custom_play_list = {} self.custom_play_list = {}
if self.config.custom_play_list_json: if self.config.custom_play_list_json:
custom_play_list = json.loads(self.config.custom_play_list_json) self.custom_play_list = json.loads(self.config.custom_play_list_json)
custom_play_list["收藏"] = favorites return self.custom_play_list
def save_custom_play_list(self):
custom_play_list = self.get_custom_play_list()
self.refresh_custom_play_list()
self.config.custom_play_list_json = json.dumps( self.config.custom_play_list_json = json.dumps(
custom_play_list, ensure_ascii=False custom_play_list, ensure_ascii=False
) )
self.save_cur_config() self.save_cur_config()
# 更新每个设备的歌单 # 新增歌单
for device in self.devices.values(): def play_list_add(self, name):
device.update_playlist() custom_play_list = self.get_custom_play_list()
if name in custom_play_list:
return False
custom_play_list[name] = []
self.save_custom_play_list()
return True
# 移除歌单
def play_list_del(self, name):
custom_play_list = self.get_custom_play_list()
if name not in custom_play_list:
return False
custom_play_list.pop(name)
self.save_custom_play_list()
return True
# 歌单新增歌曲
def play_list_add_music(self, name, music_list):
custom_play_list = self.get_custom_play_list()
if name not in custom_play_list:
return False
play_list = custom_play_list[name]
for music_name in music_list:
if (music_name in self.all_music) and (music_name not in play_list):
play_list.append(music_name)
self.save_custom_play_list()
return True
# 歌单移除歌曲
def play_list_del_music(self, name, music_list):
custom_play_list = self.get_custom_play_list()
if name not in custom_play_list:
return False
play_list = custom_play_list[name]
for music_name in music_list:
if music_name in play_list:
play_list.pop(music_name)
self.save_custom_play_list()
return True
# 获取音量 # 获取音量
async def get_volume(self, did="", **kwargs): async def get_volume(self, did="", **kwargs):