Daily MaverickBAIL DENIED: ‘Dangerous pattern’: Shadrack Sibiya denied bail over threats and wiped cellphoneESPNStrength of schedule (SOS) cheat sheet: Every team's ratings for the rest of seasonThe Jerusalem PostHow to vote in Israel: A guide for the first-time voter ahead of the Knesset elections - explainerESPN DeportesChivas enfrenta tercera crisis de resultados en era MilitoInquirerPhilHealth expands access to anti-TB medicines via GAMOTPunchLagos can’t fund Fourth Mainland Bridge alone, says HamzatBollywood HungamaMika Singh DEFENDS Daler Mehndi amid Uttarakhand event controversy, reveals he had a big operation recently: “Have you ever seen a glass of alcohol in his hand”Screen RantNintendo Switch Sports Resort Review - 12 Sports For The Whole Family
The Daily Newsstand · Free, Always
Tuesday, October 20, 2026

«Алиса, включи буквально любой фильм»: как я научил колонку запускать кино и сериалы на проекторе без пультов и подписок

Translate

У меня китайский проектор на Android TV. Картинку он выдает отличную, но пульт к нему самый обычный: без микрофона. Каждый раз вбивать стрелочками по буквам в экранную клавиатуру название фильма меня достало где‑то на второй день. Вправо, вправо, вниз, буква «О», влево, «К»... Опечатался: стирай половину слова и набирай заново.

Приложения с каталогами вроде Lampa отличные, когда ты сам не знаешь, что глянуть, и хочешь полистать постеры под еду. Но когда ты уже точно знаешь, что хочешь посмотреть условную четвертую серию второго сезона «Пацанов» в Кубике, тыкать пультом по меню пять минут откровенно в лом.

В той же комнате стоит Яндекс Станция, а рядом пристроился тихий мини‑ПК. На нем у меня уже крутился проверенный набор: Prowlarr для поиска по трекерам и TorrServer для стриминга торрентов прямо в память.

Появилась логичная мысль: все нужные железки уже есть под рукой, почему бы не связать их вместе? Чтобы можно было просто плюхнуться на диван и сказать вслух: «Алиса, включи Рика и Морти от Сыендука», после чего кино сразу начнется на экране.

Казалось бы, делов на вечер: поймать вебхук от Алисы, найти раздачу, скормить в TorrServer и открыть плеер на проекторе. Но на практике вылезла пачка интересных нюансов, о которых и хочу рассказать.

Код проекта я выложил на GitHub, ссылка в конце статьи.

Как это устроено в двух словах

Вся связка держится на трех базовых узлах: голосовой интерфейс Яндекса, домашний сервер и проектор на Android TV.

Сначала я говорю колонке фразу. Станция через приватный навык в Яндекс Диалогах отправляет HTTPS‑вебхук наружу. Чтобы сервер был доступен из интернета без покупки белого IP и возни с роутером, я прокинул порт мини‑ПК через бесплатный Tailscale Funnel: это дает стабильный публичный HTTPS‑адрес прямо из коробки.

Внутри домашней сети запрос принимает сервис на Python, который последовательно связывает все компоненты:

  • Кинопоиск API: принимает любую голосовую отсебятину, понимает опечатки и выдает точный паспорт фильма с оригинальным названием на английском.

  • Prowlarr: опрашивает настроенные торрент‑трекеры и возвращает список живых раздач.

  • Модуль скоринга: отсекает экраночный мусор и выбирает лучший релиз под запрошенную озвучку и битрейт.

  • TorrServer: забирает magnet‑ссылку и начинает кешировать видеопоток в оперативную память сервера, не забивая диск.

  • Проектор (Vimu Player): принимает диплинк по локальной сети и мгновенно стартует показ.

В теории цепочка выглядит просто, но при первой же попытке сделать всё «в лоб» полезли неожиданные проблемы.

Факап номер один: жесткий тайм‑аут Алисы

Произношу первую тестовую фразу. Колонка задумывается на три секунды, после чего с грустной интонацией выдает: «Извините, устройство не отвечает».

Оказывается, платформа Яндекс Диалогов зашита на жесткий тайм‑аут: сервер обязан вернуть ответ максимум за 2.5–3 секунды. Если уложиться не успел, сессия рвется с ошибкой, а пользователь слушает извинения.

