diff options
Diffstat (limited to 'bridges/CrewbayBridge.php')
-rw-r--r-- | bridges/CrewbayBridge.php | 456 |
1 files changed, 231 insertions, 225 deletions
diff --git a/bridges/CrewbayBridge.php b/bridges/CrewbayBridge.php index a3c52b9a..0ca017c2 100644 --- a/bridges/CrewbayBridge.php +++ b/bridges/CrewbayBridge.php @@ -1,227 +1,233 @@ <?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 = array( - array( - 'keyword' => array( - 'name' => 'Filter by keyword', - 'title' => 'Enter the keyword to filter here' - ), - 'type' => array( - 'name' => 'Type of search', - 'title' => 'Choose between finding a boat or a crew', - 'type' => 'list', - 'values' => array( - 'Find a boat' => 'boats', - 'Find a crew' => 'crew' - ) - ), - 'status' => array( - 'name' => 'Status on the boat', - 'title' => 'Choose between recreational or professional classified ads', - 'type' => 'list', - 'values' => array( - 'Recreational' => 'recreational', - 'Professional' => 'professional' - ) - ), - 'recreational_position' => array( - 'name' => 'Recreational position wanted', - 'title' => 'Filter by recreational position you wanted aboard', - 'required' => false, - 'type' => 'list', - 'values' => array( - '' => '', - 'Amateur Crew' => 'Amateur Crew', - 'Friendship' => 'Friendship', - 'Competent Crew' => 'Competent Crew', - 'Racing' => 'Racing', - 'Voluntary work' => 'Voluntary work', - 'Mile building' => 'Mile building' - ) - ), - 'professional_position' => array( - 'name' => 'Professional position wanted', - 'title' => 'Filter by professional position you wanted aboard', - 'required' => false, - 'type' => 'list', - 'values' => array( - '' => '', - '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 = array($annonce->find('.title .position', 0)->plaintext); - } else { - $positions = array(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 = array(); - - 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'] = array(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, array('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'] = array(); - } - $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; - } + +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; + } } |