mirror of
https://github.com/RSS-Bridge/rss-bridge.git
synced 2024-11-29 06:38:51 +03:00
7591b10219
* [Core] New feature : User Interface to "Detect" Feed from an URL Detect Action has been expanded to support returning a Feed in a JSON format instead of a Redirect. Existing usage of the Detect action will keep working as usual. Frontpage template has now a section to display the Feed detection result, and a button to start the Feed Detection. A new JS file contains the necessary JS (Ajax and Event management) to fill the Feed Detection section. * Coding policy fixes * [Core] New feature : User Interface to "Detect" Feed from an URL - Switch from old school XMLHttpRequest to fetch - Enhance UX of search results - Revert to it's original content - Switch to a new Action : FindfeedAction.php - Switch to template literals instead of string concatenation - FindFeed action could retrun multiple feeds - Results are sent with an absolute URL - Switch to Json::encode() helper function * [Core] New feature : User Interface to "Detect" Feed from an URL - Move specific JS code to rss-bridge.js - Change HTML tag for the button to have a consistant style with th rest of the page * [Core] New feature : User Interface to "Detect" Feed from an URL - If no context is sent, assume there is only one unnamed context - Find parameter name in global and currect context * fix * remove typo --------- Co-authored-by: Dag <me@dvikan.no>
89 lines
3.3 KiB
PHP
89 lines
3.3 KiB
PHP
<?php
|
|
|
|
/**
|
|
* This action is used by the frontpage form search.
|
|
* It finds a bridge based off of a user input url.
|
|
* It uses bridges' detectParameters implementation.
|
|
*/
|
|
class FindfeedAction implements ActionInterface
|
|
{
|
|
public function execute(array $request)
|
|
{
|
|
$targetURL = $request['url'] ?? null;
|
|
$format = $request['format'] ?? null;
|
|
|
|
if (!$targetURL) {
|
|
return new Response('You must specify a url', 400);
|
|
}
|
|
if (!$format) {
|
|
return new Response('You must specify a format', 400);
|
|
}
|
|
|
|
$bridgeFactory = new BridgeFactory();
|
|
|
|
$results = [];
|
|
foreach ($bridgeFactory->getBridgeClassNames() as $bridgeClassName) {
|
|
if (!$bridgeFactory->isEnabled($bridgeClassName)) {
|
|
continue;
|
|
}
|
|
|
|
$bridge = $bridgeFactory->create($bridgeClassName);
|
|
|
|
$bridgeParams = $bridge->detectParameters($targetURL);
|
|
|
|
if ($bridgeParams === null) {
|
|
continue;
|
|
}
|
|
|
|
// It's allowed to have no 'context' in a bridge (only a default context without any name)
|
|
// In this case, the reference to the parameters are found in the first element of the PARAMETERS array
|
|
|
|
$context = $bridgeParams['context'] ?? 0;
|
|
|
|
$bridgeData = [];
|
|
// Construct the array of parameters
|
|
foreach ($bridgeParams as $key => $value) {
|
|
// 'context' is a special case : it's a bridge parameters, there is no "name" for this parameter
|
|
if ($key == 'context') {
|
|
$bridgeData[$key]['name'] = 'Context';
|
|
$bridgeData[$key]['value'] = $value;
|
|
} else {
|
|
$bridgeData[$key]['name'] = $this->getParameterName($bridge, $context, $key);
|
|
$bridgeData[$key]['value'] = $value;
|
|
}
|
|
}
|
|
|
|
$bridgeParams['bridge'] = $bridgeClassName;
|
|
$bridgeParams['format'] = $format;
|
|
$content = [
|
|
'url' => get_home_page_url() . '?action=display&' . http_build_query($bridgeParams),
|
|
'bridgeParams' => $bridgeParams,
|
|
'bridgeData' => $bridgeData,
|
|
'bridgeMeta' => [
|
|
'name' => $bridge::NAME,
|
|
'description' => $bridge::DESCRIPTION,
|
|
'parameters' => $bridge::PARAMETERS,
|
|
'icon' => $bridge->getIcon(),
|
|
],
|
|
];
|
|
$results[] = $content;
|
|
}
|
|
if ($results === []) {
|
|
return new Response(Json::encode(['message' => 'No bridge found for given url']), 404, ['content-type' => 'application/json']);
|
|
}
|
|
return new Response(Json::encode($results), 200, ['content-type' => 'application/json']);
|
|
}
|
|
|
|
// Get parameter name in the actual context, or in the global parameter
|
|
private function getParameterName($bridge, $context, $key)
|
|
{
|
|
if (isset($bridge::PARAMETERS[$context][$key]['name'])) {
|
|
$name = $bridge::PARAMETERS[$context][$key]['name'];
|
|
} else if (isset($bridge::PARAMETERS['global'][$key]['name'])) {
|
|
$name = $bridge::PARAMETERS['global'][$key]['name'];
|
|
} else {
|
|
$name = 'Variable "' . $key . '" (No name provided)';
|
|
}
|
|
return $name;
|
|
}
|
|
}
|