Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c91ff4c103
|
||
|
|
89b303fed3
|
@@ -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 ... -->` для ссылок на документацию параметров конфига
|
||||||
|
|
||||||
|
|||||||
@@ -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).
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ hide: [toc]
|
|||||||
Автор не зарабатывает на проекте и не собирается.
|
Автор не зарабатывает на проекте и не собирается.
|
||||||
Всё, что отображается на сайте, сделано бесплатно и на энтузиазме.
|
Всё, что отображается на сайте, сделано бесплатно и на энтузиазме.
|
||||||
|
|
||||||
Но ты можешь сделать [добровольное пожертвование](../common/support.md), которое поможет мне компенсировать затраты на поддержку и техническое развитие проекта.
|
Но ты можешь сделать [добровольное пожертвование](../extra/support.md), которое поможет мне компенсировать затраты на поддержку и техническое развитие проекта.
|
||||||
|
|
||||||
## Условия, гарантии, обязательства и последствия
|
## Условия, гарантии, обязательства и последствия
|
||||||
|
|
||||||
|
|||||||
@@ -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 "На мобильниках содержание страницы спрятано за этой кнопкой в боковом меню:"
|
||||||

|

|
||||||
|
|
||||||
@@ -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: Создать задачу
|
||||||
|
|
||||||
@@ -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>
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,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: статистика по плейлистам и каналам |
|
||||||
|
|||||||
@@ -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 кеш приоритетнее внешнего кеша при отображении в веб-интерфейсе.
|
||||||
|
|||||||
@@ -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` | Вывод списка доступных рецептов |
|
||||||
|
|
||||||
## Управление архитектурой
|
## Управление архитектурой
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
Информацию о лицензии см. на странице [Свободное ПО](../../../legal/license.md)
|
# Иконки codicons
|
||||||
|
|
||||||
|
Информацию о лицензии см. на странице [Свободное ПО](../../../extra/legal/license.md)
|
||||||
|
|
||||||
| Иконка | Код для вставки в текст | Код для вставки в frontmatter |
|
| Иконка | Код для вставки в текст | Код для вставки в frontmatter |
|
||||||
| ------------------------------------------------ | -------------------------------------------------- | ------------------------------------------------ |
|
| ------------------------------------------------ | -------------------------------------------------- | ------------------------------------------------ |
|
||||||
|
|||||||
@@ -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).
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
@@ -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`
|
||||||
|
|||||||
@@ -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).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -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) уже есть информация как добавить плейлист.
|
||||||
|
|
||||||
|
|||||||
@@ -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` запущен.
|
||||||
|
|||||||
@@ -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) может не принять какую-то из них.
|
||||||
Так что, если не подойдёт один формат, используй другой — добавь префикс или суффикс.
|
Так что, если не подойдёт один формат, используй другой — добавь префикс или суффикс.
|
||||||
|
|
||||||
Префикс плееру требуется чаще всего, потому что он при добавлении плейлиста проверяет — а ссылку ли мне вообще предоставил пользователь?
|
Префикс плееру требуется чаще всего, потому что он при добавлении плейлиста проверяет — а ссылку ли мне вообще предоставил пользователь?
|
||||||
|
|||||||
@@ -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).
|
||||||
|
|||||||
@@ -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`), то происходит **переадресация** на исходный плейлист.
|
||||||
|
|||||||
@@ -7,30 +7,30 @@ tags: ["сайт", "плейлисты"]
|
|||||||
|
|
||||||
Это главная страница сайта.
|
Это главная страница сайта.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
Наверху отображаются:
|
Наверху отображаются:
|
||||||
|
|
||||||
* дата последнего изменения файла [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).
|
||||||
|
|
||||||
В зависимости от ширины экрана, для экономии места может быть скрыто описание с иконками возможностей и короткая ссылка.
|
В зависимости от ширины экрана, для экономии места может быть скрыто описание с иконками возможностей и короткая ссылка.
|
||||||
|
|
||||||

|

|
||||||
|
|||||||
@@ -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 "Главное окно"
|
||||||

|

|
||||||
|
|
||||||
??? image "Добавление плейлиста на десктопе"
|
??? image "Добавление плейлиста на десктопе"
|
||||||
!!! warning "Указание протокола `https://` обязательно!"
|
!!! warning "Указание протокола `https://` обязательно!"
|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
??? image "Добавление плейлиста на андроиде"
|
??? image "Добавление плейлиста на андроиде"
|
||||||
!!! warning "Указание протокола `https://` обязательно!"
|
!!! warning "Указание протокола `https://` обязательно!"
|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
### :thumbsup: IPTVnator
|
### :thumbsup: IPTVnator
|
||||||
|
|
||||||
@@ -58,12 +58,12 @@ tags: ["плееры"]
|
|||||||
Если использовать веб-версию, то настройки сохраняются в браузере.
|
Если использовать веб-версию, то настройки сохраняются в браузере.
|
||||||
|
|
||||||
??? image "Главное окно"
|
??? image "Главное окно"
|
||||||

