wangzhibo
2025-07-27 594d916c67b2f8168a8817756bd7ac749ac5de3a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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} 条任务已插入数据库")