Как стать автором
Обновить

Telegram бот для доставки torrent контента с телефона до телевизора

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров7.4K

Всем привет! Этой мой первый пост на Habr (да и вообще, если не считать GitHub). Хочу поделиться работой, на реализацию который у меня ушло около месяца, но тем не менее сейчас используется ежедневно и планирую развивать в дальнейшем. Задумка была таковой, что бы донести любой (бесплатный?‍☠️) контент до телевизора используя под рукой только телефон, например, если я еду в метро или нет желания (вставать с дивана) и возможности подойти к компьютеру. На самом деле причина реализации чуть глубже и проще, под управление контента на повседневный вечер я делегировал супруге, знатно помучив ее своими «проверь» и «посмотри» на протяжении всего этого бессонного месяца, за что конечно, отдельное спасибо! За источник контента отвечает трекер Кинозал, который, к слову, я использую уже 4 года и меня он устраивает во всем.

Цель проекта:

  1. Генерация постов с отправкой в Telegram канал на основе новых публикаций в трекере Кинозал с фильтрацией по рейтингу и году выхода. Канал Kinozal-News функционирует публично. На это у меня ушел всего день.

  2. Автоматизация процесса доставки контента до телевизора. Выбор (предложенного из поста канала или при ручном поиске в боте) и загрузка подходящего по разрешению, озвучке или размеру торрент-файла (используя предложенные рекомендуемые ссылки к каждой публикации в боте), постановка на загрузку в qBittorrent с возможностью управления, отслеживанием статуса а так же изменением приоритета загрузки файлов, и синхронизации контента с Plex Media Server.

Используемый технологический стек:

  • Кинозал. Используется для чтение RSS-ленты, получение данных из html (сайт достаточно старый, но тем не менее очень удобный, на сколько мне известно, api отсутствует, даже если нет, парсинг с данного сайта не сложнее, чем обращения к объектам json на прямую), поиск и фильтрация контента, и конечно загрузка торрент файлов;

  • Proxy-сервер (опционально, для доступа в Кинозал, можно отключить в конфигурации);

  • Telegram api. Отправка сообщений в канал, а так же чтение (только команд) и отправка ответных (обновление) сообщений в формате меню (keyboard) в боте;

  • qBittorrent api. Торрент клиент, используемый для загрузка данных из торрент-файлов и управление данными (пауза, удаление, изменение приоритета);

  • Plex Media Server api. Синхронизация данных и получение информации о содержимом секций и дочерних файлах.

  • WinAPI. Планирую добавить в последующих версиях. Будет использоваться для отображения текущего места на диске (и в целом состояния системы), интерактивного просмотра содержимого и размера загруженных директорий и файлов с возможностью их удаления а так же удаленного запуска и остановки приложений Plex и qBittorrent через собственную реализацию Windows API на базе PowerShwell и .NET HTTP Listener (серверная часть уже готова).

Один из ключевых моментов, был выбор языка. Изначально я начал писать на PowerShell, т.к. активно практикую его уже полтора года на ежедневной основе и был небольшой опыт написания Telegram-бота, но т.к. пару месяцев назад начал использовать Bash, подумал, почему бы и нет, к тому же его можно запустить и в ОС Windows (нет, не можно, фоновый задания выдают синий экран, проверил на 2-х железках) используя оболочку из пакета Git или Mobaxterm, и в конечном итоге хотелось крутить скрипт на удаленной Linux-машине.

Второй момент, это доступ в Кинозал. Здесь для меня было принципиально важно реализовать бесплатный способ, и т.к. я не знаю варианта бесплатного VPN-сервиса без GUI к тому же необходимо было использовать его в режиме Split Tunneling, выбор пал на систему Windows в связке с Proxy-сервером. Тут я не стал прибегать к привычным мне и популярным решениям (например, squid, 3proxy, tiny) и остановился на очень функциональном и удобном HandyCache (к сожалению, нет обновлений с января 2020 года), к слову, рекомендую к ознакомлению.

