Конструктор плейлиста для IP-TV — конкурс пет-проектов

Posted by

Меня зовут Алексей, и я типичный программист, которого прёт от разработки.

Мне пришла идея реализовать приложение, которое позволит сконструировать нужный для пользователя IP-TV плейлист в формате M3U.

Мне нужно было от приложения следующее:

— Задать каналы и их порядок в плейлисте. Канал — это имя, логотип и ссылки на стримы.
— Сохранить заданный плейлист в БД, выбрав не протухшую ссылку на стрим либо использовав заглушку.
— Сконструировать плейлист в формате M3U из плейлиста, сохранённого в БД.
— Web API с 2 методами: для запуска пункта 2 (далее: метод refresh_channels) и для получения плейлиста в формате M3U (далее: метод ip_tv_playlist.m3u), чтобы телевизор мог его получить и обработать.

Чтобы добавить процессу разработки ценности, я решил выбрать язык программирования Dart. Мне было интересно, насколько он удобен для такой задачи и как язык в целом.

Попользовавшись своим чудом, я понял, что вручную искать рабочую ссылку на стрим — неблагодарное дело, поэтому решил внести корректировки в изначальную задумку:

— Метод refresh_channels принимает список ссылок на IP-TV плейлисты и множество параметров фильтрации каналов:names_to_remove[] — регулярные выражения для удаления каналов по названию канала;groups_to_remove[] — регулярные выражения для удаления каналов по названию группы;source_urls_to_remove[] — регулярные выражения для удаления каналов по ссылке на источник канала;min_resolution_width — минимальная допустимая ширина разрешения канала;min_resolution_height — минимальная допустимая высота разрешения канала.
— Возможность задать каналы и их порядок в плейлисте остаётся той же, но у канала появляется дополнительное поле namePattern, в котором мы можем задать регулярное выражение для поиска этого канала в переданных плейлистах.
— Все каналы, которых не коснулась фильтрация, добавляются в конец заданного списка каналов.

Данная корректировка избавляет нас от ручного поиска рабочей ссылки на стрим для каждого желаемого канала, добавляет каналы, которые могут показаться интересными (кандидаты на добавление в заданный список каналов) или не интересными (причины добавления новой группы, имени или ссылки на источник в параметры фильтрации). Но мы должны вручную найти IP-TV плейлисты, из которых будет собираться наш, персонализированный. С этим неудобством я смирился, хотя можно было и это решить.

В реализации приложения мне похвастаться нечем, потому что делал на скорость, между делом. Но была одна трудность, с которой я столкнулся. Ещё в то время, как я пробовал на деле первую юзабельную версию приложения, я заметил, что некоторые каналы, хоть и работают, показываются в очень низком разрешении (720p, 480p, а то и хуже). На 75” 4К телевизоре это выглядит ужасно, поэтому среди фильтров есть возможность задать минимальное разрешение стрима. В моём случае это 1920×1080. Но единственный нормальный способ проверить разрешение стрима, который я нашёл, это использовать программу ffprobe. Её можно «попросить» вернуть некоторую информацию о стриме, в том числе его разрешение. Но делается это далеко не моментально. Поэтому обработка 14-ти плейлистов, которые я задал, проходила так долго, что я не дождался и остановил процесс. В качестве решения этой трудности я просто распараллелил проверку разрешения стримов на несколько потоков, достигнув приемлимого времени ожидания обработки 14-ти плейлистов (~5 минут).

Довольный результатом, я решил, что было бы круто помочь таким же пользователям Smart TV, которые так же как я не видят ничего удобного в онлайн-кинотеатрах, дополнительно содержащих в себе телевидение. Можно было бы сделать веб-интерфейс, который бы проксировал прямое обращение к Web API, но фильтрацию по минимальному разрешению стрима, скорее всего, пришлось бы скрыть, раз это такая долгая операция. Или сделать платной возможностью и за счёт этого позволить нормальные вычислительные мощности сервера. Но до продолжения делания чего-либо по этому проекту руки не дошли, поэтому я отделался написанием README.md, с помощью которого можно самостоятельно запустить приложение локально и сконструировать себе персонализированный плейлист.

Ссылка на репозиторий проекта в GitHub:

И напоследок: желаю всем меньше «печальных» каналов =)

!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *