aboutsummaryrefslogtreecommitdiff
path: root/bridges/GoodreadsBridge.php
diff options
context:
space:
mode:
Diffstat (limited to 'bridges/GoodreadsBridge.php')
-rw-r--r--bridges/GoodreadsBridge.php184
1 files changed, 92 insertions, 92 deletions
diff --git a/bridges/GoodreadsBridge.php b/bridges/GoodreadsBridge.php
index 4d92dd7f..ae1a865e 100644
--- a/bridges/GoodreadsBridge.php
+++ b/bridges/GoodreadsBridge.php
@@ -1,95 +1,95 @@
<?php
-class GoodreadsBridge extends BridgeAbstract {
-
- const MAINTAINER = 'captn3m0';
- const NAME = 'Goodreads Bridge';
- const URI = 'https://www.goodreads.com/';
- const CACHE_TIMEOUT = 0; // 30min
- const DESCRIPTION = 'Various RSS feeds from Goodreads';
-
- const CONTEXT_AUTHOR_BOOKS = 'Books by Author';
-
- // Using a specific context because I plan to expand this soon
- const PARAMETERS = array(
- 'Books by Author' => array(
- 'author_url' => array(
- 'name' => 'Link to author\'s page on Goodreads',
- 'type' => 'text',
- 'required' => true,
- 'title' => 'Should look somewhat like goodreads.com/author/show/',
- 'pattern' => '^(https:\/\/)?(www.)?goodreads\.com\/author\/show\/\d+\..*$',
- 'exampleValue' => 'https://www.goodreads.com/author/show/38550.Brandon_Sanderson'
- ),
- 'published_only' => array(
- 'name' => 'Show published books only',
- 'type' => 'checkbox',
- 'required' => false,
- 'title' => 'If left unchecked, this will return unpublished books as well',
- 'defaultValue' => 'checked',
- ),
- ),
- );
-
- private function collectAuthorBooks($url) {
-
- $regex = '/goodreads\.com\/author\/show\/(\d+)/';
-
- preg_match($regex, $url, $matches);
-
- $authorId = $matches[1];
-
- $authorListUrl = "https://www.goodreads.com/author/list/$authorId?sort=original_publication_year";
-
- $html = getSimpleHTMLDOMCached($authorListUrl, self::CACHE_TIMEOUT);
-
- foreach($html->find('tr[itemtype="http://schema.org/Book"]') as $row) {
- $dateSpan = $row->find('.uitext', 0)->plaintext;
- $date = null;
-
- // If book is not yet published, ignore for now
- if(preg_match('/published\s+(\d{4})/', $dateSpan, $matches) === 1) {
- // Goodreads doesn't give us exact publication date here, only a year
- // We are skipping future dates anyway, so this is def published
- // but we can't pick a dynamic date either to keep clients from getting
- // confused. So we pick a guaranteed date of 1st-Jan instead.
- $date = $matches[1] . '-01-01';
- } else if ($this->getInput('published_only') !== 'checked') {
- // We can return unpublished books as well
- $date = date('Y-01-01');
- } else {
- continue;
- }
-
- $row = defaultLinkTo($row, $this->getURI());
-
- $item['title'] = $row->find('.bookTitle', 0)->plaintext;
- $item['uri'] = $row->find('.bookTitle', 0)->getAttribute('href');
- $item['author'] = $row->find('.authorName', 0)->plaintext;
- $item['content'] = '<a href="'
- . $row->find('.bookTitle', 0)->getAttribute('href')
- . '"><img src="'
- . $row->find('.bookCover', 0)->getAttribute('src')
- . '"></a>';
- $item['timestamp'] = $date;
- $item['enclosures'] = array(
- $row->find('.bookCover', 0)->getAttribute('src')
- );
-
- $this->items[] = $item; // Add item to the list
- }
- }
-
- public function collectData() {
-
- switch ($this->queriedContext) {
- case self::CONTEXT_AUTHOR_BOOKS:
- $this->collectAuthorBooks($this->getInput('author_url'));
- break;
-
- default:
- throw new Exception('Invalid context', 1);
- break;
- }
- }
+class GoodreadsBridge extends BridgeAbstract
+{
+ const MAINTAINER = 'captn3m0';
+ const NAME = 'Goodreads Bridge';
+ const URI = 'https://www.goodreads.com/';
+ const CACHE_TIMEOUT = 0; // 30min
+ const DESCRIPTION = 'Various RSS feeds from Goodreads';
+
+ const CONTEXT_AUTHOR_BOOKS = 'Books by Author';
+
+ // Using a specific context because I plan to expand this soon
+ const PARAMETERS = [
+ 'Books by Author' => [
+ 'author_url' => [
+ 'name' => 'Link to author\'s page on Goodreads',
+ 'type' => 'text',
+ 'required' => true,
+ 'title' => 'Should look somewhat like goodreads.com/author/show/',
+ 'pattern' => '^(https:\/\/)?(www.)?goodreads\.com\/author\/show\/\d+\..*$',
+ 'exampleValue' => 'https://www.goodreads.com/author/show/38550.Brandon_Sanderson'
+ ],
+ 'published_only' => [
+ 'name' => 'Show published books only',
+ 'type' => 'checkbox',
+ 'required' => false,
+ 'title' => 'If left unchecked, this will return unpublished books as well',
+ 'defaultValue' => 'checked',
+ ],
+ ],
+ ];
+
+ private function collectAuthorBooks($url)
+ {
+ $regex = '/goodreads\.com\/author\/show\/(\d+)/';
+
+ preg_match($regex, $url, $matches);
+
+ $authorId = $matches[1];
+
+ $authorListUrl = "https://www.goodreads.com/author/list/$authorId?sort=original_publication_year";
+
+ $html = getSimpleHTMLDOMCached($authorListUrl, self::CACHE_TIMEOUT);
+
+ foreach ($html->find('tr[itemtype="http://schema.org/Book"]') as $row) {
+ $dateSpan = $row->find('.uitext', 0)->plaintext;
+ $date = null;
+
+ // If book is not yet published, ignore for now
+ if (preg_match('/published\s+(\d{4})/', $dateSpan, $matches) === 1) {
+ // Goodreads doesn't give us exact publication date here, only a year
+ // We are skipping future dates anyway, so this is def published
+ // but we can't pick a dynamic date either to keep clients from getting
+ // confused. So we pick a guaranteed date of 1st-Jan instead.
+ $date = $matches[1] . '-01-01';
+ } elseif ($this->getInput('published_only') !== 'checked') {
+ // We can return unpublished books as well
+ $date = date('Y-01-01');
+ } else {
+ continue;
+ }
+
+ $row = defaultLinkTo($row, $this->getURI());
+
+ $item['title'] = $row->find('.bookTitle', 0)->plaintext;
+ $item['uri'] = $row->find('.bookTitle', 0)->getAttribute('href');
+ $item['author'] = $row->find('.authorName', 0)->plaintext;
+ $item['content'] = '<a href="'
+ . $row->find('.bookTitle', 0)->getAttribute('href')
+ . '"><img src="'
+ . $row->find('.bookCover', 0)->getAttribute('src')
+ . '"></a>';
+ $item['timestamp'] = $date;
+ $item['enclosures'] = [
+ $row->find('.bookCover', 0)->getAttribute('src')
+ ];
+
+ $this->items[] = $item; // Add item to the list
+ }
+ }
+
+ public function collectData()
+ {
+ switch ($this->queriedContext) {
+ case self::CONTEXT_AUTHOR_BOOKS:
+ $this->collectAuthorBooks($this->getInput('author_url'));
+ break;
+
+ default:
+ throw new Exception('Invalid context', 1);
+ break;
+ }
+ }
}