aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bridges/DerpibooruBridge.php113
1 files changed, 113 insertions, 0 deletions
diff --git a/bridges/DerpibooruBridge.php b/bridges/DerpibooruBridge.php
new file mode 100644
index 00000000..995e0cc1
--- /dev/null
+++ b/bridges/DerpibooruBridge.php
@@ -0,0 +1,113 @@
+<?php
+class DerpibooruBridge extends BridgeAbstract {
+ const NAME = 'Derpibooru Bridge';
+ const URI = 'https://derpibooru.org/';
+ const DESCRIPTION = 'Returns newest posts from a Derpibooru search';
+ const CACHE_TIMEOUT = 300; // 5min
+ const MAINTAINER = 'Roliga';
+
+ const PARAMETERS = array(
+ array(
+ 'f' => array(
+ 'name' => 'Filter',
+ 'type' => 'list',
+ 'values' => array(
+ 'Everything' => 56027,
+ '18+ R34' => 37432,
+ 'Legacy Default' => 37431,
+ '18+ Dark' => 37429,
+ 'Maximum Spoilers' => 37430,
+ 'Default' => 100073
+ ),
+ 'defaultValue' => 56027
+
+ ),
+ 'q' => array(
+ 'name' => 'Query',
+ 'required' => true
+ )
+ )
+ );
+
+ public function detectParameters($url){
+ $params = array();
+
+ // Search page e.g. https://derpibooru.org/search?q=cute
+ $regex = '/^(https?:\/\/)?(www\.)?derpibooru.org\/search.+q=([^\/&?\n]+)/';
+ if(preg_match($regex, $url, $matches) > 0) {
+ $params['q'] = urldecode($matches[3]);
+ return $params;
+ }
+
+ // Tag page, e.g. https://derpibooru.org/tags/artist-colon-devinian
+ $regex = '/^(https?:\/\/)?(www\.)?derpibooru.org\/tags\/([^\/&?\n]+)/';
+ if(preg_match($regex, $url, $matches) > 0) {
+ $params['q'] = str_replace('-colon-', ':', urldecode($matches[3]));
+ return $params;
+ }
+
+ return null;
+ }
+
+ public function getName(){
+ if(!is_null($this->getInput('q'))) {
+ return 'Derpibooru search for: '
+ . $this->getInput('q');
+ } else {
+ return parent::getName();
+ }
+ }
+
+ public function getURI(){
+ if(!is_null($this->getInput('f')) && !is_null($this->getInput('q'))) {
+ return self::URI
+ . 'search?filter_id='
+ . urlencode($this->getInput('f'))
+ . '&q='
+ . urlencode($this->getInput('q'));
+ } else {
+ return parent::getURI();
+ }
+ }
+
+ public function collectData(){
+ $queryJson = json_decode(getContents(
+ self::URI
+ . 'search.json?filter_id='
+ . urlencode($this->getInput('f'))
+ . '&q='
+ . urlencode($this->getInput('q'))
+ )) or returnServerError('Failed to query Derpibooru');
+
+ foreach($queryJson->search as $post) {
+ $item = array();
+
+ $postUri = self::URI . $post->id;
+
+ $item['uri'] = $postUri;
+ $item['title'] = $post->id;
+ $item['timestamp'] = strtotime($post->created_at);
+ $item['author'] = $post->uploader;
+ $item['enclosures'] = array('https:' . $post->image);
+ $item['categories'] = explode(', ', $post->tags);
+
+ $item['content'] = '<p><a href="' // image preview
+ . $postUri
+ . '"><img src="https:'
+ . $post->representations->medium
+ . '"></a></p><p>' // description
+ . $post->description
+ . '</p><p><b>Size:</b> ' // image size
+ . $post->width
+ . 'x'
+ . $post->height
+ . '<br><b>Source:</b> <a href="' // source link
+ . $post->source_url
+ . '">'
+ . $post->source_url
+ . '</a></p>';
+
+ $this->items[] = $item;
+ }
+ }
+}