mirror of
https://github.com/RSS-Bridge/rss-bridge.git
synced 2024-11-22 09:35:28 +03:00
4f75591060
Reformat code base to PSR12 Co-authored-by: rssbridge <noreply@github.com>
101 lines
3 KiB
PHP
101 lines
3 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 = [
|
|
'Search Query' => [
|
|
'q' => [
|
|
'name' => 'Search term',
|
|
'required' => true,
|
|
'exampleValue' => 'bird'
|
|
]
|
|
]
|
|
];
|
|
|
|
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 = [
|
|
'Content-Type: application/json',
|
|
'Accept: application/json'
|
|
];
|
|
|
|
$opts = [
|
|
CURLOPT_POST => true,
|
|
CURLOPT_POSTFIELDS => $data,
|
|
CURLOPT_RETURNTRANSFER => true
|
|
];
|
|
|
|
$jsonSearchURL = self::URI . '/api/v2/search/projects.json';
|
|
$jsonSearchStr = getContents($jsonSearchURL, $header, $opts);
|
|
return json_decode($jsonSearchStr);
|
|
}
|
|
|
|
private function fetchProject($hashID)
|
|
{
|
|
$jsonProjectURL = self::URI . '/projects/' . $hashID . '.json';
|
|
$jsonProjectStr = getContents($jsonProjectURL);
|
|
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 = [];
|
|
$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;
|
|
}
|
|
}
|
|
}
|
|
}
|