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() + } + " />