@@ -35,13 +36,13 @@ export function StorageConfigPage() {
外部存储
- 配置 Alist / S3 / WebDAV / CloudDrive2 / 网盘(115 / 夸克)后端,支持本地转存、网盘挂载和 302/反代播放
+ 配置 OpenList / Alist / S3 / WebDAV / CloudDrive2 / 网盘(115 / 夸克)后端,支持本地转存、网盘挂载和 302/反代播放
- {(['alist', 'webdav', 'clouddrive2', 's3', 'cloud115', 'quark'] as StorageType[]).map((t) => (
+ {(['openlist', 'alist', 'webdav', 'clouddrive2', 's3', 'cloud115', 'quark'] as StorageType[]).map((t) => (
{!supported && (
- 115 / 夸克原生上传需要私有分片上传协议。推荐把 115、123、夸克等挂载到 CloudDrive2 或 Alist 后,在这里选择 CloudDrive2 / Alist 转存。
+ 115 / 夸克原生上传需要私有分片上传协议。推荐把 115、123、夸克等挂载到 OpenList、CloudDrive2 或 Alist 后,在这里选择 OpenList / CloudDrive2 / Alist 转存。
+
+ )}
+ {type === 'openlist' && (
+
+ OpenList 默认端口常见为 5244,WebDAV 地址通常是 http://host:5244/dav/。如果未配置 HTTPS 反代,请不要填写 https://,否则会出现 “server gave HTTP response to HTTPS client”。
)}
{type === 'clouddrive2' && (
@@ -421,7 +435,8 @@ function CloudBrowser({ type }: { type: StorageType }) {
const [items, setItems] = useState
([])
const [loading, setLoading] = useState(false)
const [mounting, setMounting] = useState(false)
- const [mountMediaType, setMountMediaType] = useState('movie')
+ const [batchMounting, setBatchMounting] = useState(false)
+ const [mountMediaType, setMountMediaType] = useState('auto')
const [error, setError] = useState('')
const cur = stack[stack.length - 1]
@@ -473,6 +488,32 @@ function CloudBrowser({ type }: { type: StorageType }) {
}
}
+ const mountVisibleDirectories = async () => {
+ const dirs = items.filter((item) => item.is_dir)
+ if (dirs.length === 0) {
+ toast.error('当前目录下没有可挂载的子目录')
+ return
+ }
+ setBatchMounting(true)
+ let ok = 0
+ let failed = 0
+ const label = TYPE_LABEL[type] ?? type
+ for (const dir of dirs) {
+ try {
+ await cloudAPI.mount(type, dir.id, `${label} · ${dir.name}`, 'auto')
+ ok += 1
+ } catch {
+ failed += 1
+ }
+ }
+ if (failed > 0) {
+ toast.error(`已挂载 ${ok} 个目录,失败 ${failed} 个;请查看日志或逐个挂载定位`)
+ } else {
+ toast.success(`已挂载 ${ok} 个目录为媒体库,后台会自动生成 302/STRM 播放入口`)
+ }
+ setBatchMounting(false)
+ }
+
return (
e.preventDefault()}>
@@ -493,6 +534,7 @@ function CloudBrowser({ type }: { type: StorageType }) {
value={mountMediaType}
onChange={(event) => setMountMediaType(event.target.value)}
>
+
@@ -502,11 +544,19 @@ function CloudBrowser({ type }: { type: StorageType }) {
+
{loading ? (
@@ -514,7 +564,7 @@ function CloudBrowser({ type }: { type: StorageType }) {
) : error ? (
-