mirror of
https://github.com/RSS-Bridge/rss-bridge.git
synced 2024-11-25 02:46:15 +03:00
168 lines
5.7 KiB
PHP
168 lines
5.7 KiB
PHP
<?php
|
|
|
|
class EconomistWorldInBriefBridge extends BridgeAbstract
|
|
{
|
|
const MAINTAINER = 'sqrtminusone';
|
|
const NAME = 'Economist the World in Brief Bridge';
|
|
const URI = 'https://www.economist.com/the-world-in-brief';
|
|
|
|
const CACHE_TIMEOUT = 3600; // 1 hour
|
|
const DESCRIPTION = 'Returns stories from the World in Brief section';
|
|
|
|
const CONFIGURATION = [
|
|
'cookie' => [
|
|
'required' => false,
|
|
]
|
|
];
|
|
|
|
const PARAMETERS = [
|
|
'' => [
|
|
'splitGobbets' => [
|
|
'name' => 'Split the short stories',
|
|
'type' => 'checkbox',
|
|
'defaultValue' => false,
|
|
'title' => 'Whether to split the short stories into separate entries'
|
|
],
|
|
'limit' => [
|
|
'name' => 'Truncate headers for the short stories',
|
|
'type' => 'number',
|
|
'defaultValue' => 100
|
|
],
|
|
'agenda' => [
|
|
'name' => 'Add agenda for the day',
|
|
'type' => 'checkbox',
|
|
'defaultValue' => 'checked'
|
|
],
|
|
'agendaPictures' => [
|
|
'name' => 'Include pictures to the agenda',
|
|
'type' => 'checkbox',
|
|
'defaultValue' => 'checked'
|
|
],
|
|
'quote' => [
|
|
'name' => 'Include the quote of the day',
|
|
'type' => 'checkbox'
|
|
]
|
|
]
|
|
];
|
|
|
|
public function collectData()
|
|
{
|
|
$headers = [];
|
|
if ($this->getOption('cookie')) {
|
|
$headers = [
|
|
'Authority: www.economist.com',
|
|
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
|
|
'Accept-language: en-US,en;q=0.9',
|
|
'Cache-control: max-age=0',
|
|
'Cookie: ' . $this->getOption('cookie'),
|
|
'Upgrade-insecure-requests: 1',
|
|
'User-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36'
|
|
];
|
|
}
|
|
$html = getSimpleHTMLDOM(self::URI, $headers);
|
|
$gobbets = $html->find('p[data-component="the-world-in-brief-paragraph"]');
|
|
if ($this->getInput('splitGobbets') == 1) {
|
|
$this->splitGobbets($gobbets);
|
|
} else {
|
|
$this->mergeGobbets($gobbets);
|
|
};
|
|
if ($this->getInput('agenda') == 1) {
|
|
$articles = $html->find('div[data-test-id="chunks"] > div > div', 0);
|
|
|
|
if ($articles != null) {
|
|
$this->collectArticles($articles);
|
|
}
|
|
}
|
|
if ($this->getInput('quote') == 1) {
|
|
$quote = $html->find('blockquote[data-test-id="inspirational-quote"]', 0);
|
|
$this->addQuote($quote);
|
|
}
|
|
}
|
|
|
|
private function splitGobbets($gobbets)
|
|
{
|
|
$today = new Datetime();
|
|
$today->setTime(0, 0, 0, 0);
|
|
$limit = $this->getInput('limit');
|
|
foreach ($gobbets as $gobbet) {
|
|
$title = $gobbet->plaintext;
|
|
$match = preg_match('/[\.,]/', $title, $matches, PREG_OFFSET_CAPTURE);
|
|
if ($match > 0) {
|
|
$point = $matches[0][1];
|
|
$title = mb_substr($title, 0, $point);
|
|
}
|
|
if ($limit && mb_strlen($title) > $limit) {
|
|
$title = mb_substr($title, 0, $limit) . '...';
|
|
}
|
|
$item = [
|
|
'uri' => self::URI,
|
|
'title' => $title,
|
|
'content' => $gobbet->innertext,
|
|
'timestamp' => $today->format('U'),
|
|
'uid' => md5($gobbet->plaintext)
|
|
];
|
|
$this->items[] = $item;
|
|
}
|
|
}
|
|
|
|
private function mergeGobbets($gobbets)
|
|
{
|
|
$today = new Datetime();
|
|
$today->setTime(0, 0, 0, 0);
|
|
$contents = '';
|
|
foreach ($gobbets as $gobbet) {
|
|
$contents .= "<p>{$gobbet->innertext}";
|
|
}
|
|
$this->items[] = [
|
|
'uri' => self::URI,
|
|
'title' => 'World in brief at ' . $today->format('Y.m.d'),
|
|
'content' => $contents,
|
|
'timestamp' => $today->format('U'),
|
|
'uid' => 'world-in-brief-' . $today->format('U')
|
|
];
|
|
}
|
|
|
|
private function collectArticles($articles)
|
|
{
|
|
$i = 0;
|
|
$today = new Datetime();
|
|
$today->setTime(0, 0, 0, 0);
|
|
foreach ($articles->children() as $element) {
|
|
if ($element->tag != 'div') {
|
|
continue;
|
|
}
|
|
$image = $element->find('figure', 0);
|
|
$title = $element->find('h3', 0)->plaintext;
|
|
$content = $element->find('h3', 0)->parent();
|
|
$content->find('h3', 0)->outertext = '';
|
|
|
|
$res_content = '';
|
|
if ($image != null && $this->getInput('agendaPictures') == 1) {
|
|
$img = $image->find('img', 0);
|
|
$res_content .= '<img src="' . $img->src . '" />';
|
|
}
|
|
$res_content .= $content->innertext;
|
|
$this->items[] = [
|
|
'uri' => self::URI,
|
|
'title' => $title,
|
|
'content' => $res_content,
|
|
'timestamp' => $today->format('U'),
|
|
'uid' => 'story-' . $today->format('U') . "{$i}",
|
|
];
|
|
$i++;
|
|
}
|
|
}
|
|
|
|
private function addQuote($quote)
|
|
{
|
|
$today = new Datetime();
|
|
$today->setTime(0, 0, 0, 0);
|
|
$this->items[] = [
|
|
'uri' => self::URI,
|
|
'title' => 'Quote of the day ' . $today->format('Y.m.d'),
|
|
'content' => $quote->innertext,
|
|
'timestamp' => $today->format('U'),
|
|
'uid' => 'quote-' . $today->format('U')
|
|
];
|
|
}
|
|
}
|