From 0120419d09f54877225e484dd1a321dc8734a572 Mon Sep 17 00:00:00 2001 From: SergeantPanda Date: Tue, 5 Aug 2025 15:50:28 -0500 Subject: [PATCH] Get full release date. --- apps/vod/api_views.py | 3 ++- apps/vod/migrations/0001_initial.py | 4 ++-- apps/vod/models.py | 2 +- apps/vod/tasks.py | 16 +++++++++------- frontend/src/pages/VODs.jsx | 4 ++-- frontend/src/store/useVODStore.jsx | 1 + 6 files changed, 17 insertions(+), 13 deletions(-) diff --git a/apps/vod/api_views.py b/apps/vod/api_views.py index 35d6c4e8..24eca04f 100644 --- a/apps/vod/api_views.py +++ b/apps/vod/api_views.py @@ -123,7 +123,7 @@ class MovieViewSet(viewsets.ReadOnlyModelViewSet): 'description': info.get('description', info.get('plot', '')), 'plot': info.get('plot', info.get('description', '')), 'year': self._extract_year(info.get('releasedate', '')), - 'release_date': info.get('releasedate', ''), + 'release_date': info.get('release_date', ''), 'releasedate': info.get('releasedate', ''), 'genre': info.get('genre', ''), 'director': info.get('director', ''), @@ -295,6 +295,7 @@ class SeriesViewSet(viewsets.ReadOnlyModelViewSet): 'episode_number': episode.episode_number, 'season_number': episode.season_number, 'description': episode.description, + 'release_date': episode.release_date, 'plot': episode.description, 'duration': episode.duration, 'duration_secs': episode.duration * 60 if episode.duration else None, diff --git a/apps/vod/migrations/0001_initial.py b/apps/vod/migrations/0001_initial.py index bc62950d..1bf13b53 100644 --- a/apps/vod/migrations/0001_initial.py +++ b/apps/vod/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.2.4 on 2025-08-05 15:48 +# Generated by Django 5.2.4 on 2025-08-05 20:40 import django.db.models.deletion import uuid @@ -88,7 +88,7 @@ class Migration(migrations.Migration): ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), ('name', models.CharField(max_length=255)), ('description', models.TextField(blank=True, null=True)), - ('year', models.IntegerField(blank=True, null=True)), + ('release_date', models.DateField(blank=True, null=True)), ('rating', models.CharField(blank=True, max_length=10, null=True)), ('duration', models.IntegerField(blank=True, help_text='Duration in minutes', null=True)), ('season_number', models.IntegerField(blank=True, null=True)), diff --git a/apps/vod/models.py b/apps/vod/models.py index 2501c1d9..c1884f5d 100644 --- a/apps/vod/models.py +++ b/apps/vod/models.py @@ -128,7 +128,7 @@ class Episode(models.Model): uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True) name = models.CharField(max_length=255) description = models.TextField(blank=True, null=True) - year = models.IntegerField(blank=True, null=True) + release_date = models.DateField(blank=True, null=True) rating = models.CharField(max_length=10, blank=True, null=True) duration = models.IntegerField(blank=True, null=True, help_text="Duration in minutes") diff --git a/apps/vod/tasks.py b/apps/vod/tasks.py index 10da45bd..79f1ffa0 100644 --- a/apps/vod/tasks.py +++ b/apps/vod/tasks.py @@ -329,22 +329,24 @@ def refresh_series_episodes(account, series, series_id): # Build episode stream URL stream_url = f"{account.server_url}/series/{account.username}/{account.password}/{episode_data['id']}.{episode_data.get('container_extension', 'mp4')}" + # Get episode info (metadata is nested in 'info' object) + episode_info = episode_data.get('info', {}) + episode_dict = { 'name': episode_data.get('title', f"Episode {episode_data.get('episode_num', '')}"), 'series': series, 'season_number': int(season_num) if season_num.isdigit() else None, 'episode_number': episode_data.get('episode_num'), 'url': stream_url, - 'description': episode_data.get('plot'), - 'year': episode_data.get('air_date', '').split('-')[0] if episode_data.get('air_date') else None, - 'rating': episode_data.get('rating'), - 'duration': episode_data.get('duration_secs', 0) // 60 if episode_data.get('duration_secs') else None, + 'description': episode_info.get('plot') or episode_info.get('overview'), + 'release_date': episode_info.get('release_date') or episode_info.get('releasedate'), + 'rating': episode_info.get('rating'), + 'duration': episode_info.get('duration_secs'), 'container_extension': episode_data.get('container_extension'), - 'tmdb_id': episode_data.get('tmdb_id'), - 'imdb_id': episode_data.get('imdb_id'), + 'tmdb_id': episode_info.get('tmdb_id'), + 'imdb_id': episode_info.get('imdb_id'), 'custom_properties': episode_data if episode_data else None } - # Use new Episode model episode, created = Episode.objects.update_or_create( stream_id=episode_data['id'], diff --git a/frontend/src/pages/VODs.jsx b/frontend/src/pages/VODs.jsx index dab44e9a..288053ac 100644 --- a/frontend/src/pages/VODs.jsx +++ b/frontend/src/pages/VODs.jsx @@ -533,7 +533,7 @@ const SeriesModal = ({ series, opened, onClose }) => { Ep Title Duration - Year + Date Action @@ -568,7 +568,7 @@ const SeriesModal = ({ series, opened, onClose }) => { - {episode.year} + {episode.release_date ? new Date(episode.release_date).toLocaleDateString() : 'N/A'} diff --git a/frontend/src/store/useVODStore.jsx b/frontend/src/store/useVODStore.jsx index cfff5bf6..89d272a1 100644 --- a/frontend/src/store/useVODStore.jsx +++ b/frontend/src/store/useVODStore.jsx @@ -317,6 +317,7 @@ const useVODStore = create((set, get) => ({ type: 'episode', uuid: episode.id, // Use the stream ID as UUID for playback logo: episode.movie_image ? { url: episode.movie_image } : null, + release_date: episode.release_date || null, }; episodesData[episode.id] = episodeData; });