А нормальный поиск кино: процесс по своей природе неторопливый. Сходить в Кинопоиск: полсекунды. Запустить Prowlarr по десятку трекеров: три‑четыре секунды (трекеры иногда отвечают неохотно). Дождаться ответа от TorrServer со списком файлов раздачи: еще секунды две. В сумме набегает секунд 6–7, что никак не укладывается в яндексовские рамки.

Решение нашлось классическое: модель fire‑and‑forget. Как только вебхук прилетает на мой сервер, скрипт мгновенно (за 150–200 миллисекунд) формирует бодрый ответ («Включаю Рик и Морти на проекторе») и отдает его Алисе.

# Быстрый ответ Алисе за 0.2 секунды
self.send_alice_response(f"Включаю {query}")

# Поиск и запуск уходят в фоновый тред
worker = threading.Thread(target=self.process_playback, args=(query,), daemon=True)
worker.start()

Алиса думает, что всё готово, закрывает диалог и начинает проговаривать фразу вслух. Пока колонка говорит, фоновый поток сервера успевает не спеша найти раздачу, добавить ее в TorrServer и пнуть плеер. В итоге всё сходится идеально: Алиса договорила фразу, и ровно в эту секунду на стене стартует видео.

Зачем перед трекерами нужен Кинопоиск

Когда пользователь командует голосом, он говорит всё что угодно: путает слова, не помнит точное название, называет актеров или просто проглатывает звуки. Да и сама Станция периодически распознает речь с забавными опечатками.

Если скормить такую живую отсебятину напрямую в поиск по трекерам, результат будет плачевным: либо ноль раздач, либо гора мусора. Поисковики трекеров тупые, они ищут строгое совпадение подстрок. Если в названии пропущена буква или добавлено лишнее слово («пожалуйста»), трекер ничего не найдет.

Именно поэтому перед походом на трекеры запрос обязательно прогоняется через API Кинопоиска. Это универсальный фаззи‑фильтр, который решает сразу три важнейшие задачи:

  1. Нормализация отсебятины: Кинопоиск отлично понимает неточные названия, опечатки и возвращает строгий паспорт фильма: официальное русское имя, точный год и тип контента.

  2. Фильм или сериал: если сказать «Терминатор 2», двойка является частью названия фильма. А если сказать «Пацаны 2», то двойка должна превратиться во второй сезон сериала. Кинопоиск сразу подсказывает тип контента, исключая глупые ошибки.

  3. Оригинальные названия: на трекерах огромное количество качественных раздач озаглавлены исключительно на английском: Breaking Bad, The Boys, Severance. Кинопоиск отдает оригинальный тайтл, и поиск по двум вариантам сразу находит втрое больше живых релизов.

Параллельно серверный парсер вычищает мусорные предлоги, корректно обрабатывает сложные названия вроде «В диких условиях» и переводит слова («четвертый сезон пятая серия») в понятные цифры. Получив чистый паспорт тайтла, мы наконец можем идти за торрентами.

Как не сойти с ума от выбора раздач

Когда Prowlarr выкатывает по названию сорок раздач, брать первый попавшийся вариант категорически нельзя.

Если скрипт радостно схватит свежий 4K HDR Remux на 80 гигабайт, слабенький Wi‑Fi чип проектора просто захлебнется от огромного битрейта. Буфер TorrServer будет постоянно опустошаться, и вместо кино зритель получит дерганое слайд‑шоу. Если же взять случайный пережатый рип, на стодюймовом экране проектора будет сплошная пиксельная каша.

Для этого я написал систему скоринга. Первым делом скрипт жестко банит любые экраночные варианты вроде TS или CAMRip. Следом проверяется студия перевода: если в голосовой команде прозвучало «в Кубике» или «от Сыендука», раздачи с соответствующими метками получают максимальный бонус к рейтингу. Затем алгоритм оценивает количество сидеров, ведь для комфортного стриминга в оперативку нужен стабильный поток, и подбирает золотую середину по размеру: для проектора идеальным оказался BDRip или WEB‑DL в 1080p весом около 6–12 гигабайт. Раздача с максимальным баллом побеждает и улетает в TorrServer.

Сериалы на 100 гигабайт: фокус с парсингом файлов

С фильмами логика простая: один торрент содержит один большой видеофайл. А вот с сериалами я поначалу набил немало шишек.

