fix: links to episodes from downloads
This commit is contained in:
@@ -6,6 +6,8 @@ use App\Search\Action\Command\GetMediaInfoCommand;
|
||||
use App\Search\Action\Handler\GetMediaInfoHandler;
|
||||
use App\Search\TvEpisodePaginator;
|
||||
use Symfony\UX\LiveComponent\Attribute\AsLiveComponent;
|
||||
use Symfony\UX\LiveComponent\Attribute\LiveAction;
|
||||
use Symfony\UX\LiveComponent\Attribute\LiveArg;
|
||||
use Symfony\UX\LiveComponent\Attribute\LiveProp;
|
||||
use Symfony\UX\LiveComponent\DefaultActionTrait;
|
||||
|
||||
@@ -27,6 +29,12 @@ final class TvEpisodeList
|
||||
#[LiveProp(writable: true)]
|
||||
public int $season = 1;
|
||||
|
||||
#[LiveProp(writable: true)]
|
||||
public int $reloadCount = 0;
|
||||
|
||||
#[LiveProp(writable: true)]
|
||||
public ?int $episodeNumber = null;
|
||||
|
||||
public function __construct(
|
||||
private GetMediaInfoHandler $getMediaInfoHandler,
|
||||
) {}
|
||||
@@ -34,6 +42,14 @@ final class TvEpisodeList
|
||||
public function getEpisodes()
|
||||
{
|
||||
$results = $this->getMediaInfoHandler->handle(new GetMediaInfoCommand($this->imdbId, "tvshows", $this->season));
|
||||
|
||||
if (null !== $this->episodeNumber) {
|
||||
$this->pageNumber = ceil($this->episodeNumber / $this->perPage);
|
||||
$this->episodeNumber = null;
|
||||
}
|
||||
|
||||
$this->reloadCount++;
|
||||
|
||||
return new TvEpisodePaginator()->paginate($results, $this->pageNumber, $this->perPage);
|
||||
}
|
||||
|
||||
|
||||
25
src/Twig/Dto/EpisodeIdDto.php
Normal file
25
src/Twig/Dto/EpisodeIdDto.php
Normal file
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
namespace App\Twig\Dto;
|
||||
|
||||
class EpisodeIdDto
|
||||
{
|
||||
public function __construct(
|
||||
public string $season,
|
||||
public string $episode,
|
||||
) {}
|
||||
|
||||
public function asEpisodeId(): string
|
||||
{
|
||||
return "S". str_pad($this->season, 2, "0", STR_PAD_LEFT) .
|
||||
"E". str_pad($this->episode, 2, "0", STR_PAD_LEFT);
|
||||
}
|
||||
|
||||
public function __toString(): string
|
||||
{
|
||||
if ("" !== $this->season && "" !== $this->episode) {
|
||||
return $this->asEpisodeId();
|
||||
}
|
||||
return "";
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,7 @@ namespace App\Twig\Extensions;
|
||||
|
||||
use App\Base\Service\MediaFiles;
|
||||
use App\Torrentio\Action\Result\GetTvShowOptionsResult;
|
||||
use App\Twig\Dto\EpisodeIdDto;
|
||||
use ChrisUllyott\FileSize;
|
||||
use Twig\Attribute\AsTwigFilter;
|
||||
use Twig\Attribute\AsTwigFunction;
|
||||
@@ -63,4 +64,42 @@ class UtilExtension
|
||||
return "S". str_pad($season, 2, "0", STR_PAD_LEFT) .
|
||||
"E". str_pad($episode, 2, "0", STR_PAD_LEFT);
|
||||
}
|
||||
|
||||
#[AsTwigFunction('episode_anchor')]
|
||||
public function episodeAnchor($season, $episode): ?string
|
||||
{
|
||||
return "episode_" . $season . "_" . $episode;
|
||||
}
|
||||
|
||||
#[AsTwigFunction('extract_from_episode_id')]
|
||||
public function extractFromEpisodeId(?string $episodeId): ?EpisodeIdDto
|
||||
{
|
||||
if (null === $episodeId) {
|
||||
return new EpisodeIdDto("", "");
|
||||
}
|
||||
|
||||
// Capture season
|
||||
$seasonMatch = [];
|
||||
preg_match('/[sS]\d\d/', $episodeId, $seasonMatch);
|
||||
if (empty($seasonMatch)) {
|
||||
$season = "";
|
||||
} else {
|
||||
$season = str_replace(['S', 's'], '', $seasonMatch[0]);
|
||||
}
|
||||
|
||||
// Capture episode
|
||||
$episodeMatch = [];
|
||||
preg_match('/[eE]\d\d/', $episodeId, $episodeMatch);
|
||||
if (empty($episodeMatch)) {
|
||||
$episode = "";
|
||||
} else {
|
||||
$episode = str_replace(['E', 'e'], '', $episodeMatch[0]);
|
||||
}
|
||||
|
||||
if (null === $season && null === $episode) {
|
||||
return new EpisodeIdDto("", "");
|
||||
}
|
||||
|
||||
return new EpisodeIdDto($season, $episode);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user