<?php class CrewbayBridge extends BridgeAbstract { const MAINTAINER = 'couraudt'; const NAME = 'Crewbay Bridge'; const URI = 'https://www.crewbay.com'; const DESCRIPTION = 'Returns the newest sailing offers.'; const PARAMETERS = [ [ 'keyword' => [ 'name' => 'Filter by keyword', 'title' => 'Enter the keyword to filter here' ], 'type' => [ 'name' => 'Type of search', 'title' => 'Choose between finding a boat or a crew', 'type' => 'list', 'values' => [ 'Find a boat' => 'boats', 'Find a crew' => 'crew' ] ], 'status' => [ 'name' => 'Status on the boat', 'title' => 'Choose between recreational or professional classified ads', 'type' => 'list', 'values' => [ 'Recreational' => 'recreational', 'Professional' => 'professional' ] ], 'recreational_position' => [ 'name' => 'Recreational position wanted', 'title' => 'Filter by recreational position you wanted aboard', 'required' => false, 'type' => 'list', 'values' => [ '' => '', 'Amateur Crew' => 'Amateur Crew', 'Friendship' => 'Friendship', 'Competent Crew' => 'Competent Crew', 'Racing' => 'Racing', 'Voluntary work' => 'Voluntary work', 'Mile building' => 'Mile building' ] ], 'professional_position' => [ 'name' => 'Professional position wanted', 'title' => 'Filter by professional position you wanted aboard', 'required' => false, 'type' => 'list', 'values' => [ '' => '', '1st Engineer' => '1st Engineer', '1st Mate' => '1st Mate', 'Beautician' => 'Beautician', 'Bosun' => 'Bosun', 'Captain' => 'Captain', 'Chef' => 'Chef', 'Steward(ess)' => 'Steward(ess)', 'Deckhand' => 'Deckhand', 'Delivery Crew' => 'Delivery Crew', 'Dive Instructor' => 'Dive Instructor', 'Masseur' => 'Masseur', 'Medical Staff' => 'Medical Staff', 'Nanny' => 'Nanny', 'Navigator' => 'Navigator', 'Racing Crew' => 'Racing Crew', 'Teacher' => 'Teacher', 'Electrical Engineer' => 'Electrical Engineer', 'Fitter' => 'Fitter', '2nd Engineer' => '2nd Engineer', '3rd Engineer' => '3rd Engineer', 'Lead Deckhand' => 'Lead Deckhand', 'Security Officer' => 'Security Officer', 'O.O.W' => 'O.O.W', '1st Officer' => '1st Officer', '2nd Officer' => '2nd Officer', '3rd Officer' => '3rd Officer', 'Captain/Engineer' => 'Captain/Engineer', 'Hairdresser' => 'Hairdresser', 'Fitness Trainer' => 'Fitness Trainer', 'Laundry' => 'Laundry', 'Solo Steward/ess' => 'Solo Steward/ess', 'Stew/Deck' => 'Stew/Deck', '2nd Steward/ess' => '2nd Steward/ess', '3rd Steward/ess' => '3rd Steward/ess', 'Chief Steward/ess' => 'Chief Steward/ess', 'Head Housekeeper' => 'Head Housekeeper', 'Purser' => 'Purser', 'Cook' => 'Cook', 'Cook/Stew' => 'Cook/Stew', '2nd Chef' => '2nd Chef', 'Head Chef' => 'Head Chef', 'Administrator' => 'Administrator', 'P.A' => 'P.A', 'Villa staff' => 'Villa staff', 'Housekeeping/Stew' => 'Housekeeping/Stew', 'Stew/Beautician' => 'Stew/Beautician', 'Stew/Masseuse' => 'Stew/Masseuse', 'Manager' => 'Manager', 'Sailing instructor' => 'Sailing instructor' ] ] ] ]; public function collectData() { $url = $this->getURI(); $html = getSimpleHTMLDOM($url) or returnClientError('No results for this query.'); $annonces = $html->find('#SearchResults div.result'); $limit = 0; foreach ($annonces as $annonce) { $detail = $annonce->find('.btn--profile', 0); $htmlDetail = getSimpleHTMLDOMCached($detail->href); if (!empty($this->getInput('recreational_position')) || !empty($this->getInput('professional_position'))) { if ($this->getInput('type') == 'boats') { if ($this->getInput('status') == 'professional') { $positions = [$annonce->find('.title .position', 0)->plaintext]; } else { $positions = [str_replace('Wanted:', '', $annonce->find('.content li', 0)->plaintext)]; } } else { $list = $htmlDetail->find('.viewer-details .viewer-list'); $positions = explode("\r\n", end($list)->find('span.value', 0)->plaintext); } $found = false; $keyword = $this->getInput('status') == 'professional' ? 'professional_position' : 'recreational_position'; foreach ($positions as $position) { if (strpos(trim($position), $this->getInput($keyword)) !== false) { $found = true; break; } } if (!$found) { continue; } } $item = []; if ($this->getInput('type') == 'boats') { $titleSelector = '.title h2'; } else { $titleSelector = '.layout__item h2'; } $userName = $annonce->find('.result--description a', 0)->plaintext; $annonceTitle = trim($annonce->find($titleSelector, 0)->plaintext); if (empty($annonceTitle)) { $item['title'] = $userName; } else { $item['title'] = $userName . ' - ' . $annonceTitle; } $item['uri'] = $detail->href; $images = $annonce->find('.avatar img'); $item['enclosures'] = [end($images)->getAttribute('src')]; $content = $htmlDetail->find('.viewer-intro--info', 0)->innertext; $sections = $htmlDetail->find('.viewer-container .viewer-section'); foreach ($sections as $section) { if ($section->find('.viewer-section-title', 0)) { $class = str_replace('viewer-', '', explode(' ', $section->getAttribute('class'))[0]); if (!in_array($class, ['apply', 'photos', 'reviews', 'contact', 'experience', 'qa'])) { // Basic sections $content .= $section->find('.viewer-section-title h3', 0)->outertext; $content .= $section->find('.viewer-section-content', 0)->innertext; } } else { // Info section $content .= $section->find('.viewer-section-content h3', 0)->outertext; $content .= $section->find('.viewer-section-content p', 0)->outertext; } } if (!empty($this->getInput('keyword'))) { $keyword = strtolower($this->getInput('keyword')); if (strpos(strtolower($item['title']), $keyword) === false) { if (strpos(strtolower($content), $keyword) === false) { continue; } } } $item['content'] = $content; $tags = $htmlDetail->find('li.viewer-tags--tag'); foreach ($tags as $tag) { if (!isset($item['categories'])) { $item['categories'] = []; } $text = trim($tag->plaintext); if (!in_array($text, $item['categories'])) { $item['categories'][] = $text; } } $this->items[] = $item; $limit += 1; if ($limit == 10) { break; } } } public function getURI() { $uri = parent::getURI(); if ($this->getInput('type') == 'boats') { $uri .= '/boats'; } else { $uri .= '/crew'; } if ($this->getInput('status') == 'professional') { $uri .= '/professional'; } else { $uri .= '/recreational'; } return $uri; } }