Стилистическое редактирование

This commit is contained in:
2026-04-16 13:35:35 +03:00
parent fbb0082d0f
commit 9755da7616

488
README.md
View File

@@ -1,53 +1,56 @@
# AE Anons - Automated After Effects Announcement Generator # AE Anons - Автоматизированный генератор спортивных анонсов After Effects
Automated pipeline for generating sports announcements using After Effects templates via Nexrender, with data sourced from Synology Office spreadsheets. Автоматизированная система для создания спортивных анонсов с использованием шаблонов After Effects через Nexrender, с данными из электронных таблиц Synology Office.
## Overview ## Обзор
AE Anons automates the creation of broadcast announcement videos by: AE Anons автоматизирует создание видеороликов спортивных анонсов путем:
1. Connecting to Synology NAS to retrieve schedule data from Office spreadsheets (.osheet) 1. Подключения к NAS Synology для получения данных расписания из файлов офисных таблиц (.osheet)
2. Parsing Excel data containing sports events, teams, channels and timing information 2. Парсинга Excel данных, содержащих информацию о спортивных событиях, командах, каналах и временных интервалах
3. Generating Nexrender jobs with appropriate templates and assets 3. Генерации заданий Nexrender с соответствующими шаблонами и ресурсами
4. Monitoring render completion and managing output files 4. Мониторинга завершения рендеринга и управления выходными файлами
## Features ## Особенности
- **Synology Integration**: Seamless authentication and file retrieval from Synology NAS - **Интеграция с Synology**: Плавная аутентификация и загрузка файлов с NAS Synology
- **Office Spreadsheet Export**: Automatic conversion of .osheet files to Excel format - **Экспорт офисных таблиц**: Автоматическое преобразование файлов .osheet в формат Excel
- **Flexible Data Parsing**: Dynamic sheet parsing with header detection - **Гибкий парсинг данных**: Динамический парсинг листов с обнаружением заголовков
- **Multi-variant Generation**: Creates "Today", "Tomorrow" and dated variants for each announcement - **Множественная генерация вариантов**: Создание "Сегодня", "Завтра" и датированных версий для каждого анонса
- **Smart Logo Management**: Automatic logo resolution and scaling based on team/sport associations - **Умное управление логотипами**: Автоматическое разрешение и масштабирование логотипов на основе связей команд/спорта
- **Nexrender Job Orchestration**: Automated job submission, monitoring and cleanup - **Оркестрация заданий Nexrender**: Автоматическая отправка, мониторинг и очистка заданий
- **Professional Logging**: Structured logging with configurable verbosity levels - **Профессиональное логирование**: Структурированный журнал с возможностью настройки уровня детализации
- **Environment-based Configuration**: All settings managed via `.env` file - **Конфигурация через переменные окружения**: Все параметры управляются через файл `.env`
## Prerequisites ## Предварительные требования
- Rust 1.70 or higher - Rust 1.70 или выше
- Access to Synology NAS with File Station and Office enabled - Доступ к NAS Synology с включенными File Station и Office
- Nexrender server instance - Экземпляр сервера Nexrender
- After Effects templates configured on render nodes - Шаблоны After Effects, настроенные на узлах рендеринга (формат Adobe After Effects 2024 .aepx)
## Installation ## Установка
### 1. Clone the Repository ### 1. Клонирование репозитория
```bash ```bash
git clone https://github.com/your-org/ae_anons.git git clone https://github.com/your-org/ae_anons.git
cd ae_anons cd ae_anons
```
2. Build the Project ### 2. Сборка проекта
bash
```bash
cargo build --release cargo build --release
```
The binary will be available at target/release/ae_anons Бинарный файл будет доступен по пути `target/release/ae_anons`
3. Configure Environment
Create a .env file in the project root: ### 3. Настройка окружения
env
Создайте файл `.env` в корне проекта:
```env
NAS_FQDN=https://your-synology-nas.example.com:5001 NAS_FQDN=https://your-synology-nas.example.com:5001
NAS_USER=service_account NAS_USER=service_account
NAS_PASS=secure_password NAS_PASS=secure_password
@@ -55,292 +58,291 @@ NAS_FILE=/Team Folder/Broadcast/Auto_Anons/schedule.osheet
NEXRENDER_API_URL=http://nexrender-server:3000/api/v1/jobs NEXRENDER_API_URL=http://nexrender-server:3000/api/v1/jobs
OUTPUT_FOLDER=//file-server/edit/Auto_Anons OUTPUT_FOLDER=//file-server/edit/Auto_Anons
RUST_LOG=info RUST_LOG=info
```
See Configuration section for detailed options. См. раздел Конфигурация для подробной информации.
Usage
Basic Execution
bash
# Run with default configuration ## Использование
### Базовое выполнение
```bash
# Запуск с настройками по умолчанию
./target/release/ae_anons ./target/release/ae_anons
# Run with custom log level # Запуск с пользовательским уровнем логирования
RUST_LOG=debug ./target/release/ae_anons RUST_LOG=debug ./target/release/ae_anons
```
# Run with specific .env file ## Уровни логирования
dotenv -f /path/to/.env.production run ./target/release/ae_anons
Development Mode Управляйте детализацией вывода через переменную окружения `RUST_LOG`:
bash
cargo run - **error** - Только критические ошибки
- **warn** - Предупреждения и ошибки
Logging Levels - **info** - Общие операционные сообщения (по умолчанию)
- **debug** - Детальная информация о процессе обработки
Control output verbosity via RUST_LOG environment variable: - **trace** - Полное отладочное логирование с деталями API вызовов
error - Only critical errors
warn - Warnings and errors
info - General operational messages (default)
debug - Detailed processing information
trace - Full debugging with API call details
bash
```bash
RUST_LOG=debug cargo run RUST_LOG=debug cargo run
```
Configuration ## Конфигурация
Environment Variables
Variable Required Default Description
NAS_FQDN Yes - Synology NAS URL with protocol and port
NAS_USER Yes - Synology account username
NAS_PASS Yes - Synology account password
NAS_FILE Yes - Full path to .osheet file on NAS
NEXRENDER_API_URL
OUTPUT_FOLDER Network path for rendered videos
RUST_LOG No info Logging verbosity level
Spreadsheet Structure
The input Excel file (converted from .osheet) must contain the following sheets: ### Переменные окружения
Start Sheet
Main data source for announcements generation. | Переменная | Обязательна | Описание |
Column Description Example |------------|-------------|----------|
STATE Processing flag FALSE (active), TRUE (skip) | `NAS_FQDN` | Да | URL NAS Synology с протоколом и портом |
SPORT Sport category Футбол, Хоккей | `NAS_USER` | Да | Имя пользователя учетной записи Synology |
LEAGUE League name Премьер-лига | `NAS_PASS` | Да | Пароль учетной записи Synology |
TEAM A Home team Спартак#FC Spartak#150 | `NAS_FILE` | Да | Полный путь к файлу .osheet на NAS |
TEAM B Away team Зенит#FC Zenit#150 | `NEXRENDER_API_URL` | Да | Конечная точка API сервера Nexrender |
CHANEL Broadcast channel Матч ТВ | `OUTPUT_FOLDER` | Да | Сетевой путь для рендеренных видео |
TIME Event time 19:30 | `RUST_LOG` | Нет | Уровень детализации логирования (по умолчанию: info) |
DATA Event date 15.04.2026
SPORT Sheet
Mapping between sports and their video pack templates. ## Структура электронной таблицы
Column Description
SPORT Sport identifier
LINK Path to video pack file
TEAMS Sheet
Team logo registry with sport associations. Файл Excel должен содержать следующие листы со специфичными структурами:
Column Description
TEAM Team identifier
SPORT Associated sport
LINK Path to team logo file
CHANELL Sheet
Channel logo mappings. ### Лист "SPORT"
Column Description
CHANELL Channel name
LINK Path to channel logo file
Team Name Format
Team names can include resolution hints using hash separators: Связывает названия видов спорта с соответствующими видео пакетами.
text
Display Name#Search Key#Target Size | SPORT | LINK |
|-------|------|
| Без оформления | \\server\share\path\to\null.mov |
| Футбол | \\server\share\path\to\football_pack.mov |
| Волейбол | \\server\share\path\to\volleyball_pack.mov |
Example: Спартак#FC Spartak#150 ### Лист "TEAMS"
Спартак - Display name in graphics Сопоставляет имена команд с их видами спорта и логотипами. Колонка SPORT заполняется из выпадающего списка (заполнена из листа SPORT).
FC Spartak - Key for logo lookup Если несколько команд в одном виде спорта имеют одинаковые названия, но разные логотипы, используется разделитель хеш # для уникальной идентификации.
150 - Target size in pixels for logo scaling | TEAM | SPORT | LINK |
|------|-------|------|
| Галатасарай#Turki | Футбол | \\server\share\path\to\galatasaray_football.png |
| Галатасарай | Волейбол | \\server\share\path\to\galatasaray_volleyball.png |
| Галатасарай#UCL | Волейбол | \\server\share\path\to\galatasaray_ucl.png |
| Сомбатей##400 | Футбол | \\server\share\path\to\szombathely.png |
Output Files ### Лист "CHANELL"
JSON Exports
During processing, JSON representations of the workbook are saved: Сопоставляет названия каналов с их логотипами. Поля заполняются вручную без выпадающих списков.
{filename}_workbook.json - Complete workbook structure | CHANEL | LINK |
|--------|------|
| КАНАЛ | \\server\share\path\to\channel_logo.png |
| TRIUMPH | \\server\share\path\to\triumph_logo.png |
{filename}_{SheetName}.json - Individual sheet data ### Лист "Start"
Rendered Videos Основной источник данных для генерации анонсов. Большинство полей заполняются из выпадающих списков, основанных на других листах.
Output videos are saved to OUTPUT_FOLDER with naming pattern: Обязательные колонки: DATA, TIME, CHANEL, SPORT, LEAGUE, TEAM A, TEAM B
text
**Примечание**: Колонка LEAGUE обязательна для заполнения, но не имеет выпадающего списка. Проверка орфографии и опечаток отсутствует!
| STATE | TRIPPLE | DATA | TIME | SPORT | LEAGUE | CHANEL | TEAM A | TEAM B |
|-------|---------|------|------|-------|--------|--------|--------|--------|
| TRUE | TRUE | 27.2.2026 | 23:40 | Футбол | Чемпионат Португалии | START | Спортинг#ll#550 | Эшторил#ll#550 |
| FALSE | TRUE | 28.2.2026 | 12:55 | Волейбол | Чемпионат Турции. Женщины | TRIUMPH | Бешикташ | Галатасарай#Turki |
### Формат имен команд
Имена команд поддерживают два типа разделителей хэш #:
1. **Первый хеш**: Уникальный идентификатор для команд с одинаковыми названиями в одном виде спорта, или одинаковым названием в разных видах спорта.
Примеры:
- `Динамо#Футбол`, `Динамо#Волейбол` - Одно название разный вид спорта
- `Спартак#ЖенскийФ`, `Спартак#МужскойФ` Одно название _разный_ вид спорта
1. **Второй хеш**: Целевой размер в пикселях для масштабирования логотипа
Формат: `DisplayName#UniqueID#TargetSize`
Примеры:
- `Галатасарай#Turki` - только уникальный идентификатор
- `Сомбатей##400` - только целевой размер (обратите внимание на двойной хеш)
- `Спортинг#ll#550` - оба идентификатор и целевой размер
**Важно**: Обрабатывается **только второй хеш** для масштабирования логотипа. Если уникальный идентификатор не требуется, используйте двойной хеш ## перед целевым размером.
## Выходные файлы
### Экспорт JSON
Во время обработки сохраняются представления таблицы в формате JSON:
- `{filename}_workbook.json` - Полная структура книги
- `{filename}_{SheetName}.json` - Данные отдельного листа
### Рендеренные видео
Рендерные видео сохраняются в `OUTPUT_FOLDER` по следующему шаблону именования:
```
YYYYMMDD_Sport_League_TeamA_TeamB_Channel[_Variant].mp4 YYYYMMDD_Sport_League_TeamA_TeamB_Channel[_Variant].mp4
```
Examples: Имена файлов транслитерируются в латиницу. Примеры:
20260415_Футбол_Премьер-лига_Спартак_Зенит_Матч-ТВ.mp4 (Base version) - `20260228_Volleyball_Championship-Turkey-Women_Beşiktaş_Galatasaray_TRIUMPH.mp4`
- `20260228_Volleyball_Championship-Turkey-Women_Beşiktaş_Galatasaray_TRIUMPH_Today.mp4`
- `20260228_Volleyball_Championship-Turkey-Women_Beşiktaş_Galatasaray_TRIUMPH_Tomorrow.mp4`
20260415_Футбол_Премьер-лига_Спартак_Зенит_Матч-ТВ_Today.mp4 ## Рабочий процесс
20260415_Футбол_Премьер-лига_Спартак_Зенит_Матч-ТВ_Tomorrow.mp4 1. **Аутентификация**: Подключение к NAS Synology с использованием предоставленных учетных данных
2. **Получение файла**: Поиск и экспорт указанного файла .osheet в Excel
3. **Парсинг данных**: Чтение всех листов и структурирование данных
4. **Разрешение ресурсов**: Сопоставление видов спорта, команд и каналов с визуальными элементами
5. **Генерация заданий**: Создание заданий Nexrender для каждой активной строки с вариантами
6. **Очистка**: Удаление завершенных/неудачных заданий из предыдущих запусков
7. **Отправка**: Отправка заданий на API Nexrender
8. **Мониторинг**: Слежение за прогрессом выполнения до завершения
9. **Завершение сеанса**: Закрытие сессии Synology
Workflow ## Требования к шаблонам After Effects
Authentication: Connects to Synology NAS using provided credentials Шаблоны должны быть предварительно настроены на узлах рендеринга со следующими именами слоев:
File Retrieval: Locates and exports the specified .osheet file as Excel ### Типы шаблонов
Data Parsing: Reads all sheets and structures the data | Файл шаблона | Назначение |
|--------------|------------|
| `PackShot_DOUBLE.aepx` | Сопоставление с двумя командами |
| `PackShot_SINGLE.aepx` | Анонсы для одной команды |
Asset Resolution: Matches sports, teams and channels with their visual assets ### Обязательные слои
Job Generation: Creates Nexrender jobs for each active row with variants | Имя слоя | Тип | Описание |
|----------|-----|----------|
| DATA | Text | Отображение даты (автоматически подстраивается) |
| TIME / TIME_H / TIME_M | Text | Отображение времени |
| LEAGUE | Text | Название лиги |
| SPORT | Text | Категория спорта |
| TEAMS | Text | Скомбинированные имена команд |
| TEAM_A_LOGO | Image | Логотип домашней команды |
| TEAM_B_LOGO | Image | Логотип гостевой команды |
| CHANEL | Image | Логотип канала |
| TOP | Video | Наложение видео оформления |
Cleanup: Removes completed/failed jobs from previous runs ### Настройки композиции
Submission: Sends jobs to Nexrender API - Имя композиции: `pack`
- Выходной модуль: `Start_h264`
- Формат вывода: `mp4`
- Формат проекта: Adobe After Effects 2024 .aepx
Monitoring: Tracks job progress until completion ## Устранение неисправностей
Logout: Terminates Synology session ### Частые проблемы
After Effects Template Requirements **Ошибка подключения к NAS**
Templates must be pre-configured on render nodes with specific layer names: - Проверьте, что `NAS_FQDN` включает протокол и порт (например, `https://nas.example.com:5001`)
Template Types - Проверьте сетевую связность с NAS
Template File Use Case - Убедитесь, что сервисы File Station и Office включены
Double Team PackShot_DOUBLE.aepx Matches with two teams
Single Team PackShot_SINGLE.aepx Single team announcements
Required Layers
Layer Name Type Description
DATA Text Date display (auto-adjusted)
TIME / TIME_H / TIME_M Text Time display
LEAGUE Text League name
SPORT Text Sport category
TEAMS Text Combined team names
TEAM_A_LOGO Image Home team logo
TEAM_B_LOGO Image Away team logo
CHANELL Image Channel logo
TOP Video Sport pack overlay
Composition Settings
Composition name: pack **Файл не найден**
Output module: Start_h264 - Убедитесь, что путь в `NAS_FILE` точно соответствует пути в Synology Drive
- Путь должен начинаться с `/Team Folder/` для рабочих папок
- Проверьте права доступа к файлу для учетной записи сервиса
Output format: mp4 **Ошибка отправки задания Nexrender**
Troubleshooting - Подтвердите доступность сервера Nexrender
Common Issues - Убедитесь, что `NEXRENDER_API_URL` правильный
Connection to NAS failed - Проверьте существование файлов шаблонов на узлах рендеринга
Verify NAS_FQDN includes protocol and port (e.g., https://nas.example.com:5001) ### Режим отладки
Check network connectivity to NAS Включите подробное логирование для детального анализа:
Ensure File Station and Office services are enabled
File not found
Verify the path in NAS_FILE exactly matches the Synology Drive path
Path should start with /Team Folder/ for team folders
Check file permissions for the service account
Nexrender job submission fails
Confirm Nexrender server is accessible
Verify NEXRENDER_API_URL is correct
Check that template files exist on render nodes
Debug Mode
Enable debug logging for detailed troubleshooting:
bash
```bash
RUST_LOG=debug ./target/release/ae_anons RUST_LOG=debug ./target/release/ae_anons
```
This will output: Это выведет:
API request/response details - Детали API запросов/ответов
- Информацию о парсинге листов
- Детали создания заданий
- Процесс разрешения ресурсов
Sheet parsing information ## Возможные ограничения по производительности
Job creation details - **Большие таблицы**: Ограничение обработки до 10,000 строк на лист
- **Задержка сети**: Загрузка файлов с NAS может занимать время для больших файлов
- **Параллельные задания**: Nexrender управляет очередью заданий внутренне
- **Использование памяти**: Парсинг Excel сохраняет всю книгу в памяти
Asset resolution process ## Примечания по безопасности
Performance Considerations - Храните учетные данные только в файле `.env` (исключен из git)
- Используйте специальные аккаунты с минимально необходимыми правами
- Сессии Synology завершаются после выполнения
- HTTPS рекомендуется для подключений NAS в продакшене
Large Spreadsheets: Processing limited to 10,000 rows per sheet ## Разработка
Network Latency: File downloads from NAS may take time for large files ### Структура кода
Concurrent Jobs: Nexrender handles job queuing internally
Memory Usage: Excel parsing keeps entire workbook in memory
Security Notes
Store credentials only in .env file (excluded from git)
Use dedicated service accounts with minimal required permissions
Synology sessions are properly terminated after execution
HTTPS recommended for NAS connections in production
Development
Running Tests
bash
cargo test
Code Structure
text
```
src/ src/
├── main.rs # Application entry point and orchestration ├── main.rs # Точка входа и оркестрация приложения
├── config.rs # Configuration management ├── config.rs # Управление конфигурацией
├── nexrender.rs # Nexrender job generation and structures ├── nexrender.rs # Генерация заданий Nexrender и структура данных
└── synology.rs # Synology API client └── synology.rs # Клиент API Synology
```
Adding New Features ### Планируемые новые возможностеи
Extend JobData in nexrender.rs for new data fields 1. Расширь `JobData` в `nexrender.rs` для новых полей данных
2. Обновить логику парсинга листов при необходимости добавления новых колонок
3. Добавьть соответствующие слои After Effects в шаблоны
4. Обновите метод `to_nexrender_job()` с новыми сопоставлениями ресурсов
Update sheet parsing logic if new columns are required ## Зависимости
Add corresponding After Effects layers to templates | Crate | Версия | Назначение |
|-------|--------|------------|
| reqwest | 0.12 | HTTP клиент для коммуникации API |
| serde / serde_json | 1.0 | Сериализация JSON |
| calamine | 0.26 | Парсинг файлов Excel |
| chrono | 0.4 | Обработка дат и времени |
| tokio | 1.0 | Асинхронная среда выполнения |
| dotenv | 0.15 | Конфигурация через переменные окружения |
| log / env_logger | 0.11 | Инфраструктура логирования |
| thiserror | 2.0 | Определение типов ошибок |
| anyhow | 1.0 | Обработка ошибок |
Update to_nexrender_job() method with new asset mappings ## Лицензия
Dependencies Ещё не выбранна
Crate Version Purpose
reqwest 0.12 HTTP client for API communication
serde / serde_json 1.0 JSON serialization
calamine 0.26 Excel file parsing
chrono 0.4 Date/time handling
tokio 1.0 Async runtime
dotenv 0.15 Environment configuration
log / env_logger 0.4 Logging infrastructure
thiserror 2.0 Error type definitions
anyhow 1.0 Error handling
License
[Specify your license here] ## Поддержка
Support
For issues and feature requests, please contact: Для вопросов и запросов функций обращайтесь:
[Your Team Email] - <a.barabanov@tvstart.ru>
- [README.md](https://git.tvstart.ru/lexx/AE_Anons)
[Internal Documentation Link] ## История изменений
Changelog ### v0.1.0
v0.1.0
Initial release - Первый выпуск
- Интеграция с Synology Office
Synology Office integration - Базовая генерация заданий Nexrender
- Парсинг Excel с динамическим обнаружением листов
Basic Nexrender job generation - Создание множественных вариантов
- Автоматические настройки размера шрифта и позиции
Excel parsing with dynamic sheet detection - Умное масштабирование логотипов по целевому размеру
Multi-variant job creation