mirror of
https://github.com/jxxghp/MoviePilot-Frontend.git
synced 2026-09-05 15:36:49 +08:00
Merge pull request #189 from Aqr-K/dev-directory
This commit is contained in:
@@ -1,6 +1,9 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import type { TransferDirectoryConf } from '@/api/types'
|
import type { TransferDirectoryConf } from '@/api/types'
|
||||||
import { VTextField } from 'vuetify/lib/components/index.mjs'
|
import { VTextField } from 'vuetify/lib/components/index.mjs'
|
||||||
|
import { useToast } from 'vue-toast-notification'
|
||||||
|
import api from "@/api";
|
||||||
|
import { nextTick } from 'vue'
|
||||||
|
|
||||||
// 输入参数
|
// 输入参数
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
@@ -46,12 +49,66 @@ const transferSourceItems = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
// 整理方式下拉字典
|
// 整理方式下拉字典
|
||||||
const transferTypeItems = [
|
const transferTypeItems = ref<{ title: string; value: string }[]>([])
|
||||||
{ title: '复制', value: 'copy' },
|
|
||||||
{ title: '移动', value: 'move' },
|
// 调用API查询支持的整理方式
|
||||||
{ title: '硬链接', value: 'link' },
|
async function loadTransferTypeItems() {
|
||||||
{ title: '软链接', value: 'softlink' },
|
// 参数不全时不查询
|
||||||
]
|
if (!props.directory.library_storage || !props.directory.storage) return
|
||||||
|
try {
|
||||||
|
// 下载器储存整理方法
|
||||||
|
const storage_res = await api.get(`storage/transtype/${props.directory.storage}`)
|
||||||
|
const storage_transtype = (storage_res as any).transtype;
|
||||||
|
// 媒体库储存整理方法
|
||||||
|
const library_storage_res = await api.get(`storage/transtype/${props.directory.library_storage}`)
|
||||||
|
const library_storage_transtype = (library_storage_res as any).transtype;
|
||||||
|
// 为空终止
|
||||||
|
if (!library_storage_transtype || !storage_transtype) return
|
||||||
|
// 取并集
|
||||||
|
const transtype: { [key: string]: string } = {};
|
||||||
|
Object.keys(storage_transtype).forEach(key => {
|
||||||
|
if (key in library_storage_transtype) {
|
||||||
|
transtype[key] = storage_transtype[key];
|
||||||
|
}
|
||||||
|
})
|
||||||
|
// 非空时设置整理方式下拉字典
|
||||||
|
if (transtype && Object.keys(transtype).length > 0) {
|
||||||
|
transferTypeItems.value = Object.keys(transtype).map(key => ({
|
||||||
|
title: transtype[key],
|
||||||
|
value: key,
|
||||||
|
}))
|
||||||
|
// 如果整理方式下拉字典不为空,且当前值不在新的transferTypeItems里,则设置整理方式为第一个
|
||||||
|
if (transferTypeItems.value.length > 0 && !transferTypeItems.value.find(item => item.value === props.directory.transfer_type)) {
|
||||||
|
nextTick(() => {
|
||||||
|
props.directory.transfer_type = transferTypeItems.value[0].value
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 如果整理方式下拉字典为空,清空整理方式
|
||||||
|
if (transferTypeItems.value.length === 0) {
|
||||||
|
props.directory.transfer_type = ''
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 无可用整理方式,清除已选值
|
||||||
|
transferTypeItems.value = []
|
||||||
|
props.directory.transfer_type = ''
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 整理方式无数据提示
|
||||||
|
const computedNoDataText = computed(() => {
|
||||||
|
if (!props.directory.library_storage && !props.directory.storage) {
|
||||||
|
return '无可用整理方式!请先选择下载器储存与媒体库储存!'
|
||||||
|
} else if (!props.directory.library_storage) {
|
||||||
|
return '无可用整理方式!请先选择媒体库储存!'
|
||||||
|
} else if (!props.directory.storage) {
|
||||||
|
return '无可用整理方式!请先选择下载器储存!'
|
||||||
|
} else {
|
||||||
|
return '选择的存储没有支持的整理方法!'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
// 覆盖模式下拉字典
|
// 覆盖模式下拉字典
|
||||||
const overwriteModeItems = [
|
const overwriteModeItems = [
|
||||||
@@ -93,6 +150,15 @@ const getCategories = computed(() => {
|
|||||||
if (!props.categories || !props.categories[props.directory?.media_type ?? '']) return default_value
|
if (!props.categories || !props.categories[props.directory?.media_type ?? '']) return default_value
|
||||||
return default_value.concat(props.categories[props.directory.media_type ?? ''])
|
return default_value.concat(props.categories[props.directory.media_type ?? ''])
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// 监听 下载储存与媒体库储存 变化,重新加载整理方式下拉字典
|
||||||
|
watch([() => props.directory.library_storage, () => props.directory.storage],
|
||||||
|
([newLibraryStorage, newStorage], [oldLibraryStorage, oldStorage]) => {
|
||||||
|
if (newLibraryStorage !== oldLibraryStorage || newStorage !== oldStorage) {
|
||||||
|
loadTransferTypeItems();
|
||||||
|
}
|
||||||
|
}, { immediate: true });
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@@ -132,7 +198,10 @@ const getCategories = computed(() => {
|
|||||||
/>
|
/>
|
||||||
</VCol>
|
</VCol>
|
||||||
<VCol cols="4">
|
<VCol cols="4">
|
||||||
<VSelect v-model="props.directory.storage" variant="underlined" :items="storageItems" label="下载存储" />
|
<VSelect v-model="props.directory.storage"
|
||||||
|
variant="underlined"
|
||||||
|
:items="storageItems"
|
||||||
|
label="下载存储" />
|
||||||
</VCol>
|
</VCol>
|
||||||
<VCol cols="8">
|
<VCol cols="8">
|
||||||
<VPathField @update:modelValue="updateDownloadPath">
|
<VPathField @update:modelValue="updateDownloadPath">
|
||||||
@@ -171,6 +240,7 @@ const getCategories = computed(() => {
|
|||||||
variant="underlined"
|
variant="underlined"
|
||||||
:items="transferTypeItems"
|
:items="transferTypeItems"
|
||||||
label="整理方式"
|
label="整理方式"
|
||||||
|
:no-data-text="computedNoDataText"
|
||||||
/>
|
/>
|
||||||
</VCol>
|
</VCol>
|
||||||
<VCol cols="8">
|
<VCol cols="8">
|
||||||
|
|||||||
@@ -81,6 +81,11 @@ async function loadDirectories() {
|
|||||||
async function saveDirectories() {
|
async function saveDirectories() {
|
||||||
orderDirectoryCards()
|
orderDirectoryCards()
|
||||||
try {
|
try {
|
||||||
|
const names = directories.value.map(item => item.name)
|
||||||
|
if (new Set(names).size !== names.length) {
|
||||||
|
$toast.error('存在重复目录名称!无法保存,请修改!')
|
||||||
|
return
|
||||||
|
}
|
||||||
const result: { [key: string]: any } = await api.post('system/setting/Directories', directories.value)
|
const result: { [key: string]: any } = await api.post('system/setting/Directories', directories.value)
|
||||||
if (result.success) {
|
if (result.success) {
|
||||||
$toast.success('目录设置保存成功')
|
$toast.success('目录设置保存成功')
|
||||||
@@ -93,8 +98,12 @@ async function saveDirectories() {
|
|||||||
|
|
||||||
// 添加媒体库目录
|
// 添加媒体库目录
|
||||||
function addDirectory() {
|
function addDirectory() {
|
||||||
|
let name = `目录${directories.value.length + 1}`;
|
||||||
|
while (directories.value.some(item => item.name === name)) {
|
||||||
|
name = `目录${parseInt(name.split('目录')[1]) + 1}`;
|
||||||
|
}
|
||||||
directories.value.push({
|
directories.value.push({
|
||||||
name: `目录${directories.value.length + 1}`,
|
name: name,
|
||||||
storage: 'local',
|
storage: 'local',
|
||||||
download_path: '',
|
download_path: '',
|
||||||
priority: -1,
|
priority: -1,
|
||||||
|
|||||||
@@ -52,9 +52,17 @@ async function saveCustomRules() {
|
|||||||
|
|
||||||
// 添加自定义规则
|
// 添加自定义规则
|
||||||
function addCustomRule() {
|
function addCustomRule() {
|
||||||
|
let id = `RULE${customRules.value.length + 1}`;
|
||||||
|
while (customRules.value.some(item => item.id === id)) {
|
||||||
|
id = `RULE${parseInt(id.split('RULE')[1]) + 1}`;
|
||||||
|
}
|
||||||
|
let name = `规则${customRules.value.length + 1}`;
|
||||||
|
while (customRules.value.some(item => item.name === name)) {
|
||||||
|
name = `规则${parseInt(name.split('规则')[1]) + 1}`;
|
||||||
|
}
|
||||||
customRules.value.push({
|
customRules.value.push({
|
||||||
id: `RULE${customRules.value.length + 1}`,
|
id: id,
|
||||||
name: `规则${customRules.value.length + 1}`,
|
name: name,
|
||||||
include: '',
|
include: '',
|
||||||
exclude: '',
|
exclude: '',
|
||||||
})
|
})
|
||||||
@@ -89,8 +97,12 @@ async function saveFilterRuleGroups() {
|
|||||||
|
|
||||||
// 添加规则组
|
// 添加规则组
|
||||||
function addFilterRuleGroup() {
|
function addFilterRuleGroup() {
|
||||||
|
let name = `规则组${filterRuleGroups.value.length + 1}`;
|
||||||
|
while (filterRuleGroups.value.some(item => item.name === name)) {
|
||||||
|
name = `规则组${parseInt(name.split('规则组')[1]) + 1}`;
|
||||||
|
}
|
||||||
filterRuleGroups.value.push({
|
filterRuleGroups.value.push({
|
||||||
name: `规则组${filterRuleGroups.value.length + 1}`,
|
name: name,
|
||||||
rule_string: '',
|
rule_string: '',
|
||||||
media_type: '',
|
media_type: '',
|
||||||
category: '',
|
category: '',
|
||||||
|
|||||||
@@ -113,8 +113,12 @@ async function saveSystemSetting() {
|
|||||||
|
|
||||||
// 添加下载器
|
// 添加下载器
|
||||||
function addDownloader(downloader: string) {
|
function addDownloader(downloader: string) {
|
||||||
|
let name = `下载器${downloaders.value.length + 1}`;
|
||||||
|
while (downloaders.value.some(item => item.name === name)) {
|
||||||
|
name = `下载器${parseInt(name.split('下载器')[1]) + 1}`;
|
||||||
|
}
|
||||||
downloaders.value.push({
|
downloaders.value.push({
|
||||||
name: `下载器${downloaders.value.length + 1}`,
|
name: name,
|
||||||
type: downloader,
|
type: downloader,
|
||||||
default: false,
|
default: false,
|
||||||
enabled: false,
|
enabled: false,
|
||||||
@@ -136,8 +140,12 @@ function onDownloaderChange(downloader: DownloaderConf) {
|
|||||||
|
|
||||||
// 添加媒体服务器
|
// 添加媒体服务器
|
||||||
function addMediaServer(mediaserver: string) {
|
function addMediaServer(mediaserver: string) {
|
||||||
|
let name = `服务器${mediaServers.value.length + 1}`;
|
||||||
|
while (mediaServers.value.some(item => item.name === name)) {
|
||||||
|
name = `服务器${parseInt(name.split('服务器')[1]) + 1}`;
|
||||||
|
}
|
||||||
mediaServers.value.push({
|
mediaServers.value.push({
|
||||||
name: `服务器${mediaServers.value.length + 1}`,
|
name: name,
|
||||||
type: mediaserver,
|
type: mediaserver,
|
||||||
enabled: false,
|
enabled: false,
|
||||||
config: {},
|
config: {},
|
||||||
|
|||||||
Reference in New Issue
Block a user