Разнообразные сериалы я смотрю очень давно, когда-то писал, как так вышло. Ещё так вышло, что смотрю я обычно на английском. Что, кстати, за годы просмотра очень неплохо его прокачало — но об этом в другой раз.
Со временем всё самое хорошее, что уже было снято, посмотрел и стал смотреть новое. В связи с чем встал вопрос отслеживания выхода новинок. Долгое время отслеживал с сайта addic7ed.com, где добрые люди неустанно изготавливают для сериалов субтитры. Причём, делают это крайне быстро, так что в списке последних добавленных сабов обычно и видны все новинки.
Помню, когда-то таким образом отловил «Шерлока» — того что с Камбербетчем и Фриманом — и посмотрел через несколько часов после выхода. Понравилось, написал заметку, а через пару месяцев права на показ купил Первый канал, и я еще долго на эту заметку собирал трафик, поскольку написал про сериал чуть ли не первый.
Тем не менее, со временем сериалы стали выходить уже с сабами внутри, поэтому нет-нет и на сайте новинки стали пропускать. Решил наконец сменить способ отслеживания на более технологичный. И написал под свою маленькую платформу Botopotamus.Ru свирепого сериального ботопотама — @tv_botopotamus_bot в Телеграме.
Пока бот умеет две основные вещи:
— показывает, какие телешоу выходят сегодня (с учётом часовых поясов для нас это завтра)
— и какие премьеры и возвраты (новые сезоны) телешоу выходят в этом месяце.
Для каждого шоу бот показывает краткий сюжет, жанры, номера серий и ссылку на источник, где можно посмотреть картинку и каст подробнее. Это для всех британских и американских телеканалов, а также стримингов типа Netflix и Apple TV+, на английском языке. То есть то, что я обычно смотрю.
На список принудительно наложены фильтры: только художественные (scripted) шоу и мультики (animation). Иначе, если не убирать документальные передачи, риалити-шоу, спорт и новости, список получается под 200 позиций в день — неудобно читать.
В дальнейших планах добавить в бота:
— возможность посмотреть анонсы на несколько дней и премьеры на несколько месяцев вперёд-назад;
— добавить настройки для индивидуальных фильтров по жанрам;
— добавить отечественную телепрограмму и может быть другие языки кроме английского и русского;
— и возможность подписаться на уведомления по выходу каких-то позиций.
В общем, если смотрите сериальчики на английском, или собираетесь смотреть — заходите к боту в гости, это бесплатно :)
Далее технические подробности про бота, для тех, кому интересно.
Бот сделан под мою платформу — она написана Laravel (PHP) и все боты на ней работают в режиме вебхуков.
Под команды и клавиатуру у меня написан небольшой ORM, так что добавлять и регистрировать их легко, по сути просто надо написать классы, реализующие ответы на команды юзера.
Под отправку сообщений юзеру тоже уже есть API, к нему для этого бота добавился новый трейт — отправить длинное сообщение. Поскольку даже отфильтрованных позиций в списке сериалов может быть достаточно много, можно столкнуться с ограничением Телеграма в 4096 символов на отправку. И если когда мы отправляем в ТГ длинный текст вручную, за нас его режет приложение, то через API Телеграм говорит, что много чести — режьте сами. И бросает в нас ошибку по длине сообщения.
Поэтому вот для примера трейт, который объединяет массив текстовых сообщений (с поддержкой HTML) в одно или несколько сообщений ТГ с учетом лимита в 4096 символов и отправляет их. У меня в $messages
передается массив анонсов, каждая запись — один сериал со всей выводимой информацией, уже отрендеренный через blade-шаблон.
<?php
namespace App\Traits;
use Telegram\Bot\Api;
trait LongMessages
{
/**
* Sends an array of messages to the chat. Messages are concatenated
* with each other until the length limit is reached (4096 characters).
* At that point a new message is sent and the process is repeated.
*
* @param array $messages
* @param Api $bot
*/
protected function send(array $messages, Api $bot): void
{
$text = '';
$allowed_tags = '<b><strong><i><em><u><ins><s><strike><del><a><code><pre><span><blockquote><ul><ol><li>';
foreach ($messages as $message) {
$message = strip_tags($message, $allowed_tags);
if (mb_strlen($text) + mb_strlen($message) > 4096) {
$bot->sendMessage([
'chat_id' => $this->chat_id,
'text' => $text,
'parse_mode' => 'HTML',
'disable_web_page_preview' => true,
]);
$text = '';
}
$text .= $message;
}
if ($text) {
$bot->sendMessage([
'chat_id' => $this->chat_id,
'text' => $text,
'parse_mode' => 'HTML',
'disable_web_page_preview' => true,
]);
}
}
}
Ограничивать употребление тегов приходится, потому что в аннотациях к сериалам TvMaze себя в плане тегов не очень сдерживают. Приходится оставлять только то, с чем дружит Телеграм.
Для получения телепрограммы бот работает с API сайта TvMaze.com. Пример их JSON-ответа можно посмотреть тут: https://api.tvmaze.com/schedule/web Программа собирается из нескольких источников (UK, US, стриминги), фильтруется, объединяется, после чего убираются возможные дубли.
Поскольку телепрограмма для всех одна, а меняется редко, парсить её на каждый запрос пользователя смысла нет. Поэтому бот тихонечко (4 раза в сутки) ставит в очередь задачу спарсить данные за текущий месяц. Забирает расписания по дням, сразу отфильтровывает ненужное, строит анонсы по датам и список премьер/возвратов на месяц. И кладёт в кэш.
А пользователю, таким образом, отдается заранее закэшированный результат. И кэш, и очереди работают на Redis. В базе данных бот не сохраняет вообще ничего.
Для мониторинга очередей к платформе прикручен Horizon. Конечно, для отслеживания 4 задач в сутки мониторинг не особенно нужен. Но на этой же платформе крутится другой мой ботопотам — Botopotamus Monitor Bot. А в нём весь мониторинг и сервисные задачки — строго на очередях. Так что есть за чем следить.
Кстати, вот такую примерно схемку Дипсик для бота нарисовал. Он прикольные схемы рисует, если с ним архитектурные вопросы обсуждать.
Почти так всё в результате и работает. Пишите, если интересно, или если есть вопросы — постараюсь ответить. И заходите к TV Botopotamus вместе смотреть сериалы.