2022-05-24 14:34:40 +03:00
|
|
|
|
<?php
|
2022-07-01 16:10:30 +03:00
|
|
|
|
|
2022-05-24 14:34:40 +03:00
|
|
|
|
class CubariBridge extends BridgeAbstract
|
|
|
|
|
{
|
2022-07-01 16:10:30 +03:00
|
|
|
|
const NAME = 'Cubari';
|
|
|
|
|
const URI = 'https://cubari.moe';
|
|
|
|
|
const DESCRIPTION = 'Parses given cubari-formatted JSON file for updates.';
|
|
|
|
|
const MAINTAINER = 'KamaleiZestri';
|
|
|
|
|
const PARAMETERS = [[
|
|
|
|
|
'gist' => [
|
|
|
|
|
'name' => 'Gist/Raw Url',
|
|
|
|
|
'type' => 'text',
|
|
|
|
|
'required' => true,
|
|
|
|
|
'exampleValue' => 'https://raw.githubusercontent.com/kurisumx/baka/main/ikedan'
|
|
|
|
|
]
|
|
|
|
|
]];
|
|
|
|
|
|
|
|
|
|
private $mangaTitle = '';
|
|
|
|
|
|
|
|
|
|
public function getName()
|
|
|
|
|
{
|
|
|
|
|
if (!empty($this->mangaTitle)) {
|
|
|
|
|
return $this->mangaTitle . ' - ' . self::NAME;
|
|
|
|
|
} else {
|
|
|
|
|
return self::NAME;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function getURI()
|
|
|
|
|
{
|
|
|
|
|
if ($this->getInput('gist') != '') {
|
|
|
|
|
return self::URI . '/read/gist/' . $this->getEncodedGist();
|
|
|
|
|
} else {
|
|
|
|
|
return self::URI;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* The Cubari bridge.
|
|
|
|
|
*
|
|
|
|
|
* Cubari urls are base64 encodes of a given github raw or gist link described as below:
|
|
|
|
|
* https://cubari.moe/read/gist/${bаse64.url_encode(raw/<rest of the url...>)}/
|
|
|
|
|
* https://cubari.moe/read/gist/${bаse64.url_encode(gist/<rest of the url...>)}/
|
|
|
|
|
* https://cubari.moe/read/gist/${gitio shortcode}
|
|
|
|
|
*
|
|
|
|
|
* This bridge uses just the raw/gist and generates matching cubari urls.
|
|
|
|
|
*/
|
|
|
|
|
public function collectData()
|
|
|
|
|
{
|
2024-07-31 18:30:06 +03:00
|
|
|
|
// TODO: fix trivial SSRF
|
2023-10-13 01:26:11 +03:00
|
|
|
|
$json = getContents($this->getInput('gist'));
|
2024-07-31 18:30:06 +03:00
|
|
|
|
|
|
|
|
|
$jsonFile = Json::decode($json);
|
2022-07-01 16:10:30 +03:00
|
|
|
|
|
|
|
|
|
$this->mangaTitle = $jsonFile['title'];
|
|
|
|
|
|
|
|
|
|
$chapters = $jsonFile['chapters'];
|
|
|
|
|
|
|
|
|
|
foreach ($chapters as $chapnum => $chapter) {
|
|
|
|
|
$item = $this->getItemFromChapter($chapnum, $chapter);
|
|
|
|
|
$this->items[] = $item;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
array_multisort(array_column($this->items, 'timestamp'), SORT_DESC, $this->items);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected function getEncodedGist()
|
|
|
|
|
{
|
|
|
|
|
$url = $this->getInput('gist');
|
|
|
|
|
|
2023-10-13 01:26:11 +03:00
|
|
|
|
if (preg_match('/\/([a-z]*)\.githubusercontent.com(.*)/', $url, $matches)) {
|
|
|
|
|
// raw or gist is first match.
|
|
|
|
|
$unencoded = $matches[1] . $matches[2];
|
|
|
|
|
return base64_encode($unencoded);
|
|
|
|
|
} else {
|
|
|
|
|
// todo: fix this
|
|
|
|
|
return '';
|
|
|
|
|
}
|
2022-07-01 16:10:30 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private function getSanitizedHash($string)
|
|
|
|
|
{
|
|
|
|
|
return hash('sha1', preg_replace('/[^a-zA-Z0-9\-\.]/', '', ucwords(strtolower($string))));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected function getItemFromChapter($chapnum, $chapter)
|
|
|
|
|
{
|
|
|
|
|
$item = [];
|
|
|
|
|
|
|
|
|
|
$item['uri'] = $this->getURI() . '/' . $chapnum;
|
|
|
|
|
$item['title'] = 'Chapter ' . $chapnum . ' - ' . $chapter['title'] . ' - ' . $this->mangaTitle;
|
|
|
|
|
foreach ($chapter['groups'] as $key => $value) {
|
|
|
|
|
$item['author'] = $key;
|
|
|
|
|
}
|
|
|
|
|
$item['timestamp'] = $chapter['last_updated'];
|
|
|
|
|
|
|
|
|
|
$item['content'] = '<p>Manga: <a href=' . $this->getURI() . '>' . $this->mangaTitle . '</a> </p>
|
2022-05-24 14:34:40 +03:00
|
|
|
|
<p>Chapter Number: ' . $chapnum . '</p>
|
|
|
|
|
<p>Chapter Title: <a href=' . $item['uri'] . '>' . $chapter['title'] . '</a></p>
|
|
|
|
|
<p>Group: ' . $item['author'] . '</p>';
|
|
|
|
|
|
2022-07-01 16:10:30 +03:00
|
|
|
|
$item['uid'] = $this->getSanitizedHash($item['title'] . $item['author']);
|
2022-05-24 14:34:40 +03:00
|
|
|
|
|
2022-07-01 16:10:30 +03:00
|
|
|
|
return $item;
|
|
|
|
|
}
|
2022-05-24 14:34:40 +03:00
|
|
|
|
}
|