fix: backend download option evaluator used by monitor service
This commit is contained in:
@@ -3,92 +3,80 @@
|
|||||||
namespace App\Download;
|
namespace App\Download;
|
||||||
|
|
||||||
use Aimeos\Map;
|
use Aimeos\Map;
|
||||||
use App\Monitor\Framework\Entity\Monitor;
|
|
||||||
use App\Torrentio\Result\TorrentioResult;
|
use App\Torrentio\Result\TorrentioResult;
|
||||||
use App\User\Dto\UserPreferences;
|
use App\User\Dto\UserPreferences;
|
||||||
|
|
||||||
class DownloadOptionEvaluator
|
class DownloadOptionEvaluator
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @param Monitor $monitor
|
|
||||||
* @param TorrentioResult[] $results
|
* @param TorrentioResult[] $results
|
||||||
|
* @param UserPreferences $filter
|
||||||
* @return TorrentioResult|null
|
* @return TorrentioResult|null
|
||||||
* @throws \Throwable
|
* @throws \Throwable
|
||||||
*/
|
*/
|
||||||
public function evaluateOptions(array $results, UserPreferences $userPreferences): ?TorrentioResult
|
public function evaluateOptions(array $results, UserPreferences $filter): ?TorrentioResult
|
||||||
{
|
{
|
||||||
$sizeLow = 000;
|
$matches = Map::from($results)->filter(function ($result) use ($filter) {
|
||||||
$sizeHigh = 4096;
|
if (false === $this->validateFilterItems($result, $filter)) {
|
||||||
|
return false;
|
||||||
$bestMatches = [];
|
|
||||||
$matches = [];
|
|
||||||
|
|
||||||
foreach ($results as $result) {
|
|
||||||
if (!in_array($userPreferences->language, $result->languages)) {
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($result->resolution === $userPreferences->resolution
|
if (false === $this->validateSize($result, $filter)) {
|
||||||
&& $result->codec === $userPreferences->codec
|
return false;
|
||||||
) {
|
|
||||||
$bestMatches[] = $result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($userPreferences->resolution === '2160p'
|
return true;
|
||||||
&& $userPreferences->codec === $result->codec
|
});
|
||||||
&& $result->resolution === '1080p'
|
|
||||||
) {
|
|
||||||
$matches[] = $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($userPreferences->codec === 'h264'
|
if ($matches->count() > 0) {
|
||||||
&& $userPreferences->resolution === $result->resolution
|
return Map::from($matches)->usort(fn($a, $b) => $a->seeders <=> $b->seeders)->last();
|
||||||
&& $result->codec === 'h265'
|
|
||||||
) {
|
|
||||||
$matches[] = $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (($userPreferences->codec === null )
|
|
||||||
&& ($userPreferences->resolution === null )) {
|
|
||||||
$matches[] = $result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$sizeMatches = [];
|
|
||||||
|
|
||||||
foreach ($bestMatches as $result) {
|
|
||||||
if (str_contains($result->size, 'GB')) {
|
|
||||||
$size = (int) trim(str_replace('GB', '', $result->size)) * 1024;
|
|
||||||
} else {
|
|
||||||
$size = (int) trim(str_replace('MB', '', $result->size));
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($size > $sizeLow && $size < $sizeHigh) {
|
|
||||||
$sizeMatches[] = $result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!empty($sizeMatches)) {
|
|
||||||
return Map::from($sizeMatches)->usort(fn($a, $b) => $a->seeders <=> $b->seeders)->last();
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($matches as $result) {
|
|
||||||
$size = 0;
|
|
||||||
if (str_contains($result->size, 'GB')) {
|
|
||||||
$size = (int) trim(str_replace('GB', '', $result->size)) * 1024;
|
|
||||||
} else {
|
|
||||||
$size = (int) trim(str_replace('MB', '', $result->size));
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($size > $sizeLow && $size < $sizeHigh) {
|
|
||||||
$sizeMatches[] = $result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!empty($sizeMatches)) {
|
|
||||||
return Map::from($sizeMatches)->usort(fn($a, $b) => $a->seeders <=> $b->seeders)->last();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function validateFilterItems(TorrentioResult $result, UserPreferences $filter): bool
|
||||||
|
{
|
||||||
|
if (array_intersect($filter->language, $result->languages) === []) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$valid = true;
|
||||||
|
|
||||||
|
if (null !== $filter->resolution && !in_array($result->resolution, $filter->resolution)) {
|
||||||
|
$valid = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null !== $filter->codec && in_array($result->codec, $filter->codec)) {
|
||||||
|
$valid = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null !== $filter->quality && in_array($result->quality, $filter->quality)) {
|
||||||
|
$valid = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null !== $filter->provider && in_array($result->provider, $filter->provider)) {
|
||||||
|
$valid = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function validateSize(TorrentioResult $result, UserPreferences $filter): bool
|
||||||
|
{
|
||||||
|
$sizeLow = 000;
|
||||||
|
$sizeHigh = 4096;
|
||||||
|
|
||||||
|
if (str_contains($result->size, 'GB')) {
|
||||||
|
$size = (int) trim(str_replace('GB', '', $result->size)) * 1024;
|
||||||
|
} else {
|
||||||
|
$size = (int) trim(str_replace('MB', '', $result->size));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($size > $sizeLow && $size < $sizeHigh) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user