From 87fb34e5c989b6af5c4146f0b3606a327c9cbb7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B6=B5=E6=9B=A6?= Date: Mon, 2 Dec 2024 12:27:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E4=BF=AE=E6=94=B9tag?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E4=BF=A1=E6=81=AF=E7=9A=84=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=20close=20#266?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xiaomusic/httpserver.py | 17 +++++++++++++++++ xiaomusic/utils.py | 9 +++++++++ xiaomusic/xiaomusic.py | 22 ++++++++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/xiaomusic/httpserver.py b/xiaomusic/httpserver.py index fa53e32..aa048c3 100644 --- a/xiaomusic/httpserver.py +++ b/xiaomusic/httpserver.py @@ -303,6 +303,23 @@ async def musicinfos( return ret +class MusicInfoObj(BaseModel): + musicname: str + title: str = "" + artist: str = "" + album: str = "" + year: str = "" + genre: str = "" + lyrics: str = "" + picture: str = "" # base64 + + +@app.post("/setmusictag") +async def setmusictag(info: MusicInfoObj, Verifcation=Depends(verification)): + ret = xiaomusic.set_music_tag(info.musicname, info) + return {"ret": ret} + + @app.get("/curplaylist") async def curplaylist(did: str = "", Verifcation=Depends(verification)): if not xiaomusic.did_exist(did): diff --git a/xiaomusic/utils.py b/xiaomusic/utils.py index 7059904..2f58ad6 100644 --- a/xiaomusic/utils.py +++ b/xiaomusic/utils.py @@ -596,6 +596,15 @@ def _to_utf8(v): return str(v) +def save_picture_by_base64(picture_base64_data, save_root, file_path): + try: + picture_data = base64.b64decode(picture_base64_data) + except (TypeError, ValueError) as e: + log.exception(f"Error decoding base64 data: {e}") + return None + return _save_picture(picture_data, save_root, file_path) + + def _save_picture(picture_data, save_root, file_path): # 计算文件名的哈希值 file_hash = hashlib.md5(file_path.encode("utf-8")).hexdigest() diff --git a/xiaomusic/xiaomusic.py b/xiaomusic/xiaomusic.py index 4b458fa..69d93b5 100644 --- a/xiaomusic/xiaomusic.py +++ b/xiaomusic/xiaomusic.py @@ -50,6 +50,7 @@ from xiaomusic.utils import ( list2str, parse_cookie_string, parse_str_to_dict, + save_picture_by_base64, traverse_music_directory, try_add_access_control_param, ) @@ -463,6 +464,27 @@ class XiaoMusic: ) return tags + # 修改标签信息 + def set_music_tag(self, name, info): + if self._tag_generation_task: + self.log.info("tag 更新中,请等待") + return "Tag generation task running" + tags = copy.copy(self.all_music_tags.get(name, asdict(Metadata()))) + tags["title"] = info.title + tags["artist"] = info.artist + tags["album"] = info.album + tags["year"] = info.year + tags["genre"] = info.genre + tags["lyrics"] = info.lyrics + if info.picture: + file_path = self.all_music[name] + tags["picture"] = save_picture_by_base64( + info.picture, self.config.picture_cache_path, file_path + ) + self.all_music_tags[name] = tags + self.try_save_tag_cache() + return "OK" + def get_music_url(self, name): if self.is_web_music(name): url = self.all_music[name]