enhance 定期清理插件

This commit is contained in:
honue 2023-10-28 17:11:48 +08:00
parent 16cce73f82
commit 64d3942ba9
2 changed files with 57 additions and 24 deletions

View File

@ -1,3 +1,4 @@
import logging
import time import time
from collections import defaultdict from collections import defaultdict
from datetime import datetime, timedelta from datetime import datetime, timedelta
@ -49,8 +50,8 @@ class AutoClean(_PluginBase):
_onlyonce = False _onlyonce = False
_notify = False _notify = False
_cleantype = None _cleantype = None
_cleanuser = None
_cleandate = None _cleandate = None
_cleanuser = None
_downloadhis = None _downloadhis = None
_transferhis = None _transferhis = None
@ -67,8 +68,8 @@ class AutoClean(_PluginBase):
self._onlyonce = config.get("onlyonce") self._onlyonce = config.get("onlyonce")
self._notify = config.get("notify") self._notify = config.get("notify")
self._cleantype = config.get("cleantype") self._cleantype = config.get("cleantype")
self._cleanuser = config.get("cleanuser")
self._cleandate = config.get("cleandate") self._cleandate = config.get("cleandate")
self._cleanuser = config.get("cleanuser")
# 加载模块 # 加载模块
if self._enabled: if self._enabled:
@ -96,9 +97,9 @@ class AutoClean(_PluginBase):
"onlyonce": False, "onlyonce": False,
"cron": self._cron, "cron": self._cron,
"cleantype": self._cleantype, "cleantype": self._cleantype,
"cleandate": self._cleandate,
"enabled": self._enabled, "enabled": self._enabled,
"cleanuser": self._cleanuser, "cleanuser": self._cleanuser,
"cleandate": self._cleandate,
"notify": self._notify, "notify": self._notify,
}) })
@ -107,34 +108,59 @@ class AutoClean(_PluginBase):
self._scheduler.print_jobs() self._scheduler.print_jobs()
self._scheduler.start() self._scheduler.start()
def __get_clean_date(self, deltatime: str = None):
# 清理日期
current_time = datetime.now()
if deltatime:
days_ago = current_time - timedelta(days=int(deltatime))
else:
days_ago = current_time - timedelta(days=int(self._cleandate))
return days_ago.strftime("%Y-%m-%d")
def __clean(self): def __clean(self):
""" """
定时清理媒体库 定时清理媒体库
""" """
if not self._cleandate: if not self._cleandate:
logger.error("未配置清理媒体库时间,停止运行") logger.error("未配置媒体库全局清理时间,停止运行")
return return
# 清理日期
current_time = datetime.now()
days_ago = current_time - timedelta(days=int(self._cleandate))
clean_date = days_ago.strftime("%Y-%m-%d")
# 查询用户清理日期之前的下载历史,不填默认清理全部用户的下载 # 查询用户清理日期之前的下载历史,不填默认清理全部用户的下载
if not self._cleanuser: if not self._cleanuser:
clean_date = self.__get_clean_date()
downloadhis_list = self._downloadhis.list_by_user_date(date=clean_date) downloadhis_list = self._downloadhis.list_by_user_date(date=clean_date)
logger.info(f'获取到日期 {clean_date} 之前的下载历史 {len(downloadhis_list)}') logger.info(f'获取到日期 {clean_date} 之前的下载历史 {len(downloadhis_list)}')
self.__clean_history(date=clean_date, clean_type=self._cleantype, downloadhis_list=downloadhis_list)
self.__clean_history(date=clean_date, downloadhis_list=downloadhis_list) # 根据填写的信息判断怎么清理
else: else:
for username in str(self._cleanuser).split(","): # username:days#cleantype
clean_type = self._cleantype
clean_date = self._cleandate
for userinfo in str(self._cleanuser).split("\n"):
if userinfo.count('#'):
clean_type = userinfo.split('#')[1]
username_and_days = userinfo.split('#')[0]
else:
username_and_days = userinfo
if username_and_days.count(':'):
clean_date = username_and_days.split(':')[1]
username = username_and_days.split(':')[0]
else:
username = userinfo
# 转strftime
clean_date = self.__get_clean_date(clean_date)
logging.info(f'{username} 使用 {clean_type} 清理方式,清理 {clean_date} 之前的下载历史')
downloadhis_list = self._downloadhis.list_by_user_date(date=clean_date, downloadhis_list = self._downloadhis.list_by_user_date(date=clean_date,
username=username) username=username)
logger.info( logger.info(
f'获取到用户 {username} 日期 {clean_date} 之前的下载历史 {len(downloadhis_list)}') f'获取到用户 {username} 日期 {clean_date} 之前的下载历史 {len(downloadhis_list)}')
self.__clean_history(date=clean_date, downloadhis_list=downloadhis_list) self.__clean_history(date=clean_date, clean_type=clean_type,
downloadhis_list=downloadhis_list)
def __clean_history(self, date: str, downloadhis_list: List[DownloadHistory]): def __clean_history(self, date: str, clean_type: str, downloadhis_list: List[DownloadHistory]):
""" """
清理下载历史转移记录 清理下载历史转移记录
""" """
@ -143,7 +169,7 @@ class AutoClean(_PluginBase):
return return
# 读取历史记录 # 读取历史记录
history = self.get_data('history') or [] pulgin_history = self.get_data('history') or []
# 创建一个字典来保存分组结果 # 创建一个字典来保存分组结果
downloadhis_grouped_dict: Dict[tuple, List[DownloadHistory]] = defaultdict(list) downloadhis_grouped_dict: Dict[tuple, List[DownloadHistory]] = defaultdict(list)
@ -159,7 +185,6 @@ class AutoClean(_PluginBase):
# 输出分组结果 # 输出分组结果
for key, downloadhis_list in downloadhis_grouped_dict.items(): for key, downloadhis_list in downloadhis_grouped_dict.items():
logger.info(f"开始清理 {key}") logger.info(f"开始清理 {key}")
result = []
del_transferhis_cnt = 0 del_transferhis_cnt = 0
del_media_name = downloadhis_list[0].title del_media_name = downloadhis_list[0].title
del_media_user = downloadhis_list[0].username del_media_user = downloadhis_list[0].username
@ -180,12 +205,12 @@ class AutoClean(_PluginBase):
for history in transferhis_list: for history in transferhis_list:
# 册除媒体库文件 # 册除媒体库文件
if str(self._cleantype == "dest") or str(self._cleantype == "all"): if clean_type in ["dest", "all"]:
TransferChain().delete_files(Path(history.dest)) TransferChain().delete_files(Path(history.dest))
# 删除记录 # 删除记录
self._transferhis.delete(history.id) self._transferhis.delete(history.id)
# 删除源文件 # 删除源文件
if str(self._cleantype == "src") or str(self._cleantype == "all"): if clean_type in ["src", "all"]:
TransferChain().delete_files(Path(history.src)) TransferChain().delete_files(Path(history.src))
# 发送事件 # 发送事件
eventmanager.send_event( eventmanager.send_event(
@ -208,7 +233,7 @@ class AutoClean(_PluginBase):
f"下载媒体用户 {del_media_user}\n" f"下载媒体用户 {del_media_user}\n"
f"删除历史记录 {del_transferhis_cnt}") f"删除历史记录 {del_transferhis_cnt}")
result.append({ pulgin_history.append({
"type": del_media_type, "type": del_media_type,
"title": del_media_name, "title": del_media_name,
"year": del_media_year, "year": del_media_year,
@ -219,7 +244,7 @@ class AutoClean(_PluginBase):
}) })
# 保存历史 # 保存历史
self.save_data("history", result) self.save_data("history", pulgin_history)
def get_state(self) -> bool: def get_state(self) -> bool:
return self._enabled return self._enabled
@ -323,7 +348,7 @@ class AutoClean(_PluginBase):
'component': 'VSelect', 'component': 'VSelect',
'props': { 'props': {
'model': 'cleantype', 'model': 'cleantype',
'label': '清理方式', 'label': '全局清理方式',
'items': [ 'items': [
{'title': '媒体库文件', 'value': 'dest'}, {'title': '媒体库文件', 'value': 'dest'},
{'title': '源文件', 'value': 'src'}, {'title': '源文件', 'value': 'src'},
@ -344,7 +369,7 @@ class AutoClean(_PluginBase):
'component': 'VTextField', 'component': 'VTextField',
'props': { 'props': {
'model': 'cleandate', 'model': 'cleandate',
'label': '清理媒体日期', 'label': '全局清理日期',
'placeholder': '清理多少天之前的下载记录(天)' 'placeholder': '清理多少天之前的下载记录(天)'
} }
} }
@ -362,11 +387,17 @@ class AutoClean(_PluginBase):
}, },
'content': [ 'content': [
{ {
'component': 'VTextField', 'component': 'VTextarea',
'props': { 'props': {
'model': 'cleanuser', 'model': 'cleanuser',
'label': '清理下载用户名/插件名', 'label': '清理配置',
'placeholder': '多个用户,分割 支持按插件清理下载记录豆瓣想看、豆瓣榜单、RSS订阅' 'rows': 6,
'placeholder': '每一行一个配置,支持以下几种配置方式,清理方式支持 src、desc、all 分别对应源文件,媒体库文件,所有文件\n'
'用户名缺省默认清理所有用户(慎重留空),清理天数缺省默认使用全局清理天数,清理方式缺省默认使用全局清理方式\n'
'用户名/插件名豆瓣想看、豆瓣榜单、RSS订阅\n'
'用户名#清理方式\n'
'用户名:清理天数\n'
'用户名:清理天数#清理方式',
} }
} }
] ]

View File

@ -38,6 +38,8 @@ class DownloadHistory(BaseModel):
torrent_site: Optional[str] = None torrent_site: Optional[str] = None
# 下载用户 # 下载用户
userid: Optional[str] = None userid: Optional[str] = None
# 下载用户名插件名
username: Optional[str] = None
# 下载渠道 # 下载渠道
channel: Optional[str] = None channel: Optional[str] = None
# 创建时间 # 创建时间