diff options
Diffstat (limited to 'bridges/Drive2ruBridge.php')
-rw-r--r-- | bridges/Drive2ruBridge.php | 411 |
1 files changed, 219 insertions, 192 deletions
diff --git a/bridges/Drive2ruBridge.php b/bridges/Drive2ruBridge.php index 60df97d7..00e9e957 100644 --- a/bridges/Drive2ruBridge.php +++ b/bridges/Drive2ruBridge.php @@ -1,205 +1,232 @@ <?php -class Drive2ruBridge extends BridgeAbstract { - const MAINTAINER = 'dotter-ak'; - const NAME = 'Drive2.ru'; - const URI = 'https://drive2.ru/'; - const DESCRIPTION = 'Лента новостей и тестдрайвов, бортжурналов по выбранной марке или модели + +class Drive2ruBridge extends BridgeAbstract +{ + const MAINTAINER = 'dotter-ak'; + const NAME = 'Drive2.ru'; + const URI = 'https://drive2.ru/'; + const DESCRIPTION = 'Лента новостей и тестдрайвов, бортжурналов по выбранной марке или модели (также работает с фильтром по категориям), блогов пользователей и публикаций по темам.'; - const PARAMETERS = array( - 'Новости и тест-драйвы' => array(), - 'Бортжурналы (По модели или марке)' => array( - 'url' => array( - 'name' => 'Ссылка на страницу с бортжурналом', - 'type' => 'text', - 'required' => true, - 'title' => 'Например: https://www.drive2.ru/experience/suzuki/g4895/', - 'exampleValue' => 'https://www.drive2.ru/experience/suzuki/g4895/' - ), - ), - 'Личные блоги' => array( - 'username' => array( - 'name' => 'Никнейм пользователя на сайте', - 'type' => 'text', - 'required' => true, - 'title' => 'Например: Mickey', - 'exampleValue' => 'Mickey' - ) - ), - 'Публикации по темам (Стоит почитать)' => array( - 'topic' => array( - 'name' => 'Темы', - 'type' => 'list', - 'values' => array( - 'Автозвук' => '16', - 'Автомобильный дизайн' => '10', - 'Автоспорт' => '11', - 'Автошоу, музеи, выставки' => '12', - 'Безопасность' => '18', - 'Беспилотные автомобили' => '15', - 'Видеосюжеты' => '20', - 'Вне дорог' => '21', - 'Встречи' => '22', - 'Выбор и покупка машины' => '23', - 'Гаджеты' => '30', - 'Гибридные машины' => '32', - 'Грузовики, автобусы, спецтехника' => '31', - 'Доработка интерьера' => '35', - 'Законодательство' => '40', - 'История автомобилестроения' => '50', - 'Мототехника' => '60', - 'Новые модели и концепты' => '85', - 'Обучение вождению' => '70', - 'Путешествия' => '80', - 'Ремонт и обслуживание' => '90', - 'Реставрация ретро-авто' => '91', - 'Сделай сам' => '104', - 'Смешное' => '103', - 'Спорткары' => '102', - 'Стайлинг' => '101', - 'Тест-драйвы' => '110', - 'Тюнинг' => '111', - 'Фотосессии' => '120', - 'Шины и диски' => '140', - 'Электрика' => '130', - 'Электромобили' => '131' - ), - 'defaultValue' => '16', - ) - ), - 'global' => array( - 'full_articles' => array( - 'name' => 'Загружать в ленту полный текст', - 'type' => 'checkbox' - ) - ) - ); + const PARAMETERS = [ + 'Новости и тест-драйвы' => [], + 'Бортжурналы (По модели или марке)' => [ + 'url' => [ + 'name' => 'Ссылка на страницу с бортжурналом', + 'type' => 'text', + 'required' => true, + 'title' => 'Например: https://www.drive2.ru/experience/suzuki/g4895/', + 'exampleValue' => 'https://www.drive2.ru/experience/suzuki/g4895/' + ], + ], + 'Личные блоги' => [ + 'username' => [ + 'name' => 'Никнейм пользователя на сайте', + 'type' => 'text', + 'required' => true, + 'title' => 'Например: Mickey', + 'exampleValue' => 'Mickey' + ] + ], + 'Публикации по темам (Стоит почитать)' => [ + 'topic' => [ + 'name' => 'Темы', + 'type' => 'list', + 'values' => [ + 'Автозвук' => '16', + 'Автомобильный дизайн' => '10', + 'Автоспорт' => '11', + 'Автошоу, музеи, выставки' => '12', + 'Безопасность' => '18', + 'Беспилотные автомобили' => '15', + 'Видеосюжеты' => '20', + 'Вне дорог' => '21', + 'Встречи' => '22', + 'Выбор и покупка машины' => '23', + 'Гаджеты' => '30', + 'Гибридные машины' => '32', + 'Грузовики, автобусы, спецтехника' => '31', + 'Доработка интерьера' => '35', + 'Законодательство' => '40', + 'История автомобилестроения' => '50', + 'Мототехника' => '60', + 'Новые модели и концепты' => '85', + 'Обучение вождению' => '70', + 'Путешествия' => '80', + 'Ремонт и обслуживание' => '90', + 'Реставрация ретро-авто' => '91', + 'Сделай сам' => '104', + 'Смешное' => '103', + 'Спорткары' => '102', + 'Стайлинг' => '101', + 'Тест-драйвы' => '110', + 'Тюнинг' => '111', + 'Фотосессии' => '120', + 'Шины и диски' => '140', + 'Электрика' => '130', + 'Электромобили' => '131' + ], + 'defaultValue' => '16', + ] + ], + 'global' => [ + 'full_articles' => [ + 'name' => 'Загружать в ленту полный текст', + 'type' => 'checkbox' + ] + ] + ]; - private $title; + private $title; - private function getUserContent($url) { - $html = getSimpleHTMLDOM($url); - $this->title = $html->find('title', 0)->innertext; - $articles = $html->find('div.js-entity'); - foreach ($articles as $article) { - $item = array(); - $item['title'] = $article->find('a.c-link--text', 0)->plaintext; - $item['uri'] = urljoin(self::URI, $article->find('a.c-link--text', 0)->href); - if($this->getInput('full_articles')) { - $item['content'] = $this->addCommentsLink( - $this->adjustContent(getSimpleHTMLDomCached($item['uri'])->find('div.c-post__body', 0))->innertext, - $item['uri'] - ); - } else { - $item['content'] = $this->addReadMoreLink($article->find('div.c-post-preview__lead', 0), $item['uri']); - } - $item['author'] = $article->find('a.c-username--wrap', 0)->plaintext; - if (!is_null($article->find('img', 1))) $item['enclosures'][] = $article->find('img', 1)->src; - $this->items[] = $item; - } - } + private function getUserContent($url) + { + $html = getSimpleHTMLDOM($url); + $this->title = $html->find('title', 0)->innertext; + $articles = $html->find('div.js-entity'); + foreach ($articles as $article) { + $item = []; + $item['title'] = $article->find('a.c-link--text', 0)->plaintext; + $item['uri'] = urljoin(self::URI, $article->find('a.c-link--text', 0)->href); + if ($this->getInput('full_articles')) { + $item['content'] = $this->addCommentsLink( + $this->adjustContent(getSimpleHTMLDomCached($item['uri'])->find('div.c-post__body', 0))->innertext, + $item['uri'] + ); + } else { + $item['content'] = $this->addReadMoreLink($article->find('div.c-post-preview__lead', 0), $item['uri']); + } + $item['author'] = $article->find('a.c-username--wrap', 0)->plaintext; + if (!is_null($article->find('img', 1))) { + $item['enclosures'][] = $article->find('img', 1)->src; + } + $this->items[] = $item; + } + } - private function getLogbooksContent($url) { - $html = getSimpleHTMLDOM($url); - $this->title = $html->find('title', 0)->innertext; - $articles = $html->find('div.js-entity'); - foreach ($articles as $article) { - $item = array(); - $item['title'] = $article->find('a.c-link--text', 1)->plaintext; - $item['uri'] = urljoin(self::URI, $article->find('a.c-link--text', 1)->href); - if($this->getInput('full_articles')) { - $item['content'] = $this->addCommentsLink( - $this->adjustContent(getSimpleHTMLDomCached($item['uri'])->find('div.c-post__body', 0))->innertext, - $item['uri'] - ); - } else { - $item['content'] = $this->addReadMoreLink($article->find('div.c-post-preview__lead', 0), $item['uri']); - } - $item['author'] = $article->find('a.c-username--wrap', 0)->plaintext; - if (!is_null($article->find('img', 1))) $item['enclosures'][] = $article->find('img', 1)->src; - $this->items[] = $item; - } - } + private function getLogbooksContent($url) + { + $html = getSimpleHTMLDOM($url); + $this->title = $html->find('title', 0)->innertext; + $articles = $html->find('div.js-entity'); + foreach ($articles as $article) { + $item = []; + $item['title'] = $article->find('a.c-link--text', 1)->plaintext; + $item['uri'] = urljoin(self::URI, $article->find('a.c-link--text', 1)->href); + if ($this->getInput('full_articles')) { + $item['content'] = $this->addCommentsLink( + $this->adjustContent(getSimpleHTMLDomCached($item['uri'])->find('div.c-post__body', 0))->innertext, + $item['uri'] + ); + } else { + $item['content'] = $this->addReadMoreLink($article->find('div.c-post-preview__lead', 0), $item['uri']); + } + $item['author'] = $article->find('a.c-username--wrap', 0)->plaintext; + if (!is_null($article->find('img', 1))) { + $item['enclosures'][] = $article->find('img', 1)->src; + } + $this->items[] = $item; + } + } - private function getNews() { - $html = getSimpleHTMLDOM('https://www.drive2.ru/editorial/'); - $this->title = $html->find('title', 0)->innertext; - $articles = $html->find('div.c-article-card'); - foreach ($articles as $article) { - $item = array(); - $item['title'] = $article->find('a.c-link--text', 0)->plaintext; - $item['uri'] = urljoin(self::URI, $article->find('a.c-link--text', 0)->href); - if($this->getInput('full_articles')) { - $item['content'] = $this->addCommentsLink( - $this->adjustContent(getSimpleHTMLDomCached($item['uri'])->find('div.article', 0))->innertext, - $item['uri'] - ); - } else { - $item['content'] = $this->addReadMoreLink($article->find('div.c-article-card__lead', 0), $item['uri']); - } - $item['author'] = 'Новости и тест-драйвы на Drive2.ru'; - if (!is_null($article->find('img', 0))) $item['enclosures'][] = $article->find('img', 0)->src; - $this->items[] = $item; - } - } + private function getNews() + { + $html = getSimpleHTMLDOM('https://www.drive2.ru/editorial/'); + $this->title = $html->find('title', 0)->innertext; + $articles = $html->find('div.c-article-card'); + foreach ($articles as $article) { + $item = []; + $item['title'] = $article->find('a.c-link--text', 0)->plaintext; + $item['uri'] = urljoin(self::URI, $article->find('a.c-link--text', 0)->href); + if ($this->getInput('full_articles')) { + $item['content'] = $this->addCommentsLink( + $this->adjustContent(getSimpleHTMLDomCached($item['uri'])->find('div.article', 0))->innertext, + $item['uri'] + ); + } else { + $item['content'] = $this->addReadMoreLink($article->find('div.c-article-card__lead', 0), $item['uri']); + } + $item['author'] = 'Новости и тест-драйвы на Drive2.ru'; + if (!is_null($article->find('img', 0))) { + $item['enclosures'][] = $article->find('img', 0)->src; + } + $this->items[] = $item; + } + } - private function adjustContent($content) { - foreach ($content->find('div.o-group') as $node) - $node->outertext = ''; - foreach($content->find('div, span') as $attrs) - foreach ($attrs->getAllAttributes() as $attr => $val) - $attrs->removeAttribute($attr); - foreach ($content->getElementsByTagName('figcaption') as $attrs) - $attrs->setAttribute( - 'style', - 'font-style: italic; font-size: small; margin: 0 100px 75px;'); - foreach ($content->find('script') as $node) - $node->outertext = ''; - foreach ($content->find('iframe') as $node) { - preg_match('/embed\/(.*?)\?/', $node->src, $match); - $node->outertext = '<a href="https://www.youtube.com/watch?v=' . $match[1] . - '">https://www.youtube.com/watch?v=' . $match[1] . '</a>'; - } - return $content; - } + private function adjustContent($content) + { + foreach ($content->find('div.o-group') as $node) { + $node->outertext = ''; + } + foreach ($content->find('div, span') as $attrs) { + foreach ($attrs->getAllAttributes() as $attr => $val) { + $attrs->removeAttribute($attr); + } + } + foreach ($content->getElementsByTagName('figcaption') as $attrs) { + $attrs->setAttribute( + 'style', + 'font-style: italic; font-size: small; margin: 0 100px 75px;' + ); + } + foreach ($content->find('script') as $node) { + $node->outertext = ''; + } + foreach ($content->find('iframe') as $node) { + preg_match('/embed\/(.*?)\?/', $node->src, $match); + $node->outertext = '<a href="https://www.youtube.com/watch?v=' . $match[1] . + '">https://www.youtube.com/watch?v=' . $match[1] . '</a>'; + } + return $content; + } - private function addCommentsLink ($content, $url) { - return $content . '<br><a href="' . $url . '#comments">Перейти к комментариям</a>'; - } + private function addCommentsLink($content, $url) + { + return $content . '<br><a href="' . $url . '#comments">Перейти к комментариям</a>'; + } - private function addReadMoreLink ($content, $url) { - if (!is_null($content)) - return preg_replace('!\s+!', ' ', str_replace('Читать дальше', '', $content->plaintext)) . - '<br><a href="' . $url . '">Читать далее</a>'; - else return ''; - } + private function addReadMoreLink($content, $url) + { + if (!is_null($content)) { + return preg_replace('!\s+!', ' ', str_replace('Читать дальше', '', $content->plaintext)) . + '<br><a href="' . $url . '">Читать далее</a>'; + } else { + return ''; + } + } - public function collectData() { - switch($this->queriedContext) { - default: - case 'Новости и тест-драйвы': - $this->getNews(); - break; - case 'Бортжурналы (По модели или марке)': - if (!preg_match('/^https:\/\/www.drive2.ru\/experience/', $this->getInput('url'))) - returnServerError('Invalid url'); - $this->getLogbooksContent($this->getInput('url')); - break; - case 'Личные блоги': - if (!preg_match('/^[a-zA-Z0-9-]{3,16}$/', $this->getInput('username'))) - returnServerError('Invalid username'); - $this->getUserContent('https://www.drive2.ru/users/' . $this->getInput('username')); - break; - case 'Публикации по темам (Стоит почитать)': - $this->getUserContent('https://www.drive2.ru/topics/' . $this->getInput('topic')); - break; - } - } + public function collectData() + { + switch ($this->queriedContext) { + default: + case 'Новости и тест-драйвы': + $this->getNews(); + break; + case 'Бортжурналы (По модели или марке)': + if (!preg_match('/^https:\/\/www.drive2.ru\/experience/', $this->getInput('url'))) { + returnServerError('Invalid url'); + } + $this->getLogbooksContent($this->getInput('url')); + break; + case 'Личные блоги': + if (!preg_match('/^[a-zA-Z0-9-]{3,16}$/', $this->getInput('username'))) { + returnServerError('Invalid username'); + } + $this->getUserContent('https://www.drive2.ru/users/' . $this->getInput('username')); + break; + case 'Публикации по темам (Стоит почитать)': + $this->getUserContent('https://www.drive2.ru/topics/' . $this->getInput('topic')); + break; + } + } - public function getName() { - return $this->title ?: parent::getName(); - } + public function getName() + { + return $this->title ?: parent::getName(); + } - public function getIcon() { - return 'https://www.drive2.ru/favicon.ico'; - } + public function getIcon() + { + return 'https://www.drive2.ru/favicon.ico'; + } } |