diff options
Diffstat (limited to 'bridges/BandcampDailyBridge.php')
-rw-r--r-- | bridges/BandcampDailyBridge.php | 319 |
1 files changed, 162 insertions, 157 deletions
diff --git a/bridges/BandcampDailyBridge.php b/bridges/BandcampDailyBridge.php index 827cf9cd..57299a17 100644 --- a/bridges/BandcampDailyBridge.php +++ b/bridges/BandcampDailyBridge.php @@ -1,159 +1,164 @@ <?php -class BandcampDailyBridge extends BridgeAbstract { - const NAME = 'Bandcamp Daily Bridge'; - const URI = 'https://daily.bandcamp.com'; - const DESCRIPTION = 'Returns newest articles'; - const MAINTAINER = 'VerifiedJoseph'; - const PARAMETERS = array( - 'Latest articles' => array(), - 'Best of' => array( - 'best-content' => array( - 'name' => 'content', - 'type' => 'list', - 'values' => array( - 'Best Ambient' => 'best-ambient', - 'Best Beat Tapes' => 'best-beat-tapes', - 'Best Dance 12\'s' => 'best-dance-12s', - 'Best Contemporary Classical' => 'best-contemporary-classical', - 'Best Electronic' => 'best-electronic', - 'Best Experimental' => 'best-experimental', - 'Best Hip-Hop' => 'best-hip-hop', - 'Best Jazz' => 'best-jazz', - 'Best Metal' => 'best-metal', - 'Best Punk' => 'best-punk', - 'Best Reissues' => 'best-reissues', - 'Best Soul' => 'best-soul', - ), - 'defaultValue' => 'best-ambient', - ), - ), - 'Genres' => array( - 'genres-content' => array( - 'name' => 'content', - 'type' => 'list', - 'values' => array( - 'Acoustic' => 'genres/acoustic', - 'Alternative' => 'genres/alternative', - 'Ambient' => 'genres/ambient', - 'Blues' => 'genres/blues', - 'Classical' => 'genres/classical', - 'Comedy' => 'genres/comedy', - 'Country' => 'genres/country', - 'Devotional' => 'genres/devotional', - 'Electronic' => 'genres/electronic', - 'Experimental' => 'genres/experimental', - 'Folk' => 'genres/folk', - 'Funk' => 'genres/funk', - 'Hip-Hop/Rap' => 'genres/hip-hop-rap', - 'Jazz' => 'genres/jazz', - 'Kids' => 'genres/kids', - 'Latin' => 'genres/latin', - 'Metal' => 'genres/metal', - 'Pop' => 'genres/pop', - 'Punk' => 'genres/punk', - 'R&B/Soul' => 'genres/r-b-soul', - 'Reggae' => 'genres/reggae', - 'Rock' => 'genres/rock', - 'Soundtrack' => 'genres/soundtrack', - 'Spoken Word' => 'genres/spoken-word', - 'World' => 'genres/world', - ), - 'defaultValue' => 'genres/acoustic', - ), - ), - 'Franchises' => array( - 'franchises-content' => array( - 'name' => 'content', - 'type' => 'list', - 'values' => array( - 'Lists' => 'lists', - 'Features' => 'features', - 'Album of the Day' => 'album-of-the-day', - 'Acid Test' => 'acid-test', - 'Bandcamp Navigator' => 'bandcamp-navigator', - 'Big Ups' => 'big-ups', - 'Certified' => 'certified', - 'Gallery' => 'gallery', - 'Hidden Gems' => 'hidden-gems', - 'High Scores' => 'high-scores', - 'Label Profile' => 'label-profile', - 'Lifetime Achievement' => 'lifetime-achievement', - 'Scene Report' => 'scene-report', - 'Seven Essential Releases' => 'seven-essential-releases', - 'The Merch Table' => 'the-merch-table', - ), - 'defaultValue' => 'lists', - ), - ) - ); - - const CACHE_TIMEOUT = 3600; // 1 hour - - public function collectData() { - $html = getSimpleHTMLDOM($this->getURI()) - or returnServerError('Could not request: ' . $this->getURI()); - - $html = defaultLinkTo($html, self::URI); - - $articles = $html->find('articles-list', 0); - - foreach($articles->find('div.list-article') as $index => $article) { - $item = array(); - - $articlePath = $article->find('a.title', 0)->href; - - $articlePageHtml = getSimpleHTMLDOMCached($articlePath, 3600) - or returnServerError('Could not request: ' . $articlePath); - - $item['uri'] = $articlePath; - $item['title'] = $articlePageHtml->find('article-title', 0)->innertext; - $item['author'] = $articlePageHtml->find('article-credits > a', 0)->innertext; - $item['content'] = html_entity_decode($articlePageHtml->find('meta[name="description"]', 0)->content, ENT_QUOTES); - $item['timestamp'] = $articlePageHtml->find('meta[property="article:published_time"]', 0)->content; - $item['categories'][] = $articlePageHtml->find('meta[property="article:section"]', 0)->content; - - if ($articlePageHtml->find('meta[property="article:tag"]', 0)) { - $item['categories'][] = $articlePageHtml->find('meta[property="article:tag"]', 0)->content; - } - - $item['enclosures'][] = $articlePageHtml->find('meta[name="twitter:image"]', 0)->content; - - $this->items[] = $item; - - if (count($this->items) >= 10) { - break; - } - } - } - - public function getURI() { - switch($this->queriedContext) { - case 'Latest articles': - return self::URI . '/latest'; - case 'Best of': - case 'Genres': - case 'Franchises': - // TODO Switch to array_key_first once php >= 7.3 - $contentKey = key(self::PARAMETERS[$this->queriedContext]); - return self::URI . '/' . $this->getInput($contentKey); - default: - return parent::getURI(); - } - } - - public function getName() { - switch($this->queriedContext) { - case 'Latest articles': - return $this->queriedContext . ' - Bandcamp Daily'; - case 'Best of': - case 'Genres': - case 'Franchises': - $contentKey = array_key_first(self::PARAMETERS[$this->queriedContext]); - $contentValues = array_flip(self::PARAMETERS[$this->queriedContext][$contentKey]['values']); - - return $contentValues[$this->getInput($contentKey)] . ' - Bandcamp Daily'; - default: - return parent::getName(); - } - } + +class BandcampDailyBridge extends BridgeAbstract +{ + const NAME = 'Bandcamp Daily Bridge'; + const URI = 'https://daily.bandcamp.com'; + const DESCRIPTION = 'Returns newest articles'; + const MAINTAINER = 'VerifiedJoseph'; + const PARAMETERS = [ + 'Latest articles' => [], + 'Best of' => [ + 'best-content' => [ + 'name' => 'content', + 'type' => 'list', + 'values' => [ + 'Best Ambient' => 'best-ambient', + 'Best Beat Tapes' => 'best-beat-tapes', + 'Best Dance 12\'s' => 'best-dance-12s', + 'Best Contemporary Classical' => 'best-contemporary-classical', + 'Best Electronic' => 'best-electronic', + 'Best Experimental' => 'best-experimental', + 'Best Hip-Hop' => 'best-hip-hop', + 'Best Jazz' => 'best-jazz', + 'Best Metal' => 'best-metal', + 'Best Punk' => 'best-punk', + 'Best Reissues' => 'best-reissues', + 'Best Soul' => 'best-soul', + ], + 'defaultValue' => 'best-ambient', + ], + ], + 'Genres' => [ + 'genres-content' => [ + 'name' => 'content', + 'type' => 'list', + 'values' => [ + 'Acoustic' => 'genres/acoustic', + 'Alternative' => 'genres/alternative', + 'Ambient' => 'genres/ambient', + 'Blues' => 'genres/blues', + 'Classical' => 'genres/classical', + 'Comedy' => 'genres/comedy', + 'Country' => 'genres/country', + 'Devotional' => 'genres/devotional', + 'Electronic' => 'genres/electronic', + 'Experimental' => 'genres/experimental', + 'Folk' => 'genres/folk', + 'Funk' => 'genres/funk', + 'Hip-Hop/Rap' => 'genres/hip-hop-rap', + 'Jazz' => 'genres/jazz', + 'Kids' => 'genres/kids', + 'Latin' => 'genres/latin', + 'Metal' => 'genres/metal', + 'Pop' => 'genres/pop', + 'Punk' => 'genres/punk', + 'R&B/Soul' => 'genres/r-b-soul', + 'Reggae' => 'genres/reggae', + 'Rock' => 'genres/rock', + 'Soundtrack' => 'genres/soundtrack', + 'Spoken Word' => 'genres/spoken-word', + 'World' => 'genres/world', + ], + 'defaultValue' => 'genres/acoustic', + ], + ], + 'Franchises' => [ + 'franchises-content' => [ + 'name' => 'content', + 'type' => 'list', + 'values' => [ + 'Lists' => 'lists', + 'Features' => 'features', + 'Album of the Day' => 'album-of-the-day', + 'Acid Test' => 'acid-test', + 'Bandcamp Navigator' => 'bandcamp-navigator', + 'Big Ups' => 'big-ups', + 'Certified' => 'certified', + 'Gallery' => 'gallery', + 'Hidden Gems' => 'hidden-gems', + 'High Scores' => 'high-scores', + 'Label Profile' => 'label-profile', + 'Lifetime Achievement' => 'lifetime-achievement', + 'Scene Report' => 'scene-report', + 'Seven Essential Releases' => 'seven-essential-releases', + 'The Merch Table' => 'the-merch-table', + ], + 'defaultValue' => 'lists', + ], + ] + ]; + + const CACHE_TIMEOUT = 3600; // 1 hour + + public function collectData() + { + $html = getSimpleHTMLDOM($this->getURI()) + or returnServerError('Could not request: ' . $this->getURI()); + + $html = defaultLinkTo($html, self::URI); + + $articles = $html->find('articles-list', 0); + + foreach ($articles->find('div.list-article') as $index => $article) { + $item = []; + + $articlePath = $article->find('a.title', 0)->href; + + $articlePageHtml = getSimpleHTMLDOMCached($articlePath, 3600) + or returnServerError('Could not request: ' . $articlePath); + + $item['uri'] = $articlePath; + $item['title'] = $articlePageHtml->find('article-title', 0)->innertext; + $item['author'] = $articlePageHtml->find('article-credits > a', 0)->innertext; + $item['content'] = html_entity_decode($articlePageHtml->find('meta[name="description"]', 0)->content, ENT_QUOTES); + $item['timestamp'] = $articlePageHtml->find('meta[property="article:published_time"]', 0)->content; + $item['categories'][] = $articlePageHtml->find('meta[property="article:section"]', 0)->content; + + if ($articlePageHtml->find('meta[property="article:tag"]', 0)) { + $item['categories'][] = $articlePageHtml->find('meta[property="article:tag"]', 0)->content; + } + + $item['enclosures'][] = $articlePageHtml->find('meta[name="twitter:image"]', 0)->content; + + $this->items[] = $item; + + if (count($this->items) >= 10) { + break; + } + } + } + + public function getURI() + { + switch ($this->queriedContext) { + case 'Latest articles': + return self::URI . '/latest'; + case 'Best of': + case 'Genres': + case 'Franchises': + // TODO Switch to array_key_first once php >= 7.3 + $contentKey = key(self::PARAMETERS[$this->queriedContext]); + return self::URI . '/' . $this->getInput($contentKey); + default: + return parent::getURI(); + } + } + + public function getName() + { + switch ($this->queriedContext) { + case 'Latest articles': + return $this->queriedContext . ' - Bandcamp Daily'; + case 'Best of': + case 'Genres': + case 'Franchises': + $contentKey = array_key_first(self::PARAMETERS[$this->queriedContext]); + $contentValues = array_flip(self::PARAMETERS[$this->queriedContext][$contentKey]['values']); + + return $contentValues[$this->getInput($contentKey)] . ' - Bandcamp Daily'; + default: + return parent::getName(); + } + } } |