MyGo 云音乐
用 Go 与 MyGo 写成的第三方网易云音乐桌面客户端。原生界面,没有 WebView;边下边播,无损与 Hi-Res,逐字歌词与「律动」,刘海播放器。
Translation pending
I tell you when a new episode is out on HDREZKA. Follow one season or a whole franchise.
MediaPython · ShellGitHub @ArchiewariousOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Telegram bot @HDRezkaSeriesBot: notifications about new episodes of series and anime on HDREZKA. Python, aiogram, PostgreSQL, Docker
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗▶ Открыть бота / Try it: @HDRezkaSeriesBot — уведомления о новых сериях сериалов и аниме с HDREZKA в Telegram: постер, номер серии, озвучка и кнопка «Смотреть».
EN. A Telegram bot that watches HDREZKA for new episodes and notifies subscribers — per season or per
franchise (new seasons, films, spin-offs). Python 3.12 · aiogram 3 · PostgreSQL 17 (delivery queue on
FOR UPDATE SKIP LOCKED, pg_trgm search, Alembic) · Docker Compose · three processes (bot / poller / sender) ·
pytest on saved HTML pages. Site load does not depend on the number of users: the poller reads the site's
update feed, not subscriptions. UI in Russian, Ukrainian and English. Docs are in Russian:
ARCHITECTURE.md, PRODUCT_AND_SCALE.md.
Бот, который следит за выходом новых серий на HDREZKA и присылает уведомления. Подписаться можно на один сезон или на всю франшизу — тогда бот сообщит и о новых сезонах, фильмах и спин-оффах.
Проектные решения и факты, на которых они основаны — docs/ARCHITECTURE.md.
главная: блок «Обновления» ──► poller ──► PostgreSQL ──► sender ──► Telegram
(1 запрос раз в 3 минуты) │ ▲
страницы тайтлов: по событию, │ │
подписанные раз в 12 ч, очередь ───┘ bot (поиск, подписки; сайт — только с разрешения)
BOT_SITE_PER_*).FOR UPDATE SKIP LOCKED),
singleton-лок поллера (advisory lock). Redis и брокеры не нужны.app/i18n.py).
Новому человеку — язык его Telegram, дальше — ⚙️ Настройки → 🌐 Язык./feedback. Тема (ошибка, идея, сотрудничество,
другое), письмо уходит автору карточкой и копией — со скриншотами; автор отвечает «Ответить» на карточку,
человек получает ответ от имени бота и может ответить так же. Тексты писем в базе не хранятся.| Проблема | Решение |
|---|---|
| Дата-центровые IP банят — 403 «Ошибка доступа 105» (IP этого сервера был забанен в сентябре 2026, с октября открыт) | ходим напрямую; бан — «БАН» в логе поллера и первой строкой /stats, тогда прокси через незабаненный IP: HDREZKA_PROXY в .env |
| Anubis proof-of-work | решается в app/rezka/client.py, браузер не нужен; cookie живёт 30 дней |
Вся эта логика изолирована в RezkaClient; остальной код видит только HTML.
cp .env.example .env # BOT_TOKEN, ADMIN_IDS, POSTGRES_PASSWORD
Проверка доступа и запуск:
docker compose run --rm --no-deps poller python -m app.check_access
docker compose up -d --build # migrate → bot, poller, sender
Юнит-тесты на сохранённом HTML сайта и интеграционные — путь события от блока обновлений до уведомления
на настоящем Postgres. Интеграционные запускаются только на отдельной базе с именем *_test:
docker compose --profile test build tests
docker compose --profile test run --rm --no-deps tests
Тесты — отдельная цель образа (Dockerfile, target: test): в боевом образе нет ни tests/, ни pytest.
--no-deps обязателен: без него compose запустит сервис migrate на рабочей базе. База rezka_test создаётся
один раз: docker compose exec postgres psql -U rezka -c 'CREATE DATABASE rezka_test'. В CI Postgres поднимается
сервисом GitHub Actions. Тесты не ходят в сеть: настоящий HTTP-запрос из теста — ошибка (tests/conftest.py).
Зависимости: верхний уровень — requirements.in и requirements-dev.in, закреплённые версии с хешами —
requirements.txt и requirements-dev.txt, ставятся с --require-hashes. Обновить:
uv pip compile requirements.in --universal --python-version 3.12 --generate-hashes -o requirements.txt
uv pip compile requirements-dev.in --universal --python-version 3.12 --generate-hashes -o requirements-dev.txt
docker compose logs -f poller # что происходит
docker compose run --rm --no-deps poller python -m app.check_access # доступ после смены IP/зеркала
sudo systemctl start rezka-backup.service # бэкап вручную (deploy/backup.sh)
deploy/restore-check.sh # проверить свежий дамп восстановлением в отдельную базу
Бэкапы: deploy/rezka-backup.timer раз в сутки (03:30 UTC) делает pg_dump -Fc в /var/backups/rezka
(7 последних) и заливает в Oracle Object Storage: бакет rezka-backups, префикс daily/. Копии старше 30 дней
удаляет правило бакета; версии объектов включены — перезапись по тому же имени не теряет копию. Заливка идёт по
ссылке «только запись» (pre-authenticated request AnyObjectWrite, листинг запрещён) из deploy/backup.env
(образец backup.env.example, в git не попадает): по ней нельзя ни прочитать, ни удалить копии. Ссылка действует
до 03.10.2031 — см. docs/TODO.md. Архив прежнего офсайт-сервера (06.09–03.10.2026, 30 дампов) — префикс
archive-lv/, хранится бессрочно. Установка юнита — deploy/rezka-backup.service (команда в шапке).
Восстановление:
# из локального дампа
docker compose exec -T postgres pg_restore -U rezka -d rezka --no-owner --clean --if-exists < /var/backups/rezka/rezka-….dump
# из офсайт-копии: нужен ключ OCI API (подписанный запрос) или консоль Oracle → Buckets → rezka-backups
export OCI_HOST=objectstorage.eu-frankfurt-1.oraclecloud.com
~/.oci/oci-req.sh GET '/n/<namespace>/b/rezka-backups/o?prefix=daily/' # список
~/.oci/oci-req.sh GET /n/<namespace>/b/rezka-backups/o/daily/rezka-….dump > rezka-….dump # скачать
docker compose exec -T postgres pg_restore -U rezka -d rezka --no-owner --clean --if-exists < rezka-….dump
Новая ссылка «только запись» (старая истекла или утекла — её можно удалить в консоли, Pre-Authenticated Requests):
POST /n/<namespace>/b/rezka-backups/p/ с телом
{"name":"rezka-backup-upload","accessType":"AnyObjectWrite","bucketListingAction":"Deny","timeExpires":"…"};
OFFSITE_URL = https://objectstorage.<регион>.oraclecloud.com + accessUri из ответа.
Обновление прода — deploy/update.sh: свежий бэкап, затем docker compose up -d --build.
Правило для новых CHECK в миграциях (24.09.2026). Ограничение сначала добавляется NOT VALID (сразу, без
чтения таблицы), затем данные проверяются в самой миграции — нарушители считаются и, если есть, миграция падает
с понятным сообщением или исправляет их явно, — и только потом VALIDATE CONSTRAINT. Иначе ADD CONSTRAINT
на живых данных падает посреди деплоя, и bot, poller, sender не стартуют. Индексы — CREATE INDEX CONCURRENTLY
в op.get_context().autocommit_block(). alembic check должен проходить: индексы, созданные сырым SQL,
перечислены в migrations/env.py (SQL_ONLY_INDEXES).
Схема БД — Alembic (migrations/). Изменили app/models.py →
docker compose run --rm -v $PWD/migrations:/srv/migrations migrate alembic revision --autogenerate -m "…",
применится при следующем docker compose up.
Команда /stats в боте — для ADMIN_IDS; там же видно, если поллер молчит дольше
STALE_ALERT_MINUTES. /events — что люди делали в боте за неделю (кто, сколько действий, хвост пути),
/events <id> — путь одного человека: команды, кнопки, итог поиска и ссылок. Тексты сообщений и запросов
не пишутся; события живут 30 дней (app/events.py, таблица user_events). Технические уведомления в Telegram не отправляются никогда —
состояние смотрите в логах и в /stats.
app/rezka/client.py доступ: прокси, Anubis, зеркала, паузы
app/rezka/parser.py блок обновлений, страница тайтла (озвучки с языком, серии, франшиза, расписание), поиск
app/service.py доменные операции над БД (общие для бота и поллера); локальный поиск
app/poller.py блок обновлений → серии и озвучки → уведомления; франшизы; очередь чтения
app/sender.py очередь → Telegram (фото/дайджест, кнопки); очистка
app/health.py здоровье «события идут» — для /stats и healthcheck поллера
app/posters.py постеры: скачивание с CDN, загрузка в Telegram, кэш file_id
app/bot/main.py поиск, подписки, озвучки, Новое, Настройки, поделиться, обратная связь
app/events.py действия людей без текстов (30 дней) — для /events
app/feedback.py письма автору и ответы через «Ответить»: карточка, копия, связь сообщений
app/lifecycle.py остановка по SIGTERM, сторож зависаний, пинг мониторинга, advisory lock
app/i18n.py тексты бота и уведомлений: ru / uk / en
app/bot/search.py группировка локальной выдачи по франшизам
tests/ pytest: сохранённый HTML сайта и интеграционные тесты на Postgres
docs/ARCHITECTURE.md решения и факты; docs/PRODUCT_AND_SCALE.md — продукт и масштаб