Initial commit

This commit is contained in:
2025-06-02 00:13:27 +08:00
commit 3a2eca9e15
206 changed files with 9726 additions and 0 deletions

57
src/assets/css/custom.css Normal file
View File

@@ -0,0 +1,57 @@
.chapter li.part-title {
font-size: 1.2em;
}
main ol li {
margin-bottom: 10px;
}
.badge {
border-bottom-left-radius: 6px;
border-bottom-right-radius: 6px;
border-top-left-radius: 6px;
border-top-right-radius: 6px;
box-sizing: border-box;
color: rgb(33, 37, 41);
display: inline-block;
font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
font-size: 10.5px;
font-weight: 700;
height: 17.8438px;
line-height: 10.5px;
margin-right: 4px;
padding-bottom: 3.675px;
padding-left: 6.825px;
padding-right: 6.825px;
padding-top: 3.675px;
text-align: center;
text-size-adjust: 100%;
text-wrap-mode: nowrap;
vertical-align: baseline;
white-space-collapse: collapse;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
.badge.online {
background-color: rgb(25, 135, 84);
}
.badge.offline {
background-color: rgb(220, 53, 69);
}
.badge.unknown {
background-color: rgb(108, 117, 125);
}
.badge.adult {
background-color: rgb(255, 193, 7)
}
.icon.online {
color: rgb(25, 135, 84);
}
.icon.offline {
color: rgb(220, 53, 69);
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

92
src/common/checks.md Normal file
View File

@@ -0,0 +1,92 @@
---
icon: material/file-refresh-outline
tags: ["статусы", "плейлисты", "каналы", "iptvc"]
---
# :material-file-refresh-outline: Как проверяются плейлисты
Плейлисты проверяются автоматически с некоей периодичностью при помощи [iptvc](../iptvc/how-it-works.md).
Она может настраиваться мной в разное время, чтобы сбалансировать нагрузку на сервер.
!!! danger "Я не гарантирую корректность и актуальность плейлистов, которые ты увидишь на сайте, как и корректность результатов их проверки."
После прочтения этой страницы ты поймёшь почему.
Хотя я и стараюсь улучшать качество проверок, но всё же рекомендую проверять желаемые плейлисты самостоятельно вручную, ибо нет никаких гарантий:
* что плейлист (не) работоспособен
* он может быть и рабочий, но проверка может не сработать из-за таймаута запроса;
* он уже может быть и нерабочим, но результаты последней проверки показывают обратное;
* что плейлист корректно обработается (будут правильно определён список каналов, их названия, атрибуты и пр.);
* что транслируемый контент соответствует названиям каналов;
* что сейчас или через X времени там не окажется [заглушка](../faq.md#заглушка).
<a id="плейлисты"></a>
## Плейлисты
Каждый плейлист может быть в одном из трёх статусов:
* <span class="badge unknown">unknown</span> -- Плейлист в очереди на проверку
Он сменит свой статус в ближайшие минуты.
* <span class="badge online">online</span> -- Плейлист активен
Это не значит, что он работает.
Это значит, что адрес плейлиста корректен и там, *вероятно*, *что-то* транслируется.
В нём может быть 0 каналов -- значит, содержимое потёрли.
* <span class="badge offline">offline</span> -- Плейлист недоступен
Если этот статус висит постоянно, значит это главный кандидат на удаление из проекта.
Но это может быть просто разовый сбой (например, таймаут проверки), и, *возможно*, скоро он станет доступен.
!!! info "Обрати внимание"
Независимо от статуса плейлиста на сайте, его можно добавить в свой плеер по "Ссылке для ТВ" и проверить самостоятельно.
Проверка плейлиста не влияет на его работоспособность.
<a id="каналы"></a>
## Каналы
Каждый канал в любом плейлисте может быть в одном из трёх статусов:
* <span class="icon online"><ion-icon name="radio-button-on-outline"></ion-icon></span> -- *Возможно*, канал работает
Но там может транслироваться какая-нибудь [заглушка](../faq.md#заглушка) (например, от [Wink](../faq.md#wink)).
* <span class="icon offline"><ion-icon name="radio-button-on-outline"></ion-icon></span> -- *Возможно*, канал не работает
Чем больше таких каналов в плейлисте, тем сложнее будет листать плейлист в плеере или на ТВ.
Но, *возможно*, *когда-нибудь* плейлист обновят и канал будет работать исправно.
Также и здесь может быть просто разовый сбой (например, таймаут проверки), и (возможно) скоро он станет доступен.
!!! info "Обрати внимание"
Пропорции рабочих и нерабочих каналов в плейлистах может и будет меняться от проверки к проверке.
Это нормально, таковы технические особенности проверки.
<a id="возможности"></a>
## Возможности
В описаниях плейлистов, которые находятся в статусе <span class="badge online">online</span>, можно встретить следующие иконки:
* <ion-icon name="folder-open-outline"></ion-icon> -- каналы плейлиста разбиты на группы (например, музыкальные каналы и региональные);
* <ion-icon name="newspaper-outline"></ion-icon> -- плейлист предоставляет программу передач для каналов;
* <ion-icon name="play-back"></ion-icon> -- плейлист предоставляет возможность перемотки передач.
Если плейлист недоступен или непроверен, этих иконок не будет.
<a id="для-взрослых"></a>
## Контент для взрослых
Это откровенно порнографический, эротический или другой контент, неприемлемый для детской психики (например, жанровые каналы с фильмами ужасов).
Если при проверке плейлиста обнаружен хотя бы один канал для взрослых, то сам канал и весь плейлист помечается значком <span class="badge adult">18+</span>
Такие каналы определяются благодаря правилам, описанным в файле [channels.json](../formats/channels.md).
Они применяются к названиям каналов и их атрибутам (`tvg-id`, `tvg-name`), которые описывают канал в плейлисте.
Для каналов со взрослым контентом применяется тег `adult`.
!!! warning "Обрати внимание"
Далеко не все каналы могут быть помечены таким тегом.
Хотя набор правил для тегов очень богат, но невозможно угадать все каналы с приемлемой точностью.
Почему -- читай [здесь](../formats/channels.md#warnings).
!!! info "Примечание"
Теперь должно стать понятно, почему я не даю и не могу дать никаких гарантий относительно результатов проверок и тегов.
Каждый раз это просто непредсказуемый процесс.

14
src/common/connect.md Normal file
View File

@@ -0,0 +1,14 @@
---
icon: material/television-play
tags: ["плееры", "плейлисты"]
---
# :material-television-play: Как подключить плейлист
1. Найти какой-нибудь [плеер](./players.md)
2. Узнать как в него добавить плейлист по ссылке
3. Найти желаемый плелист из [списка](./list.md)
4. Найти на странице ["Ссылку для ТВ"](details.md#ссылка-для-тв) и ввести (скопировать) её в поле ввода адреса в плеере
Для некоторых [плееров](./players.md) уже есть информация как добавить плейлист.

156
src/common/details.md Normal file
View File

@@ -0,0 +1,156 @@
---
icon: material/table-eye
tags: ["сайт", "статусы", "каналы"]
---
# :material-table-eye: Страница плейлиста
Страница содержит подробности об одном конкретном плейлисте.
В её заголовке указано [название плейлиста](../formats/playlists.md#name).
Ниже страница разделена на две части: слева две вкладки с информацией и список каналов справа.
Рассмотрим всё это подробнее.
## Вкладка "Основная информация"
![Вкладка "Основная информация"](../assets/img/pls-details/tab1.jpg)
На этой вкладке выводится таблица со следующими строками:
* **Код** -- короткий уникальный [код плейлиста](../formats/playlists.md#code);
* **Описание** -- [описание плейлиста](../formats/playlists.md#desc) (при наличии);
* **Ccылка для ТВ** -- короткая ссылка, которую можно использовать для [подключения плейлиста](../common/connect.md), подробнее о ней см. ниже;
* **Источник** -- [ссылка на ресурс](../formats/playlists.md#src), где была найдена ссылка на плейлист (при наличии);
* **Наполнение**:
* группы -- количество групп, на которые поделены каналы;
* каналы -- количества каналов общее, онлайн и оффлайн;
(всё по нулям, если плейлист <span class="badge offline">offline</span>)
* **Возможности** -- наличие программы передач и перемотки каналов;
* **M3U** -- [прямая ссылка](../formats/playlists.md#pls) на плейлист;
* **Проверка плейлиста** -- дата и время последней [проверки](../common/checks.md) плейлиста с помощью [iptvc](../iptvc/how-it-works.md);
* **Ошибка проверки** -- текст ошибки, которая возникла при проверке
(только если плейлист <span class="badge offline">offline</span>)
Если при проверке плейлиста возникла ошибка, то она будет отображена красным цветом сразу под заголовком:
??? quote "Скриншот страницы с ошибкой"
![Страница с ошибкой проверки плейлиста](../assets/img/pls-details/error.jpg)
!!! info
Если в тексте ошибки фигурирует слово `Timeout` и плейлист <span class="badge offline">offline</span> -- это ерунда.
Скорее всего, при следующей проверке статус позеленеет.
Просто в момент проверки сервер не получил файл плейлиста вовремя, а т. к. долго ждать он не может, поэтому плюнул и пошёл проверять другие.
!!! info "Обрати внимание"
Независимо от статуса плейлиста на сайте, его можно добавить в свой плеер по "Ссылке для ТВ" и проверить самостоятельно.
Проверка плейлиста не влияет на его работоспособность.
## Вкладка "Исходный текст"
![Вкладка "Исходный текст"](../assets/img/pls-details/tab2.jpg)
Здесь выводится плейлист как он есть.
Над этим текстом -- две кнопки:
* зелёная с кодом плейлиста для скачивания файла;
* нажатие на **QR-код** покажет, внезапно, QR-код, в который закодирована "Ссылка для ТВ".
## Список каналов
![Cписок каналов](../assets/img/pls-details/ch-list.jpg)
В заголовке пишется их общее количество.
Если общее количество каналов 500 и более, то под заголовком отобразится подсказка, чтобы ты не убегал раньше времени.
Надо просто подождать несколько секунд, список догрузится и подсказка исчезнет.
??? quote "Скриншот подсказки"
!!! success "Да, это недоработка, подпёртая костылём, но это беспокоит меня меньше всего."
Может быть когда-нибудь сделаю лучше. Или нет.
![Скриншот подсказки над списком каналов](../assets/img/pls-details/hint.jpg)
### Поиск каналов
Количество плейлистов в заголовке над списком учитывает найденные с помощью фильтров каналы.
Под заголовком есть **выпадающий список групп**.
Он отображается только если плейлист поделён на группы.
Справа -- **кнопка сброса** для отображения всех каналов.
Под списком групп расположилась **строка поиска**.
Она есть вообще всегда.
Туда можно начать вводить название канала, и по мере ввода список будет сужаться.
Справа от строки поиска есть **кнопки фильтрации каналов по их статусу**.
Справа -- **кнопка сброса** для отображения всех каналов.
Под строкой поиска есть [**облако тегов**](../formats/channels.md#доступные-теги).
!!! question inline end "Про теги"
Откуда они там появляются, можешь прочесть [здесь](../common/how-it-works.md) и [здесь](../iptvc/how-it-works.md).
На любой из них можно нажать, и тогда в списке останутся каналы только с выбранными тегами.
Выбранные теги подсвечиваются серым.
**Сбросить** выбор можно повторным нажатием на каждый, либо кнопкой сброса у строки поиска.
??? quote "Пример фильтрации"
![Скриншот используемого фильтра списка каналов](../assets/img/pls-details/filter.jpg)
<a id="ссылка-для-тв"></a>
## Ссылка для ТВ
Она может быть задана в нескольких форматах.
Поясню базовые принципы формирования адреса:
1. необязателен префикс протокола `http://` или `https://` перед доменом
2. обязателен домен `iptv.axenov.dev` или `m3u.su`
3. обязателен `/код` плейлиста после домена
4. необязателен постфикс расширения после кода `.m3u` или `.m3u8`
На примере ниже я наглядно покажу все возможные ссылки на один и тот же плейлист с кодом `ru`:
```
https://iptv.axenov.dev/ru.m3u8
https://iptv.axenov.dev/ru.m3u
https://iptv.axenov.dev/ru
http://iptv.axenov.dev/ru.m3u8
http://iptv.axenov.dev/ru.m3u
http://iptv.axenov.dev/ru
iptv.axenov.dev/ru.m3u8
iptv.axenov.dev/ru.m3u
iptv.axenov.dev/ru
iptv.axenov.dev/ru.m3u8
iptv.axenov.dev/ru.m3u
iptv.axenov.dev/ru
https://m3u.su/ru.m3u8
https://m3u.su/ru.m3u
https://m3u.su/ru
http://m3u.su/ru.m3u8
http://m3u.su/ru.m3u
http://m3u.su/ru
m3u.su/ru.m3u8
m3u.su/ru.m3u
m3u.su/ru
m3u.su/ru.m3u8
m3u.su/ru.m3u
m3u.su/ru
```
!!! info ""
Запоминать их не надо.
Главное помнить как они формируются.
По идее, можешь использовать любую сылку из подобных, т. к. технически они отработают одинаково.
А вот твой [плеер](players.md) может не принять какую-то из них.
Так что, если не подойдёт один формат, используй другой -- добавь префикс или суффикс.
Префикс плееру требуется чаще всего, потому что он при добавлении плейлиста проверяет -- а ссылку ли мне вообще предоставил пользователь?
По наличию суффикса плеер может определить -- а прямая ли это ссылка на файл плейлиста?
Технически -- нет, непрямая, потому что файла плейлиста у меня на сервере нет физически и сервер должен сделать редирект уже на сам плейлист.
Но благодаря такой обманке плеер его наверняка подгрузит.
Или нет.

View File

@@ -0,0 +1,16 @@
---
icon: material/cogs
tags: ["плейлисты", "каналы", "теги", "iptvc", "плееры", "сайт"]
---
# :material-cogs: Как работает сервис
1. В специальном файле [playlists.ini](../formats/playlists.md) описываются плейлисты, которые кем-то опубликованы в интернете.
Каждому плейлисту присваивается свой уникальный **короткий код**.
2. В специальном файле [channels.json](../formats/channels.md) описываются **ключевые слова** (метки, теги), которые характеризуют каналы.
3. В фоновом режиме [работает ПО](../iptvc/how-it-works.md), которое периодически [проверяет все плейлисты](checks.md) из п. 1 и **присваивает теги** каналам из п. 2.
4. На главной странице сайта выводится [весь список плейлистов](list.md), которые описаны в п. 1: с тегами, описаниями и короткими кодами.
5. Каждому плейлисту на сайте посвящена [своя страничка](details.md), где отображаются результаты его проверки, проверки его каналов (с присвоенными тегами) и пр.
6. Когда пользователь [обращается к плейлисту](connect.md) по короткому коду (например, `https://m3u.su/xyz`), то происходит **переадресация** на исходный плейлист.
Более подробную информацию ты можешь прочесть в соответствующих разделах документации.

17
src/common/index.md Normal file
View File

@@ -0,0 +1,17 @@
---
icon: material/file-document
hide:
- toc
---
# Общая информация
<div class="grid cards" markdown>
- [:material-cogs: Как работает сервис](how-it-works.md)
- [:material-file-eye-outline: Как отбираются плейлисты](selection.md)
- [:material-file-refresh-outline: Как проверяются плейлисты](checks.md)
- [:fontawesome-solid-list-check: Список плейлистов](list.md)
- [:material-table-eye: Страница плейлиста](details.md)
- [:material-television-play: Как подключить плейлист](connect.md)
- [:material-multimedia: IPTV плееры](players.md)
</div>

36
src/common/list.md Normal file
View File

@@ -0,0 +1,36 @@
---
icon: fontawesome/solid/list-check
tags: ["сайт", "плейлисты"]
---
# :fontawesome-solid-list-check: Список плейлистов
Это главная страница сайта.
![Скриншот с примером главной страницы на десктопе](../assets/img/pls-list/pc.jpg)
Наверху отображаются:
* дата последнего изменения файла [playlists.ini](../formats/playlists.md)
* общее количество плейлистов и с разделением по статусам.
Ниже -- спиcок плейлистов.
## Из чего состоит список
* **Код** -- короткий уникальный [код плейлиста](../formats/playlists.md#code)
* **Информация о плейлисте**
* [статус плейлиста](../common/checks.md#плейлисты)
* может быть [значок 18+](../common/checks.md#для-взрослых)
* [название плейлиста](../formats/playlists.md#name) -- ссылка на [страницу плейлиста](../common/details.md)
под ним:
* [иконки возможностей плейлиста](../common/checks.md#возможности) (только при статусе <span class="badge online">online</span>)
* [описание плейлиста](../formats/playlists.md#desc) (при наличии)
* [список тегов](../formats/channels.md#доступные-теги), собранный со всех каналов после их проверки (только при статусе <span class="badge online">online</span>)
* ещё одна ссылка на [страницу плейлиста](../common/details.md)
* **Каналов** -- фактическое количество каналов в плейлисте (только при статусе <span class="badge online">online</span>) или 0 (при других статусах)
* **Ссылка для ТВ** -- [короткая ссылка](details.md#ссылка-для-тв), которую можно использовать для [подключения плейлиста](../common/connect.md).
В зависимости от ширины экрана, для экономии места может быть скрыто описание с иконками возможностей и короткая ссылка.
![Скриншот с примером главной страницы на смартфоне](../assets/img/pls-list/mobile.jpg)

251
src/common/players.md Normal file
View File

@@ -0,0 +1,251 @@
---
icon: material/multimedia
tags: ["плееры"]
---
# :material-multimedia: IPTV плееры
Здесь указаны **не все** плееры, существующие на этой планете, и такой цели нет.
В списке ниже только те плееры, которые широко известны и популярны у зрителей IPTV, а также рекомендуются специализированными сайтами.
Список для удобства разбит по платформам и ОС.
Обращайся к содержанию справа для быстрой навигации.
!!! info "Здесь не хватает очень много подробностей"
Если ты имел дело с каким-то плеером, знаешь как его настроить или какие-то другие детали, я прошу тебя помочь [актуализировать эту страницу](../support.md#participate), чтобы через это помочь другим пользователям с выбором и настройкой плеера под свои цели.
## Кроссплатформенные
!!! info
Эти плееры разрабатываются для множества платформ одновременно и/или существуют в виде веб-приложения.
Их можно устанавливать и открывать почти на любом подходящем устройстве.
!!! warning "Веб-приложения могут не работать со сторонними плейлистами из-за ошибок CORS"
Исправить эту ошибку может выдача разрешения на загрузку небезопасного контента в настройках сайта в браузере, но гарантий нет.
### VLC Media Player
* Скачать: <https://www.videolan.org/vlc/>
Универсальный плеер практически для любого мультимедиа-контента.
??? quote "[Скриншот] Главное окно"
![](../assets/img/players/vlc/main.jpg)
??? quote "[Скриншот] Добавление плейлиста на десктопе"
!!! warning
Указание протокола `https://` обязательно!
![](../assets/img/players/vlc/add1.jpg)
![](../assets/img/players/vlc/add2.jpg)
??? quote "[Скриншот] Добавление плейлиста на андроиде"
!!! warning
Указание протокола `https://` обязательно!
![](../assets/img/players/vlc/add1-mob.jpg)
![](../assets/img/players/vlc/add2-mob.jpg)
### Kodi
* Скачать: <https://kodi.tv>
* [Простая настройка IPTV на Kodi за 5 минут](https://prodigtv.ru/iptv/software/nastrojka-na-kodi)
Полноценный медиацентр.
Ориентирован на большие экраны и ТВ с пультами.
Имеет богатый функционал, который наращивается дополнениями, не выходя из приложения.
### IPTVnator
* Веб-версия: <https://iptvnator.vercel.app>
* Скачать: <https://github.com/4gray/iptvnator/releases/latest>
Простой рабочий плеер, который можно открыть в браузере.
Поддерживает подгрузку множества плейлистов по ссылкам, субтитры, группировку каналов, избранное.
Имеет тёмную и светлую темы.
Если использовать веб-версию, то настройки сохраняются в браузере.
??? quote "[Скриншот] Главное окно"
![](../assets/img/players/iptvnator/main.jpg)
??? quote "[Скриншот] Добавление плейлиста"
!!! warning
Указание протокола `https://` обязательно!
![](../assets/img/players/iptvnator/add1.jpg)
![](../assets/img/players/iptvnator/add2.jpg)
### KMPlayer
* Скачать: <https://www.kmplayer.com/home>
### OttPlayer
* Веб-версия: <http://widget.ottplayer.tv>
* Скачать: <https://ottplayer.tv/soft>
!!! warning "Требует учётную запись сервиса ottplayer.tv"
### Ott-Play
* Веб-версия: <https://ottp.eu.org/f/pc/>
* Скачать: <https://ottp.eu.org/www/install/>
!!! warning "Ошибка CORS"
Она может не уйти даже если менять [плеер в настройках](https://ottp.eu.org/www/faq/#q4003).
---
!!! info "Ниже перечислено ПО, специфичное только для конкретных платформ"
## Десктопные
### Windows
#### IP-TV Player
* Скачать: <https://borpas.info/iptvplayer>
---
### Linux
#### yuki-iptv
* Скачать: <https://codeberg.org/liya/yuki-iptv/releases/latest>
Продолжение развития Astroncia IPTV.
Визуально очень похож на IP-TV Player для Windows.
Поддерживает плейлисты по ссылкам, сторонние телепрограммы, группировку каналов, изменение плейлистов и многое другое.
??? quote "[Скриншот] Главное окно"
![](../assets/img/players/yuki-iptv/main.jpg)
??? quote "[Скриншот] Добавление плейлиста"
!!! warning
Указание протокола `https://` обязательно!
![](../assets/img/players/yuki-iptv/add.jpg)
---
## SmartTV
### SS IPTV
* Сайт: <https://ss-iptv.com/ru/>
* Веб-версия: <https://app.ss-iptv.com> (скорее всего, не заработает)
* Редактор плейлистов: <https://ss-iptv.com/ru/users/playlist>
* Установить: <https://ss-iptv.com/ru/users/documents/installing>
Плеер, который предустанавливается в ПО некоторых телевизоров и некоторых приставок.
### Forkplayer
---
## Мобильные
### Кроссплатформенные
#### GSE SMART IPTV
---
### Android
#### M3U
* Скачать: <https://f-droid.org/ru/packages/com.m3u.androidApp>
Умеет показывать картинку-в-картинке, отображать группы и сортировать каналы.
Программу передач нужно [подключать отдельной ссылкой](../faq.md#epg), из плейлиста не тянет.
??? quote "[Скриншот] Главный экран"
![](../assets/img/players/m3u/main.jpg)
??? quote "[Скриншот] Добавление плейлиста"
!!! warning
Указание протокола `https://` обязательно!
![](../assets/img/players/m3u/add1.jpg)
![](../assets/img/players/m3u/add2.jpg)
??? quote "[Скриншот] Установка User-Agent"
![](../assets/img/players/m3u/ua1.jpg)
![](../assets/img/players/m3u/ua2.jpg)
#### Lazy IPTV
#### Perfect Player
#### Televizo IPTV Player
#### TiviMate
#### Lazy IPTV Deluxe
#### OTT Navigator
#### IPTV Player Live
---
### macOS, iOS, AppleTV
#### GoodPlayer
#### ProgTV
#### microiptv
#### Xtream IPTV
* Скачать: [apps.apple.com](https://apps.apple.com/ru/app/xtream-iptv-tv-player-ip-pro/id1583776992)
#### Nplayer
* Скачать: [apps.apple.com](https://apps.apple.com/ru/app/nplayer/id1116905928)
#### Nplayer Lite
* Скачать: [apps.apple.com](https://apps.apple.com/ru/app/nplayer-lite/id1078835991)
#### IPTV плеер
* Скачать: [apps.apple.com](https://apps.apple.com/ru/app/iptv/id1598794264)
#### Peers.TV
* Скачать: [apps.apple.com](https://apps.apple.com/ru/app/peers-tv/id540754699)
#### SPB TV Россия
* Скачать: [apps.apple.com](https://apps.apple.com/ru/app/spb-tv/id1056140537)
#### Русское TV
* Скачать: [apps.apple.com](https://apps.apple.com/ru/app/%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%B5-%D1%82%D0%B2-hd-%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD-%D1%82%D0%B2/id594760614)
#### Tviz
* Скачать: [apps.apple.com](https://apps.apple.com/ru/app/%D1%82%D0%B5%D0%BB%D0%B5%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0-tviz-%D1%82%D0%B2-%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD/id816291886)
#### Лайм HD TV
* Скачать: [apps.apple.com](https://apps.apple.com/ru/app/%D0%BB%D0%B0%D0%B9%D0%BC-hd-tv-%D1%82%D0%B2-%D0%BA%D0%B8%D0%BD%D0%BE-%D0%B8-%D1%81%D0%B5%D1%80%D0%B8%D0%B0%D0%BB%D1%8B/id998832333)
#### TV+
* Скачать: [apps.apple.com](https://apps.apple.com/ru/app/tv-%D0%BF%D0%BB%D1%8E%D1%81-hd-%D1%82%D0%B5%D0%BB%D0%B5%D0%B2%D0%B8%D0%B7%D0%BE%D1%80-%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD/id1141924092?l=en)
#### UniPlayer
* Скачать: [apps.apple.com](https://apps.apple.com/ru/app/uniplayer-iptv-ott-solution/id1208562731)
#### ProgTV
* Скачать: [apps.apple.com](https://apps.apple.com/ru/app/progtv/id1447796133)
---

15
src/common/selection.md Normal file
View File

@@ -0,0 +1,15 @@
---
icon: material/file-eye-outline
tags: ["статусы", "плейлисты"]
---
# :material-file-eye-outline: Как отбираются плейлисты
Есть некоторые критерии, по которым плейлисты отбираются в проект:
* Прежде всего -- каналы РФ и бывшего СНГ, но не только они
* Открытый источник
* Прямая ссылка на плейлист
* Автообновление плейлиста
В основном, в плейлистах именно трансляции телеканалов, но может быть и просто список каких-то (мульт)фильмов и записи телепередач, находящихся на чужих дисках (как если бы вы сами составили плейлист, например, с музыкой).

9
src/dev/deploy.md Normal file
View File

@@ -0,0 +1,9 @@
---
icon: material/upload-network
---
# :material-upload-network: Развёртывание и доставка обновлений
!!! info "TODO"
Скоро здесь появится полезная информация.
Следи за обновлениями в канале [@iptv_aggregator](https://t.me/iptv_aggregator) или в [репозитории](https://git.axenov.dev/IPTV/docs).

97
src/dev/docs.md Normal file
View File

@@ -0,0 +1,97 @@
---
icon: material/book-cog-outline
---
# :material-book-cog-outline: Сборка документации
## Стилистика и правила оформления
Все исходники хранятся в директории `src/` в формате **Markdown** (формат файлов `.md`).
Структура проекта и его конфигурация описываются в файле `mkdocs.yml` в корне репозитория.
Структура исходных файлов документации и содержание должны быть согласованными.
Все ссылки на соседние страницы и изображения должны быть относительными.
**Каждое предложение должно быть на одной строке.**
Это даёт более наглядную разницу (diff) в тексте при работе с git.
Абзацы и списки должны отделяться 1 пустой строкой сверху и снизу.
Допустимо использовать любые стилистические возможности темы **Material for MkDocs** и самого **mkdocs**, но не следует визуально перегружать текст.
Документацию по ним см. по ссылкам ниже.
## Добавление изображений
**Все изображения хранятся только в директории `src/assets/img/` и вложенных в неё.**
Общая суть такова:
* чем больше размеры, тем хуже должно быть качество;
* чем меньше размеры, тем чётче должен быть текст.
Каждое изображение должно:
* быть сохранено в формате jpg;
* иметь размер неболее 150 Кб;
* быть сжатым с качеством 65-80% от исходного;
* быть размером до 1500 px по наибольшей стороне.
Если на изображении есть текст, он должен оставаться различимым и читаемым.
Но если на изображении есть любые конфиденциальные данные и его невозможно кадрировать без потери смысла, то их необходимо скрыть.
Хорошей практикой будет использовать спойлеры для скрытия больших и/или идущих подряд нескольких изображений, например:
```
Совершенно любой текст, lorem ipsum dolor sit amet.
Совершенно любой текст, lorem ipsum dolor sit amet.
??? quote "В этом спойлере несколько больших картинок"
![Подпись-плейсхолдер1](../assets/img/example1.jpg)
![Подпись-плейсхолдер2](../assets/img/example2.jpg)
Продолжение текста, lorem ipsum dolor sit amet.
Продолжение текста, lorem ipsum dolor sit amet.
```
Эти простые правила позволят поддерживать репозиторий достаточно компактным, а страницы делать комфортными для чтения, экономя трафик для мобильных устройств.
## Стек
* make
* [docker](https://docker.com)
* [mkdocs](https://www.mkdocs.org/)
* [squidfunk/mkdocs-material](https://hub.docker.com/r/squidfunk/mkdocs-material)
* <https://squidfunk.github.io/mkdocs-material>
* <https://squidfunk.github.io/mkdocs-material/reference/admonitions/>
* <https://squidfunk.github.io/mkdocs-material/reference/icons-emojis/>
## Запуск mkdocs в контейнере
```
make live
```
Перегенерирует документацию на лету сразу после изменения файлов.
Открывает [localhost:3000](https://localhost:3000) для просмотра изменений в реальном времени.
## Генерация статических файлов
```
make build
```
Генерирует статические файлы, которую можно версионировать и хранить/деплоить отдельно.
Открывает [localhost:8080/docs](https://localhost:8080/docs) для просмотра сгенерированной документации.
Готовый скомпилированный статический сайт с документацией находится в директории `site/`.
Он же хранится в репозитории вместе с исходными файлами, потому что:
* я посчитал это **более удобным для деплоя**: ради редких обновлений нет смысла тратить ресурсы серверов на ci/cd, actions по хукам и перманентную работу `mkdocs` в режиме `build`;
* я посчитал это **более удобным для использования**: можно в любой момент открыть актуальную документацию в браузере через `site/index.html` без необходимости `make` и `docker`.
Пересборка должна происходить перед каждым коммитом.

29
src/dev/index.md Normal file
View File

@@ -0,0 +1,29 @@
---
icon: simple/devbox
hide:
- toc
---
# :simple-devbox: Для разработчиков
<div class="grid cards" markdown>
- [:material-application-brackets-outline: Среда разработки](local-dev.md)
---
Настройка ПО для работы с кодом проекта
- [:material-robot-outline: Telegram-бот](tgbot.md)
---
Специфика разработки и отладки Telegram-бота проекта
- [:material-book-cog-outline: Сборка документации](docs.md)
---
Как скорректировать, проверить и скомплировать эту документацию
- [:material-upload-network: Развёртывание и доставка обновлений](deploy.md)
---
О том, как опубликовать изменения на сервере
</div>

9
src/dev/local-dev.md Normal file
View File

@@ -0,0 +1,9 @@
---
icon: material/application-brackets-outline
---
# :material-application-brackets-outline: Среда разработки
!!! info "TODO"
Скоро здесь появится полезная информация.
Следи за обновлениями в канале [@iptv_aggregator](https://t.me/iptv_aggregator) или в [репозитории](https://git.axenov.dev/IPTV/docs).

80
src/dev/tgbot.md Normal file
View File

@@ -0,0 +1,80 @@
---
icon: material/robot-outline
---
# :material-robot-outline: Telegram-бот
!!! info "Обрати внимание"
Локальная среда разработки должна быть [настроена и запущена](local-dev.md).
## Подготовка бота на стороне Telegram
1. Написать [@botfather](https://t.me/botfather), создать бота
2. Полученный токен установить значением переменной `TG_BOT_TOKEN` в файле `.env` репозитория `web`
3. Командой `/mybots` в [@botfather](https://t.me/botfather) выбрать свежесозданного бота, далее `Edit Bot` > `Edit Commands` и отправить текст:
```
list - Список плейлистов
info - Подробности о плейлисте по его коду
help - Помощь по командам бота
links - Ссылки на все страницы проекта
stats - Статистика по плейлистам и каналам
```
## Проброс внешних запросов на локальную машину
1. Установить [telebit](https://telebit.cloud) и пройти примитивную регистрацию.
В результате будет выдан уникальный адрес в формате `https://foo-bar-99.telebit.io`.
На email, указанный при регистрации, будет оформлен бесплатный SSL-серификат Let's Encrypt для этого домена.
Если адрес не используется месяц+, то сертификат протухнет, но он автоматически восстановится, если адрес начнёт использоваться вновь.
2. В терминале выполнить:
```
telebit http 8080
```
где 8080 -- порт локальной машины, на который проброшен порт 80 из контейнера `iptv-nginx`.
Для выключения выполнить:
```
telebit http
```
3. Проверить работу адреса, перейдя по нему браузером.
Должен открыться твой локальный проект.
4. Полученный адрес установить значением переменной `APP_URL` в файле `.env` репозитория `web`
5. Установить веб-хук, отправив запрос браузером или любым HTTP-клиентом на адрес:
```
https://api.telegram.org/bot$BOT_TOKEN/setWebhook?url=$TELEBIT_URL/bot/webhook&secret_token=$SECRET_TOKEN
```
где:
* `$BOT_TOKEN` - авторизационный токен, который @botfather выдал твоему боту;
* `$TELEBIT_URL` - адрес, который telebit выдал тебе;
* `$SECRET_TOKEN` - секретный токен, опционален, см. ниже.
6. Проверить веб-хук, отправив запрос браузером или любым HTTP-клиентом на адрес:
```
https://api.telegram.org/bot$BOT_TOKEN/getWebhookInfo
```
где:
* `$BOT_TOKEN` - авторизационный токен, который @botfather выдал твоему боту.
7. После разработки нужно установить "боевой" адрес веб-хука аналогично п4.
## Что за секретный токен?
Telegram авторизует твоего бота по токену, который выдал ему сам.
Ты тоже можешь (не) авторизовать Telegram по токену, который ты выдашь ему.
Для этого нужно в значением переменной `TG_BOT_SECRET` в файле `.env` репозитория `web` установить любую строку.
Если ты это сделаешь, тогда ту же строку ты должен передать в параметре `secret_token` метода `setWebhook`.
В этом случае, все HTTP-запросы, которые приходят от Telegram, будут содержать заголовок `X-Telegram-Bot-Api-Secret-Token` со этой строкой в качестве значения.
Эта строка сверяется с той, что указана в `.env` проекта.
Если такого заголовка нет или его значение некорректно, входящий запрос отклоняется.
Если переменная `TG_BOT_SECRET` не задана, то заголовок проверяться не будет.
См. подробности в документации: [setWebhook](https://core.telegram.org/bots/api#setwebhook)

36
src/docs.md Normal file
View File

@@ -0,0 +1,36 @@
---
icon: material/book-open-page-variant-outline
---
# :material-book-open-page-variant-outline: Работа с документацией
!!! warning "Актуальность"
Она может отставать от актуальной версии сервиса, его исходных кодов и инфраструктуры.
Поддерживать документацию в актуальном состоянии -- тоже труд.
Прошу отнестись с пониманием, а лучше -- [помочь делом](support.md#participate).
!!! danger "Тем не менее, прошу прочесть её!"
Потому что очень часто и мне, и в общий чат поступают одинаковые вопросы, на которые уже просто нет сил отвечать персонально.
Если у тебя возникает вопрос, на который уже есть ответ на одной из этих страниц, то ты рискуешь
* либо быть посланным сюда;
* либо быть посланным далеко не сюда;
* либо остаться в игноре.
## Навигация
К твоим услугам:
1. в заголовке сайта -- глобальный поиск;
2. слева -- общее содержание;
3. справа -- содержание конкретной страницы;
4. над заголовком страницы -- метки страницы (полный список ниже).
## Связанные статьи
Эти статьи пролинкованы между собой и сгруппированы про темам (меткам).
---
<!-- material/tags -->

333
src/faq.md Normal file
View File

@@ -0,0 +1,333 @@
---
icon: material/frequently-asked-questions
tags: ["сайт", "каналы", "плейлисты", "epg", "плееры", "user-agent", "wink", "подписка"]
---
# :material-frequently-asked-questions: FAQ (ЧАстые ВОпросы)
## Не работает канал!
Ну штош ¯\\\_(ツ)\_/¯
## Добавь каналы!
Нет.
## Удали каналы!
Нет.
## Но мне нужны конкретные каналы!
Ищи.
## Сделай мне плейлист!
Нет.
## Исправь плейлист!
Нет.
## А за деньги?
[Пожертвованиям](support.md) я только рад.
Но нет.
## У канала нет логотипа!
Вспоминай.
## Нет программы передач (EPG) у канала, что делать?
Фига в том, что EPG может быть и [указан](formats/m3u.md#url-tvg) в плейлисте, но у конкретного канала могут быть указаны некорректные [`tvg-id`](formats/m3u.md#tvg-id) или [`tvg-name`](formats/m3u.md#tvg-name).
Может, его дёрнули из другого листа и не подогнали под другую EPG.
Так, что вариантов масса:
* смотреть как есть;
* найти другой плейлист, где этот канал есть не только сам по себе, но и с телепрограммой;
* скачать плейлист себе файлом, исправить атрибуты канала и добавить в плеер уже этот лист, но забыть о его автообновлении;
* настроить другую программу передач (см. ниже).
Также, помни, что не все плееры вообще поддерживают работу с телепрограммой.
## Нет программы передач (EPG) у плейлиста, что делать?
Помни:
* не все плееры вообще поддерживают работу с телепрограммой;
* в плейлисте она просто может быть не указана.
Но если [плеер](common/players.md) позволяет, можно указать ссылку на сторонную телепрограмму.
И это целое дело.
Надо чтобы совпадали [`tvg-id`](formats/m3u.md#tvg-id) или [`tvg-name`](formats/m3u.md#tvg-name) каналов с теми, которые указываются в EPG.
Так что не всякая телепрограмма подойдёт, не ко всякому плейлисту и не ко всем каналам.
Надо подбирать и то, и то.
<a id="epg"></a>
## А где взять программу передач (EPG)?
1. Из самого плейлиста.
Часто в атрибут [`url-tvg`](formats/m3u.md#url-tvg) тега `#EXTM3U` указывают одну или две ссылки на EPG, разделяя их `;`.
Их можно использовать отдельно, например, если плеер не может корректно обработать такое значение.
2. Взять одну из этих ссылок:
* `http://epg.it999.ru/edem.xml.gz`
* `http://iptv-content.webhop.net/guide.xml`
* `http://www.teleguide.info/download/new3/xmltv.xml.gz`
* `https://ottepg.ru/ottepg.xml.gz`
* `http://stb.shara-tv.org/epg/epgtv.xml.gz`
* `http://st.kineskop.tv/epg.xml.gz`
* `https://iptvx.one/epg/epg_lite.xml.gz`
* `https://iptvx.one/epg/epg.xml.gz`
3. Найти другие здесь:
* `https://iptvx.one/viewtopic.php?f=12&t=4`
* `https://iptvmaster.ru/epg-for-iptv`
* [https://google.com](https://google.com)
## Эти плейлисты бесплатны?
Возможно.
По крайней мере, так утверждают источники, которые их распространяют.
Но гарантий никаких никто не даёт.
Любой плейлист и любой канал в любом плейлисте может сдохнуть навсегда в любой момент.
Или показывать [заглушку](#заглушка).
И претензии на этот счёт я не принимаю.
## Почему на сайте плейлист онлайн, но в нём 0 каналов?
[Тебе сюда](common/checks.md#плейлисты).
## Почему на сайте плейлист онлайн, но у меня он не работает?
Что значит "не работает"?
* Ты уверен, что ссылка в [правильном формате](common/details.md#ссылка-для-тв)?
* Ты уверен, что у тебя нормальное интернет-соединение?
* Плеер показывает какую-то ошибку при добавлении плейлиста?
* Плейлист добавляется по ссылке, но каналы не загружаются или плеер зависает?
* Плейлист добавляется в плеер, каналы загружаются полностью, но не каналы показывают?
* А есть скриншоты? Логи? Тексты ошибок?
Попробуй погуглить проблему с конкретным плеером, может ты не один с такой проблемой.
Или [узнать в чате](tg/chat.md).
Но вообще, это зависит от:
* автора плейлиста (дохлые каналы почти всегда есть даже в свежайших листах, но если лист не обновлялся год, что ты вряд-ли узнаешь, то рабочих каналов там не ищи);
* твоего [плеера](common/players.md) (видеотрансляции могут использовать кодек, который просто не поддерживается плеером);
* ширины твоего интернет-канала (не надо пытаться врубать FHD/4K трансляции с мобильного интернета на самом дешёвом тарифе в лесу);
* ретроградности Меркурия и магнитных бурь (а вдруг);
* настроек твоей сети, твоего интернет-провайдера, VPN (подумай хорошенько, хочешь ли ты смотреть российские каналы из РФ через Уганду или США);
* степени цензурирования интернета в твоём государстве (некоторые хосты официально блочатся на уровне провайдеров);
* чёрта лысого.
Я не знаю.
Вряд-ли знает хоть кто-то.
## А если я добавлю себе плейлист отсюда, он будет работать? Долго?
Наверное, будет.
Наверное, даже долго.
Мёртвые плейлисты я периодически вычищаю, реже -- добавляю новые.
Короткие коды плейлистов могут меняться, поэтому вполне может произойти внезапная подмена одного другим, однако это происходит крайне редко.
Плюс читай выше про доверие результатам проверки (проблема может быть не стороне сервиса).
## В плейлистах порнуха!
Да, в плейлистах порнуха.
Это [явно помечается](common/checks.md#для-взрослых) везде, где это технически возможно.
Смотри с удовольствием сколько хочешь, всё для тебя.
Или без удовольствия.
Или не смотри.
Или не хоти.
### Но у меня же дети! Яжмать! Яжотец!
Я вот детям порнуху не показываю.
Ты тоже не показывай.
Это твоя проблема.
## Как часто изменяется список плейлистов?
Время от времени.
Периодически я наблюдаю за ними и удаляю нерабочие.
Иногда я гуляю по интернету и ищу другие плейлисты, которых в проекте ещё нет.
Если есть кандидаты на добавление, то читай ниже.
## Что значит автообновляемый плейлист?
Например, ты на своём компе:
* открываешь любой текстовый редактор;
* оформляешь текст в формате [m3u](formats/m3u.md);
* сохраняешь в файл `pls.m3u`.
Получился плейлист `pls.m3u`.
Открываешь его в проигрывателе (плеере) **вручную** и наслаждаешься.
Спустя время, ты хочешь его изменить:
* открываешь файл `pls.m3u` в любом текстовом редакторе;
* изменяешь текст (добавляешь или удаляешь записи);
* сохраняешь в файл `pls.m3u`.
Плейлист `pls.m3u` обновлён на диске **вручную**.
Открываешь его в плеере **вручную** и наслаждаешься.
Но править его ручками неудобно, нужно что-то попроще:
* запускаешь свой плеер;
* открываешь в нём окно плейлиста (он же "список воспроизведения");
* накидываешь туда файлов из какой-нибудь папки;
* сохраняешь в файл `pls.m3u`.
Надо изменить?
Тоже легко:
* открываешь файл `pls.m3u` в плеере;
* накидываешь туда ещё файлов из какой-нибудь папки;
* сохраняешь в файл `pls.m3u`.
Плейлист `pls.m3u` обновлён на диске.
Но всё ещё **вручную**, просто немного поудобнее.
Открываешь его в плеере, тоже **вручную** (потому что, скорее всего, он просто у тебя под курсором и проще дважды кликнуть по нему, а без этого плеер не сам может и не перечитать плейлист с диска), и наслаждаешься.
Теперь представь, что кто-то сделал всё то же самое, но открыл доступ к своему файлу плейлиста по ссылке.
Ты добавляешь плейлист в плеер по этой ссылке и сразу наслаждаешься.
В чём плюсы:
* ты сам не изменяешь этот *чей-то* файл и не паришься;
* возможно, кто-то за ним следит и периодически обновляет самостоятельно (вручную или как-то автоматически -- это не твоя проблема);
* возможно, твой плеер сам подтянет плейлист после запуска (чаще всего так и происходит) или по твоей команде (если такая кнопка в нём есть) -- **это и есть автообновление**.
В чём минус: этот *кто-то* по своим причинам может удалить твой любимый канал.
Чаще всего это происходитвпо двум причинам:
* *указанный в этом плейлисте* канал перестал вещать;
* к автору обратились правообладатели *указанный в этом плейлисте* канала и велели убрать нелегальщину.
Таким образом, при следующем открытии плеера, у тебя будет **автоматически обновлённый** твоим плеером на твоём устройстве плейлист.
## Как часто обновляется содержимое плейлистов?
Зависит от источника.
Я этим не занимаюсь.
## Есть приложение?
Нет, и не планируется.
Ищи [плеер](common/players.md) и добавляй плейлист туда по ссылке.
<a id="заглушка"></a>
## На канале отображается заглушка
<a id=аглушка1"></a>
### Просят денег и/или подписку
??? quote "[Скриншот] Уважаемый клиент! Для возобновления просмотра Вам необходимо использовать не более 2 устройств"
![](assets/img/paywalls/1.jpg)
> Уважаемый клиент! Для возобновления просмотра Вам необходимо использовать не более 2 устройств.
> Обратитесь к поставщику контента для уточнения.
??? quote "[Скриншот] Ваша подписка не активна"
![](assets/img/paywalls/2.jpg)
> Ваша подписка не активна
> Your subscription is not active
??? quote "[Скриншот] Мы обнаружили систематическое нарушение правил использования нашего сервиса"
![](assets/img/paywalls/3.jpg)
> Мы обнаружили систематическое нарушение правил использования нашего сервиса и заблокировали возможность просмотра контента.
> Для возобновления просмотра необходимо сменить OTTID в личном кабинете, и обновить плейлисты на ваших устройствах.
> Если вы считаете, что произошла какая-то ошибка - пожалуйста, обратитесь в техподдержку.
Кто-то взял платный (или временный демонстрационный) плейлист и распространил его как бесплатный.
Такие бесплатно работать не будут, а если и работают, то недолго и не у всех.
Забудь про этот плейлист.
Ищи другой.
Без вариантов.
Такова цена халявы.
Этот плейлист -- главный кандидат на удаление с сайта.
<a id="wink"></a>
### Wink
??? quote "[Скриншот] Просмотр ТВ-каналов, фильмов и сериалов доступен только в официальных приложениях Wink и на территории России"
![](assets/img/paywalls/wink.jpg)
> Просмотр ТВ-каналов, фильмов и сериалов доступен только в официальных приложениях Wink и на территории России
Кто-то воткнул платный канал в плейлист и распространил его как бесплатный.
Если ты не сидишь под российским IP, то можешь сразу искать другой плейлист.
Если ты в РФ, то попробуй использовать [плеер](common/players.md), который позволяет указать **User-Agent**, и вставить туда какой-нибудь из этих:
```
Mozilla/5.0 WINK/1.28.2 (AndroidTV/9) HlsWinkPlayer
Mozilla/5.0 WINK/1.30.1 (AndroidTV/9) HlsWinkPlayer
Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
Mozilla/5.0 WINK/1.42.1 (AndroidTV/12) HlsWinkPlayer
Mozilla/5.0 WINK/1.31.1 (AndroidTV/7.1.1) HlsWinkPlayer
Mozilla/5.0 (Linux; arm; Android 9; WinkBox 2)
Mozilla/5.0 (Linux; Android 9; SWITRON-i12A Build/PSV1.210329.021; wv)
Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
```
Гарантий никаких, но кому-то помогает.
Можно попробовать прописать без `Mozilla/5.0` в начале, но это не должно быть критично.
Или подключи подписку Wink.
Или забудь про этот плейлист и ищи другой.
## Откуда берутся логотипы каналов и программы передач?
Всё это (не) [указывается](formats/m3u.md#tvg-logo) внутри плейлиста его авторами.
Но в некоторых [плеерах](common/players.md) можно вручную указывать программу передач (см. ниже).
## Где спортивные каналы? Почему они не работают?
Спортивные телеканалы очень пристально следят за тем, куда текут их трансляции.
Они зарабатывают на спорте и активно защищают свои права на трансляцию каких-то уникальных спортивных состязаний и событий.
Они активно рубят все левые источники, приходят к авторам плейлистов и любезно просят удалить любые упоминания, ссылки и трансляции их каналов из паблика.
Винить в этом кого-то и бороться с этим бессмысленно.
Это большой бизнес, и он будет вне зависимости от нашего желания.
Поэтому некоторые авторы сразу предупреждают, что в плейлистах таких каналов нет.
Судиться потом, вот это всё... нафиг надо.
Нет, я не буду добавлять каналы в плейлисты.
Если будет спортивный рабочий плейлист -- добавлю на сайт.
## Как добавить плейлист в общий список?
Сделать pull-request в [репозиторий](https://git.axenov.dev/IPTV/playlists).
Я проверю плейлист и добавлю его, если всё ок.

112
src/formats/channels.md Normal file
View File

@@ -0,0 +1,112 @@
---
icon: material/code-json
tags: ["iptvc", "теги", "каналы"]
---
# :material-code-json: Формат файла `channels.json`
Категории каналов указываются в файле `channels.json` в следующем формате:
```json
[
{
"tvg-id": "регулярное выражение для значения атрибута tvg-id",
"tvg-name": "регулярное выражение для значения атрибута tvg-name",
"title": "регулярное выражение для названия канала",
"tags": [
"список",
"тегов",
"(см. ниже)"
]
}
]
```
Приоритет параметров:
* `tvg-id`
* `tvg-name`
* `title`
Если указаны все или несколько, то применится только тот один, который по приоритету выше.
Параметр `tags` обязателен, список может быть (не)пустым.
Категории в списке указываются в двойных кавычках.
После каждой категории, кроме последней, ставится запятая.
Регулярные выражения должны быть PCRE-совместимыми.
Каналы сопоставляются в нижнем регистре.
<a id="warnings"></a>
## Рекомендации и предостережения
1. Если хочешь написать новое правило, будь осторожен с регулярками.
Старайся не охватывать несколько каналов сразу.
Если канал попадёт в несколько регулярок, то его **теги могут оказаться неожиданными** и найти проблему может быть сложно.
2. Указывай внутри `{}` только `tags` и один из параметров `tvg-id`, `tvg-name` или `title`.
Множество параметров на точность не влияет, зато будет проще уместить всё правило в одну строку и grep-ать файл.
3. Не забывай, что название на кириллице не всегда означает, что это российский канал или вещание на русском языке.
4. Разные каналы могут быть названы одинаково или похоже.
Например, `Первый канал`, `Первый Тульский`, `Первый городской`.
5. Один канал может быть назван по-разному.
Например, `Ю` или `Ю!`, `Россия 1 +5` или `Россия-1`.
6. Важно учитывать холдинги.
Например, российские Матч, ТНТ и НТВ имеют множество разных каналов, и тупо искать `^нтв$` -- тупо.
7. У всех каналов есть `title`.
Не все каналы имеют `tvg-id`.
Некоторые каналы имеют `tvg-name`.
Все три параметра могут оказаться на кириллице.
<a id="доступные-теги">
## Доступные теги
| Ключевое слово | Описание |
| -------------- | ----------------------------------------------------------- |
| `untagged` | Неизвестно (ставится по умолчанию, если нет иных) |
| `unstable` | Нестабильные каналы |
| `hd` | Каналы в высоком качестве |
| `4k` | Каналы в супервысоком качестве |
| `8k` | Каналы в гигавысоком качестве (а вдруг?) |
| `adult` | Контент для взрослых 18+ |
| `army` | Каналы военные, об оружии, технике, армии, боевых действиях |
| `central` | Центральное ТВ (гос. каналы, федеральные) |
| `child` | Детские и подростковые каналы |
| `culture` | Каналы о культуре, театре |
| `crime` | Каналы с детективами и о преступлениях (true-crime) |
| `cyber` | Киберспортивные |
| `docs` | Каналы с документальными фильмами |
| `fashion` | Мода и стиль |
| `film` | Каналы с фильмами |
| `finance` | Бизнес, финансы, капитал |
| `food` | Кулинарные каналы |
| `fun` | Развлекательные каналы и шоу |
| `garden` | Сад, огород, фермерство, домашнее хозяйство |
| `health` | Каналы о здоровье |
| `history` | Исторические каналы |
| `house` | О строительстве, ремонте, интерьере и жилье |
| `humor` | Юмористические каналы, комедии |
| `hunt-fish` | Охота и рыбалка |
| `local` | Местные региональные каналы |
| `music` | Музыкальные |
| `mystic` | Каналы о мистике, потустороннем, НЛО и прочей пиздаболии |
| `nature` | Каналы о природе, животных |
| `news` | Новостные каналы |
| `politic` | Каналы политические, партийные, правительстенные |
| `radio` | Радиоканалы (радиостанции, подкасты, аудиоспектакли...) |
| `religion` | Религиозные каналы |
| `retro` | Ностальгия и ретро, музыка, старые передачи |
| `sci` | Научные и познавательные |
| `series` | Каналы с сериалами |
| `shopping` | Телемагазины |
| `sport` | Спортивные |
| `tech` | Каналы о технологиях |
| `transport` | Каналы о транспорте (авто, мото, ЖД...) |
| `travel` | Каналы о путешествиях |
| `webcam` | Уличные веб-камеры |
Также в категориях можно указывать страну вещания.
Это должен быть буквенный код АЛЬФА-2 из общероссийского классификатора стран мира (ОКСМ):
* [normativ.kontur.ru](https://normativ.kontur.ru/document?moduleId=1&documentId=22668#h1296)
* [classifikators.ru](https://classifikators.ru/oksm)

24
src/formats/index.md Normal file
View File

@@ -0,0 +1,24 @@
---
icon: material/file-code-outline
hide:
- toc
---
# :material-file-code-outline: Форматы файлов
<div class="grid cards" markdown>
- [:material-code-brackets: Формат файла `playlists.ini`](playlists.md)
---
Список плейлистов, которые отображаются на сайте и периодически проверяются
- [:material-code-json: Формат файла `channels.json`](channels.md)
---
Список правил для применения тегов к разным каналам
- [:material-playlist-play: Формат файлов `*.m3u` (`*.m3u8`)](m3u.md)
---
Плейлист -- это вообще что?
</div>

148
src/formats/m3u.md Normal file
View File

@@ -0,0 +1,148 @@
---
icon: material/playlist-play
tags: ["плейлисты", "каналы"]
---
# :material-playlist-play: Формат файлов `*.m3u` (`*.m3u8`)
Формат применяется для составления мультимедиа плейлистов, как оффлайн, так и онлайн.
Разница между m3u и m3u8 уже давно отсутствует, но исторически так сложилось, то m3u8 должен был быть только в формате UTF-8.
Директивы начинаются с новой строки и символа `#`.
У каждой директивы могут (не) быть атрибуты, которые следуют в одну строку.
После директив с новой строки указывается ссылка на канал (или путь к файлу).
В свою чередь, по этой ссылке может быть:
* либо текстовое представление контента в формате m3u/m3u8/XMLTV/MPD с описанием непосредственно участки трансляции;
* либо непосредственно сама потоковая трансляция mp4 или т. п.
Рассмотрим на выдуманном примере плейлиста IPTV:
```m3u
#EXTM3U url-tvg="https://iptvx.one/EPG" catchup="append" catchup-days="3" catchup-source="?offset=-${offset}&utcstart=${timestamp}"
#EXTINF:-1 tvg-id="ntv" tvg-logo="http://epg.it999.ru/img2/2001.png",НТВ HD
#EXTGRP:🇷🇺 Эфирные
http://example.com/play-ntv.m3u
#EXTINF:-1 tvg-logo="http://tvoetv.space/tvoetv.png" tvg-id="tvoetv",Твоё ТВ HD v8 с VPN
http://example.com/play-tvoetv.m3u
#EXTINF:0 tvg-name="BBC" audio-track="eng" tvg-logo="http://mylogos.domain/BBC.png", BBC World
http://example.com/play-bbc.m3u
#EXTINF:-1 tvg-id="5TV.am" tvg-country="AM" tvg-language="Armenian" tvg-logo="https://i.imgur.com/yigw9dr.png" user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148" group-title="General",5-րդ ալիք (480p)
#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148
#EXTVLCOPT:http-caching=1200
http://example.com/play-am.m3u8
```
<a id="EXTM3U"></a>
### Директива `#EXTM3U`
Заголовок файла (обязателен).
<a id="url-tvg"></a>
#### Атрибут `url-tvg` (он же `x-tvg-url`)
Ссылка программу передач в формате `*.xml` или `*.xml.gz`.
<a id="catchup"></a>
#### Атрибуты `catchup*`
Читай здесь: [Архив телепрограмм (SS IPTV)](https://ss-iptv.com/ru/operators/catchup)
<a id="EXTGRP"></a>
### Директива `#EXTGRP`
Название группы, к которой относится контент (звуковая дорожка или канал).
Указывается в формате `#EXTGRP:XXX`, где: `XXX` -- название группы.
<a id="EXTINF"></a>
### Директива `#EXTINF`
Описывает контент (звуковую дорожку или канал).
Указывается в формате `#EXTINF:XXX YYY,ZZZ`, где:
* `XXX` -- длительность в секундах (обязательно, но может быть `-1` или `0`);
* `YYY` -- атрибуты (см. ниже);
* `ZZZ` -- название контента;
<a id="tvg-shift"></a>
#### Атрибут `tvg-shift`
ещение телепрограммы в часах относительно указанного в программе.
<a id="tvg-id"></a>
<a id="tvg-name"></a>
#### Атрибуты `tvg-id` и `tvg-name`
Идентификатор телепрограммы канала.
По нему телепрограмма привязывается к трансляции с учётом смещения времени.
<a id="tvg-logo"></a>
#### Атрибут `tvg-logo`
Ссылка на логотип канала.
<a id="tvg-country"></a>
#### Атрибут `tvg-country`
Код Alpha-2 страны вещания согласно ISO 3166-1 или ОКСМ.
<a id="tvg-language"></a>
#### Атрибут `tvg-language`
Название языка телепередачи согласно ISO 639-2.
<a id="group-title"></a>
#### Атрибут `group-title`
Название группы.
По функционалу идентичен директиве `#EXTGRP`.
<a id="user-agent"></a>
#### Атрибут `user-agent`
Значение заголовка `User-Agent` для обращения к контенту по http.
<a id="audio-track"></a>
#### Атрибут `audio-track`
Языковой код (ISO 639-2) аудио дорожки канала, например: "eng,rus".
Допускается указание нескольких аудио дорожек через запятую: "rus,ukr,eng".
Дорожкой по умолчанию устанавливается первая указанная в списке.
<a id="aspect-ratio"></a>
#### Атрибут `aspect-ratio`
Определяет пропорции экрана (может быть недоступно для некоторых моделей телевизоров).
Допустимые значения: 16:9, 3:2, 4:3, 1,85:1, 2,39:1 (наиболее распространенное значение для фильмов)
<a id="EXTVLCOPT"></a>
### Директива `#EXTVLCOPT`
Специфична для VLC Player.
Директив может быть множество для одной дорожки (канала).
Указывается в формате `#EXTVLCOPT:XXX` или `#EXTVLCOPT--XXX=YYY`, где:
* `XXX` -- параметр командной строки VLC Player ([полный список](https://wiki.videolan.org/VLC_command-line_help/));
* `YYY` -- значения параметра.
## Дополнительные материалы
* [Инструкция по формату M3U (SS IPTV)](https://ss-iptv.com/ru/users/documents/m3u)
* [Архив телепрограмм (SS IPTV)](https://ss-iptv.com/ru/operators/catchup)
* [VLC command-line help](https://wiki.videolan.org/VLC_command-line_help/)
* [ISO 639-2 Codes for the Representation of Names of Languages](https://www.loc.gov/standards/iso639-2/php/code_list.php)
* [ISO 3166-1 Wikipedia](https://en.wikipedia.org/wiki/ISO_3166-1)
* ОКСМ:
* [normativ.kontur.ru](https://normativ.kontur.ru/document?moduleId=1&documentId=22668#h1296)
* [classifikators.ru](https://classifikators.ru/oksm)

59
src/formats/playlists.md Normal file
View File

@@ -0,0 +1,59 @@
---
icon: material/code-brackets
tags: ["плейлисты"]
---
# :material-code-brackets: Формат файла `playlists.ini`
Рассмотрим на примере:
```ini
[code]
name = Рабочий автообновляемый IPTV плейлист M3U
desc = "В этом IPTV плейлисте есть каналы в высоком качестве"
pls = 'https://example.com/pls.m3u'
src = 'https://example.com/super-duper-playlist'
# комментарий 1
; ещё один комментарий
```
Перенос строк невозможен.
Комментарии игнорируются.
Для значений можно (не) использовать 'одинарные' или "двойные" кавычки.
Ради единообразия рекомендуется использовать 'одинарные'.
## `code`
Код плейлиста в рамках этого конфига (**обязательно**).
Должен быть коротким и уникальным.
Подставляется в короткую ссылку, по которой произойдёт переадресация на прямой адрес `pls`.
!!! note
Для удобства ввода с пульта, код рекомендуется задавать числом или короткой строкой без пробелов и др. спецсимволов.
Чем короче, тем лучше.
## `name`
Название плейлиста (необязательно).
По умолчанию: `Playlist #<code>`.
## `desc`
Краткое описание из источника или от себя (необязательно).
По умолчанию: пусто.
## `pls`
Прямая ссылка на m3u/m3u8 плейлист (**обязательно**).
## `src`
Ссылка на источник (страницу сайта), откуда был взят плейлист (необязательно).
По умолчанию: пусто.

69
src/index.md Normal file
View File

@@ -0,0 +1,69 @@
---
icon: material/home
---
# :material-home: Введение
Сервис предназначен для централизованного сбора ссылок на публичные IPTV-плейлисты, которые находятся в открытом доступе.
Они отбираются вручную и периодически проверяются автоматически.
!!! info "Все необходимые адреса"
**Веб-сайт:** [iptv.axenov.dev](https://iptv.axenov.dev)
**Зеркало:** [m3u.su](https://m3u.su)
Исходный код: [git.axenov.dev/IPTV](https://git.axenov.dev/IPTV)
Новостной канал: [@iptv_aggregator](https://t.me/iptv_aggregator)
Обсуждение: [@iptv_aggregator_chat](tg/chat.md)
Бот: [@iptv_aggregator_bot](tg/bot.md)
Далеко не все пользователи, желающие использовать цифровое ТВ, могут позволить себе подключение IPTV у своего провайдера или поставщиков контента.
И проблема не только в деньгах и подписках: граждане, живущие зарубежом, испытывают недостаток информации на родных языках, поскольку местные власти цензурируют и блокируют местные и зарубежные СМИ.
Так, например, давно происходит в европейских странах.
В интернете очень много энтузиастов, которые составляют, поддерживают в рабочем состоянии и публикуют бесплатные плейлисты IPTV.
В таких плейлистах есть самый разный набор теле- и радиоканалов.
Сервис предоставляет возможность:
* обращаться к этим плейлистам по коротким ссылкам вместо длинных,
* увидеть какие из них действительно работают, какие в них каналы и работают ли они;
* найти плейлист на любой вкус.
## Основные принципы проекта
1. Проект должен быть публичен и бесплатен для всех
2. Проект не должен нарушать права третьих лиц
3. Весь исходный код проекта должен быть открыт и распространяться под MIT-лицензией
## Для чего предназначен сервис
1. Для хранения ссылок на сторонние плейлисты
2. Для периодической проверки доступности плейлистов и их каналов
3. Для кратковременного хранения результатов проверок и их публикации (в человекочитаемом и машиночитаемом виде)
4. Для категоризации плейлистов и их каналов с помощью тегов
5. Для предоставления коротких ссылок на плейлисты (для удобства ввода с пульта)
6. Для переадресации с короткого адреса плейлиста на исходный
7. Для публикации общей информации о каналах (название, логотип)
## Для чего НЕ предназначен сервис
1. Для создания плейлистов, их хранения или модификации
2. Для записи, хранения или ретрансляции каналов
3. Для бесплатного доступа к платным каналам
4. Для сбора платежей за доступ к каким-либо каналам
Автор проекта не занимается созданием, изменением, размещением и хранением плейлистов.
Ни бесплатно, ни за деньги, ни бартером, ни за спасибо.
Все плейлисты, которые отображаются на сайте, созданы, размещены и поддерживаются третьими лицами на чужих серверах.
Автор проекта не взимает плату за размещение ссылок на сторонние плейлисты и ресурсы.
За содержимое плейлистов и их качество отвечают авторы плейлистов.
Автор не зарабатывает на проекте и не собирается.
Всё, что отображается на сайте, сделано бесплатно и на энтузиазме.
Но ты можешь сделать [добровольное пожертвование](support.md), которое поможет мне компенсировать затраты на поддержку и техническое развитие проекта.
## Условия, гарантии, обязательства и последствия
См. текст [лицензии MIT](https://opensource.org/license/mit).

9
src/iptvc/cli/check.md Normal file
View File

@@ -0,0 +1,9 @@
---
tags: ["iptvc"]
---
# Команда `check`
!!! info "TODO"
Скоро здесь появится полезная информация.
Следи за обновлениями в канале [@iptv_aggregator](https://t.me/iptv_aggregator) или в [репозитории](https://git.axenov.dev/IPTV/docs).

48
src/iptvc/cli/help.md Normal file
View File

@@ -0,0 +1,48 @@
---
tags: ["iptvc"]
---
# Команда `help`
Для получения помощи о программе, нужно вызвать команду `help` или передать аргумент `-h` или `--help`.
Равнозначные команды:
```
./iptvc help
./iptvc --help
./iptvc -h
```
Вывод (может незначительно отличаться в разных версиях):
```
Simple utility to check iptv playlists. Part of iptv.axenov.dev project.
Copyright (c) 2025, Антон Аксенов, MIT license.
Usage:
iptvc [command]
Available Commands:
check Check playlists
completion Generate the autocompletion script for the specified shell
help Help about any command
version Show version
Flags:
-h, --help help for iptvc
-v, --verbose enable additional output
Use "iptvc [command] --help" for more information about a command.
```
Чтобы получить справку о конкретной команде, можно вызвать программу одним из способов:
```
./iptvc help <КОМАНДА>
./iptvc <КОМАНДА> --help
./iptvc <КОМАНДА> -h
```
Список команд указан в этом разделе.

7
src/iptvc/cli/index.md Normal file
View File

@@ -0,0 +1,7 @@
---
icon: octicons/terminal-24
hide:
- toc
---
# :octicons-terminal-24: Работа в терминале

9
src/iptvc/cli/version.md Normal file
View File

@@ -0,0 +1,9 @@
---
tags: ["iptvc"]
---
# Команда `version`
!!! info "TODO"
Скоро здесь появится полезная информация.
Следи за обновлениями в канале [@iptv_aggregator](https://t.me/iptv_aggregator) или в [репозитории](https://git.axenov.dev/IPTV/docs).

10
src/iptvc/env.md Normal file
View File

@@ -0,0 +1,10 @@
---
icon: simple/dotenv
tags: ["iptvc", "переменные окружения"]
---
# :simple-dotenv: Настройки окружения (файл .env)
!!! info "TODO"
Скоро здесь появится полезная информация.
Следи за обновлениями в канале [@iptv_aggregator](https://t.me/iptv_aggregator) или в [репозитории](https://git.axenov.dev/IPTV/docs).

26
src/iptvc/how-it-works.md Normal file
View File

@@ -0,0 +1,26 @@
---
icon: material/cog-sync-outline
tags: ["iptvc", "теги"]
---
# :material-cog-sync-outline: Как работает iptvc
Это консольная программа, которая проверяет плейлисты и присваивает каналам [теги](../formats/channels.md).
У неё нет графического интерфейса.
Принцип её работы очень простой:
1. Получить плейлист по ссылке.
2. Полученный плейлист распарсить:
обрабатывается полученный текст в формате [m3u](../formats/m3u.md), из него вычленется информация о каналах и их группировке.
3. Каждый найденный канал проверить:
получить информацию по ссылке (первый 1 КБ данных) и принять решение -- работает ли канал технически или нет.
4. Каждому каналу [присвоить теги](../formats/channels.md#доступные-теги).
Во время работы программа пишет лог проверки плейлиста и каналов в достаточно компактном человекочитаемом виде, а в конце пишет результаты проверок.
При желании, можно включить более подробный вывод, чтобы тщательно следить за ходом проверки в реальном времени, а также вывод результатов в машиночитаемом виде (в формате json).
Подробности см. в разделе [Команда `check`](../iptvc/cli/check.md).

29
src/iptvc/index.md Normal file
View File

@@ -0,0 +1,29 @@
---
icon: material/check-network
hide:
- toc
---
# :material-check-network: IPTV Checker (iptvc)
<div class="grid cards" markdown>
- [:material-flag-checkered: Быстрый старт](quickstart.md)
---
Коротко о главном, если не терпится
- [:material-cog-sync-outline: Как работает iptvc](how-it-works.md)
---
Механика работы программы
- [:simple-dotenv: Настройки окружения (файл .env)](env.md)
---
Параметры конфигурации программы
- [:octicons-terminal-24: Работа в терминале](cli/index.md)
---
Доступные команды и их аргументы
</div>

79
src/iptvc/quickstart.md Normal file
View File

@@ -0,0 +1,79 @@
---
icon: material/flag-checkered
tags: ["iptvc"]
---
# :material-flag-checkered: Быстрый старт
## Проверить плейлист по прямой ссылке
```
./iptvc check --url https://example.com/pls.m3u
```
## Проверить файл плейлист с диска
```
./iptvc check --file /home/user/pls.m3u
```
## Проверить плейлист по короткому коду из [`playlists.ini`](../formats/playlists.md)
```
./iptvc check --code X
```
Файл `playlists.ini` должен лежать рядом с `iptvc`.
Если файл лежит в другой директории, то можно явно указать путь к нему:
```
./iptvc check --code X --ini /home/user/playlists.ini
```
Если ini-файл не будет найден, программа предупредит об этом.
## Присвоить каналам тематические теги
Чтобы это произошло, рядом с `iptvc` должен лежать файл [channels.json](../formats/channels.md).
Если файл лежит в другой директории, то можно указать её явно:
```
./iptvc check --tags /home/user/channels.json <...другие аргументы...>
```
Если json-файл не будет найден, то программа предупредит о том, что теги не будут присвоены, и продолжит работу.
## Проверить несколько плейлистов одновременно
Для этого можно комбинировать все аргументы, пречисленные выше, с учётом особенностей их работы:
```
./iptvc check \
--ini /home/user/p.ini \
--tags /home/user/c.json \
--code Y \
--file /home/user/tv.m3u \
--url https://example.com/pls1.m3u \
--url https://example.com/pls2.m3u
```
В этом примере (построчно):
* вызывать команду проверки;
* взять список плейлистов из файла `/home/user/p.ini`;
* применить правила присвоения тегов из файла `/home/user/c.json`;
* проверить плейлист с кодом `Y` из ini-файла;
* проверить плейлист из файла `/home/user/tv.m3u`;
* проверить плейлист по ссылке `https://example.com/pls1.m3u`;
* проверить плейлист по ссылке `https://example.com/pls2.m3u`.
Символ `\` нужен только для наглядного разделения аргументов на несколько строк.
Переданные плейлисты будут обработаны в следующем порядке:
1. локальные файлы плейлистов;
2. плейлисты по ссылкам;
3. плейлисты по кодам из ini-файла.

68
src/support.md Normal file
View File

@@ -0,0 +1,68 @@
---
icon: material/hand-heart-outline
---
# :material-hand-heart-outline: Поддержка проекта
Проект держится только на сугубо техническом интересе одного разработчика в свободное от работы время.
При этом, проект не планировался как монетизируемый и до сих пор не принёс ни рубля прибыли.
Если у вас есть желание помочь проекту, ниже перечислены минимально доступные тебе способы -- от самых простых способов к более сложным.
## Рассказать публично
Друзьям, коллегам, на своей страничке, в своих каналах и социальных сетях.
Вокруг проекта должно быть какое-то сообщество неравнодушных энтузиастов.
Только такие люди обеспечивают прогресс.
## Подписаться в Telegram
У проекта есть два публичных ресурса для прямой связи с пользователями.
Там можно ставить **платные реакции** к постам и/или **дарить голоса** (бусты):
* канал: [@iptv_aggregator](https://t.me/iptv_aggregator) ([boost](https://t.me/iptv_aggregator?boost)) -- в нём новости о проекте (общие объявления и проведённые доработки);
* чат: [@iptv_aggregator_chat](https://t.me/iptv_aggregator_chat) ([boost](https://t.me/iptv_aggregator_chat?boost)) -- комментарии к каналу, общение по теме проекта и IPTV.
Голоса открывают новые возможности для каналов и групп.
## Внести пожертвование
Вы можете внести прямое денежное **пожертвование** с банковской карты на виртуальный кошелёк ЮMoney.
Разовый платёж, без подписок, на любую сумму.
<center><a href="https://yoomoney.ru/to/41001685237530">yoomoney.ru/to/41001685237530</a></center>
Также вы можете оформить подписку на Boosty:
<center><a href="https://boosty.to/anthonyaxenov">boosty.to/anthonyaxenov</a></center>
Финансовая поддержка проекта со стороны пользователей добровольна, она не рассматривается как способ обогащения или способ для эксклюзивного доступа к чему-либо.
Пожертвования являются лишь компенсацией трудозатрат и мотивацией к его технической поддержке и развитию.
На пожертвования [был приобретён](https://t.me/iptv_aggregator/30) домен m3u.su, который сейчас используется в качестве короткого зеркала.
<a id="participate"></a>
## Принять участие в разработке
Весь исходный код проекта хранится в репозиториях организации: [git.axenov.dev/IPTV](https://git.axenov.dev/IPTV)
Чтобы принять участие в разработке, необходимо [зарегистрироваться на сайте git.axenov.dev](https://git.axenov.dev/user/sign_up) и **активировать** учётную запись по e-mail.
!!! info "Это бесплатно, но неактивированные учётки периодически удаляются."
### Создать задачу
Любое ПО неидеально, как и документация к нему.
Если вы нашли ошибку, опечатку, неожиданное поведение ПО или есть предложение по улучшению -- можете создать задачу в соответствующем репозитории организации.
### Прислать изменения
Вы можете внести исправления в код самостоятельно и прислать pull-request для принятия в основную ветку.
Это может быть новый функционал, исправления ошибок или опечаток.
Если есть идеи и желание для расширения функционала проекта, можем обсудить создание нового репозитория с выдачей необходимых прав.

49
src/tg/bot.md Normal file
View File

@@ -0,0 +1,49 @@
---
icon: material/robot-outline
tags: ["telegram"]
---
# :material-robot-outline: Telegram-бот
Позволяет получать информацию с сайта, не выходя из Telegram.
Функционал тот же, что у сайта, но информацию выдаёт компактнее, чтобы умещаться в лимиты мессенджера и не перегружать чат.
> Открыть: [@iptv_aggregator_bot](https://t.me/iptv_aggregator_bot)
## Команды
### `/start`
Стандартное начало работы.
Позволяет отправлять другие команды.
### `/help`
Помощь по использованию бота.
!!! warning "Запомни эту команду!"
В любой непонятной ситуации обращайся к ней.
### `/links`
Список ссылок на все ресурсы, связанные с проектом, для быстрого перехода.
### `/list`
Список всех кодов плейлистов и их статусов.
### `/info <XYZ>`
Информация о плейлисте c кодом `XYZ`:
* статус и название плейлиста (ссылкой на сайт);
* время и результат последней проверки;
* количество каналов (всех/онлайн/оффлайн)
* возможности плейлиста (перемотка, телепрограмма);
* список групп и тегов (при наличии);
* ссылки для ТВ.
### `/stats`
Небольшая статистика на текущий момент по всем плейлистам, которые доступны в сервисе.

44
src/tg/chat.md Normal file
View File

@@ -0,0 +1,44 @@
---
icon: material/message-check
tags: ["telegram"]
---
# :material-message-check: Telegram-чат
## Правила
* 🇷🇺 Говорим по-русски (Russian lang only)
* ✅ Уважаем друг друга
* ✅ Ведём себя культурно
* ✅ Говорим по делу и по теме
* ✅ [neprivet.com](https://neprivet.com)
* ✅ [nometa.xyz](https://nometa.xyz)
* ✅ [novoice.me](https://novoice.me)
*Не спамим, не флудим
*Не нарушаем законов РФ и здравого смысла
* ❌ Ботов не тащим
## Я только спросить!
Держи чеклист:
1. **Найди ответ в [FAQ](../faq.md)**
2. Если не нашёл ответ -- прочти остальное
3. Если не нашёл ответ и это проблема:
* опиши всю ситуацию -- сухо и по существу, в чём проблема, чего хочешь и ожидаешь;
* если вопрос связан с плейлистом из сервиса -- приложи его код и ссылку, которую указываешь в плеере;
* если вопрос связан с другим плейлистом -- приложи его ссылку;
* если вопрос связан с плеером -- укажи хотя бы его название;
* если есть возможность, приложи скриншот или чёткое фото -- чтобы можно было разглядеть проблему и подсказать решение.
!!! info "Скорее всего, это надо только тебе"
Чем больше полезной информации, тем лучше.
Не заставляй выдирать её из тебя клещами.
И помни, что тебе не обязаны отвечать.
Ну, потому что.
В группе работает бот-модератор и админ.
При вступлении в группу нужно явно подтвердить согласие с правилами.
> Открыть чат: [@iptv_aggregator_chat](https://t.me/iptv_aggregator_chat)

19
src/tg/index.md Normal file
View File

@@ -0,0 +1,19 @@
---
icon: simple/telegram
hide:
- toc
---
# :simple-telegram: Ресурсы в Telegram
<div class="grid cards" markdown>
- [:material-robot-outline: Бот](bot.md)
---
Получай доступ к плейлистам и делись ими с друзьями, не выходя из мессенджера
- [:material-message-check: Чат](chat.md)
---
Попроси о помощи у других пользователей или сообщи разработчику о проблеме
</div>