mirror of
https://github.com/jxxghp/MoviePilot-Frontend.git
synced 2026-07-02 13:01:33 +08:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b49385af29 | ||
|
|
b227412c96 | ||
|
|
b3c8faab70 | ||
|
|
9a480dd803 | ||
|
|
847fd13982 | ||
|
|
7fa4f4a2f0 |
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "moviepilot",
|
"name": "moviepilot",
|
||||||
"version": "2.11.1",
|
"version": "2.11.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"bin": "dist/service.js",
|
"bin": "dist/service.js",
|
||||||
|
|||||||
@@ -1311,6 +1311,57 @@ export interface TransferForm {
|
|||||||
library_category_folder?: boolean
|
library_category_folder?: boolean
|
||||||
// 剧集组编号
|
// 剧集组编号
|
||||||
episode_group?: string
|
episode_group?: string
|
||||||
|
// 预览模式
|
||||||
|
preview?: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
// 手动整理请求
|
||||||
|
export interface ManualTransferPayload extends TransferForm {}
|
||||||
|
|
||||||
|
// 手动整理预览统计
|
||||||
|
export interface ManualTransferPreviewSummary {
|
||||||
|
// 总数
|
||||||
|
total: number
|
||||||
|
// 成功数
|
||||||
|
success: number
|
||||||
|
// 失败数
|
||||||
|
failed: number
|
||||||
|
}
|
||||||
|
|
||||||
|
// 手动整理预览项
|
||||||
|
export interface ManualTransferPreviewItem {
|
||||||
|
// 原始路径
|
||||||
|
source?: string
|
||||||
|
// 目标路径
|
||||||
|
target?: string
|
||||||
|
// 目标目录
|
||||||
|
target_dir?: string
|
||||||
|
// 是否成功
|
||||||
|
success?: boolean
|
||||||
|
// 提示信息
|
||||||
|
message?: string
|
||||||
|
// 媒体类型
|
||||||
|
type?: string
|
||||||
|
// 媒体标题
|
||||||
|
title?: string
|
||||||
|
// 季
|
||||||
|
season?: number | string
|
||||||
|
// 开始集
|
||||||
|
episode?: number | string
|
||||||
|
// 结束集
|
||||||
|
episode_end?: number | string
|
||||||
|
// Part
|
||||||
|
part?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
// 手动整理预览数据
|
||||||
|
export interface ManualTransferPreviewData {
|
||||||
|
// 统计信息
|
||||||
|
summary: ManualTransferPreviewSummary
|
||||||
|
// 预览结果
|
||||||
|
items: ManualTransferPreviewItem[]
|
||||||
|
// 额外消息
|
||||||
|
message?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
// 整理队列
|
// 整理队列
|
||||||
|
|||||||
BIN
src/assets/images/logos/feishu.png
Normal file
BIN
src/assets/images/logos/feishu.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.1 KiB |
@@ -47,6 +47,7 @@ const notificationInfo = ref<NotificationConf>({
|
|||||||
// 各通知类型的名称字典
|
// 各通知类型的名称字典
|
||||||
const notificationTypeNames: { [key: string]: string } = {
|
const notificationTypeNames: { [key: string]: string } = {
|
||||||
wechat: t('notification.wechat.name'),
|
wechat: t('notification.wechat.name'),
|
||||||
|
feishu: t('notification.feishu.name'),
|
||||||
wechatclawbot: t('notification.wechatclawbot.name'),
|
wechatclawbot: t('notification.wechatclawbot.name'),
|
||||||
telegram: t('notification.telegram.name'),
|
telegram: t('notification.telegram.name'),
|
||||||
qqbot: t('notification.qqbot.name'),
|
qqbot: t('notification.qqbot.name'),
|
||||||
@@ -417,6 +418,8 @@ const getIcon = computed(() => {
|
|||||||
return getLogoUrl('wechat')
|
return getLogoUrl('wechat')
|
||||||
case 'wechatclawbot':
|
case 'wechatclawbot':
|
||||||
return getLogoUrl('wechatclawbot')
|
return getLogoUrl('wechatclawbot')
|
||||||
|
case 'feishu':
|
||||||
|
return getLogoUrl('feishu')
|
||||||
case 'telegram':
|
case 'telegram':
|
||||||
return getLogoUrl('telegram')
|
return getLogoUrl('telegram')
|
||||||
case 'qqbot':
|
case 'qqbot':
|
||||||
@@ -777,6 +780,84 @@ watch(notificationInfoDialog, value => {
|
|||||||
</VCard>
|
</VCard>
|
||||||
</VCol>
|
</VCol>
|
||||||
</VRow>
|
</VRow>
|
||||||
|
<VRow v-else-if="notificationInfo.type == 'feishu'">
|
||||||
|
<VCol cols="12" md="6">
|
||||||
|
<VTextField
|
||||||
|
v-model="notificationInfo.name"
|
||||||
|
:label="t('notification.name')"
|
||||||
|
:placeholder="t('notification.name')"
|
||||||
|
:hint="t('notification.nameHint')"
|
||||||
|
persistent-hint
|
||||||
|
prepend-inner-icon="mdi-label"
|
||||||
|
/>
|
||||||
|
</VCol>
|
||||||
|
<VCol cols="12" md="6">
|
||||||
|
<VTextField
|
||||||
|
v-model="notificationInfo.config.FEISHU_APP_ID"
|
||||||
|
:label="t('notification.feishu.appId')"
|
||||||
|
:hint="t('notification.feishu.appIdHint')"
|
||||||
|
persistent-hint
|
||||||
|
prepend-inner-icon="mdi-application"
|
||||||
|
/>
|
||||||
|
</VCol>
|
||||||
|
<VCol cols="12" md="6">
|
||||||
|
<VTextField
|
||||||
|
v-model="notificationInfo.config.FEISHU_APP_SECRET"
|
||||||
|
:label="t('notification.feishu.appSecret')"
|
||||||
|
:hint="t('notification.feishu.appSecretHint')"
|
||||||
|
persistent-hint
|
||||||
|
prepend-inner-icon="mdi-key"
|
||||||
|
/>
|
||||||
|
</VCol>
|
||||||
|
<VCol cols="12" md="6">
|
||||||
|
<VTextField
|
||||||
|
v-model="notificationInfo.config.FEISHU_OPEN_ID"
|
||||||
|
:label="t('notification.feishu.openId')"
|
||||||
|
:placeholder="t('notification.feishu.openIdPlaceholder')"
|
||||||
|
:hint="t('notification.feishu.openIdHint')"
|
||||||
|
persistent-hint
|
||||||
|
prepend-inner-icon="mdi-account"
|
||||||
|
/>
|
||||||
|
</VCol>
|
||||||
|
<VCol cols="12" md="6">
|
||||||
|
<VTextField
|
||||||
|
v-model="notificationInfo.config.FEISHU_CHAT_ID"
|
||||||
|
:label="t('notification.feishu.chatId')"
|
||||||
|
:placeholder="t('notification.feishu.chatIdPlaceholder')"
|
||||||
|
:hint="t('notification.feishu.chatIdHint')"
|
||||||
|
persistent-hint
|
||||||
|
prepend-inner-icon="mdi-chat-processing"
|
||||||
|
/>
|
||||||
|
</VCol>
|
||||||
|
<VCol cols="12" md="6">
|
||||||
|
<VTextField
|
||||||
|
v-model="notificationInfo.config.FEISHU_ADMINS"
|
||||||
|
:label="t('notification.feishu.admins')"
|
||||||
|
:placeholder="t('notification.feishu.adminsPlaceholder')"
|
||||||
|
:hint="t('notification.feishu.adminsHint')"
|
||||||
|
persistent-hint
|
||||||
|
prepend-inner-icon="mdi-account-supervisor"
|
||||||
|
/>
|
||||||
|
</VCol>
|
||||||
|
<VCol cols="12" md="6">
|
||||||
|
<VTextField
|
||||||
|
v-model="notificationInfo.config.FEISHU_VERIFICATION_TOKEN"
|
||||||
|
:label="t('notification.feishu.verificationToken')"
|
||||||
|
:hint="t('notification.feishu.verificationTokenHint')"
|
||||||
|
persistent-hint
|
||||||
|
prepend-inner-icon="mdi-shield-key"
|
||||||
|
/>
|
||||||
|
</VCol>
|
||||||
|
<VCol cols="12" md="6">
|
||||||
|
<VTextField
|
||||||
|
v-model="notificationInfo.config.FEISHU_ENCRYPT_KEY"
|
||||||
|
:label="t('notification.feishu.encryptKey')"
|
||||||
|
:hint="t('notification.feishu.encryptKeyHint')"
|
||||||
|
persistent-hint
|
||||||
|
prepend-inner-icon="mdi-lock"
|
||||||
|
/>
|
||||||
|
</VCol>
|
||||||
|
</VRow>
|
||||||
<VRow v-else-if="notificationInfo.type == 'telegram'">
|
<VRow v-else-if="notificationInfo.type == 'telegram'">
|
||||||
<VCol cols="12" md="6">
|
<VCol cols="12" md="6">
|
||||||
<VTextField
|
<VTextField
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -328,6 +328,7 @@ export function useSetupWizard() {
|
|||||||
},
|
},
|
||||||
// 通知映射
|
// 通知映射
|
||||||
notification: {
|
notification: {
|
||||||
|
'feishu': 'FeishuModule',
|
||||||
'telegram': 'TelegramModule',
|
'telegram': 'TelegramModule',
|
||||||
'wechat': 'WechatModule',
|
'wechat': 'WechatModule',
|
||||||
'wechatclawbot': 'WechatClawBotModule',
|
'wechatclawbot': 'WechatClawBotModule',
|
||||||
@@ -427,6 +428,7 @@ export function useSetupWizard() {
|
|||||||
if (!wizardData.value.notification.name || wizardData.value.notification.name.includes('通知')) {
|
if (!wizardData.value.notification.name || wizardData.value.notification.name.includes('通知')) {
|
||||||
const displayNameMap: Record<string, string> = {
|
const displayNameMap: Record<string, string> = {
|
||||||
wechat: '企业微信',
|
wechat: '企业微信',
|
||||||
|
feishu: '飞书',
|
||||||
wechatclawbot: '微信 ClawBot',
|
wechatclawbot: '微信 ClawBot',
|
||||||
telegram: 'Telegram',
|
telegram: 'Telegram',
|
||||||
slack: 'Slack',
|
slack: 'Slack',
|
||||||
@@ -679,6 +681,16 @@ export function useSetupWizard() {
|
|||||||
break
|
break
|
||||||
case 'wechatclawbot':
|
case 'wechatclawbot':
|
||||||
break
|
break
|
||||||
|
case 'feishu':
|
||||||
|
if (!config.FEISHU_APP_ID?.trim()) {
|
||||||
|
errors.push(t('notification.feishu.appIdRequired'))
|
||||||
|
validationErrors.value.notification.FEISHU_APP_ID = true
|
||||||
|
}
|
||||||
|
if (!config.FEISHU_APP_SECRET?.trim()) {
|
||||||
|
errors.push(t('notification.feishu.appSecretRequired'))
|
||||||
|
validationErrors.value.notification.FEISHU_APP_SECRET = true
|
||||||
|
}
|
||||||
|
break
|
||||||
case 'telegram':
|
case 'telegram':
|
||||||
if (!config.TELEGRAM_TOKEN?.trim()) {
|
if (!config.TELEGRAM_TOKEN?.trim()) {
|
||||||
errors.push(t('notification.telegram.tokenRequired'))
|
errors.push(t('notification.telegram.tokenRequired'))
|
||||||
|
|||||||
@@ -505,6 +505,28 @@ export default {
|
|||||||
logoutSuccess: 'WeChat ClawBot logged out',
|
logoutSuccess: 'WeChat ClawBot logged out',
|
||||||
logoutFailed: 'Failed to logout WeChat ClawBot',
|
logoutFailed: 'Failed to logout WeChat ClawBot',
|
||||||
},
|
},
|
||||||
|
feishu: {
|
||||||
|
name: 'Feishu',
|
||||||
|
appId: 'App ID',
|
||||||
|
appIdHint: 'App ID of the Feishu Open Platform application',
|
||||||
|
appIdRequired: 'App ID cannot be empty',
|
||||||
|
appSecret: 'App Secret',
|
||||||
|
appSecretHint: 'App Secret of the Feishu Open Platform application',
|
||||||
|
appSecretRequired: 'App Secret cannot be empty',
|
||||||
|
openId: 'Default User Open ID',
|
||||||
|
openIdHint: 'Default recipient user Open ID; leave empty to prefer recent interacted users',
|
||||||
|
openIdPlaceholder: 'ou_xxx',
|
||||||
|
chatId: 'Default Group Chat ID',
|
||||||
|
chatIdHint: 'Default recipient group chat ID; either this or Open ID is enough',
|
||||||
|
chatIdPlaceholder: 'oc_xxx',
|
||||||
|
admins: 'Admin Whitelist',
|
||||||
|
adminsHint: 'Open IDs allowed to run commands and admin actions, separated by commas',
|
||||||
|
adminsPlaceholder: 'Open ID list, separated by commas',
|
||||||
|
verificationToken: 'Verification Token',
|
||||||
|
verificationTokenHint: 'Verification Token for Feishu event subscription, required when validation is enabled',
|
||||||
|
encryptKey: 'Encrypt Key',
|
||||||
|
encryptKeyHint: 'Encrypt Key for Feishu event subscription, required when encryption is enabled',
|
||||||
|
},
|
||||||
telegram: {
|
telegram: {
|
||||||
name: 'Telegram',
|
name: 'Telegram',
|
||||||
token: 'Bot Token',
|
token: 'Bot Token',
|
||||||
@@ -1769,6 +1791,7 @@ export default {
|
|||||||
channel: 'Notification',
|
channel: 'Notification',
|
||||||
wechat: 'WeChat Work',
|
wechat: 'WeChat Work',
|
||||||
wechatClawBot: 'WeChat ClawBot',
|
wechatClawBot: 'WeChat ClawBot',
|
||||||
|
feishu: 'Feishu',
|
||||||
resourceDownload: 'Resource Download',
|
resourceDownload: 'Resource Download',
|
||||||
mediaImport: 'Media Import',
|
mediaImport: 'Media Import',
|
||||||
subscription: 'Subscription',
|
subscription: 'Subscription',
|
||||||
@@ -2494,6 +2517,31 @@ export default {
|
|||||||
scrapeHint: 'Automatically scrape metadata after organization',
|
scrapeHint: 'Automatically scrape metadata after organization',
|
||||||
fromHistoryOption: 'Reuse Historical Recognition Info',
|
fromHistoryOption: 'Reuse Historical Recognition Info',
|
||||||
fromHistoryHint: 'Use media info already recognized in historical organization records',
|
fromHistoryHint: 'Use media info already recognized in historical organization records',
|
||||||
|
previewTitle: 'Preview Result',
|
||||||
|
previewSubtitle: 'Click "Preview" to inspect the expected organization result without changing files.',
|
||||||
|
previewResult: 'Preview',
|
||||||
|
previewLoading: 'Generating preview result...',
|
||||||
|
previewRequestFailed: 'Preview request failed',
|
||||||
|
previewTotal: 'Total {count}',
|
||||||
|
previewSuccess: 'Success {count}',
|
||||||
|
previewFailed: 'Failed {count}',
|
||||||
|
previewSourcePath: 'Source Path',
|
||||||
|
previewTargetPath: 'Target Path',
|
||||||
|
previewMediaInfo: 'Media',
|
||||||
|
previewMediaName: 'Name',
|
||||||
|
previewMediaType: 'Type',
|
||||||
|
previewSeasonInfo: 'Season',
|
||||||
|
previewSeasonLabel: 'Season',
|
||||||
|
previewEpisodeCount: 'Episodes',
|
||||||
|
previewAfterColumn: 'After',
|
||||||
|
previewBeforeColumn: 'Before',
|
||||||
|
previewFileNameColumn: 'Filename',
|
||||||
|
previewEmptyTitle: 'No preview yet',
|
||||||
|
previewEmptyDescription: 'Click "Preview" to inspect the organization result here.',
|
||||||
|
noPreviewData: 'No preview data',
|
||||||
|
noFailedPreviewData: 'No failed items',
|
||||||
|
copySuccess: 'Path copied',
|
||||||
|
copyFailed: 'Copy failed',
|
||||||
addToQueue: 'Add to Organization Queue',
|
addToQueue: 'Add to Organization Queue',
|
||||||
reorganizeNow: 'Organize Now',
|
reorganizeNow: 'Organize Now',
|
||||||
auto: 'Auto',
|
auto: 'Auto',
|
||||||
@@ -2826,6 +2874,7 @@ export default {
|
|||||||
accountBinding: 'Account Binding',
|
accountBinding: 'Account Binding',
|
||||||
wechatUser: 'WeChat Work User',
|
wechatUser: 'WeChat Work User',
|
||||||
wechatClawBotUser: 'WeChat ClawBot User',
|
wechatClawBotUser: 'WeChat ClawBot User',
|
||||||
|
feishuUser: 'Feishu User',
|
||||||
telegramUser: 'Telegram User',
|
telegramUser: 'Telegram User',
|
||||||
slackUser: 'Slack User',
|
slackUser: 'Slack User',
|
||||||
discordUser: 'Discord User',
|
discordUser: 'Discord User',
|
||||||
@@ -3416,6 +3465,7 @@ export default {
|
|||||||
typeHint: 'Select the type of notification channel to use',
|
typeHint: 'Select the type of notification channel to use',
|
||||||
name: 'Notification Name',
|
name: 'Notification Name',
|
||||||
nameHint: 'Set a name for the notification channel',
|
nameHint: 'Set a name for the notification channel',
|
||||||
|
feishuConfig: 'Feishu Configuration',
|
||||||
telegramConfig: 'Telegram Configuration',
|
telegramConfig: 'Telegram Configuration',
|
||||||
emailConfig: 'Email Configuration',
|
emailConfig: 'Email Configuration',
|
||||||
botToken: 'Bot Token',
|
botToken: 'Bot Token',
|
||||||
|
|||||||
@@ -500,6 +500,28 @@ export default {
|
|||||||
logoutSuccess: '微信 ClawBot 已退出登录',
|
logoutSuccess: '微信 ClawBot 已退出登录',
|
||||||
logoutFailed: '微信 ClawBot 退出登录失败',
|
logoutFailed: '微信 ClawBot 退出登录失败',
|
||||||
},
|
},
|
||||||
|
feishu: {
|
||||||
|
name: '飞书',
|
||||||
|
appId: 'App ID',
|
||||||
|
appIdHint: '飞书开放平台应用的 App ID',
|
||||||
|
appIdRequired: 'App ID 不能为空',
|
||||||
|
appSecret: 'App Secret',
|
||||||
|
appSecretHint: '飞书开放平台应用的 App Secret',
|
||||||
|
appSecretRequired: 'App Secret 不能为空',
|
||||||
|
openId: '默认用户 Open ID',
|
||||||
|
openIdHint: '默认通知接收用户的 Open ID,留空则优先使用互动用户',
|
||||||
|
openIdPlaceholder: 'ou_xxx',
|
||||||
|
chatId: '默认群聊 Chat ID',
|
||||||
|
chatIdHint: '默认通知接收群聊的 Chat ID,和 Open ID 二选一即可',
|
||||||
|
chatIdPlaceholder: 'oc_xxx',
|
||||||
|
admins: '管理员白名单',
|
||||||
|
adminsHint: '允许执行命令和管理操作的 Open ID 列表,多个使用 , 分隔',
|
||||||
|
adminsPlaceholder: 'Open ID 列表,多个使用 , 分隔',
|
||||||
|
verificationToken: 'Verification Token',
|
||||||
|
verificationTokenHint: '飞书事件订阅的 Verification Token,启用事件校验时填写',
|
||||||
|
encryptKey: 'Encrypt Key',
|
||||||
|
encryptKeyHint: '飞书事件订阅的 Encrypt Key,启用消息加密时填写',
|
||||||
|
},
|
||||||
telegram: {
|
telegram: {
|
||||||
name: 'Telegram',
|
name: 'Telegram',
|
||||||
token: 'Bot Token',
|
token: 'Bot Token',
|
||||||
@@ -1739,6 +1761,7 @@ export default {
|
|||||||
channel: '通知',
|
channel: '通知',
|
||||||
wechat: '企业微信',
|
wechat: '企业微信',
|
||||||
wechatClawBot: '微信 ClawBot',
|
wechatClawBot: '微信 ClawBot',
|
||||||
|
feishu: '飞书',
|
||||||
resourceDownload: '资源下载',
|
resourceDownload: '资源下载',
|
||||||
mediaImport: '整理入库',
|
mediaImport: '整理入库',
|
||||||
subscription: '订阅',
|
subscription: '订阅',
|
||||||
@@ -2449,6 +2472,31 @@ export default {
|
|||||||
scrapeHint: '整理完成后自动刮削元数据',
|
scrapeHint: '整理完成后自动刮削元数据',
|
||||||
fromHistoryOption: '复用历史识别信息',
|
fromHistoryOption: '复用历史识别信息',
|
||||||
fromHistoryHint: '使用历史整理记录中已识别的媒体信息',
|
fromHistoryHint: '使用历史整理记录中已识别的媒体信息',
|
||||||
|
previewTitle: '整理结果预览',
|
||||||
|
previewSubtitle: '点击“预览”后可查看本次整理的预计入库结果,不会实际改动文件',
|
||||||
|
previewResult: '预览',
|
||||||
|
previewLoading: '正在生成预览结果...',
|
||||||
|
previewRequestFailed: '预览请求失败',
|
||||||
|
previewTotal: '总数 {count}',
|
||||||
|
previewSuccess: '成功 {count}',
|
||||||
|
previewFailed: '失败 {count}',
|
||||||
|
previewSourcePath: '原始路径',
|
||||||
|
previewTargetPath: '目的路径',
|
||||||
|
previewMediaInfo: '媒体信息',
|
||||||
|
previewMediaName: '名称',
|
||||||
|
previewMediaType: '类型',
|
||||||
|
previewSeasonInfo: '季信息',
|
||||||
|
previewSeasonLabel: '季',
|
||||||
|
previewEpisodeCount: '总集数',
|
||||||
|
previewAfterColumn: '整理后',
|
||||||
|
previewBeforeColumn: '整理前',
|
||||||
|
previewFileNameColumn: '文件名',
|
||||||
|
previewEmptyTitle: '尚未生成预览',
|
||||||
|
previewEmptyDescription: '点击“预览”按钮后,在这里查看整理结果预览。',
|
||||||
|
noPreviewData: '暂无预览结果',
|
||||||
|
noFailedPreviewData: '当前没有失败项',
|
||||||
|
copySuccess: '路径已复制',
|
||||||
|
copyFailed: '复制失败',
|
||||||
addToQueue: '加入整理队列',
|
addToQueue: '加入整理队列',
|
||||||
reorganizeNow: '立即整理',
|
reorganizeNow: '立即整理',
|
||||||
auto: '自动',
|
auto: '自动',
|
||||||
@@ -2778,6 +2826,7 @@ export default {
|
|||||||
accountBinding: '账号绑定',
|
accountBinding: '账号绑定',
|
||||||
wechatUser: '企业微信用户',
|
wechatUser: '企业微信用户',
|
||||||
wechatClawBotUser: '微信 ClawBot 用户',
|
wechatClawBotUser: '微信 ClawBot 用户',
|
||||||
|
feishuUser: '飞书用户',
|
||||||
telegramUser: 'Telegram用户',
|
telegramUser: 'Telegram用户',
|
||||||
slackUser: 'Slack用户',
|
slackUser: 'Slack用户',
|
||||||
discordUser: 'Discord用户',
|
discordUser: 'Discord用户',
|
||||||
@@ -3361,6 +3410,7 @@ export default {
|
|||||||
typeHint: '选择要使用的通知渠道类型',
|
typeHint: '选择要使用的通知渠道类型',
|
||||||
name: '通知名称',
|
name: '通知名称',
|
||||||
nameHint: '为通知渠道设置一个名称',
|
nameHint: '为通知渠道设置一个名称',
|
||||||
|
feishuConfig: '飞书配置',
|
||||||
telegramConfig: 'Telegram 配置',
|
telegramConfig: 'Telegram 配置',
|
||||||
emailConfig: '邮件配置',
|
emailConfig: '邮件配置',
|
||||||
botToken: '机器人令牌',
|
botToken: '机器人令牌',
|
||||||
|
|||||||
@@ -501,6 +501,28 @@ export default {
|
|||||||
logoutSuccess: '微信 ClawBot 已退出登入',
|
logoutSuccess: '微信 ClawBot 已退出登入',
|
||||||
logoutFailed: '微信 ClawBot 退出登入失敗',
|
logoutFailed: '微信 ClawBot 退出登入失敗',
|
||||||
},
|
},
|
||||||
|
feishu: {
|
||||||
|
name: '飛書',
|
||||||
|
appId: 'App ID',
|
||||||
|
appIdHint: '飛書開放平台應用的 App ID',
|
||||||
|
appIdRequired: 'App ID 不能為空',
|
||||||
|
appSecret: 'App Secret',
|
||||||
|
appSecretHint: '飛書開放平台應用的 App Secret',
|
||||||
|
appSecretRequired: 'App Secret 不能為空',
|
||||||
|
openId: '預設用戶 Open ID',
|
||||||
|
openIdHint: '預設通知接收用戶的 Open ID,留空則優先使用互動用戶',
|
||||||
|
openIdPlaceholder: 'ou_xxx',
|
||||||
|
chatId: '預設群聊 Chat ID',
|
||||||
|
chatIdHint: '預設通知接收群聊的 Chat ID,和 Open ID 二選一即可',
|
||||||
|
chatIdPlaceholder: 'oc_xxx',
|
||||||
|
admins: '管理員白名單',
|
||||||
|
adminsHint: '允許執行命令與管理操作的 Open ID 列表,多個使用 , 分隔',
|
||||||
|
adminsPlaceholder: 'Open ID 列表,多個使用 , 分隔',
|
||||||
|
verificationToken: 'Verification Token',
|
||||||
|
verificationTokenHint: '飛書事件訂閱的 Verification Token,啟用事件校驗時填寫',
|
||||||
|
encryptKey: 'Encrypt Key',
|
||||||
|
encryptKeyHint: '飛書事件訂閱的 Encrypt Key,啟用消息加密時填寫',
|
||||||
|
},
|
||||||
telegram: {
|
telegram: {
|
||||||
name: 'Telegram',
|
name: 'Telegram',
|
||||||
token: 'Bot Token',
|
token: 'Bot Token',
|
||||||
@@ -1741,6 +1763,7 @@ export default {
|
|||||||
channel: '通知',
|
channel: '通知',
|
||||||
wechat: '企業微信',
|
wechat: '企業微信',
|
||||||
wechatClawBot: '微信 ClawBot',
|
wechatClawBot: '微信 ClawBot',
|
||||||
|
feishu: '飛書',
|
||||||
resourceDownload: '資源下載',
|
resourceDownload: '資源下載',
|
||||||
mediaImport: '整理入庫',
|
mediaImport: '整理入庫',
|
||||||
subscription: '訂閱',
|
subscription: '訂閱',
|
||||||
@@ -2451,6 +2474,31 @@ export default {
|
|||||||
scrapeHint: '整理完成後自動刮削元數據',
|
scrapeHint: '整理完成後自動刮削元數據',
|
||||||
fromHistoryOption: '復用歷史識別資訊',
|
fromHistoryOption: '復用歷史識別資訊',
|
||||||
fromHistoryHint: '使用歷史整理記錄中已識別的媒體資訊',
|
fromHistoryHint: '使用歷史整理記錄中已識別的媒體資訊',
|
||||||
|
previewTitle: '整理結果預覽',
|
||||||
|
previewSubtitle: '點擊「預覽」後可查看本次整理的預計入庫結果,不會實際改動文件',
|
||||||
|
previewResult: '預覽',
|
||||||
|
previewLoading: '正在生成預覽結果...',
|
||||||
|
previewRequestFailed: '預覽請求失敗',
|
||||||
|
previewTotal: '總數 {count}',
|
||||||
|
previewSuccess: '成功 {count}',
|
||||||
|
previewFailed: '失敗 {count}',
|
||||||
|
previewSourcePath: '原始路徑',
|
||||||
|
previewTargetPath: '目的路徑',
|
||||||
|
previewMediaInfo: '媒體資訊',
|
||||||
|
previewMediaName: '名稱',
|
||||||
|
previewMediaType: '類型',
|
||||||
|
previewSeasonInfo: '季資訊',
|
||||||
|
previewSeasonLabel: '季',
|
||||||
|
previewEpisodeCount: '總集數',
|
||||||
|
previewAfterColumn: '整理後',
|
||||||
|
previewBeforeColumn: '整理前',
|
||||||
|
previewFileNameColumn: '文件名',
|
||||||
|
previewEmptyTitle: '尚未生成預覽',
|
||||||
|
previewEmptyDescription: '點擊「預覽」按鈕後,在這裡查看整理結果預覽。',
|
||||||
|
noPreviewData: '暫無預覽結果',
|
||||||
|
noFailedPreviewData: '目前沒有失敗項',
|
||||||
|
copySuccess: '路徑已複製',
|
||||||
|
copyFailed: '複製失敗',
|
||||||
addToQueue: '加入整理隊列',
|
addToQueue: '加入整理隊列',
|
||||||
reorganizeNow: '立即整理',
|
reorganizeNow: '立即整理',
|
||||||
auto: '自動',
|
auto: '自動',
|
||||||
@@ -2780,6 +2828,7 @@ export default {
|
|||||||
accountBinding: '賬號綁定',
|
accountBinding: '賬號綁定',
|
||||||
wechatUser: '企業微信用戶',
|
wechatUser: '企業微信用戶',
|
||||||
wechatClawBotUser: '微信 ClawBot 用戶',
|
wechatClawBotUser: '微信 ClawBot 用戶',
|
||||||
|
feishuUser: '飛書用戶',
|
||||||
telegramUser: 'Telegram用戶',
|
telegramUser: 'Telegram用戶',
|
||||||
slackUser: 'Slack用戶',
|
slackUser: 'Slack用戶',
|
||||||
discordUser: 'Discord用戶',
|
discordUser: 'Discord用戶',
|
||||||
@@ -3363,6 +3412,7 @@ export default {
|
|||||||
typeHint: '選擇要使用的通知管道類型',
|
typeHint: '選擇要使用的通知管道類型',
|
||||||
name: '通知名稱',
|
name: '通知名稱',
|
||||||
nameHint: '為通知管道設定一個名稱',
|
nameHint: '為通知管道設定一個名稱',
|
||||||
|
feishuConfig: '飛書設定',
|
||||||
telegramConfig: 'Telegram 設定',
|
telegramConfig: 'Telegram 設定',
|
||||||
emailConfig: '郵件設定',
|
emailConfig: '郵件設定',
|
||||||
botToken: '機器人權杖',
|
botToken: '機器人權杖',
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import plexLogo from '@/assets/images/logos/plex.png'
|
|||||||
import trimemediaLogo from '@/assets/images/logos/trimemedia.png'
|
import trimemediaLogo from '@/assets/images/logos/trimemedia.png'
|
||||||
import ugreenLogo from '@/assets/images/logos/ugreen.png'
|
import ugreenLogo from '@/assets/images/logos/ugreen.png'
|
||||||
import wechatLogo from '@/assets/images/logos/wechat.png'
|
import wechatLogo from '@/assets/images/logos/wechat.png'
|
||||||
|
import feishuLogo from '@/assets/images/logos/feishu.png'
|
||||||
import clawbotLogo from '@/assets/images/logos/clawbot.png'
|
import clawbotLogo from '@/assets/images/logos/clawbot.png'
|
||||||
import telegramLogo from '@/assets/images/logos/telegram.webp'
|
import telegramLogo from '@/assets/images/logos/telegram.webp'
|
||||||
import slackLogo from '@/assets/images/logos/slack.webp'
|
import slackLogo from '@/assets/images/logos/slack.webp'
|
||||||
@@ -47,6 +48,7 @@ const logoMap: Record<string, string> = {
|
|||||||
trimemedia: trimemediaLogo,
|
trimemedia: trimemediaLogo,
|
||||||
ugreen: ugreenLogo,
|
ugreen: ugreenLogo,
|
||||||
wechat: wechatLogo,
|
wechat: wechatLogo,
|
||||||
|
feishu: feishuLogo,
|
||||||
wechatclawbot: clawbotLogo,
|
wechatclawbot: clawbotLogo,
|
||||||
telegram: telegramLogo,
|
telegram: telegramLogo,
|
||||||
slack: slackLogo,
|
slack: slackLogo,
|
||||||
|
|||||||
@@ -357,9 +357,12 @@ onMounted(() => {
|
|||||||
<VListItem @click="addNotification('wechatclawbot')">
|
<VListItem @click="addNotification('wechatclawbot')">
|
||||||
<VListItemTitle>{{ t('setting.notification.wechatClawBot') }}</VListItemTitle>
|
<VListItemTitle>{{ t('setting.notification.wechatClawBot') }}</VListItemTitle>
|
||||||
</VListItem>
|
</VListItem>
|
||||||
<VListItem @click="addNotification('telegram')">
|
<VListItem @click="addNotification('feishu')">
|
||||||
<VListItemTitle>{{ t('setting.notification.telegram') }}</VListItemTitle>
|
<VListItemTitle>{{ t('setting.notification.feishu') }}</VListItemTitle>
|
||||||
</VListItem>
|
</VListItem>
|
||||||
|
<VListItem @click="addNotification('telegram')">
|
||||||
|
<VListItemTitle>{{ t('setting.notification.telegram') }}</VListItemTitle>
|
||||||
|
</VListItem>
|
||||||
<VListItem @click="addNotification('slack')">
|
<VListItem @click="addNotification('slack')">
|
||||||
<VListItemTitle>{{ t('setting.notification.slack') }}</VListItemTitle>
|
<VListItemTitle>{{ t('setting.notification.slack') }}</VListItemTitle>
|
||||||
</VListItem>
|
</VListItem>
|
||||||
|
|||||||
@@ -66,6 +66,19 @@ const notificationTypes = [
|
|||||||
</VCardText>
|
</VCardText>
|
||||||
</VCard>
|
</VCard>
|
||||||
</VCol>
|
</VCol>
|
||||||
|
<VCol cols="12" md="3">
|
||||||
|
<VCard
|
||||||
|
:color="wizardData.notification.type === 'feishu' ? 'primary' : 'default'"
|
||||||
|
:variant="wizardData.notification.type === 'feishu' ? 'tonal' : 'outlined'"
|
||||||
|
class="cursor-pointer"
|
||||||
|
@click="selectNotification('feishu')"
|
||||||
|
>
|
||||||
|
<VCardText class="text-center">
|
||||||
|
<VImg :src="getLogoUrl('feishu')" height="48" width="48" class="mx-auto mb-2" />
|
||||||
|
<div class="text-h6">飞书</div>
|
||||||
|
</VCardText>
|
||||||
|
</VCard>
|
||||||
|
</VCol>
|
||||||
<VCol cols="12" md="3">
|
<VCol cols="12" md="3">
|
||||||
<VCard
|
<VCard
|
||||||
:color="wizardData.notification.type === 'telegram' ? 'primary' : 'default'"
|
:color="wizardData.notification.type === 'telegram' ? 'primary' : 'default'"
|
||||||
@@ -308,6 +321,93 @@ const notificationTypes = [
|
|||||||
/>
|
/>
|
||||||
</VCol>
|
</VCol>
|
||||||
</VRow>
|
</VRow>
|
||||||
|
<VRow v-else-if="wizardData.notification.type === 'feishu'">
|
||||||
|
<VCol cols="12" md="6">
|
||||||
|
<VTextField
|
||||||
|
v-model="wizardData.notification.name"
|
||||||
|
:label="t('notification.name')"
|
||||||
|
:placeholder="t('notification.name')"
|
||||||
|
:hint="t('notification.nameHint')"
|
||||||
|
:error="validationErrors.notification.name"
|
||||||
|
:error-messages="validationErrors.notification.name ? [t('notification.nameRequired')] : []"
|
||||||
|
persistent-hint
|
||||||
|
prepend-inner-icon="mdi-label"
|
||||||
|
required
|
||||||
|
/>
|
||||||
|
</VCol>
|
||||||
|
<VCol cols="12" md="6">
|
||||||
|
<VTextField
|
||||||
|
v-model="wizardData.notification.config.FEISHU_APP_ID"
|
||||||
|
:label="t('notification.feishu.appId')"
|
||||||
|
:hint="t('notification.feishu.appIdHint')"
|
||||||
|
:error="validationErrors.notification.FEISHU_APP_ID"
|
||||||
|
:error-messages="validationErrors.notification.FEISHU_APP_ID ? [t('notification.feishu.appIdRequired')] : []"
|
||||||
|
persistent-hint
|
||||||
|
prepend-inner-icon="mdi-application"
|
||||||
|
required
|
||||||
|
/>
|
||||||
|
</VCol>
|
||||||
|
<VCol cols="12" md="6">
|
||||||
|
<VTextField
|
||||||
|
v-model="wizardData.notification.config.FEISHU_APP_SECRET"
|
||||||
|
:label="t('notification.feishu.appSecret')"
|
||||||
|
:hint="t('notification.feishu.appSecretHint')"
|
||||||
|
:error="validationErrors.notification.FEISHU_APP_SECRET"
|
||||||
|
:error-messages="validationErrors.notification.FEISHU_APP_SECRET ? [t('notification.feishu.appSecretRequired')] : []"
|
||||||
|
persistent-hint
|
||||||
|
prepend-inner-icon="mdi-key"
|
||||||
|
required
|
||||||
|
/>
|
||||||
|
</VCol>
|
||||||
|
<VCol cols="12" md="6">
|
||||||
|
<VTextField
|
||||||
|
v-model="wizardData.notification.config.FEISHU_OPEN_ID"
|
||||||
|
:label="t('notification.feishu.openId')"
|
||||||
|
:placeholder="t('notification.feishu.openIdPlaceholder')"
|
||||||
|
:hint="t('notification.feishu.openIdHint')"
|
||||||
|
persistent-hint
|
||||||
|
prepend-inner-icon="mdi-account"
|
||||||
|
/>
|
||||||
|
</VCol>
|
||||||
|
<VCol cols="12" md="6">
|
||||||
|
<VTextField
|
||||||
|
v-model="wizardData.notification.config.FEISHU_CHAT_ID"
|
||||||
|
:label="t('notification.feishu.chatId')"
|
||||||
|
:placeholder="t('notification.feishu.chatIdPlaceholder')"
|
||||||
|
:hint="t('notification.feishu.chatIdHint')"
|
||||||
|
persistent-hint
|
||||||
|
prepend-inner-icon="mdi-chat-processing"
|
||||||
|
/>
|
||||||
|
</VCol>
|
||||||
|
<VCol cols="12" md="6">
|
||||||
|
<VTextField
|
||||||
|
v-model="wizardData.notification.config.FEISHU_ADMINS"
|
||||||
|
:label="t('notification.feishu.admins')"
|
||||||
|
:placeholder="t('notification.feishu.adminsPlaceholder')"
|
||||||
|
:hint="t('notification.feishu.adminsHint')"
|
||||||
|
persistent-hint
|
||||||
|
prepend-inner-icon="mdi-account-supervisor"
|
||||||
|
/>
|
||||||
|
</VCol>
|
||||||
|
<VCol cols="12" md="6">
|
||||||
|
<VTextField
|
||||||
|
v-model="wizardData.notification.config.FEISHU_VERIFICATION_TOKEN"
|
||||||
|
:label="t('notification.feishu.verificationToken')"
|
||||||
|
:hint="t('notification.feishu.verificationTokenHint')"
|
||||||
|
persistent-hint
|
||||||
|
prepend-inner-icon="mdi-shield-key"
|
||||||
|
/>
|
||||||
|
</VCol>
|
||||||
|
<VCol cols="12" md="6">
|
||||||
|
<VTextField
|
||||||
|
v-model="wizardData.notification.config.FEISHU_ENCRYPT_KEY"
|
||||||
|
:label="t('notification.feishu.encryptKey')"
|
||||||
|
:hint="t('notification.feishu.encryptKeyHint')"
|
||||||
|
persistent-hint
|
||||||
|
prepend-inner-icon="mdi-lock"
|
||||||
|
/>
|
||||||
|
</VCol>
|
||||||
|
</VRow>
|
||||||
<VRow v-else-if="wizardData.notification.type === 'telegram'">
|
<VRow v-else-if="wizardData.notification.type === 'telegram'">
|
||||||
<VCol cols="12" md="6">
|
<VCol cols="12" md="6">
|
||||||
<VTextField
|
<VTextField
|
||||||
|
|||||||
@@ -445,6 +445,15 @@ watch(
|
|||||||
prepend-inner-icon="mdi-robot-happy-outline"
|
prepend-inner-icon="mdi-robot-happy-outline"
|
||||||
/>
|
/>
|
||||||
</VCol>
|
</VCol>
|
||||||
|
<VCol cols="12" md="6">
|
||||||
|
<VTextField
|
||||||
|
v-model="accountInfo.settings.feishu_openid"
|
||||||
|
density="comfortable"
|
||||||
|
clearable
|
||||||
|
:label="t('profile.feishuUser')"
|
||||||
|
prepend-inner-icon="mdi-message-badge-outline"
|
||||||
|
/>
|
||||||
|
</VCol>
|
||||||
<VCol cols="12" md="6">
|
<VCol cols="12" md="6">
|
||||||
<VTextField
|
<VTextField
|
||||||
v-model="accountInfo.settings.telegram_userid"
|
v-model="accountInfo.settings.telegram_userid"
|
||||||
|
|||||||
Reference in New Issue
Block a user