Fix FreeGame scheduled execution entrypoint

This commit is contained in:
2026-05-28 17:19:14 +09:00
parent 681733c6c3
commit 37b0760f75
+37 -43
View File
@@ -96,7 +96,6 @@ def _telegram_send(bot_token, chat_id, games):
class Logic(PluginModuleBase): class Logic(PluginModuleBase):
instance = None
db_default = { db_default = {
"auto_start": "False", "auto_start": "False",
"auto_interval": "0 */2 * * *", "auto_interval": "0 */2 * * *",
@@ -114,12 +113,11 @@ class Logic(PluginModuleBase):
def __init__(self, PM): def __init__(self, PM):
super().__init__(PM, name="main", first_menu="setting") super().__init__(PM, name="main", first_menu="setting")
Logic.instance = self
def plugin_load(self): def plugin_load(self):
ModelFreeGameItem.ensure_schema() ModelFreeGameItem.ensure_schema()
if _truthy(ModelSetting.get("auto_start")): if _truthy(ModelSetting.get("auto_start")):
self.scheduler_start() Logic.scheduler_start()
def process_menu(self, sub, req): def process_menu(self, sub, req):
arg = ModelSetting.to_dict() arg = ModelSetting.to_dict()
@@ -139,20 +137,20 @@ class Logic(PluginModuleBase):
if sub == "setting_save": if sub == "setting_save":
ret, _ = ModelSetting.setting_save(req) ret, _ = ModelSetting.setting_save(req)
if F.scheduler.is_include(package_name): if F.scheduler.is_include(package_name):
self.scheduler_stop() Logic.scheduler_stop()
self.scheduler_start() Logic.scheduler_start()
elif _truthy(ModelSetting.get("auto_start")): elif _truthy(ModelSetting.get("auto_start")):
self.scheduler_start() Logic.scheduler_start()
ret["ret"] = "success" ret["ret"] = "success"
return jsonify(ret) return jsonify(ret)
if sub == "scheduler_toggle": if sub == "scheduler_toggle":
if req.form["scheduler"] == "true": if req.form["scheduler"] == "true":
self.scheduler_start() Logic.scheduler_start()
else: else:
self.scheduler_stop() Logic.scheduler_stop()
return jsonify({"ret": "success"}) return jsonify({"ret": "success"})
if sub == "execute_once": if sub == "execute_once":
threading.Thread(target=Logic.scheduler_function_static, daemon=True).start() threading.Thread(target=Logic.scheduler_function, daemon=True).start()
return jsonify({"ret": "success"}) return jsonify({"ret": "success"})
if sub == "web_list": if sub == "web_list":
ModelFreeGameItem.ensure_schema() ModelFreeGameItem.ensure_schema()
@@ -165,19 +163,21 @@ class Logic(PluginModuleBase):
logger.error(traceback.format_exc()) logger.error(traceback.format_exc())
return jsonify({"ret": "error", "log": str(e)}) return jsonify({"ret": "error", "log": str(e)})
def scheduler_start(self): @staticmethod
def scheduler_start():
try: try:
interval = ModelSetting.get("auto_interval") or "0 */2 * * *" interval = ModelSetting.get("auto_interval") or "0 */2 * * *"
if F.scheduler.is_include(package_name): if F.scheduler.is_include(package_name):
scheduler.remove_job(package_name) scheduler.remove_job(package_name)
job = Job(package_name, package_name, interval, Logic.scheduler_function_static, "FreeGame fetch", True) job = Job(package_name, package_name, interval, Logic.scheduler_function, "FreeGame fetch", True)
scheduler.add_job_instance(job) scheduler.add_job_instance(job)
logger.info("FreeGame scheduler registered: %s", interval) logger.info("FreeGame scheduler registered: %s", interval)
except Exception as e: except Exception as e:
logger.error("Exception:%s", e) logger.error("Exception:%s", e)
logger.error(traceback.format_exc()) logger.error(traceback.format_exc())
def scheduler_stop(self): @staticmethod
def scheduler_stop():
try: try:
scheduler.remove_job(package_name) scheduler.remove_job(package_name)
except Exception as e: except Exception as e:
@@ -185,44 +185,37 @@ class Logic(PluginModuleBase):
logger.error(traceback.format_exc()) logger.error(traceback.format_exc())
@staticmethod @staticmethod
def scheduler_function_static(): def scheduler_function():
logic = Logic.instance
if logic is None:
logger.error("FreeGame scheduler skipped: Logic instance is not initialized")
return
with F.app.app_context():
logic.scheduler_function()
def scheduler_function(self):
if not _fetch_lock.acquire(blocking=False): if not _fetch_lock.acquire(blocking=False):
logger.info("FreeGame fetch skipped: already running") logger.info("FreeGame fetch skipped: already running")
return return
try: try:
logger.info("FreeGame scheduled fetch started") with F.app.app_context():
ModelFreeGameItem.ensure_schema() logger.info("FreeGame scheduled fetch started")
enabled_sources = set(_enabled_sources()) ModelFreeGameItem.ensure_schema()
results = scraper.fetch_all() enabled_sources = set(_enabled_sources())
grouped = _split_source_payload(results) results = scraper.fetch_all()
fresh_free_games = [] grouped = _split_source_payload(results)
fresh_free_games = []
for legacy_source in ["humble", "fanatical", "gmg", "directgames"]: for legacy_source in ["humble", "fanatical", "gmg", "directgames"]:
ModelFreeGameItem.replace_source_items(legacy_source, []) ModelFreeGameItem.replace_source_items(legacy_source, [])
for source, items in grouped.items(): for source, items in grouped.items():
if source not in enabled_sources: if source not in enabled_sources:
continue continue
ModelFreeGameItem.replace_source_items(source, items) ModelFreeGameItem.replace_source_items(source, items)
ModelFetchLog(source, "ok", "", len(items)).save() ModelFetchLog(source, "ok", "", len(items)).save()
logger.info("FreeGame source=%s saved=%d", source, len(items)) logger.info("FreeGame source=%s saved=%d", source, len(items))
fresh_free_games.extend(items) fresh_free_games.extend(items)
disabled_sources = [source for source in SOURCE_LABELS if source not in enabled_sources] disabled_sources = [source for source in SOURCE_LABELS if source not in enabled_sources]
if disabled_sources: if disabled_sources:
ModelFreeGameItem.delete_not_in_sources(enabled_sources) ModelFreeGameItem.delete_not_in_sources(enabled_sources)
logger.info("FreeGame fetch completed: free_candidates=%d enabled_sources=%d", len(fresh_free_games), len(enabled_sources)) 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() ModelFetchLog("all", "ok", f"free_candidates={len(fresh_free_games)} enabled_sources={len(enabled_sources)}", len(fresh_free_games)).save()
self._notify(fresh_free_games) Logic._notify(fresh_free_games)
except Exception as e: except Exception as e:
logger.error("Exception:%s", e) logger.error("Exception:%s", e)
logger.error(traceback.format_exc()) logger.error(traceback.format_exc())
@@ -230,7 +223,8 @@ class Logic(PluginModuleBase):
finally: finally:
_fetch_lock.release() _fetch_lock.release()
def _notify(self, games): @staticmethod
def _notify(games):
if _truthy(ModelSetting.get("notify_enabled")) is False: if _truthy(ModelSetting.get("notify_enabled")) is False:
return return
targets = list(games or []) targets = list(games or [])