Animarr/src/Animarr/Filter.php

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;
}
}