|

|
||||||
|
|
||||||
??? image "Добавление плейлиста"
|
??? image "Добавление плейлиста"
|
||||||
!!! warning "Указание протокола `https://` обязательно!"
|
!!! warning "Указание протокола `https://` обязательно!"
|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
### 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 "Главное окно"
|
||||||

|

|
||||||
|
|
||||||
??? image "Добавление плейлиста"
|
??? image "Добавление плейлиста"
|
||||||
!!! success "Указание протокола `https://` необязательно!"
|
!!! success "Указание протокола `https://` необязательно!"
|
||||||

|

|
||||||
|
|
||||||
### Kodi
|
### Kodi
|
||||||
|
|
||||||
@@ -136,11 +136,11 @@ tags: ["плееры"]
|
|||||||
Поддерживает плейлисты по ссылкам, сторонние телепрограммы, группировку каналов, изменение плейлистов и многое другое.
|
Поддерживает плейлисты по ссылкам, сторонние телепрограммы, группировку каналов, изменение плейлистов и многое другое.
|
||||||
|
|
||||||
??? image "Главное окно"
|
??? image "Главное окно"
|
||||||

|

|
||||||
|
|
||||||
??? image "Добавление плейлиста"
|
??? image "Добавление плейлиста"
|
||||||
!!! warning "Указание протокола `https://` обязательно!"
|
!!! warning "Указание протокола `https://` обязательно!"
|
||||||

|

|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -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 "Главный экран"
|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
??? image "Добавление плейлиста"
|
??? image "Добавление плейлиста"
|
||||||
!!! warning "Указание протокола `https://` обязательно!"
|
!!! warning "Указание протокола `https://` обязательно!"
|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
Из настроек:
|
Из настроек:
|
||||||
|
|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
И дальше те же шаги 3-5 на скриншотах выше.
|
И дальше те же шаги 3-5 на скриншотах выше.
|
||||||
|
|
||||||
@@ -202,16 +202,16 @@ tags: ["плееры"]
|
|||||||
Программу передач нужно [подключать отдельной ссылкой](../aggregator/faq.md#epg), из плейлиста не тянет.
|
Программу передач нужно [подключать отдельной ссылкой](../aggregator/faq.md#epg), из плейлиста не тянет.
|
||||||
|
|
||||||
??? image "Главный экран"
|
??? image "Главный экран"
|
||||||

|

|
||||||
|
|
||||||
??? image "Добавление плейлиста"
|
??? image "Добавление плейлиста"
|
||||||
!!! warning "Указание протокола `https://` обязательно!"
|
!!! warning "Указание протокола `https://` обязательно!"
|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
??? image "Установка User-Agent"
|
??? image "Установка User-Agent"
|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
#### IPTV (Александр Софронов)
|
#### IPTV (Александр Софронов)
|
||||||
|
|
||||||
@@ -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):
|
||||||
|
|||||||
@@ -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",
|
||||||
]},
|
]},
|
||||||
]},
|
]},
|
||||||
]
|
]
|
||||||
|
|||||||