From f3689b4e5bafa38e56d890229703111d0c727cb6 Mon Sep 17 00:00:00 2001 From: Scrub000 Date: Sat, 31 May 2025 21:46:03 +1000 Subject: [PATCH] [VisitNSWWaggaWaggaBridge.php] Create bridge --- bridges/VisitNSWWaggaWaggaBridge.php | 74 ++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 bridges/VisitNSWWaggaWaggaBridge.php diff --git a/bridges/VisitNSWWaggaWaggaBridge.php b/bridges/VisitNSWWaggaWaggaBridge.php new file mode 100644 index 00000000..0868d386 --- /dev/null +++ b/bridges/VisitNSWWaggaWaggaBridge.php @@ -0,0 +1,74 @@ + [ + 'name' => 'Number of pages to load', + 'type' => 'number', + 'defaultValue' => 1, + 'required' => false, + ] + ] + ]; + + public function collectData() { + $baseUri = self::URI; + $maxPages = (int)($this->getInput('pages') ?? 1); + + for ($i = 0; $i < $maxPages; $i++) { + $params = '?field_event_instance_value=' . urlencode(date('Y-m-d H:i:s')) . '&sort_by=field_event_instance_value&sort_order=ASC&page=' . $i; + $pageUrl = $i === 0 ? $baseUri : $baseUri . $params; + + $html = getSimpleHTMLDOM($pageUrl) + or returnServerError("Could not load page $i"); + + foreach ($html->find('article.event') as $event) { + $linkRel = $event->find('a.tile__product-list-link', 0)->href; + $url = urljoin(self::URI, $linkRel); + + $title = trim($event->find('h3[itemprop=name] span', 0)->plaintext); + $author = trim($event->find('div.tile__product-list-area', 0)->plaintext); + $shortDesc = $event->find('div.prod-desc', 0)->plaintext ?? ''; + $categories = [$author]; + $timestamp = time(); + + // Extract thumbnail from data-src + $imgTag = $event->find('img', 0); + $imgSrc = $imgTag ? $imgTag->getAttribute('data-src') : ''; + if ($imgSrc && str_starts_with($imgSrc, '/')) { + $imgSrc = 'https://www.visitnsw.com' . $imgSrc; + } + $imgHtml = $imgSrc ? '

' . htmlspecialchars($title) . '

' : ''; + + // Load full event page for long description + location/date + $eventHtml = getSimpleHTMLDOMCached($url, 86400); + + $descBlock = $eventHtml->find('div.collapse-content.product__overview-full div.field--item', 0); + $fullDescription = $descBlock ? $descBlock->innertext : htmlspecialchars($shortDesc); + + $locationSpan = $eventHtml->find('span.atdw-product__venue', 0); + $dateDiv = $eventHtml->find('div.atdw-product__event-date', 0); + $location = $locationSpan ? trim($locationSpan->plaintext) : 'Location unknown'; + $dateText = $dateDiv ? trim($dateDiv->plaintext) : 'Date unknown'; + + $infoLine = '

Location: ' . htmlspecialchars($location) . ' | Date: ' . $dateText . '

'; + $content = $imgHtml . $infoLine . $fullDescription; + + $this->items[] = [ + 'title' => $title, + 'uri' => $url, + 'author' => $author, + 'timestamp' => $timestamp, + 'content' => $content ?: 'Content not found.', + 'categories' => $categories, + ]; + } + } + } +}