94 lines
2.5 KiB
PHP
94 lines
2.5 KiB
PHP
|
<?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;
|
||
|
}
|
||
|
}
|
||
|
}
|