diff --git a/src/api/constants.ts b/src/api/constants.ts
index 83a31079..86322c4e 100644
--- a/src/api/constants.ts
+++ b/src/api/constants.ts
@@ -68,6 +68,10 @@ export const mediaServerOptions = [
value: 'emby',
title: i18n.global.t('setting.system.emby'),
},
+ {
+ value: 'zspace',
+ title: i18n.global.t('setting.system.zspace'),
+ },
{
value: 'jellyfin',
title: i18n.global.t('setting.system.jellyfin'),
diff --git a/src/api/types.ts b/src/api/types.ts
index ca0918fe..639f59c1 100644
--- a/src/api/types.ts
+++ b/src/api/types.ts
@@ -1145,7 +1145,7 @@ export interface StorageConf {
export interface MediaServerConf {
// 名称
name: string
- // 类型 emby/jellyfin/plex/trimemedia/ugreen
+ // 类型 emby/zspace/jellyfin/plex/trimemedia/ugreen
type: string
// 配置
config: { [key: string]: any }
diff --git a/src/assets/images/logos/zspace.webp b/src/assets/images/logos/zspace.webp
new file mode 100644
index 00000000..94ae4b87
Binary files /dev/null and b/src/assets/images/logos/zspace.webp differ
diff --git a/src/components/cards/LibraryCard.vue b/src/components/cards/LibraryCard.vue
index a2c19af0..23cc7f84 100644
--- a/src/components/cards/LibraryCard.vue
+++ b/src/components/cards/LibraryCard.vue
@@ -40,6 +40,7 @@ function imageErrorHandler() {
function getDefaultImage() {
if (props.media?.server_type === 'plex') return plex
else if (props.media?.server_type === 'emby') return emby
+ else if (props.media?.server_type === 'zspace') return getLogoUrl('zspace')
else if (props.media?.server_type === 'jellyfin') return jellyfin
else if (props.media?.server_type === 'trimemedia') return getLogoUrl('trimemedia')
else if (props.media?.server_type === 'ugreen') return getLogoUrl('ugreen')
diff --git a/src/components/cards/MediaServerCard.vue b/src/components/cards/MediaServerCard.vue
index cb1870a2..3fe53130 100644
--- a/src/components/cards/MediaServerCard.vue
+++ b/src/components/cards/MediaServerCard.vue
@@ -121,6 +121,8 @@ const getIcon = computed(() => {
switch (props.mediaserver.type) {
case 'emby':
return getLogoUrl('emby')
+ case 'zspace':
+ return getLogoUrl('zspace')
case 'jellyfin':
return getLogoUrl('jellyfin')
case 'trimemedia':
@@ -318,6 +320,77 @@ onMounted(() => {
/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
= {
webUrl: 'https://emby.media',
timeout: 2000,
},
+ zspace: {
+ appScheme: 'emby://',
+ webUrl: 'https://www.zspace.com.cn',
+ timeout: 2000,
+ },
trimemedia: {
appScheme: 'trimemedia://',
webUrl: 'https://trimemedia.com',
@@ -135,6 +140,9 @@ function buildDeepLinkUrl(appType: AppType, params: string | DoubanAppParams): s
case 'emby':
return buildEmbyDeepLink(params as string)
+ case 'zspace':
+ return buildEmbyDeepLink(params as string)
+
case 'trimemedia':
return buildTrimemediaDeepLink(params as string)
@@ -634,7 +642,7 @@ export async function openMediaServerWithAutoDetect(
// 优先使用传入的 serverType 参数
if (serverType) {
const type = serverType.toLowerCase()
- if (type === 'plex' || type === 'jellyfin' || type === 'emby' || type === 'trimemedia') {
+ if (type === 'plex' || type === 'jellyfin' || type === 'emby' || type === 'zspace' || type === 'trimemedia') {
detectedServerType = type as AppType
}
}
@@ -649,6 +657,8 @@ export async function openMediaServerWithAutoDetect(
detectedServerType = 'jellyfin'
} else if (url.includes('emby')) {
detectedServerType = 'emby'
+ } else if (url.includes('zspace')) {
+ detectedServerType = 'zspace'
}
}
@@ -698,6 +708,8 @@ export function getAppDownloadUrl(appType: AppType): string {
return 'https://jellyfin.org/downloads/'
case 'emby':
return 'https://emby.media/download.html'
+ case 'zspace':
+ return 'https://www.zspace.com.cn/'
case 'trimemedia':
return 'https://trimemedia.com/download'
case 'douban':
diff --git a/src/utils/imageUtils.ts b/src/utils/imageUtils.ts
index 1a1ffaeb..7d9f7c80 100644
--- a/src/utils/imageUtils.ts
+++ b/src/utils/imageUtils.ts
@@ -8,6 +8,7 @@ import qbittorrentLogo from '@/assets/images/logos/qbittorrent.png'
import transmissionLogo from '@/assets/images/logos/transmission.png'
import rtorrentLogo from '@/assets/images/logos/rtorrent.png'
import embyLogo from '@/assets/images/logos/emby.png'
+import zspaceLogo from '@/assets/images/logos/zspace.webp'
import jellyfinLogo from '@/assets/images/logos/jellyfin.png'
import plexLogo from '@/assets/images/logos/plex.png'
import trimemediaLogo from '@/assets/images/logos/trimemedia.png'
@@ -40,6 +41,7 @@ const logoMap: Record = {
transmission: transmissionLogo,
rtorrent: rtorrentLogo,
emby: embyLogo,
+ zspace: zspaceLogo,
jellyfin: jellyfinLogo,
plex: plexLogo,
trimemedia: trimemediaLogo,
diff --git a/src/views/setup/MediaServerSettingsStep.vue b/src/views/setup/MediaServerSettingsStep.vue
index 62cc66fa..8f6516af 100644
--- a/src/views/setup/MediaServerSettingsStep.vue
+++ b/src/views/setup/MediaServerSettingsStep.vue
@@ -122,6 +122,19 @@ watch(
+
+
+
+
+ 极影视
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+