From 9ab63c27c53453e78f8af91663e5728c5d344a53 Mon Sep 17 00:00:00 2001 From: javara999 Date: Thu, 28 May 2026 18:11:52 +0900 Subject: [PATCH] Use dedicated FreeGame scheduler job id --- logic.py | 22 ++++++++++++++-------- templates/ff_freegame_main_setting.html | 2 ++ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/logic.py b/logic.py index ad1a18f..71d8d5f 100644 --- a/logic.py +++ b/logic.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import threading import traceback +from datetime import datetime import requests from flask import jsonify, render_template @@ -14,6 +15,7 @@ from .setup import P logger = P.logger package_name = P.package_name +job_id = f"{package_name}_fetch" _fetch_lock = threading.Lock() SOURCE_LABELS = { @@ -109,6 +111,8 @@ class Logic(PluginModuleBase): "source_indiegala_enabled": "True", "source_stove_enabled": "True", "source_cheapshark_enabled": "True", + "last_fetch_started": "", + "last_fetch_finished": "", } def __init__(self, PM): @@ -122,8 +126,8 @@ class Logic(PluginModuleBase): def process_menu(self, sub, req): arg = ModelSetting.to_dict() arg["package_name"] = package_name - arg["scheduler"] = str(F.scheduler.is_include(package_name)) - arg["is_running"] = str(F.scheduler.is_running(package_name)) + arg["scheduler"] = str(F.scheduler.is_include(job_id)) + arg["is_running"] = str(F.scheduler.is_running(job_id)) arg["source_labels"] = SOURCE_LABELS arg["platform_counts"] = ModelFreeGameItem.get_platform_counts() if sub == "list": @@ -136,7 +140,7 @@ class Logic(PluginModuleBase): try: if sub == "setting_save": ret, _ = ModelSetting.setting_save(req) - if F.scheduler.is_include(package_name): + if F.scheduler.is_include(job_id): Logic.scheduler_stop() Logic.scheduler_start() elif _truthy(ModelSetting.get("auto_start")): @@ -167,11 +171,11 @@ class Logic(PluginModuleBase): def scheduler_start(): try: interval = ModelSetting.get("auto_interval") or "0 */2 * * *" - if F.scheduler.is_include(package_name): - scheduler.remove_job(package_name) - job = Job(package_name, package_name, interval, Logic.scheduler_function, "FreeGame fetch", True) + if F.scheduler.is_include(job_id): + scheduler.remove_job(job_id) + job = Job(package_name, job_id, interval, Logic.scheduler_function, "FreeGame fetch", True) scheduler.add_job_instance(job) - logger.info("FreeGame scheduler registered: %s", interval) + logger.info("FreeGame scheduler registered: id=%s interval=%s", job_id, interval) except Exception as e: logger.error("Exception:%s", e) logger.error(traceback.format_exc()) @@ -179,7 +183,7 @@ class Logic(PluginModuleBase): @staticmethod def scheduler_stop(): try: - scheduler.remove_job(package_name) + scheduler.remove_job(job_id) except Exception as e: logger.error("Exception:%s", e) logger.error(traceback.format_exc()) @@ -192,6 +196,7 @@ class Logic(PluginModuleBase): try: with F.app.app_context(): logger.info("FreeGame scheduled fetch started") + ModelSetting.set("last_fetch_started", datetime.now().strftime("%Y-%m-%d %H:%M:%S")) ModelFreeGameItem.ensure_schema() enabled_sources = set(_enabled_sources()) results = scraper.fetch_all() @@ -215,6 +220,7 @@ class Logic(PluginModuleBase): logger.info("FreeGame fetch completed: free_candidates=%d enabled_sources=%d", len(fresh_free_games), len(enabled_sources)) ModelFetchLog("all", "ok", f"free_candidates={len(fresh_free_games)} enabled_sources={len(enabled_sources)}", len(fresh_free_games)).save() + ModelSetting.set("last_fetch_finished", datetime.now().strftime("%Y-%m-%d %H:%M:%S")) Logic._notify(fresh_free_games) except Exception as e: logger.error("Exception:%s", e) diff --git a/templates/ff_freegame_main_setting.html b/templates/ff_freegame_main_setting.html index 07a805b..0adb5c0 100644 --- a/templates/ff_freegame_main_setting.html +++ b/templates/ff_freegame_main_setting.html @@ -7,6 +7,8 @@ {{ macros.setting_checkbox('auto_start', '시작 시 자동 스케줄 등록', value=arg.get('auto_start', 'False')) }} {{ macros.global_setting_scheduler_button(arg['scheduler'], arg['is_running']) }} {{ macros.setting_buttons([['ff_freegame_execute_btn', '1회 실행']], left='수동 실행') }} + {{ macros.info_text('last_fetch_started', '최근 수집 시작', value=arg.get('last_fetch_started', '')) }} + {{ macros.info_text('last_fetch_finished', '최근 수집 완료', value=arg.get('last_fetch_finished', '')) }} {{ macros.m_hr() }} {{ macros.setting_checkbox('notify_enabled', '알림 사용', value=arg.get('notify_enabled', 'False')) }} {{ macros.setting_input_text('notify_discord_webhook', 'Discord Webhook', value=arg.get('notify_discord_webhook', '')) }}