2017-03-13 23:22:20 -04:00
|
|
|
<?php
|
|
|
|
declare(strict_types=1);
|
2017-03-28 00:12:12 -04:00
|
|
|
namespace JKingWeb\Arsse;
|
2017-03-13 23:22:20 -04:00
|
|
|
|
|
|
|
class REST {
|
2017-03-18 22:30:36 -04:00
|
|
|
protected $apis = [
|
|
|
|
// NextCloud News version enumerator
|
|
|
|
'ncn' => [
|
|
|
|
'match' => '/index.php/apps/news/api',
|
|
|
|
'strip' => '/index.php/apps/news/api',
|
|
|
|
'class' => REST\NextCloudNews\Versions::class,
|
|
|
|
],
|
|
|
|
// NextCloud News v1-2 https://github.com/nextcloud/news/blob/master/docs/externalapi/Legacy.md
|
|
|
|
'ncn_v1-2' => [
|
|
|
|
'match' => '/index.php/apps/news/api/v1-2/',
|
|
|
|
'strip' => '/index.php/apps/news/api/v1-2',
|
|
|
|
'class' => REST\NextCloudNews\V1_2::class,
|
|
|
|
],
|
2017-09-24 23:32:21 -04:00
|
|
|
'ttrss_api' => [ // Tiny Tiny RSS https://git.tt-rss.org/git/tt-rss/wiki/ApiReference
|
|
|
|
'match' => '/tt-rss/api/',
|
|
|
|
'strip' => '/tt-rss/api/',
|
|
|
|
'class' => REST\TinyTinyRSS\API::class,
|
|
|
|
],
|
2017-03-18 22:30:36 -04:00
|
|
|
// Other candidates:
|
|
|
|
// NextCloud News v2 https://github.com/nextcloud/news/blob/master/docs/externalapi/External-Api.md
|
|
|
|
// Feedbin v1 https://github.com/feedbin/feedbin-api/commit/86da10aac5f1a57531a6e17b08744e5f9e7db8a9
|
|
|
|
// Feedbin v2 https://github.com/feedbin/feedbin-api
|
|
|
|
// Fever https://feedafever.com/api
|
|
|
|
// NewsBlur http://www.newsblur.com/api
|
2017-07-15 16:44:06 -04:00
|
|
|
// Miniflux https://github.com/miniflux/miniflux/blob/master/docs/json-rpc-api.markdown
|
|
|
|
// CommaFeed https://www.commafeed.com/api/
|
2017-03-18 22:30:36 -04:00
|
|
|
];
|
2017-04-06 21:41:21 -04:00
|
|
|
|
2017-08-29 10:50:31 -04:00
|
|
|
public function __construct() {
|
2017-03-18 22:30:36 -04:00
|
|
|
}
|
2017-03-13 23:22:20 -04:00
|
|
|
|
2017-08-29 10:50:31 -04:00
|
|
|
public function dispatch(REST\Request $req = null): REST\Response {
|
|
|
|
if ($req===null) {
|
2017-07-20 22:40:09 -04:00
|
|
|
$req = new REST\Request();
|
|
|
|
}
|
2017-04-01 23:06:52 -04:00
|
|
|
$api = $this->apiMatch($req->url, $this->apis);
|
2017-08-29 10:50:31 -04:00
|
|
|
$req->url = substr($req->url, strlen($this->apis[$api]['strip']));
|
2017-04-01 23:06:52 -04:00
|
|
|
$req->refreshURL();
|
2017-03-18 22:30:36 -04:00
|
|
|
$class = $this->apis[$api]['class'];
|
2017-03-28 18:50:00 -04:00
|
|
|
$drv = new $class();
|
2017-09-30 12:52:05 -04:00
|
|
|
if ($req->head) {
|
|
|
|
$res = $drv->dispatch($req);
|
|
|
|
$res->head = true;
|
|
|
|
return $res;
|
|
|
|
} else {
|
|
|
|
return $drv->dispatch($req);
|
|
|
|
}
|
2017-03-18 22:30:36 -04:00
|
|
|
}
|
|
|
|
|
2017-08-29 10:50:31 -04:00
|
|
|
public function apiMatch(string $url, array $map): string {
|
2017-03-18 22:30:36 -04:00
|
|
|
// sort the API list so the longest URL prefixes come first
|
2017-08-29 10:50:31 -04:00
|
|
|
uasort($map, function ($a, $b) {
|
|
|
|
return (strlen($a['match']) <=> strlen($b['match'])) * -1;
|
|
|
|
});
|
2017-03-18 22:30:36 -04:00
|
|
|
// find a match
|
2017-08-29 10:50:31 -04:00
|
|
|
foreach ($map as $id => $api) {
|
|
|
|
if (strpos($url, $api['match'])===0) {
|
2017-07-20 22:40:09 -04:00
|
|
|
return $id;
|
|
|
|
}
|
2017-03-18 22:30:36 -04:00
|
|
|
}
|
|
|
|
// or throw an exception otherwise
|
2017-07-15 16:44:06 -04:00
|
|
|
throw new REST\Exception501();
|
2017-03-18 22:30:36 -04:00
|
|
|
}
|
2017-08-29 10:50:31 -04:00
|
|
|
}
|