[FilterMore] improve style

This commit is contained in:
boyska 2024-03-16 21:37:52 +01:00
parent 992e4d239c
commit 51c6b6cd47

View File

@ -1,68 +1,68 @@
<?php <?php
class FilterMoreBridge extends FeedExpander { class FilterMoreBridge extends FeedExpander
{
const MAINTAINER = 'boyska'; const MAINTAINER = 'boyska';
const NAME = 'FilterMore'; const NAME = 'FilterMore';
const CACHE_TIMEOUT = 2; const CACHE_TIMEOUT = 2;
const DESCRIPTION = 'Filters a feed of your choice'; const DESCRIPTION = 'Filters a feed of your choice';
const URI = 'https://git.lattuta.net/boyska/rss-bridge'; const URI = 'https://git.lattuta.net/boyska/rss-bridge';
const PARAMETERS = [ const PARAMETERS = [
[ [
'url' => array( 'url' => array(
'name' => 'Feed URL', 'name' => 'Feed URL',
'required' => true, 'required' => true,
), ),
'conj_type' => array( 'conj_type' => array(
'name' => 'Conjunction type type', 'name' => 'Conjunction type type',
'type' => 'list', 'type' => 'list',
'required' => false, 'required' => false,
'values' => array( 'values' => array(
'All conditions must be met' => 'and', 'All conditions must be met' => 'and',
'Any condition must be met' => 'or', 'Any condition must be met' => 'or',
), ),
'defaultValue' => 'permit', 'defaultValue' => 'permit',
), ),
'title_re' => array( 'title_re' => array(
'name' => 'Filter item title (regular expression, see php.net/pcre_match for details)', 'name' => 'Filter item title (regular expression, see php.net/pcre_match for details)',
'required' => false, 'required' => false,
'exampleValue' => '/breaking\ news/i', 'exampleValue' => '/breaking\ news/i',
), ),
'body_re' => array( 'body_re' => array(
'name' => 'Filter body (regular expression)', 'name' => 'Filter body (regular expression)',
'required' => false, 'required' => false,
), ),
'author_re' => array( 'author_re' => array(
'name' => 'Filter author (regular expression)', 'name' => 'Filter author (regular expression)',
'required' => false, 'required' => false,
'exampleValue' => '/(technology|politics)/i', 'exampleValue' => '/(technology|politics)/i',
), ),
'newer_than' => array( 'newer_than' => array(
'name' => 'Filter date: ok if newer than the value (see php.net/strtotime for details)', 'name' => 'Filter date: ok if newer than the value (see php.net/strtotime for details)',
'required' => false, 'required' => false,
'exampleValue' => '-14 days', 'exampleValue' => '-14 days',
), ),
'older_than' => array( 'older_than' => array(
'name' => 'Filter date: ok if older than the value (see php.net/strtotime for details)', 'name' => 'Filter date: ok if older than the value (see php.net/strtotime for details)',
'required' => false, 'required' => false,
'exampleValue' => '-1 hour', 'exampleValue' => '-1 hour',
), ),
'has_media' => array( 'has_media' => array(
'name' => 'Has at least 1 media inside', 'name' => 'Has at least 1 media inside',
'type' => 'checkbox', 'type' => 'checkbox',
'required' => false, 'required' => false,
'defaultValue' => false, 'defaultValue' => false,
), ),
'invert_filter' => array( 'invert_filter' => array(
'name' => 'Invert filter result', 'name' => 'Invert filter result',
'type' => 'checkbox', 'type' => 'checkbox',
'required' => false, 'required' => false,
'defaultValue' => false, 'defaultValue' => false,
), ),
'sort_by' => [ 'sort_by' => [
'name' => 'Sort by', 'name' => 'Sort by',
@ -87,24 +87,27 @@ class FilterMoreBridge extends FeedExpander {
'defaultValue' => 'asc', 'defaultValue' => 'asc',
], ],
]]; ]];
protected function parseItem($newItem){ protected function parseItem($newItem)
$item = parent::parseItem($newItem); {
$item = parent::parseItem($newItem);
$item['enclosures'] = []; $item['enclosures'] = [];
if(isset($newItem->enclosure)) { if (isset($newItem->enclosure)) {
foreach($newItem->enclosure as $encl) { foreach ($newItem->enclosure as $encl) {
$serialized = []; $serialized = [];
foreach($encl->attributes() as $key => $value) { foreach ($encl->attributes() as $key => $value) {
$serialized[$key] = (string)$value; $serialized[$key] = (string)$value;
} }
$serialized["length"] = intval($serialized["length"]); $serialized['length'] = intval($serialized['length']);
$item['enclosures'][] = $serialized; $item['enclosures'][] = $serialized;
} }
} }
if(isset($newItem->link)) { if (isset($newItem->link)) {
foreach($newItem->link as $el) { foreach ($newItem->link as $el) {
if(((string)$el['rel']) !== 'enclosure') continue; if (((string)$el['rel']) !== 'enclosure') {
continue;
}
$serialized = []; $serialized = [];
$serialized['url'] = (string)$el['href']; $serialized['url'] = (string)$el['href'];
@ -115,40 +118,45 @@ class FilterMoreBridge extends FeedExpander {
$filters = ['filterByTitle', 'filterByBody', 'filterByAuthor', 'filterByDateNewer', 'filterByDateOlder', 'filterByMedia']; $filters = ['filterByTitle', 'filterByBody', 'filterByAuthor', 'filterByDateNewer', 'filterByDateOlder', 'filterByMedia'];
$results = []; $results = [];
foreach($filters as $filter) { foreach ($filters as $filter) {
$filter_res = $this->$filter($item); $filter_res = $this->$filter($item);
if($filter_res === null) continue; if ($filter_res === null) {
continue;
}
$results[] = $filter_res; $results[] = $filter_res;
} }
$old_enclosures = $item['enclosures']; $old_enclosures = $item['enclosures'];
$item['enclosures'] = []; $item['enclosures'] = [];
foreach($old_enclosures as $e) { foreach ($old_enclosures as $e) {
$item['enclosures'][] = $e['url']; $item['enclosures'][] = $e['url'];
} }
if(count($results) === 0) { if (count($results) === 0) {
return $item; return $item;
} }
if($this->getConjType() === 'and') { if ($this->getConjType() === 'and') {
$result = !in_array(false, $results); $result = !in_array(false, $results);
} else { // or } else { // or
$result = in_array(true, $results); $result = in_array(true, $results);
} }
if($this->getInvertResult()) { if ($this->getInvertResult()) {
$result = !$result; $result = !$result;
} }
if($result) if ($result) {
return $item; return $item;
else } else {
return null; return null;
} }
}
protected function sortItemKey($item) { protected function sortItemKey($item)
{
$sort_by = $this->getInput('sort_by'); $sort_by = $this->getInput('sort_by');
$key = $item[$sort_by]; $key = $item[$sort_by];
return $key; return $key;
} }
public function collectExpandableDatas($url, $maxItems = -1){ public function collectExpandableDatas($url, $maxItems = -1)
{
parent::collectExpandableDatas($url, $maxItems); parent::collectExpandableDatas($url, $maxItems);
if($this->getInput('sort_by') === 'random') { if($this->getInput('sort_by') === 'random') {
shuffle($this->items); shuffle($this->items);
@ -164,32 +172,38 @@ class FilterMoreBridge extends FeedExpander {
$this->items = array_reverse($this->items); $this->items = array_reverse($this->items);
} }
private function cmp($a, $b) { private function cmp($a, $b)
{
if($a > $b) return 1; if($a > $b) return 1;
if($a < $b) return -1; if($a < $b) return -1;
return 0; return 0;
} }
private function filterByFieldRegexp($field, $re){ private function filterByFieldRegexp($field, $re)
{
if($re === "") return null; if($re === "") return null;
if(preg_match($re, $field)) { if(preg_match($re, $field)) {
return true; return true;
} }
return false; return false;
} }
protected function filterByTitle($item){ protected function filterByTitle($item)
$re = $this->getInput('title_re'); {
$re = $this->getInput('title_re');
return $this->filterByFieldRegexp($item['title'], $re); return $this->filterByFieldRegexp($item['title'], $re);
} }
protected function filterByBody($item){ protected function filterByBody($item)
$re = $this->getInput('body_re'); {
$re = $this->getInput('body_re');
return $this->filterByFieldRegexp($item['content'], $re); return $this->filterByFieldRegexp($item['content'], $re);
} }
protected function filterByAuthor($item){ protected function filterByAuthor($item)
$re = $this->getInput('author_re'); {
$re = $this->getInput('author_re');
return $this->filterByFieldRegexp($item['author'], $re); return $this->filterByFieldRegexp($item['author'], $re);
} }
private function filterByDate($item, $input, $expected){ private function filterByDate($item, $input, $expected)
$val = $this->getInput($input); {
$val = $this->getInput($input);
if($val === "") return null; if($val === "") return null;
$ts = strtotime($val); $ts = strtotime($val);
if($ts === false) { if($ts === false) {
@ -197,45 +211,53 @@ class FilterMoreBridge extends FeedExpander {
} }
$cmp = $this->cmp($item['timestamp'], $ts); // 1 if newer, -1 if older $cmp = $this->cmp($item['timestamp'], $ts); // 1 if newer, -1 if older
return $cmp === $expected; return $cmp === $expected;
} }
protected function filterByDateNewer($item){ protected function filterByDateNewer($item)
{
return $this->filterByDate($item, 'newer_than', 1); return $this->filterByDate($item, 'newer_than', 1);
} }
protected function filterByDateOlder($item){ protected function filterByDateOlder($item)
{
return $this->filterByDate($item, 'older_than', -1); return $this->filterByDate($item, 'older_than', -1);
} }
protected function filterByMedia($item) { protected function filterByMedia($item)
{
if(!$this->getInput('has_media')) return null; if(!$this->getInput('has_media')) return null;
if(count($item['enclosures']) > 0) return true; if(count($item['enclosures']) > 0) return true;
return false; return false;
} }
protected function getConjType(){ protected function getConjType()
return $this->getInput('conj_type'); {
} return $this->getInput('conj_type');
protected function getInvertResult(){ }
return $this->getInput('invert_filter'); protected function getInvertResult()
} {
return $this->getInput('invert_filter');
}
public function getURI(){ public function getURI()
$url = $this->getInput('url'); {
$url = $this->getInput('url');
if(empty($url)) { if (empty($url)) {
$url = parent::getURI(); $url = parent::getURI();
} }
return $url; return $url;
} }
public function collectData(){ public function collectData()
if($this->getInput('url') && substr($this->getInput('url'), 0, strlen('http')) !== 'http') { {
// just in case someone find a way to access local files by playing with the url if ($this->getInput('url') && substr($this->getInput('url'), 0, strlen('http')) !== 'http')
returnClientError('The url parameter must either refer to http or https protocol.'); {
} // just in case someone find a way to access local files by playing with the url
try{ returnClientError('The url parameter must either refer to http or https protocol.');
$this->collectExpandableDatas($this->getURI()); }
} catch (HttpException $e) { try {
$this->collectExpandableDatas($this->getURI()); $this->collectExpandableDatas($this->getURI());
} } catch (HttpException $e) {
} $this->collectExpandableDatas($this->getURI());
}
}
} }