diff --git a/src/assets/images/logos/bangumi.png b/src/assets/images/logos/bangumi.png
new file mode 100644
index 00000000..d04574fc
Binary files /dev/null and b/src/assets/images/logos/bangumi.png differ
diff --git a/src/assets/images/logos/douban-black.png b/src/assets/images/logos/douban-black.png
new file mode 100644
index 00000000..084c37ce
Binary files /dev/null and b/src/assets/images/logos/douban-black.png differ
diff --git a/src/components/cards/MediaCard.vue b/src/components/cards/MediaCard.vue
index 663eefdc..edf082b6 100644
--- a/src/components/cards/MediaCard.vue
+++ b/src/components/cards/MediaCard.vue
@@ -8,6 +8,9 @@ import { doneNProgress, startNProgress } from '@/api/nprogress'
import type { MediaInfo, NotExistMediaInfo, Subscribe, TmdbSeason } from '@/api/types'
import router from '@/router'
import noImage from '@images/no-image.jpeg'
+import tmdbImage from '@images/logos/tmdb.png'
+import doubanImage from '@images/logos/douban-black.png'
+import bangumiImage from '@images/logos/bangumi.png'
// 输入参数
const props = defineProps({
@@ -52,31 +55,35 @@ const seasonInfos = ref([])
// 选中的订阅季
const seasonsSelected = ref([])
+// 来源角标字典
+const sourceIconDict = {
+ themoviedb: tmdbImage,
+ douban: doubanImage,
+ bangumi: bangumiImage,
+}
+
// 获得mediaid
function getMediaId() {
return props.media?.tmdb_id
? `tmdb:${props.media?.tmdb_id}`
: props.media?.douban_id
- ? `douban:${props.media?.douban_id}`
- : `bangumi:${props.media?.bangumi_id}`
+ ? `douban:${props.media?.douban_id}`
+ : `bangumi:${props.media?.bangumi_id}`
}
// 订阅弹窗选择的多季
function subscribeSeasons() {
subscribeSeasonDialog.value = false
- seasonsSelected.value.forEach((season) => {
+ seasonsSelected.value.forEach(season => {
addSubscribe(season.season_number)
})
}
// 角标颜色
function getChipColor(type: string) {
- if (type === '电影')
- return 'border-blue-500 bg-blue-600'
- else if (type === '电视剧')
- return ' bg-indigo-500 border-indigo-600'
- else
- return 'border-purple-600 bg-purple-600'
+ if (type === '电影') return 'border-blue-500 bg-blue-600'
+ else if (type === '电视剧') return ' bg-indigo-500 border-indigo-600'
+ else return 'border-purple-600 bg-purple-600'
}
// 添加订阅处理
@@ -93,26 +100,22 @@ async function handleAddSubscribe() {
// 检查各季的缺失状态
await checkSeasonsNotExists()
- if (!tmdbFlag.value)
- return
+ if (!tmdbFlag.value) return
if (seasonInfos.value.length === 1) {
// 添加订阅
addSubscribe(1)
- }
- else {
+ } else {
// 弹出季选择列表,支持多选
seasonsSelected.value = []
subscribeSeasonDialog.value = true
}
- }
- else if (props.media?.type === '电视剧') {
+ } else if (props.media?.type === '电视剧') {
// 豆瓣电视剧,只会有一季
const season = props.media?.season ?? 1
// 添加订阅
addSubscribe(season)
- }
- else {
+ } else {
// 电影
addSubscribe()
}
@@ -147,13 +150,7 @@ async function addSubscribe(season = 0) {
}
// 提示
- showSubscribeAddToast(
- result.success,
- props.media?.title ?? '',
- season,
- result.message,
- best_version,
- )
+ showSubscribeAddToast(result.success, props.media?.title ?? '', season, result.message, best_version)
// 弹出订阅编辑弹窗
if (result.success && seasonsSelected.value.length <= 1) {
@@ -163,8 +160,7 @@ async function addSubscribe(season = 0) {
subscribeEditDialog.value = true
}
}
- }
- catch (error) {
+ } catch (error) {
console.error(error)
} finally {
doneNProgress()
@@ -172,22 +168,14 @@ async function addSubscribe(season = 0) {
}
// 弹出添加订阅提示
-function showSubscribeAddToast(result: boolean,
- title: string,
- season: number,
- message: string,
- best_version: number) {
- if (season)
- title = `${title} ${formatSeason(season.toString())}`
+function showSubscribeAddToast(result: boolean, title: string, season: number, message: string, best_version: number) {
+ if (season) title = `${title} ${formatSeason(season.toString())}`
let subname = '订阅'
- if (best_version > 0)
- subname = '洗版订阅'
+ if (best_version > 0) subname = '洗版订阅'
- if (result && seasonsSelected.value.length > 1)
- $toast.success(`${title} 添加${subname}成功!`)
- else if (!result)
- $toast.error(`${title} 添加${subname}失败:${message}!`)
+ if (result && seasonsSelected.value.length > 1) $toast.success(`${title} 添加${subname}成功!`)
+ else if (!result) $toast.error(`${title} 添加${subname}失败:${message}!`)
}
// 调用API取消订阅
@@ -197,24 +185,19 @@ async function removeSubscribe() {
try {
const mediaid = getMediaId()
- const result: { [key: string]: any } = await api.delete(
- `subscribe/media/${mediaid}`,
- {
- params: {
- season: props.media?.season,
- },
+ const result: { [key: string]: any } = await api.delete(`subscribe/media/${mediaid}`, {
+ params: {
+ season: props.media?.season,
},
- )
+ })
if (result.success) {
isSubscribed.value = false
$toast.success(`${props.media?.title} 已取消订阅!`)
- }
- else {
+ } else {
$toast.error(`${props.media?.title} 取消订阅失败:${result.message}!`)
}
- }
- catch (error) {
+ } catch (error) {
console.error(error)
}
doneNProgress()
@@ -224,10 +207,8 @@ async function removeSubscribe() {
async function handleCheckSubscribe() {
try {
const result = await checkSubscribe(props.media?.season)
- if (result)
- isSubscribed.value = true
- }
- catch (error) {
+ if (result) isSubscribed.value = true
+ } catch (error) {
console.error(error)
}
}
@@ -245,10 +226,8 @@ async function handleCheckExists() {
},
})
- if (result.success)
- isExists.value = true
- }
- catch (error) {
+ if (result.success) isExists.value = true
+ } catch (error) {
console.error(error)
}
}
@@ -266,8 +245,7 @@ async function checkSubscribe(season = 0) {
})
return result.id || null
- }
- catch (error) {
+ } catch (error) {
console.error(error)
}
@@ -281,19 +259,16 @@ async function checkSeasonsNotExists() {
try {
const result: NotExistMediaInfo[] = await api.post('mediaserver/notexists', props.media)
if (result) {
- result.forEach((item) => {
+ result.forEach(item => {
// 0-已入库 1-部分缺失 2-全部缺失
let state = 0
- if (item.episodes.length === 0)
- state = 2
- else if (item.episodes.length < item.total_episode)
- state = 1
+ if (item.episodes.length === 0) state = 2
+ else if (item.episodes.length < item.total_episode) state = 1
seasonsNotExisted.value[item.season] = state
})
}
- }
- catch (error) {
+ } catch (error) {
$toast.error(`${props.media?.title}无法识别TMDB媒体信息!`)
tmdbFlag.value = false
}
@@ -306,8 +281,7 @@ async function checkSeasonsNotExists() {
async function getMediaSeasons() {
try {
seasonInfos.value = await api.get(`tmdb/seasons/${props.media?.tmdb_id}`)
- }
- catch (error) {
+ } catch (error) {
console.error(error)
}
}
@@ -316,17 +290,13 @@ async function getMediaSeasons() {
async function queryDefaultSubscribeConfig() {
try {
let subscribe_config_url = ''
- if (props.media?.type === '电影')
- subscribe_config_url = 'system/setting/DefaultMovieSubscribeConfig'
- else
- subscribe_config_url = 'system/setting/DefaultTvSubscribeConfig'
+ if (props.media?.type === '电影') subscribe_config_url = 'system/setting/DefaultMovieSubscribeConfig'
+ else subscribe_config_url = 'system/setting/DefaultTvSubscribeConfig'
const result: { [key: string]: any } = await api.get(subscribe_config_url)
- if (result.data?.value)
- return result.data.value.show_edit_dialog
- }
- catch (error) {
+ if (result.data?.value) return result.data.value.show_edit_dialog
+ } catch (error) {
console.log(error)
}
return false
@@ -334,38 +304,28 @@ async function queryDefaultSubscribeConfig() {
// 爱心订阅按钮响应
function handleSubscribe() {
- if (isSubscribed.value)
- removeSubscribe()
- else
- handleAddSubscribe()
+ if (isSubscribed.value) removeSubscribe()
+ else handleAddSubscribe()
}
// 计算存在状态的颜色
function getExistColor(season: number) {
const state = seasonsNotExisted.value[season]
- if (!state)
- return 'success'
+ if (!state) return 'success'
- if (state === 1)
- return 'warning'
- else if (state === 2)
- return 'error'
- else
- return 'success'
+ if (state === 1) return 'warning'
+ else if (state === 2) return 'error'
+ else return 'success'
}
// 计算存在状态的文本
function getExistText(season: number) {
const state = seasonsNotExisted.value[season]
- if (!state)
- return '已入库'
+ if (!state) return '已入库'
- if (state === 1)
- return '部分缺失'
- else if (state === 2)
- return '缺失'
- else
- return '已入库'
+ if (state === 1) return '部分缺失'
+ else if (state === 2) return '缺失'
+ else return '已入库'
}
// 打开详情页
@@ -402,8 +362,7 @@ onBeforeMount(() => {
// 计算图片地址
const getImgUrl: Ref = computed(() => {
- if (imageLoadError.value)
- return noImage
+ if (imageLoadError.value) return noImage
const url = props.media?.poster_path?.replace('original', 'w500') ?? noImage
// 如果地址中包含douban则使用中转代理
if (url.includes('doubanio.com'))
@@ -414,22 +373,19 @@ const getImgUrl: Ref = computed(() => {
// 拼装季图片地址
function getSeasonPoster(posterPath: string) {
- if (!posterPath)
- return ''
+ if (!posterPath) return ''
return `https://image.tmdb.org/t/p/w500${posterPath}`
}
// 将yyyy-mm-dd转换为yyyy年mm月dd日
function formatAirDate(airDate: string) {
- if (!airDate)
- return ''
+ if (!airDate) return ''
const date = new Date(airDate.replaceAll(/-/g, '/'))
return `${date.getFullYear()}年${date.getMonth() + 1}月${date.getDate()}日`
}
// 从yyyy-mm-dd中提取年份
function getYear(airDate: string) {
- if (!airDate)
- return ''
+ if (!airDate) return ''
const date = new Date(airDate.replaceAll(/-/g, '/'))
return date.getFullYear()
}
@@ -499,43 +455,30 @@ function getYear(airDate: string) {
{{ props.media?.overview }}
-
-
+
+
+
+
+
-
+
-
- 订阅 - {{ props.media?.title }}
-
+ 订阅 - {{ props.media?.title }}
-
-
+
+
-
- 第 {{ item.season_number }} 季
-
+ 第 {{ item.season_number }} 季
-
+
{{ item.vote_average }}
{{ getYear(item.air_date || '') }} • {{ item.episode_count }} 集
@@ -570,12 +506,7 @@ function getYear(airDate: string) {
《{{ media?.title }}》第 {{ item.season_number }} 季于 {{ formatAirDate(item.air_date || '') }} 首播。
-
+
{{ getExistText(item.season_number || 0) }}
@@ -588,11 +519,7 @@ function getYear(airDate: string) {
-
+
{{ seasonsSelected.length === 0 ? '请选择订阅季' : '提交订阅' }}
@@ -605,7 +532,12 @@ function getYear(airDate: string) {
:subid="subscribeId"
@close="subscribeEditDialog = false"
@save="subscribeEditDialog = false"
- @remove="() => { subscribeEditDialog = false; handleCheckSubscribe(); }"
+ @remove="
+ () => {
+ subscribeEditDialog = false
+ handleCheckSubscribe()
+ }
+ "
/>