Compare commits

..
2 Commits
61 changed files with 849 additions and 489 deletions
+7
View File
@@ -23,3 +23,10 @@
- При изменениях структуры проекта и только при корректной сборке (без предупреждений и ошибок) всегда актуализируй `./AGENTS.md` - При изменениях структуры проекта и только при корректной сборке (без предупреждений и ошибок) всегда актуализируй `./AGENTS.md`
- При доработке или расширении функционала этого проекта или синтаксиса всегда актуализируй скилл `./.agents/skills/koda-zensical` - При доработке или расширении функционала этого проекта или синтаксиса всегда актуализируй скилл `./.agents/skills/koda-zensical`
- Аргументы `iptvc` должны быть в lower-kebab-case с префиксом `--` (`--playlists-all-cooldown`)
- Параметры конфига `iptvc`, состоящие из нескольких слов, должны быть в camelCase (check.playlists.allCooldown)
- Переменные окружения `iptvc` должны быть в UPPER_SNAKE_CASE (`CHECK_PLAYLISTS_ALL_COOLDOWN`)
- Заголовки документации и шорткоды `<!-- md:... ... -->` должны содержать описываемые сущности как есть
- ID заголовоков должны быть в lower-kebab-case, точки и `_` заменяются на `-` (## `check.playlists.all-cooldown` { id=check-playlists-all-cooldown })
- Обязательно используй шорткоды `<!-- md:config ... -->` для ссылок на документацию параметров конфига
+1 -1
View File
@@ -29,4 +29,4 @@ make live
Исходный код и готовая документация распространяется на условиях лицензии MIT. Исходный код и готовая документация распространяется на условиях лицензии MIT.
См. файл [LICENSE](LICENSE) для подробностей. См. файл [LICENSE](LICENSE) для подробностей.
Стороннее ПО и ресурсы используются в соответствии лицензиями, указанными в файле [content/legal/foss.md](content/legal/foss.md). Стороннее ПО и ресурсы используются в соответствии лицензиями, указанными в файле [content/legal/foss.md](content/extra/legal/foss.md).
+19 -4
View File
@@ -5,6 +5,8 @@
--md-admonition-icon--yoomoney: url('data:image/svg+xml;charset=utf-8,<svg width="169" height="120" viewBox="0 0 169 120" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M108.99 0C75.5725 0 48.9902 26.962 48.9902 60C48.9902 93.4177 75.9523 120 108.99 120C142.028 120 168.99 93.038 168.99 60C168.99 26.962 142.028 0 108.99 0ZM108.99 82.4051C96.8383 82.4051 86.5852 72.1519 86.5852 60C86.5852 47.8481 96.8383 37.5949 108.99 37.5949C121.142 37.5949 131.395 47.8481 131.395 60C131.016 72.1519 121.142 82.4051 108.99 82.4051Z" fill="white"/><path d="M48.6076 17.4684V104.81H27.3418L0 17.4684H48.6076V17.4684Z" fill="white"/></svg>'); --md-admonition-icon--yoomoney: url('data:image/svg+xml;charset=utf-8,<svg width="169" height="120" viewBox="0 0 169 120" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M108.99 0C75.5725 0 48.9902 26.962 48.9902 60C48.9902 93.4177 75.9523 120 108.99 120C142.028 120 168.99 93.038 168.99 60C168.99 26.962 142.028 0 108.99 0ZM108.99 82.4051C96.8383 82.4051 86.5852 72.1519 86.5852 60C86.5852 47.8481 96.8383 37.5949 108.99 37.5949C121.142 37.5949 131.395 47.8481 131.395 60C131.016 72.1519 121.142 82.4051 108.99 82.4051Z" fill="white"/><path d="M48.6076 17.4684V104.81H27.3418L0 17.4684H48.6076V17.4684Z" fill="white"/></svg>');
/* Boosty logo */ /* Boosty logo */
--md-admonition-icon--boosty: url('data:image/svg+xml;charset=utf-8,<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M2.661 14.337 6.801 0h6.362L11.88 4.444l-0.038 0.077 -3.378 11.733h3.15c-1.321 3.289 -2.35 5.867 -3.086 7.733 -5.816 -0.063 -7.442 -4.228 -6.02 -9.155M8.554 24l7.67 -11.035h-3.25l2.83 -7.073c4.852 0.508 7.137 4.33 5.791 8.952C20.16 19.81 14.344 24 8.68 24h-0.127z" fill="white" stroke-width="1"></path></svg>'); --md-admonition-icon--boosty: url('data:image/svg+xml;charset=utf-8,<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M2.661 14.337 6.801 0h6.362L11.88 4.444l-0.038 0.077 -3.378 11.733h3.15c-1.321 3.289 -2.35 5.867 -3.086 7.733 -5.816 -0.063 -7.442 -4.228 -6.02 -9.155M8.554 24l7.67 -11.035h-3.25l2.83 -7.073c4.852 0.508 7.137 4.33 5.791 8.952C20.16 19.81 14.344 24 8.68 24h-0.127z" fill="white" stroke-width="1"></path></svg>');
/* CloudTips logo */
--md-admonition-icon--cloudtips: url('data:image/svg+xml;charset=utf-8,<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="31" height="31" viewBox="-1.5 -1.5 30.9797 30.9989"><path style="fill: rgb(100,150,220); fill-rule: evenodd" stroke-linecap="round" d="M 13.9898 27.9989 C 21.7162 27.9989 27.9797 21.7312 27.9797 13.9995 C 27.9797 6.2678 21.7162 0 13.9898 0 C 6.2635 0 0 6.2678 0 13.9995 C 0 21.7312 6.2635 27.9989 13.9898 27.9989 Z M 20.0445 8.8474 L 10.9846 17.9135 C 11.8911 18.8192 13.1198 19.3279 14.4008 19.3279 C 15.6819 19.3279 16.9105 18.8192 17.8171 17.9135 L 23.4565 12.2618 C 23.6807 12.0377 23.8586 11.7715 23.98 11.4786 C 24.1013 11.1857 24.1638 10.8717 24.1638 10.5546 C 24.1638 10.2375 24.1013 9.9235 23.98 9.6305 C 23.8586 9.3376 23.6807 9.0715 23.4565 8.8474 C 23.2326 8.623 22.9667 8.445 22.6739 8.3236 C 22.3812 8.2022 22.0674 8.1397 21.7505 8.1397 C 21.4336 8.1397 21.1199 8.2022 20.8271 8.3236 C 20.5344 8.445 20.2684 8.623 20.0445 8.8474 Z M 16.9951 10.0865 L 7.9352 19.1526 C 7.7112 19.377 7.4453 19.555 7.1525 19.6764 C 6.8598 19.7978 6.546 19.8603 6.2291 19.8603 C 5.9123 19.8603 5.5985 19.7978 5.3057 19.6764 C 5.013 19.555 4.7471 19.377 4.5231 19.1526 C 4.0719 18.6992 3.8185 18.0854 3.8185 17.4454 C 3.8185 16.8055 4.0719 16.1917 4.5231 15.7382 L 10.1626 10.0865 C 11.0691 9.1808 12.2978 8.6721 13.5788 8.6721 C 14.8599 8.6721 16.0885 9.1808 16.9951 10.0865 Z"/></svg>');
} }
/* Image admonition styling */ /* Image admonition styling */
@@ -24,11 +26,11 @@
.md-typeset .admonition.yoomoney, .md-typeset .admonition.yoomoney,
.md-typeset details.yoomoney { .md-typeset details.yoomoney {
border-color: rgba(113, 47, 244, 1); background-color: rgb(113 47 244 / 10%);
} }
.md-typeset .yoomoney > .admonition-title::before, .md-typeset .yoomoney > .admonition-title::before,
.md-typeset .yoomoney > summary::before { .md-typeset .yoomoney > summary::before {
background-color: rgb(113, 47, 244); background-color: rgb(113 47 244);
-webkit-mask-image: var(--md-admonition-icon--yoomoney); -webkit-mask-image: var(--md-admonition-icon--yoomoney);
mask-image: var(--md-admonition-icon--yoomoney); mask-image: var(--md-admonition-icon--yoomoney);
} }
@@ -37,15 +39,28 @@
.md-typeset .admonition.boosty, .md-typeset .admonition.boosty,
.md-typeset details.boosty { .md-typeset details.boosty {
border-color: rgb(241, 95, 44); background-color: rgb(241 95 44 / 10%)
} }
.md-typeset .boosty > .admonition-title::before, .md-typeset .boosty > .admonition-title::before,
.md-typeset .boosty > summary::before { .md-typeset .boosty > summary::before {
background-color: rgb(241, 95, 44); background-color: rgb(241 95 44);
-webkit-mask-image: var(--md-admonition-icon--boosty); -webkit-mask-image: var(--md-admonition-icon--boosty);
mask-image: var(--md-admonition-icon--boosty); mask-image: var(--md-admonition-icon--boosty);
} }
/* CloudTips admonition styling */
.md-typeset .admonition.cloudtips,
.md-typeset details.cloudtips {
border-color: rgb(241, 95, 44);
}
.md-typeset .cloudtips > .admonition-title::before,
.md-typeset .cloudtips > summary::before {
/* background-color: rgb(241, 95, 44); */
-webkit-mask-image: var(--md-admonition-icon--cloudtips);
mask-image: var(--md-admonition-icon--cloudtips);
}
.badge { .badge {
border-bottom-left-radius: 6px; border-bottom-left-radius: 6px;
+13 -13
View File
@@ -46,8 +46,8 @@ tags: ["сайт", "каналы", "плейлисты", "epg", "плееры",
## Откуда берутся логотипы каналов и программы передач? ## Откуда берутся логотипы каналов и программы передач?
Всё это (не) [указывается](../common/formats/m3u.md#tvg-logo) внутри плейлиста его авторами. Всё это (не) [указывается](../reference/formats/m3u.md#tvg-logo) внутри плейлиста его авторами.
Но в некоторых [плеерах](../common/players.md) можно вручную указывать программу передач (см. ниже). Но в некоторых [плеерах](../reference/players.md) можно вручную указывать программу передач (см. ниже).
## У канала нет логотипа! ## У канала нет логотипа!
@@ -55,7 +55,7 @@ tags: ["сайт", "каналы", "плейлисты", "epg", "плееры",
## У **канала** нет программы передач (EPG), что делать? ## У **канала** нет программы передач (EPG), что делать?
Фига в том, что EPG может быть и [указан](../common/formats/m3u.md#url-tvg) в плейлисте, но у конкретного канала могут быть указаны некорректные [`tvg-id`](../common/formats/m3u.md#tvg-id) или [`tvg-name`](../common/formats/m3u.md#tvg-name). Фига в том, что EPG может быть и [указан](../reference/formats/m3u.md#url-tvg) в плейлисте, но у конкретного канала могут быть указаны некорректные [`tvg-id`](../reference/formats/m3u.md#tvg-id) или [`tvg-name`](../reference/formats/m3u.md#tvg-name).
Может, его дёрнули из другого листа и не подогнали под другую EPG. Может, его дёрнули из другого листа и не подогнали под другую EPG.
Так что вариантов масса: Так что вариантов масса:
@@ -74,17 +74,17 @@ tags: ["сайт", "каналы", "плейлисты", "epg", "плееры",
* не все плееры вообще поддерживают работу с телепрограммой; * не все плееры вообще поддерживают работу с телепрограммой;
* в плейлисте она просто может не быть указана. * в плейлисте она просто может не быть указана.
Но если [плеер](../common/players.md) позволяет, можно указать ссылку на сторонную телепрограмму. Но если [плеер](../reference/players.md) позволяет, можно указать ссылку на сторонную телепрограмму.
И это целое дело. И это целое дело.
Надо чтобы совпадали [`tvg-id`](../common/formats/m3u.md#tvg-id) или [`tvg-name`](../common/formats/m3u.md#tvg-name) каналов с теми, которые указываются в EPG. Надо чтобы совпадали [`tvg-id`](../reference/formats/m3u.md#tvg-id) или [`tvg-name`](../reference/formats/m3u.md#tvg-name) каналов с теми, которые указываются в EPG.
Так что не всякая телепрограмма подойдёт, не ко всякому плейлисту и не ко всем каналам. Так что не всякая телепрограмма подойдёт, не ко всякому плейлисту и не ко всем каналам.
Надо подбирать и то, и то. Надо подбирать и то, и то.
## А где взять программу передач (EPG)? { id="epg" } ## А где взять программу передач (EPG)? { id="epg" }
1. Из самого плейлиста. 1. Из самого плейлиста.
Часто в атрибут [`url-tvg`](../common/formats/m3u.md#url-tvg) тега `#EXTM3U` указывают одну или две ссылки на EPG, разделяя их `;`. Часто в атрибут [`url-tvg`](../reference/formats/m3u.md#url-tvg) тега `#EXTM3U` указывают одну или две ссылки на EPG, разделяя их `;`.
Их можно использовать отдельно, например, если плеер не может корректно обработать такое значение. Их можно использовать отдельно, например, если плеер не может корректно обработать такое значение.
2. Взять одну из этих ссылок: 2. Взять одну из этих ссылок:
@@ -114,7 +114,7 @@ tags: ["сайт", "каналы", "плейлисты", "epg", "плееры",
## Почему на сайте плейлист онлайн, но в нём 0 каналов? ## Почему на сайте плейлист онлайн, но в нём 0 каналов?
[Тебе сюда](checks.md#playlists). [Тебе сюда](../iptvc/site/checks.md#playlists).
## Почему на сайте плейлист онлайн, но у меня он не работает? ## Почему на сайте плейлист онлайн, но у меня он не работает?
@@ -133,7 +133,7 @@ tags: ["сайт", "каналы", "плейлисты", "epg", "плееры",
Но вообще, это зависит от: Но вообще, это зависит от:
* автора плейлиста (дохлые каналы почти всегда есть даже в свежайших листах, но если лист не обновлялся год, что ты вряд-ли узнаешь, то рабочих каналов там не ищи); * автора плейлиста (дохлые каналы почти всегда есть даже в свежайших листах, но если лист не обновлялся год, что ты вряд-ли узнаешь, то рабочих каналов там не ищи);
* твоего [плеера](../common/players.md) (видеотрансляции могут использовать кодек, который просто не поддерживается плеером); * твоего [плеера](../reference/players.md) (видеотрансляции могут использовать кодек, который просто не поддерживается плеером);
* ширины твоего интернет-канала (не надо пытаться врубать FHD/4K трансляции с мобильного интернета на самом дешёвом тарифе в лесу); * ширины твоего интернет-канала (не надо пытаться врубать FHD/4K трансляции с мобильного интернета на самом дешёвом тарифе в лесу);
* ретроградности Меркурия и магнитных бурь (а вдруг); * ретроградности Меркурия и магнитных бурь (а вдруг);
* настроек твоей сети, твоего интернет-провайдера, VPN (подумай хорошенько, хочешь ли ты смотреть российские каналы из РФ через Уганду или США); * настроек твоей сети, твоего интернет-провайдера, VPN (подумай хорошенько, хочешь ли ты смотреть российские каналы из РФ через Уганду или США);
@@ -153,13 +153,13 @@ tags: ["сайт", "каналы", "плейлисты", "epg", "плееры",
Короткие коды плейлистов могут меняться, поэтому вполне может произойти внезапная подмена одного другим, однако это происходит крайне редко. Короткие коды плейлистов могут меняться, поэтому вполне может произойти внезапная подмена одного другим, однако это происходит крайне редко.
Плюс читай про доверие [результатам проверки](checks.md). Плюс читай про доверие [результатам проверки](../iptvc/site/checks.md).
## В плейлистах порнуха! ## В плейлистах порнуха!
Да, в плейлистах порнуха. Да, в плейлистах порнуха.
Это [явно помечается](checks.md#adult) везде, где это технически возможно. Это [явно помечается](../iptvc/site/checks.md#adult) везде, где это технически возможно.
Смотри с удовольствием сколько хочешь, всё для тебя. Смотри с удовольствием сколько хочешь, всё для тебя.
Или без удовольствия. Или без удовольствия.
@@ -190,7 +190,7 @@ tags: ["сайт", "каналы", "плейлисты", "epg", "плееры",
Например, ты на своём компе: Например, ты на своём компе:
* открываешь любой текстовый редактор; * открываешь любой текстовый редактор;
* оформляешь текст в формате [m3u](../common/formats/m3u.md); * оформляешь текст в формате [m3u](../reference/formats/m3u.md);
* сохраняешь в файл `pls.m3u`. * сохраняешь в файл `pls.m3u`.
Получился плейлист `pls.m3u`. Получился плейлист `pls.m3u`.
@@ -251,7 +251,7 @@ tags: ["сайт", "каналы", "плейлисты", "epg", "плееры",
Нет, и не планируется. Нет, и не планируется.
Ищи [плеер](../common/players.md) и добавляй плейлист туда по ссылке. Ищи [плеер](../reference/players.md) и добавляй плейлист туда по ссылке.
## На канале отображается заглушка { id="заглушка" } ## На канале отображается заглушка { id="заглушка" }
@@ -308,7 +308,7 @@ tags: ["сайт", "каналы", "плейлисты", "epg", "плееры",
**Решение 3:** если IP не российский, то сделать его российским (любыми способами). **Решение 3:** если IP не российский, то сделать его российским (любыми способами).
**Решение 4:** использовать [плеер](../common/players.md), который позволяет указать **User-Agent**, и вставить туда какой-нибудь из этих: **Решение 4:** использовать [плеер](../reference/players.md), который позволяет указать **User-Agent**, и вставить туда какой-нибудь из этих:
``` ```
Mozilla/5.0 WINK/1.28.2 (AndroidTV/9) HlsWinkPlayer Mozilla/5.0 WINK/1.28.2 (AndroidTV/9) HlsWinkPlayer
+1 -1
View File
@@ -61,7 +61,7 @@ hide: [toc]
Автор не зарабатывает на проекте и не собирается. Автор не зарабатывает на проекте и не собирается.
Всё, что отображается на сайте, сделано бесплатно и на энтузиазме. Всё, что отображается на сайте, сделано бесплатно и на энтузиазме.
Но ты можешь сделать [добровольное пожертвование](../common/support.md), которое поможет мне компенсировать затраты на поддержку и техническое развитие проекта. Но ты можешь сделать [добровольное пожертвование](../extra/support.md), которое поможет мне компенсировать затраты на поддержку и техническое развитие проекта.
## Условия, гарантии, обязательства и последствия ## Условия, гарантии, обязательства и последствия
+2 -2
View File
@@ -8,9 +8,9 @@ hide: [toc]
<div class="grid cards" markdown> <div class="grid cards" markdown>
- [:material-cogs: Как работает сервис](../aggregator/overview.md) - [:material-cogs: Как работает сервис](../aggregator/overview.md)
- [:material-file-eye-outline: Как отбираются плейлисты](../aggregator/selection.md) - [:material-file-eye-outline: Как отбираются плейлисты](../aggregator/selection.md)
- [:material-file-refresh-outline: Проверки и статусы](../aggregator/checks.md) - [:material-file-refresh-outline: Проверки и статусы](../iptvc/site/checks.md)
- [:fontawesome-solid-list-check: Список плейлистов](../iptvc/site/list.md) - [:fontawesome-solid-list-check: Список плейлистов](../iptvc/site/list.md)
- [:material-table-eye: Страница плейлиста](../iptvc/site/details.md) - [:material-table-eye: Страница плейлиста](../iptvc/site/details.md)
- [:material-television-play: Как подключить плейлист](../iptvc/site/connect.md) - [:material-television-play: Как подключить плейлист](../iptvc/site/connect.md)
- [:material-multimedia: IPTV плееры](players.md) - [:material-multimedia: IPTV плееры](../reference/players.md)
</div> </div>

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 80 KiB

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Before

Width:  |  Height:  |  Size: 9.0 KiB

After

Width:  |  Height:  |  Size: 9.0 KiB

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 59 KiB

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 70 KiB

@@ -29,5 +29,5 @@ icon: material/book-open-page-variant-outline
4. справа — содержание конкретной страницы. 4. справа — содержание конкретной страницы.
??? info end "На мобильниках содержание страницы спрятано за этой кнопкой в боковом меню:" ??? info end "На мобильниках содержание страницы спрятано за этой кнопкой в боковом меню:"
![Скриншот бокового меню с мобильной версии](_assets/mobile-toc-btn.jpg) ![Скриншот бокового меню с мобильной версии](../common/_assets/mobile-toc-btn.jpg)
@@ -5,7 +5,7 @@ icon: material/wallet-outline
# :material-wallet-outline: Правообладателям # :material-wallet-outline: Правообладателям
Данные, представленные на сайте https://m3u.su, получены автоматически из открыто доступных в интернете IPTV-плейлистов, опубликованных третьими лицами. Данные, представленные на сайте https://m3u.su, получены автоматически из открыто доступных в интернете IPTV-плейлистов, опубликованных третьими лицами.
При наличии технической возможности, источник плейлиста может быть указан на вкладке [«Основные данные»](../iptvc/site/details.md). При наличии технической возможности, источник плейлиста может быть указан на вкладке [«Основные данные»](../../iptvc/site/details.md).
Сервис https://m3u.su не размещает и не транслирует медиаконтент, не создаёт, не призывает использовать и распространять плейлисты третьих лиц, а также не оказывает услуг по ретрансляции телепрограмм. Сервис https://m3u.su не размещает и не транслирует медиаконтент, не создаёт, не призывает использовать и распространять плейлисты третьих лиц, а также не оказывает услуг по ретрансляции телепрограмм.
@@ -16,23 +16,23 @@ icon: material/hand-heart-outline
Там можно ставить **платные реакции** к постам и/или **дарить голоса** (бусты): Там можно ставить **платные реакции** к постам и/или **дарить голоса** (бусты):
* канал: [@iptv_aggregator](https://t.me/iptv_aggregator) ([boost](https://t.me/iptv_aggregator?boost)) — в нём новости о проекте (общие объявления и проведённые доработки); * канал: [@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. * чат: [@iptv_aggregator_chat](../tg/chat.md) — комментарии к каналу, общение по теме проекта и IPTV.
## :material-wallet: Внести пожертвование ## :material-wallet: Внести пожертвование
Вы можете внести прямое денежное **пожертвование** с банковской карты на виртуальный кошелёк ЮMoney: Пожертвования добровольны и безвозмездны.
Вы не получите ничего взамен, кроме чека.
Для вас пожертвования в мой адрес — способ сказать мне "Спасибо".
Для меня — способ компенсировать малую долю затрат на содержание проекта.
Вы можете внести прямое денежное пожертвование с банковской карты:
!!! yoomoney "[yoomoney.ru/to/41001685237530](https://yoomoney.ru/to/41001685237530)" !!! yoomoney "[yoomoney.ru/to/41001685237530](https://yoomoney.ru/to/41001685237530)"
Разовый платёж, без подписок, на любую сумму.
Также вы можете оформить подписку на Boosty: !!! cloudtips "[pay.cloudtips.ru/p/16167fc3](https://pay.cloudtips.ru/p/16167fc3)"
!!! boosty "[boosty.to/anthonyaxenov](https://boosty.to/anthonyaxenov)" !!! boosty "[boosty.to/anthonyaxenov](https://boosty.to/anthonyaxenov)"
Разовый платёж или платная подписка.
Пожертвования добровольны.
Они не дают права на эксклюзивный доступ к чему-либо и не рассматриваются как способ обогащения.
Это лишь попытка компенсировать затраты на содержание проекта.
На пожертвования [был приобретён](https://t.me/iptv_aggregator/30) домен `m3u.su`, который сейчас используется в качестве основного адреса. На пожертвования [был приобретён](https://t.me/iptv_aggregator/30) домен `m3u.su`, который сейчас используется в качестве основного адреса.
@@ -42,7 +42,10 @@ icon: material/hand-heart-outline
Чтобы принять участие в разработке, необходимо [зарегистрироваться на сайте git.axenov.dev](https://git.axenov.dev/user/sign_up) и **активировать** учётную запись по e-mail. Чтобы принять участие в разработке, необходимо [зарегистрироваться на сайте git.axenov.dev](https://git.axenov.dev/user/sign_up) и **активировать** учётную запись по e-mail.
!!! info "Это бесплатно, но неактивированные учётки периодически удаляются." !!! info "Это бесплатно"
От вас не потребуется никаких персональных данных.
Сервер расположен в РФ.
Неактивированные учётки периодически удаляются.
### :octicons-issue-opened-16: Создать задачу ### :octicons-issue-opened-16: Создать задачу
+3 -3
View File
@@ -50,7 +50,7 @@ hero:
Полное описание `config.yml`, переменных окружения и CLI-флагов Полное описание `config.yml`, переменных окружения и CLI-флагов
[Подробнее :octicons-arrow-right-24:](common/config/config.md){ .md-button .md-button--primary } [Подробнее :octicons-arrow-right-24:](reference/config.md){ .md-button .md-button--primary }
- :material-book-open-page-variant-outline:{ .lg .middle } **Об этой документации** - :material-book-open-page-variant-outline:{ .lg .middle } **Об этой документации**
@@ -58,7 +58,7 @@ hero:
Подборка плееров для всех платформ — найдите и настройте плеер для себя Подборка плееров для всех платформ — найдите и настройте плеер для себя
[Подробнее :octicons-arrow-right-24:](common/players.md){ .md-button .md-button--primary } [Подробнее :octicons-arrow-right-24:](reference/players.md){ .md-button .md-button--primary }
- :material-hand-heart:{ .lg .middle } **Поддержка проекта** - :material-hand-heart:{ .lg .middle } **Поддержка проекта**
@@ -66,6 +66,6 @@ hero:
Проекту важна поддержка, и вот как вы можете принять участие Проекту важна поддержка, и вот как вы можете принять участие
[Подробнее :octicons-arrow-right-24:](common/support.md){ .md-button .md-button--primary } [Подробнее :octicons-arrow-right-24:](extra/support.md){ .md-button .md-button--primary }
</div> </div>
+47 -37
View File
@@ -13,7 +13,7 @@ tags: [iptvc]
## `-i`, `--ini` { id=ini } ## `-i`, `--ini` { id=ini }
Указывает путь к локальному [ini-файлу](../../common/formats/playlists.md) с описанием плейлистов. Указывает путь к локальному [ini-файлу](../../reference/formats/playlists.md) с описанием плейлистов.
Можно указать только однажды. Можно указать только однажды.
@@ -27,7 +27,7 @@ tags: [iptvc]
## `-t`, `--tags` { id=tags } ## `-t`, `--tags` { id=tags }
Указывает путь к локальному [json-файлу](../../common/formats/channels.md) с описанием тегов каналов. Указывает путь к локальному [json-файлу](../../reference/formats/channels.md) с описанием тегов каналов.
Можно указать только однажды. Можно указать только однажды.
@@ -64,7 +64,7 @@ tags: [iptvc]
## `-c`, `--code` { id=code } ## `-c`, `--code` { id=code }
Указывает код плейлиста из файла [playlists.ini](../../common/formats/playlists.md). Указывает код плейлиста из файла [playlists.ini](../../reference/formats/playlists.md).
Можно указать несколько разных. Можно указать несколько разных.
@@ -87,14 +87,14 @@ tags: [iptvc]
Если указано `0`, тогда: Если указано `0`, тогда:
* повторение будет бесконечным; * повторение будет бесконечным;
* если переданы [`--url`](#url), [`--file`](#file) или [`--code`](#code), то на каждой итерации будут проверяться только указанные плейлисты; * если переданы [`--url`](#url), [`--file`](#file) или [`--code`](#code), то на каждой итерации будут проверяться только указанные плейлисты;
* если не переданы [`--url`](#url), [`--file`](#file) или [`--code`](#code), то на каждой итерации список плейлистов будет подготавливаться заново. * если не переданы [`--url`](#url), [`--file`](#file) или [`--code`](#code), то на каждой итерации список плейлистов будет подготавливаться заново.
Если при этом используется кеширование, то проверенные плейлисты (результаты проверки которых ещё находятся в кеше) проверяться не будут. Если при этом используется кеширование, то проверенные плейлисты (результаты проверки которых ещё находятся в кеше) проверяться не будут.
```shell title="Пример" ```shell title="Пример"
# проверить 5 раз плейлисты с кодами xx и yy из my.ini # проверить 5 раз плейлисты с кодами xx и yy из my.ini
./iptvc check -i ~/my.ini -c xx --code yy --repeat 5 ./iptvc check -i ~/my.ini -c xx --code yy --repeat 5
# бесконечно проверять все плейлисты из my.ini, без учёта проверенных # бесконечно проверять все плейлисты из my.ini, без учёта проверенных
./iptvc check -i ~/my.ini --repeat 0 ./iptvc check -i ~/my.ini --repeat 0
@@ -104,11 +104,11 @@ tags: [iptvc]
## `--playlists-all-cooldown` { id=playlists-all-cooldown } ## `--playlists-all-cooldown` { id=playlists-all-cooldown }
Указывает паузу между полными циклами проверки в секундах. Параметр переопределяет `check.playlists.all-cooldown` из конфигурации. Указывает паузу между полными циклами проверки в секундах. Параметр переопределяет `check.playlists.allCooldown` из конфигурации.
Пауза применяется после завершения полного цикла и перед началом следующего. Внутри цикла этот параметр не используется: для задержки между плейлистами применяется [`check.playlists.one-cooldown`](#playlists-one-cooldown). Пауза применяется после завершения полного цикла и перед началом следующего. Внутри цикла этот параметр не используется: для задержки между плейлистами применяется [`check.playlists.oneCooldown`](#playlists-one-cooldown).
Значение по умолчанию: значение `check.playlists.all-cooldown` из конфигурации, обычно `1800` (30 минут). Значение по умолчанию: значение `check.playlists.allCooldown` из конфигурации, обычно `1800` (30 минут).
```shell title="Пример" ```shell title="Пример"
# проверить 5 раз с паузой 5 секунд между циклами # проверить 5 раз с паузой 5 секунд между циклами
@@ -151,18 +151,20 @@ tags: [iptvc]
./iptvc check -i ~/my.ini --random 10 --quiet --json ./iptvc check -i ~/my.ini --random 10 --quiet --json
``` ```
## `-v`, `--verbose` { id=verbose }
Включает подробное логирование.
```shell title="Пример"
./iptvc check --random 10 --verbose
```
## Глобальные флаги { id=global } ## Глобальные флаги { id=global }
Эти флаги доступны для всех команд и переопределяют значения из `config.yml`. Эти флаги доступны для всех команд и переопределяют значения из `config.yml`.
### `--config` { id=config }
Путь к файлу конфигурации `config.yml`.
Значение по умолчанию: `config.yml`
```shell title="Пример"
./iptvc check --config /etc/iptvc/config.yml
```
### `--debug` { id=debug } ### `--debug` { id=debug }
Включает режим отладки. Переопределяет `app.debug` из `config.yml` и переменную `APP_DEBUG`. Включает режим отладки. Переопределяет `app.debug` из `config.yml` и переменную `APP_DEBUG`.
@@ -173,7 +175,7 @@ tags: [iptvc]
### `--log-level` { id=log-level } ### `--log-level` { id=log-level }
Устанавливает уровень логирования. Переопределяет `app.log_level` из `config.yml`. Устанавливает уровень логирования. Переопределяет `app.logLevel` из `config.yml`.
Доступные значения: `debug`, `info`, `warn`, `error`. Доступные значения: `debug`, `info`, `warn`, `error`.
@@ -181,6 +183,14 @@ tags: [iptvc]
./iptvc check -i ~/my.ini --log-level debug ./iptvc check -i ~/my.ini --log-level debug
``` ```
### `-v`, `--verbose` { id=verbose }
Включает подробное логирование.
```shell title="Пример"
./iptvc check --random 10 --verbose
```
## Флаги проверки плейлистов { id=check-playlists } ## Флаги проверки плейлистов { id=check-playlists }
Эти флаги переопределяют параметры секции `check.playlists` из `config.yml`. Доступны для команд `check` и `serve`. Эти флаги переопределяют параметры секции `check.playlists` из `config.yml`. Доступны для команд `check` и `serve`.
@@ -199,7 +209,7 @@ tags: [iptvc]
Задержка в секундах после проверки всех плейлистов. Задержка в секундах после проверки всех плейлистов.
Переопределяет `check.playlists.all-cooldown` (по умолчанию `1800`). Переопределяет `check.playlists.allCooldown` (по умолчанию `1800`).
```shell title="Пример" ```shell title="Пример"
./iptvc check -i ~/my.ini --playlists-all-cooldown 10 ./iptvc check -i ~/my.ini --playlists-all-cooldown 10
@@ -209,7 +219,7 @@ tags: [iptvc]
Задержка в секундах после проверки каждого плейлиста. Задержка в секундах после проверки каждого плейлиста.
Переопределяет `check.playlists.one-cooldown` (по умолчанию `2`). Переопределяет `check.playlists.oneCooldown` (по умолчанию `2`).
```shell title="Пример" ```shell title="Пример"
./iptvc check -i ~/my.ini --playlists-one-cooldown 2 ./iptvc check -i ~/my.ini --playlists-one-cooldown 2
@@ -219,7 +229,7 @@ tags: [iptvc]
Максимум одновременно проверяемых плейлистов. Максимум одновременно проверяемых плейлистов.
Переопределяет `check.playlists.max-routines` (по умолчанию `1`). Переопределяет `check.playlists.maxRoutines` (по умолчанию `1`).
```shell title="Пример" ```shell title="Пример"
./iptvc check -i ~/my.ini --playlists-max-routines 10 ./iptvc check -i ~/my.ini --playlists-max-routines 10
@@ -229,7 +239,7 @@ tags: [iptvc]
Количество плейлистов на одну процедуру проверки. Количество плейлистов на одну процедуру проверки.
Переопределяет `check.playlists.per-routine` (по умолчанию `1`). Переопределяет `check.playlists.perRoutine` (по умолчанию `1`).
```shell title="Пример" ```shell title="Пример"
./iptvc check -i ~/my.ini --playlists-per-routine 3 ./iptvc check -i ~/my.ini --playlists-per-routine 3
@@ -239,7 +249,7 @@ tags: [iptvc]
User-Agent для HTTP-запросов плейлистов. Можно указать несколько — будет выбран случайный при каждом запросе. User-Agent для HTTP-запросов плейлистов. Можно указать несколько — будет выбран случайный при каждом запросе.
Переопределяет `check.playlists.user-agent`. Переопределяет `check.playlists.userAgent`.
```shell title="Пример" ```shell title="Пример"
./iptvc check -i ~/my.ini --playlists-user-agent "Mozilla/5.0" "curl/8.0" ./iptvc check -i ~/my.ini --playlists-user-agent "Mozilla/5.0" "curl/8.0"
@@ -263,7 +273,7 @@ User-Agent для HTTP-запросов плейлистов. Можно ука
Объём данных в байтах для загрузки от сервера при проверке канала. Объём данных в байтах для загрузки от сервера при проверке канала.
Переопределяет `check.channels.byte-range` (по умолчанию `512`). Переопределяет `check.channels.byteRange` (по умолчанию `512`).
```shell title="Пример" ```shell title="Пример"
./iptvc check -i ~/my.ini --channels-byte-range 1024 ./iptvc check -i ~/my.ini --channels-byte-range 1024
@@ -283,7 +293,7 @@ User-Agent для HTTP-запросов плейлистов. Можно ука
Максимум одновременно проверяемых каналов. Максимум одновременно проверяемых каналов.
Переопределяет `check.channels.max-routines` (по умолчанию `50`). Переопределяет `check.channels.maxRoutines` (по умолчанию `50`).
```shell title="Пример" ```shell title="Пример"
./iptvc check -i ~/my.ini --channels-max-routines 100 ./iptvc check -i ~/my.ini --channels-max-routines 100
@@ -293,7 +303,7 @@ User-Agent для HTTP-запросов плейлистов. Можно ука
Количество каналов на одну процедуру проверки. Количество каналов на одну процедуру проверки.
Переопределяет `check.channels.per-routine` (по умолчанию `10`). Переопределяет `check.channels.perRoutine` (по умолчанию `10`).
```shell title="Пример" ```shell title="Пример"
./iptvc check -i ~/my.ini --channels-per-routine 20 ./iptvc check -i ~/my.ini --channels-per-routine 20
@@ -303,7 +313,7 @@ User-Agent для HTTP-запросов плейлистов. Можно ука
User-Agent для HTTP-запросов каналов. Можно указать несколько — будет выбран случайный при каждом запросе. User-Agent для HTTP-запросов каналов. Можно указать несколько — будет выбран случайный при каждом запросе.
Переопределяет `check.channels.user-agent`. Переопределяет `check.channels.userAgent`.
```shell title="Пример" ```shell title="Пример"
./iptvc check -i ~/my.ini --channels-user-agent "Mozilla/5.0" "VLC/3.0" ./iptvc check -i ~/my.ini --channels-user-agent "Mozilla/5.0" "VLC/3.0"
@@ -315,9 +325,9 @@ User-Agent для HTTP-запросов каналов. Можно указат
### `--cache-enabled` { id=cache-enabled } ### `--cache-enabled` { id=cache-enabled }
Включает кеширование результатов в KeyDB/Redis. Включает кеширование результатов.
Переопределяет `cache.enabled` (по умолчанию `false`). Переопределяет `cache.enabled` (по умолчанию `true`).
```shell title="Пример" ```shell title="Пример"
./iptvc check -i ~/my.ini --cache-enabled ./iptvc check -i ~/my.ini --cache-enabled
@@ -325,9 +335,9 @@ User-Agent для HTTP-запросов каналов. Можно указат
### `--cache-host` { id=cache-host } ### `--cache-host` { id=cache-host }
Хост KeyDB/Redis. Хост кеша.
Переопределяет `cache.host` (по умолчанию `localhost`). Переопределяет `cache.host` (по умолчанию `cache`).
```shell title="Пример" ```shell title="Пример"
./iptvc check -i ~/my.ini --cache-enabled --cache-host 192.168.1.10 ./iptvc check -i ~/my.ini --cache-enabled --cache-host 192.168.1.10
@@ -335,7 +345,7 @@ User-Agent для HTTP-запросов каналов. Можно указат
### `--cache-port` { id=cache-port } ### `--cache-port` { id=cache-port }
Порт KeyDB/Redis. Порт кеша.
Переопределяет `cache.port` (по умолчанию `6379`). Переопределяет `cache.port` (по умолчанию `6379`).
@@ -345,7 +355,7 @@ User-Agent для HTTP-запросов каналов. Можно указат
### `--cache-username` { id=cache-username } ### `--cache-username` { id=cache-username }
Логин для подключения к KeyDB/Redis. Логин для подключения к кешу.
Переопределяет `cache.username`. Переопределяет `cache.username`.
@@ -355,7 +365,7 @@ User-Agent для HTTP-запросов каналов. Можно указат
### `--cache-password` { id=cache-password } ### `--cache-password` { id=cache-password }
Пароль для подключения к KeyDB/Redis. Пароль для подключения к кешу.
Переопределяет `cache.password`. Переопределяет `cache.password`.
@@ -365,7 +375,7 @@ User-Agent для HTTP-запросов каналов. Можно указат
### `--cache-db` { id=cache-db } ### `--cache-db` { id=cache-db }
Номер базы данных KeyDB/Redis. Номер базы данных кеша.
Переопределяет `cache.db` (по умолчанию `0`). Переопределяет `cache.db` (по умолчанию `0`).
@@ -377,7 +387,7 @@ User-Agent для HTTP-запросов каналов. Можно указат
TTL записей кеша в секундах. TTL записей кеша в секундах.
Переопределяет `cache.ttl` (по умолчанию `30`). Переопределяет `cache.ttl` (по умолчанию `3600`).
```shell title="Пример" ```shell title="Пример"
./iptvc check -i ~/my.ini --cache-enabled --cache-ttl 3600 ./iptvc check -i ~/my.ini --cache-enabled --cache-ttl 3600
+1 -1
View File
@@ -18,6 +18,6 @@ hide: [toc]
| ----------------- | ------ | ---------------------------- | ----------------------------------------------------- | | ----------------- | ------ | ---------------------------- | ----------------------------------------------------- |
| `--config` | string | — | Путь к файлу конфигурации (по умолчанию `config.yml`) | | `--config` | string | — | Путь к файлу конфигурации (по умолчанию `config.yml`) |
| `--debug` | bool | `app.debug` | Включить режим отладки | | `--debug` | bool | `app.debug` | Включить режим отладки |
| `--log-level` | string | `app.log_level` | Уровень логирования: `debug`, `info`, `warn`, `error` | | `--log-level` | string | `app.logLevel` | Уровень логирования: `debug`, `info`, `warn`, `error` |
| `-v`, `--verbose` | bool | — | Подробное логирование | | `-v`, `--verbose` | bool | — | Подробное логирование |
+53 -48
View File
@@ -53,7 +53,7 @@ iptvc serve --check
### `-i`, `--ini` { id="ini" } ### `-i`, `--ini` { id="ini" }
Путь к локальному [ini-файлу](../../common/formats/playlists.md) с описанием плейлистов. Путь к локальному [ini-файлу](../../reference/formats/playlists.md) с описанием плейлистов.
Значение по умолчанию: `./playlists.ini` Значение по умолчанию: `./playlists.ini`
@@ -63,7 +63,7 @@ iptvc serve --check -i ~/my.ini
### `-t`, `--tags` { id="tags" } ### `-t`, `--tags` { id="tags" }
Путь к [json-файлу](../../common/formats/channels.md) с описанием тегов каналов. Путь к [json-файлу](../../reference/formats/channels.md) с описанием тегов каналов.
Значение по умолчанию: `./channels.json` Значение по умолчанию: `./channels.json`
@@ -73,9 +73,9 @@ iptvc serve --check -t ~/tags.json
### `--playlists-all-cooldown` { id=playlists-all-cooldown } ### `--playlists-all-cooldown` { id=playlists-all-cooldown }
Пауза между полными циклами фоновой проверки в секундах. Параметр переопределяет `check.playlists.all-cooldown` из конфигурации. Пауза между полными циклами фоновой проверки в секундах. Параметр переопределяет `check.playlists.allCooldown` из конфигурации.
Значение по умолчанию: значение `check.playlists.all-cooldown` из конфигурации, обычно `1800` (30 минут). Значение по умолчанию: значение `check.playlists.allCooldown` из конфигурации, обычно `1800` (30 минут).
```bash ```bash
# пауза 2 минуты между циклами # пауза 2 минуты между циклами
@@ -115,7 +115,9 @@ iptvc serve --config /etc/iptvc/config.yml
### `--debug` { id="debug" } ### `--debug` { id="debug" }
Включает режим отладки. Переопределяет `app.debug` из `config.yml` и переменную `APP_DEBUG`. Включает режим отладки.
Переопределяет <!-- md:config app.debug --> из `config.yml` и переменную `APP_DEBUG`.
```bash ```bash
iptvc serve --debug iptvc serve --debug
@@ -123,7 +125,9 @@ iptvc serve --debug
### `--log-level` { id="log-level" } ### `--log-level` { id="log-level" }
Устанавливает уровень логирования. Переопределяет `app.log_level` из `config.yml`. Устанавливает уровень логирования.
Переопределяет <!-- md:config app.logLevel --> из `config.yml`.
Доступные значения: `debug`, `info`, `warn`, `error`. Доступные значения: `debug`, `info`, `warn`, `error`.
@@ -137,13 +141,13 @@ iptvc serve --log-level debug
## Флаги проверки плейлистов ## Флаги проверки плейлистов
Эти флаги переопределяют параметры секции `check.playlists` из `config.yml`. Доступны для команд `check` и `serve`. Имеют смысл только при включённой фоновой проверке (`--check` или `check.start-on-serve: true`). Эти флаги переопределяют параметры секции `check.playlists` из `config.yml`. Доступны для команд `check` и `serve`. Имеют смысл только при включённой фоновой проверке (`--check` или `check.startOnServe: true`).
### `--playlists-timeout` { id="playlists-timeout" } ### `--playlists-timeout` { id="playlists-timeout" }
Таймаут HTTP-запроса плейлиста в секундах. Таймаут HTTP-запроса плейлиста в секундах.
Переопределяет `check.playlists.timeout` (по умолчанию `10`). Переопределяет <!-- md:config check.playlists.timeout --> (по умолчанию `10`).
```bash ```bash
iptvc serve --check --playlists-timeout 5 iptvc serve --check --playlists-timeout 5
@@ -153,7 +157,7 @@ iptvc serve --check --playlists-timeout 5
Задержка в секундах после проверки всех плейлистов. Задержка в секундах после проверки всех плейлистов.
Переопределяет `check.playlists.all-cooldown` (по умолчанию `1800`). Переопределяет <!-- md:config check.playlists.allCooldown --> (по умолчанию `1800`).
```bash ```bash
iptvc serve --check --playlists-all-cooldown 10 iptvc serve --check --playlists-all-cooldown 10
@@ -163,7 +167,7 @@ iptvc serve --check --playlists-all-cooldown 10
Задержка в секундах после проверки каждого плейлиста. Задержка в секундах после проверки каждого плейлиста.
Переопределяет `check.playlists.one-cooldown` (по умолчанию `2`). Переопределяет <!-- md:config check.playlists.oneCooldown --> (по умолчанию `2`).
```bash ```bash
iptvc serve --check --playlists-one-cooldown 2 iptvc serve --check --playlists-one-cooldown 2
@@ -173,7 +177,7 @@ iptvc serve --check --playlists-one-cooldown 2
Максимум одновременно проверяемых плейлистов. Максимум одновременно проверяемых плейлистов.
Переопределяет `check.playlists.max-routines` (по умолчанию `1`). Переопределяет <!-- md:config check.playlists.maxRoutines --> (по умолчанию `1`).
```bash ```bash
iptvc serve --check --playlists-max-routines 10 iptvc serve --check --playlists-max-routines 10
@@ -183,7 +187,7 @@ iptvc serve --check --playlists-max-routines 10
Количество плейлистов на одну процедуру проверки. Количество плейлистов на одну процедуру проверки.
Переопределяет `check.playlists.per-routine` (по умолчанию `1`). Переопределяет <!-- md:config check.playlists.perRoutine --> (по умолчанию `1`).
```bash ```bash
iptvc serve --check --playlists-per-routine 3 iptvc serve --check --playlists-per-routine 3
@@ -193,7 +197,7 @@ iptvc serve --check --playlists-per-routine 3
User-Agent для HTTP-запросов плейлистов. Можно указать несколько — будет выбран случайный при каждом запросе. User-Agent для HTTP-запросов плейлистов. Можно указать несколько — будет выбран случайный при каждом запросе.
Переопределяет `check.playlists.user-agent`. Переопределяет <!-- md:config check.playlists.userAgent -->.
```bash ```bash
iptvc serve --check --playlists-user-agent "Mozilla/5.0" "curl/8.0" iptvc serve --check --playlists-user-agent "Mozilla/5.0" "curl/8.0"
@@ -207,7 +211,7 @@ iptvc serve --check --playlists-user-agent "Mozilla/5.0" "curl/8.0"
Таймаут HTTP-запроса канала в секундах. Таймаут HTTP-запроса канала в секундах.
Переопределяет `check.channels.timeout` (по умолчанию `10`). Переопределяет <!-- md:config check.channels.timeout --> (по умолчанию `10`).
```bash ```bash
iptvc serve --check --channels-timeout 8 iptvc serve --check --channels-timeout 8
@@ -217,7 +221,7 @@ iptvc serve --check --channels-timeout 8
Объём данных в байтах для загрузки от сервера при проверке канала. Объём данных в байтах для загрузки от сервера при проверке канала.
Переопределяет `check.channels.byte-range` (по умолчанию `512`). Переопределяет <!-- md:config check.channels.byteRange --> (по умолчанию `512`).
```bash ```bash
iptvc serve --check --channels-byte-range 1024 iptvc serve --check --channels-byte-range 1024
@@ -227,7 +231,7 @@ iptvc serve --check --channels-byte-range 1024
Задержка в секундах после проверки каждого канала. Задержка в секундах после проверки каждого канала.
Переопределяет `check.channels.cooldown` (по умолчанию `0`). Переопределяет <!-- md:config check.channels.cooldown --> (по умолчанию `0`).
```bash ```bash
iptvc serve --check --channels-cooldown 1 iptvc serve --check --channels-cooldown 1
@@ -237,7 +241,7 @@ iptvc serve --check --channels-cooldown 1
Максимум одновременно проверяемых каналов. Максимум одновременно проверяемых каналов.
Переопределяет `check.channels.max-routines` (по умолчанию `50`). Переопределяет <!-- md:config check.channels.maxRoutines --> (по умолчанию `50`).
```bash ```bash
iptvc serve --check --channels-max-routines 100 iptvc serve --check --channels-max-routines 100
@@ -247,7 +251,7 @@ iptvc serve --check --channels-max-routines 100
Количество каналов на одну процедуру проверки. Количество каналов на одну процедуру проверки.
Переопределяет `check.channels.per-routine` (по умолчанию `10`). Переопределяет <!-- md:config check.channels.perRoutine --> (по умолчанию `10`).
```bash ```bash
iptvc serve --check --channels-per-routine 20 iptvc serve --check --channels-per-routine 20
@@ -257,7 +261,7 @@ iptvc serve --check --channels-per-routine 20
User-Agent для HTTP-запросов каналов. Можно указать несколько — будет выбран случайный при каждом запросе. User-Agent для HTTP-запросов каналов. Можно указать несколько — будет выбран случайный при каждом запросе.
Переопределяет `check.channels.user-agent`. Переопределяет <!-- md:config check.channels.userAgent -->.
```bash ```bash
iptvc serve --check --channels-user-agent "Mozilla/5.0" "VLC/3.0" iptvc serve --check --channels-user-agent "Mozilla/5.0" "VLC/3.0"
@@ -269,9 +273,9 @@ iptvc serve --check --channels-user-agent "Mozilla/5.0" "VLC/3.0"
### `--cache-enabled` { id="cache-enabled" } ### `--cache-enabled` { id="cache-enabled" }
Включает кеширование результатов в KeyDB/Redis. Включает кеширование результатов redis-совместимым сервисом.
Переопределяет `cache.enabled` (по умолчанию `false`). Переопределяет <!-- md:config cache.enabled --> (по умолчанию `true`).
```bash ```bash
iptvc serve --cache-enabled iptvc serve --cache-enabled
@@ -279,9 +283,9 @@ iptvc serve --cache-enabled
### `--cache-host` { id="cache-host" } ### `--cache-host` { id="cache-host" }
Хост KeyDB/Redis. Хост сервиса кеша.
Переопределяет `cache.host` (по умолчанию `localhost`). Переопределяет <!-- md:config cache.host --> (по умолчанию `cache`).
```bash ```bash
iptvc serve --cache-enabled --cache-host 192.168.1.10 iptvc serve --cache-enabled --cache-host 192.168.1.10
@@ -289,9 +293,9 @@ iptvc serve --cache-enabled --cache-host 192.168.1.10
### `--cache-port` { id="cache-port" } ### `--cache-port` { id="cache-port" }
Порт KeyDB/Redis. Порт сервиса кеша.
Переопределяет `cache.port` (по умолчанию `6379`). Переопределяет <!-- md:config cache.port --> (по умолчанию `6379`).
```bash ```bash
iptvc serve --cache-enabled --cache-port 6380 iptvc serve --cache-enabled --cache-port 6380
@@ -299,9 +303,9 @@ iptvc serve --cache-enabled --cache-port 6380
### `--cache-username` { id="cache-username" } ### `--cache-username` { id="cache-username" }
Логин для подключения к KeyDB/Redis. Логин для подключения к сервису кеша.
Переопределяет `cache.username`. Переопределяет <!-- md:config cache.username -->.
```bash ```bash
iptvc serve --cache-enabled --cache-username myuser iptvc serve --cache-enabled --cache-username myuser
@@ -309,9 +313,9 @@ iptvc serve --cache-enabled --cache-username myuser
### `--cache-password` { id="cache-password" } ### `--cache-password` { id="cache-password" }
Пароль для подключения к KeyDB/Redis. Пароль для подключения к сервису кеша.
Переопределяет `cache.password`. Переопределяет <!-- md:config cache.password -->.
```bash ```bash
iptvc serve --cache-enabled --cache-password secret iptvc serve --cache-enabled --cache-password secret
@@ -319,9 +323,9 @@ iptvc serve --cache-enabled --cache-password secret
### `--cache-db` { id="cache-db" } ### `--cache-db` { id="cache-db" }
Номер базы данных KeyDB/Redis. Номер базы данных кеша.
Переопределяет `cache.db` (по умолчанию `0`). Переопределяет <!-- md:config cache.db --> (по умолчанию `0`).
```bash ```bash
iptvc serve --cache-enabled --cache-db 2 iptvc serve --cache-enabled --cache-db 2
@@ -331,7 +335,7 @@ iptvc serve --cache-enabled --cache-db 2
TTL записей кеша в секундах. TTL записей кеша в секундах.
Переопределяет `cache.ttl` (по умолчанию `30`). Переопределяет <!-- md:config cache.ttl --> (по умолчанию `3600`).
```bash ```bash
iptvc serve --cache-enabled --cache-ttl 3600 iptvc serve --cache-enabled --cache-ttl 3600
@@ -365,19 +369,20 @@ iptvc serve --check --debug \
## Веб-маршруты ## Веб-маршруты
| Метод | Путь | Описание | | Метод | Путь | Описание |
| --- | --- | --- | | ----- | -------------------------------- | ---------------------------------------- |
| GET | `/` | Главная страница со списком плейлистов | | GET | `/` | Главная страница со списком плейлистов |
| GET | `/page/{N}` | Страница N списка плейлистов | | GET | `/page/{N}` | Страница N списка плейлистов |
| GET | `/{code}` | Редирект на прямую ссылку плейлиста | | GET | `/{code}` | Редирект на прямую ссылку плейлиста |
| GET | `/{code}.m3u[8]` | Редирект на прямую ссылку плейлиста | | GET | `/{code}.m3u` | Редирект на прямую ссылку плейлиста |
| GET | `/{code}/details` | Страница с описанием плейлиста | | GET | `/{code}.m3u8` | Редирект на прямую ссылку плейлиста |
| GET | `/api` | Редирект на `/api/` (Swagger UI) | | GET | `/{code}/details` | Страница с описанием плейлиста |
| GET | `/api/` | Swagger UI с описанием REST API | | GET | `/api` | Редирект на `/api/` (Swagger UI) |
| GET | `/api/openapi.json` | OpenAPI-схема в формате JSON | | GET | `/api/` | Swagger UI с описанием REST API |
| GET | `/api/playlists` | JSON: массив всех плейлистов | | GET | `/api/openapi.json` | OpenAPI-схема в формате JSON |
| GET | `/api/playlists/{code}` | JSON: информация о плейлисте | | GET | `/api/playlists` | JSON: массив всех плейлистов |
| GET | `/api/playlists/{code}/channels` | JSON: список каналов плейлиста | | GET | `/api/playlists/{code}` | JSON: информация о плейлисте |
| GET | `/api/version` | JSON: версии компонентов | | GET | `/api/playlists/{code}/channels` | JSON: список каналов плейлиста |
| GET | `/api/health` | JSON: состояние сервиса | | GET | `/api/version` | JSON: версии компонентов |
| GET | `/api/stats` | JSON: статистика по плейлистам и каналам | | GET | `/api/health` | JSON: состояние сервиса |
| GET | `/api/stats` | JSON: статистика по плейлистам и каналам |
+37 -24
View File
@@ -16,7 +16,7 @@ tags: ["iptvc", "разработка", "архитектура"]
- `github.com/spf13/cobra` — CLI-фреймворк; - `github.com/spf13/cobra` — CLI-фреймворк;
- `gopkg.in/yaml.v3` — парсинг `config.yml`; - `gopkg.in/yaml.v3` — парсинг `config.yml`;
- `github.com/joho/godotenv` — загрузка `.env`; - `github.com/joho/godotenv` — загрузка `.env`;
- `github.com/redis/go-redis/v9` — клиент KeyDB/Redis. - `github.com/redis/go-redis/v9` — клиент кеша.
## Структура проекта ## Структура проекта
@@ -30,11 +30,13 @@ iptvc/
│ ├── check.go # команда check │ ├── check.go # команда check
│ ├── serve.go # команда serve │ ├── serve.go # команда serve
│ ├── flags.go # общие флаги check/serve │ ├── flags.go # общие флаги check/serve
│ ├── flags_test.go # тесты применения CLI-переопределений
│ └── version.go # команда version │ └── version.go # команда version
├── app/ ├── app/
│ ├── app.go # глобальные переменные: Args, Config, Cache │ ├── app.go # глобальные переменные: Args, Config, Cache
│ ├── config/ │ ├── config/
│ │ ── config.go # Config, Init(), validate(), IntRange, UserAgents │ │ ── config.go # Config, Init(), validate(), IntRange, UserAgents
│ │ └── config_test.go # тесты конфигурации
│ ├── checker/ │ ├── checker/
│ │ └── checker.go # CheckPlaylists(), CheckChannels(), OnPlaylistChecked │ │ └── checker.go # CheckPlaylists(), CheckChannels(), OnPlaylistChecked
│ ├── playlist/ │ ├── playlist/
@@ -44,7 +46,7 @@ iptvc/
│ ├── tagfile/ │ ├── tagfile/
│ │ └── tagfile.go # чтение channels.json, назначение тегов │ │ └── tagfile.go # чтение channels.json, назначение тегов
│ ├── cache/ │ ├── cache/
│ │ └── cache.go # подключение к KeyDB/Redis │ │ └── cache.go # подключение к кешу
│ ├── logger/ │ ├── logger/
│ │ └── logger.go # настройка логирования │ │ └── logger.go # настройка логирования
│ ├── utils/ │ ├── utils/
@@ -52,7 +54,16 @@ iptvc/
│ └── web/ │ └── web/
│ ├── server.go # Server, Start(), StartBackgroundChecker() │ ├── server.go # Server, Start(), StartBackgroundChecker()
│ ├── handlers.go # HTTP-обработчики │ ├── handlers.go # HTTP-обработчики
│ ├── views.go # PlaylistView, ChannelView, PageData
│ ├── views_test.go # тесты представлений
│ ├── templates.go # TemplateManager, //go:embed │ ├── templates.go # TemplateManager, //go:embed
│ ├── templates_test.go # тесты шаблонов
│ ├── openapi.go # OpenAPI-спецификация, Swagger UI
│ ├── openapi_test.go # тесты OpenAPI
│ ├── details_test.go # тесты страницы деталей плейлиста
│ ├── testdata/ # тестовые фикстуры
│ ├── swagger/ # встроенные файлы Swagger UI
│ ├── static/ # встроенные статические файлы (CSS, JS)
│ └── views/ # HTML-шаблоны │ └── views/ # HTML-шаблоны
│ ├── base.html │ ├── base.html
│ ├── list.html │ ├── list.html
@@ -65,8 +76,9 @@ iptvc/
### `app` ### `app`
Глобальный контейнер: `Args` (CLI-флаги), `Config` (конфигурация), `Cache` (Redis-клиент). Глобальный контейнер: `Args` (CLI-флаги), `Config` (конфигурация), `Cache` (кеш-клиент).
`Init()` загружает конфигурацию, инициализирует логгер и подключение к кешу. `Init()` загружает конфигурацию и инициализирует логгер.
`InitCache()` подключается к кешу, если кеш включён.
### `app.config` ### `app.config`
@@ -86,10 +98,10 @@ iptvc/
Содержит логику проверки: Содержит логику проверки:
- **`PrepareListsToCheck(files, urls, codes)`** — формирует список плейлистов из файлов, URL и кодов ini-файла. - **`PrepareListsToCheck(files, urls, codes)`** — формирует список плейлистов из файлов, URL и кодов ini-файла.
- **`CheckPlaylists(lists)`** — параллельная проверка плейлистов (семфор `per-routine`), загрузка, парсинг, вызов `CheckChannels` для каждого. - **`CheckPlaylists(lists)`** — параллельная проверка плейлистов (семфор `maxRoutines`), загрузка, парсинг, вызов `CheckChannels` для каждого.
- **`CheckChannels(pls)`** — параллельная проверка каналов (семфор `per-routine`), HTTP-запрос с `Range` header. - **`CheckChannels(pls)`** — параллельная проверка каналов (семфор `maxRoutines`), HTTP-запрос с `Range` header.
- **`OnPlaylistChecked`** — глобальный callback, вызывается после проверки каждого плейлиста. Используется веб-сервером для обновления in-memory кеша. - **`OnPlaylistChecked`** — глобальный callback, вызывается после проверки каждого плейлиста. Используется веб-сервером для обновления in-memory кеша.
- **`cachePlaylist(pls)`** — сохранение результата в Redis (если включён). - **`cachePlaylist(pls)`** — сохранение результата в кеш (если включён).
Параметры проверки берутся из `app.Config.Check.Playlists` и `app.Config.Check.Channels`. Параметры проверки берутся из `app.Config.Check.Playlists` и `app.Config.Check.Channels`.
@@ -108,7 +120,7 @@ iptvc/
- **`Server`** — структура: конфиг, кеш, шаблоны, in-memory кеш (`memCache` с `sync.RWMutex`). - **`Server`** — структура: конфиг, кеш, шаблоны, in-memory кеш (`memCache` с `sync.RWMutex`).
- **`Start()`** — запуск HTTP-сервера. - **`Start()`** — запуск HTTP-сервера.
- **`StartBackgroundChecker(opts)`** — фоновая проверка в отдельной горутине. - **`StartBackgroundChecker(opts)`** — фоновая проверка в отдельной горутине.
- **`CheckOptions`** — параметры: Every, Repeat, Random, Files, Urls, Codes. - **`CheckOptions`** — параметры: Repeat, Random, Files, Urls, Codes.
Маршруты (Go 1.22 patterns): Маршруты (Go 1.22 patterns):
@@ -129,7 +141,7 @@ GET /{path...} — все остальные маршру
Catch-all `/{path...}` используется для избежания конфликтов паттернов в Go 1.22 mux. Catch-all `/{path...}` используется для избежания конфликтов паттернов в Go 1.22 mux.
In-memory кеш (`memCache`) обновляется через `OnPlaylistChecked` callback. In-memory кеш (`memCache`) обновляется через `OnPlaylistChecked` callback.
Это позволяет отображать результаты проверки в реальном времени без ожидания завершения цикла и без Redis. Это позволяет отображать результаты проверки в реальном времени без ожидания завершения цикла и без внешнего кеша.
ini-файл кешируется на 30 секунд, кеш сбрасывается при каждом обновлении `memCache`. ini-файл кешируется на 30 секунд, кеш сбрасывается при каждом обновлении `memCache`.
@@ -143,18 +155,17 @@ StartBackgroundChecker:
runCheckerOnce() runCheckerOnce()
→ checker.PrepareListsToCheck() → checker.PrepareListsToCheck()
→ checker.CheckPlaylists() → checker.CheckPlaylists()
→ for each playlist (parallel, per-routine): → for each playlist (parallel, perRoutine):
→ Download() / ReadFromFs() → Download() / ReadFromFs()
→ Parse() → Parse()
→ CheckChannels() → CheckChannels()
→ for each channel (parallel, per-routine): → for each channel (parallel, perRoutine):
→ HTTP GET with Range header → HTTP GET with Range header
→ check status + content type → check status + content type
→ OnPlaylistChecked(pls) → memCache update → OnPlaylistChecked(pls) → memCache update
→ one-cooldown sleep → oneCooldown sleep
→ all-cooldown sleep → allCooldown sleep
sleep(every) if repeat > 0 && iteration >= repeat: stop
if repeat > 0 && iteration >= repeat: stop
``` ```
## CLI-флаги ## CLI-флаги
@@ -191,14 +202,16 @@ StartBackgroundChecker:
### Глобальные (`cmd/root.go`) ### Глобальные (`cmd/root.go`)
| Флаг | Поле | Описание | | Флаг | Поле | Описание |
| --------------- | ----------------- | ----------------- | | --------------- | ----------------- | ------------------- |
| `--config` | `Args.ConfigPath` | Путь к config.yml | | `--config` | `Args.ConfigPath` | Путь к config.yml |
| `-v, --verbose` | `Args.Verbose` | Подробный лог | | `-v, --verbose` | `Args.Verbose` | Подробный лог |
| `--debug` | `Args.Debug` | Режим отладки |
| `--log-level` | `Args.LogLevel` | Уровень логирования |
## Конфигурация ## Конфигурация
Подробное описание параметров — в разделе [config.yml](../../common/config/config.md). Подробное описание параметров — в разделе [config.yml](../../reference/config.md).
Приоритет: Defaults < `config.yml` < Env < CLI-флаги. Приоритет: Defaults < `config.yml` < Env < CLI-флаги.
@@ -222,7 +235,7 @@ SVG-логотипы каналов передаются через `encodeURICo
Два уровня кеша: Два уровня кеша:
1. **Redis/KeyDB** (опционально) — постоянный кеш результатов проверки. TTL из `cache.ttl`. 1. **Внешний кеш** (опционально) — постоянный кеш результатов проверки. TTL из `cache.ttl`.
2. **In-memory** (`memCache`) — только при `serve --check`. Обновляется в реальном времени через callback. Не требует Redis. 2. **In-memory** (`memCache`) — только при `serve --check`. Обновляется в реальном времени через callback. Не требует внешнего кеша.
In-memory кеш приоритетнее Redis при отображении в веб-интерфейсе. In-memory кеш приоритетнее внешнего кеша при отображении в веб-интерфейсе.
+11 -8
View File
@@ -17,14 +17,17 @@ make linux
## Доступные рецепты Makefile ## Доступные рецепты Makefile
| Команда | Назначение | | Команда | Назначение |
| -------------- | ------------------------------------------------------------- | | ---------------- | ------------------------------------------------------------- |
| `make linux` | Сборка под Linux (amd64 по умолчанию) | | `make linux` | Сборка под Linux (amd64 по умолчанию) |
| `make win` | Сборка под Windows | | `make win` | Сборка под Windows |
| `make darwin` | Сборка под macOS | | `make darwin` | Сборка под macOS |
| `make release` | Сборка под все платформы (linux/windows/darwin × amd64/arm64) | | `make release` | Сборка под все платформы (linux/windows/darwin × amd64/arm64) |
| `make clean` | Удаление скомпилированных бинарников | | `make test` | Запуск всех тестов |
| `make help` | Вывод списка доступных рецептов | | `make clear` | Удаление скомпилированных бинарников |
| `make image` | Сборка Docker-образа для текущей платформы |
| `make image-all` | Сборка и отправка multi-arch манифеста в registry |
| `make help` | Вывод списка доступных рецептов |
## Управление архитектурой ## Управление архитектурой
+18 -8
View File
@@ -8,22 +8,32 @@ tags: ["iptvc", "docker"]
## Сборка ## Сборка
Образ собирается из [Dockerfile](https://git.axenov.dev/IPTV/iptvc/src/branch/master/Dockerfile) — multi-stage сборка на базе `golang:1.25-alpine` с финальным образом `alpine:3.22`. Образ собирается из [Dockerfile](https://git.axenov.dev/IPTV/iptvc/src/branch/master/Dockerfile) на базе `alpine:3.22.5`.
Бинарный файл должен быть предварительно собран через `make linux` — Dockerfile берёт уже готовый бинарь из `bin/linux_${TARGETARCH}/iptvc`.
```bash ```bash
docker build -t iptvc ./iptvc # Сборка бинарного файла и образа
make image
# Сборка с указанием архитектуры
make image GOARCH=arm64
# Сборка с указанием тега
make image IMAGE_TAG=v1.1.3
``` ```
Можно передать версию через build-arg: Целевая архитектура задаётся через `GOARCH`:
```bash ```bash
docker build --build-arg IPTVC_VERSION=1.1.3 -t iptvc:v1.1.3 ./iptvc make linux GOARCH=arm64
make image GOARCH=arm64
``` ```
Целевая платформа и архитектура задаются через `GOOS` и `GOARCH`: Для публикации multi-arch манифеста в registry:
```bash ```bash
docker build --build-arg GOOS=linux --build-arg GOARCH=arm64 -t iptvc:linux-arm64 ./iptvc make image-all
``` ```
## Запуск ## Запуск
@@ -33,13 +43,13 @@ docker build --build-arg GOOS=linux --build-arg GOARCH=arm64 -t iptvc:linux-arm6
docker run --rm \ docker run --rm \
-v ./playlists.ini:/app/playlists.ini \ -v ./playlists.ini:/app/playlists.ini \
-v ./channels.json:/app/channels.json \ -v ./channels.json:/app/channels.json \
iptvc check -i playlists.ini --repeat 0 --playlists-all-cooldown 60 git.axenov.dev/iptv/iptvc:latest check -i playlists.ini --repeat 0 --playlists-all-cooldown 60
# Веб-сервер с фоновой проверкой # Веб-сервер с фоновой проверкой
docker run --rm -p 8800:8800 \ docker run --rm -p 8800:8800 \
-v ./playlists.ini:/app/playlists.ini \ -v ./playlists.ini:/app/playlists.ini \
-v ./channels.json:/app/channels.json \ -v ./channels.json:/app/channels.json \
iptvc serve -i playlists.ini -p 8800 --check git.axenov.dev/iptv/iptvc:latest serve -i playlists.ini -p 8800 --check
``` ```
## Использование в compose ## Использование в compose
+3 -1
View File
@@ -1,4 +1,6 @@
Информацию о лицензии см. на странице [Свободное ПО](../../../legal/license.md) # Иконки codicons
Информацию о лицензии см. на странице [Свободное ПО](../../../extra/legal/license.md)
| Иконка | Код для вставки в текст | Код для вставки в frontmatter | | Иконка | Код для вставки в текст | Код для вставки в frontmatter |
| ------------------------------------------------ | -------------------------------------------------- | ------------------------------------------------ | | ------------------------------------------------ | -------------------------------------------------- | ------------------------------------------------ |
+4 -4
View File
@@ -53,13 +53,13 @@ make release
Для работы `iptvc` нужны два файла рядом с бинарником: Для работы `iptvc` нужны два файла рядом с бинарником:
- `playlists.ini` — список плейлистов. Формат описан в [справочнике форматов](../../common/formats/playlists.md). - `playlists.ini` — список плейлистов. Формат описан в [справочнике форматов](../../reference/formats/playlists.md).
- `channels.json` — правила тегов каналов. Формат описан в [справочнике форматов](../../common/formats/channels.md). - `channels.json` — правила тегов каналов. Формат описан в [справочнике форматов](../../reference/formats/channels.md).
- `config.yml` — конфигурация программы. Описание — в [разделе config.yml](../../common/config/config.md). - `config.yml` — конфигурация программы. Описание — в [разделе config.yml](../../reference/config.md).
## Полное Docker-окружение ## Полное Docker-окружение
Полная инфраструктура проекта (nginx, KeyDB, checker, docs) развёртывается через Docker. Полная инфраструктура проекта (nginx, кеш, checker, docs) развёртывается через Docker.
Подробнее — в разделе [Развёртывание](../site/deploy.md). Подробнее — в разделе [Развёртывание](../site/deploy.md).
+1 -1
View File
@@ -25,7 +25,7 @@ tags: ["iptvc"]
## Запуск релизного образа ## Запуск релизного образа
Релизные docker-образы строятся для платформы `linux` и архитектуры `amd64`. Релизные docker-образы строятся для платформы `linux` и архитектур `amd64` и `arm64`.
Найти их можно здесь: <https://git.axenov.dev/IPTV/-/packages/container/iptvc> Найти их можно здесь: <https://git.axenov.dev/IPTV/-/packages/container/iptvc>
+1 -1
View File
@@ -49,7 +49,7 @@ hide: [toc]
[start]: quickstart.md "Перейти к разделу" [start]: quickstart.md "Перейти к разделу"
[site]: site/first-steps.md "Перейти к разделу" [site]: site/first-steps.md "Перейти к разделу"
[cli]: commands/index.md "Перейти к разделу" [cli]: commands/index.md "Перейти к разделу"
[cfg]: ../common/config/config.md "Перейти к разделу" [cfg]: ../reference/config.md "Перейти к разделу"
<!-- <!--
## :material-cog-sync-outline: Как работает `iptvc` ## :material-cog-sync-outline: Как работает `iptvc`
+2 -2
View File
@@ -25,7 +25,7 @@ tags: ["iptvc"]
./iptvc check --file /home/user/pls.m3u ./iptvc check --file /home/user/pls.m3u
``` ```
## Проверить плейлист по короткому коду из [`playlists.ini`](../common/formats/playlists.md) ## Проверить плейлист по короткому коду из [`playlists.ini`](../reference/formats/playlists.md)
``` ```
./iptvc check -c X ./iptvc check -c X
@@ -44,7 +44,7 @@ tags: ["iptvc"]
## Присвоить каналам тематические теги ## Присвоить каналам тематические теги
Для этого рядом с `iptvc` должен лежать файл [channels.json](../common/formats/channels.md). Для этого рядом с `iptvc` должен лежать файл [channels.json](../reference/formats/channels.md).
Если файл лежит в другой директории, то можно указать её явно: Если файл лежит в другой директории, то можно указать её явно:
@@ -5,10 +5,7 @@ tags: ["статусы", "плейлисты", "каналы", "iptvc"]
# :material-file-refresh-outline: Проверки и статусы # :material-file-refresh-outline: Проверки и статусы
!!! danger "Я не гарантирую корректность и актуальность плейлистов, которые ты увидишь на сайте, как и корректность результатов их проверки." Плейлисты проверяются автоматически с некоей периодичностью, если приложение запущено [соответствующим образом](deploy.md).
После прочтения этой страницы ты поймёшь почему.
Плейлисты [проверяются автоматически](../iptvc/overview.md) с некоей периодичностью.
Хотя я и стараюсь улучшать качество проверок, но всё же рекомендую проверять желаемые плейлисты самостоятельно вручную, ибо нет никаких гарантий: Хотя я и стараюсь улучшать качество проверок, но всё же рекомендую проверять желаемые плейлисты самостоятельно вручную, ибо нет никаких гарантий:
@@ -17,7 +14,7 @@ tags: ["статусы", "плейлисты", "каналы", "iptvc"]
* он может работать, но проверка заврешена из-за какой-то технической ошибки; * он может работать, но проверка заврешена из-за какой-то технической ошибки;
* он уже может не работать, но результаты последней проверки показывают обратное; * он уже может не работать, но результаты последней проверки показывают обратное;
* что транслируемый контент соответствует заявленным названиям; * что транслируемый контент соответствует заявленным названиям;
* что сейчас или через X времени там не окажется [заглушка](faq.md#заглушка). * что сейчас или через X времени там не окажется [заглушка](../../aggregator/faq.md#заглушка).
## Статусы плейлистов { id="playlists" } ## Статусы плейлистов { id="playlists" }
@@ -44,34 +41,34 @@ tags: ["статусы", "плейлисты", "каналы", "iptvc"]
* <span class="badge online-percent">95%</span> — количество рабочих каналов на момент проверки; * <span class="badge online-percent">95%</span> — количество рабочих каналов на момент проверки;
* <span class="badge adult">18+</span> — плейлист имеет каналы для взрослых; * <span class="badge adult">18+</span> — плейлист имеет каналы для взрослых;
* <span class="badge lapka"><ion-icon name="paw"></ion-icon></span> — плейлист может быть нестабилен * <span class="badge lapka">:material-paw:</span> — плейлист может быть нестабилен:
Это значит, что в нём есть каналы со специальными параметрами: токенами, логинами и паролями, которые рано или поздно истекут или будут заблокированы (если ещё не). Это значит, что в нём есть каналы со специальными параметрами: токенами, логинами и паролями, которые рано или поздно истекут или будут заблокированы (если ещё не).
Также это признак бесплатного пробного периода. Также это признак бесплатного пробного периода.
* <ion-icon name="folder-open-outline"></ion-icon> — каналы плейлиста разбиты на группы (например, музыкальные каналы и региональные); * :material-folder-open-outline: — каналы плейлиста разбиты на группы (например, музыкальные каналы и региональные);
* <ion-icon name="newspaper-outline"></ion-icon> — плейлист предоставляет программу передач для каналов; * :material-newspaper-variant-outline: — плейлист предоставляет программу передач для каналов;
* <ion-icon name="play-back"></ion-icon> — плейлист предоставляет возможность перемотки передач. * :material-skip-backward: — плейлист предоставляет возможность перемотки передач.
Если плейлист <span class="badge unknown">unknown</span> или <span class="badge offline">offline</span>, этих иконок не будет. Если плейлист <span class="badge unknown">unknown</span> или <span class="badge offline">offline</span>, этих иконок не будет.
!!! info "Обрати внимание" !!! info "Обрати внимание"
1. Пропорции рабочих и нерабочих каналов в плейлистах могут меняться от проверки к проверке. 1. Пропорции рабочих и нерабочих каналов в плейлистах могут меняться от проверки к проверке.
Это нормально, таковы технические особенности проверки. Это нормально, таковы технические особенности проверки.
2. Работа архива и программы передач зависит от выбранного [плеера](../common/players.md). 2. Работа архива и программы передач зависит от выбранного [плеера](../../reference/players.md).
Некоторые это просто не поддерживают. Некоторые это просто не поддерживают.
## Статусы каналов { id="channels" } ## Статусы каналов { id="channels" }
Каждый канал в любом плейлисте может быть в одном из трёх статусов: Каждый канал в любом плейлисте может быть в одном из трёх статусов:
* <span class="icon online"><ion-icon name="radio-button-on-outline"></ion-icon></span> — ***Возможно*, канал работает** * <span class="icon online">:material-radiobox-marked:</span> — ***Возможно*, канал работает**
Но там может транслироваться какая-нибудь [заглушка](faq.md#заглушка) (например, от [Wink](faq.md#wink)) или другой канал. Но там может транслироваться какая-нибудь [заглушка](../../aggregator/faq.md#заглушка) (например, от [Wink](../../aggregator/faq.md#wink)) или другой канал.
* <span class="icon offline"><ion-icon name="radio-button-on-outline"></ion-icon></span> — ***Возможно*, канал не работает** * <span class="icon offline">:material-radiobox-marked:</span> — ***Возможно*, канал не работает**
Чем больше таких каналов в плейлисте, тем сложнее будет листать плейлист в плеере или на ТВ. Чем больше таких каналов в плейлисте, тем сложнее будет листать плейлист в плеере или на ТВ.
Но *возможно когда-нибудь* плейлист обновят и канал будет работать исправно. Но *возможно когда-нибудь* плейлист обновят и канал будет работать исправно.
Также здесь может быть просто разовый сбой (например, таймаут проверки). Также здесь может быть просто разовый сбой (например, таймаут проверки).
* <span class="badge lapka"><ion-icon name="paw"></ion-icon></span> — **Канал может быть нестабилен** * <span class="badge lapka">:material-paw:</span> — **Канал может быть нестабилен**
Это значит, что для него указаны специальные параметры: токен, логин или пароль, которые рано или поздно истекут или будут заблокированы. Это значит, что для него указаны специальные параметры: токен, логин или пароль, которые рано или поздно истекут или будут заблокированы.
Тогда канал перестанет работать. Тогда канал перестанет работать.
Также это признак бесплатного пробного периода. Также это признак бесплатного пробного периода.
@@ -85,7 +82,7 @@ tags: ["статусы", "плейлисты", "каналы", "iptvc"]
Если при проверке плейлиста обнаружен хотя бы один канал для взрослых, то этот канал и весь плейлист помечается значком <span class="badge adult">18+</span>. Если при проверке плейлиста обнаружен хотя бы один канал для взрослых, то этот канал и весь плейлист помечается значком <span class="badge adult">18+</span>.
Такие каналы определяются благодаря правилам, описанным в файле [channels.json](../common/formats/channels.md). Такие каналы определяются благодаря правилам, описанным в файле [channels.json](../../reference/formats/channels.md).
Они применяются к названиям каналов и их атрибутам (`tvg-id`, `tvg-name`), которые описывают канал в плейлисте. Они применяются к названиям каналов и их атрибутам (`tvg-id`, `tvg-name`), которые описывают канал в плейлисте.
Для каналов со взрослым контентом применяется тег `adult`. Для каналов со взрослым контентом применяется тег `adult`.
@@ -93,7 +90,7 @@ tags: ["статусы", "плейлисты", "каналы", "iptvc"]
!!! warning "Обрати внимание" !!! warning "Обрати внимание"
Далеко не все каналы могут быть помечены таким тегом. Далеко не все каналы могут быть помечены таким тегом.
Хотя набор правил для тегов очень богат, но невозможно угадать все каналы с приемлемой точностью. Хотя набор правил для тегов очень богат, но невозможно угадать все каналы с приемлемой точностью.
Почему — читай [здесь](../common/formats/channels.md#warnings). Почему — читай [здесь](../../reference/formats/channels.md#warnings).
--- ---
+2 -2
View File
@@ -5,10 +5,10 @@ tags: ["плееры", "плейлисты"]
# :material-television-play: Как подключить плейлист # :material-television-play: Как подключить плейлист
1. Найти какой-нибудь [плеер](../../common/players.md) 1. Найти какой-нибудь [плеер](../../reference/players.md)
2. Узнать как в него добавить плейлист по ссылке 2. Узнать как в него добавить плейлист по ссылке
3. Найти желаемый плелист из [списка](./list.md) 3. Найти желаемый плелист из [списка](./list.md)
4. Найти на странице ["Ссылку для ТВ"](details.md#shortlink) и ввести (скопировать) её в поле ввода адреса в плеере 4. Найти на странице ["Ссылку для ТВ"](details.md#shortlink) и ввести (скопировать) её в поле ввода адреса в плеере
Для некоторых [плееров](../../common/players.md) уже есть информация как добавить плейлист. Для некоторых [плееров](../../reference/players.md) уже есть информация как добавить плейлист.
+381 -84
View File
@@ -1,99 +1,164 @@
--- ---
icon: material/upload-network icon: material/upload-network
tags: ["iptvc", "docker", "deploy"] tags: ["iptvc", "docker", "deploy", "nginx", "apache", "caddy", "ssl"]
--- ---
# :material-upload-network: Развёртывание и доставка обновлений # :material-upload-network: Развёртывание сайта
В этом разделе описан фактический порядок настройки окружения `iptv` с приложением `iptvc`, хранилищем KeyDB и сайтом документации. В этом разделе описан фактический порядок настройки `iptvc`, кеша и документации.
## Требования { id="requirements" } ## :material-flag-checkered: Базовый вариант развёртывания сервиса { id="local" }
- [Docker](https://docs.docker.com/engine/install/) с плагином `docker compose` версии 2 Для запуска приложения не нужен репозиторий с исходниками.
- Git и доступ к репозиторию `git.axenov.dev/IPTV` Достаточно [скачать актуальный релиз](../install.md) для своей платформы.
- Права на запись в каталог данных KeyDB
- Доступ к registry `git.axenov.dev`, если вы публикуете образ `iptvc`
!!! warning "Только docker compose v2" Чтобы запустить его, достаточно расположить его в любой удобной директории на диске и выполнить команду:
Используйте команду `docker compose`.
Устаревшая команда `docker-compose` в этом сценарии не поддерживается.
## Подготовка репозитория { id="repository" } ```shell
./iptvc serve
Клонируйте основной репозиторий и перейдите в его каталог:
```bash
git clone https://git.axenov.dev/IPTV.git
cd IPTV
``` ```
В корне проекта должны находиться `compose.yml`, `.env`, `config.yml`, `playlists.ini`, `channels.json` и каталог `docker/keydb`. Откройте в браузере адрес <http://localhost:8800/> и убедитесь в работе сервиса.
Исходный код приложения располагается в `iptvc/`, а документации — в `docs/`. Вы должны увидеть ошибку:
## Настройка файлов { id="configuration" } ```
Не удалось загрузить список плейлистов. Проверьте наличие файла playlists.ini.
Создайте файлы локальной конфигурации на основе примеров:
```bash
cp .env.example .env
cp iptvc/config.yml.example config.yml
``` ```
Отредактируйте `config.yml`. Всё верно.
Для полноценной работы приложения в качестве веб-сервиса следует провести минимальные настройки.
В контейнере `iptvc` он подключается как `/app/config.yml`. ### Список плейлистов — `playlists.ini` { id="playlists" }
Минимально проверьте следующие параметры: !!! info "Синтаксис описан в [этом разделе документации](../../reference/formats/playlists.md)"
- `app.playlists` — путь к файлу плейлистов; Без этого файла нет смысла запускать веб-сервис.
- `app.tags` — путь к файлу тегов каналов;
- `server.host` и `server.port` — адрес и порт веб-интерфейса;
- `cache.enabled` и параметры `cache` — использование KeyDB;
- `site.base-url` — внешний адрес приложения.
Скопируйте входные данные плейлистов в корень окружения: Файл можно положить рядом с `iptvc`.
```bash Как только вы подготовите файл, перезапустите сервис командой выше.
cp /path/to/playlists.ini ./playlists.ini Вы должны увидеть список плейлистов на главной странице.
cp /path/to/channels.json ./channels.json
Но все они будут серого цвета и будет доступна только базовая информация о них.
Зато будут работать короткие ссылки и их уже можно будет казывать в своём любимом [плеере](../../reference/players.md).
Чтобы плейлисты позеленели, нужно запустить приложение в режиме активной проверки плейлистов:
```shell
./iptvc serve --check
``` ```
Эти файлы монтируются в контейнер как `/app/playlists.ini` и `/app/channels.json`. !!! tip "У этой команды есть и другие аргументы"
Полный список указан здесь: [**Команда `serve`**](../commands/serve.md).
Они позволят, при необходимости, очень гибко настроить параметры сайта и режима проверки.
В `.env` задаются параметры приложения из `iptvc/.env.example`, включая `SITE_BASE_URL`, `SERVER_PORT`, `CACHE_ENABLED`, `CACHE_HOST`, `CACHE_PORT`, `CACHE_DB` и `CACHE_TTL`. ### Список правил — `channels.json` { id="channels" }
Для подключения к KeyDB из контейнера укажите имя сервиса `keydb` в `CACHE_HOST`, а не `localhost`. !!! info "Синтаксис описан в [этом разделе документации](../../reference/formats/channels.md)"
## Состав окружения { id="services" } Без этого файла можно жить: веб-сервис будет работать, плейлисты и каналы будут проверяться, короткие ссылки в вашем распоряжении.
Файл `compose.yml` запускает три сервиса: Но **все** каналы будут помечены как `#untagged`.
Это значит, что такие каналы можно будет искать только по названиям.
Поиск по жанрам и странам будет недоступен.
| Сервис | Образ | Назначение | Это может быть важно для разных пользователей.
| ------- | -------------------------------------- | ------------------------------------------- |
| `iptvc` | `git.axenov.dev/iptv/iptvc:latest` | Веб-интерфейс и фоновая проверка плейлистов |
| `keydb` | `eqalpha/keydb:latest` | Кеш результатов проверки |
| `docs` | `git.axenov.dev/iptv/iptv-docs:latest` | Сайт документации |
Сервис `iptvc` публикует порт `8800`, а `docs` — порт `8801`. Поэтому варианта здесь три:
KeyDB публикует порт, заданный `KEYDB_PORT`, по умолчанию `6379`. 1. продолжать пользоваться сервисом как есть;
2. подготовить свой файл `channels.json` согласно его правил синтаксиса;
3. скачать готовый файл из репозитория: [channels.json](https://git.axenov.dev/IPTV/iptvc/raw/branch/master/channels.json)
Сервис `iptvc` зависит от `keydb` и запускается с командой `serve --check --repeat 0`. ??? tip "Рекомендуется третий вариант"
Файл в репозитории периодически обновляется по тем плейлистам, которые широко распространяются в сети.
В нём собраны правла для многих телеканалов СНГ и Европы.
Хотя и далеко не все.
Поэтому, если вы умеете работать с регулярными выражениями, вы можете предложить свои правила в репозиторий.
Это поднимает веб-сервер и запускает бесконечную фоновую проверку. Файл можно положить туда же — рядом с `iptvc`.
## Запуск { id="start" } Когда файл будет готов, перезапустите приложение предыдущей командой.
После подготовки файлов соберите и запустите окружение из корня проекта: Поздравляю, теперь у вас свой собственный рабочий агрегатор плейлистов.
Вы можете его использовать в домашней сети или на своём ПК — для мониторинга состояния плейлистов или для просмотра.
```bash ### Конфигурация приложения — `config.yml`
!!! info "Синтаксис описан в [этом разделе документации](../../reference/config.md)"
Теперь можете приступить к конфигурации приложения.
Это позволит вам освободить руки и мозг, чтобы не запоминать и не писать длинные аргументы, а также изменять параметры, недоступные через в командной строке.
Файл можно положить туда же — рядом с `iptvc`.
Но постойте.
Вы уже несколько раз перезапустили приложение, а результаты проверки плейлистов сбрасываются.
А если вы перезагрузите компьютер, то придётся заново вручную запускать приложение.
Давайте это исправим в следующих шагах.
## :simple-docker: Развёртывание через Docker { id="docker" }
Установка docker осуществляется через [brew](https://formulae.brew.sh/formula/docker) или согласно [официальной документации](https://docs.docker.com/engine/).
??? tip "Для MacOS вместо Docker Desktop рекомендую [OrbStack](https://orbstack.dev)"
Он быстрый, лёгкий, бесплатный и не жрёт столько ресурсов, как официальное приложение.
В общем-то, сама по себе гуйня для докера бесполезна и не нужна, но на маке эта тулза поможет с запуском докера на сокете в пространстве текущего пользователя.
К сожалению, иначе на маке докер работать в фоне не может из-за политик безопасности.
Либо может, но это потребует кучу гемора на ровном месте.
Для работы `iptvc` нужно будет скачать ещё один файл из репозитория: [compose.yml](https://git.axenov.dev/IPTV/iptvc/raw/branch/master/compose.yml).
Это конфигурация связки контейнеров, и `iptvc` будет запускаться в одном из них.
Скачивайте и кладите в ту же директорию, где остальные файлы.
Для теста запустите команду:
```shell
docker compose up -d --build docker compose up -d --build
``` ```
Она скачает образы, создаст контейнеры и запустит их.
В результате вы сможете открыть в браузере <http://localhost:8800/> и увидеть то же самое, что в прошлый раз.
Теперь подключим кэш.
### Кэширование результатов { id="cache" }
Для этого в compose используется [Valkey](https://valkey.io).
Это открытый форк Redis, продолжающий развитие за счёт сообщества и полностью поддерживающий его протокол.
Чтобы запустить связку `iptvc` + `valkey`, нужно выполнить два простых шага:
- создать директорию cache рядом с `iptvc`
- внести несколько правок в файл `config.yml` приложения как показано ниже:
```yaml title="config.yml" linenums="1" hl_lines="3 4"
cache:
enabled: true #(1)!
host: cache #(2)!
port: 6379
username:
password:
db: 0
ttl: 30
```
1. О параметре: [`cache.enabled`](../../reference/config.md#cache-enabled)
2. О параметре: [`cache.host`](../../reference/config.md#cache-host)
Остановите связку контейнеров и запустите вновь, чтобы применить обновлённую конфигурацию:
```shell
docker compose down; docker compose up -d --build
```
Проверьте состояние контейнеров и журналы: Проверьте состояние контейнеров и журналы:
```bash ```shell
docker compose ps docker compose ps
docker compose logs -f iptvc docker compose logs -f iptvc
``` ```
@@ -104,70 +169,302 @@ docker compose logs -f iptvc
Для остановки окружения выполните: Для остановки окружения выполните:
```bash ```shell
docker compose down docker compose down
``` ```
## Реверс-прокси и SSL { id="reverse-proxy" }
Для публикации приложения на домене с HTTPS настроим реверс-прокси, который будет терминировать SSL и проксировать запросы на контейнеры `iptvc` (порт `8800`) и `docs` (порт `8801`).
!!! tip "site.baseUrl"
После настройки домена укажите внешний адрес в `config.yml` или `.env`:
```yaml
site:
baseUrl: https://example.com
```
Или через переменную окружения:
```shell
SITE_BASE_URL=https://example.com
```
О параметре: [`site.baseUrl`](../../reference/config.md#site-base-url)
Ниже рассмотрены три варианта: nginx, Apache2 и Caddy.
### Подготовка { id="reverse-proxy-prep" }
Убедитесь, что:
- домен `example.com` (и при необходимости `docs.example.com`) направляет A-запись на IP сервера;
- порты `80` и `443` открыты в файрволе;
- Docker-окружение запущено (`docker compose up -d`);
- порты `8800` и `8801` доступны локально (проверьте `curl -I http://localhost:8800`).
#### nginx { id="reverse-proxy-nginx" }
Установите nginx и Certbot:
```shell
sudo apt update
sudo apt install -y nginx certbot python3-certbot-nginx
```
Создайте конфигурацию для приложения:
```nginx title="/etc/nginx/sites-available/iptvc" linenums="1"
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:8800;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
```
При необходимости добавьте отдельный `server`-блок для документации:
```nginx title="/etc/nginx/sites-available/iptv-docs" linenums="1"
server {
listen 80;
server_name docs.example.com;
location / {
proxy_pass http://127.0.0.1:8801;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
```
Включите конфигурации и проверьте синтаксис:
```shell
sudo ln -s /etc/nginx/sites-available/iptvc /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/iptv-docs /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
```
Получите SSL-сертификат через Certbot:
```shell
sudo certbot --nginx -d example.com -d docs.example.com
```
Certbot автоматически изменит конфигурацию nginx, добавит HTTPS и настройке редирект с HTTP на HTTPS.
Проверьте автоматическое продление:
```shell
sudo certbot renew --dry-run
```
#### Apache2 { id="reverse-proxy-apache" }
Установите Apache2 и Certbot:
```shell
sudo apt update
sudo apt install -y apache2 certbot python3-certbot-apache
```
Включите необходимые модули:
```shell
sudo a2enmod proxy proxy_http ssl rewrite headers
sudo systemctl restart apache2
```
Создайте конфигурацию виртуального хоста для приложения:
```apache title="/etc/apache2/sites-available/iptvc.conf" linenums="1"
<VirtualHost *:80>
ServerName example.com
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8800/
ProxyPassReverse / http://127.0.0.1:8800/
RequestHeader set X-Forwarded-Proto "http"
RequestHeader set X-Forwarded-Port "80"
</VirtualHost>
```
При необходимости добавьте виртуальный хост для документации:
```apache title="/etc/apache2/sites-available/iptv-docs.conf" linenums="1"
<VirtualHost *:80>
ServerName docs.example.com
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8801/
ProxyPassReverse / http://127.0.0.1:8801/
RequestHeader set X-Forwarded-Proto "http"
RequestHeader set X-Forwarded-Port "80"
</VirtualHost>
```
Включите конфигурации и проверьте синтаксис:
```shell
sudo a2ensite iptvc iptv-docs
sudo apache2ctl configtest
sudo systemctl reload apache2
```
Получите SSL-сертификат через Certbot:
```shell
sudo certbot --apache -d example.com -d docs.example.com
```
Certbot автоматически создаст HTTPS-виртуальные хосты и настроит редирект с HTTP на HTTPS.
Проверьте автоматическое продление:
```shell
sudo certbot renew --dry-run
```
#### Caddy { id="reverse-proxy-caddy" }
[Caddy](https://caddyserver.com) — современный веб-сервер с автоматическим управлением HTTPS-сертификатами через Let's Encrypt и ZeroSSL.
В отличие от nginx и Apache2, Caddy не требует Certbot: сертификаты запрашиваются и продлеваются автоматически при старте.
??? tip "Почему Caddy?"
Caddy единственный из рассмотренных серверов получает и продлевает TLS-сертификаты без внешних инструментов.
Достаточно указать доменное имя — и Caddy сам запросит сертификат, настроит редирект с HTTP на HTTPS и будет продлевать его до истечения.
Это сильно упрощает эксплуатацию: меньше движущихся частей, меньше шагов настройки, меньше поводов для ошибок.
Установите Caddy согласно [официальной документации](https://caddyserver.com/docs/install):
```shell
sudo apt update
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install -y caddy
```
Создайте или отредактируйте конфигурационный файл `Caddyfile`:
```caddyfile title="/etc/caddy/Caddyfile" linenums="1"
example.com {
reverse_proxy 127.0.0.1:8800
}
docs.example.com {
reverse_proxy 127.0.0.1:8801
}
```
Проверьте конфигурацию и перезапустите Caddy:
```shell
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
```
При первом запуске Caddy автоматически запросит SSL-сертификаты для указанных доменов, настроит редирект с HTTP на HTTPS и будет продлевать сертификаты до истечения срока действия.
Проверьте статус сервиса:
```shell
sudo systemctl status caddy
```
Если потребуется просмотреть журналы:
```shell
sudo journalctl -u caddy -f
```
#### Проверка { id="reverse-proxy-check" }
После настройки откройте в браузере:
- `https://example.com` — веб-интерфейс `iptvc`;
- `https://docs.example.com` — сайт документации.
Убедитесь, что сертификат валиден, а редирект с HTTP на HTTPS работает.
!!! note "Ограничение портов"
После настройки реверс-прокси можно убрать публикацию портов `8800` и `8801` наружу в `compose.yml`, оставив их доступными только локально.
Это предотвратит прямой доступ к сервисам в обход прокси.
## Сборка образа iptvc { id="image" } ## Сборка образа iptvc { id="image" }
Для публикации образа используйте скрипт `iptvc/build-docker-image.sh`. Для сборки и публикации образа используйте цели Makefile в каталоге `iptvc/`:
Скрипт вычисляет версию из Git, собирает образы с тегами `iptvc:<тег>` и `git.axenov.dev/iptv/iptvc:<тег>`, а затем отправляет registry-тег в registry: ```shell
```bash
cd iptvc cd iptvc
./build-docker-image.sh latest
# Сборка одноархитектурного образа (linux/amd64 по умолчанию)
make image
# Сборка под arm64
make image GOARCH=arm64
# Сборка с указанием тега
make image IMAGE_TAG=v1.2.3
``` ```
Для публикации релизного тега: Для публикации multi-arch манифеста (linux/amd64 + linux/arm64):
```bash ```shell
./build-docker-image.sh v1.2.3 make image-all
``` ```
По умолчанию скрипт собирает Linux-образ для `amd64`. Цель `image-all` всегда отправляет образ в registry — это ограничение `docker buildx`: multi-arch манифест нельзя загрузить в локальный Docker daemon.
Платформу можно изменить переменными окружения:
```bash
GOOS=linux GOARCH=arm64 ./build-docker-image.sh v1.2.3
```
Перед публикацией войдите в registry, если это требуется вашей настройкой: Перед публикацией войдите в registry, если это требуется вашей настройкой:
```bash ```shell
docker login git.axenov.dev docker login git.axenov.dev
``` ```
!!! warning "Рабочее дерево Git" !!! warning "Рабочее дерево Git"
Скрипт переключается на Git-тег, переданный первым аргументом, или на тег, возвращённый `git describe`. Версия и коммит вшиваются в бинарь из `git describe` и `git rev-parse` на хосте в момент запуска `make`.
Перед запуском сохраните локальные изменения и убедитесь, что нужный тег существует. Перед сборкой убедитесь, что рабочая копия чистая и находится на нужном теге или коммите.
## Обновление { id="update" } ## Обновление { id="update" }
После изменения конфигурации или исходного кода пересоберите и перезапустите сервисы: После изменения конфигурации или исходного кода пересоберите и перезапустите сервисы:
```bash ```shell
docker compose up -d --build docker compose up -d --build
``` ```
Чтобы пересобрать только приложение `iptvc`: Чтобы пересобрать только приложение `iptvc`:
```bash ```shell
docker compose build iptvc docker compose build iptvc
docker compose up -d iptvc docker compose up -d iptvc
``` ```
Чтобы использовать опубликованный образ вместо локальной сборки, загрузите его и пересоздайте сервис: Чтобы использовать опубликованный образ вместо локальной сборки, загрузите его и пересоздайте сервис:
```bash ```shell
docker compose pull iptvc docker compose pull iptvc
docker compose up -d iptvc docker compose up -d iptvc
``` ```
Обновление документации выполняется пересборкой сервиса `docs`: Обновление документации выполняется пересборкой сервиса `docs`:
```bash ```shell
docker compose build docs docker compose build docs
docker compose up -d docs docker compose up -d docs
``` ```
@@ -176,16 +473,16 @@ docker compose up -d docs
Для просмотра журналов отдельных сервисов используйте: Для просмотра журналов отдельных сервисов используйте:
```bash ```shell
docker compose logs -f iptvc docker compose logs -f iptvc
docker compose logs -f keydb docker compose logs -f cache
docker compose logs -f docs docker compose logs -f docs
``` ```
Для проверки конфигурации Compose выполните: Для проверки конфигурации Compose выполните:
```bash ```shell
docker compose config docker compose config
``` ```
Если `iptvc` не подключается к кешу, проверьте, что в `.env` параметр `CACHE_HOST` имеет значение `keydb`, а сервис `keydb` запущен. Если `iptvc` не подключается к кешу, проверьте, что в `.env` параметр `CACHE_HOST` имеет значение `cache`, а сервис `cache` запущен.
+15 -11
View File
@@ -7,7 +7,7 @@ tags: ["сайт", "статусы", "каналы"]
Страница содержит подробности об одном конкретном плейлисте. Страница содержит подробности об одном конкретном плейлисте.
В её заголовке указано [название плейлиста](../../common/formats/playlists.md#name). В её заголовке указано [название плейлиста](../../reference/formats/playlists.md#name).
Ниже страница разделена на две части: слева две вкладки с информацией и список каналов справа. Ниже страница разделена на две части: слева две вкладки с информацией и список каналов справа.
@@ -19,17 +19,17 @@ tags: ["сайт", "статусы", "каналы"]
На этой вкладке выводится таблица со следующими строками: На этой вкладке выводится таблица со следующими строками:
* **Код** — короткий уникальный [код плейлиста](../../common/formats/playlists.md#code); * **Код** — короткий уникальный [код плейлиста](../../reference/formats/playlists.md#code);
* **Описание** — [описание плейлиста](../../common/formats/playlists.md#desc) (при наличии); * **Описание** — [описание плейлиста](../../reference/formats/playlists.md#desc) (при наличии);
* **Ccылка для ТВ** — короткая ссылка, которую можно использовать для [подключения плейлиста](connect.md), подробнее о ней см. ниже; * **Ccылка для ТВ** — короткая ссылка, которую можно использовать для [подключения плейлиста](connect.md), подробнее о ней см. ниже;
* **Источник** — [ссылка на ресурс](../../common/formats/playlists.md#src), где была найдена ссылка на плейлист (при наличии); * **Источник** — [ссылка на ресурс](../../reference/formats/playlists.md#src), где была найдена ссылка на плейлист (при наличии);
* **Наполнение**: * **Наполнение**:
* группы — количество групп, на которые поделены каналы; * группы — количество групп, на которые поделены каналы;
* каналы — количества каналов общее, онлайн и оффлайн; * каналы — количества каналов общее, онлайн и оффлайн;
(всё по нулям, если плейлист <span class="badge offline">offline</span>) (всё по нулям, если плейлист <span class="badge offline">offline</span>)
* **Возможности** — наличие программы передач и перемотки каналов; * **Возможности** — наличие программы передач и перемотки каналов;
* **M3U** — [прямая ссылка](../../common/formats/playlists.md#pls) на плейлист; * **M3U** — [прямая ссылка](../../reference/formats/playlists.md#pls) на плейлист;
* **Проверка плейлиста** — дата и время последней [проверки](../../aggregator/checks.md) плейлиста с помощью [iptvc](../overview.md); * **Проверка плейлиста** — дата и время последней [проверки](checks.md) плейлиста с помощью [iptvc](../overview.md);
* **Ошибка проверки** — текст ошибки, которая возникла при проверке * **Ошибка проверки** — текст ошибки, которая возникла при проверке
(только если плейлист <span class="badge offline">offline</span>) (только если плейлист <span class="badge offline">offline</span>)
@@ -82,7 +82,7 @@ tags: ["сайт", "статусы", "каналы"]
Справа от строки поиска есть **кнопки фильтрации каналов по их статусу**. Справа от строки поиска есть **кнопки фильтрации каналов по их статусу**.
Справа — **кнопка сброса** для отображения всех каналов. Справа — **кнопка сброса** для отображения всех каналов.
Под строкой поиска есть [**облако тегов**](../../common/formats/channels.md#доступные-теги). Под строкой поиска есть [**облако тегов**](../../reference/formats/channels.md#доступные-теги).
!!! question inline end "Про теги" !!! question inline end "Про теги"
Откуда они там появляются, можешь прочесть [здесь](../../common/index.md) и [здесь](../overview.md). Откуда они там появляются, можешь прочесть [здесь](../../common/index.md) и [здесь](../overview.md).
@@ -99,11 +99,15 @@ tags: ["сайт", "статусы", "каналы"]
Она может быть задана в нескольких форматах. Она может быть задана в нескольких форматах.
Поясню базовые принципы формирования адреса: Поясню базовые принципы формирования адреса:
1. необязателен префикс протокола `http://` или `https://` перед доменом 1. префикс протокола `http://` или `https://` перед доменом
2. обязателен домен `m3u.su` 2. ваш домен или IP-адрес, порт после `:`
3. обязателен `/код` плейлиста после домена 3. обязателен `/код` плейлиста после домена
4. необязателен суффикс расширения после кода `.m3u` или `.m3u8` 4. необязателен суффикс расширения после кода `.m3u` или `.m3u8`
Пункты 1 и 2 напрямую зависят от того, как развёрнут сайт.
Базово, если запускать на своём ПК без дополнительных настроек, то адрес будет `http://localhost:8000`.
Доступ по домену требует, помимо самого домена, грамотную настройку реверс-прокси и SSL (в наше время иначе уже не модно).
На примере ниже я наглядно покажу все возможные ссылки на один и тот же плейлист с кодом `ru`: На примере ниже я наглядно покажу все возможные ссылки на один и тот же плейлист с кодом `ru`:
``` ```
@@ -119,12 +123,12 @@ m3u.su/ru
``` ```
!!! info "Адрес может быть любым" !!! info "Адрес может быть любым"
Смотря как будет развёрнут сайт, ты можешь заходить на localhost, либо по прямому IP-адресу или доменному имения. Смотря как будет развёрнут сайт, ты можешь заходить на `localhost`, либо по прямому IP-адресу или доменному имени.
См. раздел [**Развёртывание**](deploy.md) для подробностей. См. раздел [**Развёртывание**](deploy.md) для подробностей.
По идее, можешь использовать любую ссылку из подобных, т. к. технически они отработают одинаково. По идее, можешь использовать любую ссылку из подобных, т. к. технически они отработают одинаково.
А вот твой [плеер](../../common/players.md) может не принять какую-то из них. А вот твой [плеер](../../reference/players.md) может не принять какую-то из них.
Так что, если не подойдёт один формат, используй другой — добавь префикс или суффикс. Так что, если не подойдёт один формат, используй другой — добавь префикс или суффикс.
Префикс плееру требуется чаще всего, потому что он при добавлении плейлиста проверяет — а ссылку ли мне вообще предоставил пользователь? Префикс плееру требуется чаще всего, потому что он при добавлении плейлиста проверяет — а ссылку ли мне вообще предоставил пользователь?
+64 -63
View File
@@ -36,7 +36,7 @@ tags: ["iptvc", "serve", "сайт"]
## Шаг 2. Добавляем плейлисты ## Шаг 2. Добавляем плейлисты
Список плейлистов описывается в файле [`playlists.ini`](../../common/formats/playlists.md). Список плейлистов описывается в файле [`playlists.ini`](../../reference/formats/playlists.md).
Создадим его рядом с `iptvc`: Создадим его рядом с `iptvc`:
```ini title="playlists.ini" ```ini title="playlists.ini"
@@ -66,7 +66,7 @@ pls = 'https://example.com/movies.m3u'
Чтобы статусы появились, нужно включить фоновую проверку. Чтобы статусы появились, нужно включить фоновую проверку.
!!! tip "Путь к ini-файлу" !!! tip "Путь к ini-файлу"
Если файл лежит не рядом с программой, укажите путь через флаг [`-i`](../commands/serve.md#ini) или в [`config.yml`](../../common/config/config.md) → `app.playlists`. Если файл лежит не рядом с программой, укажите путь через флаг [`-i`](../commands/serve.md#ini) или в [`config.yml`](../../reference/config.md) → `app.playlists`.
--- ---
@@ -92,11 +92,11 @@ pls = 'https://example.com/movies.m3u'
./iptvc serve --check --repeat 1 ./iptvc serve --check --repeat 1
``` ```
Если не хочется каждый раз писать `--check`, можно включить проверку через [`config.yml`](../../common/config/config.md): Если не хочется каждый раз писать `--check`, можно включить проверку через [`config.yml`](../../reference/config.md):
```yaml title="config.yml" ```yaml title="config.yml"
check: check:
start-on-serve: true startOnServe: true
``` ```
Тогда обычный `./iptvc serve` автоматически запустит фоновую проверку. Тогда обычный `./iptvc serve` автоматически запустит фоновую проверку.
@@ -106,14 +106,14 @@ check:
## Шаг 4. Настраиваем внешний вид сайта ## Шаг 4. Настраиваем внешний вид сайта
Сайт можно настроить под себя: заголовок, иконку, навигацию в шапке и ссылки в подвале. Сайт можно настроить под себя: заголовок, иконку, навигацию в шапке и ссылки в подвале.
Всё это — в секции [`site`](../../common/config/config.md) файла `config.yml`. Всё это — в секции [`site`](../../reference/config.md) файла `config.yml`.
```yaml title="config.yml" ```yaml title="config.yml"
site: site:
base-url: http://localhost:8800 baseUrl: http://localhost:8800
repo-url: https://git.axenov.dev/IPTV repo-url: https://git.axenov.dev/IPTV
page-size: 20 # пагинация по 20 плейлистов на страницу (0 — без пагинации) pageSize: 20 # пагинация по 20 плейлистов на страницу (0 — без пагинации)
favicon: /favicon.ico # путь к иконке favicon: ./favicon.ico # путь к иконке
header: header:
title: Мой IPTV # заголовок в шапке и вкладке браузера title: Мой IPTV # заголовок в шапке и вкладке браузера
menu: menu:
@@ -141,8 +141,8 @@ site:
--8<-- "icons.md" --8<-- "icons.md"
!!! note "base-url" !!! note "baseUrl"
Параметр `base-url` используется для формирования внутренних ссылок. Параметр `baseUrl` используется для формирования внутренних ссылок.
Если публикуете сайт на домене, укажите его здесь, например `https://my-iptv.ru`. Если публикуете сайт на домене, укажите его здесь, например `https://my-iptv.ru`.
--- ---
@@ -150,7 +150,7 @@ site:
## Шаг 5. Добавляем теги каналам ## Шаг 5. Добавляем теги каналам
Теги помогают посетителям находить каналы по темам: спорт, фильмы, музыка и так далее. Теги помогают посетителям находить каналы по темам: спорт, фильмы, музыка и так далее.
Правила описываются в файле [`channels.json`](../../common/formats/channels.md). Правила описываются в файле [`channels.json`](../../reference/formats/channels.md).
```json title="channels.json" ```json title="channels.json"
[ [
@@ -169,30 +169,30 @@ site:
] ]
``` ```
Путь к файлу указывается в [`config.yml`](../../common/config/config.md) → `app.tags` или через флаг [`-t`](../commands/serve.md#tags): Путь к файлу указывается в [`config.yml`](../../reference/config.md) → `app.tags` или через флаг [`-t`](../commands/serve.md#tags):
```bash ```bash
./iptvc serve --check -t /path/to/channels.json ./iptvc serve --check -t /path/to/channels.json
``` ```
Полный список доступных тегов — в [справочнике по channels.json](../../common/formats/channels.md#доступные-теги). Полный список доступных тегов — в [справочнике по channels.json](../../reference/formats/channels.md#доступные-теги).
--- ---
## Шаг 6. Подключаем кеш (KeyDB/Redis) ## Шаг 6. Подключаем кеш Valkey
По умолчанию результаты проверки хранятся только в оперативной памяти. По умолчанию результаты проверки хранятся только в оперативной памяти.
Если программу перезапустить — все результаты пропадут, и плейлисты снова станут `unknown` до следующей проверки. Если программу перезапустить — все результаты пропадут, и плейлисты снова станут `unknown` до следующей проверки.
Кеш решает эту проблему: результаты сохраняются в KeyDB (или Redis) и переживают перезапуск. Кеш решает эту проблему: результаты сохраняются в кеше и переживают перезапуск.
Включается одной строкой в [`config.yml`](../../common/config/config.md): Включается в [`config.yml`](../../reference/config.md):
```yaml title="config.yml" ```yaml title="config.yml"
cache: cache:
enabled: true enabled: true
host: localhost host: cache
port: 6379 port: 6379
ttl: 1800 # секунды (по умолчанию 30) ttl: 3600 # секунды (по умолчанию 3600)
``` ```
Или через переменные окружения: Или через переменные окружения:
@@ -204,11 +204,12 @@ CACHE_ENABLED=true CACHE_TTL=3600 ./iptvc serve --check
Или через флаги: Или через флаги:
```bash ```bash
./iptvc serve --check --cache-enabled --cache-host 192.168.1.10 --cache-ttl 3600 ./iptvc serve --check --cache-enabled --cache-host 192.168.1.10 --cache-ttl 1800
``` ```
!!! tip "KeyDB или Redis" !!! tip "Valkey, KeyDB или Redis"
KeyDB — это форк Redis, полностью совместимый по протоколу. Valkey — это открытый форк Redis, а KeyDB — ещё один форк.
Все они полностью совместимы по протоколу.
Подойдёт любой из них. Подойдёт любой из них.
Если кеш включён, но сервер недоступен — сайт продолжит работать, просто без кеширования. Если кеш включён, но сервер недоступен — сайт продолжит работать, просто без кеширования.
@@ -217,18 +218,18 @@ CACHE_ENABLED=true CACHE_TTL=3600 ./iptvc serve --check
## Шаг 7. Тонкая настройка проверки ## Шаг 7. Тонкая настройка проверки
Когда плейлистов много, полезно управлять параллелизмом, таймаутами и задержками. Когда плейлистов много, полезно управлять параллелизмом, таймаутами и задержками.
Все параметры — в секции [`check`](../../common/config/config.md) файла `config.yml`. Все параметры — в секции [`check`](../../reference/config.md) файла `config.yml`.
### Параллелизм ### Параллелизм
```yaml title="config.yml" ```yaml title="config.yml"
check: check:
playlists: playlists:
max-routines: 10 # сколько плейлистов проверять одновременно maxRoutines: 10 # сколько плейлистов проверять одновременно
per-routine: 5 # сколько плейлистов в одной процедуре perRoutine: 5 # сколько плейлистов в одной процедуре
channels: channels:
max-routines: 100 # сколько каналов проверять одновременно maxRoutines: 100 # сколько каналов проверять одновременно
per-routine: 20 # сколько каналов в одной процедуре perRoutine: 20 # сколько каналов в одной процедуре
``` ```
Чем больше значения — тем быстрее проверка, но выше нагрузка на процессор и сеть. Чем больше значения — тем быстрее проверка, но выше нагрузка на процессор и сеть.
@@ -242,11 +243,11 @@ check:
timeout: 10 # секунд на загрузку плейлиста timeout: 10 # секунд на загрузку плейлиста
channels: channels:
timeout: 10 # секунд на проверку одного канала timeout: 10 # секунд на проверку одного канала
byte-range: 512 # сколько байт скачать от сервера канала byteRange: 512 # сколько байт скачать от сервера канала
``` ```
Если плейлисты или каналы медленные, увеличьте `timeout`. Если плейлисты или каналы медленные, увеличьте `timeout`.
Если сервер блокирует большие запросы — уменьшите `byte-range`. Если сервер блокирует большие запросы — уменьшите `byteRange`.
### Задержки (cooldown) ### Задержки (cooldown)
@@ -256,8 +257,8 @@ check:
```yaml title="config.yml" ```yaml title="config.yml"
check: check:
playlists: playlists:
all-cooldown: 5 # 5 секунд после всех плейлистов allCooldown: 5 # 5 секунд после всех плейлистов
one-cooldown: [1, 3] # 1–3 секунды после каждого плейлиста oneCooldown: [1, 3] # 1–3 секунды после каждого плейлиста
channels: channels:
cooldown: 0 # 0 секунд после каждого канала cooldown: 0 # 0 секунд после каждого канала
``` ```
@@ -270,14 +271,14 @@ check:
```yaml title="config.yml" ```yaml title="config.yml"
check: check:
playlists: playlists:
user-agent: userAgent:
- Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer - Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
- Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36 - Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36
channels: channels:
user-agent: Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36 userAgent: Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36
``` ```
Все эти параметры можно также задавать через [переменные окружения](../../common/config/config.md) или [CLI-флаги](../commands/serve.md) — они имеют наивысший приоритет. Все эти параметры можно также задавать через [переменные окружения](../../reference/config.md) или [CLI-флаги](../commands/serve.md) — они имеют наивысший приоритет.
--- ---
@@ -289,7 +290,7 @@ check:
app: app:
timezone: GMT+3 timezone: GMT+3
debug: false debug: false
log_level: info logLevel: info
playlists: ./playlists.ini playlists: ./playlists.ini
tags: ./channels.json tags: ./channels.json
@@ -298,10 +299,10 @@ server:
port: 8800 port: 8800
site: site:
base-url: https://my-iptv.ru baseUrl: https://my-iptv.ru
repo-url: https://git.axenov.dev/IPTV repo-url: https://git.axenov.dev/IPTV
page-size: 20 pageSize: 20
favicon: /favicon.ico favicon: ./favicon.ico
header: header:
title: Мой IPTV title: Мой IPTV
menu: menu:
@@ -330,27 +331,27 @@ site:
icon: person-outline icon: person-outline
check: check:
start-on-serve: true startOnServe: true
playlists: playlists:
user-agent: userAgent:
- Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer - Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
- Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36 - Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36
timeout: 10 timeout: 10
all-cooldown: 5 allCooldown: 5
one-cooldown: [1, 3] oneCooldown: [1, 3]
max-routines: 10 maxRoutines: 10
per-routine: 5 perRoutine: 5
channels: channels:
user-agent: Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36 userAgent: Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36
timeout: 10 timeout: 10
byte-range: 512 byteRange: 512
cooldown: 0 cooldown: 0
max-routines: 100 maxRoutines: 100
per-routine: 20 perRoutine: 20
cache: cache:
enabled: true enabled: true
host: localhost host: cache
port: 6379 port: 6379
ttl: 3600 ttl: 3600
``` ```
@@ -361,7 +362,7 @@ cache:
./iptvc serve ./iptvc serve
``` ```
Поскольку `start-on-serve: true`, фоновая проверка запустится автоматически. Поскольку `startOnServe: true`, фоновая проверка запустится автоматически.
Кеш включён, так что результаты переживут перезапуск. Кеш включён, так что результаты переживут перезапуск.
Сайт доступен на `http://0.0.0.0:8800`. Сайт доступен на `http://0.0.0.0:8800`.
@@ -385,11 +386,11 @@ services:
environment: environment:
- CHECK_START_ON_SERVE=true - CHECK_START_ON_SERVE=true
- CACHE_ENABLED=true - CACHE_ENABLED=true
- CACHE_HOST=keydb - CACHE_HOST=cache
- CACHE_PORT=6379 - CACHE_PORT=6379
keydb: cache:
image: eqalpha/keydb:latest image: valkey/valkey:latest
restart: unless-stopped restart: unless-stopped
``` ```
@@ -403,15 +404,15 @@ docker compose up -d
## Краткая шпаргалка ## Краткая шпаргалка
| Задача | Как | | Задача | Как |
| ----------------------------- | ------------------------------------------------------- | | ----------------------------- | ---------------------------------------------------- |
| Запустить сайт | `./iptvc serve` | | Запустить сайт | `./iptvc serve` |
| С проверкой плейлистов | `./iptvc serve --check` | | С проверкой плейлистов | `./iptvc serve --check` |
| На другом порту | `./iptvc serve -p 3000` | | На другом порту | `./iptvc serve -p 3000` |
| С ini-файлом из другого места | `./iptvc serve -i /path/to/playlists.ini` | | С ini-файлом из другого места | `./iptvc serve -i /path/to/playlists.ini` |
| С кешем | `./iptvc serve --check --cache-enabled` | | С кешем | `./iptvc serve --check --cache-enabled` |
| Один цикл проверки | `./iptvc serve --check --repeat 1` | | Один цикл проверки | `./iptvc serve --check --repeat 1` |
| Пауза 2 минуты между циклами | `./iptvc serve --check --playlists-all-cooldown 120` | | Пауза 2 минуты между циклами | `./iptvc serve --check --playlists-all-cooldown 120` |
| Подробные логи | `./iptvc serve --check --verbose` | | Подробные логи | `./iptvc serve --check --verbose` |
Полный список параметров — в [справочнике по `config.yml`](../../common/config/config.md), [переменным окружения](../../common/config/config.md) и [команде `serve`](../commands/serve.md). Полный список параметров — в [справочнике по `config.yml`](../../reference/config.md), [переменным окружения](../../reference/config.md) и [команде `serve`](../commands/serve.md).
+3 -3
View File
@@ -5,10 +5,10 @@ tags: ["плейлисты", "каналы", "теги", "iptvc", "плееры"
# :material-cogs: Как работает сервис # :material-cogs: Как работает сервис
1. В специальном файле [playlists.ini](../../common/formats/playlists.md) описываются плейлисты, которые кем-то опубликованы в интернете. 1. В специальном файле [playlists.ini](../../reference/formats/playlists.md) описываются плейлисты, которые кем-то опубликованы в интернете.
Каждому плейлисту присваивается свой уникальный **короткий код**. Каждому плейлисту присваивается свой уникальный **короткий код**.
2. В специальном файле [channels.json](../../common/formats/channels.md) описываются **ключевые слова** (метки, теги), которые характеризуют каналы. 2. В специальном файле [channels.json](../../reference/formats/channels.md) описываются **ключевые слова** (метки, теги), которые характеризуют каналы.
3. В фоновом режиме [работает ПО](../overview.md), которое периодически [проверяет все плейлисты](../../aggregator/checks.md) из п. 1 и **присваивает теги** каналам из п. 2. 3. В фоновом режиме [работает ПО](../overview.md), которое периодически [проверяет все плейлисты](checks.md) из п. 1 и **присваивает теги** каналам из п. 2.
4. На главной странице сайта выводится [весь список плейлистов](list.md), которые описаны в п. 1: с тегами, описаниями и короткими кодами. 4. На главной странице сайта выводится [весь список плейлистов](list.md), которые описаны в п. 1: с тегами, описаниями и короткими кодами.
5. Каждому плейлисту на сайте посвящена [своя страничка](details.md), где отображаются результаты его проверки, проверки его каналов (с присвоенными тегами) и пр. 5. Каждому плейлисту на сайте посвящена [своя страничка](details.md), где отображаются результаты его проверки, проверки его каналов (с присвоенными тегами) и пр.
6. Когда пользователь [обращается к плейлисту](connect.md) по короткому коду (например, `https://m3u.su/xyz`), то происходит **переадресация** на исходный плейлист. 6. Когда пользователь [обращается к плейлисту](connect.md) по короткому коду (например, `https://m3u.su/xyz`), то происходит **переадресация** на исходный плейлист.
+10 -10
View File
@@ -7,30 +7,30 @@ tags: ["сайт", "плейлисты"]
Это главная страница сайта. Это главная страница сайта.
![Скриншот с примером главной страницы на десктопе](../_assets/img/pls-list/pc.jpg) ![Скриншот с примером главной страницы на десктопе](_assets/pls-list/pc.jpg)
Наверху отображаются: Наверху отображаются:
* дата последнего изменения файла [playlists.ini](../../common/formats/playlists.md) * дата последнего изменения файла [playlists.ini](../../reference/formats/playlists.md)
* общее количество плейлистов и с разделением по статусам. * общее количество плейлистов и с разделением по статусам.
Ниже — спиcок плейлистов. Ниже — спиcок плейлистов.
## Из чего состоит список ## Из чего состоит список
* **Код** — короткий уникальный [код плейлиста](../../common/formats/playlists.md#code) * **Код** — короткий уникальный [код плейлиста](../../reference/formats/playlists.md#code)
* **Информация о плейлисте** * **Информация о плейлисте**
* [статус плейлиста](../../aggregator/checks.md#playlists) * [статус плейлиста](checks.md#playlists)
* может быть [значок 18+](../../aggregator/checks.md#adult) * может быть [значок 18+](checks.md#adult)
* [название плейлиста](../../common/formats/playlists.md#name) — ссылка на [страницу плейлиста](details.md) * [название плейлиста](../../reference/formats/playlists.md#name) — ссылка на [страницу плейлиста](details.md)
под ним: под ним:
* [иконки возможностей плейлиста](../../aggregator/checks.md#extra) (только при статусе <span class="badge online">online</span>) * [иконки возможностей плейлиста](checks.md#extra) (только при статусе <span class="badge online">online</span>)
* [описание плейлиста](../../common/formats/playlists.md#desc) (при наличии) * [описание плейлиста](../../reference/formats/playlists.md#desc) (при наличии)
* [список тегов](../../common/formats/channels.md#доступные-теги), собранный со всех каналов после их проверки (только при статусе <span class="badge online">online</span>) * [список тегов](../../reference/formats/channels.md#доступные-теги), собранный со всех каналов после их проверки (только при статусе <span class="badge online">online</span>)
* ещё одна ссылка на [страницу плейлиста](details.md) * ещё одна ссылка на [страницу плейлиста](details.md)
* **Каналов** — фактическое количество каналов в плейлисте (только при статусе <span class="badge online">online</span>) или 0 (при других статусах) * **Каналов** — фактическое количество каналов в плейлисте (только при статусе <span class="badge online">online</span>) или 0 (при других статусах)
* **Ссылка для ТВ** — [короткая ссылка](details.md#shortlink), которую можно использовать для [подключения плейлиста](connect.md). * **Ссылка для ТВ** — [короткая ссылка](details.md#shortlink), которую можно использовать для [подключения плейлиста](connect.md).
В зависимости от ширины экрана, для экономии места может быть скрыто описание с иконками возможностей и короткая ссылка. В зависимости от ширины экрана, для экономии места может быть скрыто описание с иконками возможностей и короткая ссылка.
![Скриншот с примером главной страницы на смартфоне](../_assets/img/pls-list/mobile.jpg) ![Скриншот с примером главной страницы на смартфоне](_assets/pls-list/mobile.jpg)
@@ -26,7 +26,7 @@ tags: ["iptvc", "конфигурация"]
app: app:
timezone: GMT timezone: GMT
debug: false debug: false
log_level: info logLevel: info
playlists: ./playlists.ini playlists: ./playlists.ini
tags: ./channels.json tags: ./channels.json
@@ -35,16 +35,15 @@ server:
port: 8800 port: 8800
site: site:
base-url: http://localhost:8800 baseUrl: http://localhost:8800
title: IPTV Checker title: IPTV Checker
meta: meta:
description: Самообновляемые бесплатные IPTV-плейлисты для домашнего просмотра description: Самообновляемые бесплатные IPTV-плейлисты для домашнего просмотра
keywords: iptv,плейлисты,m3u keywords: iptv,плейлисты,m3u
repo-url: https://git.axenov.dev/IPTV repo-url: https://git.axenov.dev/IPTV
page-size: 0 pageSize: 0
favicon: favicon:
header: header:
title: IPTV Checker
menu: menu:
- title: Документация - title: Документация
url: /docs url: /docs
@@ -58,45 +57,45 @@ site:
raw: raw:
visible: true visible: true
legal: legal:
visible: true visible: false
text: | text: |
<p>Юридический текст с <a href="/terms">условиями использования</a>.</p> <p>Юридический текст с <a href="/terms">условиями использования</a>.</p>
check: check:
start-on-serve: false startOnServe: false
playlists: playlists:
user-agent: userAgent:
- Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer - Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
timeout: 10 # секунды timeout: 10
all-cooldown: 1800 # секунды allCooldown: 1800
one-cooldown: 2 # секунды oneCooldown: 2
max-routines: 1 maxRoutines: 1
per-routine: 1 perRoutine: 1
channels: channels:
user-agent: Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer userAgent: Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
timeout: 10 # секунды timeout: 10
byte-range: 512 byteRange: 512
cooldown: 0 # секунды cooldown: 0
max-routines: 50 maxRoutines: 50
per-routine: 10 perRoutine: 10
cache: cache:
enabled: false enabled: true
host: localhost host: cache
port: 6379 port: 6379
username: username:
password: password:
db: 0 db: 0
ttl: 30 # секунды ttl: 3600
``` ```
Каждый параметр ниже описан отдельной секцией с указанием значения по умолчанию, переменной окружения и соответствующего CLI-флага. Каждый параметр ниже описан отдельной секцией с указанием значения по умолчанию, переменной окружения и соответствующего CLI-флага.
--- ---
## Секция `app` { id=app } ## Секция `app` { id="app" }
### `app.timezone` { id=app-timezone } ### `app.timezone` { id="app-timezone" }
<!-- md:default GMT --> <!-- md:default GMT -->
<!-- md:env APP_TIMEZONE --> <!-- md:env APP_TIMEZONE -->
@@ -105,7 +104,7 @@ cache:
--- ---
### `app.debug` { id=app-debug } ### `app.debug` { id="app-debug" }
<!-- md:default false --> <!-- md:default false -->
<!-- md:env APP_DEBUG --> <!-- md:env APP_DEBUG -->
@@ -116,7 +115,7 @@ cache:
--- ---
### `app.log_level` { id=app-log-level } ### `app.logLevel` { id="app-log-level" }
<!-- md:default info --> <!-- md:default info -->
<!-- md:env APP_LOG_LEVEL --> <!-- md:env APP_LOG_LEVEL -->
@@ -127,33 +126,33 @@ cache:
--- ---
### `app.playlists` { id=app-playlists } ### `app.playlists` { id="app-playlists" }
<!-- md:default ./playlists.ini --> <!-- md:default ./playlists.ini -->
<!-- md:env APP_PLAYLISTS --> <!-- md:env APP_PLAYLISTS -->
<!-- md:arg --ini --> <!-- md:arg --ini -->
Путь к локальному [ini-файлу](../../common/formats/playlists.md) с описанием плейлистов. Путь к локальному [ini-файлу](formats/playlists.md) с описанием плейлистов.
!!! info "Аргумент работает только для команд `check` и `serve --check`." !!! info "Аргумент работает только для команд `check` и `serve --check`."
--- ---
### `app.tags` { id=app-tags } ### `app.tags` { id="app-tags" }
<!-- md:default ./channels.json --> <!-- md:default ./channels.json -->
<!-- md:env APP_TAGS --> <!-- md:env APP_TAGS -->
<!-- md:arg --tags --> <!-- md:arg --tags -->
Путь к локальному [json-файлу](../../common/formats/channels.md) с описанием тегов каналов. Путь к локальному [json-файлу](formats/channels.md) с описанием тегов каналов.
!!! info "Аргумент работает только для команд `check` и `serve --check`." !!! info "Аргумент работает только для команд `check` и `serve --check`."
--- ---
## Секция `server` { id=server } ## Секция `server` { id="server" }
### `server.host` { id=server-host } ### `server.host` { id="server-host" }
<!-- md:default --> <!-- md:default -->
<!-- md:env SERVER_HOST --> <!-- md:env SERVER_HOST -->
@@ -166,7 +165,7 @@ cache:
--- ---
### `server.port` { id=server-port } ### `server.port` { id="server-port" }
<!-- md:default 8800 --> <!-- md:default 8800 -->
<!-- md:env SERVER_PORT --> <!-- md:env SERVER_PORT -->
@@ -178,11 +177,11 @@ cache:
--- ---
## Секция `site` { id=site } ## Секция `site` { id="site" }
Настройки внешнего вида и ссылок сайта: заголовок, навигация, пагинация, иконка. Настройки внешнего вида и ссылок сайта: заголовок, навигация, пагинация, иконка.
### `site.base-url` { id=site-base-url } ### `site.baseUrl` { id="site-base-url" }
<!-- md:default http://localhost:8800 --> <!-- md:default http://localhost:8800 -->
<!-- md:env SITE_BASE_URL --> <!-- md:env SITE_BASE_URL -->
@@ -192,7 +191,7 @@ cache:
--- ---
### `site.repo-url` { id=site-repo-url } ### `site.repo-url` { id="site-repo-url" }
<!-- md:default https://git.axenov.dev/IPTV --> <!-- md:default https://git.axenov.dev/IPTV -->
<!-- md:env SITE_REPO_URL --> <!-- md:env SITE_REPO_URL -->
@@ -201,7 +200,7 @@ cache:
--- ---
### `site.page-size` { id=site-page-size } ### `site.pageSize` { id="site-page-size" }
<!-- md:default 0 --> <!-- md:default 0 -->
<!-- md:env SITE_PAGE_SIZE --> <!-- md:env SITE_PAGE_SIZE -->
@@ -211,7 +210,7 @@ cache:
--- ---
### `site.favicon` { id=site-favicon } ### `site.favicon` { id="site-favicon" }
<!-- md:default --> <!-- md:default -->
<!-- md:env SITE_FAVICON --> <!-- md:env SITE_FAVICON -->
@@ -220,18 +219,18 @@ cache:
--- ---
### `site.meta` { id=site-meta } ### `site.meta` { id="site-meta" }
Мета-теги `<meta name="description">` и `<meta name="keywords">` для HTML-шаблонов. Мета-теги `<meta name="description">` и `<meta name="keywords">` для HTML-шаблонов.
| Поле | Переменная окружения | Описание | | Поле | Переменная окружения | Описание |
| --- | --- | --- | | ------------- | ----------------------- | ---------------------------- |
| `description` | `SITE_META_DESCRIPTION` | Описание сайта в meta-тегах | | `description` | `SITE_META_DESCRIPTION` | Описание сайта в meta-тегах |
| `keywords` | `SITE_META_KEYWORDS` | Ключевые слова через запятую | | `keywords` | `SITE_META_KEYWORDS` | Ключевые слова через запятую |
--- ---
### `site.title` { id=site-title } ### `site.title` { id="site-title" }
<!-- md:default IPTV Checker --> <!-- md:default IPTV Checker -->
<!-- md:env SITE_TITLE --> <!-- md:env SITE_TITLE -->
@@ -240,28 +239,19 @@ cache:
--- ---
### `site.header.title` { id=site-header-title } ### `site.header.menu` { id="site-header-menu" }
<!-- md:default IPTV Checker -->
Заголовок сайта, отображается в `<title>` и в navbar.
Переопределяется переменной окружения `SITE_TITLE` (см. [`site.title`](#site-title)).
---
### `site.header.menu` { id=site-header-menu }
Массив элементов [`Link`](#link) в шапке сайта. Массив элементов [`Link`](#link) в шапке сайта.
--- ---
### `site.footer.links` { id=site-footer-links } ### `site.footer.links` { id="site-footer-links" }
Массив элементов [`Link`](#link) в подвале сайта. Массив элементов [`Link`](#link) в подвале сайта.
--- ---
### `site.tabs.raw.visible` { id=site-tabs-raw-visible } ### `site.tabs.raw.visible` { id="site-tabs-raw-visible" }
<!-- md:default true --> <!-- md:default true -->
@@ -269,15 +259,15 @@ cache:
--- ---
### `site.tabs.legal.visible` { id=site-tabs-legal-visible } ### `site.tabs.legal.visible` { id="site-tabs-legal-visible" }
<!-- md:default true --> <!-- md:default false -->
Отображать вкладку «Юридическая информация». Отображать вкладку «Юридическая информация».
--- ---
### `site.tabs.legal.text` { id=site-tabs-legal-text } ### `site.tabs.legal.text` { id="site-tabs-legal-text" }
HTML-контент вкладки «Юридическая информация». HTML-контент вкладки «Юридическая информация».
@@ -285,7 +275,7 @@ HTML-контент вкладки «Юридическая информация
--- ---
### Тип `Link` { id=link } ### Тип `Link` { id="link" }
Элемент навигации или подвала. Элемент навигации или подвала.
Если задано `children`, рендерится как выпадающее меню. Если задано `children`, рендерится как выпадающее меню.
@@ -297,7 +287,7 @@ HTML-контент вкладки «Юридическая информация
| `icon` | string | Имя иконки | | `icon` | string | Имя иконки |
| `children` | Link[] | Дочерние ссылки (выпадающее меню, один уровень вложенности) | | `children` | Link[] | Дочерние ссылки (выпадающее меню, один уровень вложенности) |
--8<-- "icons.md" --8<-- "../common/config/icons.md"
```yaml title="Пример" ```yaml title="Пример"
site: site:
@@ -339,13 +329,13 @@ site:
--- ---
## Секция `check` { id=check } ## Секция `check` { id="check" }
Параметры проверки плейлистов и каналов. Поддерживаются скаляры и массивы. Параметры проверки плейлистов и каналов. Поддерживаются скаляры и массивы.
--- ---
### `check.start-on-serve` { id=check-start-on-serve } ### `check.startOnServe` { id="check-start-on-serve" }
<!-- md:default false --> <!-- md:default false -->
<!-- md:env CHECK_START_ON_SERVE --> <!-- md:env CHECK_START_ON_SERVE -->
@@ -356,13 +346,13 @@ site:
--- ---
### `check.playlists` { id=check-playlists } ### `check.playlists` { id="check-playlists" }
Параметры проверки плейлистов (загрузка m3u-файлов по URL или из ФС). Параметры проверки плейлистов (загрузка m3u-файлов по URL или из ФС).
--- ---
#### `check.playlists.user-agent` { id=check-playlists-user-agent } #### `check.playlists.userAgent` { id="check-playlists-user-agent" }
<!-- md:default Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer --> <!-- md:default Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer -->
@@ -387,7 +377,7 @@ User-Agent для HTTP-запросов плейлистов.
--- ---
#### `check.playlists.timeout` { id=check-playlists-timeout } #### `check.playlists.timeout` { id="check-playlists-timeout" }
<!-- md:default 10 --> <!-- md:default 10 -->
<!-- md:env CHECK_PLAYLISTS_TIMEOUT --> <!-- md:env CHECK_PLAYLISTS_TIMEOUT -->
@@ -399,7 +389,7 @@ User-Agent для HTTP-запросов плейлистов.
--- ---
#### `check.playlists.all-cooldown` { id=check-playlists-all-cooldown } #### `check.playlists.allCooldown` { id="check-playlists-all-cooldown" }
<!-- md:default 1800 --> <!-- md:default 1800 -->
<!-- md:env CHECK_PLAYLISTS_ALL_COOLDOWN --> <!-- md:env CHECK_PLAYLISTS_ALL_COOLDOWN -->
@@ -416,7 +406,7 @@ User-Agent для HTTP-запросов плейлистов.
--- ---
#### `check.playlists.one-cooldown` { id=check-playlists-one-cooldown } #### `check.playlists.oneCooldown` { id="check-playlists-one-cooldown" }
<!-- md:default 2 --> <!-- md:default 2 -->
<!-- md:env CHECK_PLAYLISTS_ONE_COOLDOWN --> <!-- md:env CHECK_PLAYLISTS_ONE_COOLDOWN -->
@@ -433,7 +423,7 @@ User-Agent для HTTP-запросов плейлистов.
--- ---
#### `check.playlists.max-routines` { id=check-playlists-max-routines } #### `check.playlists.maxRoutines` { id="check-playlists-max-routines" }
<!-- md:default 1 --> <!-- md:default 1 -->
<!-- md:env CHECK_PLAYLISTS_MAX_ROUTINES --> <!-- md:env CHECK_PLAYLISTS_MAX_ROUTINES -->
@@ -445,7 +435,7 @@ User-Agent для HTTP-запросов плейлистов.
--- ---
#### `check.playlists.per-routine` { id=check-playlists-per-routine } #### `check.playlists.perRoutine` { id="check-playlists-per-routine" }
<!-- md:default 1 --> <!-- md:default 1 -->
<!-- md:env CHECK_PLAYLISTS_PER_ROUTINE --> <!-- md:env CHECK_PLAYLISTS_PER_ROUTINE -->
@@ -457,13 +447,13 @@ User-Agent для HTTP-запросов плейлистов.
--- ---
### `check.channels` { id=check-channels } ### `check.channels` { id="check-channels" }
Параметры проверки каналов внутри плейлиста. Параметры проверки каналов внутри плейлиста.
--- ---
#### `check.channels.user-agent` { id=check-channels-user-agent } #### `check.channels.userAgent` { id="check-channels-user-agent" }
<!-- md:default Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer --> <!-- md:default Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer -->
@@ -488,7 +478,7 @@ User-Agent для HTTP-запроса каждого канала каждого
--- ---
#### `check.channels.timeout` { id=check-channels-timeout } #### `check.channels.timeout` { id="check-channels-timeout" }
<!-- md:default 10 --> <!-- md:default 10 -->
<!-- md:env CHECK_CHANNELS_TIMEOUT --> <!-- md:env CHECK_CHANNELS_TIMEOUT -->
@@ -500,7 +490,7 @@ User-Agent для HTTP-запроса каждого канала каждого
--- ---
#### `check.channels.byte-range` { id=check-channels-byte-range } #### `check.channels.byteRange` { id="check-channels-byte-range" }
<!-- md:default 512 --> <!-- md:default 512 -->
<!-- md:env CHECK_CHANNELS_BYTE_RANGE --> <!-- md:env CHECK_CHANNELS_BYTE_RANGE -->
@@ -516,7 +506,7 @@ User-Agent для HTTP-запроса каждого канала каждого
--- ---
#### `check.channels.cooldown` { id=check-channels-cooldown } #### `check.channels.cooldown` { id="check-channels-cooldown" }
<!-- md:default 0 --> <!-- md:default 0 -->
<!-- md:env CHECK_CHANNELS_COOLDOWN --> <!-- md:env CHECK_CHANNELS_COOLDOWN -->
@@ -533,7 +523,7 @@ User-Agent для HTTP-запроса каждого канала каждого
--- ---
#### `check.channels.max-routines` { id=check-channels-max-routines } #### `check.channels.maxRoutines` { id="check-channels-max-routines" }
<!-- md:default 50 --> <!-- md:default 50 -->
<!-- md:env CHECK_CHANNELS_MAX_ROUTINES --> <!-- md:env CHECK_CHANNELS_MAX_ROUTINES -->
@@ -545,7 +535,7 @@ User-Agent для HTTP-запроса каждого канала каждого
--- ---
#### `check.channels.per-routine` { id=check-channels-per-routine } #### `check.channels.perRoutine` { id="check-channels-per-routine" }
<!-- md:default 10 --> <!-- md:default 10 -->
<!-- md:env CHECK_CHANNELS_PER_ROUTINE --> <!-- md:env CHECK_CHANNELS_PER_ROUTINE -->
@@ -557,15 +547,15 @@ User-Agent для HTTP-запроса каждого канала каждого
--- ---
## Секция `cache` { id=cache } ## Секция `cache` { id="cache" }
Параметры подключения к KeyDB/Redis для хранения результатов проверок. Параметры подключения к кешу для хранения результатов проверок.
--- ---
### `cache.enabled` { id=cache-enabled } ### `cache.enabled` { id="cache-enabled" }
<!-- md:default false --> <!-- md:default true -->
<!-- md:env CACHE_ENABLED --> <!-- md:env CACHE_ENABLED -->
<!-- md:arg --cache-enabled --> <!-- md:arg --cache-enabled -->
@@ -575,31 +565,31 @@ User-Agent для HTTP-запроса каждого канала каждого
--- ---
### `cache.host` { id=cache-host } ### `cache.host` { id="cache-host" }
<!-- md:default localhost --> <!-- md:default cache -->
<!-- md:env CACHE_HOST --> <!-- md:env CACHE_HOST -->
<!-- md:arg --cache-host --> <!-- md:arg --cache-host -->
Хост KeyDB/Redis. Хост кеша.
!!! info "Аргумент работает только для команд `check` и `serve --check`." !!! info "Аргумент работает только для команд `check` и `serve --check`."
--- ---
### `cache.port` { id=cache-port } ### `cache.port` { id="cache-port" }
<!-- md:default 6379 --> <!-- md:default 6379 -->
<!-- md:env CACHE_PORT --> <!-- md:env CACHE_PORT -->
<!-- md:arg --cache-port --> <!-- md:arg --cache-port -->
Порт KeyDB/Redis. Порт кеша.
!!! info "Аргумент работает только для команд `check` и `serve --check`." !!! info "Аргумент работает только для команд `check` и `serve --check`."
--- ---
### `cache.username` { id=cache-username } ### `cache.username` { id="cache-username" }
<!-- md:default --> <!-- md:default -->
<!-- md:env CACHE_USERNAME --> <!-- md:env CACHE_USERNAME -->
@@ -611,7 +601,7 @@ User-Agent для HTTP-запроса каждого канала каждого
--- ---
### `cache.password` { id=cache-password } ### `cache.password` { id="cache-password" }
<!-- md:default --> <!-- md:default -->
<!-- md:env CACHE_PASSWORD --> <!-- md:env CACHE_PASSWORD -->
@@ -623,21 +613,21 @@ User-Agent для HTTP-запроса каждого канала каждого
--- ---
### `cache.db` { id=cache-db } ### `cache.db` { id="cache-db" }
<!-- md:default 0 --> <!-- md:default 0 -->
<!-- md:env CACHE_DB --> <!-- md:env CACHE_DB -->
<!-- md:arg --cache-db --> <!-- md:arg --cache-db -->
Номер логической базы данных в KeyDB/Redis. Номер логической базы данных в кеше.
!!! info "Аргумент работает только для команд `check` и `serve --check`." !!! info "Аргумент работает только для команд `check` и `serve --check`."
--- ---
### `cache.ttl` { id=cache-ttl } ### `cache.ttl` { id="cache-ttl" }
<!-- md:default 30 --> <!-- md:default 3600 -->
<!-- md:env CACHE_TTL --> <!-- md:env CACHE_TTL -->
<!-- md:arg --cache-ttl --> <!-- md:arg --cache-ttl -->
@@ -15,7 +15,7 @@ tags: ["плееры"]
Обращайся к содержанию справа для быстрой навигации. Обращайся к содержанию справа для быстрой навигации.
!!! info "Здесь не хватает очень много подробностей" !!! info "Здесь не хватает очень много подробностей"
Если ты имел дело с каким-то плеером, знаешь как его настроить или какие-то другие детали, я прошу тебя помочь [актуализировать эту страницу](support.md#participate), чтобы через это помочь другим пользователям с выбором и настройкой плеера под свои цели. Если ты имел дело с каким-то плеером, знаешь как его настроить или какие-то другие детали, я прошу тебя помочь [актуализировать эту страницу](../extra/support.md#participate), чтобы через это помочь другим пользователям с выбором и настройкой плеера под свои цели.
## Кроссплатформенные ## Кроссплатформенные
@@ -33,17 +33,17 @@ tags: ["плееры"]
Универсальный плеер практически для любого мультимедиа-контента. Универсальный плеер практически для любого мультимедиа-контента.
??? image "Главное окно" ??? image "Главное окно"
![](_assets/players/vlc/main.jpg) ![](../extra/_assets/players/vlc/main.jpg)
??? image "Добавление плейлиста на десктопе" ??? image "Добавление плейлиста на десктопе"
!!! warning "Указание протокола `https://` обязательно!" !!! warning "Указание протокола `https://` обязательно!"
![](_assets/players/vlc/add1.jpg) ![](../extra/_assets/players/vlc/add1.jpg)
![](_assets/players/vlc/add2.jpg) ![](../extra/_assets/players/vlc/add2.jpg)
??? image "Добавление плейлиста на андроиде" ??? image "Добавление плейлиста на андроиде"
!!! warning "Указание протокола `https://` обязательно!" !!! warning "Указание протокола `https://` обязательно!"
![](_assets/players/vlc/add1-mob.jpg) ![](../extra/_assets/players/vlc/add1-mob.jpg)
![](_assets/players/vlc/add2-mob.jpg) ![](../extra/_assets/players/vlc/add2-mob.jpg)
### :thumbsup: IPTVnator ### :thumbsup: IPTVnator
@@ -58,12 +58,12 @@ tags: ["плееры"]
Если использовать веб-версию, то настройки сохраняются в браузере. Если использовать веб-версию, то настройки сохраняются в браузере.
??? image "Главное окно" ??? image "Главное окно"
![](_assets/players/iptvnator/main.jpg) ![](../extra/_assets/players/iptvnator/main.jpg)
??? image "Добавление плейлиста" ??? image "Добавление плейлиста"
!!! warning "Указание протокола `https://` обязательно!" !!! warning "Указание протокола `https://` обязательно!"
![](_assets/players/iptvnator/add1.jpg) ![](../extra/_assets/players/iptvnator/add1.jpg)
![](_assets/players/iptvnator/add2.jpg) ![](../extra/_assets/players/iptvnator/add2.jpg)
### IPTV Web Player ### IPTV Web Player
@@ -75,11 +75,11 @@ tags: ["плееры"]
Подгрузка и отображение телепрограммы (используется https://cdn.epg.one/epg2.xml). Подгрузка и отображение телепрограммы (используется https://cdn.epg.one/epg2.xml).
??? image "Главное окно" ??? image "Главное окно"
![](_assets/players/iptv-web-player/main.jpg) ![](../extra/_assets/players/iptv-web-player/main.jpg)
??? image "Добавление плейлиста" ??? image "Добавление плейлиста"
!!! success "Указание протокола `https://` необязательно!" !!! success "Указание протокола `https://` необязательно!"
![](_assets/players/iptv-web-player/add.jpg) ![](../extra/_assets/players/iptv-web-player/add.jpg)
### Kodi ### Kodi
@@ -136,11 +136,11 @@ tags: ["плееры"]
Поддерживает плейлисты по ссылкам, сторонние телепрограммы, группировку каналов, изменение плейлистов и многое другое. Поддерживает плейлисты по ссылкам, сторонние телепрограммы, группировку каналов, изменение плейлистов и многое другое.
??? image "Главное окно" ??? image "Главное окно"
![](_assets/players/yuki-iptv/main.jpg) ![](../extra/_assets/players/yuki-iptv/main.jpg)
??? image "Добавление плейлиста" ??? image "Добавление плейлиста"
!!! warning "Указание протокола `https://` обязательно!" !!! warning "Указание протокола `https://` обязательно!"
![](_assets/players/yuki-iptv/add.jpg) ![](../extra/_assets/players/yuki-iptv/add.jpg)
--- ---
@@ -174,18 +174,18 @@ tags: ["плееры"]
* Скачать: [play.google.com](https://play.google.com/store/apps/details?id=com.ottplay.ottplay) * Скачать: [play.google.com](https://play.google.com/store/apps/details?id=com.ottplay.ottplay)
??? image "Главный экран" ??? image "Главный экран"
![](_assets/players/televizo/main1.jpg) ![](../extra/_assets/players/televizo/main1.jpg)
![](_assets/players/televizo/main2.jpg) ![](../extra/_assets/players/televizo/main2.jpg)
??? image "Добавление плейлиста" ??? image "Добавление плейлиста"
!!! warning "Указание протокола `https://` обязательно!" !!! warning "Указание протокола `https://` обязательно!"
![](_assets/players/televizo/add1.jpg) ![](../extra/_assets/players/televizo/add1.jpg)
![](_assets/players/televizo/add2.jpg) ![](../extra/_assets/players/televizo/add2.jpg)
Из настроек: Из настроек:
![](_assets/players/televizo/add21.jpg) ![](../extra/_assets/players/televizo/add21.jpg)
![](_assets/players/televizo/add22.jpg) ![](../extra/_assets/players/televizo/add22.jpg)
И дальше те же шаги 3-5 на скриншотах выше. И дальше те же шаги 3-5 на скриншотах выше.
@@ -202,16 +202,16 @@ tags: ["плееры"]
Программу передач нужно [подключать отдельной ссылкой](../aggregator/faq.md#epg), из плейлиста не тянет. Программу передач нужно [подключать отдельной ссылкой](../aggregator/faq.md#epg), из плейлиста не тянет.
??? image "Главный экран" ??? image "Главный экран"
![](_assets/players/m3u/main.jpg) ![](../extra/_assets/players/m3u/main.jpg)
??? image "Добавление плейлиста" ??? image "Добавление плейлиста"
!!! warning "Указание протокола `https://` обязательно!" !!! warning "Указание протокола `https://` обязательно!"
![](_assets/players/m3u/add1.jpg) ![](../extra/_assets/players/m3u/add1.jpg)
![](_assets/players/m3u/add2.jpg) ![](../extra/_assets/players/m3u/add2.jpg)
??? image "Установка User-Agent" ??? image "Установка User-Agent"
![](_assets/players/m3u/ua1.jpg) ![](../extra/_assets/players/m3u/ua1.jpg)
![](_assets/players/m3u/ua2.jpg) ![](../extra/_assets/players/m3u/ua2.jpg)
#### IPTV (Александр Софронов) #### IPTV (Александр Софронов)
+1 -1
View File
@@ -15,7 +15,7 @@ SHORTCODE_RE = re.compile(r"<!--\s*md:(env|arg|config|version|default|beta)\s*(.
# нет страницы `/iptvc/config` — соответствующий раздел живёт в # нет страницы `/iptvc/config` — соответствующий раздел живёт в
# `content/common/config/config.md`. С `use_directory_urls = false` конечные # `content/common/config/config.md`. С `use_directory_urls = false` конечные
# ссылки должны включать `.html`. # ссылки должны включать `.html`.
CONFIG_PAGE = "/common/config/config.html" CONFIG_PAGE = "/reference/config.html"
class BadgePreprocessor(Preprocessor): class BadgePreprocessor(Preprocessor):
+16 -13
View File
@@ -1,5 +1,10 @@
# https://zensical.org/docs/setup/basics # https://zensical.org/docs/setup/basics
# https://squidfunk.github.io/mkdocs-material/reference/icons-emojis/ # https://squidfunk.github.io/mkdocs-material/reference/icons-emojis/
# https://pictogrammers.com/library/mdi/
# https://simpleicons.org
# https://fontawesome.com/search?ip=classic&s=regular&ic=free-collection
# https://primer.style/octicons/
# https://microsoft.github.io/vscode-codicons/dist/codicon.html
[project] [project]
site_name = "Документация m3u.su" site_name = "Документация m3u.su"
@@ -24,7 +29,6 @@ nav = [
{"Агрегатор" = [ {"Агрегатор" = [
"aggregator/overview.md", "aggregator/overview.md",
"aggregator/selection.md", "aggregator/selection.md",
"aggregator/checks.md",
"aggregator/statuspage.md", "aggregator/statuspage.md",
"aggregator/faq.md", "aggregator/faq.md",
]}, ]},
@@ -35,6 +39,7 @@ nav = [
"iptvc/site/first-steps.md", "iptvc/site/first-steps.md",
"iptvc/site/list.md", "iptvc/site/list.md",
"iptvc/site/details.md", "iptvc/site/details.md",
"iptvc/site/checks.md",
"iptvc/site/connect.md", "iptvc/site/connect.md",
"iptvc/site/deploy.md", "iptvc/site/deploy.md",
]}, ]},
@@ -57,27 +62,25 @@ nav = [
]}, ]},
]}, ]},
{"Справочник" = [ {"Справочник" = [
"common/players.md", "reference/config.md",
{"Конфигурация iptvc" = [ "reference/players.md",
"common/config/config.md",
]},
# {"Для документации" = [ # {"Для документации" = [
# "iptvc/dev/docs/components.md", # "iptvc/dev/docs/components.md",
# "iptvc/dev/docs/codicons.md", # "iptvc/dev/docs/codicons.md",
# ]}, # ]},
{"Форматы файлов" = [ {"Форматы файлов" = [
"common/formats/playlists.md", "reference/formats/playlists.md",
"common/formats/channels.md", "reference/formats/channels.md",
"common/formats/m3u.md", "reference/formats/m3u.md",
]}, ]},
]}, ]},
{"Дополнительно" = [ {"Дополнительно" = [
"common/docs.md", "extra/docs.md",
"common/support.md", "extra/support.md",
{"Правовая информация" = [ {"Правовая информация" = [
"legal/copyrights.md", "extra/legal/copyrights.md",
"legal/license.md", "extra/legal/license.md",
"legal/foss.md", "extra/legal/foss.md",
]}, ]},
]}, ]},
] ]