diff --git a/xiaomusic/api/routers/file.py b/xiaomusic/api/routers/file.py index f7c9d51..ee1249c 100644 --- a/xiaomusic/api/routers/file.py +++ b/xiaomusic/api/routers/file.py @@ -49,10 +49,18 @@ from xiaomusic.utils import ( safe_join_path, try_add_access_control_param, ) +from xiaomusic.utils.file_utils import clean_temp_dir router = APIRouter() +@router.post("/file/cleantempdir") +async def cleantempdir(Verifcation=Depends(verification)): + await clean_temp_dir(xiaomusic.config) + log.info("clean_temp_dir ok") + return {"ret": "OK"} + + @router.post("/downloadjson") async def downloadjson(data: UrlInfo, Verifcation=Depends(verification)): """下载 JSON""" diff --git a/xiaomusic/crontab.py b/xiaomusic/crontab.py index 21c03f6..a011654 100644 --- a/xiaomusic/crontab.py +++ b/xiaomusic/crontab.py @@ -1,5 +1,4 @@ import json -import os from apscheduler.schedulers.asyncio import AsyncIOScheduler from apscheduler.triggers.base import BaseTrigger @@ -9,6 +8,7 @@ from xiaomusic.holiday import ( is_off_day, is_working_day, ) +from xiaomusic.utils.file_utils import clean_temp_dir class CustomCronTrigger(BaseTrigger): @@ -224,29 +224,7 @@ class Crontab: if xiaomusic.config.enable_auto_clean_temp: async def clean_temp_job(): - try: - temp_dir = xiaomusic.config.temp_dir - if not os.path.exists(temp_dir): - self.log.info(f"临时目录不存在: {temp_dir}") - return - - files = os.listdir(temp_dir) - deleted_count = 0 - for filename in files: - try: - file_path = os.path.join(temp_dir, filename) - if os.path.isfile(file_path): - os.remove(file_path) - deleted_count += 1 - self.log.debug(f"已删除临时文件: {file_path}") - except Exception as e: - self.log.warning(f"删除文件失败 {file_path}: {e}") - - self.log.info( - f"定时清理临时文件完成,共删除 {deleted_count} 个文件" - ) - except Exception as e: - self.log.exception(f"清理临时文件异常: {e}") + clean_temp_dir(xiaomusic.config) self.add_job("0 3 * * *", clean_temp_job) self.log.info("已添加每日凌晨3点定时清理临时文件任务") diff --git a/xiaomusic/device_player.py b/xiaomusic/device_player.py index 221db2c..378f370 100644 --- a/xiaomusic/device_player.py +++ b/xiaomusic/device_player.py @@ -647,9 +647,6 @@ class XiaoMusicDevice: ) self.log.info(f"edge-tts 生成的文件路径: {mp3_path}") - # 保存当前 TTS 文件路径,用于定时器清空文件 - self._current_tts_file = mp3_path - # 生成播放 URL url = self.xiaomusic._music_url_handler._get_file_url(mp3_path) self.log.info(f"TTS 播放 URL: {url}") @@ -678,20 +675,6 @@ class XiaoMusicDevice: pass # 再置空引用 self._tts_timer = None - # 保底逻辑:删除临时 mp3 文件 - if ( - hasattr(self, "_current_tts_file") - and self._current_tts_file - ): - try: - if os.path.exists(self._current_tts_file): - await asyncio.sleep(1) # 延迟1秒后再删除文件 - os.remove(self._current_tts_file) - self.log.info( - f"已删除 TTS 临时文件: {self._current_tts_file}" - ) - except Exception as delete_err: - self.log.warning(f"删除 TTS 文件失败: {delete_err}") await self.stop(arg1="notts") except Exception as e: self.log.error(f"TTS 定时器异常: {e}") diff --git a/xiaomusic/static/default/setting.html b/xiaomusic/static/default/setting.html index 98d9506..5e9e084 100644 --- a/xiaomusic/static/default/setting.html +++ b/xiaomusic/static/default/setting.html @@ -336,6 +336,7 @@ var vConsole = new window.VConsole();
diff --git a/xiaomusic/static/default/setting.js b/xiaomusic/static/default/setting.js index 819ac59..c81592b 100644 --- a/xiaomusic/static/default/setting.js +++ b/xiaomusic/static/default/setting.js @@ -191,6 +191,22 @@ $(function () { $("#clear_cache").on("click", () => { localStorage.clear(); }); + + $("#cleantempdir").on("click", () => { + $.ajax({ + type: "POST", + url: "/file/cleantempdir", + contentType: "application/json", + data: JSON.stringify({}), + success: (msg) => { + alert(msg.ret); + }, + error: (msg) => { + alert(msg); + } + }); + }); + $("#hostname").on("change", function () { const hostname = $(this).val(); // 检查是否包含端口号(1到5位数字) diff --git a/xiaomusic/utils/file_utils.py b/xiaomusic/utils/file_utils.py index 8a5855c..4f5c0b9 100644 --- a/xiaomusic/utils/file_utils.py +++ b/xiaomusic/utils/file_utils.py @@ -4,6 +4,7 @@ import logging import os import re +import shutil log = logging.getLogger(__package__) @@ -187,3 +188,26 @@ def chmoddir(dir_path: str) -> None: log.info(f"Changed permissions of file: {item_path}") except Exception as e: log.info(f"chmoddir failed: {e}") + + +async def clean_temp_dir(config): + try: + temp_dir = config.temp_dir + if not os.path.exists(temp_dir): + log.info(f"临时目录不存在: {temp_dir}") + # 目录不存在时也创建,保持目录结构统一 + os.makedirs(temp_dir, exist_ok=True) + log.info(f"已创建临时目录: {temp_dir}") + return + + # 递归删除整个临时目录(包括目录内所有文件/子目录) + shutil.rmtree(temp_dir) + log.debug(f"已删除临时目录: {temp_dir}") + + # 重新创建空的临时目录 + os.makedirs(temp_dir, exist_ok=True) + log.info(f"已重新创建临时目录: {temp_dir}") + + log.info("定时清理临时文件完成,已删除并重建临时目录") + except Exception as e: + log.exception(f"清理临时文件异常: {e}")