Global Search

This commit is contained in:
Gogs
2026-07-10 11:56:37 +02:00
parent 4567e77343
commit d3973fbf9e
8 changed files with 914 additions and 107 deletions
+140
View File
@@ -213,6 +213,146 @@ class ProgrammeService
return $items;
}
public function search(
Config $config,
array $data,
string $query,
int $limit = 20
): array {
$query = trim($query);
$limit = max(1, min(50, $limit));
if (mb_strlen($query) < 2) {
return [];
}
$channelConfig = $config->getChannels();
$tz = new DateTimeZone($this->timezone);
$dayStart = new DateTime('today', $tz);
$dayEnd = clone $dayStart;
$dayEnd->modify('+1 day');
$startTs = $dayStart->getTimestamp();
$endTs = $dayEnd->getTimestamp();
$channelResults = [];
$programmeResults = [];
foreach ($data['channels'] ?? [] as $channelId => $channel) {
$cfg = $channelConfig[$channelId] ?? [];
if (($cfg['enabled'] ?? true) !== true) {
continue;
}
$channelName = $cfg['name'] ?? $channel['name'] ?? $channelId;
$channelNumber = (int)($cfg['number'] ?? 999999);
$channelIcon = $cfg['icon'] ?? $channel['icon'] ?? '';
$favorite = (bool)($cfg['favorite'] ?? false);
if (mb_stripos($channelName, $query) !== false) {
$channelResults[] = [
'type' => 'channel',
'channel_id' => $channelId,
'channel_name' => $channelName,
'channel_number' => $channelNumber,
'channel_icon' => $channelIcon,
'favorite' => $favorite,
];
}
foreach ($channel['programmes'] ?? [] as $programme) {
$start = (int)($programme['start'] ?? 0);
$stop = (int)($programme['stop'] ?? 0);
// Nur Sendungen, die den heutigen Tag berühren
if ($start >= $endTs || $stop <= $startTs) {
continue;
}
$title = trim((string)($programme['title'] ?? ''));
$subtitle = trim((string)($programme['subtitle'] ?? ''));
$matches =
mb_stripos($title, $query) !== false ||
mb_stripos($subtitle, $query) !== false;
if (!$matches) {
continue;
}
$startDateTime = (new DateTime())
->setTimestamp($start)
->setTimezone($tz);
$stopDateTime = (new DateTime())
->setTimestamp($stop)
->setTimezone($tz);
$programmeResults[] = [
'type' => 'programme',
'id' => md5(
$channelId . '|' .
$start . '|' .
$stop . '|' .
$title
),
'channel_id' => $channelId,
'channel_name' => $channelName,
'channel_number' => $channelNumber,
'channel_icon' => $channelIcon,
'favorite' => $favorite,
'title' => $title,
'subtitle' => $subtitle,
'description' => $programme['description'] ?? '',
'category' => $programme['category'] ?? '',
'metadata' => $programme['metadata'] ?? [],
'year' => $programme['year'] ?? '',
'rating' => $programme['rating'] ?? '',
'episode' => $programme['episode'] ?? '',
'icon' => $programme['icon'] ?? '',
'start' => $start,
'stop' => $stop,
'start_time' => $startDateTime->format('H:i'),
'stop_time' => $stopDateTime->format('H:i'),
'date' => $startDateTime->format('Y-m-d'),
'is_current' => time() >= $start && time() < $stop,
'is_past' => $stop <= time(),
];
}
}
usort($channelResults, function (array $a, array $b): int {
return [
$a['channel_number'],
mb_strtolower($a['channel_name']),
] <=> [
$b['channel_number'],
mb_strtolower($b['channel_name']),
];
});
usort($programmeResults, function (array $a, array $b): int {
return [
$a['start'],
$a['channel_number'],
] <=> [
$b['start'],
$b['channel_number'],
];
});
return array_slice(
array_merge($channelResults, $programmeResults),
0,
$limit
);
}
private function getGenreIcon(string $category): string
{
$category = mb_strtolower($category);