Compare commits
No commits in common. "main" and "72Player162" have entirely different histories.
main
...
72Player16
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,6 +1,6 @@
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
.pw-user-data
|
.pw-user-data
|
||||||
*.zip
|
|
||||||
node_modules/
|
node_modules/
|
||||||
dist/
|
dist/
|
||||||
npm-debug.log*
|
npm-debug.log*
|
||||||
|
|||||||
Binary file not shown.
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"year": 2024,
|
"year": 2024,
|
||||||
"updatedAt": "2026-03-25T01:35:17.796Z",
|
"updatedAt": "2026-03-12T04:57:57.972Z",
|
||||||
"items": [
|
"items": [
|
||||||
{
|
{
|
||||||
"id": "7f012566d7827b5046de9f92a4d7e159",
|
"id": "7f012566d7827b5046de9f92a4d7e159",
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"year": 2025,
|
"year": 2025,
|
||||||
"updatedAt": "2026-03-25T01:34:35.851Z",
|
"updatedAt": "2026-03-12T04:57:16.089Z",
|
||||||
"items": [
|
"items": [
|
||||||
{
|
{
|
||||||
"id": "b2b4f80b846360647d13e297c029be8d",
|
"id": "b2b4f80b846360647d13e297c029be8d",
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"year": 2026,
|
"year": 2026,
|
||||||
"updatedAt": "2026-03-25T01:33:45.340Z",
|
"updatedAt": "2026-03-12T04:56:24.101Z",
|
||||||
"items": [
|
"items": [
|
||||||
{
|
{
|
||||||
"id": "5abbc88ea530b5db6438a4e584e80281",
|
"id": "5abbc88ea530b5db6438a4e584e80281",
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"running": false,
|
"running": false,
|
||||||
"lastMessage": "自动采集完成",
|
"lastMessage": "采集启动失败: page.goto: Target page, context or browser has been closed\nCall log:\n\u001b[2m - navigating to \"https://www1.gdtv.cn/tvColumn/768\", waiting until \"domcontentloaded\"\u001b[22m\n",
|
||||||
"updatedAt": "2026-03-25T01:35:31.093Z"
|
"updatedAt": "2026-03-12T05:16:36.500Z"
|
||||||
}
|
}
|
||||||
@ -6,14 +6,18 @@
|
|||||||
<div class="top-card card border-0 shadow-sm">
|
<div class="top-card card border-0 shadow-sm">
|
||||||
<div class="card-body d-flex flex-wrap justify-content-between align-items-start gap-3">
|
<div class="card-body d-flex flex-wrap justify-content-between align-items-start gap-3">
|
||||||
<div class="page-main-info">
|
<div class="page-main-info">
|
||||||
|
<!--<div class="page-tag mb-2">在线播放</div>-->
|
||||||
|
|
||||||
<template v-if="currentEpisode">
|
<template v-if="currentEpisode">
|
||||||
<div class="episode-badges mb-2">
|
<div class="episode-badges mb-2">
|
||||||
<span class="info-badge playing">当前播放</span>
|
<span class="info-badge playing">当前播放</span><span class="mx-2">|</span>
|
||||||
<span class="meta-pill">发布时间:{{ formatDate(currentEpisode.releasedAt) }}</span>
|
<span class="info-badge year">发布时间:{{ formatDate(currentEpisode.releasedAt) }}</span>
|
||||||
<span class="meta-pill">时长:{{ formatDuration(currentEpisode.timeLength) }}</span>
|
<span class="info-badge year">时长:{{ formatDuration(currentEpisode.timeLength) }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h2 class="mb-2 page-title">{{ currentEpisode.title }}</h2>
|
<h2 class="mb-2 page-title">{{ currentEpisode.title }}</h2>
|
||||||
|
|
||||||
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template v-else>
|
<template v-else>
|
||||||
@ -38,7 +42,7 @@
|
|||||||
</button>
|
</button>
|
||||||
|
|
||||||
<button class="btn btn-outline-primary btn-sm px-3" @click="openGitRepo">
|
<button class="btn btn-outline-primary btn-sm px-3" @click="openGitRepo">
|
||||||
Git仓库:v163
|
Git仓库:v162
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -99,6 +103,22 @@
|
|||||||
@ended-next="handleEndedNext"
|
@ended-next="handleEndedNext"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<!--<div v-if="currentEpisode" class="episode-info-card mt-3">-->
|
||||||
|
<!-- <div class="d-flex flex-wrap justify-content-between align-items-start gap-3">-->
|
||||||
|
<!-- <div class="flex-grow-1">-->
|
||||||
|
<!-- <div class="episode-badges mb-2">-->
|
||||||
|
<!-- <span class="info-badge playing">当前播放</span>-->
|
||||||
|
<!-- <span class="info-badge year">{{ selectedYear === 'all' ? '全部年份' : `${selectedYear}年` }}</span>-->
|
||||||
|
<!-- <span class="info-badge month">{{ selectedMonth === 'all' ? '全部月份' : `${selectedMonth}月` }}</span>-->
|
||||||
|
<!-- </div>-->
|
||||||
|
|
||||||
|
<!-- <div class="episode-meta">-->
|
||||||
|
<!-- 你可以使用上方筛选快速定位剧集,播放器会自动记录上次观看位置。-->
|
||||||
|
<!-- </div>-->
|
||||||
|
<!-- </div>-->
|
||||||
|
<!-- </div>-->
|
||||||
|
<!--</div>-->
|
||||||
|
|
||||||
<div v-if="errorMsg" class="alert alert-danger mt-3 mb-0">
|
<div v-if="errorMsg" class="alert alert-danger mt-3 mb-0">
|
||||||
{{ errorMsg }}
|
{{ errorMsg }}
|
||||||
</div>
|
</div>
|
||||||
@ -118,12 +138,9 @@
|
|||||||
:episodes="displayEpisodeList"
|
:episodes="displayEpisodeList"
|
||||||
:current-episode-id="currentEpisode?.id || ''"
|
:current-episode-id="currentEpisode?.id || ''"
|
||||||
:years="years"
|
:years="years"
|
||||||
:months="months"
|
|
||||||
:selected-year="selectedYear"
|
:selected-year="selectedYear"
|
||||||
:selected-month="selectedMonth"
|
|
||||||
@select="playEpisode"
|
@select="playEpisode"
|
||||||
@updateYear="handleYearChange"
|
@updateYear="handleYearChange"
|
||||||
@updateMonth="handleMonthChange"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -203,24 +220,6 @@ function openGitRepo() {
|
|||||||
window.open('https://git.a-hxin.cn/ahxin/72QishierPlayer.git', '_blank')
|
window.open('https://git.a-hxin.cn/ahxin/72QishierPlayer.git', '_blank')
|
||||||
}
|
}
|
||||||
|
|
||||||
function getEpisodeIdFromUrl() {
|
|
||||||
const path = window.location.pathname
|
|
||||||
const match = path.match(/^\/episode\/([^/]+)$/)
|
|
||||||
if (match?.[1]) {
|
|
||||||
return decodeURIComponent(match[1])
|
|
||||||
}
|
|
||||||
|
|
||||||
const queryId = new URLSearchParams(window.location.search).get('episode')
|
|
||||||
return queryId || ''
|
|
||||||
}
|
|
||||||
|
|
||||||
function updateUrlByEpisodeId(id: string) {
|
|
||||||
const nextUrl = `/episode/${encodeURIComponent(id)}`
|
|
||||||
if (window.location.pathname !== nextUrl) {
|
|
||||||
window.history.replaceState({}, '', nextUrl)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function handlePlayerError(message: string) {
|
function handlePlayerError(message: string) {
|
||||||
errorMsg.value = message
|
errorMsg.value = message
|
||||||
}
|
}
|
||||||
@ -229,10 +228,6 @@ function handleYearChange(year: string) {
|
|||||||
selectedYear.value = year
|
selectedYear.value = year
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleMonthChange(month: string) {
|
|
||||||
selectedMonth.value = month
|
|
||||||
}
|
|
||||||
|
|
||||||
function getEpisodeYear(item: EpisodeData) {
|
function getEpisodeYear(item: EpisodeData) {
|
||||||
return String(new Date(item.releasedAt).getFullYear())
|
return String(new Date(item.releasedAt).getFullYear())
|
||||||
}
|
}
|
||||||
@ -279,19 +274,6 @@ async function fetchAllEpisodes() {
|
|||||||
|
|
||||||
rebuildMonthsByYear()
|
rebuildMonthsByYear()
|
||||||
|
|
||||||
const urlEpisodeId = getEpisodeIdFromUrl()
|
|
||||||
const urlEpisode = allEpisodeList.value.find(item => item.id === urlEpisodeId)
|
|
||||||
|
|
||||||
if (urlEpisode) {
|
|
||||||
selectedYear.value = getEpisodeYear(urlEpisode)
|
|
||||||
rebuildMonthsByYear()
|
|
||||||
selectedMonth.value = getEpisodeMonth(urlEpisode)
|
|
||||||
currentEpisode.value = urlEpisode
|
|
||||||
saveCurrentEpisodeId(urlEpisode.id)
|
|
||||||
updateUrlByEpisodeId(urlEpisode.id)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
const savedEpisodeId = getCurrentEpisodeId()
|
const savedEpisodeId = getCurrentEpisodeId()
|
||||||
const savedEpisode = allEpisodeList.value.find(item => item.id === savedEpisodeId)
|
const savedEpisode = allEpisodeList.value.find(item => item.id === savedEpisodeId)
|
||||||
|
|
||||||
@ -300,7 +282,6 @@ async function fetchAllEpisodes() {
|
|||||||
rebuildMonthsByYear()
|
rebuildMonthsByYear()
|
||||||
selectedMonth.value = getEpisodeMonth(savedEpisode)
|
selectedMonth.value = getEpisodeMonth(savedEpisode)
|
||||||
currentEpisode.value = savedEpisode
|
currentEpisode.value = savedEpisode
|
||||||
updateUrlByEpisodeId(savedEpisode.id)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -310,8 +291,6 @@ async function fetchAllEpisodes() {
|
|||||||
rebuildMonthsByYear()
|
rebuildMonthsByYear()
|
||||||
selectedMonth.value = getEpisodeMonth(firstEpisode)
|
selectedMonth.value = getEpisodeMonth(firstEpisode)
|
||||||
currentEpisode.value = firstEpisode
|
currentEpisode.value = firstEpisode
|
||||||
saveCurrentEpisodeId(firstEpisode.id)
|
|
||||||
updateUrlByEpisodeId(firstEpisode.id)
|
|
||||||
}
|
}
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
console.error('fetchAllEpisodes error:', error)
|
console.error('fetchAllEpisodes error:', error)
|
||||||
@ -336,7 +315,6 @@ async function playEpisode(item: EpisodeData) {
|
|||||||
selectedMonth.value = getEpisodeMonth(item)
|
selectedMonth.value = getEpisodeMonth(item)
|
||||||
errorMsg.value = ''
|
errorMsg.value = ''
|
||||||
saveCurrentEpisodeId(item.id)
|
saveCurrentEpisodeId(item.id)
|
||||||
updateUrlByEpisodeId(item.id)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function playPrevEpisode() {
|
async function playPrevEpisode() {
|
||||||
@ -390,32 +368,41 @@ onMounted(() => {
|
|||||||
.qishier-page {
|
.qishier-page {
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
background:
|
background:
|
||||||
radial-gradient(circle at top left, rgba(99, 102, 241, 0.10), transparent 28%),
|
radial-gradient(circle at top left, rgba(255, 193, 7, 0.12), transparent 28%),
|
||||||
radial-gradient(circle at top right, rgba(16, 185, 129, 0.08), transparent 24%),
|
radial-gradient(circle at top right, rgba(13, 110, 253, 0.1), transparent 24%),
|
||||||
linear-gradient(180deg, #f7f8fb 0%, #eef2f7 100%);
|
linear-gradient(180deg, #f8f9fa 0%, #eef1f5 100%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.top-card,
|
.top-card,
|
||||||
.control-card,
|
.control-card,
|
||||||
.content-card {
|
.content-card {
|
||||||
border-radius: 18px;
|
border-radius: 20px;
|
||||||
background: rgba(255, 255, 255, 0.96);
|
background: rgba(255, 255, 255, 0.92);
|
||||||
backdrop-filter: blur(10px);
|
backdrop-filter: blur(8px);
|
||||||
}
|
}
|
||||||
|
|
||||||
.page-main-info {
|
.page-main-info {
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.page-tag {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 5px 10px;
|
||||||
|
border-radius: 999px;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: #8a5a00;
|
||||||
|
background: rgba(255, 193, 7, 0.18);
|
||||||
|
}
|
||||||
|
|
||||||
.page-title {
|
.page-title {
|
||||||
font-weight: 800;
|
font-weight: 800;
|
||||||
color: #1f2937;
|
color: #212529;
|
||||||
letter-spacing: -0.02em;
|
letter-spacing: -0.02em;
|
||||||
line-height: 1.35;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.page-subtitle {
|
.page-subtitle {
|
||||||
color: #6b7280;
|
color: #6c757d;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -431,14 +418,20 @@ onMounted(() => {
|
|||||||
width: 120px;
|
width: 120px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.episode-info-card {
|
||||||
|
padding: 16px 18px;
|
||||||
|
border-radius: 18px;
|
||||||
|
background: linear-gradient(135deg, #ffffff 0%, #f8f9fb 100%);
|
||||||
|
border: 1px solid rgba(0, 0, 0, 0.05);
|
||||||
|
}
|
||||||
|
|
||||||
.episode-badges {
|
.episode-badges {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
gap: 8px;
|
gap: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.info-badge,
|
.info-badge {
|
||||||
.meta-pill {
|
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding: 5px 10px;
|
padding: 5px 10px;
|
||||||
@ -448,23 +441,42 @@ onMounted(() => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.info-badge.playing {
|
.info-badge.playing {
|
||||||
background: rgba(59, 130, 246, 0.12);
|
background: rgba(255, 193, 7, 0.18);
|
||||||
color: #2563eb;
|
color: #9a6a00;
|
||||||
}
|
}
|
||||||
|
|
||||||
.meta-pill {
|
.info-badge.year {
|
||||||
background: rgba(15, 23, 42, 0.06);
|
background: rgba(13, 110, 253, 0.1);
|
||||||
color: #475569;
|
color: #0d6efd;
|
||||||
|
}
|
||||||
|
|
||||||
|
.episode-title {
|
||||||
|
color: #212529;
|
||||||
|
font-weight: 800;
|
||||||
|
line-height: 1.45;
|
||||||
}
|
}
|
||||||
|
|
||||||
.episode-meta {
|
.episode-meta {
|
||||||
color: #6b7280;
|
color: #6c757d;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.episode-actions {
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
@media (max-width: 991px) {
|
@media (max-width: 991px) {
|
||||||
.header-actions {
|
.header-actions {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.episode-info-card {
|
||||||
|
padding: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.episode-actions {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
近期最新的集数 这个新出的集数颜色那里 改成不是黄色 我想要好看点的颜色 还有 页面太空白了 别整那么空了,看着难受 clearfix
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user