diff --git a/app/Core/Bot.php b/app/Core/Bot.php index 384d514..1f7f1b5 100644 --- a/app/Core/Bot.php +++ b/app/Core/Bot.php @@ -216,7 +216,7 @@ class Bot } } - $replyText[] = "🔗 *Ссылка для ТВ:* \(скопируй подходящую\)"; + $replyText[] = "🔗 *Короткая ссылка:* \(скопируй подходящую\)"; if (config('app.mirror_url')) { $replyText[] = '\- `' . mirror_url("$code") . '`'; $replyText[] = '\- `' . mirror_url("$code.m3u") . '`'; diff --git a/app/Core/TwigExtention.php b/app/Core/TwigExtention.php index 33732a0..bd4d254 100644 --- a/app/Core/TwigExtention.php +++ b/app/Core/TwigExtention.php @@ -10,6 +10,7 @@ declare(strict_types=1); namespace App\Core; use Twig\Extension\AbstractExtension; +use Twig\TwigFilter; use Twig\TwigFunction; /** @@ -33,6 +34,17 @@ class TwigExtention extends AbstractExtension ]; } + /** + * @inheritDoc + * @noinspection PhpUnused + */ + public function getFilters(): array + { + return [ + new TwigFilter('values', [$this, 'arrayValues']), + ]; + } + /** * Возвращает значение из конфига * @@ -88,4 +100,9 @@ class TwigExtention extends AbstractExtension { return $timestamp === null ? '' : date($format, (int)$timestamp); } + + public function arrayValues($value, ...$args) + { + return is_array($value) ? array_values($value) : $value; + } } diff --git a/views/details.twig b/views/details.twig index 6ec568c..56cca51 100644 --- a/views/details.twig +++ b/views/details.twig @@ -31,11 +31,6 @@ {% block header %}

О плейлисте: {{ playlist.name }}

- {% if playlist.isOnline is same as (false) %} - - {% endif %} {% endblock %} {% block content %} @@ -101,7 +96,7 @@

{{ playlist.description }}

- Ccылка для ТВ + Короткая ссылка

Все права на торговые марки и графические изображения принадлежат их законным владельцам. - Если вы являетесь правообладателем и считаете, что сведения на этой странице затрагивают ваши - права, вот какие меры вы можете предпринять прямо сейчас: + Если вы являетесь правообладателем и считаете, что сведения на этой странице затрагивают ваши права, вы можете направить конфиденциальное уведомление на адрес abuse@m3u.su. +

+

+ Плейлисты, нарушающие законодательство, удаляются с сайта окончательно по факту обращения от правообладателя.

- @@ -273,12 +253,10 @@ {% if (playlist.groups|length > 1) %}
- {% if (playlist.channels|length >= 500) %} - {% endblock %} {% block footer %} - - + + + const options = { + searchColumns: ['title'], + item: (channel) => getChannelTemplate(channel), + }; + const values = {{ playlist.channels|values|json_encode|raw }} + + const list = new List('chlist', options, values) + list.on('updated', (data) => document.getElementById('chcount').innerText = data.visibleItems.length) + document.getElementById('search-field').addEventListener('keyup', (e) => list.search(e.target.value)) + + document.addEventListener("DOMContentLoaded", () => { + const alert = document.getElementById("chListLoading") + !!alert && alert.remove() + }); + + + function savePlaylist() { + const link = document.createElement("a"); + const content = document.getElementById("m3u-raw").value + const file = new Blob([content], { type: 'text/plain' }); + link.href = URL.createObjectURL(file); + link.download = "{{ playlist.code }}.m3u8"; + link.click(); + URL.revokeObjectURL(link.href); + } + + function resetGroup() { + document.getElementById('groupSelector').value = 'all' + updateFilter() + } + + function resetSearch() { + list.search('') + document.getElementById('search-field').value = '' + document.getElementById('chfAll').checked = true + document.querySelectorAll('input[id*="btn-tag-"]:checked').forEach(tag => tag.checked = false) + updateFilter() + } + + function updateFilter() { + const selectedGroupId = document.getElementById('groupSelector')?.value ?? 'all'; + const tagsElements = document.querySelectorAll('input[id*="btn-tag-"]:checked') + const tagsSelected = [] + tagsElements.forEach(tag => tagsSelected.push(tag.attributes['data-tag'].value)); + const activeType = document.querySelector('input[name="chFilter"]:checked').id; + switch (activeType) { + case 'chfAll': + list.filter(item => { + const chTags = item.values().tags + const isGroupValid = item.values().groupId === selectedGroupId || selectedGroupId === 'all'; + const tagsIntersection = tagsSelected.filter(tagSelected => chTags.includes(tagSelected)); + const hasValidTags = tagsIntersection.length > 0 || tagsSelected.length === 0; + return isGroupValid && hasValidTags; + }) + break + + case 'chfOnline': + list.filter(item => { + const isOnline = item.values().isOnline + const chTags = item.values().tags + const isGroupValid = item.values().groupId === selectedGroupId || selectedGroupId === 'all'; + const tagsIntersection = tagsSelected.filter(tagSelected => chTags.includes(tagSelected)); + const hasValidTags = tagsIntersection.length > 0 || tagsSelected.length === 0; + return isGroupValid && isOnline && hasValidTags + }) + break + + case 'chfOffline': + list.filter(item => { + const isOffline = !item.values().isOnline + const chTags = item.values().tags + const isGroupValid = item.values().groupId === selectedGroupId || selectedGroupId === 'all'; + const tagsIntersection = tagsSelected.filter(tagSelected => chTags.includes(tagSelected)); + const hasValidTags = tagsIntersection.length > 0 || tagsSelected.length === 0; + return isGroupValid && isOffline && hasValidTags + }) + break + } + } + + {% endif %} {% endblock %} diff --git a/views/template.twig b/views/template.twig index eefb058..cefc3cc 100644 --- a/views/template.twig +++ b/views/template.twig @@ -134,9 +134,6 @@
- - {% block footer %}{% endblock %} -
+ + {% block footer %}{% endblock %} +