aboutsummaryrefslogtreecommitdiff
path: root/bridges/OpenlyBridge.php
diff options
context:
space:
mode:
Diffstat (limited to 'bridges/OpenlyBridge.php')
-rw-r--r--bridges/OpenlyBridge.php498
1 files changed, 253 insertions, 245 deletions
diff --git a/bridges/OpenlyBridge.php b/bridges/OpenlyBridge.php
index 3395905d..9f54e22a 100644
--- a/bridges/OpenlyBridge.php
+++ b/bridges/OpenlyBridge.php
@@ -1,247 +1,255 @@
<?php
-class OpenlyBridge extends BridgeAbstract {
- const NAME = 'Openly Bridge';
- const URI = 'https://www.openlynews.com/';
- const DESCRIPTION = 'Returns news articles';
- const MAINTAINER = 'VerifiedJoseph';
- const PARAMETERS = array(
- 'All News' => array(),
- 'All Opinion' => array(),
- 'By Region' => array(
- 'region' => array(
- 'name' => 'Region',
- 'type' => 'list',
- 'values' => array(
- 'Africa' => 'africa',
- 'Asia Pacific' => 'asia-pacific',
- 'Europe' => 'europe',
- 'Latin America' => 'latin-america',
- 'Middle Easta' => 'middle-east',
- 'North America' => 'north-america'
- )
- ),
- 'content' => array(
- 'name' => 'Content',
- 'type' => 'list',
- 'values' => array(
- 'News' => 'news',
- 'Opinion' => 'people'
- ),
- 'defaultValue' => 'news'
- )
- ),
- 'By Tag' => array(
- 'tag' => array(
- 'name' => 'Tag',
- 'type' => 'text',
- 'required' => true,
- 'exampleValue' => 'lgbt-law',
- ),
- 'content' => array(
- 'name' => 'Content',
- 'type' => 'list',
- 'values' => array(
- 'News' => 'news',
- 'Opinion' => 'people'
- ),
- 'defaultValue' => 'news'
- )
- ),
- 'By Author' => array(
- 'profileId' => array(
- 'name' => 'Profile ID',
- 'type' => 'text',
- 'required' => true,
- 'exampleValue' => '003D000002WZGYRIA5',
- )
- )
- );
-
- const TEST_DETECT_PARAMETERS = array(
- 'https://www.openlynews.com/profile/?id=0033z00002XUTepAAH' => array(
- 'context' => 'By Author', 'profileId' => '0033z00002XUTepAAH'
- ),
- 'https://www.openlynews.com/news/?page=1&theme=lgbt-law' => array(
- 'context' => 'By Tag', 'content' => 'news', 'tag' => 'lgbt-law'
- ),
- 'https://www.openlynews.com/news/?page=1&region=north-america' => array(
- 'context' => 'By Region', 'content' => 'news', 'region' => 'north-america'
- ),
- 'https://www.openlynews.com/news/?theme=lgbt-law' => array(
- 'context' => 'By Tag', 'content' => 'news', 'tag' => 'lgbt-law'
- ),
- 'https://www.openlynews.com/news/?region=north-america' => array(
- 'context' => 'By Region', 'content' => 'news', 'region' => 'north-america'
- )
- );
-
- const CACHE_TIMEOUT = 900; // 15 mins
- const ARTICLE_CACHE_TIMEOUT = 3600; // 1 hour
-
- private $feedTitle = '';
- private $itemLimit = 10;
-
- private $profileUrlRegex = '/openlynews\.com\/profile\/\?id=([a-zA-Z0-9]+)/';
- private $tagUrlRegex = '/openlynews\.com\/([a-z]+)\/\?(?:page=(?:[0-9]+)&)?theme=([\w-]+)/';
- private $regionUrlRegex = '/openlynews\.com\/([a-z]+)\/\?(?:page=(?:[0-9]+)&)?region=([\w-]+)/';
-
- public function detectParameters($url) {
- $params = array();
-
- if(preg_match($this->profileUrlRegex, $url, $matches) > 0) {
- $params['context'] = 'By Author';
- $params['profileId'] = $matches[1];
- return $params;
- }
-
- if(preg_match($this->tagUrlRegex, $url, $matches) > 0) {
- $params['context'] = 'By Tag';
- $params['content'] = $matches[1];
- $params['tag'] = $matches[2];
- return $params;
- }
-
- if(preg_match($this->regionUrlRegex, $url, $matches) > 0) {
- $params['context'] = 'By Region';
- $params['content'] = $matches[1];
- $params['region'] = $matches[2];
- return $params;
- }
-
- return null;
- }
-
- public function collectData() {
- $url = $this->getAjaxURI();
-
- if ($this->queriedContext === 'By Author') {
- $url = $this->getURI();
- }
-
- $html = getSimpleHTMLDOM($url);
- $html = defaultLinkTo($html, $this->getURI());
-
- if ($html->find('h1', 0)) {
- $this->feedTitle = $html->find('h1', 0)->plaintext;
- }
-
- if ($html->find('h2.title-v4', 0)) {
- $html->find('span.tooltiptext', 0)->innertext = '';
- $this->feedTitle = $html->find('a.tooltipitem', 0)->plaintext;
- }
-
- $items = $html->find('div.item');
- $limit = 5;
- foreach(array_slice($items, 0, $limit) as $div) {
- $this->items[] = $this->getArticle($div->find('a', 0)->href);
-
- if (count($this->items) >= $this->itemLimit) {
- break;
- }
- }
- }
-
- public function getURI() {
- switch ($this->queriedContext) {
- case 'All News':
- return self::URI . 'news';
- break;
- case 'All Opinion':
- return self::URI . 'people';
- break;
- case 'By Tag':
- return self::URI . $this->getInput('content') . '/?theme=' . $this->getInput('tag');
- case 'By Region':
- return self::URI . $this->getInput('content') . '/?region=' . $this->getInput('region');
- break;
- case 'By Author':
- return self::URI . 'profile/?id=' . $this->getInput('profileId');
- break;
- default:
- return parent::getURI();
- }
- }
-
- public function getName() {
- switch ($this->queriedContext) {
- case 'All News':
- return 'News - Openly';
- break;
- case 'All Opinion':
- return 'Opinion - Openly';
- break;
- case 'By Tag':
- if (empty($this->feedTitle)) {
- $this->feedTitle = $this->getInput('tag');
- }
-
- if ($this->getInput('content') === 'people') {
- return $this->feedTitle . ' - Opinion - Openly';
- }
-
- return $this->feedTitle . ' - Openly';
- break;
- case 'By Region':
- if (empty($this->feedTitle)) {
- $this->feedTitle = $this->getInput('region');
- }
-
- if ($this->getInput('content') === 'people') {
- return $this->feedTitle . ' - Opinion - Openly';
- }
-
- return $this->feedTitle . ' - Openly';
- break;
- case 'By Author':
- if (empty($this->feedTitle)) {
- $this->feedTitle = $this->getInput('profileId');
- }
-
- return $this->feedTitle . ' - Author - Openly';
- break;
- default:
- return parent::getName();
- }
- }
-
- private function getAjaxURI() {
- $part = '/ajax.html?';
-
- switch ($this->queriedContext) {
- case 'All News':
- return self::URI . 'news' . $part;
- break;
- case 'All Opinion':
- return self::URI . 'people' . $part;
- break;
- case 'By Tag':
- return self::URI . $this->getInput('content') . $part . 'theme=' . $this->getInput('tag');
- break;
- case 'By Region':
- return self::URI . $this->getInput('content') . $part . 'region=' . $this->getInput('region');
- break;
- }
- }
-
- private function getArticle($url) {
- $article = getSimpleHTMLDOMCached($url, self::ARTICLE_CACHE_TIMEOUT);
- $article = defaultLinkTo($article, $this->getURI());
-
- $item = array();
- $item['title'] = $article->find('h1', 0)->plaintext;
- $item['uri'] = $url;
- $item['content'] = $article->find('div.body-text', 0);
- $item['enclosures'][] = $article->find('meta[name="twitter:image"]', 0)->content;
- $item['timestamp'] = $article->find('div.meta.small', 0)->plaintext;
-
- if ($article->find('div.meta a', 0)) {
- $item['author'] = $article->find('div.meta a', 0)->plaintext;
- }
-
- foreach($article->find('div.themes li') as $li) {
- $item['categories'][] = trim(htmlspecialchars($li->plaintext, ENT_QUOTES));
- }
-
- return $item;
- }
+
+class OpenlyBridge extends BridgeAbstract
+{
+ const NAME = 'Openly Bridge';
+ const URI = 'https://www.openlynews.com/';
+ const DESCRIPTION = 'Returns news articles';
+ const MAINTAINER = 'VerifiedJoseph';
+ const PARAMETERS = [
+ 'All News' => [],
+ 'All Opinion' => [],
+ 'By Region' => [
+ 'region' => [
+ 'name' => 'Region',
+ 'type' => 'list',
+ 'values' => [
+ 'Africa' => 'africa',
+ 'Asia Pacific' => 'asia-pacific',
+ 'Europe' => 'europe',
+ 'Latin America' => 'latin-america',
+ 'Middle Easta' => 'middle-east',
+ 'North America' => 'north-america'
+ ]
+ ],
+ 'content' => [
+ 'name' => 'Content',
+ 'type' => 'list',
+ 'values' => [
+ 'News' => 'news',
+ 'Opinion' => 'people'
+ ],
+ 'defaultValue' => 'news'
+ ]
+ ],
+ 'By Tag' => [
+ 'tag' => [
+ 'name' => 'Tag',
+ 'type' => 'text',
+ 'required' => true,
+ 'exampleValue' => 'lgbt-law',
+ ],
+ 'content' => [
+ 'name' => 'Content',
+ 'type' => 'list',
+ 'values' => [
+ 'News' => 'news',
+ 'Opinion' => 'people'
+ ],
+ 'defaultValue' => 'news'
+ ]
+ ],
+ 'By Author' => [
+ 'profileId' => [
+ 'name' => 'Profile ID',
+ 'type' => 'text',
+ 'required' => true,
+ 'exampleValue' => '003D000002WZGYRIA5',
+ ]
+ ]
+ ];
+
+ const TEST_DETECT_PARAMETERS = [
+ 'https://www.openlynews.com/profile/?id=0033z00002XUTepAAH' => [
+ 'context' => 'By Author', 'profileId' => '0033z00002XUTepAAH'
+ ],
+ 'https://www.openlynews.com/news/?page=1&theme=lgbt-law' => [
+ 'context' => 'By Tag', 'content' => 'news', 'tag' => 'lgbt-law'
+ ],
+ 'https://www.openlynews.com/news/?page=1&region=north-america' => [
+ 'context' => 'By Region', 'content' => 'news', 'region' => 'north-america'
+ ],
+ 'https://www.openlynews.com/news/?theme=lgbt-law' => [
+ 'context' => 'By Tag', 'content' => 'news', 'tag' => 'lgbt-law'
+ ],
+ 'https://www.openlynews.com/news/?region=north-america' => [
+ 'context' => 'By Region', 'content' => 'news', 'region' => 'north-america'
+ ]
+ ];
+
+ const CACHE_TIMEOUT = 900; // 15 mins
+ const ARTICLE_CACHE_TIMEOUT = 3600; // 1 hour
+
+ private $feedTitle = '';
+ private $itemLimit = 10;
+
+ private $profileUrlRegex = '/openlynews\.com\/profile\/\?id=([a-zA-Z0-9]+)/';
+ private $tagUrlRegex = '/openlynews\.com\/([a-z]+)\/\?(?:page=(?:[0-9]+)&)?theme=([\w-]+)/';
+ private $regionUrlRegex = '/openlynews\.com\/([a-z]+)\/\?(?:page=(?:[0-9]+)&)?region=([\w-]+)/';
+
+ public function detectParameters($url)
+ {
+ $params = [];
+
+ if (preg_match($this->profileUrlRegex, $url, $matches) > 0) {
+ $params['context'] = 'By Author';
+ $params['profileId'] = $matches[1];
+ return $params;
+ }
+
+ if (preg_match($this->tagUrlRegex, $url, $matches) > 0) {
+ $params['context'] = 'By Tag';
+ $params['content'] = $matches[1];
+ $params['tag'] = $matches[2];
+ return $params;
+ }
+
+ if (preg_match($this->regionUrlRegex, $url, $matches) > 0) {
+ $params['context'] = 'By Region';
+ $params['content'] = $matches[1];
+ $params['region'] = $matches[2];
+ return $params;
+ }
+
+ return null;
+ }
+
+ public function collectData()
+ {
+ $url = $this->getAjaxURI();
+
+ if ($this->queriedContext === 'By Author') {
+ $url = $this->getURI();
+ }
+
+ $html = getSimpleHTMLDOM($url);
+ $html = defaultLinkTo($html, $this->getURI());
+
+ if ($html->find('h1', 0)) {
+ $this->feedTitle = $html->find('h1', 0)->plaintext;
+ }
+
+ if ($html->find('h2.title-v4', 0)) {
+ $html->find('span.tooltiptext', 0)->innertext = '';
+ $this->feedTitle = $html->find('a.tooltipitem', 0)->plaintext;
+ }
+
+ $items = $html->find('div.item');
+ $limit = 5;
+ foreach (array_slice($items, 0, $limit) as $div) {
+ $this->items[] = $this->getArticle($div->find('a', 0)->href);
+
+ if (count($this->items) >= $this->itemLimit) {
+ break;
+ }
+ }
+ }
+
+ public function getURI()
+ {
+ switch ($this->queriedContext) {
+ case 'All News':
+ return self::URI . 'news';
+ break;
+ case 'All Opinion':
+ return self::URI . 'people';
+ break;
+ case 'By Tag':
+ return self::URI . $this->getInput('content') . '/?theme=' . $this->getInput('tag');
+ case 'By Region':
+ return self::URI . $this->getInput('content') . '/?region=' . $this->getInput('region');
+ break;
+ case 'By Author':
+ return self::URI . 'profile/?id=' . $this->getInput('profileId');
+ break;
+ default:
+ return parent::getURI();
+ }
+ }
+
+ public function getName()
+ {
+ switch ($this->queriedContext) {
+ case 'All News':
+ return 'News - Openly';
+ break;
+ case 'All Opinion':
+ return 'Opinion - Openly';
+ break;
+ case 'By Tag':
+ if (empty($this->feedTitle)) {
+ $this->feedTitle = $this->getInput('tag');
+ }
+
+ if ($this->getInput('content') === 'people') {
+ return $this->feedTitle . ' - Opinion - Openly';
+ }
+
+ return $this->feedTitle . ' - Openly';
+ break;
+ case 'By Region':
+ if (empty($this->feedTitle)) {
+ $this->feedTitle = $this->getInput('region');
+ }
+
+ if ($this->getInput('content') === 'people') {
+ return $this->feedTitle . ' - Opinion - Openly';
+ }
+
+ return $this->feedTitle . ' - Openly';
+ break;
+ case 'By Author':
+ if (empty($this->feedTitle)) {
+ $this->feedTitle = $this->getInput('profileId');
+ }
+
+ return $this->feedTitle . ' - Author - Openly';
+ break;
+ default:
+ return parent::getName();
+ }
+ }
+
+ private function getAjaxURI()
+ {
+ $part = '/ajax.html?';
+
+ switch ($this->queriedContext) {
+ case 'All News':
+ return self::URI . 'news' . $part;
+ break;
+ case 'All Opinion':
+ return self::URI . 'people' . $part;
+ break;
+ case 'By Tag':
+ return self::URI . $this->getInput('content') . $part . 'theme=' . $this->getInput('tag');
+ break;
+ case 'By Region':
+ return self::URI . $this->getInput('content') . $part . 'region=' . $this->getInput('region');
+ break;
+ }
+ }
+
+ private function getArticle($url)
+ {
+ $article = getSimpleHTMLDOMCached($url, self::ARTICLE_CACHE_TIMEOUT);
+ $article = defaultLinkTo($article, $this->getURI());
+
+ $item = [];
+ $item['title'] = $article->find('h1', 0)->plaintext;
+ $item['uri'] = $url;
+ $item['content'] = $article->find('div.body-text', 0);
+ $item['enclosures'][] = $article->find('meta[name="twitter:image"]', 0)->content;
+ $item['timestamp'] = $article->find('div.meta.small', 0)->plaintext;
+
+ if ($article->find('div.meta a', 0)) {
+ $item['author'] = $article->find('div.meta a', 0)->plaintext;
+ }
+
+ foreach ($article->find('div.themes li') as $li) {
+ $item['categories'][] = trim(htmlspecialchars($li->plaintext, ENT_QUOTES));
+ }
+
+ return $item;
+ }
}