Refactor project structure and add new features
This commit is contained in:
+90
-54
@@ -1,15 +1,33 @@
|
||||
import json
|
||||
"""
|
||||
Главный модуль приложения, содержащий класс WhisperServiceAPI для инициализации
|
||||
и запуска сервиса распознавания речи.
|
||||
"""
|
||||
|
||||
import os
|
||||
import logging
|
||||
from flask import Flask
|
||||
from typing import Dict
|
||||
from flask import Flask
|
||||
import waitress
|
||||
|
||||
from .core.transcriber import WhisperTranscriber
|
||||
from .core.config import load_config
|
||||
from .api.routes import Routes
|
||||
from .infrastructure.validation.validators import FileValidator
|
||||
from .infrastructure.storage.file_manager import temp_file_manager
|
||||
from .infrastructure.logging.config import setup_logging
|
||||
from .infrastructure.logging.request_logger import RequestLogger
|
||||
|
||||
# Импорт классов и функций из других модулей
|
||||
from .transcriber import WhisperTranscriber
|
||||
from .routes import Routes
|
||||
from .utils import logger
|
||||
|
||||
class WhisperServiceAPI:
|
||||
"""Класс для API сервиса распознавания речи."""
|
||||
"""
|
||||
Класс для API сервиса распознавания речи.
|
||||
|
||||
Attributes:
|
||||
config (Dict): Словарь с параметрами конфигурации.
|
||||
port (int): Порт для сервиса.
|
||||
transcriber (WhisperTranscriber): Экземпляр транскрайбера.
|
||||
app (Flask): Flask-приложение.
|
||||
file_validator (FileValidator): Валидатор файлов.
|
||||
"""
|
||||
|
||||
def __init__(self, config_path: str):
|
||||
"""
|
||||
@@ -19,50 +37,68 @@ class WhisperServiceAPI:
|
||||
config_path: Путь к конфигурационному файлу.
|
||||
"""
|
||||
# Загрузка конфигурации
|
||||
self.config = self._load_config(config_path)
|
||||
|
||||
# Порт для сервиса
|
||||
self.port = self.config["service_port"]
|
||||
|
||||
# Создание экземпляра транскрайбера
|
||||
self.transcriber = WhisperTranscriber(self.config)
|
||||
|
||||
# Создание Flask-приложения
|
||||
self.app = Flask("whisper-service")
|
||||
|
||||
# Регистрация маршрутов
|
||||
Routes(self.app, self.transcriber, self.config)
|
||||
|
||||
logger.info(f"API сервис инициализирован, порт: {self.port}")
|
||||
|
||||
def _load_config(self, config_path: str) -> Dict:
|
||||
"""
|
||||
Загрузка конфигурации из JSON-файла.
|
||||
|
||||
Args:
|
||||
config_path: Путь к файлу конфигурации.
|
||||
|
||||
Returns:
|
||||
Словарь с параметрами конфигурации.
|
||||
|
||||
Raises:
|
||||
FileNotFoundError: Если файл конфигурации не найден.
|
||||
json.JSONDecodeError: Если файл конфигурации содержит некорректный JSON.
|
||||
"""
|
||||
try:
|
||||
with open(config_path, "r", encoding="utf-8") as f:
|
||||
config = json.load(f)
|
||||
return config
|
||||
except FileNotFoundError as e:
|
||||
logger.error(f"Файл конфигурации не найден: {e}")
|
||||
raise
|
||||
except json.JSONDecodeError as e:
|
||||
logger.error(f"Ошибка при загрузке конфигурации: {e}")
|
||||
raise
|
||||
|
||||
def run(self):
|
||||
"""Запуск сервиса."""
|
||||
logger.info(f"Запуск сервиса на порту {self.port}")
|
||||
self.config = load_config(config_path)
|
||||
|
||||
# Использовать waitress для production-ready сервера
|
||||
waitress.serve(self.app, host='0.0.0.0', port=self.port)
|
||||
# Установка уровня логирования
|
||||
log_level = getattr(logging, self.config.get('log_level', 'INFO').upper())
|
||||
log_file = self.config.get('log_file')
|
||||
setup_logging(log_level=log_level, log_file=log_file)
|
||||
|
||||
# Получаем логгер для этого модуля
|
||||
self.logger = logging.getLogger('app')
|
||||
self.logger.info("Инициализация WhisperServiceAPI")
|
||||
|
||||
# Инициализация Flask приложения
|
||||
self.app = Flask(__name__)
|
||||
self.port = self.config.get('port', 5000)
|
||||
|
||||
# Инициализация компонентов
|
||||
self.transcriber = WhisperTranscriber(self.config)
|
||||
self.file_validator = FileValidator(self.config)
|
||||
|
||||
# Настройка логирования запросов
|
||||
request_logger_config = self.config.get('request_logger', {})
|
||||
request_logger = RequestLogger(self.app, request_logger_config)
|
||||
|
||||
# Регистрация маршрутов
|
||||
routes = Routes(self.app, self.transcriber, self.config, self.file_validator)
|
||||
|
||||
# Регистрация обработчиков очистки
|
||||
self._register_cleanup_handlers()
|
||||
|
||||
self.logger.info("WhisperServiceAPI успешно инициализирован")
|
||||
|
||||
def _register_cleanup_handlers(self) -> None:
|
||||
"""
|
||||
Регистрация обработчиков для очистки ресурсов при завершении приложения.
|
||||
"""
|
||||
@self.app.teardown_appcontext
|
||||
def cleanup(error):
|
||||
"""
|
||||
Очистка временных файлов при завершении контекста запроса.
|
||||
|
||||
Args:
|
||||
error: Ошибка, если она произошла.
|
||||
"""
|
||||
# Выполнение очистки временных файлов, если необходимо
|
||||
pass
|
||||
|
||||
def run(self, host: str = '0.0.0.0', debug: bool = False) -> None:
|
||||
"""
|
||||
Запуск Flask приложения.
|
||||
|
||||
Args:
|
||||
host: Хост для запуска приложения.
|
||||
debug: Флаг отладочного режима.
|
||||
"""
|
||||
self.logger.info(f"Запуск сервиса на {host}:{self.port}")
|
||||
self.app.run(host=host, port=self.port, debug=debug)
|
||||
|
||||
def create_app(self) -> Flask:
|
||||
"""
|
||||
Создание и настройка Flask приложения (для использования с WSGI серверами).
|
||||
|
||||
Returns:
|
||||
Настроенное Flask приложение.
|
||||
"""
|
||||
return self.app
|
||||
Reference in New Issue
Block a user