diff --git a/AntenneBayernBridge.php b/AntenneBayernBridge.php new file mode 100644 index 0000000..120155c --- /dev/null +++ b/AntenneBayernBridge.php @@ -0,0 +1,183 @@ + [ + 'name' => 'Kategorie', + 'type' => 'list', + 'required' => true, + 'values' => [ + 'Bayern' => 'bayern', + 'Deutschland' => 'deutschland', + 'Welt' => 'welt', + 'Sport' => 'sport', + 'Stars' => 'stars', + 'Eilmeldungen' => 'eilmeldungen' + ] + ] + ] + ]; + + public function getIcon() + { + return 'https://www.google.com/s2/favicons?domain=www.antenne.de&sz=32'; + } + + public function collectData() + { + $category = $this->getInput('category'); + $url = 'https://www.antenne.de/nachrichten/' . $category . '/'; + + $html = getSimpleHTMLDOM($url); + + if (!$html) { + throw new \Exception('Konnte die Antenne Bayern Nachrichten-Seite nicht laden: ' . $url); + } + + // Finde alle l-cardgrid__items Container + $cardGrids = $html->find('.l-cardgrid__items'); + + if (empty($cardGrids)) { + throw new \Exception('Keine Artikel-Container gefunden auf der Seite'); + } + + // Iteriere durch alle Cardgrid-Container + foreach ($cardGrids as $cardGrid) { + // Finde alle Artikel-Items in diesem Container + $articleItems = $cardGrid->find('.l-cardgrid__item'); + + foreach ($articleItems as $articleItem) { + $newsItem = $articleItem->find('.c-card', 0); + if (!$newsItem) { + continue; + } + + $item = []; + + // Link extrahieren + $link = $newsItem->find('a.u-faux-block-link-overlay', 0); + if (!$link) { + continue; + } + + $item['uri'] = $link->href; + if (strpos($item['uri'], 'http') !== 0) { + $item['uri'] = self::URI . ltrim($item['uri'], '/'); + } + + // Titel aus h3 + $titleElement = $newsItem->find('h3.o-headline', 0); + if ($titleElement) { + $item['title'] = trim($titleElement->plaintext); + } else { + continue; // Überspringe Artikel ohne Titel + } + + // Bild extrahieren + $image = $newsItem->find('figure.c-image img', 0); + $imageUrl = null; + + if ($image) { + // Versuche verschiedene Bild-Attribute + if (isset($image->src) && !empty($image->src) && strpos($image->src, 'data:image') !== 0) { + $imageUrl = $image->src; + } elseif (isset($image->{'data-src'}) && !empty($image->{'data-src'})) { + $imageUrl = $image->{'data-src'}; + } + + if ($imageUrl) { + // Stelle sicher, dass die URL absolut ist + if (strpos($imageUrl, 'http') !== 0) { + $imageUrl = self::URI . ltrim($imageUrl, '/'); + } + + $item['enclosures'] = [$imageUrl]; + } + } + + // Beschreibung extrahieren + $description = $newsItem->find('p.c-card__text', 0); + if ($description) { + $descriptionText = trim($description->plaintext); + + // Content zusammenbauen: Bild + Beschreibung + $content = ''; + if ($imageUrl) { + $content .= '' . htmlspecialchars($item['title']) . '

'; + } + $content .= '

' . htmlspecialchars($descriptionText) . '

'; + + $item['content'] = $content; + } elseif ($imageUrl) { + // Nur Bild, wenn keine Beschreibung vorhanden + $item['content'] = '' . htmlspecialchars($item['title']) . ''; + } else { + $item['content'] = ''; + } + + // Kategorie-Flag extrahieren (optional) + $categoryFlag = $newsItem->find('small.c-image__flag', 0); + if ($categoryFlag) { + $categoryText = trim($categoryFlag->plaintext); + if (!empty($categoryText)) { + $item['categories'] = [$categoryText]; + } + } + + // Timestamp von der Artikelseite holen + $item['timestamp'] = $this->extractTimestamp($item['uri']); + + // Autor setzen + $item['author'] = 'Antenne Bayern'; + + $this->items[] = $item; + + // Limitiere auf 10 Artikel + if (count($this->items) >= 10) { + break 2; // Breche beide Schleifen ab + } + } + } + } + + private function extractTimestamp($articleUrl) + { + try { + $articleHtml = getSimpleHTMLDOM($articleUrl); + + if (!$articleHtml) { + return time(); // Fallback + } + + // Suche nach dem datePublished time-Element + $timeElement = $articleHtml->find('time[itemprop="datePublished"]', 0); + + if ($timeElement && isset($timeElement->datetime)) { + $datetime = $timeElement->datetime; + + // Parse das Datetime-Format: "2025-12-10 13:48" + $timestamp = strtotime($datetime); + + if ($timestamp !== false) { + return $timestamp; + } + } + + // Fallback auf aktuelle Zeit + return time(); + } catch (\Exception $e) { + // Bei Fehler: Fallback auf aktuelle Zeit + return time(); + } + } +} diff --git a/README.md b/README.md index 433ef1a..fbcbf89 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,15 @@ Diese Sammlung enthält verschiedene Bridge-Implementierungen für RSS-Bridge, u ### [Ananta Game News Bridge](https://bridge.ponywave.de/#bridge-AnantaBridge) (Von Akamaru) - **Beschreibung**: Zeigt die neuesten Nachrichten von Ananta Game +### [Antenne Bayern Nachrichten Bridge](https://bridge.ponywave.de/#bridge-AntenneBayernBridge) (Von Akamaru) +- **Beschreibung**: Aktuelle Nachrichten von Antenne Bayern +- **Parameter**: + - **Kategorie**: Bayern, Deutschland, Welt, Sport, Stars, Eilmeldungen +- **Hinweise**: + - Zeigt bis zu 10 aktuelle Nachrichten-Artikel + - Enthält Titel, Beschreibung, Datum, Kategorie und Bilder + - Zeitstempel werden von den Artikelseiten extrahiert + ### [App Store Update Bridge](https://bridge.ponywave.de/#bridge-AppStoreUpdateBridge) (Von Akamaru) - **Beschreibung**: Zeigt App-Updates aus dem Apple App Store (Release Notes) - **Parameter**: