This commit is contained in:
2026-07-13 12:30:05 +08:00
parent 7d61aadc5d
commit f25e128299
2023 changed files with 9042 additions and 922 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 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: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 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

+577
View File
@@ -0,0 +1,577 @@
---
title: config.yml
icon: material/file-cog
tags: ["iptvc", "конфигурация"]
---
# :material-file-cog: Конфигурация config.yml
Программа читает настройки из YAML-файла `config.yml` в корне проекта.
Путь к файлу можно задать через глобальный флаг `--config`.
## Приоритет настроек
От низшего к высшему:
1. **Значения по умолчанию** — встроены в код;
2. **`config.yml`** — YAML-файл;
3. **Переменные окружения** — переопределяют `config.yml` (если заданы);
4. **CLI-флаги** — переопределяют переменные окружения и `config.yml` (если заданы явно).
Файл `.env` загружается автоматически, переменные из него применяются как переменные окружения.
## Структура файла
```yaml
app:
timezone: GMT
debug: false
log_level: info
playlists: ./playlists.ini
tags: ./channels.json
server:
host: localhost
port: 8080
site:
base-url: http://localhost:8080
repo-url: https://git.axenov.dev/IPTV
page-size: 0
favicon:
header:
title: IPTV Checker
navigation:
- title: Документация
url: /docs
icon: document-text-outline
footer-links:
- title: Исходники
url: https://git.axenov.dev/IPTV
icon: code-slash-outline
check:
start-on-serve: false
playlists:
user-agent:
- Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
timeout: 10000
all-cooldown: 0
one-cooldown: 0
max-routines: 5
per-routine: 1
channels:
user-agent: Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
timeout: 10000
byte-range: 512
cooldown: 0
max-routines: 50
per-routine: 10
cache:
enabled: false
host: localhost
port: 6379
username:
password:
db: 0
ttl: 1800
```
Каждый параметр ниже описан отдельной секцией с указанием значения по умолчанию, переменной окружения и соответствующего CLI-флага.
---
## Секция `app` { id=app }
### `app.timezone` { id=app-timezone }
<!-- md:default GMT -->
<!-- md:env APP_TIMEZONE -->
Часовой пояс, используемый в логах и при отображении времени проверок.
---
### `app.debug` { id=app-debug }
<!-- md:default false -->
<!-- md:env APP_DEBUG -->
<!-- md:arg --debug -->
Режим отладки.
Включает расширенное логирование и дополнительные проверки в логике приложения.
---
### `app.log_level` { id=app-log-level }
<!-- md:default info -->
<!-- md:env APP_LOG_LEVEL -->
<!-- md:arg --log-level -->
Уровень логирования.
Допустимые значения: `debug`, `info`, `warn`, `error`.
---
### `app.playlists` { id=app-playlists }
<!-- md:default ./playlists.ini -->
<!-- md:env APP_PLAYLISTS -->
<!-- md:arg --ini -->
Путь к локальному [ini-файлу](../../common/formats/playlists.md) с описанием плейлистов.
!!! info "Аргумент работает только для команд `check` и `serve --check`."
---
### `app.tags` { id=app-tags }
<!-- md:default ./channels.json -->
<!-- md:env APP_TAGS -->
<!-- md:arg --tags -->
Путь к локальному [json-файлу](../../common/formats/channels.md) с описанием тегов каналов.
!!! info "Аргумент работает только для команд `check` и `serve --check`."
---
## Секция `server` { id=server }
### `server.host` { id=server-host }
<!-- md:default -->
<!-- md:env WEB_HOST -->
<!-- md:arg --host -->
Хост для привязки веб-сервера.
Пустая строка — слушать на всех интерфейсах.
!!! info "Аргумент работает только для команды `serve`."
---
### `server.port` { id=server-port }
<!-- md:default 8080 -->
<!-- md:env WEB_PORT -->
<!-- md:arg -p, --port -->
Порт веб-сервера.
!!! info "Аргумент работает только для команды `serve`."
---
## Секция `site` { id=site }
Настройки внешнего вида и ссылок сайта: заголовок, навигация, пагинация, иконка.
### `site.base-url` { id=site-base-url }
<!-- md:default http://localhost:8080 -->
<!-- md:env APP_URL -->
Базовый URL сайта.
Используется при формировании абсолютных ссылок в шаблонах.
---
### `site.repo-url` { id=site-repo-url }
<!-- md:default https://git.axenov.dev/IPTV -->
<!-- md:env REPO_URL -->
Ссылка на исходный репозиторий (отображается в подвале).
---
### `site.page-size` { id=site-page-size }
<!-- md:default 0 -->
<!-- md:env PAGE_SIZE -->
Размер страницы пагинации.
При значении `0` пагинация отключена, на главной странице выводятся все плейлисты.
---
### `site.favicon` { id=site-favicon }
<!-- md:default -->
<!-- md:env SITE_FAVICON -->
Путь к файлу иконки сайта. Пустая строка — используется встроенная.
---
### `site.header.title` { id=site-header-title }
<!-- md:default IPTV Checker -->
<!-- md:env APP_TITLE -->
Заголовок сайта, отображается в `<title>` и в navbar.
---
### `site.header.navigation` { id=site-header-navigation }
Массив элементов [`Link`](#link) в шапке сайта.
---
### `site.footer-links` { id=site-footer-links }
Массив элементов [`Link`](#link) в подвале сайта.
---
### Тип `Link` { id=link }
Элемент навигации или подвала.
Если задано `children`, рендерится как выпадающее меню.
| Поле | Тип | Описание |
| ---------- | ------ | ----------------------------------------------------------- |
| `title` | string | Текст ссылки |
| `url` | string | URL ссылки (можно опустить, если есть `children`) |
| `icon` | string | Имя иконки |
| `children` | Link[] | Дочерние ссылки (выпадающее меню, один уровень вложенности) |
--8<-- "ionicons-name.md"
```yaml title="Пример"
site:
header:
navigation:
- title: Документация
url: /docs
icon: document-text-outline
- title: Telegram
icon: paper-plane-outline
children:
- title: Канал
url: https://t.me/iptv_aggregator
icon: megaphone-outline
- title: Чат
url: https://t.me/iptv_aggregator_chat
icon: chatbubbles-outline
footer-links:
- title: Исходники
url: https://git.axenov.dev/IPTV
icon: code-slash-outline
- title: axenov.dev
url: https://axenov.dev
icon: person-outline
```
---
## Секция `check` { id=check }
Параметры проверки плейлистов и каналов. Поддерживаются скаляры и массивы.
---
### `check.start-on-serve` { id=check-start-on-serve }
<!-- md:default false -->
<!-- md:env CHECK_START_ON_SERVE -->
Запустить фоновую проверку при `serve` без явного флага `--check`.
Независимый переключатель от CLI-флага `--check` — фоновая проверка стартует, если **хотя бы один** из них активен.
---
### `check.playlists` { id=check-playlists }
Параметры проверки плейлистов (загрузка m3u-файлов по URL или из ФС).
---
#### `check.playlists.user-agent` { id=check-playlists-user-agent }
<!-- md:default Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer -->
<!-- md:env CHECK_PLAYLISTS_USER_AGENT_* -->
<!-- md:arg --playlists-user-agent -->
User-Agent для HTTP-запросов плейлистов.
!!! info "Необычный параметр"
Если значение параметра задано строкой, то в запросах к плейлистам будет использоваться только оно.
Если значение параметра задано массивом строк, то в запросах к плейлистам будет использоваться случайный из указанных.
!!! info "Необычная переменная"
В окружении может задаваться индексированными переменными:
- `CHECK_PLAYLISTS_USER_AGENT_1="value1"`
- `CHECK_PLAYLISTS_USER_AGENT_2="value2"`
- и т.д.; чтение останавливается на первой отсутствующей.
!!! info "Аргумент работает только для команд `check` и `serve --check`."
---
#### `check.playlists.timeout` { id=check-playlists-timeout }
<!-- md:default 10000 -->
<!-- md:env CHECK_PLAYLISTS_TIMEOUT -->
<!-- md:arg --playlists-timeout -->
Таймаут HTTP-запроса плейлиста в миллисекундах.
!!! info "Аргумент работает только для команд `check` и `serve --check`."
---
#### `check.playlists.all-cooldown` { id=check-playlists-all-cooldown }
<!-- md:default 0 -->
<!-- md:env CHECK_PLAYLISTS_ALL_COOLDOWN -->
<!-- md:arg --playlists-all-cooldown -->
Задержка после проверки всех плейлистов в миллисекундах.
!!! info "Необычная переменная"
Если значение переменной указано одним числом, то для задержки будет использоваться только оно.
Если значение переменной указано двумя числами через запятую, то будет использоваться случайная задержка в указанном диапазоне.
!!! info "Аргумент работает только для команд `check` и `serve --check`."
---
#### `check.playlists.one-cooldown` { id=check-playlists-one-cooldown }
<!-- md:default 0 -->
<!-- md:env CHECK_PLAYLISTS_ONE_COOLDOWN -->
<!-- md:arg --playlists-one-cooldown -->
Задержка после проверки каждого плейлиста в миллисекундах.
!!! info "Необычная переменная"
Если значение переменной указано одним числом, то для задержки будет использоваться только оно.
Если значение переменной указано двумя числами через запятую, то будет использоваться случайная задержка в указанном диапазоне.
!!! info "Аргумент работает только для команд `check` и `serve --check`."
---
#### `check.playlists.max-routines` { id=check-playlists-max-routines }
<!-- md:default 5 -->
<!-- md:env CHECK_PLAYLISTS_MAX_ROUTINES -->
<!-- md:arg --playlists-max-routines -->
Максимальное количество параллельных потоков (рутин) проверки плейлистов.
!!! info "Аргумент работает только для команд `check` и `serve --check`."
---
#### `check.playlists.per-routine` { id=check-playlists-per-routine }
<!-- md:default 1 -->
<!-- md:env CHECK_PLAYLISTS_PER_ROUTINE -->
<!-- md:arg --playlists-per-routine -->
Максимальное количество плейлистов в каждом потоке (рутине) проверки.
!!! info "Аргумент работает только для команд `check` и `serve --check`."
---
### `check.channels` { id=check-channels }
Параметры проверки каналов внутри плейлиста.
---
#### `check.channels.user-agent` { id=check-channels-user-agent }
<!-- md:default Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer -->
<!-- md:env CHECK_CHANNELS_USER_AGENT_* -->
<!-- md:arg --channels-user-agent -->
User-Agent для HTTP-запроса каждого канала каждого плейлиста.
!!! info "Необычный параметр"
Если значение параметра задано строкой, то в запросах к каналам будет использоваться только оно.
Если значение параметра задано массивом строк, то в запросах к каналам будет использоваться случайный из указанных.
!!! info "Необычная переменная"
В окружении может задаваться индексированными переменными:
- `CHECK_CHANNELS_USER_AGENT_1="value1"`
- `CHECK_CHANNELS_USER_AGENT_2="value2"`
- и т.д.; чтение останавливается на первой отсутствующей.
!!! info "Аргумент работает только для команд `check` и `serve --check`."
---
#### `check.channels.timeout` { id=check-channels-timeout }
<!-- md:default 10000 -->
<!-- md:env CHECK_PLAYLISTS_TIMEOUT -->
<!-- md:arg --channels-timeout -->
Таймаут HTTP-запроса каждого канала каждого плейлиста в миллисекундах.
!!! info "Аргумент работает только для команд `check` и `serve --check`."
---
#### `check.channels.byte-range` { id=check-channels-byte-range }
<!-- md:default 512 -->
<!-- md:env CHECK_CHANNELS_BYTE_RANGE -->
<!-- md:arg --channels-byte-range -->
Объём данных в байтах, запрашиваемых у сервера при проверке каждого канала каждого плейлиста.
Меньшее значение повышает риск ошибок в определении типа контента (mime-type).
Большее значение может приводить к повышенной нагрузке и увеличению времени проверки.
!!! info "Аргумент работает только для команд `check` и `serve --check`."
---
#### `check.channels.cooldown` { id=check-channels-cooldown }
<!-- md:default 0 -->
<!-- md:env CHECK_CHANNELS_COOLDOWN -->
<!-- md:arg --channels-cooldown -->
Задержка после проверки каждого канала каждого плейлиста в миллисекундах.
!!! info "Необычная переменная"
Если значение переменной указано одним числом, то для задержки будет использоваться только оно.
Если значение переменной указано двумя числами через запятую, то будет использоваться случайная задержка в указанном диапазоне.
!!! info "Аргумент работает только для команд `check` и `serve --check`."
---
#### `check.channels.max-routines` { id=check-channels-max-routines }
<!-- md:default 50 -->
<!-- md:env CHECK_CHANNELS_MAX_ROUTINES -->
<!-- md:arg --channels-max-routines -->
Максимальное количество параллельных потоков (рутин) проверки каналов каждого плейлиста.
!!! info "Аргумент работает только для команд `check` и `serve --check`."
---
#### `check.channels.per-routine` { id=check-channels-per-routine }
<!-- md:default 10 -->
<!-- md:env CHECK_CHANNELS_PER_ROUTINE -->
<!-- md:arg --channels-per-routine -->
Максимальное количество каналов в каждом потоке (рутине) проверки каждого плейлиста.
!!! info "Аргумент работает только для команд `check` и `serve --check`."
---
## Секция `cache` { id=cache }
Параметры подключения к KeyDB/Redis для хранения результатов проверок.
---
### `cache.enabled` { id=cache-enabled }
<!-- md:default false -->
<!-- md:env CACHE_ENABLED -->
<!-- md:arg --cache-enabled -->
Включить использование внешнего кеша.
!!! info "Аргумент работает только для команд `check` и `serve --check`."
---
### `cache.host` { id=cache-host }
<!-- md:default localhost -->
<!-- md:env CACHE_HOST -->
<!-- md:arg --cache-host -->
Хост KeyDB/Redis.
!!! info "Аргумент работает только для команд `check` и `serve --check`."
---
### `cache.port` { id=cache-port }
<!-- md:default 6379 -->
<!-- md:env CACHE_PORT -->
<!-- md:arg --cache-port -->
Порт KeyDB/Redis.
!!! info "Аргумент работает только для команд `check` и `serve --check`."
---
### `cache.username` { id=cache-username }
<!-- md:default -->
<!-- md:env CACHE_USERNAME -->
<!-- md:arg --cache-username -->
Логин для подключения. Пустая строка — без аутентификации.
!!! info "Аргумент работает только для команд `check` и `serve --check`."
---
### `cache.password` { id=cache-password }
<!-- md:default -->
<!-- md:env CACHE_PASSWORD -->
<!-- md:arg --cache-password -->
Пароль для подключения.
!!! info "Аргумент работает только для команд `check` и `serve --check`."
---
### `cache.db` { id=cache-db }
<!-- md:default 0 -->
<!-- md:env CACHE_DB -->
<!-- md:arg --cache-db -->
Номер логической базы данных в KeyDB/Redis.
!!! info "Аргумент работает только для команд `check` и `serve --check`."
---
### `cache.ttl` { id=cache-ttl }
<!-- md:default 1800 -->
<!-- md:env CACHE_TTL -->
<!-- md:arg --cache-ttl -->
TTL записей кеша, секунды.
!!! info "Аргумент работает только для команд `check` и `serve --check`."
+33
View File
@@ -0,0 +1,33 @@
---
icon: material/book-open-page-variant-outline
---
# :material-book-open-page-variant-outline: Об этой документации
!!! warning "Актуальность документации может отставать от текущей версии сервиса, его исходных кодов и инфраструктуры"
Поддерживать содержимое в актуальном состоянии большой труд.
Прошу отнестись с пониманием, а лучше — [помочь делом](support.md#participate).
<!--
!!! danger "Тем не менее, прошу прочесть её!"
Потому что очень часто и мне, и в общий чат поступают одинаковые вопросы, на которые уже просто нет сил отвечать персонально.
-->
Если у тебя возникает вопрос, на который уже есть ответ на одной из этих страниц, то ты рискуешь
* либо быть посланным сюда;
* либо быть посланным далеко не сюда;
* либо остаться в игноре.
## Навигация
К твоим услугам:
1. в заголовке сайта — глобальный поиск;
2. над заголовком страницы — метки страницы (полный список ниже);
3. слева — общее содержание;
4. справа — содержание конкретной страницы.
??? info end "На мобильниках содержание страницы спрятано за этой кнопкой в боковом меню:"
![Скриншот бокового меню с мобильной версии](_assets/mobile-toc-btn.jpg)
+111
View File
@@ -0,0 +1,111 @@
---
title: channels.json
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-совместимыми.
Каналы сопоставляются в нижнем регистре.
## Рекомендации и предостережения { id="warnings" }
1. Если хочешь написать новое правило, будь осторожен с регулярками.
Старайся не охватывать несколько каналов сразу.
Если канал попадёт в несколько регулярок, то его **теги могут оказаться неожиданными** и найти проблему может быть сложно.
2. Указывай внутри `{}` только `tags` и один из параметров `tvg-id`, `tvg-name` или `title`.
Множество параметров на точность не влияет, зато будет проще уместить всё правило в одну строку и grep-ать файл.
3. Не забывай, что название на кириллице не всегда означает, что это российский канал или вещание на русском языке.
4. Разные каналы могут быть названы одинаково или похоже.
Например, `Первый канал`, `Первый Тульский`, `Первый городской`.
5. Один канал может быть назван по-разному.
Например, `Ю` или `Ю!`, `Россия 1 +5` или `Россия-1`.
6. Важно учитывать холдинги.
Например, российские Матч, ТНТ и НТВ имеют множество разных каналов, и тупо искать `^нтв$` — тупо.
7. У всех каналов есть `title`.
Не все каналы имеют `tvg-id`.
Некоторые каналы имеют `tvg-name`.
Все три параметра могут оказаться на кириллице.
## Доступные теги { 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)
+135
View File
@@ -0,0 +1,135 @@
---
title: "*.m3u (*.m3u8)"
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
```
### Директива `#EXTM3U` { id="EXTM3U" }
Заголовок файла (обязателен).
#### Атрибут `url-tvg` (он же `x-tvg-url`) { id="url-tvg" }
Ссылка программу передач в формате `*.xml` или `*.xml.gz`.
#### Атрибуты `catchup*` { id="catchup" }
Читай здесь: [Архив телепрограмм (SS IPTV)](https://ss-iptv.com/ru/operators/catchup)
### Директива `#EXTGRP` { id="EXTGRP" }
Название группы, к которой относится контент (звуковая дорожка или канал).
Указывается в формате `#EXTGRP:XXX`, где: `XXX` — название группы.
### Директива `#EXTINF` { id="EXTINF" }
Описывает контент (звуковую дорожку или канал).
Указывается в формате `#EXTINF:XXX YYY,ZZZ`, где:
* `XXX` — длительность в секундах (обязательно, но может быть `-1` или `0`);
* `YYY` — атрибуты (см. ниже);
* `ZZZ` — название контента;
#### Атрибут `tvg-shift` { id="tvg-shift" }
Cмещение телепрограммы в часах относительно указанного в программе.
#### Атрибуты `tvg-id` и `tvg-name` { id="tvg-id" }
<a id="tvg-name"></a>
Идентификатор телепрограммы канала.
По нему телепрограмма привязывается к трансляции с учётом смещения времени.
#### Атрибут `tvg-logo` { id="tvg-logo" }
Ссылка на логотип канала.
#### Атрибут `tvg-country` { id="tvg-country" }
Код Alpha-2 страны вещания согласно ISO 3166-1 или ОКСМ.
#### Атрибут `tvg-language` { id="tvg-language" }
Название языка телепередачи согласно ISO 639-2.
#### Атрибут `group-title` { id="group-title" }
Название группы.
По функционалу идентичен директиве `#EXTGRP`.
#### Атрибут `user-agent` { id="user-agent" }
Значение заголовка `User-Agent` для обращения к контенту по http.
#### Атрибут `audio-track` { id="audio-track" }
Языковой код (ISO 639-2) аудио дорожки канала, например: "eng,rus".
Допускается указание нескольких аудио дорожек через запятую: "rus,ukr,eng".
Дорожкой по умолчанию устанавливается первая указанная в списке.
#### Атрибут `aspect-ratio` { id="aspect-ratio" }
Определяет пропорции экрана (может быть недоступно для некоторых моделей телевизоров).
Допустимые значения: 16:9, 3:2, 4:3, 1,85:1, 2,39:1 (наиболее распространенное значение для фильмов)
### Директива `#EXTVLCOPT` { id="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)
+23
View File
@@ -0,0 +1,23 @@
---
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>
+60
View File
@@ -0,0 +1,60 @@
---
title: playlists.ini
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` { id="code" }
Код плейлиста в рамках этого конфига (**обязательно**).
Должен быть коротким и уникальным.
Подставляется в короткую ссылку, по которой произойдёт переадресация на прямой адрес `pls`.
!!! note
Для удобства ввода с пульта, код рекомендуется задавать числом или короткой строкой без пробелов и др. спецсимволов.
Чем короче, тем лучше.
## `name` { id="name" }
Название плейлиста (необязательно).
По умолчанию: `Playlist #<code>`.
## `desc` { id="desc" }
Краткое описание из источника или от себя (необязательно).
По умолчанию: пусто.
## `pls` { id="pls" }
Прямая ссылка на m3u/m3u8 плейлист (**обязательно**).
## `src` { id="src" }
Ссылка на источник (страницу сайта), откуда был взят плейлист (необязательно).
По умолчанию: пусто.
+16
View File
@@ -0,0 +1,16 @@
---
icon: material/file-document
hide: [toc]
---
# Общая информация
<div class="grid cards" markdown>
- [:material-cogs: Как работает сервис](../aggregator/overview.md)
- [:material-file-eye-outline: Как отбираются плейлисты](../aggregator/selection.md)
- [:material-file-refresh-outline: Проверки и статусы](../aggregator/checks.md)
- [:fontawesome-solid-list-check: Список плейлистов](../iptvc/site/list.md)
- [:material-table-eye: Страница плейлиста](../iptvc/site/details.md)
- [:material-television-play: Как подключить плейлист](../iptvc/site/connect.md)
- [:material-multimedia: IPTV плееры](players.md)
</div>
+294
View File
@@ -0,0 +1,294 @@
---
icon: material/multimedia
tags: ["плееры"]
---
# :material-multimedia: IPTV плееры
Здесь указаны **не все** плееры, существующие на этой планете, и такой цели нет.
В списке ниже только те плееры, которые широко известны и популярны у зрителей IPTV, а также рекомендуются специализированными сайтами.
Некоторые из них помечены значком :thumbsup: — значит, он уже зарекомендовал себя как стабильный и удобный, с ним меньше всего хлопот.
Список для удобства разбит по платформам и ОС.
Обращайся к содержанию справа для быстрой навигации.
!!! info "Здесь не хватает очень много подробностей"
Если ты имел дело с каким-то плеером, знаешь как его настроить или какие-то другие детали, я прошу тебя помочь [актуализировать эту страницу](support.md#participate), чтобы через это помочь другим пользователям с выбором и настройкой плеера под свои цели.
## Кроссплатформенные
!!! info
Эти плееры разрабатываются для множества платформ одновременно и/или существуют в виде веб-приложения.
Их можно устанавливать и открывать почти на любом подходящем устройстве.
!!! warning "Веб-приложения могут не работать со сторонними плейлистами из-за ошибок CORS"
Исправить эту ошибку может выдача разрешения на загрузку небезопасного контента в настройках сайта в браузере, но гарантий нет.
### :thumbsup: VLC Media Player
* Скачать: <https://www.videolan.org/vlc/>
Универсальный плеер практически для любого мультимедиа-контента.
??? image "Главное окно"
![](_assets/players/vlc/main.jpg)
??? image "Добавление плейлиста на десктопе"
!!! warning "Указание протокола `https://` обязательно!"
![](_assets/players/vlc/add1.jpg)
![](_assets/players/vlc/add2.jpg)
??? image "Добавление плейлиста на андроиде"
!!! warning "Указание протокола `https://` обязательно!"
![](_assets/players/vlc/add1-mob.jpg)
![](_assets/players/vlc/add2-mob.jpg)
### :thumbsup: IPTVnator
* Веб-версия: <https://iptvnator.vercel.app>
* Скачать: <https://github.com/4gray/iptvnator/releases/latest>
Простой рабочий плеер, который можно открыть в браузере.
Поддерживает подгрузку множества плейлистов по ссылкам, субтитры, группировку каналов, избранное.
Имеет тёмную и светлую темы.
Если использовать веб-версию, то настройки сохраняются в браузере.
??? image "Главное окно"
![](_assets/players/iptvnator/main.jpg)
??? image "Добавление плейлиста"
!!! warning "Указание протокола `https://` обязательно!"
![](_assets/players/iptvnator/add1.jpg)
![](_assets/players/iptvnator/add2.jpg)
### IPTV Web Player
* Веб-версия: <http://iptv.apiweb.uz>
Простой и удобный веб-плеер.
Загрузка плейлиста по ссылкам или из файла, но только одного.
Подгрузка и отображение телепрограммы (используется https://cdn.epg.one/epg2.xml).
??? image "Главное окно"
![](_assets/players/iptv-web-player/main.jpg)
??? image "Добавление плейлиста"
!!! success "Указание протокола `https://` необязательно!"
![](_assets/players/iptv-web-player/add.jpg)
### Kodi
* Скачать: <https://kodi.tv>
* [Простая настройка IPTV на Kodi за 5 минут](https://prodigtv.ru/iptv/software/nastrojka-na-kodi)
Полноценный медиацентр.
Ориентирован на большие экраны и ТВ с пультами.
Имеет богатый функционал, который наращивается дополнениями, не выходя из приложения.
### 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
#### :thumbsup: IP-TV Player
* Скачать: <https://borpas.info/iptvplayer>
---
### Linux
#### :thumbsup: yuki-iptv
* Скачать: <https://codeberg.org/liya/yuki-iptv/releases/latest>
Продолжение развития Astroncia IPTV.
Визуально очень похож на IP-TV Player для Windows.
Поддерживает плейлисты по ссылкам, сторонние телепрограммы, группировку каналов, изменение плейлистов и многое другое.
??? image "Главное окно"
![](_assets/players/yuki-iptv/main.jpg)
??? image "Добавление плейлиста"
!!! warning "Указание протокола `https://` обязательно!"
![](_assets/players/yuki-iptv/add.jpg)
---
## SmartTV
### :thumbsup: 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
#### :thumbsup: Televizo
* Скачать: [play.google.com](https://play.google.com/store/apps/details?id=com.ottplay.ottplay)
??? image "Главный экран"
![](_assets/players/televizo/main1.jpg)
![](_assets/players/televizo/main2.jpg)
??? image "Добавление плейлиста"
!!! warning "Указание протокола `https://` обязательно!"
![](_assets/players/televizo/add1.jpg)
![](_assets/players/televizo/add2.jpg)
Из настроек:
![](_assets/players/televizo/add21.jpg)
![](_assets/players/televizo/add22.jpg)
И дальше те же шаги 3-5 на скриншотах выше.
??? quote "Установка User-Agent"
На экране добавления/редактирования плейлиста снять галочку "User-Agent по умолчанию" и ввести необходимый.
Например, для [Wink](../aggregator/faq.md#wink).
#### :thumbsup: M3U
* Скачать: <https://f-droid.org/ru/packages/com.m3u.androidApp>
Умеет показывать картинку-в-картинке, отображать группы и сортировать каналы.
Программу передач нужно [подключать отдельной ссылкой](../aggregator/faq.md#epg), из плейлиста не тянет.
??? image "Главный экран"
![](_assets/players/m3u/main.jpg)
??? image "Добавление плейлиста"
!!! warning "Указание протокола `https://` обязательно!"
![](_assets/players/m3u/add1.jpg)
![](_assets/players/m3u/add2.jpg)
??? image "Установка User-Agent"
![](_assets/players/m3u/ua1.jpg)
![](_assets/players/m3u/ua2.jpg)
#### IPTV (Александр Софронов)
* Скачать: [play.google.com](https://play.google.com/store/apps/details?id=ru.iptvremote.android.iptv)
#### IPTV# (IPTV Sharp)
* Скачать: [play.google.com](https://play.google.com/store/apps/details?id=com.iptvsharp.app)
#### Lazy IPTV
#### Lazy IPTV Deluxe
#### Perfect Player
#### TiviMate
#### 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)
---
+59
View File
@@ -0,0 +1,59 @@
---
icon: material/hand-heart-outline
---
# :material-hand-heart-outline: Поддержка проекта
Проект держится только на сугубо техническом интересе одного разработчика в свободное от работы время.
Проект сознательно не монетизируется: это неправильно по отношению к пользователям и правообладателям.
Ниже перечислены минимально доступные вам способы — от самых простых к более сложным.
## :simple-telegram: Подписаться в Telegram
У проекта есть два публичных ресурса для прямой связи с пользователями.
Там можно ставить **платные реакции** к постам и/или **дарить голоса** (бусты):
* канал: [@iptv_aggregator](https://t.me/iptv_aggregator) ([boost](https://t.me/iptv_aggregator?boost)) — в нём новости о проекте (общие объявления и проведённые доработки);
* чат: [@iptv_aggregator_chat](../tg/chat.md) ([boost](https://t.me/iptv_aggregator_chat?boost)) — комментарии к каналу, общение по теме проекта и IPTV.
## :material-wallet: Внести пожертвование
Вы можете внести прямое денежное **пожертвование** с банковской карты на виртуальный кошелёк ЮMoney:
!!! yoomoney "[yoomoney.ru/to/41001685237530](https://yoomoney.ru/to/41001685237530)"
Разовый платёж, без подписок, на любую сумму.
Также вы можете оформить подписку на Boosty:
!!! boosty "[boosty.to/anthonyaxenov](https://boosty.to/anthonyaxenov)"
Разовый платёж или платная подписка.
Пожертвования добровольны.
Они не дают права на эксклюзивный доступ к чему-либо и не рассматриваются как способ обогащения.
Это лишь попытка компенсировать затраты на содержание проекта.
На пожертвования [был приобретён](https://t.me/iptv_aggregator/30) домен `m3u.su`, который сейчас используется в качестве основного адреса.
## :simple-git: Принять участие в разработке { id="participate" }
Весь исходный код проекта хранится в репозиториях организации: [git.axenov.dev/IPTV](https://git.axenov.dev/IPTV)
Чтобы принять участие в разработке, необходимо [зарегистрироваться на сайте git.axenov.dev](https://git.axenov.dev/user/sign_up) и **активировать** учётную запись по e-mail.
!!! info "Это бесплатно, но неактивированные учётки периодически удаляются."
### :octicons-issue-opened-16: Создать задачу
Любое ПО неидеально, как и документация к нему.
Если вы нашли ошибку, опечатку, неожиданное поведение ПО или есть предложение по улучшению — можете создать задачу в соответствующем репозитории организации.
### :octicons-git-pull-request-16: Прислать изменения
Вы можете внести исправления в код самостоятельно и прислать pull-request для принятия в основную ветку.
Это может быть новый функционал, исправления ошибок или опечаток.
Если есть идеи и желание для расширения функционала проекта, можем обсудить создание нового репозитория с выдачей необходимых прав.