23 KiB
AE Anons - Автоматизированный генератор спортивных анонсов в After Effects
Автоматизированная система для создания спортивных анонсов с использованием шаблонов After Effects через Nexrender, с данными из электронных таблиц Synology Office.
Обзор
AE Anons — это CLI-утилита на Rust, которая выступает как интеллектуальный генератор заданий для Nexrender — опенсорсного оркестратора рендеринга After Effects (лицензия MIT).
- Подключения к NAS Synology для получения данных расписания из файлов офисных таблиц (.osheet)
- Парсинга Excel данных, содержащих информацию о спортивных событиях, командах, каналах и временных интервалах
- Генерации заданий Nexrender с соответствующими шаблонами и ресурсами
- Мониторинга завершения рендеринга и управления выходными файлами
Особенности
- Интеграция с Synology: Аутентификация и загрузка файлов с NAS Synology
- Экспорт офисных таблиц: Автоматическое преобразование файлов .osheet в формат Excel
- Гибкий парсинг данных: Динамический парсинг листов с обнаружением заголовков
- Множественная генерация вариантов: Создание "Сегодня", "Завтра" и датированных версий для каждого анонса
- Умное управление логотипами: Автоматическое разрешение и масштабирование логотипов на основе хэштегов
#в имени команды - Оркестрация заданий Nexrender: Автоматическая отправка, мониторинг и очистка заданий
- Профессиональное логирование: Структурированный журнал с возможностью настройки уровня детализации
- Конфигурация через переменные окружения: Все параметры управляются через файл
.env
Предварительные требования
- Rust 1.70 или выше
- Доступ к NAS Synology с установленными и включенными пакетами File Station и Office
- Экземпляр server и worker(не менее одного) Nexrender
- Шаблоны After Effects, настроенные на worker (формат Adobe After Effects 2024 .aepx)
Установка
1. Клонирование репозитория
git clone https://git.tvstart.ru/lexx/AE_Anons.git
cd ae_anons
2. Сборка проекта
cargo build --release
Бинарный файл будет доступен по пути target/release/ae_anons
3. Настройка окружения
Скопируйте пример конфигурации и заполните своими данными:
cp .env.example .env
Затем отредактируйте файл .env:
# Synology NAS
NAS_FQDN=https://your-nas.domain.com
NAS_USER=your_username
NAS_PASS=your_password
NAS_FILE=/team-folders/path/to/your/file.osheet
# Nexrender
NEXRENDER_API_URL=http://your-nexrender-server:3000/api/v1/jobs
OUTPUT_FOLDER=//your-storage/path/to/output
# Logging
RUST_LOG=info
См. раздел Конфигурация для подробной информации.
Использование
Базовое выполнение
# Запуск с настройками по умолчанию
./target/release/ae_anons
# Запуск с пользовательским уровнем логирования
RUST_LOG=debug ./target/release/ae_anons
Уровни логирования
Управляйте детализацией вывода через переменную окружения RUST_LOG:
- error - Только критические ошибки
- warn - Предупреждения и ошибки
- info - Общие операционные сообщения (по умолчанию)
- debug - Детальная информация о процессе обработки
- trace - Полное отладочное логирование с деталями API вызовов
RUST_LOG=debug cargo run
Конфигурация
Переменные окружения
| Переменная | Обязательна | Описание |
|---|---|---|
NAS_FQDN |
Да | URL NAS Synology с протоколом и портом |
NAS_USER |
Да | Имя пользователя учетной записи Synology |
NAS_PASS |
Да | Пароль учетной записи Synology |
NAS_FILE |
Да | Полный путь к файлу .osheet на NAS |
NEXRENDER_API_URL |
Да | Конечная точка API сервера Nexrender |
OUTPUT_FOLDER |
Да | Сетевой путь для рендеренных видео |
RUST_LOG |
Нет | Уровень детализации логирования (по умолчанию: info) |
TEMPLATE_DOUBLE_SRC |
Да | Путь к AEP-шаблону для двух команд |
TEMPLATE_SINGLE_SRC |
Да | Путь к AEP-шаблону для одной команды |
TEMPLATE_COMPOSITION |
Да | Имя композиции в проекте AE (например, main) |
TEMPLATE_OUTPUT_MODULE |
Да | Имя модуля вывода в AE (например, h264) |
TEMPLATE_OUTPUT_EXT |
Да | Расширение выходного файла (например, mp4) |
Пример файла .env
# Synology NAS
NAS_FQDN="https://your-nas.example.com"
NAS_USER="your_username"
NAS_PASS="your_password"
NAS_FILE="/Team Folder/path/to/file.osheet"
#Loging
RUST_LOG="info"
# Nexrender
NEXRENDER_API_URL="http://nexrender-server:3050/api/v1/jobs"
OUTPUT_FOLDER="/path/to/output"
# After Effects Templates
TEMPLATE_DOUBLE_SRC="file:///path/to/double_team_template.aepx"
TEMPLATE_SINGLE_SRC="file:///path/to/single_team_template.aepx"
TEMPLATE_COMPOSITION="main"
TEMPLATE_OUTPUT_MODULE="h264"
TEMPLATE_OUTPUT_EXT="mp4"
Структура электронной таблицы
Файл Excel должен содержать следующие листы со специфичными структурами:
Лист "SPORT"
Связывает названия видов спорта с соответствующими видео пакетами.
| SPORT | LINK |
|---|---|
| Без оформления | \server\share\path\to\null.mov |
| Футбол | \server\share\path\to\football_pack.mov |
| Волейбол | \server\share\path\to\volleyball_pack.mov |
Лист "TEAMS"
Сопоставляет имена команд с их видами спорта и логотипами. Колонка SPORT заполняется из выпадающего списка (заполнена из листа SPORT).
Если несколько команд в одном виде спорта имеют одинаковые названия, но разные логотипы, используется разделитель хеш # для уникальной идентификации.
| 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 |
Лист "CHANELL"
Сопоставляет названия каналов с их логотипами. Поля заполняются вручную без выпадающих списков.
| CHANEL | LINK |
|---|---|
| КАНАЛ | \server\share\path\to\channel_logo.png |
| TRIUMPH | \server\share\path\to\triumph_logo.png |
Лист "Start"
Основной источник данных для генерации анонсов. Большинство полей заполняются из выпадающих списков, основанных на других листах.
Обязательные колонки: DATA, TIME, CHANEL, SPORT, LEAGUE, TEAM A, TEAM B
Примечание: Колонка 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 |
Формат имен команд
Имена команд поддерживают два типа разделителей хэш #:
- Первый хеш: Уникальный идентификатор для команд с одинаковыми названиями в одном виде спорта, или одинаковым названием в разных видах спорта. Примеры:
Динамо#Футбол,Динамо#Волейбол- Одно название разный вид спортаСпартак#ЖенскийФ,Спартак#МужскойФОдно название разный вид спорта
- Второй хеш: Целевой размер в пикселях для масштабирования логотипа
Формат: DisplayName#UniqueID#TargetSize
Примеры:
Галатасарай#Turki- только уникальный идентификаторСомбатей##400- только целевой размер (обратите внимание на двойной хеш)Спортинг#ll#550- оба идентификатор и целевой размер
Важно: Обрабатывается только второй хеш для масштабирования логотипа. Если уникальный идентификатор не требуется, используйте двойной хеш ## перед целевым размером.
Выходные файлы
Рендеренные видео
Рендерные видео сохраняются в OUTPUT_FOLDER по следующему шаблону именования:
YYYYMMDD_Sport_League_TeamA_TeamB_Channel[_Variant].mp4
Имена файлов транслитерируются в латиницу. Примеры:
20260228_Volleyball_Championship-Turkey-Women_Beşiktaş_Galatasaray_TRIUMPH.mp420260228_Volleyball_Championship-Turkey-Women_Beşiktaş_Galatasaray_TRIUMPH_Today.mp420260228_Volleyball_Championship-Turkey-Women_Beşiktaş_Galatasaray_TRIUMPH_Tomorrow.mp4
Рабочий процесс
- Аутентификация: Подключение к NAS Synology с использованием предоставленных учетных данных
- Получение файла: Поиск и экспорт указанного файла .osheet в Excel
- Парсинг данных: Чтение всех листов и структурирование данных
- Разрешение ресурсов: Сопоставление видов спорта, команд и каналов с визуальными элементами
- Генерация заданий: Создание заданий Nexrender для каждой активной строки с вариантами
- Очистка: Удаление завершенных/неудачных заданий из предыдущих запусков
- Отправка: Отправка заданий на API Nexrender
- Мониторинг: Слежение за прогрессом выполнения до завершения
- Завершение сеанса: Закрытие сессии Synology
Требования к шаблонам After Effects
Шаблоны должны быть предварительно настроены на узлах рендеринга со следующими именами слоев:
Типы шаблонов
| Файл шаблона | Назначение |
|---|---|
PackShot_DOUBLE.aepx |
Сопоставление с двумя командами |
PackShot_SINGLE.aepx |
Анонсы для одной команды |
Обязательные слои
| Имя слоя | Тип | Описание |
|---|---|---|
| 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 | Наложение видео оформления |
Настройки композиции
- Имя композиции:
pack - Выходной модуль:
Start_h264 - Формат вывода:
mp4 - Формат проекта: Adobe After Effects 2024 .aepx
Устранение неисправностей
Частые проблемы
Ошибка подключения к NAS
- Проверьте, что
NAS_FQDNвключает протокол и порт (например,https://nas.example.com:5001) - Проверьте сетевую связность с NAS
- Убедитесь, что сервисы File Station и Office включены
Файл не найден
- Убедитесь, что путь в
NAS_FILEточно соответствует пути в Synology Drive - Путь должен начинаться с
/Team Folder/для рабочих папок - Проверьте права доступа к файлу для учетной записи сервиса
Ошибка отправки задания Nexrender
- Подтвердите доступность сервера Nexrender
- Убедитесь, что
NEXRENDER_API_URLправильный - Проверьте существование файлов шаблонов на узлах рендеринга
Режим отладки
Включите подробное логирование для детального анализа:
RUST_LOG=debug ./target/release/ae_anons
Это выведет:
- Детали API запросов/ответов
- Информацию о парсинге листов
- Детали создания заданий
- Процесс разрешения ресурсов
Возможные ограничения по производительности
- Большие таблицы: Ограничение обработки до 10,000 строк на лист
- Задержка сети: Загрузка файлов с NAS может занимать время для больших файлов
- Параллельные задания: Nexrender управляет очередью заданий внутренне
- Использование памяти: Парсинг Excel сохраняет всю книгу в памяти
Примечания по безопасности
- Храните учетные данные только в файле
.env(исключен из git) - Используйте специальные аккаунты с минимально необходимыми правами
- Сессии Synology завершаются после выполнения
- HTTPS рекомендуется для подключений NAS в продакшене
Разработка
Структура кода
ae_anons/
├── Cargo.toml
├── LICENSE
├── README.md
├── .env.example
├── src/
│ ├── main.rs
│ ├── config.rs
│ ├── nexrender.rs
│ ├── synology.rs
│ ├── processor.rs
│ └── web.rs
├── static/
│ ├── index.html
│ └── style.css
└── assets/
└── logo.png
Зависимости
| 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 | Обработка ошибок |
Планируемые новые возможности
- Расширить
JobDataвnexrender.rsдля новых полей данных - Обновить логику парсинга листов при необходимости добавления новых колонок
- Добавить соответствующие слои After Effects в шаблоны
- Обновите метод
to_nexrender_job()с новыми сопоставлениями ресурсов
🙏 Благодарности
Особая благодарность проекту Nexrender (@inlife и контрибьюторам) за создание надёжной платформы для автоматизации After Effects.
Лицензия
AE Anons — MIT License
Nexrender — MIT License
Обе лицензии MIT обеспечивают полную свободу использования и модификации кода.
Разрешается:
- ✅ Использовать в коммерческих целях
- ✅ Изменять исходный код
- ✅ Распространять копии
- ✅ Использовать приватно
Требуется:
- Сохранять копирайт и текст лицензии
Поддержка
Для вопросов и запросов функций обращайтесь:
История изменений
v0.1.0
- Первый выпуск
- Интеграция с Synology Office
- Базовая генерация заданий Nexrender
- Парсинг Excel с динамическим обнаружением листов
- Создание множественных вариантов
- Автоматические настройки размера шрифта и позиции
- Умное масштабирование логотипов по целевому размеру
v0.1.1
- Оптимизированна работат с памятью
- Убрана функция создания
.json
Made with 🦀 Rust and ☕ coffee
