Compare commits

...

4 Commits

10 changed files with 60 additions and 12 deletions

2
.gitignore vendored
View File

@ -3,6 +3,8 @@
/downloaded
/src/cache/*
/src/vendor
/src/views/custom/*
!/src/views/custom/custom.twig.example
*.log
.env
*.m3u

View File

@ -41,7 +41,7 @@ I'm too lazy to translate and support the whole project in ru and en, sorry, guy
- [Формат playlists.ini](#iniformat)
- [API](#api)
- [Развёртывание проекта](#deploy)
- [Дополнительные инструменты](#tools)
- [Расширенные возможности](#tools)
- [Как создать свой собственный плейлист](#howtomake)
- [Использованный стек](#stack)
- [Лицензия](#license)
@ -247,9 +247,28 @@ $ sudo systemctl restart apache2
<a id="tools"></a>
## Дополнительные инструменты
## Расширенные возможности
### Очистка кеша Twig
### Собственный код 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
Если в файле `./src/.env` параметр `TWIG_CACHE=1`, то макеты страниц компилируются однажды и потом переиспользуются.
Изменённые макеты не будут перекомпилироваться пока не будет очищен кеш прежних.

View File

@ -5,3 +5,5 @@ TWIG_DEBUG=0
FLIGHT_CASE_SENSITIVE=0
FLIGHT_HANDLE_ERRORS=1
FLIGHT_LOG_ERRORS=1
PAGE_SIZE=10
SORT_BY=

View File

@ -18,6 +18,15 @@ class HomeController extends Controller
$this->ini = new PlaylistProcessor();
}
/**
* @return int
*/
protected function getPageSize(): int
{
$size = config('app.page_size');
return empty($size) || $size < 5 || $size > 100 ? 10 : $size;
}
/**
* @throws Exception
*/
@ -28,11 +37,12 @@ class HomeController extends Controller
Flight::redirect(base_url($id));
die;
}
$per_page = 10;
$list = $this->ini->playlists
->where('redirect_id', null)
// ->sortBy('id')
->forPage($page, $per_page);
$per_page = $this->getPageSize();
$list = $this->ini->playlists->where('redirect_id', null);
if (config('app.sort_by')) {
$list = $list->sortBy(config('app.sort_by'));
}
$list = $list->forPage($page, $per_page);
view('list', [
'updated_at' => $this->ini->updatedAt(),
'count' => $this->ini->playlists->count(),

View File

@ -49,7 +49,7 @@ final class PlaylistProcessor
return $code < 400;
}
protected function fetch(string $id)
protected function fetch(string $id): array
{
$curl = curl_init();
curl_setopt_array($curl, [

View File

@ -13,6 +13,7 @@ class TwigFunctions extends AbstractExtension
{
return [
new TwigFunction('config', [$this, 'config']),
new TwigFunction('is_file', [$this, 'is_file']),
new TwigFunction('base_url', [$this, 'base_url']),
];
}
@ -26,4 +27,9 @@ class TwigFunctions extends AbstractExtension
{
return base_url($path);
}
public function is_file(string $path): bool
{
return is_file($path);
}
}

View File

@ -26,5 +26,7 @@ return [
// 'CP866',
// 'ISO-8859-5',
],
'page_size' => (int)(env('PAGE_SIZE', 10)),
'sort_by' => env('SORT_BY'),
],
];

View File

View File

@ -0,0 +1,6 @@
{# Файл для включения кастомных блоков #}
{% block head %}{# ваш код здесь #}{% endblock %}
{% block header %}{# ваш код здесь #}{% endblock %}
{% block content %}{# ваш код здесь #}{% endblock %}
{% block footer %}{# ваш код здесь #}{% endblock %}

View File

@ -6,7 +6,6 @@
<meta name="description" content="Самообновляемые бесплатные IPTV-плейлисты для домашнего просмотра по коротким ссылкам, списки каналов, проверка доступности">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<style>.cursor-pointer{cursor:pointer}</style>
<link href="{{ base_url('css/bootstrap.min.css') }}" rel="stylesheet">
<link rel="apple-touch-icon" sizes="180x180" href="{{ base_url('/favicon/apple-touch-icon.png') }}">
@ -17,8 +16,7 @@
<meta name="msapplication-TileColor" content="#00aba9">
<meta name="msapplication-TileImage" content="{{ base_url('/favicon/mstile-144x144.png') }}">
<meta name="theme-color" content="#212529">
{% block head %}{% endblock %}
</head>
<body class="bg-dark text-light">
<div class="container col-lg-8 mx-auto">
@ -67,5 +65,8 @@
href="https://axenov.dev">axenov.dev</a>
</footer>
</div>
{% if is_file("custom/custom.twig") %}
{% include "custom/custom.twig" %}
{% endif %}
</body>
</html>