diff options
Diffstat (limited to 'bridges/ArtStationBridge.php')
-rw-r--r-- | bridges/ArtStationBridge.php | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/bridges/ArtStationBridge.php b/bridges/ArtStationBridge.php new file mode 100644 index 0000000..9c12add --- /dev/null +++ b/bridges/ArtStationBridge.php @@ -0,0 +1,93 @@ +<?php +class ArtStationBridge extends BridgeAbstract { + const NAME = 'ArtStation'; + const URI = 'https://www.artstation.com'; + const DESCRIPTION = 'Fetches the latest ten artworks from a search query on ArtStation.'; + const MAINTAINER = 'thefranke'; + const CACHE_TIMEOUT = 3600; // 1h + + const PARAMETERS = array( + 'Search Query' => array( + 'q' => array( + 'name' => 'Search term', + 'required' => true + ) + ) + ); + + public function getIcon() { + return 'https://www.artstation.com/assets/favicon-58653022bc38c1905ac7aa1b10bffa6b.ico'; + } + + public function getName() { + return self::NAME . ': ' . $this->getInput('q'); + } + + private function fetchSearch($searchQuery) { + $data = '{"query":"' . $searchQuery . '","page":1,"per_page":50,"sorting":"date",'; + $data .= '"pro_first":"1","filters":[],"additional_fields":[]}'; + + $header = array( + 'Content-Type: application/json', + 'Accept: application/json' + ); + + $opts = array( + CURLOPT_POST => true, + CURLOPT_POSTFIELDS => $data, + CURLOPT_RETURNTRANSFER => true + ); + + $jsonSearchURL = self::URI . '/api/v2/search/projects.json'; + $jsonSearchStr = getContents($jsonSearchURL, $header, $opts) + or returnServerError('Could not fetch JSON for search query.'); + return json_decode($jsonSearchStr); + } + + private function fetchProject($hashID) { + $jsonProjectURL = self::URI . '/projects/' . $hashID . '.json'; + $jsonProjectStr = getContents($jsonProjectURL) + or returnServerError('Could not fetch JSON for project.'); + return json_decode($jsonProjectStr); + } + + public function collectData() { + $searchTerm = $this->getInput('q'); + $jsonQuery = $this->fetchSearch($searchTerm); + + foreach($jsonQuery->data as $media) { + // get detailed info about media item + $jsonProject = $this->fetchProject($media->hash_id); + + // create item + $item = array(); + $item['title'] = $media->title; + $item['uri'] = $media->url; + $item['timestamp'] = strtotime($jsonProject->published_at); + $item['author'] = $media->user->full_name; + $item['categories'] = implode(',', $jsonProject->tags); + + $item['content'] = '<a href="' + . $media->url + . '"><img style="max-width: 100%" src="' + . $jsonProject->cover_url + . '"></a><p>' + . $jsonProject->description + . '</p>'; + + $numAssets = count($jsonProject->assets); + + if ($numAssets > 1) + $item['content'] .= '<p><a href="' + . $media->url + . '">Project contains ' + . ($numAssets - 1) + . ' more item(s).</a></p>'; + + $this->items[] = $item; + + if (count($this->items) >= 10) + break; + } + } +} |