Почти все популярные сериалы раздают целыми сезонами или огромными паками всех сезонов разом. Это одна раздача весом под 150 гигов, где внутри лежат десятки папок, вложенные семплы, субтитры и серии в самых разных форматах именования. Если просто скормить плееру такую ссылку, он запустит первый попавшийся файл из раздачи (часто это превью‑ролик или первая серия первого сезона).

Чтобы включалась именно нужная серия, скрипт действует в два этапа.

Сначала magnet‑ссылка передается в TorrServer только в режиме предзагрузки метаданных. Буквально за пару секунд сервер стягивает торрент и получает полный список всех файлов внутри.

Затем регулярные выражения пробегают по путям, отсекают любые файлы меньше 50 мегабайт (чтобы не цеплять семплы и титры) и вычисляют файл нужного эпизода по шаблонам вроде s02e04 или 2 сезон 4 серия. Найдя точный порядковый номер файла, скрипт генерирует ссылку с параметром index={file_id}. В результате плеер сразу начинает проигрывать именно запрошенную серию.

Залоченный ADB и нативный протокол Google

Теперь самое интересное: как заставить Android TV открыть плеер с нужным потоком?

Первая мысль любого гика: включить на проекторе беспроводной ADB и слать команды через него. Я полез в настройки и тут же уперся в стену: в прошивке моего китайского проектора отладку по ADB вырезали намертво. Меню разработчика кастрировано, сетевой порт 5555 закрыт. Ковырять китайский Android кабелями и накатывать кастомы ради одного плеера откровенно не хотелось.

И тут я вспомнил про официальное приложение Google TV на смартфоне. Телефон же как‑то находит проектор в сети и работает виртуальным пультом без всякого ADB!

Оказалось, что у Android TV под капотом живет нативный протокол Android TV Remote v2 (порты 6466 для команд и 6467 для спаривания).

Один раз запускаешь процедуру сопряжения, вводишь на сервере шестизначный пин‑код с экрана проектора, и скрипт сохраняет пару постоянных SSL‑сертификатов. После этого мини‑ПК получает надежный канал управления: он может в любой момент отправить команду и открыть диплинк прямо в Vimu Player:

# Открываем прямую ссылку на видеопоток в Vimu Player
deep_link = f"vimu:play?url={stream_url}"
await remote.async_open_url(deep_link)

Этот протокол работает как часы: не отваливается, не требует отладки и никогда не переспрашивает разрешений на экране.

А что с включением самого проектора по питанию? Тут тоже вскрылась забавная железная реальность: когда проектор выключен, его китайская плата наглухо обесточивает Wi‑Fi модуль, так что разбудить его по сети через Wake‑on‑LAN физически невозможно. Эту часть я решил максимально просто: включением проектора заведует обычный умный ИК‑пульт Яндекса, привязанный к экосистеме. Я просто говорю: «Алиса, включи проектор», ИК‑сигнал зажигает оптику, а дальше скрипт по сети подхватывает управление и запускает кино.

Полезные мелочи: YouTube, ТВ и переключение на ПК

Поскольку мост уже умел слушать команды и рулить устройствами, я накинул еще пару повседневных фич:

  • YouTube: команда «Алиса, найди на ютубе обзоры авто» формирует ссылку и сразу открывает приложение YouTube на проекторе с готовой поисковой выдачей.

  • ТВ‑каналы: фраза «Алиса, включи Матч ТВ» включает прямой эфир федерального канала через встроенный HLS‑прокси с автоматическим переключением на резервные потоки, если основной вдруг лег.

  • Просмотр на компе: если проектор включать лень и хочется посмотреть серию за рабочим столом, достаточно скомандовать «Алиса, экран комп». Сервер переключит вывод, и видеопоток откроется в полноэкранном VLC на мониторе компьютера.

Итог

В итоге дома появился именно тот уровень лени, к которому я стремился. Заходишь в комнату, бросаешь одну фразу в воздух, и через несколько секунд кино уже играет на стене в нужной озвучке. Без поиска пультов в темноте, без экранных клавиатур и без десятка платных подписок.

Исходный код проекта, шаблон переменных окружения и docker‑compose для быстрого развертывания TorrServer и Prowlarr выложены на GitHub:

View the original on Хабр →

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.