import json
|
from pathlib import Path
|
from datetime import datetime, timedelta
|
from auto_media_publisher.config.conf_base import TASK_CONFIG_DIR
|
from auto_media_publisher.utils.logger import get_logger
|
from auto_media_publisher.utils.utils_database import publish_task_exists,publish_task_insert,publish_task_delete
|
|
# ----------------- 任务生成器 -----------------
|
|
class TaskGenerator:
|
def __init__(self):
|
self.config_dir_path = Path(TASK_CONFIG_DIR)
|
self.logger = get_logger(self.__class__.__name__,"admin")
|
self.logger.info("TaskGenerator started.")
|
|
def run(self):
|
count = 0
|
count_new = 0
|
count_updated = 0
|
self.logger.info("generate_publish_tasks_once 开始执行")
|
try:
|
for config_file in self.config_dir_path.rglob("*.json"):
|
try:
|
user_config = json.loads(config_file.read_text(encoding="utf-8"))
|
except Exception as e:
|
self.logger.warning(f"无法读取配置文件 {config_file.name}:{e}")
|
continue
|
|
if not user_config.get("enabled", True):
|
self.logger.info(f"跳过未启用用户:{config_file.name}")
|
continue
|
|
user_id = user_config.get("user")
|
proxy = user_config.get("proxy")
|
platforms = user_config.get("platforms", [])
|
|
for platform in platforms:
|
if not platform.get("enabled", True):
|
continue
|
|
platform_name = platform["name"]
|
generator_class = platform["media_generator"]
|
generator_args = platform["media_generator_args"]
|
generator_args_str = json.dumps(generator_args, ensure_ascii=False)
|
|
platform_days_ahead = platform["task_ahead_days"]
|
|
upload_times = platform.get("upload_times", [])
|
config_updated = datetime.fromtimestamp(config_file.stat().st_mtime).isoformat()
|
|
for day_offset in range(platform_days_ahead):
|
date = (datetime.now() + timedelta(days=day_offset)).date()
|
for time_str in upload_times:
|
try:
|
scheduled_dt = datetime.strptime(f"{date} {time_str}", "%Y-%m-%d %H:%M")
|
except ValueError:
|
self.logger.warning(f"非法时间格式:{time_str} in {config_file.name}")
|
continue
|
|
existing = publish_task_exists(user_id, platform_name, scheduled_dt)
|
|
if existing:
|
task_id, old_hash, task_status = existing # 本质上 还是个 dict,这样会自动解包
|
if task_status == "pending" and old_hash != config_updated:
|
publish_task_delete(task_id)
|
publish_task_insert(user_id, platform_name, generator_class,generator_args_str,scheduled_dt, config_updated,proxy)
|
count_updated = count_updated +1
|
else:
|
publish_task_insert(user_id, platform_name, generator_class,generator_args_str,scheduled_dt, config_updated,proxy)
|
count_new =count_new+1
|
count += 1
|
except Exception as e:
|
self.logger.exception(f"generate_publish_tasks_once 出错: {e}")
|
self.logger.info(f"累计检查 {count} 条任务。")
|
self.logger.info(f"{count_updated} 条任务已更新数据库")
|
self.logger.info(f"{count_new} 条任务已插入数据库")
|