From 32621ee29928c96bc0e2ecafd1806dc28aa939cf Mon Sep 17 00:00:00 2001 From: jxxghp Date: Fri, 21 Feb 2025 10:12:16 +0800 Subject: [PATCH] =?UTF-8?q?feat(Search):=20=E6=B7=BB=E5=8A=A0=E7=AB=99?= =?UTF-8?q?=E7=82=B9=E6=90=9C=E7=B4=A2=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E9=80=89=E6=8B=A9=E5=92=8C=E8=BF=87=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 4 +- src/components/cards/MediaCard.vue | 70 +++++++++++++++++++- src/views/discover/MediaDetailView.vue | 89 ++++++++++++++++++++------ src/views/system/SearchBarView.vue | 4 +- 4 files changed, 140 insertions(+), 27 deletions(-) diff --git a/package.json b/package.json index b59935fa..88ae0a06 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "moviepilot", - "version": "2.3.0", + "version": "2.3.1", "private": true, "bin": "dist/service.js", "scripts": { @@ -101,4 +101,4 @@ "workbox-window": "^7.3.0" }, "packageManager": "yarn@1.22.18" -} +} \ No newline at end of file diff --git a/src/components/cards/MediaCard.vue b/src/components/cards/MediaCard.vue index 4c5c82c4..e6f677f0 100644 --- a/src/components/cards/MediaCard.vue +++ b/src/components/cards/MediaCard.vue @@ -5,7 +5,7 @@ import SubscribeEditDialog from '../dialog/SubscribeEditDialog.vue' import { formatSeason, formatRating } from '@/@core/utils/formatters' import api from '@/api' import { doneNProgress, startNProgress } from '@/api/nprogress' -import type { MediaInfo, NotExistMediaInfo, Subscribe, MediaSeason } from '@/api/types' +import type { MediaInfo, NotExistMediaInfo, Subscribe, MediaSeason, Site } from '@/api/types' import router, { registerAbortController } from '@/router' import noImage from '@images/no-image.jpeg' import tmdbImage from '@images/logos/tmdb.png' @@ -73,6 +73,38 @@ const mediaCardRef = ref(null) // 创建Intersection Observer实例 const observer = ref(null) +// 所有站点 +const allSites = ref([]) + +// 选中的站点 +const selectedSites = ref([]) + +// 搜索菜单显示状态 +const searchMenuShow = ref(false) + +// 查询所有站点 +async function querySites() { + try { + const data: Site[] = await api.get('site/') + + // 过滤站点,只有启用的站点才显示 + allSites.value = data.filter(item => item.is_active) + } catch (error) { + console.log(error) + } +} + +// 查询用户选中的站点 +async function querySelectedSites() { + try { + const result: { [key: string]: any } = await api.get('system/setting/IndexerSites') + + selectedSites.value = result.data?.value ?? [] + } catch (error) { + console.log(error) + } +} + // 获得mediaid function getMediaId() { if (props.media?.tmdb_id) return `tmdb:${props.media?.tmdb_id}` @@ -375,6 +407,13 @@ function goMediaDetail(isHovering = false) { } } +// 点击搜索 +async function clickSearch() { + if (allSites.value?.length > 0) return + querySites() + querySelectedSites() +} + // 开始搜索 function handleSearch() { router.push({ @@ -386,6 +425,7 @@ function handleSearch() { title: props.media?.title, year: props.media?.year, season: props.media?.season, + sites: selectedSites.value.join(','), }, }) } @@ -499,7 +539,7 @@ function onRemoveSubscribe() { @@ -512,7 +552,31 @@ function onRemoveSubscribe() {

- + + + + + + + {{ site.name }} + + + + + 搜索 + + +
diff --git a/src/views/discover/MediaDetailView.vue b/src/views/discover/MediaDetailView.vue index 091db351..12fd6f94 100644 --- a/src/views/discover/MediaDetailView.vue +++ b/src/views/discover/MediaDetailView.vue @@ -3,7 +3,7 @@ import { useToast } from 'vue-toast-notification' import PersonCardSlideView from './PersonCardSlideView.vue' import MediaCardSlideView from './MediaCardSlideView.vue' import api from '@/api' -import type { MediaInfo, NotExistMediaInfo, Subscribe, TmdbEpisode } from '@/api/types' +import type { MediaInfo, NotExistMediaInfo, Site, Subscribe, TmdbEpisode } from '@/api/types' import NoDataFound from '@/components/NoDataFound.vue' import { doneNProgress, startNProgress } from '@/api/nprogress' import { formatSeason } from '@/@core/utils/formatters' @@ -57,6 +57,38 @@ const seasonsSubscribed = ref<{ [key: number]: boolean }>({}) // 订阅编号 const subscribeId = ref() +// 所有站点 +const allSites = ref([]) + +// 选中的站点 +const selectedSites = ref([]) + +// 搜索方式 title/imdbid +const searchType = ref('title') + +// 查询所有站点 +async function querySites() { + try { + const data: Site[] = await api.get('site/') + + // 过滤站点,只有启用的站点才显示 + allSites.value = data.filter(item => item.is_active) + } catch (error) { + console.log(error) + } +} + +// 查询用户选中的站点 +async function querySelectedSites() { + try { + const result: { [key: string]: any } = await api.get('system/setting/IndexerSites') + + selectedSites.value = result.data?.value ?? [] + } catch (error) { + console.log(error) + } +} + // 获得mediaid function getMediaId() { if (mediaDetail.value?.tmdb_id) return `tmdb:${mediaDetail.value?.tmdb_id}` @@ -398,17 +430,18 @@ function joinArray(arr: string[]) { } // 开始搜索 -function handleSearch(area: string) { +function handleSearch() { const keyword = getMediaId() router.push({ path: '/resource', query: { keyword, type: mediaDetail.value.type, - area, + area: searchType.value, title: mediaDetail.value.title, year: mediaDetail.value.year, season: mediaDetail.value.season, + sites: selectedSites.value.join(','), }, }) } @@ -455,6 +488,13 @@ function onSubscribeEditRemove() { else checkSeasonsSubscribed() } +// 点击搜索 +async function clickSearch() { + if (allSites.value?.length > 0) return + querySites() + querySelectedSites() +} + onBeforeMount(() => { getMediaDetail() }) @@ -512,38 +552,45 @@ onBeforeMount(() => {
搜索资源 - + - - 标题 + + + 标题 + IMDB链接 + - - IMDB链接 + + + + {{ site.name }} + + + + + 搜索 - - - 搜索资源 - { 搜索 {{ searchWord }} 相关的【站点资源】 ... - + { filter variant="outlined" :value="site.id" + size="small" + @click.stop > {{ site.name }}