mirror of
https://github.com/RSS-Bridge/rss-bridge.git
synced 2025-04-16 11:50:55 +00:00
[FilterMore] improve style
This commit is contained in:
parent
992e4d239c
commit
51c6b6cd47
@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user