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 }}