""" Parser API - Точка входа приложения """ from contextlib import asynccontextmanager from fastapi import FastAPI import uvicorn from work_parser import get_true_sources from config import ( APP_TITLE, APP_DESCRIPTION, APP_VERSION, UVICORN_PORT, SCHEDULED_PARSER_1_HOUR, SCHEDULED_PARSER_1_MINUTE, SCHEDULED_PARSER_2_HOUR, SCHEDULED_PARSER_2_MINUTE ) from apscheduler.schedulers.asyncio import AsyncIOScheduler from parsers import scheduled_parser_1, scheduled_parser_2, scheduled_parser_universal from api import setup_routes # Инициализация планировщика scheduler = AsyncIOScheduler() @asynccontextmanager async def lifespan(app: FastAPI): """Управление жизненным циклом приложения""" # Startup scheduler.add_job(scheduled_parser_1, "cron", hour=SCHEDULED_PARSER_1_HOUR, minute=SCHEDULED_PARSER_1_MINUTE) scheduler.add_job(scheduled_parser_2, "cron", hour=SCHEDULED_PARSER_2_HOUR, minute=SCHEDULED_PARSER_2_MINUTE) # Получаем все источники и распределяем их равномерно по 24 часам sources = get_true_sources().items() num_sources = len(sources) if num_sources > 0: total_minutes_per_day = 24 * 60 minutes_per_source = total_minutes_per_day / num_sources for idx, (url, promt) in enumerate(sources): total_minutes = int(idx * minutes_per_source) scheduled_hour = total_minutes // 60 scheduled_minute = total_minutes % 60 # Для универсального парсера нужно передавать url и promt как аргументы scheduler.add_job( scheduled_parser_universal, "cron", hour=scheduled_hour, minute=scheduled_minute, args=[url, promt] ) scheduler.start() yield # Shutdown scheduler.shutdown() # Создание приложения FastAPI app = FastAPI( title=APP_TITLE, description=APP_DESCRIPTION, version=APP_VERSION, lifespan=lifespan ) # Настройка маршрутов setup_routes(app) if __name__ == "__main__": uvicorn.run("main:app", port=UVICORN_PORT, reload=True)