Сам же скрипт работает в режиме фоновых процессов (всего таких 2, которые в свою очередь создают дочерние процессы и во главе всего стоит Bash), не требует настройки unit в системе, можно запускать скрипт и выходить из системы, для остановки используется встроенная команда stop. В моей системе на Ubuntu Server 22.04 в Hyper-V при перезагрузке хоста с гипервизором, машина продолжает работать самостоятельно, т.к. выходит из паузы и не успевает терять пакеты до хостовой машины с Proxy (настроен автостарт на пару с VPN). Работоспособность протестирована на нескольких версиях Ubuntu Server и двух гипервизорах (VMWare Workstation и Hyper-V), вторая, в одинаковой конфигурации почему-то работает гораздо быстрее. Из зависимостей только пакет jq, в остальном это стандартный инструментарий интерпретатора Bash.

Сам же бот и все его команды, за исключением ручного поиска (/search) автоматизированы в меню с помощью кнопок. Привожу скриншоты с примерами:

Типовой пример с информацией к каждой публикации через бота.
Типовой пример с информацией к каждой публикации через бота.

Например, скопировав команду из канала выбранной публикации, или выбрав фильм/сериал, используя меню и команду /search с искомым текстом (можно получить до 50 ссылок в формате кнопок), мы получим описание, аналогичное каждой публикации в канале, только с кнопками. Отсюда уже есть возможность выбрать другую (рекомендуемую по названию) ссылку, где будет отличное разрешение, возможно озвучка, размер и т.д. Используя кнопку скачать торрент файл, мы загружаем сам .torrent файл в директорию, которая указана в конфигурации (на машине со скриптом), в дальнейшем при добавлении на загрузку этот торрент файл будет передать торрент клиенту. Из этого же пункта меню можно удалить сам торрент файл из системы (если ранее он уже был скачен), а так же можно отобразить список всех загруженных торрент файлов, используя кнопку "Torrent files".

Так выглядит меню загружаемых торрент-файлов в торрент клиенте а так же результат поиск командой /search .
Так выглядит меню загружаемых торрент-файлов в торрент клиенте а так же результат поиск командой /search .

Все торрент файлы, который добавлены в торрент клиент, отображаются в меню qBittorrent с их текущим статусом. При выборе, можно получить всю подробную информацию о загрузке с возможностью управления. Например, можно увеличить приоритет на 1-й серии и отслеживать только ее статус загрузки, или пропустить загрузку конкретной серии.

Информация о загрузке в торрент клиенте qBittorrent.
Информация о загрузке в торрент клиенте qBittorrent.

Итак, мы определились с сериалом или фильмом, загрузили его на удаленный компьютер, нам осталось синхронизировать его в Plex Media Server, что бы он сразу отобразилось в приложении на вашем телевизоре (или Web-клиенте, неважно). Для этого используется меню Plex. Тут необходимо выбрать нужную секцию (куда вы загружаете торрент клиентом и заранее эту директорию уже добавили на медиа сервер) и нажать кнопку "Синхронизировать данные". Далее вы можете отобразить содержимое директории, что бы проверить результат:

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

Инструкция по настройки как и сам бот опубликованы на GitHub. Есть много других идей, например добавить описание или другую полезную информацию из TMDb или kinopoisk, подключить другой торрент клиент, возможно трекер или добавить синхронизацию с Kodi. Лично для моих целей не хватает пока что функционала WinAPI. Принимаю идеи для развития и улучшения данного проекта, если возникнут вопросы или проблемы при настройке или работе, контакты для связи в профиле.

Буду благодарен, если поставите звездочку на работу. Так же можете ознакомиться с другими моими работами в профиле. Хочу заметить, что не являюсь разработчиком и многих вещей в этой области не знаю вовсе, т.к. это мое хобби исключительно на практике, но хотелось поделиться им с другими, возможно кому-то может и пригодится.

Теги:
Хабы:
Всего голосов 13: ↑13 и ↓0+13
Комментарии6

Публикации

Истории

Ближайшие события

Summer Merge
Дата28 – 30 июня
Время11:00
Место
Ульяновская область