diff --git a/bridges/CruncyrollBridge.php b/bridges/CruncyrollBridge.php new file mode 100644 index 00000000..2001e7e4 --- /dev/null +++ b/bridges/CruncyrollBridge.php @@ -0,0 +1,121 @@ + [ + 'name' => 'Category', + 'type' => 'text', + 'required' => true, + 'exampleValue' => 'Announcements,News,News', + ], + 'page_size' => [ + 'name' => 'Page Size', + 'type' => 'number', + 'required' => false, + 'defaultValue' => 16, + ], + 'page' => [ + 'name' => 'Page', + 'type' => 'number', + 'required' => false, + 'defaultValue' => 1, + ], + ] + ]; + + /** + * Collects data from the Crunchyroll API and formats it as an RSS feed. + */ + public function collectData() { + // Define API base URL + $apiBaseUrl = 'https://cr-news-api-service.prd.crunchyrollsvc.com/v1/en-US/stories/search'; + + // Retrieve input parameters + $category = $this->getInput('category'); + $pageSize = $this->getInput('page_size'); + $page = $this->getInput('page'); + + // Construct the API URL + $apiUrl = sprintf( + '%s?category=%s&page_size=%d&page=%d', + $apiBaseUrl, + urlencode($category), + $pageSize, + $page + ); + + // Define HTTP headers for the API request + $options = [ + 'http' => [ + 'method' => 'GET', + 'header' => [ + 'User-Agent: Mozilla/5.0 (compatible; RSSBridge/2025)', + 'Accept: application/json', + 'Accept-Language: en-US,en;q=0.5', + 'Origin: https://www.crunchyroll.com', + 'Referer: https://www.crunchyroll.com/', + ], + ], + ]; + + // Create a context for the HTTP request + $context = stream_context_create($options); + + // Fetch data from the API + $response = file_get_contents($apiUrl, false, $context); + + if ($response === false) { + throw new Exception('Failed to fetch data from the Crunchyroll API.'); + } + + // Parse the JSON response + $data = json_decode($response, true); + + if (json_last_error() !== JSON_ERROR_NONE) { + throw new Exception('Failed to decode JSON response: ' . json_last_error_msg()); + } + + // Process each story in the response + foreach ($data['stories'] as $story) { + $item = []; + + // Set the item properties + $item['uri'] = self::URI . '/' . $story['slug']; + $item['title'] = $story['content']['headline']; + $item['timestamp'] = strtotime($story['content']['article_date']); + $item['author'] = 'Unknown'; // Author data can be added if available + $item['content'] = sprintf( + '%s
%s', + $story['content']['thumbnail']['filename'], + htmlspecialchars($story['content']['thumbnail']['alt']), + htmlspecialchars($story['content']['lead']) + ); + $item['categories'] = $story['tag_list'] ?? []; + $item['uid'] = $story['uuid']; + + // Add the item to the feed + $this->items[] = $item; + } + } +}