diff --git a/README.en.md b/README.en.md new file mode 100644 index 0000000..bc4901f --- /dev/null +++ b/README.en.md @@ -0,0 +1,78 @@ +# Circlechek + +[Русский](README.md) · **English** + +[![CI](https://github.com/EDeev/circlechek/actions/workflows/ci.yml/badge.svg)](https://github.com/EDeev/circlechek/actions/workflows/ci.yml) +[![Docker](https://github.com/EDeev/circlechek/actions/workflows/docker.yml/badge.svg)](https://github.com/EDeev/circlechek/actions/workflows/docker.yml) +[![License](https://img.shields.io/github/license/EDeev/circlechek)](LICENSE) + +A Telegram bot for video notes ("circles"): turns a square video into a round video note, and turns a +video note back into a regular video with the corners filled by a blurred frame or a gradient matching +the picture. The bot speaks Russian. + +**Status:** personal project, completed · bot [@circlechek_bot](https://t.me/circlechek_bot) + +![A video note and two background options](docs/demo.png) + +**Stack:** Python 3.12 · aiogram 3 · MoviePy 2 · Pillow · NumPy · Docker + +## Features + +- **Video → video note.** A square video up to one minute comes back as a circle. +- **Video note → video.** The bot splits the circle into frames, fills the corners and reassembles the + video with sound. Background options: + - **blur** — a blurred center of the frame; + - **gradient** — based on the frame's average color. +- Heavy processing runs in a separate thread, so the bot keeps answering others while one circle is + processed. Each job gets its own temporary folder, cleaned up even on errors. + +> [!NOTE] +> Some Telegram video notes have broken metadata; processing then fails or the video has artifacts. The +> bot warns about this, so check the result. + +## Running + +```bash +git clone https://github.com/EDeev/circlechek.git && cd circlechek +cp .env.example .env # BOT_TOKEN from @BotFather +docker compose up -d +``` + +Prebuilt image: `docker pull ghcr.io/edeev/circlechek` or `docker pull dcr.deev.su/edeev/circlechek`. + +Without Docker: Python 3.12, `pip install -r requirements.txt`, then `cd code && BOT_TOKEN=… python bot.py` +(FFmpeg comes with MoviePy). + +## Structure + +``` +code/bot.py entry point +code/handlers.py commands, receiving videos and video notes, background buttons +code/scripts.py Movie — frames and audio via MoviePy; Frame — background and circle mask via Pillow and NumPy +data/ temporary processing files +``` + +## Development + +```bash +pip install ruff -r requirements.txt +ruff check --select E9,F code +``` + +CI checks the code on every push and processes test video notes (with and without sound, both +backgrounds). The Docker image is built on `v*` tags and published to GitHub Packages and `dcr.deev.su`. + +## License + +MIT — see [LICENSE](LICENSE). + +## Author + +**Egor Deev** — [GitHub](https://github.com/EDeev) · [Telegram](https://t.me/DeevEgor) · [egor@deev.space](mailto:egor@deev.space) + +--- + +
+ ⭐ If you find this project useful, give it a star on GitHub! +

Made with ❤️ — deev.space

