2022-09-01 11:54:43 +00:00
|
|
|
|
# Автообновляемые IPTV-плейлисты
|
2020-04-20 04:04:42 +00:00
|
|
|
|
|
2022-09-01 11:54:43 +00:00
|
|
|
|
> **Web-версия**: [https://iptv.axenov.dev/](https://iptv.axenov.dev/)
|
|
|
|
|
> **FAQ**: [https://iptv.axenov.dev/faq](https://iptv.axenov.dev/faq)
|
|
|
|
|
> **Зеркало репозитория**: https://git.axenov.dev/anthony/iptv
|
2022-06-09 03:51:25 +00:00
|
|
|
|
|
2022-09-01 11:54:43 +00:00
|
|
|
|
Проект, содержащий в себе инструменты для работы с IPTV-плейлистами:
|
2020-04-20 04:04:42 +00:00
|
|
|
|
|
2022-09-01 11:54:43 +00:00
|
|
|
|
* список автообновляемых плейлистов, которые найдены в открытых источниках;
|
|
|
|
|
* скрипты для поиска каналов в этом списке, создания своего плейлиста;
|
|
|
|
|
* веб-сервис, предоставляющий короткие ссылки на эти плейлисты и отображающий список каналов.
|
2020-04-20 04:04:42 +00:00
|
|
|
|
|
2022-09-01 11:54:43 +00:00
|
|
|
|
Плейлисты подбираются преимущественно для РФ и любых стран бывшего СНГ, но этими странами список не ограничивается.
|
2022-02-06 01:50:17 +00:00
|
|
|
|
|
|
|
|
|
Поддержкой этих плейлистов занимаются сервисы и ресурсы, указанные как источник.
|
|
|
|
|
Вопросы работоспособности плейлистов адресуйте тем, кто несёт за них ответственность.
|
|
|
|
|
|
2022-09-01 11:54:43 +00:00
|
|
|
|
Они бесплатны для использования.
|
|
|
|
|
Список проверяется и обновляется мной вручную.
|
|
|
|
|
Гарантию работоспособности никто не даёт.
|
|
|
|
|
|
|
|
|
|
## English description
|
|
|
|
|
|
|
|
|
|
> **Mirrored repo**: https://git.axenov.dev/anthony/iptv
|
|
|
|
|
|
|
|
|
|
This repo contains IPTV-playlists free to use with your media-player.
|
|
|
|
|
|
|
|
|
|
Most of them are in russian or CIS languages but you can find something interesting here for yourself.
|
|
|
|
|
|
|
|
|
|
Also there are some handy tools to make your own playlist or find channels you want in playlists listed here.
|
|
|
|
|
|
|
|
|
|
You can use this repo according to [LICENSE](LICENSE) conditions.
|
|
|
|
|
|
|
|
|
|
I'm too lazy to translate and support the whole project in ru and en, sorry, guys.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
2022-09-01 12:48:59 +00:00
|
|
|
|
## Документация
|
2022-09-01 11:54:43 +00:00
|
|
|
|
|
|
|
|
|
- [Как использовать этот список?](#howtouse)
|
|
|
|
|
- [Формат playlists.ini](#iniformat)
|
|
|
|
|
- [API](#api)
|
|
|
|
|
- [Развёртывание проекта](#deploy)
|
2022-09-04 03:58:37 +00:00
|
|
|
|
- [Расширенные возможности](#tools)
|
2022-09-01 11:54:43 +00:00
|
|
|
|
- [Как создать свой собственный плейлист](#howtomake)
|
|
|
|
|
- [Использованный стек](#stack)
|
|
|
|
|
- [Лицензия](#license)
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
<a id="howtouse"></a>
|
2022-09-02 11:09:24 +00:00
|
|
|
|
|
2022-06-04 09:03:31 +00:00
|
|
|
|
## Как использовать этот список?
|
|
|
|
|
|
2022-09-01 11:54:43 +00:00
|
|
|
|
Чтобы подключить плейлист, нужно в настройках медиаплеера указать ссылку в следующем формате:
|
2020-04-20 04:04:42 +00:00
|
|
|
|
|
|
|
|
|
```
|
2022-09-01 11:54:43 +00:00
|
|
|
|
iptv.axenov.dev/<ID>
|
|
|
|
|
iptv.axenov.dev?<ID> (устаревший формат)
|
|
|
|
|
iptv.axenov.dev/?<ID> (устаревший формат)
|
2020-04-20 04:04:42 +00:00
|
|
|
|
```
|
2022-02-06 01:50:17 +00:00
|
|
|
|
|
2022-09-01 11:54:43 +00:00
|
|
|
|
где `<ID>` - один из идентификаторов, указанных в [`playlists.ini`](playlists.ini) в квадратных скобках.
|
2020-04-20 04:04:42 +00:00
|
|
|
|
|
2022-09-01 11:54:43 +00:00
|
|
|
|
Либо провернуть всё то же самое через браузер.
|
2020-04-20 04:04:42 +00:00
|
|
|
|
|
2022-09-01 11:54:43 +00:00
|
|
|
|
<a id="iniformat"></a>
|
2022-09-02 11:09:24 +00:00
|
|
|
|
|
2022-09-01 11:54:43 +00:00
|
|
|
|
## Формат `playlists.ini`
|
|
|
|
|
|
|
|
|
|
```ini
|
2022-09-01 12:48:59 +00:00
|
|
|
|
# ID плейлиста в рамках этого конфига (обязательно)
|
2022-09-01 11:54:43 +00:00
|
|
|
|
[1]
|
|
|
|
|
|
|
|
|
|
# Название плейлиста (необязательно)
|
|
|
|
|
name = 'Рабочий и актуальный IPTV плейлист M3U'
|
|
|
|
|
|
|
|
|
|
# Краткое описание из источника или от себя (необязательно)
|
|
|
|
|
desc = 'В этом IPTV плейлисте вы найдете очень много каналов в HD качестве'
|
|
|
|
|
|
|
|
|
|
# Прямая ссылка на m3u/m3u8 плейлист (обязательно)
|
|
|
|
|
pls = 'https://example.com/pls.m3u'
|
|
|
|
|
|
|
|
|
|
# Ссылка на источник, откуда взят плейлист (необязательно)
|
|
|
|
|
src = 'https://example.com/super-duper-playlist'
|
|
|
|
|
|
|
|
|
|
[2]
|
|
|
|
|
|
|
|
|
|
# ID другого плейлиста в этом списке, на который
|
|
|
|
|
# произойдёт редирект. Нужен для мягкой смены ID.
|
|
|
|
|
redirect = 1
|
|
|
|
|
```
|
|
|
|
|
|
2022-09-01 12:48:59 +00:00
|
|
|
|
В описании любого плейлиста обязательны:
|
|
|
|
|
* ID в квадратных скобках
|
|
|
|
|
> Для удобства ввода с пульта, рекомендуется задавать числом или короткой строкой без пробелов и др. спецсимволов.
|
|
|
|
|
* параметр `pls` или `redirect`
|
|
|
|
|
> Если указаны оба, то `redirect` приоритетен.
|
2022-09-01 11:54:43 +00:00
|
|
|
|
|
|
|
|
|
Плейлистов с редиректами может быть сколько угодно, но они не должны быть цикличными.
|
|
|
|
|
|
|
|
|
|
<a id="api"></a>
|
2022-09-02 11:09:24 +00:00
|
|
|
|
|
2022-02-06 02:04:29 +00:00
|
|
|
|
## API
|
|
|
|
|
|
|
|
|
|
Можно получать состояние плейлистов из этого сборника при помощи метода:
|
|
|
|
|
|
|
|
|
|
```
|
2022-09-01 11:54:43 +00:00
|
|
|
|
GET https://iptv.axenov.dev/<ID>/json
|
2022-02-06 02:04:29 +00:00
|
|
|
|
```
|
|
|
|
|
|
2022-09-01 11:54:43 +00:00
|
|
|
|
где `ID` -- один из идентификаторов, указанных в [`playlists.ini`](playlists.ini) в квадратных скобках.
|
2022-02-06 02:04:29 +00:00
|
|
|
|
|
2022-09-01 11:54:43 +00:00
|
|
|
|
В случае успеха вернётся JSON следующего содержания:
|
2022-02-06 02:04:29 +00:00
|
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
{
|
2022-09-01 11:54:43 +00:00
|
|
|
|
"id": "p1",
|
|
|
|
|
"url": "localhost:8080/p1",
|
|
|
|
|
"name": "Каналы в SD и HD качестве (smarttvnews.ru)",
|
|
|
|
|
"desc": "Рабочий и актуальный IPTV плейлист M3U — на июнь 2022 года",
|
|
|
|
|
"pls": "https://smarttvnews.ru/apps/iptvchannels.m3u",
|
|
|
|
|
"src": "https://smarttvnews.ru/rabochiy-i-aktualnyiy-iptv-pleylist-m3u-kanalyi-v-sd-i-hd-kachestve/",
|
|
|
|
|
"status": "online",
|
|
|
|
|
"encoding": {
|
|
|
|
|
"name": "UTF-8",
|
|
|
|
|
"alert": false
|
|
|
|
|
},
|
|
|
|
|
"channels": [
|
|
|
|
|
"Channel1",
|
|
|
|
|
"Channel2",
|
|
|
|
|
"ChannelX"
|
|
|
|
|
],
|
|
|
|
|
"count": 3
|
2022-02-06 02:04:29 +00:00
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
где:
|
|
|
|
|
|
2022-09-01 12:48:59 +00:00
|
|
|
|
* `id` -- идентификатор плейлиста
|
|
|
|
|
* `name` -- название плейлиста
|
2022-09-01 11:54:43 +00:00
|
|
|
|
* `url` -- короткая ссылка, которую можно использовать для добавления плейлиста в плеер
|
2022-09-01 12:48:59 +00:00
|
|
|
|
* `desc` -- краткое описание
|
2022-09-01 11:54:43 +00:00
|
|
|
|
* `pls` -- прямая ссылка на m3u/m3u8 плейлист
|
|
|
|
|
* `src` -- ссылка на источник, откуда взят плейлист
|
2022-09-01 12:48:59 +00:00
|
|
|
|
* `status` -- статус плейлиста (`"online"|"timeout"|"offline"|"error"`)
|
2022-09-01 11:54:43 +00:00
|
|
|
|
* `encoding` -- данные о кодировке файла плейлиста
|
2022-09-01 12:48:59 +00:00
|
|
|
|
* `name` -- название кодировки (`"UTF-8"|"Windows-1251"`)
|
2022-09-02 13:24:51 +00:00
|
|
|
|
* `alert` -- признак отличия кодировки от `UTF-8`, названия каналов сконвертированы в `UTF-8`, могут быть ошибки
|
|
|
|
|
в отображении
|
2022-09-01 11:54:43 +00:00
|
|
|
|
* `channels` -- массив названий каналов
|
|
|
|
|
* `count` -- количество каналов >= 0
|
2022-02-06 02:04:29 +00:00
|
|
|
|
|
2022-09-01 11:54:43 +00:00
|
|
|
|
> Название кодировки `encoding.name` может определяться неточно!
|
2020-08-28 16:40:37 +00:00
|
|
|
|
|
2022-09-01 11:54:43 +00:00
|
|
|
|
В случае ошибки вернётся JSON в следующем формате:
|
|
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"id": "p1",
|
|
|
|
|
"url": "localhost:8080/p1",
|
|
|
|
|
"name": "Каналы в SD и HD качестве (smarttvnews.ru)",
|
|
|
|
|
"desc": "Рабочий и актуальный IPTV плейлист M3U — на июнь 2022 года",
|
|
|
|
|
"pls": "https://smarttvnews.ru/apps/iptvchannels.m3u",
|
|
|
|
|
"src": "https://smarttvnews.ru/rabochiy-i-aktualnyiy-iptv-pleylist-m3u-kanalyi-v-sd-i-hd-kachestve/",
|
|
|
|
|
"status": "offline",
|
|
|
|
|
"error": {
|
|
|
|
|
"code": 22,
|
|
|
|
|
"message": "The requested URL returned error: 404 Not Found"
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-08-28 16:40:37 +00:00
|
|
|
|
```
|
2022-06-04 09:03:31 +00:00
|
|
|
|
|
2022-09-01 11:54:43 +00:00
|
|
|
|
где:
|
|
|
|
|
|
2022-09-01 12:48:59 +00:00
|
|
|
|
* `id` -- идентификатор плейлиста
|
|
|
|
|
* `name` -- название плейлиста
|
2022-09-01 11:54:43 +00:00
|
|
|
|
* `url` -- короткая ссылка, которую можно использовать для добавления плейлиста в плеер
|
2022-09-01 12:48:59 +00:00
|
|
|
|
* `desc` -- краткое описание
|
2022-09-01 11:54:43 +00:00
|
|
|
|
* `pls` -- прямая ссылка на m3u/m3u8 плейлист
|
|
|
|
|
* `src` -- ссылка на источник, откуда взят плейлист
|
2022-09-01 12:48:59 +00:00
|
|
|
|
* `status` -- статус плейлиста (`"online"|"timeout"|"offline"|"error"`)
|
|
|
|
|
* `error` -- данные об ошибке при проверке плейлиста
|
2022-09-01 11:54:43 +00:00
|
|
|
|
* `code` -- [код ошибки curl](https://curl.se/libcurl/c/libcurl-errors.html)
|
|
|
|
|
* `message` -- текст ошибки curl
|
|
|
|
|
|
|
|
|
|
<a id="deploy"></a>
|
2022-09-02 11:09:24 +00:00
|
|
|
|
|
2022-09-01 11:54:43 +00:00
|
|
|
|
## Развёртывание проекта
|
|
|
|
|
|
2022-09-12 14:34:05 +00:00
|
|
|
|
Локально достаточно выполнить `./iptv init && ./iptv open`.
|
2022-09-02 11:09:24 +00:00
|
|
|
|
|
2022-09-12 14:34:05 +00:00
|
|
|
|
На сервере опционально можно настроить реверс-прокси до контейнера, например, чтобы настроить доступ по доменному
|
|
|
|
|
имени, изменить порт, подключить SSL-сертификаты или др.
|
2022-09-02 11:09:24 +00:00
|
|
|
|
|
2022-09-12 14:34:05 +00:00
|
|
|
|
Если на сервере, на котором запускаются контейнеры, стоит apache2, то, чтобы использовать его как реверс-прокси, нужно:
|
2022-09-01 12:48:59 +00:00
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
$ sudo a2enmod proxy proxy_http proxy_balancer lbmethod_byrequests
|
|
|
|
|
$ sudo nano /etc/apache2/sites-available/iptv.conf
|
|
|
|
|
```
|
|
|
|
|
```apacheconf
|
|
|
|
|
# example.com заменить на свой адрес
|
|
|
|
|
|
|
|
|
|
<VirtualHost example.com:80>
|
|
|
|
|
ServerName example.com
|
|
|
|
|
# обязательно без SSL:
|
|
|
|
|
ProxyPreserveHost On
|
|
|
|
|
ProxyPass / http://localhost:8080/
|
|
|
|
|
ProxyPassReverse / http://localhost:8080/
|
|
|
|
|
# обязательно для SSL:
|
|
|
|
|
# RewriteEngine on
|
|
|
|
|
# RewriteCond %{SERVER_NAME} =example.com
|
|
|
|
|
# RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
|
|
|
|
|
</VirtualHost>
|
|
|
|
|
|
|
|
|
|
# обязательно для SSL:
|
|
|
|
|
#<IfModule mod_ssl.c>
|
|
|
|
|
#<VirtualHost example.com:443>
|
|
|
|
|
# ServerName example.com
|
|
|
|
|
# ProxyPreserveHost On
|
|
|
|
|
# ProxyPass / http://localhost:8080/
|
|
|
|
|
# ProxyPassReverse / http://localhost:8080/
|
|
|
|
|
# сертификаты можно получить через certbot
|
|
|
|
|
# SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
|
|
|
|
|
# SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
|
|
|
|
|
# Include /etc/letsencrypt/options-ssl-apache.conf
|
|
|
|
|
#</VirtualHost>
|
|
|
|
|
#</IfModule>
|
|
|
|
|
|
|
|
|
|
# Ctrl+O
|
|
|
|
|
# Enter
|
|
|
|
|
# Ctrl+X
|
|
|
|
|
```
|
|
|
|
|
```shell
|
|
|
|
|
$ sudo a2ensite iptv
|
|
|
|
|
$ # для подгрузки включенных модулей выполнить именно restart, а не reload
|
|
|
|
|
$ sudo systemctl restart apache2
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
<a id="tools"></a>
|
2022-09-04 03:58:37 +00:00
|
|
|
|
## Расширенные возможности
|
2022-06-04 09:03:31 +00:00
|
|
|
|
|
2022-09-04 03:58:37 +00:00
|
|
|
|
### Собственный код html/css/js
|
|
|
|
|
|
|
|
|
|
В проекте есть директория `src/views/custom`.
|
|
|
|
|
Там можно размещать собственный код, который будет вставляться на каждой странице.
|
|
|
|
|
|
|
|
|
|
Для этого, в первую очередь, нужно выполнить:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
cp src/views/custom/custom.twig.example src/views/custom/custom.twig
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Между тегами `{% block ... %} сюда {% endblock %}` следует вставить желаемый код или текст.
|
|
|
|
|
Можно создавать новые twig-файлы рядом и подключать их внутри `custom.twig`.
|
|
|
|
|
Git будет их игнорировать, хотя можно убрать директорию из `.gitignore` и добавлять эти файлы репозиторий.
|
|
|
|
|
|
|
|
|
|
В общем случае, это можно выполнять на том сервере, на коем установлен и работает веб-сервис.
|
|
|
|
|
|
|
|
|
|
После всех правок следует очистить кеш twig (см. далее).
|
|
|
|
|
|
|
|
|
|
### Очистка кеша twig
|
2022-09-02 13:24:51 +00:00
|
|
|
|
|
|
|
|
|
Если в файле `./src/.env` параметр `TWIG_CACHE=1`, то макеты страниц компилируются однажды и потом переиспользуются.
|
|
|
|
|
Изменённые макеты не будут перекомпилироваться пока не будет очищен кеш прежних.
|
|
|
|
|
|
|
|
|
|
Для этого следует выполнить:
|
|
|
|
|
|
|
|
|
|
```
|
2022-09-02 15:49:54 +00:00
|
|
|
|
cd src && composer clear-views
|
2022-09-02 13:24:51 +00:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Скачать все плейлисты
|
|
|
|
|
|
|
|
|
|
Команда: `./tools/download-all.sh`
|
2022-06-04 09:03:31 +00:00
|
|
|
|
|
2022-10-23 12:43:56 +00:00
|
|
|
|
Скачивает все плейлисты из [`playlists.ini`](playlists.ini) в локальную директорию `./tools/downloaded/`.
|
2022-06-04 09:03:31 +00:00
|
|
|
|
|
2022-09-02 13:24:51 +00:00
|
|
|
|
### Проверить каналы плейлиста
|
|
|
|
|
|
|
|
|
|
Команда: `./tools/check-pls.sh`
|
2022-06-04 09:03:31 +00:00
|
|
|
|
|
2022-06-09 03:51:25 +00:00
|
|
|
|
Проверяет каждый канал в плейлисте на доступность и выводит результат проверки.
|
2022-06-04 09:03:31 +00:00
|
|
|
|
|
2022-09-01 11:54:43 +00:00
|
|
|
|
Поддерживаются `*.m3u` и `*.m3u8`; как локальные файлы, так по прямым ссылкам.
|
2022-06-04 09:03:31 +00:00
|
|
|
|
|
|
|
|
|
Коды ошибок доступны [здесь](https://everything.curl.dev/usingcurl/returns).
|
|
|
|
|
|
2022-09-02 13:24:51 +00:00
|
|
|
|
### Поиск каналов в одном плейлисте
|
|
|
|
|
|
|
|
|
|
Команда: `./tools/find-in-pls.sh`
|
2022-06-09 03:51:25 +00:00
|
|
|
|
|
2022-09-01 11:54:43 +00:00
|
|
|
|
Находит каналы по заданному регулярному выражению в одном указанном плейлисте.
|
2022-06-09 03:51:25 +00:00
|
|
|
|
|
2022-09-01 11:54:43 +00:00
|
|
|
|
Поддерживаются `*.m3u` и `*.m3u8`; как локальные файлы, так по прямым ссылкам.
|
2022-06-09 03:51:25 +00:00
|
|
|
|
|
2022-09-02 13:24:51 +00:00
|
|
|
|
### Поиск каналов во всех плейлистах
|
|
|
|
|
|
|
|
|
|
Команда: `./tools/find-in-all.sh`
|
2022-06-09 03:51:25 +00:00
|
|
|
|
|
2022-09-01 11:54:43 +00:00
|
|
|
|
Находит каналы по заданному регулярному выражению во всех плейлистах, скачанных через `download-all.sh`.
|
2022-06-09 03:51:25 +00:00
|
|
|
|
|
2022-09-02 13:24:51 +00:00
|
|
|
|
### Создать плейлист из нужных каналов
|
|
|
|
|
|
|
|
|
|
Команда: `./tools/make-pls.sh`
|
2022-06-09 03:51:25 +00:00
|
|
|
|
|
2022-09-01 11:54:43 +00:00
|
|
|
|
Находит каналы по заданному регулярному выражению во всех плейлистах, скачанных через `download-all.sh`.
|
2022-06-09 03:51:25 +00:00
|
|
|
|
|
2022-09-01 11:54:43 +00:00
|
|
|
|
Отличается от `find-in-all.sh` тем, что тот выводит результат в человекочитаемом формате, а этот -- в готовом m3u
|
|
|
|
|
формате для сохранения в файл.
|
2022-06-09 03:51:25 +00:00
|
|
|
|
|
2022-10-23 12:43:56 +00:00
|
|
|
|
Для сохранения в файл следует добавить `> myfile.m3u` или `>> myfile.m3u` в конец команды.
|
2022-06-09 03:51:25 +00:00
|
|
|
|
|
2022-09-01 11:54:43 +00:00
|
|
|
|
<a id="howtomake"></a>
|
2022-06-09 09:25:39 +00:00
|
|
|
|
## Как создать свой собственный плейлист?
|
2022-06-09 03:51:25 +00:00
|
|
|
|
|
2022-06-09 09:22:32 +00:00
|
|
|
|
1. Скачать все плейлисты, указанные в [`playlists.ini`](playlists.ini):
|
2022-06-09 03:51:25 +00:00
|
|
|
|
```
|
|
|
|
|
$ ./tools/download-all.sh
|
|
|
|
|
```
|
|
|
|
|
2. Вытащить из них нужные каналы и сохранить в отдельный файл:
|
|
|
|
|
```
|
|
|
|
|
$ ./tools/make-pls.sh "(fox|disney)" > my.m3u8
|
|
|
|
|
```
|
2022-09-01 11:54:43 +00:00
|
|
|
|
Так в плейлисте `./my.m3u8` окажутся все каналы из скачанных плейлистов, в названиях которых встретились `fox`
|
|
|
|
|
или `disney`.
|
2022-06-09 03:51:25 +00:00
|
|
|
|
3. Проверить доступность каналов в полученном плейлисте:
|
|
|
|
|
```
|
|
|
|
|
$ ./tools/check-pls.sh my.m3u8
|
|
|
|
|
```
|
2022-06-09 09:25:39 +00:00
|
|
|
|
> Результат `ОК` не означает, что канал действительно работает и отдаёт видео/аудио потоки.
|
|
|
|
|
> Результат `ERROR` с любыми кодами ошибок гарантированно означает, что канал не работает.
|
2022-06-09 03:51:25 +00:00
|
|
|
|
4. Вручную: удалить нерабочие, мусорные и продублировавшиеся (по ссылкам) каналы.
|
|
|
|
|
5. Вручную: добавить плейлист в IPTV-плеер и перепроверить результат.
|
|
|
|
|
|
2022-09-01 11:54:43 +00:00
|
|
|
|
<a id="stack"></a>
|
2022-09-02 11:09:24 +00:00
|
|
|
|
|
2022-09-01 11:54:43 +00:00
|
|
|
|
## Использованный стек
|
|
|
|
|
|
|
|
|
|
* [docker compose](https://docs.docker.com/compose/)
|
|
|
|
|
* [php8.1-fpm](https://www.php.net/releases/8.1/en.php)
|
|
|
|
|
* [FlightPHP](https://flightphp.com/learn)
|
|
|
|
|
* [Bootstrap 5](https://getbootstrap.com/docs/5.0/getting-started/introduction/)
|
|
|
|
|
* [nginx](https://nginx.org/ru/)
|
|
|
|
|
* bash
|
|
|
|
|
|
|
|
|
|
<a id="license"></a>
|
2022-09-02 11:09:24 +00:00
|
|
|
|
|
2022-06-09 03:51:25 +00:00
|
|
|
|
## Лицензия
|
|
|
|
|
|
|
|
|
|
[The MIT License](LICENSE)
|