From 410daee1d5cdc0fd7c5ec2125126b0f2089af85f Mon Sep 17 00:00:00 2001 From: Yaman Qalieh Date: Sat, 7 May 2022 20:46:57 -0400 Subject: [PATCH] [PixivBridge] Add User context (#2650) --- bridges/PixivBridge.php | 206 ++++++++++++++++++++++++++++++---------- 1 file changed, 156 insertions(+), 50 deletions(-) diff --git a/bridges/PixivBridge.php b/bridges/PixivBridge.php index 1e1b8952..2aecc478 100644 --- a/bridges/PixivBridge.php +++ b/bridges/PixivBridge.php @@ -1,81 +1,187 @@ array( - 'name' => 'Post Type', - 'type' => 'list', - 'values' => array('Illustration' => 'illustrations/', - 'Manga' => 'manga/', - 'Novel' => 'novels/') + const PARAMETERS = array( + 'global' => array( + 'posts' => array( + 'name' => 'Post Limit', + 'type' => 'number', + 'defaultValue' => '10' + ), + 'fullsize' => array( + 'name' => 'Full-size Image', + 'type' => 'checkbox' + ), + 'mode' => array( + 'name' => 'Post Type', + 'type' => 'list', + 'values' => array('All Works' => 'all', + 'Illustrations' => 'illustrations/', + 'Manga' => 'manga/', + 'Novels' => 'novels/') + ), ), - 'tag' => array( - 'name' => 'Query to search', - 'exampleValue' => 'オリジナル', - 'required' => true + // Backwards compatibility: Original bridge only had tags + '' => array( + 'tag' => array( + 'name' => 'Query to search', + 'exampleValue' => 'オリジナル', + 'required' => true + ) ), - 'posts' => array( - 'name' => 'Post Limit', - 'type' => 'number', - 'defaultValue' => '10' - ), - 'fullsize' => array( - 'name' => 'Full-size Image', - 'type' => 'checkbox' + 'User' => array( + 'userid' => array( + 'name' => 'User ID from profile URL', + 'exampleValue' => '11', + 'required' => true + ) ) - )); + ); + // maps from URLs to json keys by context const JSON_KEY_MAP = array( - 'illustrations/' => 'illust', - 'manga/' => 'manga', - 'novels/' => 'novel' - ); - const WORK_LINK_MAP = array( - 'illustrations/' => 'artworks/', - 'manga/' => 'artworks/', - 'novels/' => 'novel/show.php?id=' + '' => array( + 'illustrations/' => 'illust', + 'manga/' => 'manga', + 'novels/' => 'novel' + ), + 'User' => array( + 'illustrations/' => 'illusts', + 'manga/' => 'manga', + 'novels/' => 'novels' + ) ); + // Hold the username for getName() + private $username = null; + + public function getName() { + switch($this->queriedContext) { + // Tags context + case '': + $context = 'Tag'; + $query = $this->getInput('tag'); + break; + case 'User': + $context = 'User'; + $query = $this->username ?? $this->getInput('userid'); + break; + default: + return parent::getName(); + } + $mode = array_search($this->getInput('mode'), + self::PARAMETERS['global']['mode']['values']); + return "Pixiv ${mode} from ${context} ${query}"; + } + + public function getURI() { + switch($this->queriedContext) { + // Tags context + case '': + $uri = static::URI . 'tags/' . urlencode($this->getInput('tag')); + break; + case 'User': + $uri = static::URI . 'users/' . $this->getInput('userid'); + break; + default: + return parent::getURI(); + } + if ($this->getInput('mode') != 'all') { + $uri = $uri . '/' . $this->getInput('mode'); + } + return $uri; + } + + private function getSearchURI($mode) { + switch($this->queriedContext) { + // Tags context + case '': + $query = urlencode($this->getInput('tag')); + $uri = static::URI . 'ajax/search/top/' . $query; + break; + case 'User': + $uri = static::URI . 'ajax/user/' . $this->getInput('userid') + . '/profile/top'; + break; + default: + returnClientError('Invalid Context'); + } + return $uri; + } + + private function getDataFromJSON($json, $json_key) { + $json = $json['body'][$json_key]; + // Tags context contains subkey + if ($this->queriedContext == '') { + $json = $json['data']; + } + return $json; + } + + private function collectWorksArray() { + $content = getContents($this->getSearchURI($this->getInput('mode'))); + $content = json_decode($content, true); + if ($this->getInput('mode') == 'all') { + $total = array(); + foreach(self::JSON_KEY_MAP[$this->queriedContext] as $mode => $json_key) { + $current = $this->getDataFromJSON($content, $json_key); + $total = array_merge($total, $current); + } + $content = $total; + } else { + $json_key = self::JSON_KEY_MAP[$this->queriedContext][$this->getInput('mode')]; + $content = $this->getDataFromJSON($content, $json_key); + } + return $content; + } + public function collectData() { - $content = getContents($this->getSearchURI()); - $content = json_decode($content, true); - $key = self::JSON_KEY_MAP[$this->getInput('mode')]; - $count = 0; - foreach($content['body'][$key]['data'] as $result) { - $count++; - if ($count > $this->getInput('posts')) { - break; - } + $content = $this->collectWorksArray(); + + $content = array_filter($content, function($v, $k) { + return !array_key_exists('isAdContainer', $v); + }, ARRAY_FILTER_USE_BOTH); + // Sort by updateDate to get newest works + usort($content, function($a, $b) { + return $b['updateDate'] <=> $a['updateDate']; + }); + $content = array_slice($content, 0, $this->getInput('posts')); + + foreach($content as $result) { + // Store username for getName() + if (!$this->username) + $this->username = $result['userName']; $item = array(); - $item['id'] = $result['id']; - $item['uri'] = static::URI . self::WORK_LINK_MAP[$this->getInput('mode')] . $result['id']; + $item['uid'] = $result['id']; + $subpath = array_key_exists('illustType', $result) ? 'artworks/' : 'novel/show.php?id='; + $item['uri'] = static::URI . $subpath . $result['id']; $item['title'] = $result['title']; $item['author'] = $result['userName']; $item['timestamp'] = $result['updateDate']; - $item['content'] = ""; + $item['tags'] = $result['tags']; + $item['content'] = ""; + + // Additional content items + if (array_key_exists('pageCount', $result)) { + $item['content'] .= '
Page Count: ' . $result['pageCount']; + } else { + $item['content'] .= '
Word Count: ' . $result['wordCount']; + } $this->items[] = $item; } } - private function getSearchURI() { - $query = urlencode($this->getInput('tag')); - - $uri = static::URI . 'ajax/search/' . $this->getInput('mode') - . $query . '?word=' . $query . '&order=date_d&mode=all&p=1'; - - return $uri; - } - private function cacheImage($url, $illustId) { $illustId = preg_replace('/[^0-9]/', '', $illustId); $thumbnailurl = $url;