Compare commits
3 Commits
f4644d40ef
...
v0.38.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
939b059872 | ||
|
|
f968e7e622 | ||
|
|
7958f50ff7 |
3
.env
3
.env
@@ -68,3 +68,6 @@ SENTRY_JS_URL=
|
||||
# - only include media originally
|
||||
# produced in this language
|
||||
TMDB_ORIGINAL_LANGUAGE=en
|
||||
|
||||
# Cache Torrentio Results
|
||||
TORRENTIO_CACHE_RESULTS=true
|
||||
|
||||
@@ -52,6 +52,9 @@ parameters:
|
||||
sentry.dsn: '%env(SENTRY_DSN)%'
|
||||
sentry.javascript_url: '%env(SENTRY_JS_URL)%'
|
||||
|
||||
# Torrentio
|
||||
torrentio.cache_results: '%env(bool:TORRENTIO_CACHE_RESULTS)%'
|
||||
|
||||
services:
|
||||
# default configuration for services in *this* file
|
||||
_defaults:
|
||||
|
||||
@@ -4,6 +4,7 @@ namespace App\Base;
|
||||
|
||||
use App\Base\Dto\AppVersionDto;
|
||||
use Symfony\Component\DependencyInjection\Attribute\Autowire;
|
||||
use Symfony\Component\HttpFoundation\RequestStack;
|
||||
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
|
||||
|
||||
final class ConfigResolver
|
||||
@@ -14,6 +15,7 @@ final class ConfigResolver
|
||||
|
||||
public function __construct(
|
||||
private readonly DenormalizerInterface $denormalizer,
|
||||
private readonly RequestStack $requestStack,
|
||||
|
||||
#[Autowire(param: 'app.url')]
|
||||
private readonly ?string $appUrl = null,
|
||||
@@ -62,6 +64,9 @@ final class ConfigResolver
|
||||
|
||||
#[Autowire(param: 'sentry.javascript_url')]
|
||||
private ?string $sentryJavascriptUrl = null,
|
||||
|
||||
#[Autowire(param: 'torrentio.cache_results')]
|
||||
private ?bool $torrentioCacheResults = null,
|
||||
) {}
|
||||
|
||||
public function validate(): bool
|
||||
@@ -110,6 +115,11 @@ final class ConfigResolver
|
||||
return $this->authOidcBypassFormLogin;
|
||||
}
|
||||
|
||||
public function isTorrentioCacheEnabled(): bool
|
||||
{
|
||||
return $this->torrentioCacheResults;
|
||||
}
|
||||
|
||||
public function getAppVersion(): AppVersionDto
|
||||
{
|
||||
$matches = [];
|
||||
|
||||
@@ -25,6 +25,10 @@ class DownloadOptionEvaluator
|
||||
return false;
|
||||
}
|
||||
|
||||
if (false === $this->validateDownloadUrl($result->url)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
});
|
||||
|
||||
@@ -79,4 +83,18 @@ class DownloadOptionEvaluator
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public function validateDownloadUrl(string $downloadUrl)
|
||||
{
|
||||
$badFileLocations = [
|
||||
'https://torrentio.strem.fun/videos/failed_infringement_v2.mp4' => 'Removed for Copyright Infringement.',
|
||||
];
|
||||
|
||||
$headers = get_headers($downloadUrl, true);
|
||||
if (array_key_exists($headers['Location'], $badFileLocations)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -123,4 +123,16 @@ class DownloadRepository extends ServiceEntityRepository
|
||||
->getQuery()
|
||||
->getResult();
|
||||
}
|
||||
|
||||
public function badDownloadUrls()
|
||||
{
|
||||
return $this->createQueryBuilder('d')
|
||||
->select('d.url')
|
||||
->andWhere('d.status = :status')
|
||||
->andWhere('d.progress = 100')
|
||||
->setParameter('status', 'Failed')
|
||||
->distinct()
|
||||
->getQuery()
|
||||
->getResult();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,14 +2,25 @@
|
||||
|
||||
namespace App\Torrentio\Client;
|
||||
|
||||
use Aimeos\Map;
|
||||
use App\Download\Framework\Repository\DownloadRepository;
|
||||
use App\Torrentio\Result\ResultFactory;
|
||||
use App\Torrentio\Exception\TorrentioRateLimitException;
|
||||
use Psr\Log\LoggerInterface;
|
||||
|
||||
class Torrentio
|
||||
{
|
||||
private array $badDownloadUrls = [];
|
||||
|
||||
public function __construct(
|
||||
private readonly HttpClient $client,
|
||||
) {}
|
||||
private readonly DownloadRepository $downloadRepository, private readonly LoggerInterface $logger,
|
||||
) {
|
||||
$badDownloadUrls = $this->downloadRepository->badDownloadUrls();
|
||||
$this->badDownloadUrls = Map::from($badDownloadUrls)
|
||||
->map(fn ($url) => $url['url'])
|
||||
->toArray();
|
||||
}
|
||||
|
||||
public function search(string $imdbCode, string $type, bool $parseResults = true): array
|
||||
{
|
||||
@@ -47,6 +58,16 @@ class Torrentio
|
||||
continue;
|
||||
}
|
||||
|
||||
$url = explode('/', $stream['url']);
|
||||
$filename = urldecode(end($url));
|
||||
$url[count($url) - 1] = $filename;
|
||||
$url = implode('/', $url);
|
||||
|
||||
if (in_array($stream['url'], $this->badDownloadUrls)) {
|
||||
$this->logger->warning($stream['url'] . ' was skipped because it was identified as a bad download url.');
|
||||
continue;
|
||||
}
|
||||
|
||||
if (
|
||||
array_key_exists('behaviorHints', $stream) &&
|
||||
array_key_exists('bingeGroup', $stream['behaviorHints'])
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Torrentio\Framework\Controller;
|
||||
|
||||
use App\Base\ConfigResolver;
|
||||
use App\Base\Service\Broadcaster;
|
||||
use App\Torrentio\Action\Handler\GetMovieOptionsHandler;
|
||||
use App\Torrentio\Action\Handler\GetTvShowOptionsHandler;
|
||||
@@ -27,6 +28,7 @@ final class WebController extends AbstractController
|
||||
public function __construct(
|
||||
private readonly GetMovieOptionsHandler $getMovieOptionsHandler,
|
||||
private readonly GetTvShowOptionsHandler $getTvShowOptionsHandler,
|
||||
private readonly ConfigResolver $configResolver,
|
||||
private readonly Broadcaster $broadcaster,
|
||||
) {}
|
||||
|
||||
@@ -40,10 +42,14 @@ final class WebController extends AbstractController
|
||||
$input->imdbId
|
||||
);
|
||||
|
||||
if (true === $this->configResolver->isTorrentioCacheEnabled()) {
|
||||
$results = $cache->get($cacheId, function (ItemInterface $item) use ($input, $request) {
|
||||
$item->expiresAt(Carbon::now()->addHour()->setMinute(0)->setSecond(0));
|
||||
return $this->getMovieOptionsHandler->handle($input->toCommand());
|
||||
});
|
||||
} else {
|
||||
$results = $this->getMovieOptionsHandler->handle($input->toCommand());
|
||||
}
|
||||
|
||||
if ($request->headers->get('Turbo-Frame')) {
|
||||
return $this->sendFragmentResponse($results, $request);
|
||||
@@ -66,10 +72,14 @@ final class WebController extends AbstractController
|
||||
);
|
||||
|
||||
try {
|
||||
if (true === $this->configResolver->isTorrentioCacheEnabled()) {
|
||||
$results = $cache->get($cacheId, function (ItemInterface $item) use ($input) {
|
||||
$item->expiresAt(Carbon::now()->addHour()->setMinute(0)->setSecond(0));
|
||||
return $this->getTvShowOptionsHandler->handle($input->toCommand());
|
||||
});
|
||||
} else {
|
||||
$results = $this->getTvShowOptionsHandler->handle($input->toCommand());
|
||||
}
|
||||
|
||||
if ($request->headers->get('Turbo-Frame')) {
|
||||
return $this->sendFragmentResponse($results, $request);
|
||||
|
||||
Reference in New Issue
Block a user