diff --git a/app/Core/IniFile.php b/app/Core/IniFile.php index 610c165..2fd7a47 100644 --- a/app/Core/IniFile.php +++ b/app/Core/IniFile.php @@ -126,16 +126,63 @@ class IniFile } $data['hasCatchup'] = str_contains($data['content'] ?? '', 'catchup'); - $data['hasTvg'] = !empty($data['attributes']['url-tvg']) - || !empty($data['attributes']['x-tvg-url']); + $data['hasTvg'] = !empty($data['attributes']['url-tvg']) || !empty($data['attributes']['x-tvg-url']); + $data['hasTokens'] = $this->hasTokens($data); $data['tags'] = []; - foreach ($data['channels'] as $channel) { + foreach ($data['channels'] as &$channel) { $data['tags'] = array_merge($data['tags'], $channel['tags']); + $channel['hasToken'] = $this->hasTokens($channel); } $data['tags'] = array_values(array_unique($data['tags'])); sort($data['tags']); return $data; } + + /** + * Проверяет наличие токенов в плейлисте + * + * Сделано именно так, а не через тег unstable, чтобы разделить логику: есть заведомо нестабильные каналы, + * которые могут не транслироваться круглосуточно, а есть платные круглосуточные, которые могут оборваться + * в любой момент. + * + * @param array $data + * @return bool + */ + protected function hasTokens(array $data): bool + { + $string = ($data['url'] ?? '') . ($data['content'] ?? ''); + if (empty($string)) { + return false; + } + + $badAttributes = [ + // токены и ключи + '[?&]token=', + '[?&]drmreq=', + // логины + '[?&]u=', + '[?&]user=', + '[?&]username=', + // пароли + '[?&]p=', + '[?&]pwd=', + '[?&]password=', + // неизвестные + // 'free=true', + // 'uid=', + // 'c_uniq_tag=', + // 'rlkey=', + // '?s=', + // '&s=', + // '?q=', + // '&q=', + ]; + + return array_any( + $badAttributes, + static fn (string $badAttribute) => preg_match_all("/$badAttribute/", $string) >= 1, + ); + } } diff --git a/views/details.twig b/views/details.twig index e1a124e..0431c6d 100644 --- a/views/details.twig +++ b/views/details.twig @@ -81,17 +81,20 @@
| {{ loop.index }} | +|||
| {{ loop.index }} | -
- {% if (channel.attributes['tvg-logo']) %}
-
- {% endif %}
- |
+
+ {% if (channel.attributes['tvg-logo']) %}
+
+ {% endif %}
+ |
-
-
- {% if (channel.attributes['tvg-id']) %}
-
-
- {% endif %}
- {% if (channel.contentType != null) %}
-
-
- {% endif %}
- {% if channel.tags|length > 0 %}
-
+ {% if (channel.attributes['tvg-id']) %}
+
+
- |
-
{{ playlist.description }}
+{{ playlist.description }}
{% endif %}