Compare commits
4 Commits
b65ab2cca0
...
1edf1d8455
Author | SHA1 | Date |
---|---|---|
Anthony Axenov | 1edf1d8455 | |
Anthony Axenov | 17ecc60497 | |
Anthony Axenov | d2bc1678f5 | |
Anthony Axenov | a868b677f0 |
|
@ -3,6 +3,8 @@
|
|||
/downloaded
|
||||
/src/cache/*
|
||||
/src/vendor
|
||||
/src/views/custom/*
|
||||
!/src/views/custom/custom.twig.example
|
||||
*.log
|
||||
.env
|
||||
*.m3u
|
||||
|
|
25
README.md
25
README.md
|
@ -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`, то макеты страниц компилируются однажды и потом переиспользуются.
|
||||
Изменённые макеты не будут перекомпилироваться пока не будет очищен кеш прежних.
|
||||
|
|
|
@ -5,3 +5,5 @@ TWIG_DEBUG=0
|
|||
FLIGHT_CASE_SENSITIVE=0
|
||||
FLIGHT_HANDLE_ERRORS=1
|
||||
FLIGHT_LOG_ERRORS=1
|
||||
PAGE_SIZE=10
|
||||
SORT_BY=
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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, [
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,5 +26,7 @@ return [
|
|||
// 'CP866',
|
||||
// 'ISO-8859-5',
|
||||
],
|
||||
'page_size' => (int)(env('PAGE_SIZE', 10)),
|
||||
'sort_by' => env('SORT_BY'),
|
||||
],
|
||||
];
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
{# Файл для включения кастомных блоков #}
|
||||
|
||||
{% block head %}{# ваш код здесь #}{% endblock %}
|
||||
{% block header %}{# ваш код здесь #}{% endblock %}
|
||||
{% block content %}{# ваш код здесь #}{% endblock %}
|
||||
{% block footer %}{# ваш код здесь #}{% endblock %}
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue