mirror of
https://github.com/jxxghp/MoviePilot-Frontend.git
synced 2026-09-08 09:16:58 +08:00
更新国际化支持:为工作流组件及相关对话框添加多语言文本,提升用户体验
This commit is contained in:
@@ -2,6 +2,9 @@
|
|||||||
import api from '@/api'
|
import api from '@/api'
|
||||||
import { DownloaderConf } from '@/api/types'
|
import { DownloaderConf } from '@/api/types'
|
||||||
import { Handle, Position } from '@vue-flow/core'
|
import { Handle, Position } from '@vue-flow/core'
|
||||||
|
import { useI18n } from 'vue-i18n'
|
||||||
|
|
||||||
|
const { t } = useI18n()
|
||||||
|
|
||||||
defineProps({
|
defineProps({
|
||||||
id: {
|
id: {
|
||||||
@@ -22,7 +25,7 @@ async function loadDownloaderSetting() {
|
|||||||
try {
|
try {
|
||||||
const downloaders: DownloaderConf[] = await api.get('download/clients')
|
const downloaders: DownloaderConf[] = await api.get('download/clients')
|
||||||
downloaderOptions.value = [
|
downloaderOptions.value = [
|
||||||
{ title: '默认', value: '' },
|
{ title: t('common.default'), value: '' },
|
||||||
...downloaders.map((item: { name: any }) => ({
|
...downloaders.map((item: { name: any }) => ({
|
||||||
title: item.name,
|
title: item.name,
|
||||||
value: item.name,
|
value: item.name,
|
||||||
@@ -47,23 +50,41 @@ onMounted(() => {
|
|||||||
<VIcon icon="mdi-download" size="x-large"></VIcon>
|
<VIcon icon="mdi-download" size="x-large"></VIcon>
|
||||||
</VAvatar>
|
</VAvatar>
|
||||||
</template>
|
</template>
|
||||||
<VCardTitle>添加下载</VCardTitle>
|
<VCardTitle>{{ t('workflow.addDownload.title') }}</VCardTitle>
|
||||||
<VCardSubtitle>根据资源列表添加下载任务</VCardSubtitle>
|
<VCardSubtitle>{{ t('workflow.addDownload.subtitle') }}</VCardSubtitle>
|
||||||
</VCardItem>
|
</VCardItem>
|
||||||
<VDivider />
|
<VDivider />
|
||||||
<VCardText>
|
<VCardText>
|
||||||
<VRow>
|
<VRow>
|
||||||
<VCol cols="12">
|
<VCol cols="12">
|
||||||
<VSelect v-model="data.downloader" :items="downloaderOptions" label="下载器" outlined dense />
|
<VSelect
|
||||||
|
v-model="data.downloader"
|
||||||
|
:items="downloaderOptions"
|
||||||
|
:label="t('workflow.addDownload.downloader')"
|
||||||
|
outlined
|
||||||
|
dense
|
||||||
|
/>
|
||||||
</VCol>
|
</VCol>
|
||||||
<VCol cols="12">
|
<VCol cols="12">
|
||||||
<VTextField v-model="data.labels" label="标签" placeholder="多个使用,分隔" outlined dense />
|
<VTextField
|
||||||
|
v-model="data.labels"
|
||||||
|
:label="t('workflow.addDownload.category')"
|
||||||
|
placeholder="多个使用,分隔"
|
||||||
|
outlined
|
||||||
|
dense
|
||||||
|
/>
|
||||||
</VCol>
|
</VCol>
|
||||||
<VCol cols="12">
|
<VCol cols="12">
|
||||||
<VPathField v-model="data.save_path" storage="local" label="保存路径" clearable placeholder="留空自动" />
|
<VPathField
|
||||||
|
v-model="data.save_path"
|
||||||
|
storage="local"
|
||||||
|
:label="t('workflow.addDownload.savePath')"
|
||||||
|
clearable
|
||||||
|
placeholder="留空自动"
|
||||||
|
/>
|
||||||
</VCol>
|
</VCol>
|
||||||
<VCol cols="12">
|
<VCol cols="12">
|
||||||
<VSwitch v-model="data.only_lack" label="仅下载缺失的资源" />
|
<VSwitch v-model="data.only_lack" :label="t('workflow.addDownload.onlyLack')" />
|
||||||
</VCol>
|
</VCol>
|
||||||
</VRow>
|
</VRow>
|
||||||
</VCardText>
|
</VCardText>
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { Handle, Position } from '@vue-flow/core'
|
import { Handle, Position } from '@vue-flow/core'
|
||||||
|
import { useI18n } from 'vue-i18n'
|
||||||
|
|
||||||
|
const { t } = useI18n()
|
||||||
|
|
||||||
defineProps({
|
defineProps({
|
||||||
id: {
|
id: {
|
||||||
@@ -22,8 +25,8 @@ defineProps({
|
|||||||
<VIcon icon="mdi-star-plus" size="x-large"></VIcon>
|
<VIcon icon="mdi-star-plus" size="x-large"></VIcon>
|
||||||
</VAvatar>
|
</VAvatar>
|
||||||
</template>
|
</template>
|
||||||
<VCardTitle>添加订阅</VCardTitle>
|
<VCardTitle>{{ t('workflow.addSubscribe.title') }}</VCardTitle>
|
||||||
<VCardSubtitle>根据媒体列表添加订阅</VCardSubtitle>
|
<VCardSubtitle>{{ t('workflow.addSubscribe.subtitle') }}</VCardSubtitle>
|
||||||
</VCardItem>
|
</VCardItem>
|
||||||
<Handle id="edge_out" type="source" :position="Position.Right" />
|
<Handle id="edge_out" type="source" :position="Position.Right" />
|
||||||
</VCard>
|
</VCard>
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { Handle, Position } from '@vue-flow/core'
|
import { Handle, Position } from '@vue-flow/core'
|
||||||
|
import { useI18n } from 'vue-i18n'
|
||||||
|
|
||||||
|
const { t } = useI18n()
|
||||||
|
|
||||||
defineProps({
|
defineProps({
|
||||||
id: {
|
id: {
|
||||||
@@ -22,21 +25,21 @@ defineProps({
|
|||||||
<VIcon icon="mdi-progress-download" size="x-large"></VIcon>
|
<VIcon icon="mdi-progress-download" size="x-large"></VIcon>
|
||||||
</VAvatar>
|
</VAvatar>
|
||||||
</template>
|
</template>
|
||||||
<VCardTitle>获取下载任务</VCardTitle>
|
<VCardTitle>{{ t('workflow.fetchDownloads.title') }}</VCardTitle>
|
||||||
<VCardSubtitle>获取下载队列中的任务状态</VCardSubtitle>
|
<VCardSubtitle>{{ t('workflow.fetchDownloads.subtitle') }}</VCardSubtitle>
|
||||||
</VCardItem>
|
</VCardItem>
|
||||||
<VDivider />
|
<VDivider />
|
||||||
<VCardText>
|
<VCardText>
|
||||||
<VRow>
|
<VRow>
|
||||||
<VCol cols="12">
|
<VCol cols="12">
|
||||||
<VSwitch v-model="data.loop" label="循环执行" />
|
<VSwitch v-model="data.loop" :label="t('workflow.fetchDownloads.loop')" />
|
||||||
</VCol>
|
</VCol>
|
||||||
<VCol cols="12">
|
<VCol cols="12">
|
||||||
<VTextField
|
<VTextField
|
||||||
v-model="data.loop_interval"
|
v-model="data.loop_interval"
|
||||||
:disabled="!data.loop"
|
:disabled="!data.loop"
|
||||||
type="number"
|
type="number"
|
||||||
label="循环间隔 (秒)"
|
:label="t('workflow.fetchDownloads.loopInterval')"
|
||||||
outlined
|
outlined
|
||||||
dense
|
dense
|
||||||
clearable
|
clearable
|
||||||
|
|||||||
@@ -2,6 +2,9 @@
|
|||||||
import { Handle, Position } from '@vue-flow/core'
|
import { Handle, Position } from '@vue-flow/core'
|
||||||
import api from '@/api'
|
import api from '@/api'
|
||||||
import { RecommendSource } from '@/api/types'
|
import { RecommendSource } from '@/api/types'
|
||||||
|
import { useI18n } from 'vue-i18n'
|
||||||
|
|
||||||
|
const { t } = useI18n()
|
||||||
|
|
||||||
defineProps({
|
defineProps({
|
||||||
id: {
|
id: {
|
||||||
@@ -18,55 +21,55 @@ defineProps({
|
|||||||
const innerList = [
|
const innerList = [
|
||||||
{
|
{
|
||||||
'api_path': 'recommend/tmdb_trending',
|
'api_path': 'recommend/tmdb_trending',
|
||||||
'name': '流行趋势',
|
'name': t('workflow.fetchMedias.tmdbTrending'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'api_path': 'recommend/douban_showing',
|
'api_path': 'recommend/douban_showing',
|
||||||
'name': '正在热映',
|
'name': t('workflow.fetchMedias.doubanShowing'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'api_path': 'recommend/bangumi_calendar',
|
'api_path': 'recommend/bangumi_calendar',
|
||||||
'name': 'Bangumi每日放送',
|
'name': t('workflow.fetchMedias.bangumiCalendar'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'api_path': 'recommend/tmdb_movies',
|
'api_path': 'recommend/tmdb_movies',
|
||||||
'name': 'TMDB热门电影',
|
'name': t('workflow.fetchMedias.tmdbMovies'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'api_path': 'recommend/tmdb_tvs?with_original_language=zh|en|ja|ko',
|
'api_path': 'recommend/tmdb_tvs?with_original_language=zh|en|ja|ko',
|
||||||
'name': 'TMDB热门电视剧',
|
'name': t('workflow.fetchMedias.tmdbTvs'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'api_path': 'recommend/douban_movie_hot',
|
'api_path': 'recommend/douban_movie_hot',
|
||||||
'name': '豆瓣热门电影',
|
'name': t('workflow.fetchMedias.doubanMovieHot'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'api_path': 'recommend/douban_tv_hot',
|
'api_path': 'recommend/douban_tv_hot',
|
||||||
'name': '豆瓣热门电视剧',
|
'name': t('workflow.fetchMedias.doubanTvHot'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'api_path': 'recommend/douban_tv_animation',
|
'api_path': 'recommend/douban_tv_animation',
|
||||||
'name': '豆瓣热门动漫',
|
'name': t('workflow.fetchMedias.doubanTvAnimation'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'api_path': 'recommend/douban_movies',
|
'api_path': 'recommend/douban_movies',
|
||||||
'name': '豆瓣最新电影',
|
'name': t('workflow.fetchMedias.doubanMovies'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'api_path': 'recommend/douban_tvs',
|
'api_path': 'recommend/douban_tvs',
|
||||||
'name': '豆瓣最新电视剧',
|
'name': t('workflow.fetchMedias.doubanTvs'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'api_path': 'recommend/douban_movie_top250',
|
'api_path': 'recommend/douban_movie_top250',
|
||||||
'name': '豆瓣电影TOP250',
|
'name': t('workflow.fetchMedias.doubanMovieTop250'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'api_path': 'recommend/douban_tv_weekly_chinese',
|
'api_path': 'recommend/douban_tv_weekly_chinese',
|
||||||
'name': '豆瓣国产剧集榜',
|
'name': t('workflow.fetchMedias.doubanTvWeeklyChinese'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'api_path': 'recommend/douban_tv_weekly_global',
|
'api_path': 'recommend/douban_tv_weekly_global',
|
||||||
'name': '豆瓣全球剧集榜',
|
'name': t('workflow.fetchMedias.doubanTvWeeklyGlobal'),
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -92,8 +95,8 @@ async function loadExtraRecommendSources() {
|
|||||||
|
|
||||||
// 来源类型下拉框
|
// 来源类型下拉框
|
||||||
const sourceTypeOptions = [
|
const sourceTypeOptions = [
|
||||||
{ value: 'ranking', title: '推荐榜单' },
|
{ value: 'ranking', title: t('workflow.fetchMedias.ranking') },
|
||||||
{ value: 'api', title: 'API' },
|
{ value: 'api', title: t('workflow.fetchMedias.api') },
|
||||||
]
|
]
|
||||||
|
|
||||||
// 计算下拉框
|
// 计算下拉框
|
||||||
@@ -113,14 +116,20 @@ onMounted(() => {
|
|||||||
<VIcon icon="mdi-movie-search" size="x-large"></VIcon>
|
<VIcon icon="mdi-movie-search" size="x-large"></VIcon>
|
||||||
</VAvatar>
|
</VAvatar>
|
||||||
</template>
|
</template>
|
||||||
<VCardTitle>获取媒体数据</VCardTitle>
|
<VCardTitle>{{ t('workflow.fetchMedias.title') }}</VCardTitle>
|
||||||
<VCardSubtitle>获取榜单等媒体数据列表</VCardSubtitle>
|
<VCardSubtitle>{{ t('workflow.fetchMedias.subtitle') }}</VCardSubtitle>
|
||||||
</VCardItem>
|
</VCardItem>
|
||||||
<VDivider />
|
<VDivider />
|
||||||
<VCardText>
|
<VCardText>
|
||||||
<VRow>
|
<VRow>
|
||||||
<VCol cols="12">
|
<VCol cols="12">
|
||||||
<VSelect v-model="data.source_type" :items="sourceTypeOptions" label="来源" outlined dense />
|
<VSelect
|
||||||
|
v-model="data.source_type"
|
||||||
|
:items="sourceTypeOptions"
|
||||||
|
:label="t('workflow.fetchMedias.source')"
|
||||||
|
outlined
|
||||||
|
dense
|
||||||
|
/>
|
||||||
</VCol>
|
</VCol>
|
||||||
</VRow>
|
</VRow>
|
||||||
<VRow v-if="data.source_type === 'ranking'">
|
<VRow v-if="data.source_type === 'ranking'">
|
||||||
@@ -128,7 +137,7 @@ onMounted(() => {
|
|||||||
<VSelect
|
<VSelect
|
||||||
v-model="data.sources"
|
v-model="data.sources"
|
||||||
:items="sourceOptions"
|
:items="sourceOptions"
|
||||||
label="选择榜单"
|
:label="t('workflow.fetchMedias.selectRanking')"
|
||||||
chips
|
chips
|
||||||
multiple
|
multiple
|
||||||
outlined
|
outlined
|
||||||
@@ -141,7 +150,7 @@ onMounted(() => {
|
|||||||
<VCol cols="12">
|
<VCol cols="12">
|
||||||
<VTextField
|
<VTextField
|
||||||
v-model="data.api_path"
|
v-model="data.api_path"
|
||||||
label="API地址"
|
:label="t('workflow.fetchMedias.apiPath')"
|
||||||
placeholder="/api/v1/plugin/xxx/xxxx"
|
placeholder="/api/v1/plugin/xxx/xxxx"
|
||||||
outlined
|
outlined
|
||||||
dense
|
dense
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { Handle, Position } from '@vue-flow/core'
|
import { Handle, Position } from '@vue-flow/core'
|
||||||
|
import { useI18n } from 'vue-i18n'
|
||||||
|
|
||||||
|
const { t } = useI18n()
|
||||||
|
|
||||||
defineProps({
|
defineProps({
|
||||||
id: {
|
id: {
|
||||||
@@ -22,26 +25,33 @@ defineProps({
|
|||||||
<VIcon icon="mdi-rss" size="x-large"></VIcon>
|
<VIcon icon="mdi-rss" size="x-large"></VIcon>
|
||||||
</VAvatar>
|
</VAvatar>
|
||||||
</template>
|
</template>
|
||||||
<VCardTitle>获取RSS资源</VCardTitle>
|
<VCardTitle>{{ t('workflow.fetchRss.title') }}</VCardTitle>
|
||||||
<VCardSubtitle>订阅RSS地址获取资源</VCardSubtitle>
|
<VCardSubtitle>{{ t('workflow.fetchRss.subtitle') }}</VCardSubtitle>
|
||||||
</VCardItem>
|
</VCardItem>
|
||||||
<VDivider />
|
<VDivider />
|
||||||
<VCardText>
|
<VCardText>
|
||||||
<VRow>
|
<VRow>
|
||||||
<VCol cols="12">
|
<VCol cols="12">
|
||||||
<VTextField v-model="data.url" label="RSS地址" outlined dense clearable />
|
<VTextField v-model="data.url" :label="t('workflow.fetchRss.url')" outlined dense clearable />
|
||||||
</VCol>
|
</VCol>
|
||||||
<VCol cols="12">
|
<VCol cols="12">
|
||||||
<VTextField v-model="data.ua" label="User-Agent" outlined dense clearable />
|
<VTextField v-model="data.ua" :label="t('workflow.fetchRss.userAgent')" outlined dense clearable />
|
||||||
</VCol>
|
</VCol>
|
||||||
<VCol cols="12">
|
<VCol cols="12">
|
||||||
<VTextField v-model="data.timeout" type="number" label="超时时间" outlined dense clearable />
|
<VTextField
|
||||||
|
v-model="data.timeout"
|
||||||
|
type="number"
|
||||||
|
:label="t('workflow.fetchRss.timeout')"
|
||||||
|
outlined
|
||||||
|
dense
|
||||||
|
clearable
|
||||||
|
/>
|
||||||
</VCol>
|
</VCol>
|
||||||
<VCol cols="6">
|
<VCol cols="6">
|
||||||
<VSwitch v-model="data.match_media" label="匹配媒体信息" />
|
<VSwitch v-model="data.match_media" :label="t('workflow.fetchRss.matchMedia')" />
|
||||||
</VCol>
|
</VCol>
|
||||||
<VCol cols="6">
|
<VCol cols="6">
|
||||||
<VSwitch v-model="data.proxy" label="使用代理" />
|
<VSwitch v-model="data.proxy" :label="t('workflow.fetchRss.useProxy')" />
|
||||||
</VCol>
|
</VCol>
|
||||||
</VRow>
|
</VRow>
|
||||||
</VCardText>
|
</VCardText>
|
||||||
|
|||||||
@@ -2,6 +2,9 @@
|
|||||||
import api from '@/api'
|
import api from '@/api'
|
||||||
import { Site } from '@/api/types'
|
import { Site } from '@/api/types'
|
||||||
import { Handle, Position } from '@vue-flow/core'
|
import { Handle, Position } from '@vue-flow/core'
|
||||||
|
import { useI18n } from 'vue-i18n'
|
||||||
|
|
||||||
|
const { t } = useI18n()
|
||||||
|
|
||||||
defineProps({
|
defineProps({
|
||||||
id: {
|
id: {
|
||||||
@@ -17,11 +20,11 @@ defineProps({
|
|||||||
// 电影/电视剧下拉框
|
// 电影/电视剧下拉框
|
||||||
const typeOptions = ref([
|
const typeOptions = ref([
|
||||||
{
|
{
|
||||||
title: '电影',
|
title: t('mediaType.movie'),
|
||||||
value: '电影',
|
value: '电影',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '电视剧',
|
title: t('mediaType.tv'),
|
||||||
value: '电视剧',
|
value: '电视剧',
|
||||||
},
|
},
|
||||||
])
|
])
|
||||||
@@ -29,11 +32,11 @@ const typeOptions = ref([
|
|||||||
// 搜索方式下拉框
|
// 搜索方式下拉框
|
||||||
const searchOptions = ref([
|
const searchOptions = ref([
|
||||||
{
|
{
|
||||||
title: '名称',
|
title: t('workflow.fetchTorrents.searchOptions.name'),
|
||||||
value: 'keyword',
|
value: 'keyword',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '媒体列表',
|
title: t('workflow.fetchTorrents.searchOptions.mediaList'),
|
||||||
value: 'media',
|
value: 'media',
|
||||||
},
|
},
|
||||||
])
|
])
|
||||||
@@ -77,38 +80,64 @@ onMounted(() => {
|
|||||||
<VIcon icon="mdi-search-web" size="x-large"></VIcon>
|
<VIcon icon="mdi-search-web" size="x-large"></VIcon>
|
||||||
</VAvatar>
|
</VAvatar>
|
||||||
</template>
|
</template>
|
||||||
<VCardTitle>搜索站点资源</VCardTitle>
|
<VCardTitle>{{ t('workflow.fetchTorrents.title') }}</VCardTitle>
|
||||||
<VCardSubtitle>搜索站点种子资源列表</VCardSubtitle>
|
<VCardSubtitle>{{ t('workflow.fetchTorrents.subtitle') }}</VCardSubtitle>
|
||||||
</VCardItem>
|
</VCardItem>
|
||||||
<VDivider />
|
<VDivider />
|
||||||
<VCardText>
|
<VCardText>
|
||||||
<VRow>
|
<VRow>
|
||||||
<VCol cols="12">
|
<VCol cols="12">
|
||||||
<VSelect v-model="data.search_type" label="搜索方式" :items="searchOptions" outlined dense />
|
<VSelect
|
||||||
|
v-model="data.search_type"
|
||||||
|
:label="t('workflow.fetchTorrents.searchType')"
|
||||||
|
:items="searchOptions"
|
||||||
|
outlined
|
||||||
|
dense
|
||||||
|
/>
|
||||||
</VCol>
|
</VCol>
|
||||||
</VRow>
|
</VRow>
|
||||||
<VRow v-if="data.search_type === 'keyword'">
|
<VRow v-if="data.search_type === 'keyword'">
|
||||||
<VCol cols="6">
|
<VCol cols="6">
|
||||||
<VTextField v-model="data.name" label="名称" outlined dense />
|
<VTextField v-model="data.name" :label="t('workflow.fetchTorrents.name')" outlined dense />
|
||||||
</VCol>
|
</VCol>
|
||||||
<VCol cols="6">
|
<VCol cols="6">
|
||||||
<VTextField v-model="data.year" label="年份" outlined dense />
|
<VTextField v-model="data.year" :label="t('workflow.fetchTorrents.year')" outlined dense />
|
||||||
</VCol>
|
</VCol>
|
||||||
<VCol cols="6">
|
<VCol cols="6">
|
||||||
<VSelect v-model="data.type" label="类型" :items="typeOptions" outlined dense />
|
<VSelect
|
||||||
|
v-model="data.type"
|
||||||
|
:label="t('workflow.fetchTorrents.type')"
|
||||||
|
:items="typeOptions"
|
||||||
|
outlined
|
||||||
|
dense
|
||||||
|
/>
|
||||||
</VCol>
|
</VCol>
|
||||||
<VCol cols="6">
|
<VCol cols="6">
|
||||||
<VTextField v-model="data.season" type="number" label="季" outlined dense />
|
<VTextField
|
||||||
|
v-model="data.season"
|
||||||
|
type="number"
|
||||||
|
:label="t('workflow.fetchTorrents.season')"
|
||||||
|
outlined
|
||||||
|
dense
|
||||||
|
/>
|
||||||
</VCol>
|
</VCol>
|
||||||
</VRow>
|
</VRow>
|
||||||
<VRow>
|
<VRow>
|
||||||
<VCol cols="12">
|
<VCol cols="12">
|
||||||
<VSelect v-model="data.sites" label="站点" :items="siteOptions" chips multiple outlined dense />
|
<VSelect
|
||||||
|
v-model="data.sites"
|
||||||
|
:label="t('workflow.fetchTorrents.sites')"
|
||||||
|
:items="siteOptions"
|
||||||
|
chips
|
||||||
|
multiple
|
||||||
|
outlined
|
||||||
|
dense
|
||||||
|
/>
|
||||||
</VCol>
|
</VCol>
|
||||||
</VRow>
|
</VRow>
|
||||||
<VRow v-if="data.search_type === 'keyword'">
|
<VRow v-if="data.search_type === 'keyword'">
|
||||||
<VCol cols="12">
|
<VCol cols="12">
|
||||||
<VSwitch v-model="data.match_media" label="匹配媒体信息" />
|
<VSwitch v-model="data.match_media" :label="t('workflow.fetchTorrents.matchMedia')" />
|
||||||
</VCol>
|
</VCol>
|
||||||
</VRow>
|
</VRow>
|
||||||
</VCardText>
|
</VCardText>
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import api from '@/api'
|
import api from '@/api'
|
||||||
import { Handle, Position } from '@vue-flow/core'
|
import { Handle, Position } from '@vue-flow/core'
|
||||||
|
import { useI18n } from 'vue-i18n'
|
||||||
|
|
||||||
|
const { t } = useI18n()
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
id: {
|
id: {
|
||||||
@@ -16,11 +19,11 @@ const props = defineProps({
|
|||||||
// 电影/电视剧下拉框
|
// 电影/电视剧下拉框
|
||||||
const typeOptions = ref([
|
const typeOptions = ref([
|
||||||
{
|
{
|
||||||
title: '电影',
|
title: t('mediaType.movie'),
|
||||||
value: '电影',
|
value: '电影',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '电视剧',
|
title: t('mediaType.tv'),
|
||||||
value: '电视剧',
|
value: '电视剧',
|
||||||
},
|
},
|
||||||
])
|
])
|
||||||
@@ -39,7 +42,7 @@ async function loadMediaCategories() {
|
|||||||
|
|
||||||
// 根据选中的媒体类型,获取对应的媒体类别
|
// 根据选中的媒体类型,获取对应的媒体类别
|
||||||
const getCategories = computed(() => {
|
const getCategories = computed(() => {
|
||||||
const default_value = [{ title: '全部', value: '' }]
|
const default_value = [{ title: t('common.all'), value: '' }]
|
||||||
if (!mediaCategories.value || !mediaCategories.value[props.data.type ?? '']) return default_value
|
if (!mediaCategories.value || !mediaCategories.value[props.data.type ?? '']) return default_value
|
||||||
return default_value.concat(mediaCategories.value[props.data.type ?? ''])
|
return default_value.concat(mediaCategories.value[props.data.type ?? ''])
|
||||||
})
|
})
|
||||||
@@ -58,20 +61,20 @@ onMounted(() => {
|
|||||||
<VIcon icon="mdi-filter-check" size="x-large"></VIcon>
|
<VIcon icon="mdi-filter-check" size="x-large"></VIcon>
|
||||||
</VAvatar>
|
</VAvatar>
|
||||||
</template>
|
</template>
|
||||||
<VCardTitle>过滤媒体数据</VCardTitle>
|
<VCardTitle>{{ t('workflow.filterMedias.title') }}</VCardTitle>
|
||||||
<VCardSubtitle>对媒体数据列表进行过滤</VCardSubtitle>
|
<VCardSubtitle>{{ t('workflow.filterMedias.subtitle') }}</VCardSubtitle>
|
||||||
</VCardItem>
|
</VCardItem>
|
||||||
<VDivider />
|
<VDivider />
|
||||||
<VCardText>
|
<VCardText>
|
||||||
<VRow>
|
<VRow>
|
||||||
<VCol cols="12">
|
<VCol cols="12">
|
||||||
<VSelect v-model="data.type" label="类型" :items="typeOptions" outlined dense />
|
<VSelect v-model="data.type" :label="t('workflow.filterMedias.type')" :items="typeOptions" outlined dense />
|
||||||
</VCol>
|
</VCol>
|
||||||
<VCol cols="6">
|
<VCol cols="6">
|
||||||
<VTextField v-model="data.year" label="年份" outlined dense />
|
<VTextField v-model="data.year" :label="t('workflow.filterMedias.year')" outlined dense />
|
||||||
</VCol>
|
</VCol>
|
||||||
<VCol cols="6">
|
<VCol cols="6">
|
||||||
<VTextField v-model="data.vote" type="number" label="评分" outlined dense />
|
<VTextField v-model="data.vote" type="number" :label="t('workflow.filterMedias.vote')" outlined dense />
|
||||||
</VCol>
|
</VCol>
|
||||||
</VRow>
|
</VRow>
|
||||||
</VCardText>
|
</VCardText>
|
||||||
|
|||||||
@@ -2,6 +2,9 @@
|
|||||||
import api from '@/api'
|
import api from '@/api'
|
||||||
import { FilterRuleGroup } from '@/api/types'
|
import { FilterRuleGroup } from '@/api/types'
|
||||||
import { Handle, Position } from '@vue-flow/core'
|
import { Handle, Position } from '@vue-flow/core'
|
||||||
|
import { useI18n } from 'vue-i18n'
|
||||||
|
|
||||||
|
const { t } = useI18n()
|
||||||
|
|
||||||
defineProps({
|
defineProps({
|
||||||
id: {
|
id: {
|
||||||
@@ -17,39 +20,39 @@ defineProps({
|
|||||||
// 质量选择框数据
|
// 质量选择框数据
|
||||||
const qualityOptions = ref([
|
const qualityOptions = ref([
|
||||||
{
|
{
|
||||||
title: '全部',
|
title: t('workflow.filterTorrents.qualityOptions.all'),
|
||||||
value: '',
|
value: '',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '蓝光原盘',
|
title: t('workflow.filterTorrents.qualityOptions.blurayOriginal'),
|
||||||
value: 'Blu-?Ray.+VC-?1|Blu-?Ray.+AVC|UHD.+blu-?ray.+HEVC|MiniBD',
|
value: 'Blu-?Ray.+VC-?1|Blu-?Ray.+AVC|UHD.+blu-?ray.+HEVC|MiniBD',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Remux',
|
title: t('workflow.filterTorrents.qualityOptions.remux'),
|
||||||
value: 'Remux',
|
value: 'Remux',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'BluRay',
|
title: t('workflow.filterTorrents.qualityOptions.bluray'),
|
||||||
value: 'Blu-?Ray',
|
value: 'Blu-?Ray',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'UHD',
|
title: t('workflow.filterTorrents.qualityOptions.uhd'),
|
||||||
value: 'UHD|UltraHD',
|
value: 'UHD|UltraHD',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'WEB-DL',
|
title: t('workflow.filterTorrents.qualityOptions.webdl'),
|
||||||
value: 'WEB-?DL|WEB-?RIP',
|
value: 'WEB-?DL|WEB-?RIP',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'HDTV',
|
title: t('workflow.filterTorrents.qualityOptions.hdtv'),
|
||||||
value: 'HDTV',
|
value: 'HDTV',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'H265',
|
title: t('workflow.filterTorrents.qualityOptions.h265'),
|
||||||
value: '[Hx].?265|HEVC',
|
value: '[Hx].?265|HEVC',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'H264',
|
title: t('workflow.filterTorrents.qualityOptions.h264'),
|
||||||
value: '[Hx].?264|AVC',
|
value: '[Hx].?264|AVC',
|
||||||
},
|
},
|
||||||
])
|
])
|
||||||
@@ -57,19 +60,19 @@ const qualityOptions = ref([
|
|||||||
// 分辨率选择框数据
|
// 分辨率选择框数据
|
||||||
const resolutionOptions = ref([
|
const resolutionOptions = ref([
|
||||||
{
|
{
|
||||||
title: '全部',
|
title: t('workflow.filterTorrents.resolutionOptions.all'),
|
||||||
value: '',
|
value: '',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '4k',
|
title: t('workflow.filterTorrents.resolutionOptions.4k'),
|
||||||
value: '4K|2160p|x2160',
|
value: '4K|2160p|x2160',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '1080p',
|
title: t('workflow.filterTorrents.resolutionOptions.1080p'),
|
||||||
value: '1080[pi]|x1080',
|
value: '1080[pi]|x1080',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '720p',
|
title: t('workflow.filterTorrents.resolutionOptions.720p'),
|
||||||
value: '720[pi]|x720',
|
value: '720[pi]|x720',
|
||||||
},
|
},
|
||||||
])
|
])
|
||||||
@@ -77,23 +80,23 @@ const resolutionOptions = ref([
|
|||||||
// 特效选择框数据
|
// 特效选择框数据
|
||||||
const effectOptions = ref([
|
const effectOptions = ref([
|
||||||
{
|
{
|
||||||
title: '全部',
|
title: t('workflow.filterTorrents.effectOptions.all'),
|
||||||
value: '',
|
value: '',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '杜比视界',
|
title: t('workflow.filterTorrents.effectOptions.dolbyVision'),
|
||||||
value: 'Dolby[\\s.]+Vision|DOVI|[\\s.]+DV[\\s.]+',
|
value: 'Dolby[\\s.]+Vision|DOVI|[\\s.]+DV[\\s.]+',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '杜比全景声',
|
title: t('workflow.filterTorrents.effectOptions.dolbyAtmos'),
|
||||||
value: 'Dolby[\\s.]*\\+?Atmos|Atmos',
|
value: 'Dolby[\\s.]*\\+?Atmos|Atmos',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'HDR',
|
title: t('workflow.filterTorrents.effectOptions.hdr'),
|
||||||
value: '[\\s.]+HDR[\\s.]+|HDR10|HDR10\\+',
|
value: '[\\s.]+HDR[\\s.]+|HDR10|HDR10\\+',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'SDR',
|
title: t('workflow.filterTorrents.effectOptions.sdr'),
|
||||||
value: '[\\s.]+SDR[\\s.]+',
|
value: '[\\s.]+SDR[\\s.]+',
|
||||||
},
|
},
|
||||||
])
|
])
|
||||||
@@ -133,36 +136,60 @@ onMounted(() => {
|
|||||||
<VIcon icon="mdi-filter-multiple" size="x-large"></VIcon>
|
<VIcon icon="mdi-filter-multiple" size="x-large"></VIcon>
|
||||||
</VAvatar>
|
</VAvatar>
|
||||||
</template>
|
</template>
|
||||||
<VCardTitle>过滤资源</VCardTitle>
|
<VCardTitle>{{ t('workflow.filterTorrents.title') }}</VCardTitle>
|
||||||
<VCardSubtitle>对资源列表数据进行过滤</VCardSubtitle>
|
<VCardSubtitle>{{ t('workflow.filterTorrents.subtitle') }}</VCardSubtitle>
|
||||||
</VCardItem>
|
</VCardItem>
|
||||||
<VDivider />
|
<VDivider />
|
||||||
<VCardText>
|
<VCardText>
|
||||||
<VRow>
|
<VRow>
|
||||||
<VCol cols="6">
|
<VCol cols="6">
|
||||||
<VSelect v-model="data.quality" label="质量" :items="qualityOptions" outlined dense />
|
<VSelect
|
||||||
|
v-model="data.quality"
|
||||||
|
:label="t('workflow.filterTorrents.quality')"
|
||||||
|
:items="qualityOptions"
|
||||||
|
outlined
|
||||||
|
dense
|
||||||
|
/>
|
||||||
</VCol>
|
</VCol>
|
||||||
<VCol cols="6">
|
<VCol cols="6">
|
||||||
<VSelect v-model="data.resolution" label="分辨率" :items="resolutionOptions" outlined dense />
|
<VSelect
|
||||||
|
v-model="data.resolution"
|
||||||
|
:label="t('workflow.filterTorrents.resolution')"
|
||||||
|
:items="resolutionOptions"
|
||||||
|
outlined
|
||||||
|
dense
|
||||||
|
/>
|
||||||
</VCol>
|
</VCol>
|
||||||
<VCol cols="6">
|
<VCol cols="6">
|
||||||
<VSelect v-model="data.effect" label="特效" :items="effectOptions" outlined dense />
|
<VSelect
|
||||||
|
v-model="data.effect"
|
||||||
|
:label="t('workflow.filterTorrents.effect')"
|
||||||
|
:items="effectOptions"
|
||||||
|
outlined
|
||||||
|
dense
|
||||||
|
/>
|
||||||
</VCol>
|
</VCol>
|
||||||
<VCol cols="6">
|
<VCol cols="6">
|
||||||
<VTextField v-model="data.size" label="大小范围" placeholder="MB" outlined dense />
|
<VTextField
|
||||||
|
v-model="data.size"
|
||||||
|
:label="t('workflow.filterTorrents.size')"
|
||||||
|
placeholder="MB"
|
||||||
|
outlined
|
||||||
|
dense
|
||||||
|
/>
|
||||||
</VCol>
|
</VCol>
|
||||||
<VCol cols="12">
|
<VCol cols="12">
|
||||||
<VTextField v-model="data.include" label="包含(关键字、正则式)" outlined dense />
|
<VTextField v-model="data.include" :label="t('workflow.filterTorrents.include')" outlined dense />
|
||||||
</VCol>
|
</VCol>
|
||||||
<VCol cols="12">
|
<VCol cols="12">
|
||||||
<VTextField v-model="data.exclude" label="排除(关键字、正则式)" outlined dense />
|
<VTextField v-model="data.exclude" :label="t('workflow.filterTorrents.exclude')" outlined dense />
|
||||||
</VCol>
|
</VCol>
|
||||||
<VCol cols="12">
|
<VCol cols="12">
|
||||||
<VSelect
|
<VSelect
|
||||||
v-model="data.rule_groups"
|
v-model="data.rule_groups"
|
||||||
chips
|
chips
|
||||||
multiple
|
multiple
|
||||||
label="过滤规则组"
|
:label="t('workflow.filterTorrents.ruleGroups')"
|
||||||
:items="ruleGroupsOptions"
|
:items="ruleGroupsOptions"
|
||||||
outlined
|
outlined
|
||||||
dense
|
dense
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { Handle, Position } from '@vue-flow/core'
|
import { Handle, Position } from '@vue-flow/core'
|
||||||
import { storageOptions } from '@/api/constants'
|
import { storageOptions } from '@/api/constants'
|
||||||
|
import { useI18n } from 'vue-i18n'
|
||||||
|
|
||||||
|
const { t } = useI18n()
|
||||||
|
|
||||||
defineProps({
|
defineProps({
|
||||||
id: {
|
id: {
|
||||||
@@ -23,17 +26,28 @@ defineProps({
|
|||||||
<VIcon icon="mdi-folder-search" size="x-large"></VIcon>
|
<VIcon icon="mdi-folder-search" size="x-large"></VIcon>
|
||||||
</VAvatar>
|
</VAvatar>
|
||||||
</template>
|
</template>
|
||||||
<VCardTitle>扫描目录</VCardTitle>
|
<VCardTitle>{{ t('workflow.scanFile.title') }}</VCardTitle>
|
||||||
<VCardSubtitle>扫描目录文件到队列</VCardSubtitle>
|
<VCardSubtitle>{{ t('workflow.scanFile.subtitle') }}</VCardSubtitle>
|
||||||
</VCardItem>
|
</VCardItem>
|
||||||
<VDivider />
|
<VDivider />
|
||||||
<VCardText>
|
<VCardText>
|
||||||
<VRow>
|
<VRow>
|
||||||
<VCol cols="12">
|
<VCol cols="12">
|
||||||
<VSelect v-model="data.storage" label="存储" :items="storageOptions" outlined dense />
|
<VSelect
|
||||||
|
v-model="data.storage"
|
||||||
|
:label="t('workflow.scanFile.storage')"
|
||||||
|
:items="storageOptions"
|
||||||
|
outlined
|
||||||
|
dense
|
||||||
|
/>
|
||||||
</VCol>
|
</VCol>
|
||||||
<VCol cols="12">
|
<VCol cols="12">
|
||||||
<VPathField v-model="data.directory" :storage="data.storage" label="目录" clearable />
|
<VPathField
|
||||||
|
v-model="data.directory"
|
||||||
|
:storage="data.storage"
|
||||||
|
:label="t('workflow.scanFile.directory')"
|
||||||
|
clearable
|
||||||
|
/>
|
||||||
</VCol>
|
</VCol>
|
||||||
</VRow>
|
</VRow>
|
||||||
</VCardText>
|
</VCardText>
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { Handle, Position } from '@vue-flow/core'
|
import { Handle, Position } from '@vue-flow/core'
|
||||||
|
import { useI18n } from 'vue-i18n'
|
||||||
|
|
||||||
|
const { t } = useI18n()
|
||||||
|
|
||||||
defineProps({
|
defineProps({
|
||||||
id: {
|
id: {
|
||||||
@@ -22,8 +25,8 @@ defineProps({
|
|||||||
<VIcon icon="mdi-file-find" size="x-large"></VIcon>
|
<VIcon icon="mdi-file-find" size="x-large"></VIcon>
|
||||||
</VAvatar>
|
</VAvatar>
|
||||||
</template>
|
</template>
|
||||||
<VCardTitle>刮削文件</VCardTitle>
|
<VCardTitle>{{ t('workflow.scrapeFile.title') }}</VCardTitle>
|
||||||
<VCardSubtitle>刮削媒体信息和图片</VCardSubtitle>
|
<VCardSubtitle>{{ t('workflow.scrapeFile.subtitle') }}</VCardSubtitle>
|
||||||
</VCardItem>
|
</VCardItem>
|
||||||
<Handle id="edge_out" type="source" :position="Position.Right" />
|
<Handle id="edge_out" type="source" :position="Position.Right" />
|
||||||
</VCard>
|
</VCard>
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { Handle, Position } from '@vue-flow/core'
|
import { Handle, Position } from '@vue-flow/core'
|
||||||
|
import { useI18n } from 'vue-i18n'
|
||||||
|
|
||||||
|
const { t } = useI18n()
|
||||||
|
|
||||||
defineProps({
|
defineProps({
|
||||||
id: {
|
id: {
|
||||||
@@ -22,8 +25,8 @@ defineProps({
|
|||||||
<VIcon icon="mdi-send-check" size="x-large"></VIcon>
|
<VIcon icon="mdi-send-check" size="x-large"></VIcon>
|
||||||
</VAvatar>
|
</VAvatar>
|
||||||
</template>
|
</template>
|
||||||
<VCardTitle>发送事件</VCardTitle>
|
<VCardTitle>{{ t('workflow.sendEvent.title') }}</VCardTitle>
|
||||||
<VCardSubtitle>发送任务执行事件</VCardSubtitle>
|
<VCardSubtitle>{{ t('workflow.sendEvent.subtitle') }}</VCardSubtitle>
|
||||||
</VCardItem>
|
</VCardItem>
|
||||||
<Handle id="edge_out" type="source" :position="Position.Right" />
|
<Handle id="edge_out" type="source" :position="Position.Right" />
|
||||||
</VCard>
|
</VCard>
|
||||||
|
|||||||
@@ -2,6 +2,9 @@
|
|||||||
import api from '@/api'
|
import api from '@/api'
|
||||||
import { NotificationConf } from '@/api/types'
|
import { NotificationConf } from '@/api/types'
|
||||||
import { Handle, Position } from '@vue-flow/core'
|
import { Handle, Position } from '@vue-flow/core'
|
||||||
|
import { useI18n } from 'vue-i18n'
|
||||||
|
|
||||||
|
const { t } = useI18n()
|
||||||
|
|
||||||
defineProps({
|
defineProps({
|
||||||
id: {
|
id: {
|
||||||
@@ -51,8 +54,8 @@ onMounted(() => {
|
|||||||
<VIcon icon="mdi-message-arrow-right" size="x-large"></VIcon>
|
<VIcon icon="mdi-message-arrow-right" size="x-large"></VIcon>
|
||||||
</VAvatar>
|
</VAvatar>
|
||||||
</template>
|
</template>
|
||||||
<VCardTitle>发送消息</VCardTitle>
|
<VCardTitle>{{ t('workflow.sendMessage.title') }}</VCardTitle>
|
||||||
<VCardSubtitle>发送任务执行消息</VCardSubtitle>
|
<VCardSubtitle>{{ t('workflow.sendMessage.subtitle') }}</VCardSubtitle>
|
||||||
</VCardItem>
|
</VCardItem>
|
||||||
<VDivider />
|
<VDivider />
|
||||||
<VCardText>
|
<VCardText>
|
||||||
@@ -61,7 +64,7 @@ onMounted(() => {
|
|||||||
<VSelect
|
<VSelect
|
||||||
v-model="data.client"
|
v-model="data.client"
|
||||||
:items="sourceOptions"
|
:items="sourceOptions"
|
||||||
label="消息渠道"
|
:label="t('workflow.sendMessage.channel')"
|
||||||
chips
|
chips
|
||||||
multiple
|
multiple
|
||||||
outlined
|
outlined
|
||||||
@@ -70,7 +73,15 @@ onMounted(() => {
|
|||||||
/>
|
/>
|
||||||
</VCol>
|
</VCol>
|
||||||
<VCol cols="12">
|
<VCol cols="12">
|
||||||
<VTextField v-model="data.userid" label="用户ID" chips multiple outlined dense clearable />
|
<VTextField
|
||||||
|
v-model="data.userid"
|
||||||
|
:label="t('workflow.sendMessage.userId')"
|
||||||
|
chips
|
||||||
|
multiple
|
||||||
|
outlined
|
||||||
|
dense
|
||||||
|
clearable
|
||||||
|
/>
|
||||||
</VCol>
|
</VCol>
|
||||||
</VRow>
|
</VRow>
|
||||||
</VCardText>
|
</VCardText>
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { Handle, Position } from '@vue-flow/core'
|
import { Handle, Position } from '@vue-flow/core'
|
||||||
|
import { useI18n } from 'vue-i18n'
|
||||||
|
|
||||||
|
const { t } = useI18n()
|
||||||
|
|
||||||
defineProps({
|
defineProps({
|
||||||
id: {
|
id: {
|
||||||
@@ -15,11 +18,11 @@ defineProps({
|
|||||||
// 来源下拉框
|
// 来源下拉框
|
||||||
const sourceOptions = ref([
|
const sourceOptions = ref([
|
||||||
{
|
{
|
||||||
title: '文件列表',
|
title: t('workflow.transferFile.sourceOptions.fileList'),
|
||||||
value: 'files',
|
value: 'files',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '下载任务',
|
title: t('workflow.transferFile.sourceOptions.downloads'),
|
||||||
value: 'downloads',
|
value: 'downloads',
|
||||||
},
|
},
|
||||||
])
|
])
|
||||||
@@ -34,14 +37,20 @@ const sourceOptions = ref([
|
|||||||
<VIcon icon="mdi-file-move" size="x-large"></VIcon>
|
<VIcon icon="mdi-file-move" size="x-large"></VIcon>
|
||||||
</VAvatar>
|
</VAvatar>
|
||||||
</template>
|
</template>
|
||||||
<VCardTitle>整理文件</VCardTitle>
|
<VCardTitle>{{ t('workflow.transferFile.title') }}</VCardTitle>
|
||||||
<VCardSubtitle>整理重命名队列中的文件</VCardSubtitle>
|
<VCardSubtitle>{{ t('workflow.transferFile.subtitle') }}</VCardSubtitle>
|
||||||
</VCardItem>
|
</VCardItem>
|
||||||
<VDivider />
|
<VDivider />
|
||||||
<VCardText>
|
<VCardText>
|
||||||
<VRow>
|
<VRow>
|
||||||
<VCol cols="12">
|
<VCol cols="12">
|
||||||
<VSelect v-model="data.source" label="来源" :items="sourceOptions" outlined dense />
|
<VSelect
|
||||||
|
v-model="data.source"
|
||||||
|
:label="t('workflow.transferFile.source')"
|
||||||
|
:items="sourceOptions"
|
||||||
|
outlined
|
||||||
|
dense
|
||||||
|
/>
|
||||||
</VCol>
|
</VCol>
|
||||||
</VRow>
|
</VRow>
|
||||||
</VCardText>
|
</VCardText>
|
||||||
|
|||||||
@@ -366,6 +366,141 @@ export default {
|
|||||||
error: 'Error Message',
|
error: 'Error Message',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
scanFile: {
|
||||||
|
title: 'Scan Directory',
|
||||||
|
subtitle: 'Scan directory files to queue',
|
||||||
|
storage: 'Storage',
|
||||||
|
directory: 'Directory',
|
||||||
|
},
|
||||||
|
addDownload: {
|
||||||
|
title: 'Add Download',
|
||||||
|
subtitle: 'Add resource to downloader',
|
||||||
|
downloader: 'Downloader',
|
||||||
|
category: 'Category',
|
||||||
|
savePath: 'Save Path',
|
||||||
|
onlyLack: 'Only Download Missing',
|
||||||
|
},
|
||||||
|
addSubscribe: {
|
||||||
|
title: 'Add Subscribe',
|
||||||
|
subtitle: 'Add resource to subscription',
|
||||||
|
},
|
||||||
|
fetchMedias: {
|
||||||
|
title: 'Fetch Media Data',
|
||||||
|
subtitle: 'Fetch media data list from rankings',
|
||||||
|
source: 'Source',
|
||||||
|
searchType: 'Search Type',
|
||||||
|
type: 'Type',
|
||||||
|
name: 'Name',
|
||||||
|
year: 'Year',
|
||||||
|
tmdbTrending: 'TMDB Trending',
|
||||||
|
doubanShowing: 'Now Showing',
|
||||||
|
bangumiCalendar: 'Bangumi Daily',
|
||||||
|
tmdbMovies: 'TMDB Popular Movies',
|
||||||
|
tmdbTvs: 'TMDB Popular TV Shows',
|
||||||
|
doubanMovieHot: 'Douban Hot Movies',
|
||||||
|
doubanTvHot: 'Douban Hot TV Shows',
|
||||||
|
doubanTvAnimation: 'Douban Hot Anime',
|
||||||
|
doubanMovies: 'Douban Latest Movies',
|
||||||
|
doubanTvs: 'Douban Latest TV Shows',
|
||||||
|
doubanMovieTop250: 'Douban Movie TOP250',
|
||||||
|
doubanTvWeeklyChinese: 'Douban Chinese TV Weekly',
|
||||||
|
doubanTvWeeklyGlobal: 'Douban Global TV Weekly',
|
||||||
|
},
|
||||||
|
filterMedias: {
|
||||||
|
title: 'Filter Media Data',
|
||||||
|
subtitle: 'Filter media data list',
|
||||||
|
type: 'Type',
|
||||||
|
year: 'Year',
|
||||||
|
vote: 'Vote',
|
||||||
|
},
|
||||||
|
filterTorrents: {
|
||||||
|
title: 'Filter Resources',
|
||||||
|
subtitle: 'Filter resource list',
|
||||||
|
quality: 'Quality',
|
||||||
|
qualityOptions: {
|
||||||
|
all: 'All',
|
||||||
|
blurayOriginal: 'Blu-ray Original',
|
||||||
|
remux: 'Remux',
|
||||||
|
bluray: 'BluRay',
|
||||||
|
uhd: 'UHD',
|
||||||
|
webdl: 'WEB-DL',
|
||||||
|
hdtv: 'HDTV',
|
||||||
|
h265: 'H265',
|
||||||
|
h264: 'H264',
|
||||||
|
},
|
||||||
|
resolution: 'Resolution',
|
||||||
|
resolutionOptions: {
|
||||||
|
all: 'All',
|
||||||
|
'4k': '4K',
|
||||||
|
'1080p': '1080p',
|
||||||
|
'720p': '720p',
|
||||||
|
},
|
||||||
|
effect: 'Effect',
|
||||||
|
effectOptions: {
|
||||||
|
all: 'All',
|
||||||
|
dolbyVision: 'Dolby Vision',
|
||||||
|
dolbyAtmos: 'Dolby Atmos',
|
||||||
|
hdr: 'HDR',
|
||||||
|
sdr: 'SDR',
|
||||||
|
},
|
||||||
|
size: 'Size Range',
|
||||||
|
include: 'Include (Keywords, Regex)',
|
||||||
|
exclude: 'Exclude (Keywords, Regex)',
|
||||||
|
ruleGroups: 'Filter Rule Groups',
|
||||||
|
},
|
||||||
|
scrapeFile: {
|
||||||
|
title: 'Scrape File',
|
||||||
|
subtitle: 'Scrape media info and images',
|
||||||
|
},
|
||||||
|
sendEvent: {
|
||||||
|
title: 'Send Event',
|
||||||
|
subtitle: 'Send task execution event',
|
||||||
|
},
|
||||||
|
fetchDownloads: {
|
||||||
|
title: 'Fetch Downloads',
|
||||||
|
subtitle: 'Fetch download queue task status',
|
||||||
|
loop: 'Loop Execution',
|
||||||
|
loopInterval: 'Loop Interval (seconds)',
|
||||||
|
},
|
||||||
|
fetchRss: {
|
||||||
|
title: 'Fetch RSS Resources',
|
||||||
|
subtitle: 'Subscribe RSS feed to get resources',
|
||||||
|
url: 'RSS URL',
|
||||||
|
userAgent: 'User-Agent',
|
||||||
|
timeout: 'Timeout',
|
||||||
|
matchMedia: 'Match Media Info',
|
||||||
|
useProxy: 'Use Proxy',
|
||||||
|
},
|
||||||
|
fetchTorrents: {
|
||||||
|
title: 'Search Site Resources',
|
||||||
|
subtitle: 'Search site torrent resource list',
|
||||||
|
searchType: 'Search Type',
|
||||||
|
searchOptions: {
|
||||||
|
name: 'Name',
|
||||||
|
mediaList: 'Media List',
|
||||||
|
},
|
||||||
|
name: 'Name',
|
||||||
|
year: 'Year',
|
||||||
|
type: 'Type',
|
||||||
|
season: 'Season',
|
||||||
|
sites: 'Sites',
|
||||||
|
matchMedia: 'Match Media Info',
|
||||||
|
},
|
||||||
|
sendMessage: {
|
||||||
|
title: 'Send Message',
|
||||||
|
subtitle: 'Send task execution message',
|
||||||
|
channel: 'Message Channel',
|
||||||
|
userId: 'User ID',
|
||||||
|
},
|
||||||
|
transferFile: {
|
||||||
|
title: 'Organize Files',
|
||||||
|
subtitle: 'Organize and rename files in queue',
|
||||||
|
source: 'Source',
|
||||||
|
sourceOptions: {
|
||||||
|
fileList: 'File List',
|
||||||
|
downloads: 'Downloads',
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
dashboard: {
|
dashboard: {
|
||||||
storage: 'Storage',
|
storage: 'Storage',
|
||||||
|
|||||||
@@ -364,6 +364,125 @@ export default {
|
|||||||
error: '错误信息',
|
error: '错误信息',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
scanFile: {
|
||||||
|
title: '扫描目录',
|
||||||
|
subtitle: '扫描目录文件到队列',
|
||||||
|
storage: '存储',
|
||||||
|
directory: '目录',
|
||||||
|
},
|
||||||
|
addDownload: {
|
||||||
|
title: '添加下载',
|
||||||
|
subtitle: '添加资源到下载器',
|
||||||
|
downloader: '下载器',
|
||||||
|
category: '分类',
|
||||||
|
sequential: '顺序下载',
|
||||||
|
forceResume: '强制继续',
|
||||||
|
firstLastPiece: '优先首尾文件',
|
||||||
|
},
|
||||||
|
addSubscribe: {
|
||||||
|
title: '添加订阅',
|
||||||
|
subtitle: '添加资源到订阅',
|
||||||
|
type: '类型',
|
||||||
|
name: '名称',
|
||||||
|
season: '季',
|
||||||
|
episode: '集',
|
||||||
|
},
|
||||||
|
fetchMedias: {
|
||||||
|
title: '获取媒体',
|
||||||
|
subtitle: '从媒体服务器获取媒体信息',
|
||||||
|
server: '媒体服务器',
|
||||||
|
type: '类型',
|
||||||
|
name: '名称',
|
||||||
|
year: '年份',
|
||||||
|
},
|
||||||
|
filterMedias: {
|
||||||
|
title: '过滤媒体',
|
||||||
|
subtitle: '根据条件过滤媒体',
|
||||||
|
type: '类型',
|
||||||
|
name: '名称',
|
||||||
|
year: '年份',
|
||||||
|
season: '季',
|
||||||
|
episode: '集',
|
||||||
|
},
|
||||||
|
scrapeFile: {
|
||||||
|
title: '刮削文件',
|
||||||
|
subtitle: '刮削文件元数据',
|
||||||
|
storage: '存储',
|
||||||
|
directory: '目录',
|
||||||
|
},
|
||||||
|
sendEvent: {
|
||||||
|
title: '发送事件',
|
||||||
|
subtitle: '发送系统事件',
|
||||||
|
event: '事件',
|
||||||
|
data: '数据',
|
||||||
|
},
|
||||||
|
fetchDownloads: {
|
||||||
|
title: '获取下载',
|
||||||
|
subtitle: '获取下载器任务',
|
||||||
|
downloader: '下载器',
|
||||||
|
status: '状态',
|
||||||
|
},
|
||||||
|
fetchRss: {
|
||||||
|
title: '获取RSS',
|
||||||
|
subtitle: '获取RSS订阅',
|
||||||
|
url: 'URL',
|
||||||
|
interval: '间隔',
|
||||||
|
},
|
||||||
|
fetchTorrents: {
|
||||||
|
title: '获取种子',
|
||||||
|
subtitle: '获取种子列表',
|
||||||
|
site: '站点',
|
||||||
|
keyword: '关键词',
|
||||||
|
category: '分类',
|
||||||
|
},
|
||||||
|
sendMessage: {
|
||||||
|
title: '发送消息',
|
||||||
|
subtitle: '发送系统消息',
|
||||||
|
type: '类型',
|
||||||
|
content: '内容',
|
||||||
|
},
|
||||||
|
transferFile: {
|
||||||
|
title: '传输文件',
|
||||||
|
subtitle: '传输文件到目标目录',
|
||||||
|
source: '源目录',
|
||||||
|
target: '目标目录',
|
||||||
|
storage: '存储',
|
||||||
|
},
|
||||||
|
filterTorrents: {
|
||||||
|
title: '过滤资源',
|
||||||
|
subtitle: '对资源列表数据进行过滤',
|
||||||
|
quality: '质量',
|
||||||
|
qualityOptions: {
|
||||||
|
all: '全部',
|
||||||
|
blurayOriginal: '蓝光原盘',
|
||||||
|
remux: 'Remux',
|
||||||
|
bluray: 'BluRay',
|
||||||
|
uhd: 'UHD',
|
||||||
|
webdl: 'WEB-DL',
|
||||||
|
hdtv: 'HDTV',
|
||||||
|
h265: 'H265',
|
||||||
|
h264: 'H264',
|
||||||
|
},
|
||||||
|
resolution: '分辨率',
|
||||||
|
resolutionOptions: {
|
||||||
|
all: '全部',
|
||||||
|
'4k': '4k',
|
||||||
|
'1080p': '1080p',
|
||||||
|
'720p': '720p',
|
||||||
|
},
|
||||||
|
effect: '特效',
|
||||||
|
effectOptions: {
|
||||||
|
all: '全部',
|
||||||
|
dolbyVision: '杜比视界',
|
||||||
|
dolbyAtmos: '杜比全景声',
|
||||||
|
hdr: 'HDR',
|
||||||
|
sdr: 'SDR',
|
||||||
|
},
|
||||||
|
size: '大小范围',
|
||||||
|
include: '包含(关键字、正则式)',
|
||||||
|
exclude: '排除(关键字、正则式)',
|
||||||
|
ruleGroups: '过滤规则组',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
dashboard: {
|
dashboard: {
|
||||||
storage: '存储空间',
|
storage: '存储空间',
|
||||||
|
|||||||
@@ -365,6 +365,141 @@ export default {
|
|||||||
error: '錯誤訊息',
|
error: '錯誤訊息',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
scanFile: {
|
||||||
|
title: '掃描目錄',
|
||||||
|
subtitle: '掃描目錄文件到隊列',
|
||||||
|
storage: '存儲',
|
||||||
|
directory: '目錄',
|
||||||
|
},
|
||||||
|
addDownload: {
|
||||||
|
title: '添加下載',
|
||||||
|
subtitle: '添加資源到下載器',
|
||||||
|
downloader: '下載器',
|
||||||
|
category: '分類',
|
||||||
|
savePath: '保存路徑',
|
||||||
|
onlyLack: '僅下載缺失的資源',
|
||||||
|
},
|
||||||
|
addSubscribe: {
|
||||||
|
title: '添加訂閱',
|
||||||
|
subtitle: '添加資源到訂閱',
|
||||||
|
},
|
||||||
|
fetchMedias: {
|
||||||
|
title: '獲取媒體數據',
|
||||||
|
subtitle: '獲取榜單等媒體數據列表',
|
||||||
|
source: '來源',
|
||||||
|
searchType: '搜索方式',
|
||||||
|
type: '類型',
|
||||||
|
name: '名稱',
|
||||||
|
year: '年份',
|
||||||
|
tmdbTrending: '流行趨勢',
|
||||||
|
doubanShowing: '正在熱映',
|
||||||
|
bangumiCalendar: 'Bangumi每日放送',
|
||||||
|
tmdbMovies: 'TMDB熱門電影',
|
||||||
|
tmdbTvs: 'TMDB熱門電視劇',
|
||||||
|
doubanMovieHot: '豆瓣熱門電影',
|
||||||
|
doubanTvHot: '豆瓣熱門電視劇',
|
||||||
|
doubanTvAnimation: '豆瓣熱門動漫',
|
||||||
|
doubanMovies: '豆瓣最新電影',
|
||||||
|
doubanTvs: '豆瓣最新電視劇',
|
||||||
|
doubanMovieTop250: '豆瓣電影TOP250',
|
||||||
|
doubanTvWeeklyChinese: '豆瓣國產劇集榜',
|
||||||
|
doubanTvWeeklyGlobal: '豆瓣全球劇集榜',
|
||||||
|
},
|
||||||
|
filterMedias: {
|
||||||
|
title: '過濾媒體數據',
|
||||||
|
subtitle: '對媒體數據列表進行過濾',
|
||||||
|
type: '類型',
|
||||||
|
year: '年份',
|
||||||
|
vote: '評分',
|
||||||
|
},
|
||||||
|
filterTorrents: {
|
||||||
|
title: '過濾資源',
|
||||||
|
subtitle: '對資源列表數據進行過濾',
|
||||||
|
quality: '質量',
|
||||||
|
qualityOptions: {
|
||||||
|
all: '全部',
|
||||||
|
blurayOriginal: '藍光原盤',
|
||||||
|
remux: 'Remux',
|
||||||
|
bluray: 'BluRay',
|
||||||
|
uhd: 'UHD',
|
||||||
|
webdl: 'WEB-DL',
|
||||||
|
hdtv: 'HDTV',
|
||||||
|
h265: 'H265',
|
||||||
|
h264: 'H264',
|
||||||
|
},
|
||||||
|
resolution: '分辨率',
|
||||||
|
resolutionOptions: {
|
||||||
|
all: '全部',
|
||||||
|
'4k': '4k',
|
||||||
|
'1080p': '1080p',
|
||||||
|
'720p': '720p',
|
||||||
|
},
|
||||||
|
effect: '特效',
|
||||||
|
effectOptions: {
|
||||||
|
all: '全部',
|
||||||
|
dolbyVision: '杜比視界',
|
||||||
|
dolbyAtmos: '杜比全景聲',
|
||||||
|
hdr: 'HDR',
|
||||||
|
sdr: 'SDR',
|
||||||
|
},
|
||||||
|
size: '大小範圍',
|
||||||
|
include: '包含(關鍵字、正則式)',
|
||||||
|
exclude: '排除(關鍵字、正則式)',
|
||||||
|
ruleGroups: '過濾規則組',
|
||||||
|
},
|
||||||
|
scrapeFile: {
|
||||||
|
title: '刮削文件',
|
||||||
|
subtitle: '刮削媒體信息和圖片',
|
||||||
|
},
|
||||||
|
sendEvent: {
|
||||||
|
title: '發送事件',
|
||||||
|
subtitle: '發送任務執行事件',
|
||||||
|
},
|
||||||
|
fetchDownloads: {
|
||||||
|
title: '獲取下載任務',
|
||||||
|
subtitle: '獲取下載隊列中的任務狀態',
|
||||||
|
loop: '循環執行',
|
||||||
|
loopInterval: '循環間隔 (秒)',
|
||||||
|
},
|
||||||
|
fetchRss: {
|
||||||
|
title: '獲取RSS資源',
|
||||||
|
subtitle: '訂閱RSS地址獲取資源',
|
||||||
|
url: 'RSS地址',
|
||||||
|
userAgent: 'User-Agent',
|
||||||
|
timeout: '超時時間',
|
||||||
|
matchMedia: '匹配媒體信息',
|
||||||
|
useProxy: '使用代理',
|
||||||
|
},
|
||||||
|
fetchTorrents: {
|
||||||
|
title: '搜索站點資源',
|
||||||
|
subtitle: '搜索站點種子資源列表',
|
||||||
|
searchType: '搜索方式',
|
||||||
|
searchOptions: {
|
||||||
|
name: '名稱',
|
||||||
|
mediaList: '媒體列表',
|
||||||
|
},
|
||||||
|
name: '名稱',
|
||||||
|
year: '年份',
|
||||||
|
type: '類型',
|
||||||
|
season: '季',
|
||||||
|
sites: '站點',
|
||||||
|
matchMedia: '匹配媒體信息',
|
||||||
|
},
|
||||||
|
sendMessage: {
|
||||||
|
title: '發送消息',
|
||||||
|
subtitle: '發送任務執行消息',
|
||||||
|
channel: '消息渠道',
|
||||||
|
userId: '用戶ID',
|
||||||
|
},
|
||||||
|
transferFile: {
|
||||||
|
title: '整理文件',
|
||||||
|
subtitle: '整理重命名隊列中的文件',
|
||||||
|
source: '來源',
|
||||||
|
sourceOptions: {
|
||||||
|
fileList: '文件列表',
|
||||||
|
downloads: '下載任務',
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
dashboard: {
|
dashboard: {
|
||||||
storage: '存儲空間',
|
storage: '存儲空間',
|
||||||
|
|||||||
Reference in New Issue
Block a user