diff --git a/migrations/Version20250823173128.php b/migrations/Version20250823173128.php new file mode 100644 index 0000000..19fced6 --- /dev/null +++ b/migrations/Version20250823173128.php @@ -0,0 +1,35 @@ +addSql(<<<'SQL' + ALTER TABLE monitor ADD air_date DATETIME DEFAULT NULL + SQL); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql(<<<'SQL' + ALTER TABLE monitor DROP air_date + SQL); + } +} diff --git a/src/Monitor/Action/Handler/MonitorTvShowHandler.php b/src/Monitor/Action/Handler/MonitorTvShowHandler.php index 18305ec..fca1435 100644 --- a/src/Monitor/Action/Handler/MonitorTvShowHandler.php +++ b/src/Monitor/Action/Handler/MonitorTvShowHandler.php @@ -11,6 +11,7 @@ use App\Monitor\Framework\Entity\Monitor; use App\Monitor\Framework\Repository\MonitorRepository; use App\Tmdb\Tmdb; use Carbon\Carbon; +use Carbon\CarbonImmutable; use DateTimeImmutable; use Doctrine\ORM\EntityManagerInterface; use App\Base\Util\PTN; @@ -96,6 +97,7 @@ readonly class MonitorTvShowHandler implements HandlerInterface ->setMonitorType('tvepisode') ->setSeason($episode['season_number']) ->setEpisode($episode['episode_number']) + ->setAirDate($episode['air_date'] !== null && $episode['air_date'] !== "" ? Carbon::parse($episode['air_date']) : null) ->setCreatedAt(new DateTimeImmutable()) ->setSearchCount(0) ->setStatus('New'); diff --git a/src/Monitor/Framework/Controller/ApiController.php b/src/Monitor/Framework/Controller/ApiController.php index fe4bb48..12b89fb 100644 --- a/src/Monitor/Framework/Controller/ApiController.php +++ b/src/Monitor/Framework/Controller/ApiController.php @@ -2,11 +2,13 @@ namespace App\Monitor\Framework\Controller; +use Aimeos\Map; use App\Base\Service\Broadcaster; use App\Monitor\Action\Handler\AddMonitorHandler; use App\Monitor\Action\Handler\DeleteMonitorHandler; use App\Monitor\Action\Input\AddMonitorInput; use App\Monitor\Action\Input\DeleteMonitorInput; +use App\Monitor\Framework\Repository\MonitorRepository; use App\Monitor\Framework\Scheduler\MonitorDispatcher; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; @@ -65,4 +67,25 @@ class ApiController extends AbstractController 'message' => 'Manually dispatched MonitorDispatcher' ]); } + + #[Route('/api/upcoming-episodes', name: 'api.upcoming-episodes', methods: ['GET'])] + public function upcomingEpisodes(MonitorRepository $repository): Response + { + $monitors = $repository->whereAirDateNotNull(); + $monitors = Map::from($monitors)->map(function ($monitor) { + return [ + 'id' => $monitor->getId(), + 'title' => $monitor->getTitle() . ' (S' . str_pad($monitor->getSeason(), 2, '0', STR_PAD_LEFT) . 'E' . str_pad($monitor->getEpisode(), 2, '0', STR_PAD_LEFT) . ')', + 'start' => $monitor->getAirDate()->format('Y-m-d H:i:s'), + 'allDay' => true + ]; + }); + + return $this->json([ + 'status' => 200, + 'data' => [ + 'episodes' => $monitors->toArray(), + ] + ]); + } } diff --git a/src/Monitor/Framework/Entity/Monitor.php b/src/Monitor/Framework/Entity/Monitor.php index 5a54f0d..636e8ae 100644 --- a/src/Monitor/Framework/Entity/Monitor.php +++ b/src/Monitor/Framework/Entity/Monitor.php @@ -56,6 +56,9 @@ class Monitor #[ORM\Column(type: Types::DATETIME_MUTABLE, nullable: true)] private ?\DateTimeInterface $lastSearch = null; + #[ORM\Column(type: Types::DATETIME_MUTABLE, nullable: true)] + private ?\DateTime $airDate = null; + #[ORM\Column] private ?\DateTimeImmutable $createdAt = null; @@ -257,6 +260,17 @@ class Monitor return $this; } + public function getAirDate(): ?\DateTimeInterface + { + return $this->airDate; + } + + public function setAirDate(?\DateTimeImmutable $airDate): static + { + $this->airDate = $airDate; + return $this; + } + public function removeChild(self $child): static { if ($this->children->removeElement($child)) { diff --git a/src/Monitor/Framework/Repository/MonitorRepository.php b/src/Monitor/Framework/Repository/MonitorRepository.php index b7a1400..64a068d 100644 --- a/src/Monitor/Framework/Repository/MonitorRepository.php +++ b/src/Monitor/Framework/Repository/MonitorRepository.php @@ -33,4 +33,12 @@ class MonitorRepository extends ServiceEntityRepository return $this->paginator->paginate($query, $page, $perPage); } + + public function whereAirDateNotNull() + { + $query = $this->createQueryBuilder('m') + ->andWhere('m.airDate IS NOT NULL') + ->getQuery(); + return $query->getResult(); + } } diff --git a/templates/index/test.html.twig b/templates/index/test.html.twig index 577f241..86f730a 100644 --- a/templates/index/test.html.twig +++ b/templates/index/test.html.twig @@ -13,10 +13,14 @@