All checks were successful
continuous-integration/drone/push Build is passing
81 lines
2.3 KiB
Python
81 lines
2.3 KiB
Python
"""
|
|
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)
|
|
|
|
|