diff --git a/README.md b/README.md
index 663c13f..122d7be 100644
--- a/README.md
+++ b/README.md
@@ -29,4 +29,4 @@ make live
Исходный код и готовая документация распространяется на условиях лицензии MIT.
См. файл [LICENSE](LICENSE) для подробностей.
-Стороннее ПО и ресурсы используются в соответствии лицензиями, указанными в файле [content/legal/foss.md](content/legal/foss.md).
+Стороннее ПО и ресурсы используются в соответствии лицензиями, указанными в файле [content/legal/foss.md](content/extra/legal/foss.md).
diff --git a/content/_assets/css/extra.css b/content/_assets/css/extra.css
index 4ef7e53..661c8f6 100644
--- a/content/_assets/css/extra.css
+++ b/content/_assets/css/extra.css
@@ -5,6 +5,8 @@
--md-admonition-icon--yoomoney: url('data:image/svg+xml;charset=utf-8,');
/* Boosty logo */
--md-admonition-icon--boosty: url('data:image/svg+xml;charset=utf-8,');
+ /* CloudTips logo */
+ --md-admonition-icon--cloudtips: url('data:image/svg+xml;charset=utf-8,');
}
/* Image admonition styling */
@@ -24,11 +26,11 @@
.md-typeset .admonition.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 > summary::before {
- background-color: rgb(113, 47, 244);
+ background-color: rgb(113 47 244);
-webkit-mask-image: var(--md-admonition-icon--yoomoney);
mask-image: var(--md-admonition-icon--yoomoney);
}
@@ -37,15 +39,28 @@
.md-typeset .admonition.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 > summary::before {
- background-color: rgb(241, 95, 44);
+ background-color: rgb(241 95 44);
-webkit-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 {
border-bottom-left-radius: 6px;
diff --git a/content/aggregator/faq.md b/content/aggregator/faq.md
index ad25714..19b0792 100644
--- a/content/aggregator/faq.md
+++ b/content/aggregator/faq.md
@@ -46,8 +46,8 @@ tags: ["сайт", "каналы", "плейлисты", "epg", "плееры",
## Откуда берутся логотипы каналов и программы передач?
-Всё это (не) [указывается](../common/formats/m3u.md#tvg-logo) внутри плейлиста его авторами.
-Но в некоторых [плеерах](../common/players.md) можно вручную указывать программу передач (см. ниже).
+Всё это (не) [указывается](../ref/formats/m3u.md#tvg-logo) внутри плейлиста его авторами.
+Но в некоторых [плеерах](../ref/players.md) можно вручную указывать программу передач (см. ниже).
## У канала нет логотипа!
@@ -55,7 +55,7 @@ tags: ["сайт", "каналы", "плейлисты", "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 может быть и [указан](../ref/formats/m3u.md#url-tvg) в плейлисте, но у конкретного канала могут быть указаны некорректные [`tvg-id`](../ref/formats/m3u.md#tvg-id) или [`tvg-name`](../ref/formats/m3u.md#tvg-name).
Может, его дёрнули из другого листа и не подогнали под другую EPG.
Так что вариантов масса:
@@ -74,17 +74,17 @@ tags: ["сайт", "каналы", "плейлисты", "epg", "плееры",
* не все плееры вообще поддерживают работу с телепрограммой;
* в плейлисте она просто может не быть указана.
-Но если [плеер](../common/players.md) позволяет, можно указать ссылку на сторонную телепрограмму.
+Но если [плеер](../ref/players.md) позволяет, можно указать ссылку на сторонную телепрограмму.
И это целое дело.
-Надо чтобы совпадали [`tvg-id`](../common/formats/m3u.md#tvg-id) или [`tvg-name`](../common/formats/m3u.md#tvg-name) каналов с теми, которые указываются в EPG.
+Надо чтобы совпадали [`tvg-id`](../ref/formats/m3u.md#tvg-id) или [`tvg-name`](../ref/formats/m3u.md#tvg-name) каналов с теми, которые указываются в EPG.
Так что не всякая телепрограмма подойдёт, не ко всякому плейлисту и не ко всем каналам.
Надо подбирать и то, и то.
## А где взять программу передач (EPG)? { id="epg" }
1. Из самого плейлиста.
- Часто в атрибут [`url-tvg`](../common/formats/m3u.md#url-tvg) тега `#EXTM3U` указывают одну или две ссылки на EPG, разделяя их `;`.
+ Часто в атрибут [`url-tvg`](../ref/formats/m3u.md#url-tvg) тега `#EXTM3U` указывают одну или две ссылки на EPG, разделяя их `;`.
Их можно использовать отдельно, например, если плеер не может корректно обработать такое значение.
2. Взять одну из этих ссылок:
@@ -114,7 +114,7 @@ tags: ["сайт", "каналы", "плейлисты", "epg", "плееры",
## Почему на сайте плейлист онлайн, но в нём 0 каналов?
-[Тебе сюда](checks.md#playlists).
+[Тебе сюда](../iptvc/site/checks.md#playlists).
## Почему на сайте плейлист онлайн, но у меня он не работает?
@@ -133,7 +133,7 @@ tags: ["сайт", "каналы", "плейлисты", "epg", "плееры",
Но вообще, это зависит от:
* автора плейлиста (дохлые каналы почти всегда есть даже в свежайших листах, но если лист не обновлялся год, что ты вряд-ли узнаешь, то рабочих каналов там не ищи);
-* твоего [плеера](../common/players.md) (видеотрансляции могут использовать кодек, который просто не поддерживается плеером);
+* твоего [плеера](../ref/players.md) (видеотрансляции могут использовать кодек, который просто не поддерживается плеером);
* ширины твоего интернет-канала (не надо пытаться врубать FHD/4K трансляции с мобильного интернета на самом дешёвом тарифе в лесу);
* ретроградности Меркурия и магнитных бурь (а вдруг);
* настроек твоей сети, твоего интернет-провайдера, 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](../ref/formats/m3u.md);
* сохраняешь в файл `pls.m3u`.
Получился плейлист `pls.m3u`.
@@ -251,7 +251,7 @@ tags: ["сайт", "каналы", "плейлисты", "epg", "плееры",
Нет, и не планируется.
-Ищи [плеер](../common/players.md) и добавляй плейлист туда по ссылке.
+Ищи [плеер](../ref/players.md) и добавляй плейлист туда по ссылке.
## На канале отображается заглушка { id="заглушка" }
@@ -308,7 +308,7 @@ tags: ["сайт", "каналы", "плейлисты", "epg", "плееры",
**Решение 3:** если IP не российский, то сделать его российским (любыми способами).
-**Решение 4:** использовать [плеер](../common/players.md), который позволяет указать **User-Agent**, и вставить туда какой-нибудь из этих:
+**Решение 4:** использовать [плеер](../ref/players.md), который позволяет указать **User-Agent**, и вставить туда какой-нибудь из этих:
```
Mozilla/5.0 WINK/1.28.2 (AndroidTV/9) HlsWinkPlayer
diff --git a/content/aggregator/overview.md b/content/aggregator/overview.md
index 4713eec..69cbab1 100644
--- a/content/aggregator/overview.md
+++ b/content/aggregator/overview.md
@@ -61,7 +61,7 @@ hide: [toc]
Автор не зарабатывает на проекте и не собирается.
Всё, что отображается на сайте, сделано бесплатно и на энтузиазме.
-Но ты можешь сделать [добровольное пожертвование](../common/support.md), которое поможет мне компенсировать затраты на поддержку и техническое развитие проекта.
+Но ты можешь сделать [добровольное пожертвование](../extra/support.md), которое поможет мне компенсировать затраты на поддержку и техническое развитие проекта.
## Условия, гарантии, обязательства и последствия
diff --git a/content/common/index.md b/content/common/index.md
index 129d4e6..fee5965 100644
--- a/content/common/index.md
+++ b/content/common/index.md
@@ -8,9 +8,9 @@ hide: [toc]
- [:material-cogs: Как работает сервис](../aggregator/overview.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)
- [:material-table-eye: Страница плейлиста](../iptvc/site/details.md)
- [:material-television-play: Как подключить плейлист](../iptvc/site/connect.md)
-- [:material-multimedia: IPTV плееры](players.md)
+- [:material-multimedia: IPTV плееры](../ref/players.md)
diff --git a/content/common/_assets/players/iptv-web-player/add.jpg b/content/extra/_assets/players/iptv-web-player/add.jpg
similarity index 100%
rename from content/common/_assets/players/iptv-web-player/add.jpg
rename to content/extra/_assets/players/iptv-web-player/add.jpg
diff --git a/content/common/_assets/players/iptv-web-player/main.jpg b/content/extra/_assets/players/iptv-web-player/main.jpg
similarity index 100%
rename from content/common/_assets/players/iptv-web-player/main.jpg
rename to content/extra/_assets/players/iptv-web-player/main.jpg
diff --git a/content/common/_assets/players/iptvnator/add1.jpg b/content/extra/_assets/players/iptvnator/add1.jpg
similarity index 100%
rename from content/common/_assets/players/iptvnator/add1.jpg
rename to content/extra/_assets/players/iptvnator/add1.jpg
diff --git a/content/common/_assets/players/iptvnator/add2.jpg b/content/extra/_assets/players/iptvnator/add2.jpg
similarity index 100%
rename from content/common/_assets/players/iptvnator/add2.jpg
rename to content/extra/_assets/players/iptvnator/add2.jpg
diff --git a/content/common/_assets/players/iptvnator/main.jpg b/content/extra/_assets/players/iptvnator/main.jpg
similarity index 100%
rename from content/common/_assets/players/iptvnator/main.jpg
rename to content/extra/_assets/players/iptvnator/main.jpg
diff --git a/content/common/_assets/players/m3u/add1.jpg b/content/extra/_assets/players/m3u/add1.jpg
similarity index 100%
rename from content/common/_assets/players/m3u/add1.jpg
rename to content/extra/_assets/players/m3u/add1.jpg
diff --git a/content/common/_assets/players/m3u/add2.jpg b/content/extra/_assets/players/m3u/add2.jpg
similarity index 100%
rename from content/common/_assets/players/m3u/add2.jpg
rename to content/extra/_assets/players/m3u/add2.jpg
diff --git a/content/common/_assets/players/m3u/main.jpg b/content/extra/_assets/players/m3u/main.jpg
similarity index 100%
rename from content/common/_assets/players/m3u/main.jpg
rename to content/extra/_assets/players/m3u/main.jpg
diff --git a/content/common/_assets/players/m3u/ua1.jpg b/content/extra/_assets/players/m3u/ua1.jpg
similarity index 100%
rename from content/common/_assets/players/m3u/ua1.jpg
rename to content/extra/_assets/players/m3u/ua1.jpg
diff --git a/content/common/_assets/players/m3u/ua2.jpg b/content/extra/_assets/players/m3u/ua2.jpg
similarity index 100%
rename from content/common/_assets/players/m3u/ua2.jpg
rename to content/extra/_assets/players/m3u/ua2.jpg
diff --git a/content/common/_assets/players/televizo/add1.jpg b/content/extra/_assets/players/televizo/add1.jpg
similarity index 100%
rename from content/common/_assets/players/televizo/add1.jpg
rename to content/extra/_assets/players/televizo/add1.jpg
diff --git a/content/common/_assets/players/televizo/add2.jpg b/content/extra/_assets/players/televizo/add2.jpg
similarity index 100%
rename from content/common/_assets/players/televizo/add2.jpg
rename to content/extra/_assets/players/televizo/add2.jpg
diff --git a/content/common/_assets/players/televizo/add21.jpg b/content/extra/_assets/players/televizo/add21.jpg
similarity index 100%
rename from content/common/_assets/players/televizo/add21.jpg
rename to content/extra/_assets/players/televizo/add21.jpg
diff --git a/content/common/_assets/players/televizo/add22.jpg b/content/extra/_assets/players/televizo/add22.jpg
similarity index 100%
rename from content/common/_assets/players/televizo/add22.jpg
rename to content/extra/_assets/players/televizo/add22.jpg
diff --git a/content/common/_assets/players/televizo/main1.jpg b/content/extra/_assets/players/televizo/main1.jpg
similarity index 100%
rename from content/common/_assets/players/televizo/main1.jpg
rename to content/extra/_assets/players/televizo/main1.jpg
diff --git a/content/common/_assets/players/televizo/main2.jpg b/content/extra/_assets/players/televizo/main2.jpg
similarity index 100%
rename from content/common/_assets/players/televizo/main2.jpg
rename to content/extra/_assets/players/televizo/main2.jpg
diff --git a/content/common/_assets/players/vlc/add1-mob.jpg b/content/extra/_assets/players/vlc/add1-mob.jpg
similarity index 100%
rename from content/common/_assets/players/vlc/add1-mob.jpg
rename to content/extra/_assets/players/vlc/add1-mob.jpg
diff --git a/content/common/_assets/players/vlc/add1.jpg b/content/extra/_assets/players/vlc/add1.jpg
similarity index 100%
rename from content/common/_assets/players/vlc/add1.jpg
rename to content/extra/_assets/players/vlc/add1.jpg
diff --git a/content/common/_assets/players/vlc/add2-mob.jpg b/content/extra/_assets/players/vlc/add2-mob.jpg
similarity index 100%
rename from content/common/_assets/players/vlc/add2-mob.jpg
rename to content/extra/_assets/players/vlc/add2-mob.jpg
diff --git a/content/common/_assets/players/vlc/add2.jpg b/content/extra/_assets/players/vlc/add2.jpg
similarity index 100%
rename from content/common/_assets/players/vlc/add2.jpg
rename to content/extra/_assets/players/vlc/add2.jpg
diff --git a/content/common/_assets/players/vlc/main.jpg b/content/extra/_assets/players/vlc/main.jpg
similarity index 100%
rename from content/common/_assets/players/vlc/main.jpg
rename to content/extra/_assets/players/vlc/main.jpg
diff --git a/content/common/_assets/players/yuki-iptv/add.jpg b/content/extra/_assets/players/yuki-iptv/add.jpg
similarity index 100%
rename from content/common/_assets/players/yuki-iptv/add.jpg
rename to content/extra/_assets/players/yuki-iptv/add.jpg
diff --git a/content/common/_assets/players/yuki-iptv/main.jpg b/content/extra/_assets/players/yuki-iptv/main.jpg
similarity index 100%
rename from content/common/_assets/players/yuki-iptv/main.jpg
rename to content/extra/_assets/players/yuki-iptv/main.jpg
diff --git a/content/common/docs.md b/content/extra/docs.md
similarity index 96%
rename from content/common/docs.md
rename to content/extra/docs.md
index 959da43..21c6a09 100644
--- a/content/common/docs.md
+++ b/content/extra/docs.md
@@ -29,5 +29,5 @@ icon: material/book-open-page-variant-outline
4. справа — содержание конкретной страницы.
??? info end "На мобильниках содержание страницы спрятано за этой кнопкой в боковом меню:"
- 
+ 
diff --git a/content/legal/copyrights.md b/content/extra/legal/copyrights.md
similarity index 98%
rename from content/legal/copyrights.md
rename to content/extra/legal/copyrights.md
index 528c3df..b2a1d0a 100644
--- a/content/legal/copyrights.md
+++ b/content/extra/legal/copyrights.md
@@ -5,7 +5,7 @@ icon: material/wallet-outline
# :material-wallet-outline: Правообладателям
Данные, представленные на сайте https://m3u.su, получены автоматически из открыто доступных в интернете IPTV-плейлистов, опубликованных третьими лицами.
-При наличии технической возможности, источник плейлиста может быть указан на вкладке [«Основные данные»](../iptvc/site/details.md).
+При наличии технической возможности, источник плейлиста может быть указан на вкладке [«Основные данные»](../../iptvc/site/details.md).
Сервис https://m3u.su не размещает и не транслирует медиаконтент, не создаёт, не призывает использовать и распространять плейлисты третьих лиц, а также не оказывает услуг по ретрансляции телепрограмм.
diff --git a/content/legal/foss.md b/content/extra/legal/foss.md
similarity index 100%
rename from content/legal/foss.md
rename to content/extra/legal/foss.md
diff --git a/content/legal/license.md b/content/extra/legal/license.md
similarity index 100%
rename from content/legal/license.md
rename to content/extra/legal/license.md
diff --git a/content/common/support.md b/content/extra/support.md
similarity index 74%
rename from content/common/support.md
rename to content/extra/support.md
index 0d49dd1..2c41c4c 100644
--- a/content/common/support.md
+++ b/content/extra/support.md
@@ -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_chat](../tg/chat.md) ([boost](https://t.me/iptv_aggregator_chat?boost)) — комментарии к каналу, общение по теме проекта и IPTV.
+* чат: [@iptv_aggregator_chat](../tg/chat.md) — комментарии к каналу, общение по теме проекта и IPTV.
## :material-wallet: Внести пожертвование
-Вы можете внести прямое денежное **пожертвование** с банковской карты на виртуальный кошелёк ЮMoney:
+Пожертвования добровольны и безвозмездны.
+Вы не получите ничего взамен, кроме чека.
+
+Для вас пожертвования в мой адрес — способ сказать мне "Спасибо".
+Для меня — способ компенсировать малую долю затрат на содержание проекта.
+
+Вы можете внести прямое денежное пожертвование с банковской карты:
!!! 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)"
- Разовый платёж или платная подписка.
-
-Пожертвования добровольны.
-Они не дают права на эксклюзивный доступ к чему-либо и не рассматриваются как способ обогащения.
-Это лишь попытка компенсировать затраты на содержание проекта.
На пожертвования [был приобретён](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.
-!!! info "Это бесплатно, но неактивированные учётки периодически удаляются."
+!!! info "Это бесплатно"
+ От вас не потребуется никаких персональных данных.
+ Сервер расположен в РФ.
+ Неактивированные учётки периодически удаляются.
### :octicons-issue-opened-16: Создать задачу
diff --git a/content/index.md b/content/index.md
index 89301a9..34c93eb 100644
--- a/content/index.md
+++ b/content/index.md
@@ -50,7 +50,7 @@ hero:
Полное описание `config.yml`, переменных окружения и CLI-флагов
- [Подробнее :octicons-arrow-right-24:](common/config/config.md){ .md-button .md-button--primary }
+ [Подробнее :octicons-arrow-right-24:](ref/config.md){ .md-button .md-button--primary }
- :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:](ref/players.md){ .md-button .md-button--primary }
- :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 }
diff --git a/content/iptvc/commands/check.md b/content/iptvc/commands/check.md
index 4b11e66..f97f7b5 100644
--- a/content/iptvc/commands/check.md
+++ b/content/iptvc/commands/check.md
@@ -13,7 +13,7 @@ tags: [iptvc]
## `-i`, `--ini` { id=ini }
-Указывает путь к локальному [ini-файлу](../../common/formats/playlists.md) с описанием плейлистов.
+Указывает путь к локальному [ini-файлу](../../ref/formats/playlists.md) с описанием плейлистов.
Можно указать только однажды.
@@ -27,7 +27,7 @@ tags: [iptvc]
## `-t`, `--tags` { id=tags }
-Указывает путь к локальному [json-файлу](../../common/formats/channels.md) с описанием тегов каналов.
+Указывает путь к локальному [json-файлу](../../ref/formats/channels.md) с описанием тегов каналов.
Можно указать только однажды.
@@ -64,7 +64,7 @@ tags: [iptvc]
## `-c`, `--code` { id=code }
-Указывает код плейлиста из файла [playlists.ini](../../common/formats/playlists.md).
+Указывает код плейлиста из файла [playlists.ini](../../ref/formats/playlists.md).
Можно указать несколько разных.
@@ -87,14 +87,14 @@ tags: [iptvc]
Если указано `0`, тогда:
* повторение будет бесконечным;
-
+
* если переданы [`--url`](#url), [`--file`](#file) или [`--code`](#code), то на каждой итерации будут проверяться только указанные плейлисты;
-
-* если не переданы [`--url`](#url), [`--file`](#file) или [`--code`](#code), то на каждой итерации список плейлистов будет подготавливаться заново.
+
+* если не переданы [`--url`](#url), [`--file`](#file) или [`--code`](#code), то на каждой итерации список плейлистов будет подготавливаться заново.
Если при этом используется кеширование, то проверенные плейлисты (результаты проверки которых ещё находятся в кеше) проверяться не будут.
```shell title="Пример"
-# проверить 5 раз плейлисты с кодами xx и yy из my.ini
+# проверить 5 раз плейлисты с кодами xx и yy из my.ini
./iptvc check -i ~/my.ini -c xx --code yy --repeat 5
# бесконечно проверять все плейлисты из my.ini, без учёта проверенных
./iptvc check -i ~/my.ini --repeat 0
@@ -151,18 +151,20 @@ tags: [iptvc]
./iptvc check -i ~/my.ini --random 10 --quiet --json
```
-## `-v`, `--verbose` { id=verbose }
-
-Включает подробное логирование.
-
-```shell title="Пример"
-./iptvc check --random 10 --verbose
-```
-
## Глобальные флаги { id=global }
Эти флаги доступны для всех команд и переопределяют значения из `config.yml`.
+### `--config` { id=config }
+
+Путь к файлу конфигурации `config.yml`.
+
+Значение по умолчанию: `config.yml`
+
+```shell title="Пример"
+./iptvc check --config /etc/iptvc/config.yml
+```
+
### `--debug` { id=debug }
Включает режим отладки. Переопределяет `app.debug` из `config.yml` и переменную `APP_DEBUG`.
@@ -181,6 +183,14 @@ tags: [iptvc]
./iptvc check -i ~/my.ini --log-level debug
```
+### `-v`, `--verbose` { id=verbose }
+
+Включает подробное логирование.
+
+```shell title="Пример"
+./iptvc check --random 10 --verbose
+```
+
## Флаги проверки плейлистов { id=check-playlists }
Эти флаги переопределяют параметры секции `check.playlists` из `config.yml`. Доступны для команд `check` и `serve`.
diff --git a/content/iptvc/commands/serve.md b/content/iptvc/commands/serve.md
index a12f329..07d57cc 100644
--- a/content/iptvc/commands/serve.md
+++ b/content/iptvc/commands/serve.md
@@ -53,7 +53,7 @@ iptvc serve --check
### `-i`, `--ini` { id="ini" }
-Путь к локальному [ini-файлу](../../common/formats/playlists.md) с описанием плейлистов.
+Путь к локальному [ini-файлу](../../ref/formats/playlists.md) с описанием плейлистов.
Значение по умолчанию: `./playlists.ini`
@@ -63,7 +63,7 @@ iptvc serve --check -i ~/my.ini
### `-t`, `--tags` { id="tags" }
-Путь к [json-файлу](../../common/formats/channels.md) с описанием тегов каналов.
+Путь к [json-файлу](../../ref/formats/channels.md) с описанием тегов каналов.
Значение по умолчанию: `./channels.json`
@@ -365,19 +365,20 @@ iptvc serve --check --debug \
## Веб-маршруты
-| Метод | Путь | Описание |
-| --- | --- | --- |
-| GET | `/` | Главная страница со списком плейлистов |
-| GET | `/page/{N}` | Страница N списка плейлистов |
-| GET | `/{code}` | Редирект на прямую ссылку плейлиста |
-| GET | `/{code}.m3u[8]` | Редирект на прямую ссылку плейлиста |
-| GET | `/{code}/details` | Страница с описанием плейлиста |
-| GET | `/api` | Редирект на `/api/` (Swagger UI) |
-| GET | `/api/` | Swagger UI с описанием REST API |
-| GET | `/api/openapi.json` | OpenAPI-схема в формате JSON |
-| GET | `/api/playlists` | JSON: массив всех плейлистов |
-| GET | `/api/playlists/{code}` | JSON: информация о плейлисте |
-| GET | `/api/playlists/{code}/channels` | JSON: список каналов плейлиста |
-| GET | `/api/version` | JSON: версии компонентов |
-| GET | `/api/health` | JSON: состояние сервиса |
-| GET | `/api/stats` | JSON: статистика по плейлистам и каналам |
+| Метод | Путь | Описание |
+| ----- | -------------------------------- | ---------------------------------------- |
+| GET | `/` | Главная страница со списком плейлистов |
+| GET | `/page/{N}` | Страница N списка плейлистов |
+| GET | `/{code}` | Редирект на прямую ссылку плейлиста |
+| GET | `/{code}.m3u` | Редирект на прямую ссылку плейлиста |
+| GET | `/{code}.m3u8` | Редирект на прямую ссылку плейлиста |
+| GET | `/{code}/details` | Страница с описанием плейлиста |
+| GET | `/api` | Редирект на `/api/` (Swagger UI) |
+| GET | `/api/` | Swagger UI с описанием REST API |
+| GET | `/api/openapi.json` | OpenAPI-схема в формате JSON |
+| GET | `/api/playlists` | JSON: массив всех плейлистов |
+| GET | `/api/playlists/{code}` | JSON: информация о плейлисте |
+| GET | `/api/playlists/{code}/channels` | JSON: список каналов плейлиста |
+| GET | `/api/version` | JSON: версии компонентов |
+| GET | `/api/health` | JSON: состояние сервиса |
+| GET | `/api/stats` | JSON: статистика по плейлистам и каналам |
diff --git a/content/iptvc/dev/arch.md b/content/iptvc/dev/arch.md
index b45a3cd..7093e9d 100644
--- a/content/iptvc/dev/arch.md
+++ b/content/iptvc/dev/arch.md
@@ -30,11 +30,13 @@ iptvc/
│ ├── check.go # команда check
│ ├── serve.go # команда serve
│ ├── flags.go # общие флаги check/serve
+│ ├── flags_test.go # тесты применения CLI-переопределений
│ └── version.go # команда version
├── app/
│ ├── app.go # глобальные переменные: Args, Config, Cache
│ ├── config/
-│ │ └── config.go # Config, Init(), validate(), IntRange, UserAgents
+│ │ ├── config.go # Config, Init(), validate(), IntRange, UserAgents
+│ │ └── config_test.go # тесты конфигурации
│ ├── checker/
│ │ └── checker.go # CheckPlaylists(), CheckChannels(), OnPlaylistChecked
│ ├── playlist/
@@ -52,7 +54,16 @@ iptvc/
│ └── web/
│ ├── server.go # Server, Start(), StartBackgroundChecker()
│ ├── handlers.go # HTTP-обработчики
+│ ├── views.go # PlaylistView, ChannelView, PageData
+│ ├── views_test.go # тесты представлений
│ ├── 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-шаблоны
│ ├── base.html
│ ├── list.html
@@ -66,7 +77,8 @@ iptvc/
### `app`
Глобальный контейнер: `Args` (CLI-флаги), `Config` (конфигурация), `Cache` (Redis-клиент).
-`Init()` загружает конфигурацию, инициализирует логгер и подключение к кешу.
+`Init()` загружает конфигурацию и инициализирует логгер.
+`InitCache()` подключается к KeyDB/Redis, если кеш включён.
### `app.config`
@@ -86,8 +98,8 @@ iptvc/
Содержит логику проверки:
- **`PrepareListsToCheck(files, urls, codes)`** — формирует список плейлистов из файлов, URL и кодов ini-файла.
-- **`CheckPlaylists(lists)`** — параллельная проверка плейлистов (семфор `per-routine`), загрузка, парсинг, вызов `CheckChannels` для каждого.
-- **`CheckChannels(pls)`** — параллельная проверка каналов (семфор `per-routine`), HTTP-запрос с `Range` header.
+- **`CheckPlaylists(lists)`** — параллельная проверка плейлистов (семфор `max-routines`), загрузка, парсинг, вызов `CheckChannels` для каждого.
+- **`CheckChannels(pls)`** — параллельная проверка каналов (семфор `max-routines`), HTTP-запрос с `Range` header.
- **`OnPlaylistChecked`** — глобальный callback, вызывается после проверки каждого плейлиста. Используется веб-сервером для обновления in-memory кеша.
- **`cachePlaylist(pls)`** — сохранение результата в Redis (если включён).
@@ -108,7 +120,7 @@ iptvc/
- **`Server`** — структура: конфиг, кеш, шаблоны, in-memory кеш (`memCache` с `sync.RWMutex`).
- **`Start()`** — запуск HTTP-сервера.
- **`StartBackgroundChecker(opts)`** — фоновая проверка в отдельной горутине.
-- **`CheckOptions`** — параметры: Every, Repeat, Random, Files, Urls, Codes.
+- **`CheckOptions`** — параметры: Repeat, Random, Files, Urls, Codes.
Маршруты (Go 1.22 patterns):
@@ -152,9 +164,8 @@ StartBackgroundChecker:
→ check status + content type
→ OnPlaylistChecked(pls) → memCache update
→ one-cooldown sleep
- → all-cooldown sleep
- sleep(every)
- if repeat > 0 && iteration >= repeat: stop
+ → all-cooldown sleep
+ if repeat > 0 && iteration >= repeat: stop
```
## CLI-флаги
@@ -191,14 +202,16 @@ StartBackgroundChecker:
### Глобальные (`cmd/root.go`)
-| Флаг | Поле | Описание |
-| --------------- | ----------------- | ----------------- |
-| `--config` | `Args.ConfigPath` | Путь к config.yml |
-| `-v, --verbose` | `Args.Verbose` | Подробный лог |
+| Флаг | Поле | Описание |
+| --------------- | ----------------- | ------------------- |
+| `--config` | `Args.ConfigPath` | Путь к config.yml |
+| `-v, --verbose` | `Args.Verbose` | Подробный лог |
+| `--debug` | `Args.Debug` | Режим отладки |
+| `--log-level` | `Args.LogLevel` | Уровень логирования |
## Конфигурация
-Подробное описание параметров — в разделе [config.yml](../../common/config/config.md).
+Подробное описание параметров — в разделе [config.yml](../../ref/config.md).
Приоритет: Defaults < `config.yml` < Env < CLI-флаги.
diff --git a/content/iptvc/dev/compile.md b/content/iptvc/dev/compile.md
index e56fd9d..0679129 100644
--- a/content/iptvc/dev/compile.md
+++ b/content/iptvc/dev/compile.md
@@ -17,14 +17,17 @@ make linux
## Доступные рецепты Makefile
-| Команда | Назначение |
-| -------------- | ------------------------------------------------------------- |
-| `make linux` | Сборка под Linux (amd64 по умолчанию) |
-| `make win` | Сборка под Windows |
-| `make darwin` | Сборка под macOS |
-| `make release` | Сборка под все платформы (linux/windows/darwin × amd64/arm64) |
-| `make clean` | Удаление скомпилированных бинарников |
-| `make help` | Вывод списка доступных рецептов |
+| Команда | Назначение |
+| ---------------- | ------------------------------------------------------------- |
+| `make linux` | Сборка под Linux (amd64 по умолчанию) |
+| `make win` | Сборка под Windows |
+| `make darwin` | Сборка под macOS |
+| `make release` | Сборка под все платформы (linux/windows/darwin × amd64/arm64) |
+| `make test` | Запуск всех тестов |
+| `make clear` | Удаление скомпилированных бинарников |
+| `make image` | Сборка Docker-образа для текущей платформы |
+| `make image-all` | Сборка и отправка multi-arch манифеста в registry |
+| `make help` | Вывод списка доступных рецептов |
## Управление архитектурой
diff --git a/content/iptvc/dev/docker.md b/content/iptvc/dev/docker.md
index 43f8197..c3373a1 100644
--- a/content/iptvc/dev/docker.md
+++ b/content/iptvc/dev/docker.md
@@ -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
-docker build -t iptvc ./iptvc
+# Сборка бинарного файла и образа
+make image
+
+# Сборка с указанием архитектуры
+make image GOARCH=arm64
+
+# Сборка с указанием тега
+make image IMAGE_TAG=v1.1.3
```
-Можно передать версию через build-arg:
+Целевая архитектура задаётся через `GOARCH`:
```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
-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 \
-v ./playlists.ini:/app/playlists.ini \
-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 \
-v ./playlists.ini:/app/playlists.ini \
-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
diff --git a/content/iptvc/dev/docs/codicons.md b/content/iptvc/dev/docs/codicons.md
index bdde406..0174464 100644
--- a/content/iptvc/dev/docs/codicons.md
+++ b/content/iptvc/dev/docs/codicons.md
@@ -1,4 +1,6 @@
-Информацию о лицензии см. на странице [Свободное ПО](../../../legal/license.md)
+# Иконки codicons
+
+Информацию о лицензии см. на странице [Свободное ПО](../../../extra/legal/license.md)
| Иконка | Код для вставки в текст | Код для вставки в frontmatter |
| ------------------------------------------------ | -------------------------------------------------- | ------------------------------------------------ |
diff --git a/content/iptvc/dev/local-dev.md b/content/iptvc/dev/local-dev.md
index f0da736..e3b987d 100644
--- a/content/iptvc/dev/local-dev.md
+++ b/content/iptvc/dev/local-dev.md
@@ -53,9 +53,9 @@ make release
Для работы `iptvc` нужны два файла рядом с бинарником:
-- `playlists.ini` — список плейлистов. Формат описан в [справочнике форматов](../../common/formats/playlists.md).
-- `channels.json` — правила тегов каналов. Формат описан в [справочнике форматов](../../common/formats/channels.md).
-- `config.yml` — конфигурация программы. Описание — в [разделе config.yml](../../common/config/config.md).
+- `playlists.ini` — список плейлистов. Формат описан в [справочнике форматов](../../ref/formats/playlists.md).
+- `channels.json` — правила тегов каналов. Формат описан в [справочнике форматов](../../ref/formats/channels.md).
+- `config.yml` — конфигурация программы. Описание — в [разделе config.yml](../../ref/config.md).
## Полное Docker-окружение
diff --git a/content/iptvc/install.md b/content/iptvc/install.md
index fe95519..f83a3a0 100644
--- a/content/iptvc/install.md
+++ b/content/iptvc/install.md
@@ -25,7 +25,7 @@ tags: ["iptvc"]
## Запуск релизного образа
-Релизные docker-образы строятся для платформы `linux` и архитектуры `amd64`.
+Релизные docker-образы строятся для платформы `linux` и архитектур `amd64` и `arm64`.
Найти их можно здесь:
diff --git a/content/iptvc/overview.md b/content/iptvc/overview.md
index 060d7f4..6d0c9c2 100644
--- a/content/iptvc/overview.md
+++ b/content/iptvc/overview.md
@@ -49,7 +49,7 @@ hide: [toc]
[start]: quickstart.md "Перейти к разделу"
[site]: site/first-steps.md "Перейти к разделу"
[cli]: commands/index.md "Перейти к разделу"
-[cfg]: ../common/config/config.md "Перейти к разделу"
+[cfg]: ../ref/config.md "Перейти к разделу"
-Путь к локальному [ini-файлу](../../common/formats/playlists.md) с описанием плейлистов.
+Путь к локальному [ini-файлу](formats/playlists.md) с описанием плейлистов.
!!! info "Аргумент работает только для команд `check` и `serve --check`."
@@ -145,7 +144,7 @@ cache:
-Путь к локальному [json-файлу](../../common/formats/channels.md) с описанием тегов каналов.
+Путь к локальному [json-файлу](formats/channels.md) с описанием тегов каналов.
!!! info "Аргумент работает только для команд `check` и `serve --check`."
@@ -224,10 +223,10 @@ cache:
Мета-теги `` и `` для HTML-шаблонов.
-| Поле | Переменная окружения | Описание |
-| --- | --- | --- |
-| `description` | `SITE_META_DESCRIPTION` | Описание сайта в meta-тегах |
-| `keywords` | `SITE_META_KEYWORDS` | Ключевые слова через запятую |
+| Поле | Переменная окружения | Описание |
+| ------------- | ----------------------- | ---------------------------- |
+| `description` | `SITE_META_DESCRIPTION` | Описание сайта в meta-тегах |
+| `keywords` | `SITE_META_KEYWORDS` | Ключевые слова через запятую |
---
@@ -240,15 +239,6 @@ cache:
---
-### `site.header.title` { id=site-header-title }
-
-
-
-Заголовок сайта, отображается в `` и в navbar.
-Переопределяется переменной окружения `SITE_TITLE` (см. [`site.title`](#site-title)).
-
----
-
### `site.header.menu` { id=site-header-menu }
Массив элементов [`Link`](#link) в шапке сайта.
@@ -297,7 +287,7 @@ HTML-контент вкладки «Юридическая информация
| `icon` | string | Имя иконки |
| `children` | Link[] | Дочерние ссылки (выпадающее меню, один уровень вложенности) |
---8<-- "icons.md"
+--8<-- "../common/config/icons.md"
```yaml title="Пример"
site:
diff --git a/content/common/formats/channels.md b/content/ref/formats/channels.md
similarity index 100%
rename from content/common/formats/channels.md
rename to content/ref/formats/channels.md
diff --git a/content/common/formats/m3u.md b/content/ref/formats/m3u.md
similarity index 100%
rename from content/common/formats/m3u.md
rename to content/ref/formats/m3u.md
diff --git a/content/common/formats/overview.md b/content/ref/formats/overview.md
similarity index 100%
rename from content/common/formats/overview.md
rename to content/ref/formats/overview.md
diff --git a/content/common/formats/playlists.md b/content/ref/formats/playlists.md
similarity index 100%
rename from content/common/formats/playlists.md
rename to content/ref/formats/playlists.md
diff --git a/content/common/players.md b/content/ref/players.md
similarity index 88%
rename from content/common/players.md
rename to content/ref/players.md
index d2af423..fca047f 100644
--- a/content/common/players.md
+++ b/content/ref/players.md
@@ -15,7 +15,7 @@ tags: ["плееры"]
Обращайся к содержанию справа для быстрой навигации.
!!! info "Здесь не хватает очень много подробностей"
- Если ты имел дело с каким-то плеером, знаешь как его настроить или какие-то другие детали, я прошу тебя помочь [актуализировать эту страницу](support.md#participate), чтобы через это помочь другим пользователям с выбором и настройкой плеера под свои цели.
+ Если ты имел дело с каким-то плеером, знаешь как его настроить или какие-то другие детали, я прошу тебя помочь [актуализировать эту страницу](../extra/support.md#participate), чтобы через это помочь другим пользователям с выбором и настройкой плеера под свои цели.
## Кроссплатформенные
@@ -33,17 +33,17 @@ tags: ["плееры"]
Универсальный плеер практически для любого мультимедиа-контента.
??? image "Главное окно"
- 
+ 
??? image "Добавление плейлиста на десктопе"
!!! warning "Указание протокола `https://` обязательно!"
- 
- 
+ 
+ 
??? image "Добавление плейлиста на андроиде"
!!! warning "Указание протокола `https://` обязательно!"
- 
- 
+ 
+ 
### :thumbsup: IPTVnator
@@ -58,12 +58,12 @@ tags: ["плееры"]
Если использовать веб-версию, то настройки сохраняются в браузере.
??? image "Главное окно"
- 
+ 
??? image "Добавление плейлиста"
!!! warning "Указание протокола `https://` обязательно!"
- 
- 
+ 
+ 
### IPTV Web Player
@@ -75,11 +75,11 @@ tags: ["плееры"]
Подгрузка и отображение телепрограммы (используется https://cdn.epg.one/epg2.xml).
??? image "Главное окно"
- 
+ 
??? image "Добавление плейлиста"
!!! success "Указание протокола `https://` необязательно!"
- 
+ 
### Kodi
@@ -136,11 +136,11 @@ tags: ["плееры"]
Поддерживает плейлисты по ссылкам, сторонние телепрограммы, группировку каналов, изменение плейлистов и многое другое.
??? image "Главное окно"
- 
+ 
??? image "Добавление плейлиста"
!!! warning "Указание протокола `https://` обязательно!"
- 
+ 
---
@@ -174,18 +174,18 @@ tags: ["плееры"]
* Скачать: [play.google.com](https://play.google.com/store/apps/details?id=com.ottplay.ottplay)
??? image "Главный экран"
- 
- 
+ 
+ 
??? image "Добавление плейлиста"
!!! warning "Указание протокола `https://` обязательно!"
- 
- 
+ 
+ 
Из настроек:
- 
- 
+ 
+ 
И дальше те же шаги 3-5 на скриншотах выше.
@@ -202,16 +202,16 @@ tags: ["плееры"]
Программу передач нужно [подключать отдельной ссылкой](../aggregator/faq.md#epg), из плейлиста не тянет.
??? image "Главный экран"
- 
+ 
??? image "Добавление плейлиста"
!!! warning "Указание протокола `https://` обязательно!"
- 
- 
+ 
+ 
??? image "Установка User-Agent"
- 
- 
+ 
+ 
#### IPTV (Александр Софронов)
diff --git a/inline_badges.py b/inline_badges.py
index 6e27cc5..9af0945 100644
--- a/inline_badges.py
+++ b/inline_badges.py
@@ -15,7 +15,7 @@ SHORTCODE_RE = re.compile(r"