Global Search
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user