From f42dff9b0abeabf7d813f45bd59244f785a33ef3 Mon Sep 17 00:00:00 2001 From: ngthanhvu Date: Thu, 23 Jul 2026 02:56:24 -0400 Subject: [PATCH] feat: add episode total handling and display across movie pages - Implemented `getEpisodeDisplay` function to format episode information for movies. - Updated movie display components to show episode information using the new function. - Added `episodeTotal` field to the movies schema and updated related API endpoints to handle this new field. - Enhanced movie synchronization process to fetch and store episode totals from external sources. - Created a new error page component for better user experience on 404 errors. - Added migration scripts to update the database schema for episode totals. --- app/components/HomeMovieCard.vue | 30 +- app/error.vue | 85 +++++ app/pages/admin/index.vue | 231 +++++++++++- app/pages/admin/phim/index.vue | 30 +- app/pages/index.vue | 216 ++++++----- app/pages/lich-chieu.vue | 19 +- app/pages/phim/[slug].vue | 2 +- app/pages/phim/index.vue | 26 +- app/pages/xem/[slug].vue | 2 +- server/api/admin/movies.get.ts | 23 +- server/api/admin/stats.get.ts | 25 +- server/api/admin/sync.post.ts | 47 ++- server/api/movies.get.ts | 1 + server/api/movies/[slug].get.ts | 19 +- .../migrations/0006_sour_retro_girl.sql | 1 + .../migrations/meta/0006_snapshot.json | 336 ++++++++++++++++++ server/database/migrations/meta/_journal.json | 7 + server/database/schema.ts | 1 + server/utils/movies.ts | 6 + 19 files changed, 983 insertions(+), 124 deletions(-) create mode 100644 app/error.vue create mode 100644 server/database/migrations/0006_sour_retro_girl.sql create mode 100644 server/database/migrations/meta/0006_snapshot.json diff --git a/app/components/HomeMovieCard.vue b/app/components/HomeMovieCard.vue index a917315..bde12ef 100644 --- a/app/components/HomeMovieCard.vue +++ b/app/components/HomeMovieCard.vue @@ -12,6 +12,7 @@ const props = defineProps<{ year?: number time?: string episode?: string + episodeTotal?: string quality?: string lang?: string categories?: string[] @@ -20,6 +21,21 @@ const props = defineProps<{ } }>() +const episodeDisplay = computed(() => { + const ep = props.movie.episode + const total = props.movie.episodeTotal + if (!ep) return undefined + + const totalNum = total ? total.replace(/[^0-9]/g, '') : '' + const epNum = ep.replace(/[^0-9]/g, '') + + if (epNum && totalNum && epNum !== totalNum) { + return `Tập ${epNum}/${totalNum}` + } + + return ep +}) + const isPreviewVisible = ref(false) const isDescriptionExpanded = ref(false) const previewStyle = ref>({}) @@ -82,16 +98,20 @@ onBeforeUnmount(() => { @mouseenter="showPreview" @mouseleave="scheduleHide" @focus="showPreview" @blur="scheduleHide">
-

{{ movie.name }}

-

{{ movie.episode || movie.year || movie.quality }}

+

{{ episodeDisplay || movie.year || movie.quality }}

{{ movie.sources.length }} server + + {{ episodeDisplay }} +
@@ -103,7 +123,7 @@ onBeforeUnmount(() => { class="fixed z-90 hidden origin-top-left overflow-hidden rounded-xl bg-[#07111d] text-white shadow-2xl shadow-black/60 ring-1 ring-yellow-300/45 sm:block" :style="previewStyle" @mouseenter="keepPreview" @mouseleave="scheduleHide">
- +

@@ -135,8 +155,8 @@ onBeforeUnmount(() => { movie.quality }} {{ movie.lang }} {{ movie.time }} - {{ - movie.episode }} + {{ + episodeDisplay }}

diff --git a/app/error.vue b/app/error.vue new file mode 100644 index 0000000..4d3e002 --- /dev/null +++ b/app/error.vue @@ -0,0 +1,85 @@ + + + diff --git a/app/pages/admin/index.vue b/app/pages/admin/index.vue index 6c03628..dea58b2 100644 --- a/app/pages/admin/index.vue +++ b/app/pages/admin/index.vue @@ -1,5 +1,5 @@