<?php class ShadertoyBridge extends BridgeAbstract { const NAME = 'Shadertoy'; const URI = 'https://www.shadertoy.com'; const DESCRIPTION = 'Latest submissions on Shadertoy'; const MAINTAINER = 'thefranke'; const CACHE_TIMEOUT = 3600; // 1h const PARAMETERS = [ [ 'category' => [ 'name' => 'category', 'type' => 'list', 'exampleValue' => 'Popular', 'title' => 'Select a category', 'values' => [ 'Shaders of the Week' => 'sotw', 'Popular' => 'popular', 'Newest' => 'newest', 'Hot' => 'hot', ] ] ] ]; public function postprocessDescription($content) { // replace [url] tags $pattern = '/\[\/?url.*?\]/'; $replace = ''; $content = preg_replace($pattern, $replace, $content); // find URLs and turn then into hyperlinks $pattern = '/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/'; $replace = '<a href="$0">$0</a>'; $content = preg_replace($pattern, $replace, $content); return $content; } public function collectData() { $category = $this->getInput('category'); $json = NULL; if ($category == 'sotw') { $url = static::URI . '/playlist/week'; $contents = getContents($url); $shaderids = extractFromDelimiters($contents, 'var gShaderIDs = ', ';'); $shaderids = str_replace("'", "\"", $shaderids); $url = static::URI . '/shadertoy'; $data = 's=' . rawurlencode('{ "shaders": ' . $shaderids . ' }') . '&nt=0&nl=0&np=0'; $header = [ 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:135.0) Gecko/20100101 Firefox/135.0', 'Content-Type: application/x-www-form-urlencoded', 'Accept: */*', 'Origin: https://www.shadertoy.com', 'Referer: https://www.shadertoy.com/playlist/week', ]; $opts = [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => $data, CURLOPT_RETURNTRANSFER => true ]; $json = getContents($url, $header, $opts); } else { $url = static::URI . '/results?sort=' . $category; $contents = getContents($url); $json = extractFromDelimiters($contents, 'var gShaders=', 'var gUseScreenshots'); $json = substr(trim($json), 0, -1); } $json = Json::decode($json); if (!$json) { throw new Exception(sprintf('Unable to find css selector on `%s`', static::URI)); } foreach ($json as $article) { $id = $article['info']['id']; $title = $article["info"]["name"]; $author = $article["info"]["username"]; $uri = static::URI . "/view/" . $id; $content = '<p><img src="' . static::URI . '/media/shaders/' . $id . '.jpg"></p><p>' . $this->postprocessDescription($article["info"]["description"]) . '</p>'; $timestamp = $article["info"]["date"]; $this->items[] = [ 'title' => $title, 'author' => $author, 'uri' => $uri, 'content' => $content, 'timestamp' => $timestamp, ]; } } }