mirror of https://github.com/YGGverse/Pulsar.git
yggverse
6 months ago
8 changed files with 666 additions and 146 deletions
@ -1,4 +1,7 @@ |
|||||||
/composer.lock |
/composer.lock |
||||||
/config.json |
|
||||||
|
/config/* |
||||||
|
!/config/example.json |
||||||
|
|
||||||
/server/ |
/server/ |
||||||
/vendor/ |
/vendor/ |
||||||
|
@ -0,0 +1,88 @@ |
|||||||
|
{ |
||||||
|
"database": |
||||||
|
{ |
||||||
|
"location":"example.sqlite", |
||||||
|
"username":null, |
||||||
|
"password":null |
||||||
|
}, |
||||||
|
"crawler": |
||||||
|
{ |
||||||
|
"channel": |
||||||
|
[ |
||||||
|
{ |
||||||
|
"source":"https://www.omglinux.com/feed", |
||||||
|
"enabled":true, |
||||||
|
"item": |
||||||
|
{ |
||||||
|
"link": |
||||||
|
{ |
||||||
|
"enabled":true, |
||||||
|
"required":false |
||||||
|
}, |
||||||
|
"pubDate": |
||||||
|
{ |
||||||
|
"enabled":true, |
||||||
|
"required":false |
||||||
|
}, |
||||||
|
"title": |
||||||
|
{ |
||||||
|
"enabled":true, |
||||||
|
"required":false |
||||||
|
}, |
||||||
|
"description": |
||||||
|
{ |
||||||
|
"enabled":true, |
||||||
|
"required":false |
||||||
|
}, |
||||||
|
"content":{ |
||||||
|
"enabled":false, |
||||||
|
"required":false |
||||||
|
} |
||||||
|
}, |
||||||
|
"debug": |
||||||
|
{ |
||||||
|
"info":true, |
||||||
|
"warning":true, |
||||||
|
"error":true |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
"source":"https://omgubuntu.co.uk/feed", |
||||||
|
"enabled":false, |
||||||
|
"item": |
||||||
|
{ |
||||||
|
"link": |
||||||
|
{ |
||||||
|
"enabled":true, |
||||||
|
"required":false |
||||||
|
}, |
||||||
|
"pubDate": |
||||||
|
{ |
||||||
|
"enabled":true, |
||||||
|
"required":false |
||||||
|
}, |
||||||
|
"title": |
||||||
|
{ |
||||||
|
"enabled":true, |
||||||
|
"required":false |
||||||
|
}, |
||||||
|
"description": |
||||||
|
{ |
||||||
|
"enabled":true, |
||||||
|
"required":false |
||||||
|
}, |
||||||
|
"content":{ |
||||||
|
"enabled":false, |
||||||
|
"required":false |
||||||
|
} |
||||||
|
}, |
||||||
|
"debug": |
||||||
|
{ |
||||||
|
"info":true, |
||||||
|
"warning":true, |
||||||
|
"error":true |
||||||
|
} |
||||||
|
} |
||||||
|
] |
||||||
|
} |
||||||
|
} |
@ -1,23 +0,0 @@ |
|||||||
{ |
|
||||||
"feed": |
|
||||||
[ |
|
||||||
{ |
|
||||||
"source":"https://www.omglinux.com/feed", |
|
||||||
"target":"server/127.0.0.1/public/omglinux/feed.gmi", |
|
||||||
"item": |
|
||||||
{ |
|
||||||
"template":"=> {link} {title}{nl}{nl}{description}", |
|
||||||
"limit":20 |
|
||||||
} |
|
||||||
}, |
|
||||||
{ |
|
||||||
"source":"https://omgubuntu.co.uk/feed", |
|
||||||
"target":"server/127.0.0.1/public/omgubuntu/feed.gmi", |
|
||||||
"item": |
|
||||||
{ |
|
||||||
"template":"=> {link} {title}{nl}{nl}{description}", |
|
||||||
"limit":20 |
|
||||||
} |
|
||||||
} |
|
||||||
] |
|
||||||
} |
|
@ -0,0 +1,171 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
declare(strict_types=1); |
||||||
|
|
||||||
|
namespace Yggverse\Pulsar\Model; |
||||||
|
|
||||||
|
class Database |
||||||
|
{ |
||||||
|
public \PDO $_database; |
||||||
|
|
||||||
|
public function __construct( |
||||||
|
string $database, |
||||||
|
?string $username = null, |
||||||
|
?string $password = null |
||||||
|
) { |
||||||
|
$this->_database = new \PDO( |
||||||
|
sprintf( |
||||||
|
'sqlite:%s', |
||||||
|
$database |
||||||
|
), |
||||||
|
$username, |
||||||
|
$password |
||||||
|
); |
||||||
|
|
||||||
|
$this->_database->setAttribute( |
||||||
|
\PDO::ATTR_ERRMODE, |
||||||
|
\PDO::ERRMODE_EXCEPTION |
||||||
|
); |
||||||
|
|
||||||
|
$this->_database->setAttribute( |
||||||
|
\PDO::ATTR_DEFAULT_FETCH_MODE, |
||||||
|
\PDO::FETCH_OBJ |
||||||
|
); |
||||||
|
|
||||||
|
$this->_database->query(' |
||||||
|
CREATE TABLE IF NOT EXISTS "channel" |
||||||
|
( |
||||||
|
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, |
||||||
|
"time" INTEGER NOT NULL, |
||||||
|
"source" TEXT NOT NULL, |
||||||
|
"link" TEXT, |
||||||
|
"title" TEXT, |
||||||
|
"description" TEXT |
||||||
|
) |
||||||
|
'); |
||||||
|
|
||||||
|
$this->_database->query(' |
||||||
|
CREATE TABLE IF NOT EXISTS "channelItem" |
||||||
|
( |
||||||
|
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, |
||||||
|
"channelId" INTEGER NOT NULL, |
||||||
|
"time" INTEGER NOT NULL, |
||||||
|
"pubTime" INTEGER, |
||||||
|
"guid" TEXT NOT NULL, |
||||||
|
"link" TEXT, |
||||||
|
"title" TEXT, |
||||||
|
"description" TEXT, |
||||||
|
"content" TEXT |
||||||
|
) |
||||||
|
'); |
||||||
|
} |
||||||
|
|
||||||
|
public function getChannelIdBySource( |
||||||
|
string $source |
||||||
|
): ?int |
||||||
|
{ |
||||||
|
$query = $this->_database->prepare( |
||||||
|
'SELECT `id` FROM `channel` WHERE `source` LIKE :source LIMIT 1' |
||||||
|
); |
||||||
|
|
||||||
|
$query->execute( |
||||||
|
[ |
||||||
|
':source' => $source |
||||||
|
] |
||||||
|
); |
||||||
|
|
||||||
|
if ($result = $query->fetch()) |
||||||
|
{ |
||||||
|
return $result->id; |
||||||
|
} |
||||||
|
|
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public function addChannel( |
||||||
|
string $source, |
||||||
|
?string $link, |
||||||
|
?string $title, |
||||||
|
?string $description, |
||||||
|
?int $time = null |
||||||
|
): ?int |
||||||
|
{ |
||||||
|
$query = $this->_database->prepare( |
||||||
|
'INSERT INTO `channel` (`source`, `link`, `title`, `description`, `time`) |
||||||
|
VALUES (:source, :link, :title, :description, :time)' |
||||||
|
); |
||||||
|
|
||||||
|
$query->execute( |
||||||
|
[ |
||||||
|
':source' => $source, |
||||||
|
':link' => $link, |
||||||
|
':title' => $title, |
||||||
|
':description' => $description, |
||||||
|
':time' => $time ? $time : time() |
||||||
|
] |
||||||
|
); |
||||||
|
|
||||||
|
if ($id = $this->_database->lastInsertId()) |
||||||
|
{ |
||||||
|
return (int) $id; |
||||||
|
} |
||||||
|
|
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public function isChannelItemExist( |
||||||
|
int $channelId, |
||||||
|
string $guid |
||||||
|
): bool |
||||||
|
{ |
||||||
|
$query = $this->_database->prepare( |
||||||
|
'SELECT NULL FROM `channelItem` WHERE `channelId` = :channelId AND `guid` LIKE :guid LIMIT 1' |
||||||
|
); |
||||||
|
|
||||||
|
$query->execute( |
||||||
|
[ |
||||||
|
':channelId' => $channelId, |
||||||
|
':guid' => $guid |
||||||
|
] |
||||||
|
); |
||||||
|
|
||||||
|
return (bool) $query->fetch(); |
||||||
|
} |
||||||
|
|
||||||
|
public function addChannelItem( |
||||||
|
int $channelId, |
||||||
|
string $guid, |
||||||
|
?string $link, |
||||||
|
?string $title, |
||||||
|
?string $description, |
||||||
|
?string $content, |
||||||
|
?int $pubTime, |
||||||
|
?int $time = null |
||||||
|
): ?int |
||||||
|
{ |
||||||
|
$query = $this->_database->prepare( |
||||||
|
'INSERT INTO `channelItem` (`channelId`, `guid`, `link`, `title`, `description`, `content`, `pubTime`, `time`) |
||||||
|
VALUES (:channelId, :guid, :link, :title, :description, :content, :pubTime, :time)' |
||||||
|
); |
||||||
|
|
||||||
|
$query->execute( |
||||||
|
[ |
||||||
|
':channelId' => $channelId, |
||||||
|
':guid' => $guid, |
||||||
|
':link' => $link, |
||||||
|
':title' => $title, |
||||||
|
':description' => $description, |
||||||
|
':content' => $content, |
||||||
|
':pubTime' => $pubTime, |
||||||
|
':time' => $time ? $time : time() |
||||||
|
] |
||||||
|
); |
||||||
|
|
||||||
|
if ($id = $this->_database->lastInsertId()) |
||||||
|
{ |
||||||
|
return (int) $id; |
||||||
|
} |
||||||
|
|
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,69 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
declare(strict_types=1); |
||||||
|
|
||||||
|
namespace Yggverse\Pulsar\Model; |
||||||
|
|
||||||
|
class Filter |
||||||
|
{ |
||||||
|
public static function url( |
||||||
|
string $value |
||||||
|
): string |
||||||
|
{ |
||||||
|
return trim( |
||||||
|
urldecode( |
||||||
|
$value |
||||||
|
) |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
public static function title( |
||||||
|
string $value |
||||||
|
): string |
||||||
|
{ |
||||||
|
return trim( |
||||||
|
preg_replace( |
||||||
|
[ |
||||||
|
'/[\n\r]*/', |
||||||
|
'/[\s]{2,}/', |
||||||
|
], |
||||||
|
' ', |
||||||
|
$this->text( |
||||||
|
$value |
||||||
|
) |
||||||
|
) |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
public static function description( |
||||||
|
string $value |
||||||
|
): string |
||||||
|
{ |
||||||
|
return $this->text( |
||||||
|
$value |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
public static function text( |
||||||
|
string $value |
||||||
|
): string |
||||||
|
{ |
||||||
|
return trim( |
||||||
|
preg_replace( |
||||||
|
[ |
||||||
|
'/[\n\r]{2,}/', |
||||||
|
'/[\s]{2,}/', |
||||||
|
], |
||||||
|
[ |
||||||
|
PHP_EOL, |
||||||
|
' ' |
||||||
|
], |
||||||
|
strip_tags( |
||||||
|
html_entity_decode( |
||||||
|
$value |
||||||
|
) |
||||||
|
) |
||||||
|
) |
||||||
|
); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue