diff --git a/README.md b/README.md index e9dda52..c395c3a 100644 --- a/README.md +++ b/README.md @@ -1,230 +1,771 @@ -# ⚽ Match Management & vMix Integration System +# ⚽ VMIX Football Broadcast System -Полноценная система управления футбольными матчами с live-обновлением, -парсингом данных и интеграцией с vMix. +

+ Python + FastAPI + PostgreSQL + WebSocket + vMix + Status +

------------------------------------------------------------------------- +> Система управления футбольными трансляциями с интеграцией в **vMix**, админ-панелью, live-обновлением матчей, генерацией данных для графики и WebSocket-взаимодействием с операторскими клиентами. -# 📌 Описание +--- -Проект состоит из нескольких ключевых частей: +## 📌 Что это за проект -- FastAPI сервер (админка + API) -- Scheduler (live-обновления матчей) -- Парсеры (игры, расписание, таблица) -- PostgreSQL база данных -- WebSocket сервер для vMix +Проект предназначен для подготовки и сопровождения футбольных трансляций. Он объединяет в одном приложении: ------------------------------------------------------------------------- +- администрирование матчей, команд, игроков, тренеров, судей и стадионов; +- работу с составами и формациями на матч; +- генерацию данных для эфирной графики в vMix; +- создание и выгрузку `.vmix`-проекта; +- приём и отправку команд в vMix-клиенты через WebSocket; +- фоновое отслеживание матчей и обновление live-данных; +- синхронизацию расписания, игроков, команд и турнирной таблицы. -# 🧱 Архитектура системы +По текущей структуре проект ориентирован на внутреннюю production/операторскую эксплуатацию, а не на публичный API-сервис. - ┌──────────────┐ - │ Scheduler │ - │ │ - │ matches_loop │ - │ standings │ - └──────┬───────┘ - │ - ┌──────────────┼──────────────┐ - │ │ │ - ▼ ▼ ▼ - live_match_worker parser_game parser_standings - │ - ▼ - Database - │ - ▼ - FastAPI - │ - ▼ - vMix +--- ------------------------------------------------------------------------- +## ✨ Основные возможности -# 🗄 Структура базы данных +### Админка и матч-центр +- авторизация администратора; +- список матчей и выбор матча для сессии; +- рабочее пространство матча; +- редактирование составов; +- редактирование формаций; +- управление судьями; +- управление событиями матча. -## Таблица: matches +### База футбольных сущностей +- игроки; +- команды; +- тренеры; +- судьи; +- стадионы; +- турнирная таблица; +- составы на матч; +- матчевые сессии для операторов. - Поле Тип Описание - ------------- ----------- ---------------------- - id int ID матча - external_id text ID матча на сайте - match_date timestamp дата и время - status text статус матча - home_score int счет хозяев - away_score int счет гостей - updated_at timestamp последнее обновление +### Интеграция с vMix +- генерация `.vmix`-проекта; +- формирование имени файла проекта; +- генерация JSON-данных для графики; +- публикация команд в подключённые vMix-клиенты; +- получение динамических значений из vMix API. ------------------------------------------------------------------------- +### Live-логика +- планировщик, который отслеживает матчи дня; +- запуск watcher-потоков перед матчем; +- опрос live-данных каждые 60 секунд; +- обновление статуса матча и счёта; +- обновление турнирной таблицы. -## Таблица: standings +### Парсинг и синхронизация +- парсинг матчей; +- парсинг игроков; +- парсинг расписания; +- парсинг таблицы; +- синхронизация сущностей в БД через сервисный слой. - Поле Тип Описание - ---------- ----- ---------- - team_id int команда - position int позиция - points int очки - played int сыграно +--- ------------------------------------------------------------------------- +## 🏗 Архитектура -## Таблица: match_lineup_players +Проект построен вокруг классической схемы: -- составы команд -- старт + запас +```text +Parsers -> Services -> Repositories -> PostgreSQL + | + +-> vMix JSON / .vmix generation + +-> FastAPI admin UI + +-> WebSocket command bus + +-> Scheduler / live workers +``` ------------------------------------------------------------------------- +### Слои проекта -## Таблица: match_events +#### `parsers/` +Получают данные из внешних источников. Используются для матчей, игроков, расписания, команд и таблиц. -- события матча (голы, карточки и т.д.) +#### `services/` +Содержат прикладную бизнес-логику: синхронизацию данных, авторизацию, подготовку JSON для vMix. ------------------------------------------------------------------------- +#### `repositories/` +Отвечают за доступ к PostgreSQL. Здесь собраны CRUD-операции и специализированные запросы. -# 🔄 Основные процессы +#### `templates/` + `static/` +HTML-шаблоны Jinja2, CSS, JS и статические файлы интерфейса. -## 1. Scheduler +#### `vmix/` +Логика генерации vMix-проекта и служебные функции, связанные с эфирной интеграцией. -Работает как отдельный процесс: +#### `scheduler.py` +Фоновый мониторинг матчей и обновление live-состояния. -### Каждую минуту: +#### `agent.py` +Отдельный клиент для связи между vMix и сервером через WebSocket. -- ищет матчи на сегодня -- запускает worker за 1 минуту до начала +--- -### Worker: +## 📁 Структура проекта -- раз в минуту: - - парсит сайт - - обновляет счет и статус -- останавливается при finished +```text +vmix/ +├── app.py # Основной FastAPI сервер +├── agent.py # WebSocket/vMix агент +├── db.py # Подключение к PostgreSQL +├── scheduler.py # Фоновый live scheduler +├── main.py # Demo/seed сценарий +├── deploy.sh # Скрипт деплоя +├── requirements.txt # Python зависимости +├── wfl.sql # Основная схема БД +│ +├── parsers/ +│ ├── parser_game.py # Парсинг/обновление данных матча +│ ├── parser_players.py # Парсинг игроков +│ ├── parser_schedule.py # Парсинг расписания +│ ├── parser_standings.py # Парсинг таблицы +│ └── parser_teams.py # Парсинг команд +│ +├── repositories/ +│ ├── audit_log_repository.py +│ ├── auth_repository.py +│ ├── coach_repository.py +│ ├── match_clock_repository.py +│ ├── match_coach_repository.py +│ ├── match_event_repository.py +│ ├── match_formation_repository.py +│ ├── match_lineup_repository.py +│ ├── match_referee_repository.py +│ ├── match_repository.py +│ ├── match_session_repository.py +│ ├── match_view_repository.py +│ ├── player_repository.py +│ ├── referee_repository.py +│ ├── stadium_repository.py +│ ├── standings_repository.py +│ ├── team_coach_repository.py +│ ├── team_repository.py +│ └── team_squad_repository.py +│ +├── services/ +│ ├── auth_service.py +│ ├── game_service.py +│ ├── players_service.py +│ ├── schedule_service.py +│ ├── standings_service.py +│ ├── teams_service.py +│ └── vmix_json_service.py +│ +├── sql/ +│ └── 001_auth.sql # Таблицы админ-пользователей и сессий +│ +├── static/ +│ ├── script.js +│ ├── styles.css +│ ├── smith.ico +│ └── images/ +│ └── vmix_icon.png +│ +├── templates/ +│ ├── login.html +│ ├── matches.html +│ ├── match_workspace.html +│ ├── download_vmix.html +│ ├── admin_db_index.html +│ ├── admin_db_players.html +│ ├── admin_db_player_edit.html +│ ├── admin_db_referees.html +│ ├── admin_db_referee_edit.html +│ ├── admin_db_coaches.html +│ ├── admin_db_coach_edit.html +│ ├── admin_db_stadiums.html +│ ├── admin_db_stadium_edit.html +│ ├── admin_db_teams.html +│ └── admin_db_team_edit.html +│ +└── vmix/ + ├── __init__.py + └── vmix_service.py # Генерация .vmix файла +``` ------------------------------------------------------------------------- +--- -## 2. Обновление турнирной таблицы +## 🧰 Технологии -- вызывается `parser_standings` -- обновляет standings в БД -- запускается раз в минуту +| Категория | Технологии | +|---|---| +| Backend | FastAPI | +| Валидация | Pydantic | +| Шаблоны | Jinja2 | +| База данных | PostgreSQL + psycopg2 | +| Парсинг | requests + BeautifulSoup4 | +| Realtime | WebSocket | +| Интеграция с эфиром | vMix API + XML | +| Конфигурация | python-dotenv | +| Дополнительно | numpy | ------------------------------------------------------------------------- +### Зависимости из `requirements.txt` -## 3. FastAPI +```txt +fastapi>=0.115,<1.0 +uvicorn[standard]>=0.30,<1.0 +pydantic>=2.0,<3.0 +jinja2>=3.1,<4.0 +python-multipart>=0.0.9,<1.0 +requests>=2.31,<3.0 +websockets>=12,<16 +beautifulsoup4>=4.12,<5.0 +psycopg2-binary>=2.9,<3.0 +python-dotenv>=1.0,<2.0 +numpy>=1.26,<3.0 +``` -Обеспечивает: +Также в файле указан дополнительный приватный индекс и пакет `nasio`, поэтому для полноценной установки в целевой среде может понадобиться доступ к внутреннему package registry. -- админку -- API для vMix -- WebSocket соединения +--- ------------------------------------------------------------------------- +## 🚀 Быстрый старт -# 📡 API Endpoints +## 1. Клонирование репозитория -## Основные +```bash +git clone +cd vmix +``` + +## 2. Установка зависимостей + +```bash +pip install -r requirements.txt +``` + +## 3. Настройка переменных окружения + +Создай файл `.env` в корне проекта: + +```env +DB_HOST=localhost +DB_PORT=5432 +DB_NAME=wfl_db +DB_USER=postgres +DB_PASSWORD=your_password +``` + +`db.py` загружает эти параметры через `python-dotenv` и использует их для подключения к PostgreSQL. + +## 4. Инициализация базы данных + +Сначала разверни основную схему: + +```bash +psql -U postgres -d wfl_db -f wfl.sql +``` + +Затем создай таблицы авторизации: + +```bash +psql -U postgres -d wfl_db -f sql/001_auth.sql +``` + +## 5. Создание администратора + +```bash +python scripts/create_admin.py +``` + +Скрипт запросит: +- `Username` +- `Password` + +После этого создаст запись в таблице `admin_users`. + +## 6. Запуск приложения + +```bash +uvicorn app:app --host 0.0.0.0 --port 8000 --reload +``` + +После запуска приложение будет доступно по адресу: + +```text +http://localhost:8000 +``` + +--- + +## 🔐 Авторизация + +В проекте используется сессионная авторизация для админки. + +### Что есть в коде +- таблица `admin_users`; +- таблица `auth_sessions`; +- проверка пароля в `services/auth_service.py`; +- cookie/session-based доступ к админским маршрутам; +- logout с отзывом сессии. + +### SQL-таблицы авторизации +Файл `sql/001_auth.sql` создаёт: +- `admin_users` +- `auth_sessions` +- индексы по токену, пользователю и активности + +### Скрипт создания пользователя +`python scripts/create_admin.py` + +--- + +## 🖥 Интерфейс и рабочие зоны + +### Основные страницы +- `/login` — вход администратора; +- `/` — редирект/входная точка; +- `/admin/matches` — список матчей для администратора; +- `/admin/session/{session_token}` — рабочее пространство матча; +- `/admin/session/{session_token}/download-vmix-page` — страница выгрузки проекта; +- `/admin/db` — индекс админского раздела БД. + +### Разделы админ-БД +- игроки; +- судьи; +- тренеры; +- стадионы; +- команды. + +Для каждой сущности есть минимум список и форма редактирования. + +--- + +## 📡 HTTP и WebSocket API + +Ниже — маршруты, которые реально определены в `app.py`. + +### Аутентификация + +| Метод | Маршрут | Назначение | +|---|---|---| +| GET | `/login` | страница входа | +| POST | `/login` | авторизация | +| POST | `/logout` | выход | + +### Матчи и сессии + +| Метод | Маршрут | Назначение | +|---|---|---| +| GET | `/admin/matches` | список матчей | +| GET | `/admin/matches/{match_id}/select` | выбор матча и создание/открытие сессии | +| GET | `/admin/session/{session_token}` | рабочее пространство матча | +| POST | `/admin/session/{session_token}/load-match-data` | загрузка/обновление данных матча | +| POST | `/admin/session/{session_token}/close` | закрытие сессии | +| GET | `/admin/session/{session_token}/download-vmix-page` | HTML-страница выгрузки vMix | +| GET | `/admin/session/{session_token}/download-vmix` | скачивание `.vmix` | + +### Формации и составы + +| Метод | Маршрут | Назначение | +|---|---|---| +| POST | `/admin/session/{session_token}/formations/apply` | применить preset формации к игрокам | +| POST | `/admin/session/{session_token}/formations/save` | сохранить формации | +| GET | `/admin/session/{session_token}/squad-editor-data` | получить данные редактора состава | +| POST | `/admin/session/{session_token}/squad-editor-save` | сохранить состав | +| POST | `/admin/session/{session_token}/referees/save` | сохранить судей на матч | + +### События матча + +| Метод | Маршрут | Назначение | +|---|---|---| +| GET | `/admin/session/{session_token}/events` | список событий | +| POST | `/admin/session/{session_token}/event` | создать событие | +| PUT | `/admin/session/{session_token}/event/{event_id}` | обновить событие | +| DELETE | `/admin/session/{session_token}/event/{event_id}` | удалить событие | +| DELETE | `/admin/session/{session_token}/events` | очистить все события | + +### Справочники БД + +| Метод | Маршрут | Назначение | +|---|---|---| +| GET | `/admin/db` | главная админ-БД | +| GET/POST | `/admin/db/players` / `/admin/db/players/{player_id}/edit` | список/редактирование игроков | +| GET/POST | `/admin/db/referees` / `/admin/db/referees/{referee_id}/edit` | список/редактирование судей | +| GET/POST | `/admin/db/coaches` / `/admin/db/coaches/{coach_id}/edit` | список/редактирование тренеров | +| GET/POST | `/admin/db/stadiums` / `/admin/db/stadiums/{stadium_id}/edit` | список/редактирование стадионов | +| GET/POST | `/admin/db/teams` / `/admin/db/teams/{team_id}/edit` | список/редактирование команд | + +### vMix JSON endpoints + +| Метод | Маршрут | Назначение | +|---|---|---| +| GET | `/vmix/session/{session_token}/home-lineup` | стартовый состав хозяев | +| GET | `/vmix/session/{session_token}/away-lineup` | стартовый состав гостей | +| GET | `/vmix/session/{session_token}/home-bench` | запасные хозяев | +| GET | `/vmix/session/{session_token}/away-bench` | запасные гостей | +| GET | `/vmix/session/{session_token}/info` | информация о матче | +| GET | `/vmix/session/{session_token}/standings` | турнирная таблица | +| GET | `/vmix/session/{session_token}/schedule` | расписание/тур | +| GET | `/vmix/session/{session_token}/home-formations` | формация хозяев | +| GET | `/vmix/session/{session_token}/away-formations` | формация гостей | +| GET | `/vmix/session/{session_token}/scoreboard` | данные для счётчика | +| GET | `/vmix/session/{session_token}/match-events` | данные по событиям матча | + +### Команды для vMix-клиентов + +| Метод | Маршрут | Назначение | +|---|---|---| +| POST | `/api/vmix/publish-command` | отправить команду в vMix-клиент(ы) | +| GET | `/api/vmix/clients` | список подключённых клиентов | +| WS | `/ws/vmix-client` | WebSocket-канал клиентов | + +--- + +## 🎬 Интеграция с vMix + +### Что делает сервер +Сервер: +- создаёт матчевые сессии; +- готовит JSON для графики; +- собирает и отдаёт `.vmix`-проект; +- отправляет команды в подключённые клиентские агенты. + +### Что делает агент `agent.py` +Агент — это отдельное приложение, которое запускается рядом с vMix и выполняет роль моста между сервером и локальным vMix API. + +#### В коде агента есть: +- `VMIX_API = "http://127.0.0.1:8088/api"` +- `WS_BASE = "wss://wfl.tvstart.ru/ws/vmix-client"` +- чтение XML-ответа vMix; +- извлечение `dynamic/value1`, `dynamic/value2` и других значений; +- регистрация клиента в WebSocket; +- reconnect-логика. + +### Как это работает в общем +1. Оператор открывает матч в админке. +2. Создаётся матчевая сессия с `session_token`. +3. Сервер отдаёт JSON и/или `.vmix`-файл. +4. Локальный агент подключается по WebSocket. +5. Сервер отправляет команды конкретному клиенту, группе или оператору. +6. Агент применяет команды в локальном vMix через HTTP API. + +--- + +## 🧾 Генерация JSON для графики + +Логика сосредоточена в `services/vmix_json_service.py`. + +### По коду видно, что сервис формирует: +- стартовые составы; +- запасных; +- информацию о матче; +- турнирную таблицу; +- расписание тура; +- формации команд; +- scoreboard-информацию; +- события матча; +- данные для показа авторов голов. + +### Особенности реализации +- строятся полные имена игроков; +- добавляются суффиксы капитана и вратаря; +- формируются пути к фотографиям игроков; +- используются логотипы команд и специальные варианты логотипов для некоторых клубов; +- матчевая информация собирается SQL-запросами по сессии. + +--- + +## 📦 Генерация `.vmix` проекта + +Файл `vmix/vmix_service.py` используется для: +- сборки бинарного содержимого vMix-проекта; +- генерации имени файла; +- выдачи файла пользователю через FastAPI. + +В `app.py` для этого используются: +- `build_vmix_project_bytes` +- `build_vmix_filename` + +Это означает, что оператор может открыть страницу сессии и скачать готовый `.vmix`-проект под конкретный матч. + +--- + +## ⏱ Scheduler и live-мониторинг + +`scheduler.py` — это фоновый процесс, который поднимается на старте приложения: + +```python +@app.on_event("startup") +def start_scheduler(): + import threading + thread = threading.Thread(target=run_scheduler, daemon=True) + thread.start() +``` + +### Ключевые интервалы + +```python +MATCH_START_LEAD_MINUTES = 1 +LIVE_MATCH_POLL_SECONDS = 60 +MATCHES_LOOP_SECONDS = 60 +STANDINGS_LOOP_SECONDS = 60 +WORKER_ERROR_RETRY_SECONDS = 30 +WORKER_MAX_ERRORS_IN_ROW = 20 +``` + +### Что делает scheduler +- получает матчи на сегодня из БД; +- определяет, какие матчи уже пора мониторить; +- запускает отдельные worker-потоки; +- обновляет status/home_score/away_score в таблице матчей; +- вызывает обновление турнирной таблицы; +- ведёт реестр активных worker'ов. + +### Источник live-данных +По текущему коду live-страница матча запрашивается с: + +```text +https://wfl.rfs.ru/match/{match_id} +``` + +HTML разбирается через BeautifulSoup. + +### Важное замечание +В `fetch_match_live_data()` есть незавершённая часть: функция частично реализована и в конце всё ещё содержит `NotImplementedError`. То есть scheduler уже встроен, но live-парсинг требует аккуратной доработки, чтобы считать его полностью production-ready. + +--- + +## 🗄 Репозитории и доменные сущности + +По составу `repositories/` проект работает со следующими сущностями: + +### Пользователи и аудит +- `auth_repository.py` +- `audit_log_repository.py` ### Матчи +- `match_repository.py` +- `match_session_repository.py` +- `match_view_repository.py` +- `match_clock_repository.py` +- `match_event_repository.py` -- GET /admin/matches -- GET /admin/session/{session_token} +### Составы и формации +- `match_lineup_repository.py` +- `match_formation_repository.py` +- `team_squad_repository.py` ------------------------------------------------------------------------- +### Официальные лица и стадионы +- `referee_repository.py` +- `match_referee_repository.py` +- `coach_repository.py` +- `match_coach_repository.py` +- `team_coach_repository.py` +- `stadium_repository.py` -### vMix +### Команды, игроки, таблица +- `team_repository.py` +- `player_repository.py` +- `standings_repository.py` -- GET /vmix/session/{session_token}/info -- GET /vmix/session/{session_token}/standings -- GET /vmix/session/{session_token}/schedule -- GET /vmix/session/{session_token}/scoreboard +Это хороший признак разделённой архитектуры: доступ к данным отделён от HTTP-слоя и от прикладной логики. ------------------------------------------------------------------------- +--- -### WebSocket +## 🔄 Сервисы синхронизации - /ws/vmix-client +В `services/` есть отдельные сервисы: -Функции: - регистрация клиентов - heartbeat - отправка команд +- `teams_service.py` +- `schedule_service.py` +- `players_service.py` +- `standings_service.py` +- `game_service.py` +- `auth_service.py` +- `vmix_json_service.py` ------------------------------------------------------------------------- +### Demo-режим +`main.py` показывает, как можно программно наполнить систему тестовыми данными: -# ⚙️ Запуск проекта +- создаются 2 команды; +- создаётся матч; +- добавляются игроки; +- заполняется турнирная таблица. -## 1. Установка +Запуск: - pip install -r requirements.txt +```bash +python main.py +``` ------------------------------------------------------------------------- +Это удобно для первичной проверки БД и шаблонного сценария разработки. -## 2. Настройка БД +--- -Отредактировать: +## 🧪 Полезные команды - db.py +### Проверка подключения к БД ------------------------------------------------------------------------- +```bash +python db.py +``` -## 3. Запуск +### Создание администратора -### API +```bash +python scripts/create_admin.py +``` - uvicorn app:app --reload +### Demo-наполнение -### Scheduler +```bash +python main.py +``` - python scheduler.py +### Запуск сервера ------------------------------------------------------------------------- +```bash +uvicorn app:app --reload +``` -# ❗ ВАЖНО +--- -Scheduler должен запускаться отдельно. +## 🖼 Скриншоты -НЕЛЬЗЯ: +Ниже заготовки под реальные скриншоты интерфейса. Когда будут реальные изображения, просто положи их в репозиторий и обнови пути. - run_scheduler() +```md +![Login](docs/screens/login.png) +![Matches](docs/screens/matches.png) +![Workspace](docs/screens/workspace.png) +![Database](docs/screens/database.png) +``` -внутри FastAPI. +--- ------------------------------------------------------------------------- +## ⚠️ Ограничения и важные замечания -# 🔧 Что нужно реализовать +### 1. Документация OpenAPI отключена +В `app.py` явно выключены: +- `/docs` +- `/redoc` +- `/openapi.json` -## fetch_match_live_data() +Это нормально для внутреннего production-режима, но неудобно для внешних интеграций. - def fetch_match_live_data(match_row): - return { - "status": "live", - "home_score": 1, - "away_score": 0 - } +### 2. Live scheduler требует доработки +`fetch_match_live_data()` ещё не завершена до конца и сейчас выглядит как заготовка с частичной логикой. ------------------------------------------------------------------------- +### 3. Есть Windows-специфичные элементы +В JSON-сервисе и агенте встречаются Windows-пути и логика работы с иконкой консоли. Это значит, что часть инфраструктуры ориентирована на Windows-машину оператора. -# 🚀 Рекомендации +### 4. Есть внешняя зависимость от приватного Python registry +В `requirements.txt` указан `--extra-index-url`, поэтому разворачивание в другой среде может потребовать доступов. -- запускать scheduler отдельно -- использовать 1 worker для API -- добавить логирование -- обрабатывать ошибки парсинга +### 5. Есть жёстко заданные интеграционные значения +Например: +- `http://127.0.0.1:8088/api` +- `wss://wfl.tvstart.ru/ws/vmix-client` ------------------------------------------------------------------------- +Для production лучше вынести их в `.env`. -# 📌 Dev режим +--- - uvicorn app:app --reload - python scheduler.py +## 🔮 Что можно улучшить ------------------------------------------------------------------------- +### Инфраструктура +- добавить Dockerfile и `docker-compose.yml`; +- вынести конфигурацию целиком в `.env`; +- добавить healthcheck и monitoring; +- настроить CI/CD. -# 🧠 Production +### Backend +- включить структурированное логирование; +- покрыть ключевые места тестами; +- заменить часть threading-логики на более управляемый background orchestration; +- валидацию live-парсеров сделать устойчивее. -- API отдельно -- Scheduler отдельно -- supervisor / systemd +### Безопасность +- ограничить rate limit для логина; +- добавить CSRF-защиту, если нужна; +- вынести секреты и URL в окружение; +- расширить аудит действий администратора. ------------------------------------------------------------------------- +### API и DX +- вернуть внутреннюю OpenAPI-документацию под флагом окружения; +- добавить Postman/Insomnia collection; +- оформить контракт JSON-ответов для графики. -# 📬 Контакты +### UI/UX +- добавить больше навигации в админке; +- улучшить визуальный статус live-сессий; +- добавить быстрые действия в матч-центре. -Для доработок и улучшений --- пиши 👍 +--- + +## 🛠 Пример локального сценария запуска + +```bash +# 1. установить зависимости +pip install -r requirements.txt + +# 2. создать .env +cp .env.example .env # если появится шаблон + +# 3. поднять БД и применить SQL +psql -U postgres -d wfl_db -f wfl.sql +psql -U postgres -d wfl_db -f sql/001_auth.sql + +# 4. создать администратора +python scripts/create_admin.py + +# 5. при необходимости заполнить демо-данными +python main.py + +# 6. запустить сервер +uvicorn app:app --host 0.0.0.0 --port 8000 --reload +``` + +--- + +## 🤝 Вклад в проект + +Если проект будет развиваться дальше, рекомендуется принять минимальные правила contribution: + +1. отдельная ветка на каждую фичу; +2. PR с описанием изменений; +3. проверка SQL-миграций перед merge; +4. ручная проверка vMix-сценария и матчевого workflow. + +--- + +## 📄 Лицензия + +В текущем архиве лицензия отдельно не обнаружена. + +Если проект внутренний — можно оставить private/internal use only. +Если репозиторий будет публичным — добавь подходящую лицензию, например MIT, Apache-2.0 или другую нужную команде. + +--- + +## 👨‍💻 Итог + +Этот проект — это не просто CRUD-приложение, а полноценный операторский инструмент для футбольной трансляции: + +- FastAPI-сервер с HTML-интерфейсом; +- PostgreSQL как основной источник данных; +- сессионная админ-авторизация; +- матчевые рабочие сессии; +- составы, формации, события и судьи; +- JSON и `.vmix` для эфирной графики; +- WebSocket-мост для операторских клиентов; +- scheduler для live-матчей и обновления данных. + +Если нужно, следующим сообщением я могу так же сделать ещё и: + +- `README_EN.md` на английском; +- `docs/API.md` с описанием всех маршрутов; +- `docker-compose.yml` для локального запуска; +- `.env.example`; +- более «маркетинговую» GitHub-версию с centered hero, anchors и navigation block. diff --git a/static/smith.ico b/static/smith.ico index 2dbfba1..7ca3309 100644 Binary files a/static/smith.ico and b/static/smith.ico differ diff --git a/static/smith_full.ico b/static/smith_full.ico new file mode 100644 index 0000000..2dbfba1 Binary files /dev/null and b/static/smith_full.ico differ diff --git a/vmix.zip b/vmix.zip new file mode 100644 index 0000000..7faa402 Binary files /dev/null and b/vmix.zip differ