+
diff --git a/README.md b/README.md index 5458bb8..96a1c3f 100644 --- a/README.md +++ b/README.md @@ -1,106 +1,77 @@ -# 🎥 Circlechek +# Circlechek -**Telegram-бот для преобразования квадратных видео в кружочки и обработки видеосообщений с настраиваемыми фонами.** +**Русский** · [English](README.en.md) -## 📋 Описание +[![CI](https://github.com/EDeev/circlechek/actions/workflows/ci.yml/badge.svg)](https://github.com/EDeev/circlechek/actions/workflows/ci.yml) +[![Docker](https://github.com/EDeev/circlechek/actions/workflows/docker.yml/badge.svg)](https://github.com/EDeev/circlechek/actions/workflows/docker.yml) +[![License](https://img.shields.io/github/license/EDeev/circlechek)](LICENSE) -Circlechek — это простой и функциональный Telegram-бот, предназначенный для работы с видеоконтентом. Бот предоставляет две основные возможности: +Telegram-бот для кружочков: делает из квадратного видео видеосообщение-кружок, а из присланного +кружочка — обычное видео, где углы заполнены размытым кадром или градиентом под цвет картинки. -1. **Преобразование видео в кружочки** — превращает квадратные видео (до 1 минуты) в формат видеосообщений Telegram -2. **Обработка кружочков** — конвертирует видеосообщения в обычные видео с настраиваемым фоном по краям +**Статус:** личный проект, завершён · бот [@circlechek_bot](https://t.me/circlechek_bot) -## ✨ Функциональность +![Кружочек и два варианта фона](docs/demo.png) -### 🔄 Видео → Кружочек -- Принимает квадратные видеофайлы длительностью до 60 секунд -- Автоматически преобразует их в формат кружочков Telegram -- Сохраняет качество и плавность воспроизведения +**Стек:** Python 3.12 · aiogram 3 · MoviePy 2 · Pillow · NumPy · Docker -### 🎨 Кружочек → Видео -- Обрабатывает видеосообщения с добавлением фона по краям -- **Градиентный фон** — создает плавный цветовой переход на основе доминирующих цветов кадра -- **Размытый фон** — использует размытую версию центральной части видео -- Сохраняет исходное аудио и синхронизацию +## Возможности -## 🛠 Технологический стек +- **Видео → кружочек.** Квадратное видео до минуты возвращается кружком. +- **Кружочек → видео.** Бот разбирает кружок на кадры, заполняет углы и собирает видео обратно со звуком. + Фон на выбор: + - **блюр** — размытая центральная часть кадра; + - **градиент** — по среднему цвету кадра. +- Тяжёлая обработка идёт в отдельном потоке, поэтому пока один кружочек обрабатывается, бот отвечает + остальным. Каждая обработка — в своей временной папке, которая убирается и при ошибке. -- **Python 3.x** — основной язык разработки -- **aiogram** — асинхронная библиотека для работы с Telegram Bot API -- **PIL (Pillow)** — обработка изображений и создание эффектов -- **MoviePy** — работа с видеофайлами, извлечение кадров и аудио -- **NumPy** — математические операции с массивами для обработки изображений +> [!NOTE] +> У части кружочков Telegram бывают некорректные метаданные — тогда обработка не удастся или в видео +> будет брак. Бот предупреждает об этом, результат стоит проверять. -## 🚀 Установка и запуск +## Запуск -### Требования -- Python 3.8+ -- Токен Telegram-бота от [@BotFather](https://t.me/BotFather) - -### Установка зависимостей ```bash -pip install -r requirements.txt +git clone https://github.com/EDeev/circlechek.git && cd circlechek +cp .env.example .env # BOT_TOKEN от @BotFather +docker compose up -d ``` -### Настройка -1. Получите токен бота в [@BotFather](https://t.me/BotFather) -2. Отредактируйте файл `code/config.py`: -```python -botToken = "ВАШ_ТОКЕН_БОТА" +Готовый образ: `docker pull ghcr.io/edeev/circlechek` или `docker pull dcr.deev.su/edeev/circlechek`. + +Без Docker: Python 3.12, `pip install -r requirements.txt`, затем `cd code && BOT_TOKEN=… python bot.py` +(FFmpeg ставится вместе с MoviePy). + +## Структура + +``` +code/bot.py запуск +code/handlers.py команды, приём видео и кружочков, кнопки выбора фона +code/scripts.py Movie — кадры и звук через MoviePy; Frame — фон и маска-круг через Pillow и NumPy +data/ временные файлы обработки ``` -### Запуск +## Разработка + ```bash -cd code -python bot.py +pip install ruff -r requirements.txt +ruff check --select E9,F code ``` -## 📁 Структура проекта +CI на каждый push проверяет код и прогоняет обработку тестовых кружочков (со звуком и без, оба вида +фона). Docker-образ собирается по тегу `v*` и публикуется в GitHub Packages и `dcr.deev.su`. -``` -circlechek/ -├── code/ -│ ├── bot.py # Основной файл запуска бота -│ ├── handlers.py # Обработчики команд и сообщений -│ ├── scripts.py # Классы для работы с видео и изображениями -│ ├── config.py # Конфигурация бота -│ └── init.py # Инициализация бота и утилиты -├── data/ -│ ├── circles/ # Временные файлы кружочков -│ ├── video_notes/ # Временные видеосообщения -│ └── videos/ # Обработанные видео -└── README.md -``` +## Лицензия -## 🎯 Использование +MIT — см. [LICENSE](LICENSE). -1. **Начало работы**: Отправьте `/start` боту -2. **Создание кружочка**: Отправьте квадратное видео (до 1 минуты) -3. **Обработка кружочка**: - - Отправьте видеосообщение боту - - Выберите тип фона: "Градиент" или "Блюр" - - Получите обработанное видео +## Автор -## ⚠️ Важные особенности - -- Видео для преобразования в кружочки должны быть **квадратными** и **не длиннее 1 минуты** -- Некоторые кружочки могут иметь некорректные метаданные, что может привести к ошибкам обработки -- Рекомендуется всегда проверять качество полученного результата -- Все временные файлы автоматически удаляются после обработки - -## 📄 Лицензия - -Проект распространяется под лицензией MIT. - -## 👨‍💻 Автор - -**Деев Егор Викторович** - Backend Developer -- GitHub: [@EDeev](https://github.com/EDeev) -- Email: egor@deev.space -- Telegram: [@Egor_Deev](https://t.me/Egor_Deev) +**Деев Егор Викторович** — [GitHub](https://github.com/EDeev) · [Telegram](https://t.me/DeevEgor) · [egor@deev.space](mailto:egor@deev.space) ---
- ⭐ Если проект оказался полезным, поставьте звездочку на GitHub! -

Создано с ❤️ от вашего дорогого - deev.space ©

+ ⭐ Если проект оказался полезным, поставьте звёздочку на GitHub! +

Сделано с ❤️ — deev.space

diff --git a/docs/demo.png b/docs/demo.png new file mode 100644 index 0000000..a619b43 Binary files /dev/null and b/docs/demo.png differ