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 @@
@@ -1,4 +1,7 @@
|
||||
/composer.lock |
||||
/config.json |
||||
|
||||
/config/* |
||||
!/config/example.json |
||||
|
||||
/server/ |
||||
/vendor/ |
||||
|
@ -0,0 +1,88 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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