233 lines
4.9 KiB
PHP
Executable file
233 lines
4.9 KiB
PHP
Executable file
<?php
|
|
|
|
namespace Animarr;
|
|
|
|
use Animarr\Release\Release;
|
|
|
|
class Filter{
|
|
|
|
const PROPERTY_TITLE = "title";
|
|
const PROPERTY_ORIGINAL_TITLE = "original_title";
|
|
const PROPERTY_GROUP = "group";
|
|
const PROPERTY_NUMBER = "number";
|
|
const PROPERTY_SEEDS = "seeds";
|
|
const PROPERTY_TAGS = "tags";
|
|
const PROPERTY_TYPE = "type";
|
|
const PROPERTY_QUALITY = "quality";
|
|
const PROPERTY_TRUSTED = "trusted";
|
|
const PROPERTY_BEST = "best";
|
|
const PROPERTY_UPLOAD_DATE = "upload_date";
|
|
const PROPERTY_DOWNLOAD_LINK = "download_url";
|
|
|
|
const GREATHER_THAN = ">";
|
|
const LESS_THAN = "<";
|
|
const EQUAL_THAN = "=";
|
|
const DIFFERENT_THAN = "!=";
|
|
|
|
const STARTS_WITH = "sub>";
|
|
const ENDS_WITH = "<sub";
|
|
const CONTAINS = ">sub<";
|
|
const MATCH = ">match<";
|
|
const LAMBDA = ">lambda<";
|
|
|
|
const ACTION_DROP = "drop";
|
|
const ACTION_KEEP = "keep";
|
|
const ACTION_FORCE_KEEP = "fkeep";
|
|
const ACTION_DEFAULT = "default";
|
|
|
|
private $defaultAction;
|
|
private $tree;
|
|
|
|
public function __construct($defaultAction, $tree){
|
|
$this->tree = $tree;
|
|
$this->defaultAction = $defaultAction;
|
|
}
|
|
|
|
/**
|
|
* @param Release[] $releases
|
|
*
|
|
* @return Release[]
|
|
*/
|
|
public function applyFilter(array $releases){
|
|
$newReleases = [];
|
|
foreach($releases as $k => $r){
|
|
$r = $this->applyFilterSingle($r);
|
|
if($r !== null){
|
|
$newReleases[$k] = $r;
|
|
}
|
|
}
|
|
|
|
return $newReleases;
|
|
}
|
|
|
|
/**
|
|
* @param Release $r
|
|
* @return Release
|
|
*/
|
|
public function applyFilterSingle(Release $r){
|
|
$ret = $this->filter($r, self::ACTION_DEFAULT, $this->tree);
|
|
if($ret === self::ACTION_DEFAULT){
|
|
$ret = $this->defaultAction;
|
|
}
|
|
|
|
if($ret === self::ACTION_KEEP){
|
|
return $r;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
private function filter(Release $release, $current, $tree){
|
|
foreach($tree as $i){
|
|
$value = null;
|
|
$ncurrent = null;
|
|
|
|
switch($i[0]){
|
|
case self::PROPERTY_NUMBER:
|
|
$value = $release->getNumber();
|
|
break;
|
|
case self::PROPERTY_TITLE:
|
|
$value = $release->getTitle();
|
|
break;
|
|
case self::PROPERTY_ORIGINAL_TITLE:
|
|
$value = $release->getOriginalTitle();
|
|
break;
|
|
case self::PROPERTY_TYPE:
|
|
$value = $release->getType();
|
|
break;
|
|
case self::PROPERTY_GROUP:
|
|
$value = $release->getGroup();
|
|
break;
|
|
case self::PROPERTY_QUALITY:
|
|
$value = $release->getQuality();
|
|
break;
|
|
case self::PROPERTY_TRUSTED:
|
|
$value = $release->isTrusted();
|
|
break;
|
|
case self::PROPERTY_SEEDS:
|
|
$value = $release->getSeeds();
|
|
break;
|
|
case self::PROPERTY_BEST:
|
|
$value = $release->isBest();
|
|
break;
|
|
case self::PROPERTY_UPLOAD_DATE:
|
|
$value = $release->getUploadDate();
|
|
break;
|
|
case self::PROPERTY_DOWNLOAD_LINK:
|
|
$value = $release->getDownloadLink();
|
|
break;
|
|
case self::PROPERTY_TAGS:
|
|
$value = $release->getTags();
|
|
break;
|
|
|
|
default:
|
|
continue;
|
|
break;
|
|
}
|
|
|
|
switch($i[1]){
|
|
case self::LAMBDA:
|
|
if(is_callable($i[2]) and call_user_func($i[2], $value) === true){
|
|
$ncurrent = $i[3];
|
|
}
|
|
break;
|
|
case self::GREATHER_THAN:
|
|
if($value > $i[2]){
|
|
$ncurrent = $i[3];
|
|
}
|
|
break;
|
|
case self::LESS_THAN:
|
|
if($value < $i[2]){
|
|
$ncurrent = $i[3];
|
|
}
|
|
break;
|
|
case self::EQUAL_THAN:
|
|
if(is_array($value)){
|
|
foreach($value as $v){
|
|
if($v == $i[2]){
|
|
$ncurrent = $i[3];
|
|
}
|
|
}
|
|
}else if($value == $i[2]){
|
|
$ncurrent = $i[3];
|
|
}
|
|
break;
|
|
case self::DIFFERENT_THAN:
|
|
if($value != $i[2]){
|
|
$ncurrent = $i[3];
|
|
}
|
|
break;
|
|
|
|
case self::MATCH:
|
|
if(is_array($value)){
|
|
foreach($value as $v){
|
|
if(preg_match($i[2], $v) > 0){
|
|
$ncurrent = $i[3];
|
|
}
|
|
}
|
|
}else if(preg_match($i[2], $value) > 0){
|
|
$ncurrent = $i[3];
|
|
}
|
|
break;
|
|
case self::CONTAINS:
|
|
if(is_array($value)){
|
|
foreach($value as $v){
|
|
if(strpos($value, $v) !== false){
|
|
$ncurrent = $i[3];
|
|
}
|
|
}
|
|
}else if(strpos($value, $i[2]) !== false){
|
|
$ncurrent = $i[3];
|
|
}
|
|
break;
|
|
case self::STARTS_WITH:
|
|
if(is_array($value)){
|
|
foreach($value as $v){
|
|
if(strpos($value, $v) === 0){
|
|
$ncurrent = $i[3];
|
|
}
|
|
}
|
|
}else if(strpos($value, $i[2]) === 0){
|
|
$ncurrent = $i[3];
|
|
}
|
|
break;
|
|
case self::ENDS_WITH:
|
|
if(is_array($value)){
|
|
foreach($value as $v){
|
|
if(strpos(strrev($v), strrev($i[2])) === 0){
|
|
$ncurrent = $i[3];
|
|
}
|
|
}
|
|
}else if(strpos(strrev($value), strrev($i[2])) === 0){
|
|
$ncurrent = $i[3];
|
|
}
|
|
break;
|
|
|
|
default:
|
|
continue;
|
|
break;
|
|
}
|
|
|
|
if($ncurrent === null){
|
|
continue;
|
|
}
|
|
|
|
if (is_array($ncurrent)){
|
|
$ncurrent = $this->filter($release, $current, $ncurrent);
|
|
}
|
|
|
|
if($ncurrent === self::ACTION_DROP){
|
|
return self::ACTION_DROP;
|
|
}
|
|
|
|
if($ncurrent === self::ACTION_FORCE_KEEP){
|
|
return self::ACTION_KEEP;
|
|
}
|
|
|
|
$current = $ncurrent;
|
|
}
|
|
|
|
return $current;
|
|
}
|
|
}
|