From 7a8530eb227f1b5cf5ad00de2b5a77d7c55d2021 Mon Sep 17 00:00:00 2001
From: KirCute <951206789@qq.com>
Date: Fri, 26 Dec 2025 17:03:42 +0800
Subject: [PATCH] docs(alias): add new version docs
---
pages/configuration/global.md | 41 ++
pages/guide/advanced/alias.md | 555 +----------------
pages/guide/advanced/balance.md | 208 ++++++-
pages/guide/advanced/strm.md | 129 +---
pages/guide/drivers/alias.md | 557 +----------------
pages/guide/drivers/alias_text.md | 615 +++++++++++++++++++
pages/guide/drivers/chunk.md | 83 ++-
pages/guide/drivers/strm.md | 2 +-
pages/guide/drivers/strm_text.md | 136 ++++
public/img/drivers/alias/read_policy_all.png | Bin 0 -> 101302 bytes
10 files changed, 1071 insertions(+), 1255 deletions(-)
create mode 100644 pages/guide/drivers/alias_text.md
create mode 100644 pages/guide/drivers/strm_text.md
create mode 100644 public/img/drivers/alias/read_policy_all.png
diff --git a/pages/configuration/global.md b/pages/configuration/global.md
index 369979b31..4f20eba27 100644
--- a/pages/configuration/global.md
+++ b/pages/configuration/global.md
@@ -387,3 +387,44 @@ If you prefer copying the accessible link directly, try:
```
:::
+
+## Handle hook after writing { lang="en" }
+
+## 写入操作后触发目录更新钩子 { lang="zh-CN" }
+
+::: en
+Whether to trigger the directory update hook after operations such as upload, rename, delete, move, copy, or extraction.
+
+Triggering the directory update hook will cause the index to update and activate the function of the [Strm](/guide/drivers/strm) driver to generate local files.
+:::
+::: zh-CN
+上传、重命名、删除、移动、复制、解压操作后,是否触发目录更新钩子。
+
+目录更新钩子触发将导致索引更新及[Strm](/guide/drivers/strm)驱动生成本地文件的功能触发。
+:::
+
+## Handle hook rate limit { lang="en" }
+
+## 目录更新钩子遍历限制速率 { lang="zh-CN" }
+
+::: en
+It is only meaningful when the [Handle hook after writing](/configuration/global#handle-hook-after-writing) is enabled. When the directory update hook is triggered, this limits the rate at which the driver API is called (unit: times/second; 0 means no restriction).
+:::
+::: zh-CN
+仅当[写入操作后触发目录更新钩子](/configuration/global#写入操作后触发目录更新钩子)开启时有意义,触发目录更新钩子时,限制调用驱动 API 的速率(单位:次/秒,为 0 表示不限制)。
+:::
+
+## Ignore system files { lang="en" }
+
+## 忽略系统文件 { lang="zh-CN" }
+
+::: en
+When enabled, attempts by users to upload certain system files will directly fail, thereby achieving filtering.
+
+The determination of whether a file is a system file is based on its filename.
+:::
+::: zh-CN
+开启时,当用户尝试上传某些系统文件时会直接失败,从而实现过滤。
+
+判断是否为系统文件的依据为文件名。
+:::
diff --git a/pages/guide/advanced/alias.md b/pages/guide/advanced/alias.md
index 837c16551..1bebc0339 100644
--- a/pages/guide/advanced/alias.md
+++ b/pages/guide/advanced/alias.md
@@ -8,557 +8,4 @@ categories:
top: 120
---
-::: en
-
-**Alias** is a feature that allows multiple different cloud drives or storage paths to be merged into a unified directory. By combining paths, content from different cloud drives or folders can be displayed in the same interface, simplifying access and management.
-
-Except for the **`Download Preview (Read-Only)`** operation, other actions such as **Copy, Delete, Rename, Offline Download, and Upload** are not supported.
-
-For example: Cloud Drive Account 1 and Cloud Drive Account 2 both contain a folder named `Movies`, but the contents of these folders may not be identical.
-
-- **Previously (Virtual Path)**:
-
- You could only mount them to two different paths separately, like:
- - `Cloud Drive 1/Movies`, `Cloud Drive 2/Movies`
- - `Movies/Cloud Drive 1`, `Movies/Cloud Drive 2`
-
-- **Now (Alias)**:
-
- An aggregated folder (Movies) is provided, which can contain content from both Cloud Drive 1 and Cloud Drive 2 simultaneously.
-
-**Display Rules for Folder Content:**
-
-1. **Same-name Merging**: Files (or folders) with the same name will be automatically merged into one.
-2. **Same-name Priority**: When accessing resources, the file (or folder) at the top (earlier) position in the path will be accessed.
- - If files with the same name are merged, when you click **`Play` or `Download`**, the file at the top of the path list (the one using the 302 mode) will be prioritized.
-
-Next, let's explain the **`Same-name Priority²`** access rule. It’s highly recommended to check out the examples.
-
-Let's start with a diagram:
-
-
-
-In the diagram, we can see that two different folders are merged into one. Files and folders with the same name are also combined, and unique ones are displayed separately.
-
-Example explanations:
-
-- **Example 1**: `riluo.jpg` is unique to Cloud Drive 1, so it is shown separately.
-- **Example 2**: Both folders contain a `video` folder, but the contents of these folders will be merged. Subfolders also follow the **same-name merging** display rule.
- - Both folders contain two videos, but one of them has the same name. After merging according to the **same-name merging** rule, three video files will be displayed in total.
-
-:::
-::: zh-CN
-
-**别名(Alias)** 是一种将多个不同云盘或存储路径合并为一个统一目录的功能。通过路径合并,来自不同云盘或文件夹的内容可以在同一界面中展示,从而简化访问和管理。
-
-除了 **`下载预览(只读)`** 操作外,其他操作如 **复制、删除、重命名、离线下载、上传** 均不支持。
-
-例如:云盘账号1和云盘账号2中都包含一个名为`电影`的文件夹,但两者的内容未必完全相同。
-
-- **`以前(虚拟路径)`**:
-
- 在此模式下,您只能将文件夹分别挂载在不同的路径上,例如:
- - `云盘1/电影`、`云盘2/电影`
- - `电影/云盘1`、`电影/云盘2`
-
-- **`现在(别名)`**:
-
- 现在通过 **Alias**,可以创建一个聚合的文件夹(如`电影`),其中同时包含来自云盘1和云盘2的内容。
-
-**展示时文件夹内容规则如下:**
-
-1. **同名合并**:同名的文件夹或文件会自动合并为一个。
-2. **同名优先**:在访问时,如果多个文件夹包含同名文件,系统将优先访问路径列表中排在前面的文件夹。
- - 当您点击 **`播放` 或 `下载`** 时,系统会优先调用路径列表中最前面使用302模式的文件。
-
-为了更清楚理解 **`同名优先²`** 规则,建议查看以下示例。
-
-我们先看一张示意图:
-
-
-
-在图中,两个不同的文件夹被合并为一个文件夹。同名的文件和文件夹会自动合并,而独有的文件则单独展示。
-
-**示例说明:**
-
-- **例1**:`riluo.jpg` 仅存在于云盘1中,因此显示为独有文件。
-- **例2**:两个文件夹都有一个名为`video`的子文件夹。合并后,两个`video`文件夹的内容会合并展示。若其中有同名文件(例如`movie.mp4`),合并后最终展示3个视频文件。
-
-:::
-
-## Filling Method { lang="en" }
-
-## 填写方式 { lang="zh-CN" }
-
-::: en
-There are two ways to fill in:
-
-1. The first one is that you can only fill in the path of the subfolder and the folder with the same name must be used at the end. It is not recommended to use :x:
- - Paths filling example:
- ```
- /file1/locala
- /file2/localb
- ```
-2. The second is to directly mount the root folder path, using the `renaming` method, it is strongly recommended to use :heavy_check_mark:
- - Paths filling example:
-
- ```
- #Example 1 Directly write the root folder
- merge: /file1
- merge: /file2
-
- #Example 2 Mount different path folders for merging
- merge: /file1/localtest233
- merge: /file2/videos/TV series
- merge: /file3 2/TV/Domestic TV Series/Station XX
- ```
-
-According to the second method, we can `merge` and display different folders, which is convenient and quick.
-:::
-
-::: zh-CN
-填写方式有两种:
-
-1. 第一种是只可以填写子文件夹路径并且最后结尾时必须同名文件夹才可以,不推荐使用 :x:
- - `路径`填写示例:
- ```
- /目录1/目录a
- /目录2/目录b
- ```
-2. 第二种是可以直接挂载根文件夹ID,利用`重命名`的方式,强烈推荐使用 :heavy_check_mark:
- - `路径`填写示例:
-
- ```
- #示例1 直接写根文件夹
- 合并显示:/目录1
- 合并显示:/目录2
-
- #示例2 挂载不同路径文件夹进行合并
- 合并显示:/目录1/本地测试233
- 合并显示:/目录2/视频/电视剧
- 合并显示:/目录2/电视/国产电视剧/某某台
- ```
-
-根据第二种这样我们可以将不同的文件夹进行合并显示,方便快捷。
-:::
-
----
-
-::: en
-Example 1. Fill in the access according to the following path(302 mode has priority)
-
-```
-local: /localtest/local1
-local: /localtest/local2
-local: /localtest/local3
-local: /localtest/local4
-```
-
-- 1, if there is a video 1 2 3 4, each visit is `1`
- - If 1 3 4 uses the local proxy and 2 uses `302`, call 2 first
-- 2, a video 3 4 yes then every visit is `3`
- - If 3 uses a local proxy and 4 uses `302`, call 4 first
-
-:::
-
-::: zh-CN
-例1、 根据下面路径填写访问(302模式有优先权)
-
-```
-本地:/本地测试/本地1
-本地:/本地测试/本地2
-本地:/本地测试/本地3
-本地:/本地测试/本地4
-```
-
-1. 一个视频 1 2 3 4 都有的话每次访问的是 `1`
- - 如果1 3 4 使用的本地代理,2 使用的`302`,优先调用 2
-
-2. 一个视频 3 4 有 那么每次访问的都是`3`
- - 如果 3 使用的本地代理,4 使用的`302`,优先调用 4
-
-:::
-
----
-
-::: en
-
-Example 2. Fill in the access according to the following path(302 mode has priority)
-
-```
-local: /localtest/local4
-local: /localtest/local3
-local: /localtest/local2
-local: /localtest/local1
-```
-
-1. if a video has 1 2 3 4, each visit is `4`
- - If 1 3 4 uses the local proxy and 2 uses `302`, call 2 first
-
-2. a video 3 4 has then every visit is `4`
- - If 4 uses a local proxy and 2 uses `302`, call 2 first
-
-:::
-
-::: zh-CN
-例2、根据下面的路径填写访问(302模式有优先权)
-
-```
-本地:/本地测试/本地4
-本地:/本地测试/本地3
-本地:/本地测试/本地2
-本地:/本地测试/本地1
-```
-
-1. 一个视频 1 2 3 4 都有的话每次访问的是 `4`
- - 如果1 3 4 使用的本地代理,2 使用的`302`,优先调用 2
-
-2. 一个视频 2 4 有 那么每次访问的都是`4`
- - 如果 4 使用的本地代理,2 使用的`302`,优先调用 2
-
-:::
-
----
-
-::: en
-Example 3. Fill in the access according to the following path(302 mode has priority)
-
-Of course, it is not limited to only 2 folders, just write according to personal needs
-
-```
-Local test:/local1/video
-Local test:/local2/video
-Test other:/test3/images
-Test other:/test4/video/tv
-```
-
-1. local1 local2 merged together
- - If 2 uses a local proxy and 1 uses `302`, call 2 first
-
-2. Test 3 and Test 4 merged together
-
-- If 3 uses a local proxy and 4 uses `302`, call 4 first
-
-3. In the above two cases, two different folders will appear for display, which will be displayed as follows without interfering with each other
-
-
-
-:::
-
-::: zh-CN
-
-例3、根据下面的路径填写访问(302模式有优先权)
-
-当然了不限于只有2个文件夹,根据个人需求来写即可
-
-```
-本地测试:/本地1/video
-本地测试:/本地2/video
-测试其他:/测试3/images
-测试其他:/测试4/video/电视
-```
-
-1. 本地1 本地2 合并在一起了
- - 如果2 使用的本地代理,1 使用的`302`,优先调用 2
-
-2. 测试3 测试4 合并在一起了
- - 如果3 使用的本地代理,4 使用的`302`,优先调用 4
-
-3. 以上两种情况会出现两个不同的文件夹来展示,会如下展示,不会互相干扰
-
-
-
-:::
-
-## The download method to use { lang="en" }
-
-## 使用的下载方式 { lang="zh-CN" }
-
-::: en
-When adding **`alias`**, `Web Proxy` and `Webdav Policy` are not modified by default. The storage path filled in the Paths path can be `302`, `Local Proxy`, `Download Proxy URL`, three modes Mixed Playback Mixed Playback is possible.
-
-If you checked `Web Proxy`, the storage filled in by the Paths path, if there is a 302 mode playback, it will be played in transit (local proxy mode) at that time, and it will become a proxy mode. If the Webdav policy is also changed, it will also change.
-
-Of course, it is up to you to choose whether to change the mode.
-:::
-::: zh-CN
-添加 **`别名-alias`** 时 `Web代理` 和 `Webdav策略` 默认不修改的情况下 Paths路径填写的存储路径可以 `302`,`本地代理`,`下载代理URL`,三种模式混合播放可以进行混合播放。
-
-如果你勾选了`Web代理` ,Paths路径填写的存储 如果有302模式播放的 到时候都会进行中转(本地代理模式)播放,变成代理模式,Webdav策略如果也进行了改动也会进行变化。
-
-当然,是否选择更换模式您自己进选择。
-:::
-
-### What if you don’t know how the cloud disks you added are different? { lang="en" }
-
-### 如果你不知道你添加的云盘是什么方式怎么办? { lang="zh-CN" }
-
-::: en
-
-1. You can go to the bottom of the corresponding document to view the document, there is a flow chart description
- - If there is a 302, the 302 method is used by default. If there are only local proxy and download proxy URLs, the default is to use the local proxy, provided that you have not manually selected
-2. You can check when adding storage, select the corresponding storage to view, for example, let’s check the methods of Alibaba Cloud and 115 respectively
- - As you can see from the figure below, Alibaba Cloud Disk has the option of `web proxy`, and `webdav policy` defaults to 302. It can be judged that Alibaba Cloud Disk uses the 302 method by default
- - As you can see from the figure below, the 115 network disk does not have the option of `web proxy`, and the `webdav strategy` defaults to the local proxy. It can be judged that the 115 network disk uses the local proxy mode by default
- 
-
-:::
-
-::: zh-CN
-
-1. 可以前往文档的相对应的文档最底部查看,有一份流程图说明
- - 如果有302的就是默认使用302方式,如果只有本地代理和下载代理URL默认的就是使用本地代理,前提是你没有进行手动选择
-2. 可以前往添加存储时进行查看,选择对应的存储进行查看,例如我们查看一下阿里云和115分别是什么方式
- - 从下图中看到,阿里云盘有 `web代理`选择,`webdav策略`默认是302,可以判断出阿里云盘默认使用的是302方式
- - 从下图中看到,115网盘没有 `web代理`选择,`webdav策略`默认是本地代理,可以判断出115网盘默认使用的是本地代理方式
- 
-
-:::
-
-## other instructions { lang="en" }
-
-## 其他说明 { lang="zh-CN" }
-
-::: en
-
-If you are using `Windows`, the following situation will occur, and folders with different capitalization will also be regenerated.
-
-For example, Local 1 and Local 2 have a lowercase v for `video` respectively, and the folder OneDrive has an uppercase V `Video` folder.
-
-Then a lowercase video folder will be generated, which contains only `local 1, local 2` files merged by two folders.
-
-At the same time, the uppercase `Video` will gather the files of the three folders.
-
-This is because Windows is case-insensitive, video and Video will be considered as the same folder, you will not have this problem if you switch to Linux or Mac.
-
-Aliases are not supported for load balancing for the time being (if it is supported later, the document will be modified here, if it is not modified, it is not yet supported).
-
-:::
-
-::: zh-CN
-如果你是使用的`Windows`,会出现如下情况,有大小写不同的文件夹也会进行二次生成。
-
-例如本地1,本地2 分别有 `video` 小写的v ,文件夹 OneDrive 有一个大写的 V `Video` 文件夹。
-
-然后会生成一个小写的 `video` 文件夹里面只有 `本地1,本地2` 两个的文件夹所合并的文件。
-
-同时大写的 `Video` 里面 会集合三个文件夹的文件
-
-这是因为 Windows 大小写不敏感,video和Video会被认为是同一个文件夹,你换成 Linux 或者 Mac 就不会有这个问题了
-
-暂时不支持别名进行负载均衡(后期若支持了这里会进行文档修改,如果没有修改就是还不支持)
-
-:::
-
-## Proxy Range { lang="en" }
-
-## 代理 Range { lang="zh-CN" }
-
-::: en
-You need to enable `Web Proxy` or` Webdav Native Proxy` to take effect. Currently only applicable to:`alias`、`139Yun`、`OpenList V3`.
-
-- The `139Yun` driver, when this option is enabled, can resolve issues that occur when a proxy is enabled but the download link does not return the correct HTTP status code, such as problems with video playback or lack of support for resume downloads.
-- The `Alias` driver is added to meet specific use cases, for example, when `139Yun` uses a 302 redirect. By enabling the `Alias` proxy, downloads can use `139Yun` with the 302 redirect, while video playback can use the proxy-enabled `Alias`, reducing unnecessary load.
-- The `OpenList` driver is added to support server-side OpenList mounting with `139Yun` using a 302 redirect. Locally, OpenList can be mounted via the proxy-enabled `OpenList` to access the server's OpenList for video playback, etc., to avoid consuming server bandwidth. This also allows for data-free video streaming on mobile networks.
-
-:::
-
-::: zh-CN
-需要先启用 `Web代理` 或者 `Webdav本地代理` 才会生效。目前仅适用于:`别名`、`中国移动云盘`、`OpenList V3`。
-
-- `139Yun` 驱动开启这个选项后,可解决即使开启代理但下载链接没有返回正确的http状态码导致的一些问题,例如视频无法播放、不支持断点续传等
-- `Alias` 驱动添加是为了满足某些场景,例如 `139Yun` 走302, 然后通过 开启代理的 `Alias` 后,下载用 `139Yun` 走302,播放视频用 开启代理的 `Alias`,减少不必要的负载
-- `OpenList` 驱动添加是为了 服务器的 OpenList 挂载 `139Yun` 走302,然后本地的 OpenList 通过 开启代理的 `OpenList` 挂载 服务器的 OpenList 播放视频等,达到不消化服务器流量的目的,移动卡还能免流
-
-:::
-
-## Protect same name { lang="en" }
-
-## 同名保护 { lang="zh-CN" }
-
-::: en
-Now alias supports the two operations of `Delete` and` Rename`,**By default, use**.
-
-File names like file names may appear in the alias. For folders with the same folder name, you cannot `Delete` or `Rename` when the `Protect same name` is opened.
-
-:::
-
-::: zh-CN
-现在别名支持 `删除`、`重命名`两个操作,**默认开启**。
-
-别名中可能会出现文件名一样的文件,对于文件夹名一致的文件夹,在`同名保护`开启状态下无法删除或者重命名。
-:::
-
-### Protect same name Use for example { lang="en" }
-
-### 同名保护使用举例 { lang="zh-CN" }
-
-::: en
-We fill in the two folders of `a` and` b` to the alias options.
-
-```
-a/ b/ alias
-a/1.png b/1.png alias/1.png
-a/2.mp3 b/2.mp3 alias/2.mp3
-a/3.mp4 b/3.mp4 ----> alias/3.mp4
-a/4.mkv b/4.mkv ----> alias/4.mkv
-a/5.bin b/6.css alias/5.bin ---> According to the rule, aliases in directories listed earlier take precedence, and files with different names in separate folders are given priority.
- alias/6.css
-```
-
-If we attempt to Rename or Delete a file named `1.png` while the `Protect same name` feature is enabled, the following message will be displayed in the top right corner:
-
-
-
- - same-name files cannot be Rename
- - same-name files cannot be Delete
-
-
-
-If we turn off the options of `Protect Same Name`, change to` a/1.png` to `a/11.png` will become the following display
-
-- Because both folders a and b contain the same files, "rename" and "download" will prioritize the folder listed first when filling out the form. Similarly, renaming conflicts will be resolved by modifying the file in the folder listed first.
-
-```
-a/ b/ alias
-a/1.png b/1.png alias/11.png
-a/2.mp3 b/2.mp3 alias/2.mp3
-a/3.mp4 b/3.mp4 ----> alias/3.mp4
-a/4.mkv b/4.mkv ----> alias/4.mkv
-a/5.bin b/6.css alias/5.bin
- alias/1.png ---> Because the b folder is in the rear, the file list display is relatively backward
- alias/6.css
-```
-
-If you really do n’t understand, you can test it yourself and then install the production environment by yourself
-
-:::
-
-::: zh-CN
-
-我们分别将 `a`和`b`两个文件夹填写到别名选项中
-
-```
-a/ b/ alias
-a/1.png b/1.png alias/1.png
-a/2.mp3 b/2.mp3 alias/2.mp3
-a/3.mp4 b/3.mp4 ----> alias/3.mp4
-a/4.mkv b/4.mkv ----> alias/4.mkv
-a/5.bin b/6.css alias/5.bin ---> 根据规则别名目录靠前的,不同文件夹中不同名的文件靠前
- alias/6.css
-```
-
-如果我们在 `同名保护` 开启状态下把同名文件 `1.png` 进行重名名或者删除会提示如下信息在右上角
-
-
-
- - same-name files cannot be Rename / 同名文件无法重命名
- - same-name files cannot be Delete / 同名文件无法删除
-
-
-
-如果我们把 `同名保护` 选项关闭,将 `a/1.png`改成 `a/11.png` 会变成如下展示
-
-- 因为a/b两个文件夹都有一样的文件,`重命名`和`下载`一样优先下载填写时候靠前的文件夹,同理重名修改也是先修改靠前文件夹中的文件
-
-```
-a/ b/ alias
-a/1.png b/1.png alias/11.png
-a/2.mp3 b/2.mp3 alias/2.mp3
-a/3.mp4 b/3.mp4 ----> alias/3.mp4
-a/4.mkv b/4.mkv ----> alias/4.mkv
-a/5.bin b/6.css alias/5.bin
- alias/1.png ---> 因为b文件夹靠后,所以文件列表展示页靠后
- alias/6.css
-```
-
-实在不懂 可以自行本地测试一下再进行生产环境实装
-
-:::
-
-## Download concurrency, Download part size { lang="en" }
-
-## 下载并发、下载分片大小 { lang="zh-CN" }
-
-::: en
-**Storage Settings:**
-
-- Alias (Alias) Drive
-- Local Proxy
-- Path: / Cloud Drive Mount Path
-- Download Concurrency: 10
-- Download Chunk Size: 1024
-
-**Effect:**
-
-- Client → OpenList Alias Drive: Uses 1 connection
-- OpenList Alias Drive → Cloud Drive: Supports 10 concurrent connections, with actual concurrency limited by the cloud drive.
-
-```mermaid
-graph LR
- A[Client] -->|Connection 1| B[OpenList Alias Drive]
-
- B -->|Concurrent Connection 1| C[Cloud Drive]
- B -->|Concurrent Connection 2| C
- B -->|Concurrent Connection 3| C
- B -->|Concurrent Connection 4| C
- B -->|Concurrent Connection 5| C
- B -->|Concurrent Connection 6| C
- B -->|Concurrent Connection 7| C
- B -->|Concurrent Connection 8| C
- B -->|Concurrent Connection 9| C
- B -->|Concurrent Connection 10| C
-```
-
-- Single-threaded speed is slower, but it supports concurrency: Using the alias drive allows concurrent downloads, significantly improving speed.
-- Video watching and download acceleration: The experience is enhanced by increasing concurrency.
-- Copying from alias drive to other drives: File transfer is also accelerated in this case.
-
-**Friendly Reminder:** Please do not abuse this feature. Excessive use may cause abnormal activity on the cloud drive account, and you will bear the consequences.
-
-**Configuration Options:**
-
-- max_concurrency: Sets the maximum concurrency for the local proxy. The default is 64, and setting it to 0 means no limit on concurrency.
-
-:::
-::: zh-CN
-**存储设置:**
-
-- 别名 (Alias) 驱动
-- 本地代理
-- 路径:/云盘挂载路径
-- 下载并发数:10
-- 下载分片大小:1024
-
-**效果:**
-
-- 客户端 → OpenList 别名驱动:使用1个连接
-- OpenList 别名驱动 → 云盘:支持10个并发连接,实际并发数受云盘限制
-
-```mermaid
-graph LR
-A[客户端] -->|连接1| B[OpenList别名驱动]
-
- B -->|并发连接1| C[云盘]
- B -->|并发连接2| C
- B -->|并发连接3| C
- B -->|并发连接4| C
- B -->|并发连接5| C
- B -->|并发连接6| C
- B -->|并发连接7| C
- B -->|并发连接8| C
- B -->|并发连接9| C
- B -->|并发连接10| C
-```
-
-- 单线程速度较慢,但支持并发:通过别名驱动可实现并发下载,显著提升速度
-- 视频观看、下载加速:通过并发连接提升体验
-- 从别名驱动复制到其他驱动:同样能够加速文件传输
-
-**温馨提示**:请勿滥用该功能,过度使用可能导致云盘账号异常,后果自负。
-
-**配置选项:**
-
-- `max_concurrency`:设置本地代理的最大并发数,默认为 64,设置为 0 表示不限制并发数。
-
-:::
+
diff --git a/pages/guide/advanced/balance.md b/pages/guide/advanced/balance.md
index 11d2f8ead..2377b1e73 100644
--- a/pages/guide/advanced/balance.md
+++ b/pages/guide/advanced/balance.md
@@ -1,6 +1,6 @@
---
title:
- en: LoadLoad balancing
+ en: Load balancing
zh-CN: 负载均衡
categories:
- guide
@@ -8,32 +8,24 @@ categories:
top: 90
---
-::: en
-It is required that the file structures in the two storages are exactly the same, and the program will automatically poll all storages for download/request.
-Different network disks can be used, but the file directories must be consistent.
-
-- If the network disk mounted on the main display is inconsistent with the directory tree of the network disk mounted on the load and an error is returned after modifying the network disk mounted on the main display, you can solve it by yourself to keep the directory files of the network disk on the load consistent.
- 
- The first is marked with a red box. It is the main mount, which is displayed on the front page. The remaining nine are the first load balancing on the first one.
-
-:::
+## Link load balancing { lang="en" }
-::: zh-CN
-要求两个存储中的文件结构完全相同,程序会自动轮询所有存储进行下载/请求。
-可以使用不同网盘,但是文件目录要一致。
-
-- 若修改主显示挂载的网盘后和负载挂载的网盘目录树不一致导致返回错误,自行解决进行负载网盘的目录文件保持一致。
- 
- 第一个带红框标记的为主挂载,也就是在前端页面显示的,后面剩下的九个就是对第一个进行负载均衡
+## 链路负载均衡 { lang="zh-CN" }
-:::
+::: en
+Link load balancing distributes traffic across multiple links to alleviate bandwidth pressure on any single link. This load balancing mechanism is only applicable when traffic arrives at the same storage service via multiple distinct links. The system assumes that the drivers participating in the load balancing can always automatically maintain content consistency and will simply forward all requests in a round-robin manner:
-## Usage { lang="en" }
+```mermaid
+graph LR
+ User -->|RW file1| OpenList
+ OpenList -->|Write file1| Link1
+ OpenList -->|Read file1| Link2
+ Link1 -->|Write file1| Serv[Storage Service]
+ Link2 -->|Read file1| Serv[Storage Service]
+```
-## 如何使用 { lang="zh-CN" }
+To perform this load balancing mechanism, mount the first driver normally, and then add the remaining load-balancing drivers using a mount path formatted as `first storage mount path + .balance + any additional content`.
-::: en
-One storage can be added normally, and the other storage can be added with the mount path of `the first storage mount path + .balance + any other content`.
E.g:
- Storage 1: `test`
@@ -43,10 +35,23 @@ E.g:
- ...
- Storage n: `test.balancen`
+
+The first is marked with a red box. It is the main mount, which is displayed on the front page. The remaining nine are the first load balancing on the first one.
:::
-
::: zh-CN
-第一个存储可以正常添加,另外一个存储以 `第一个存储挂载路径 + .balance +任何其他内容` 为挂载路径添加。
+链路负载均衡用于在多条链路上分担流量,以减轻单条链路的带宽压力。这种负载均衡机制仅用于流量从多条不同的链路抵达同一个存储服务的情况,系统将假定参与负载均衡的驱动总能自动保持内容一致,并简单地轮询转发所有请求:
+
+```mermaid
+graph LR
+ User[用户] -->|读写 file1 请求| OpenList
+ OpenList -->|写入 file1| Link1[链路1]
+ OpenList -->|读取 file1| Link2[链路2]
+ Link1 -->|写入 file1| Serv[存储服务]
+ Link2 -->|读取 file1| Serv[存储服务]
+```
+
+要使用这种负载均衡机制,请正常挂载第一个驱动,其余负载均衡驱动以`第一个存储挂载路径 + .balance + 任何其他内容`为挂载路径添加。
+
例如:
- 存储1:`test`
@@ -56,4 +61,159 @@ E.g:
- ...
- 存储n:`test.balancen`
+
+第一个带红框标记的为主挂载,也就是在前端页面显示的,后面剩下的九个就是对第一个进行负载均衡。
+:::
+
+## Storage load balancing { lang="en" }
+
+## 存储负载均衡 { lang="zh-CN" }
+
+::: en
+Storage Load Balancing is used to distribute storage occupancy across multiple storage services, achieving the effect of abstracting multiple storage spaces into one large storage space with a capacity equal to the sum of all individual spaces (similar to RAID 0). The system will assign each uploaded file to a random storage service and forward all read and modification requests for that file to that specific service:
+
+```mermaid
+graph LR
+ User -->|Requests| OpenList
+ OpenList -->|Write file1| Serv1[Storage Service 1]
+ OpenList -->|Write file2| Serv2[Storage Service 2]
+ OpenList -->|Read file1| Serv1
+ OpenList -->|Rename file1| Serv1
+ OpenList -->|Read file2| Serv2
+```
+
+This type of load balancing can be implemented using the putting load balancing feature of the [Alias](/guide/drivers/alias) driver, with the following configuration:
+
+- **Reading conflict policy**: **Get the file corresponding to the first conflict path** (The load balancing function of the Rading conflict policy is used to implement the load balancing described in the [Multi-source reading load balancing](/guide/advanced/balance#multi-source-reading-load-balancing) section. Based on the principles of the two load balancing schemes, enabling both simultaneously does not achieve a 1+1>=2 effect).
+- **Writing conflict policy**: Choose either **Allow full conflict paths** or **Write into all conflict paths** (If the **Write into the first conflict path** policy is used, folder creation operations will only be forwarded to one driver. This will cause that folder and its descendant folders to be unable to continue load balancing as they won't exist on other drivers).
+- **Putting conflict policy**: Choose one of **Random load balancing**, **Weighted random load balancing based on remaining space**, or **Strict weighted random load balancing based on remaining space** according to your needs.
+
+The effect achieved with the above configuration:
+
+```mermaid
+graph LR
+ OpenList -->|File1,File2,File3| Alias
+ Alias -->|File3| Driver1[Driver 1]
+ Alias -->|File1| Driver2[Driver 2]
+ Alias -->|File2| Driver3[Driver 3]
+```
+
+:::
+::: zh-CN
+存储负载均衡用于在多个存储服务上分担空间占用,实现多个存储空间抽象为一个容量为所有存储空间之和的大存储空间的效果(类似于 RAID 0),系统将为每个上传的文件分配一个随机的存储服务,并将对于该文件的读取和修改请求全部转发到这个存储服务上:
+
+```mermaid
+graph LR
+ User[用户] -->|请求| OpenList
+ OpenList -->|写入 file1| Serv1[存储服务1]
+ OpenList -->|写入 file2| Serv2[存储服务2]
+ OpenList -->|读取 file1| Serv1
+ OpenList -->|重命名 file1| Serv1
+ OpenList -->|读取 file2| Serv2
+```
+
+利用[别名](/guide/drivers/alias)驱动的上传负载均衡功能可以实现此类负载均衡,配置如下:
+
+- 读取冲突策略:**读取首个有效路径**(读取冲突策略的负载均衡功能用于实现[多源读取负载均衡](/guide/advanced/balance#多源读取负载均衡)章节的负载均衡功能,按照两种负载均衡方案的原理,同时开启两种负载均衡功能并不能实现1+1>=2的效果)。
+- 写入冲突策略:**仅允许全冲突路径**和**写入所有有效路径**二选一(如果使用**写入首个有效路径**策略,创建文件夹操作将会仅被转发到一个驱动上,这将导致该文件夹及其子孙文件夹由于不存在于其它驱动上,而无法继续负载均衡)。
+- 上传冲突策略:**随机负载均衡**、**按容量加权随机负载均衡**和**严格按容量加权随机负载均衡**按照需求三选一。
+
+以上配置实现的效果:
+
+```mermaid
+graph LR
+ OpenList -->|文件1,文件2,文件3| Alias[别名]
+ Alias -->|文件3| Driver1[驱动1]
+ Alias -->|文件1| Driver2[驱动2]
+ Alias -->|文件2| Driver3[驱动3]
+```
+
+:::
+
+#### Load balancing by file chunks { lang="en" }
+
+#### 按文件块负载均衡 { lang="zh-CN" }
+
+::: en
+Sometimes, the files that need to be load-balanced across storage are relatively large, and performing load balancing on a per-file basis is not granular enough. You can use the [Chunk](/guide/drivers/chunk) driver to split files into fixed-size blocks and then apply storage load balancing to these blocks. The specific configuration is as follows:
+
+- **Chunk**: In the remote path, fill in the mount path of the **Alias** driver. Configure other settings as needed.
+- **Alias**: Keep the configuration consistent with the description above.
+
+The achieved effect is:
+
+```mermaid
+graph LR
+ OpenList -->|A Large File| Chunk
+ Chunk -->|Block1, Block2, Block3| Alias
+ Alias -->|Block1| Driver1[Driver 1]
+ Alias -->|Block3| Driver2[Driver 2]
+ Alias -->|Block2| Driver3[Driver 3]
+```
+
+:::
+::: zh-CN
+有时需要被负载均衡存储的文件比较大,以文件为单位进行负载均衡颗粒度不够细,可以使用[分块](/guide/drivers/chunk)驱动将文件划分为固定大小的文件块,再对文件块进行存储负载均衡,具体配置如下:
+
+- 分块:远程路径填写**别名**驱动的挂载路径,其它配置项按需填写。
+- 别名:与上文一致。
+
+实现的效果为:
+
+```mermaid
+graph LR
+ OpenList -->|大文件| Chunk[分块]
+ Chunk -->|文件块1,文件块2,文件块3| Alias[别名]
+ Alias -->|文件块1| Driver1[驱动1]
+ Alias -->|文件块3| Driver2[驱动2]
+ Alias -->|文件块2| Driver3[驱动3]
+```
+
+:::
+
+## Multi-source reading load balancing { lang="en" }
+
+## 多源读取负载均衡 { lang="zh-CN" }
+
+::: en
+Multi-source reading load balancing allows copies of a file to be distributed across several different storage services. When a user accesses the file, the system randomly selects one of the copies to return, thereby reducing the uplink bandwidth pressure on any single storage service (similar to RAID 1). The key difference between this load balancing strategy and [Link load balancing](/guide/advanced/balance#link-load-balancing) is that since the load-balanced storage services are treated as multiple, independent file systems with no automatic synchronization, OpenList will forward write operations to **all** storage services, rather than to just one of them:
+
+```mermaid
+graph LR
+ User -->|RW file1,file2| OpenList
+ OpenList -->|Write file1| Serv1[Storage Service 1]
+ OpenList -->|Write file2| Serv1
+ OpenList -->|Write file1| Serv2[Storage Service 2]
+ OpenList -->|Write file2| Serv2
+ OpenList -->|Read file1| Serv1
+ OpenList -->|Read file2| Serv2
+```
+
+This type of load balancing can be implemented using the reading load balancing feature of the [Alias](/guide/drivers/alias) driver, with the following configuration:
+
+- **Reading conflict policy**: Choose either **Load balancing on a per-file basis** or **Load balancing on a per-part basis**.
+- **Writing conflict policy**: Choose either **Allow full conflict paths** or **Write into all conflict paths** (If the **Write into the first conflict path** policy is used, folder creation operations will be forwarded to only one driver. This will prevent that folder and its descendant folders from continuing to participate in load balancing, as they won't exist on other drivers).
+- **Putting conflict policy**: Choose either **Allow full conflict paths** or **Put into all conflict paths** (The load balancing function of the Putting conflict policy is used to implement the load balancing described in the [Storage Load Balancing](/guide/advanced/balance#storage-load-balancing) section. Based on the principles of the two load balancing schemes, enabling both simultaneously does not achieve a 1+1>=2 effect).
+
+:::
+::: zh-CN
+多源读取负载均衡可以将文件的副本分散在若干不同的存储服务上,当用户访问文件时,系统会随机选择其中一个文件返回,从而降低单个存储服务的上行带宽压力(类似于 RAID 1)。这种负载均衡策略与[链路负载均衡](/guide/advanced/balance#链路负载均衡)的最大不同之处在于,由于负载均衡存储服务被视为多个没有关联,无法自动同步的文件系统,OpenList 将会向**所有**存储服务转发写入操作,而不是向其中一个转发:
+
+```mermaid
+graph LR
+ User[用户] -->|读写 file1,file2| OpenList
+ OpenList -->|写入 file1| Serv1[存储服务 1]
+ OpenList -->|写入 file2| Serv1
+ OpenList -->|写入 file1| Serv2[存储服务 2]
+ OpenList -->|写入 file2| Serv2
+ OpenList -->|读取 file1| Serv1
+ OpenList -->|读取 file2| Serv2
+```
+
+利用[别名](/guide/drivers/alias)驱动的读取负载均衡功能可以实现此类负载均衡,配置如下:
+
+- 读取冲突策略:**按文件负载均衡**和**按分片负载均衡**二选一。
+- 写入冲突策略:**仅允许全冲突路径**和**写入所有有效路径**二选一(如果使用**写入首个有效路径**策略,创建文件夹操作将会仅被转发到一个驱动上,这将导致该文件夹及其子孙文件夹由于不存在于其它驱动上,而无法继续负载均衡)。
+- 上传冲突策略:**仅允许全冲突路径**和**上传到所有有效路径**二选一(上传冲突策略的负载均衡功能用于实现[存储负载均衡](/guide/advanced/balance#存储负载均衡)章节的负载均衡功能,按照两种负载均衡方案的原理,同时开启两种负载均衡功能并不能实现1+1>=2的效果)。
+
:::
diff --git a/pages/guide/advanced/strm.md b/pages/guide/advanced/strm.md
index 81666cea3..582af8c29 100644
--- a/pages/guide/advanced/strm.md
+++ b/pages/guide/advanced/strm.md
@@ -1,118 +1,11 @@
-::: en
-**Strm** is a driver that allows you to convert supported files from multiple cloud drives into .strm files.
-
-::: warning Important Notes
-Please understand the function of strm files before use
-
-Only the **`Download Preview (Read-Only)`** operation is supported. Other operations such as **Copy, Delete, Rename, Offline Download, Upload** are **not supported**.
-
-Strm uses a local proxy method, and during the **`Download Preview (Read-Only)`** operation, it will consume bandwidth from the deployed machine (depending on the number of files; individual files typically consume less than 100KB).
-:::
-
-::: en
-
-### Parameter Descriptions
-
-- **Path:** The full path in OpenList where .strm files should be generated.
- Examples:
- ```
- /115_open/Video
- /kuake_open/Video
- ```
-- **Site URL:** The URL prefix for the generated .strm files.
-
- For example, if the directory /115_open/Video contains the file:`/电影/再见,李可乐 (2023)/再见,李可乐 (2023) - 2160p.mkv`
-
- And you enter http://localhost:5244 as the Site URL, the generated .strm file will point to: `http://localhost:5244/115_open/Video/电影/再见,李可乐 (2023)/再见,李可乐 (2023) - 2160p.strm`
-
- This field is optional. If left blank, the current access URL will be used as the default prefix.
-
-- **File Type Filter:** Specify which file types should be included for .strm generation.
-
- The following types are built-in:
-
- ```
- Video Type
- mp4,mkv,flv,avi,wmv,ts,rmv,web
-
- Audio Type
- mp3,flac,aac,wav,ogg,m4a,wma,alac
- ```
-
- You can add more types as needed. Use **commas (,)** to separate multiple file types.
-
-- **Encode Path:** Whether to enable URL path encoding.
-
- If disabled, the .strm URL will be:
- `http://localhost:5244/115_open/Video/电影/再见,李可乐 (2023)/再见,李可乐 (2023) - 2160p.stm`
-
- If enabled, it will be:
- `http://localhost:5244/Video/%E7%94%B5%E5%BD%B1/%E5%86%8D%E8%A7%81%EF%BC%8C%E6%9D%8E%E5%8F%AF%E4%B9%90%20(2023)/%E5%86%8D%E8%A7%81%EF%BC%8C%E6%9D%8E%E5%8F%AF%E4%B9%90%20(2023)%20-%202160p.mkv`
-
-- **Without Url:** The generated strm file after opening will not contain URL prefixes
-
-- **SaveStrmToLocal:** When enabled, accessing a directory within or mounted by the Strm driver will save the Strm files locally
-
-- **SaveStrmLocalPath:** The local directory path where Strm files are stored.
-
-:::
-
-::: zh-CN
-**Strm** 是一种可以将多个不同云盘中的支持的文件转换为strm文件的驱动。
-
-::: warning 注意事项
-使用前请先了解strm文件作用
-
-除了 **`下载预览(只读)`** 操作外,其他操作如 **复制、删除、重命名、离线下载、上传** 均不支持。
-
-Strm采用本地代理方式,在 **`下载预览(只读)`** 操作时会消耗一定部署机器的流量(取决于文件数量、单个文件一般不超过100KB)
-:::
-
-::: zh-CN
-
-### 参数介绍
-
-- **路径**:需要生成strm文件的`OpenList上的完整路径`。
-
- 例如
-
- ```
- /115_open/Video
- /kuake_open/Video
- ```
-
-- **站点URL**:Strm文件的URL前缀。
-
- 如在`/115_open/Video`目录下有`/电影/再见,李可乐 (2023)/再见,李可乐 (2023) - 2160p.mkv`
-
- 填写`http://localhost:5244` 则生成的Strm文件为`http://localhost:5244/115_open/Video/电影/再见,李可乐 (2023)/再见,李可乐 (2023) - 2160p.strm`
-
- 此项可默认不填、不填时URL前缀会采用你当前访问的地址作为URL前缀
-
-- **过滤文件类型**:过滤需要生成的strm的文件类型
-
- 目前内置了如下文件类型
-
- ```
- 视频类型
- mp4,mkv,flv,avi,wmv,ts,rmv,web
-
- 音频类型
- mp3,flac,aac,wav,ogg,m4a,wma,alac
- ```
-
- 可以自行补充,多文件类型间采用 **,** 分割
-
-- **编码路径**:是否启用路径编码
-
- 不启用时生成的strm文件为 `http://localhost:5244/115_open/Video/电影/再见,李可乐 (2023)/再见,李可乐 (2023) - 2160p.stm`
-
- 启用时`http://localhost:5244/Video/%E7%94%B5%E5%BD%B1/%E5%86%8D%E8%A7%81%EF%BC%8C%E6%9D%8E%E5%8F%AF%E4%B9%90%20(2023)/%E5%86%8D%E8%A7%81%EF%BC%8C%E6%9D%8E%E5%8F%AF%E4%B9%90%20(2023)%20-%202160p.mkv`
-
-- **不包含URL前缀**:开启后生成的strm文件将不包含URL前缀
-
-- **保存Strm文件至本地**: 开启后访问 strm 驱动中目录或被 strm 驱动挂载的目录时会将 strm 文件保存至本地
-
-- **保存Strm文件本地路径**: strm文件保存的本地路径
-
-:::
+---
+title:
+ en: Generate Strm
+ zh-CN: 生成 strm
+categories:
+ - guide
+ - advanced
+top: 10
+---
+
+
diff --git a/pages/guide/drivers/alias.md b/pages/guide/drivers/alias.md
index a938a69e4..74f94447f 100644
--- a/pages/guide/drivers/alias.md
+++ b/pages/guide/drivers/alias.md
@@ -1,6 +1,6 @@
---
title:
- en: alias
+ en: Alias
zh-CN: 别名(Alias)
icon: iconfont icon-state
# This control sidebar order
@@ -19,557 +19,4 @@ sticky: true
star: true
---
-::: en
-
-**Alias** is a feature that allows multiple different cloud drives or storage paths to be merged into a unified directory. By combining paths, content from different cloud drives or folders can be displayed in the same interface, simplifying access and management.
-
-Except for the **`Download Preview (Read-Only)`** operation, other actions such as **Copy, Delete, Rename, Offline Download, and Upload** are not supported.
-
-For example: Cloud Drive Account 1 and Cloud Drive Account 2 both contain a folder named `Movies`, but the contents of these folders may not be identical.
-
-- **Previously (Virtual Path)**:
-
- You could only mount them to two different paths separately, like:
- - `Cloud Drive 1/Movies`, `Cloud Drive 2/Movies`
- - `Movies/Cloud Drive 1`, `Movies/Cloud Drive 2`
-
-- **Now (Alias)**:
-
- An aggregated folder (Movies) is provided, which can contain content from both Cloud Drive 1 and Cloud Drive 2 simultaneously.
-
-**Display Rules for Folder Content:**
-
-1. **Same-name Merging**: Files (or folders) with the same name will be automatically merged into one.
-2. **Same-name Priority**: When accessing resources, the file (or folder) at the top (earlier) position in the path will be accessed.
- - If files with the same name are merged, when you click **`Play` or `Download`**, the file at the top of the path list (the one using the 302 mode) will be prioritized.
-
-Next, let's explain the **`Same-name Priority²`** access rule. It’s highly recommended to check out the examples.
-
-Let's start with a diagram:
-
-
-
-In the diagram, we can see that two different folders are merged into one. Files and folders with the same name are also combined, and unique ones are displayed separately.
-
-Example explanations:
-
-- **Example 1**: `riluo.jpg` is unique to Cloud Drive 1, so it is shown separately.
-- **Example 2**: Both folders contain a `video` folder, but the contents of these folders will be merged. Subfolders also follow the **same-name merging** display rule.
- - Both folders contain two videos, but one of them has the same name. After merging according to the **same-name merging** rule, three video files will be displayed in total.
-
-:::
-::: zh-CN
-
-**别名(Alias)** 是一种将多个不同云盘或存储路径合并为一个统一目录的功能。通过路径合并,来自不同云盘或文件夹的内容可以在同一界面中展示,从而简化访问和管理。
-
-除了 **`下载预览(只读)`** 操作外,其他操作如 **复制、删除、重命名、离线下载、上传** 均不支持。
-
-例如:云盘账号1和云盘账号2中都包含一个名为`电影`的文件夹,但两者的内容未必完全相同。
-
-- **`以前(虚拟路径)`**:
-
- 在此模式下,您只能将文件夹分别挂载在不同的路径上,例如:
- - `云盘1/电影`、`云盘2/电影`
- - `电影/云盘1`、`电影/云盘2`
-
-- **`现在(别名)`**:
-
- 现在通过 **Alias**,可以创建一个聚合的文件夹(如`电影`),其中同时包含来自云盘1和云盘2的内容。
-
-**展示时文件夹内容规则如下:**
-
-1. **同名合并**:同名的文件夹或文件会自动合并为一个。
-2. **同名优先**:在访问时,如果多个文件夹包含同名文件,系统将优先访问路径列表中排在前面的文件夹。
- - 当您点击 **`播放` 或 `下载`** 时,系统会优先调用路径列表中最前面使用302模式的文件。
-
-为了更清楚理解 **`同名优先²`** 规则,建议查看以下示例。
-
-我们先看一张示意图:
-
-
-
-在图中,两个不同的文件夹被合并为一个文件夹。同名的文件和文件夹会自动合并,而独有的文件则单独展示。
-
-**示例说明:**
-
-- **例1**:`riluo.jpg` 仅存在于云盘1中,因此显示为独有文件。
-- **例2**:两个文件夹都有一个名为`video`的子文件夹。合并后,两个`video`文件夹的内容会合并展示。若其中有同名文件(例如`movie.mp4`),合并后最终展示3个视频文件。
-
-:::
-
-## Filling Method { lang="en" }
-
-## 填写方式 { lang="zh-CN" }
-
-::: en
-There are two ways to fill in:
-
-1. The first one is that you can only fill in the path of the subfolder and the folder with the same name must be used at the end. It is not recommended to use :x:
- - Paths filling example:
- ```
- /file1/locala
- /file2/localb
- ```
-2. The second is to directly mount the root folder path, using the `renaming` method, it is strongly recommended to use :heavy_check_mark:
- - Paths filling example:
-
- ```
- #Example 1 Directly write the root folder
- merge: /file1
- merge: /file2
-
- #Example 2 Mount different path folders for merging
- merge: /file1/localtest233
- merge: /file2/videos/TV series
- merge: /file3 2/TV/Domestic TV Series/Station XX
- ```
-
-According to the second method, we can `merge` and display different folders, which is convenient and quick.
-:::
-
-::: zh-CN
-填写方式有两种:
-
-1. 第一种是只可以填写子文件夹路径并且最后结尾时必须同名文件夹才可以,不推荐使用 :x:
- - `路径`填写示例:
- ```
- /目录1/目录a
- /目录2/目录b
- ```
-2. 第二种是可以直接挂载根文件夹ID,利用`重命名`的方式,强烈推荐使用 :heavy_check_mark:
- - `路径`填写示例:
-
- ```
- #示例1 直接写根文件夹
- 合并显示:/目录1
- 合并显示:/目录2
-
- #示例2 挂载不同路径文件夹进行合并
- 合并显示:/目录1/本地测试233
- 合并显示:/目录2/视频/电视剧
- 合并显示:/目录2/电视/国产电视剧/某某台
- ```
-
-根据第二种这样我们可以将不同的文件夹进行合并显示,方便快捷。
-:::
-
----
-
-::: en
-Example 1. Fill in the access according to the following path(302 mode has priority)
-
-```
-local: /localtest/local1
-local: /localtest/local2
-local: /localtest/local3
-local: /localtest/local4
-```
-
-- 1, if there is a video 1 2 3 4, each visit is `1`
- - If 1 3 4 uses the local proxy and 2 uses `302`, call 2 first
-- 2, a video 3 4 yes then every visit is `3`
- - If 3 uses a local proxy and 4 uses `302`, call 4 first
-
-:::
-
-::: zh-CN
-例1、 根据下面路径填写访问(302模式有优先权)
-
-```
-本地:/本地测试/本地1
-本地:/本地测试/本地2
-本地:/本地测试/本地3
-本地:/本地测试/本地4
-```
-
-1. 一个视频 1 2 3 4 都有的话每次访问的是 `1`
- - 如果1 3 4 使用的本地代理,2 使用的`302`,优先调用 2
-
-2. 一个视频 3 4 有 那么每次访问的都是`3`
- - 如果 3 使用的本地代理,4 使用的`302`,优先调用 4
-
-:::
-
----
-
-::: en
-
-Example 2. Fill in the access according to the following path(302 mode has priority)
-
-```
-local: /localtest/local4
-local: /localtest/local3
-local: /localtest/local2
-local: /localtest/local1
-```
-
-1. if a video has 1 2 3 4, each visit is `4`
- - If 1 3 4 uses the local proxy and 2 uses `302`, call 2 first
-
-2. a video 3 4 has then every visit is `4`
- - If 4 uses a local proxy and 2 uses `302`, call 2 first
-
-:::
-
-::: zh-CN
-例2、根据下面的路径填写访问(302模式有优先权)
-
-```
-本地:/本地测试/本地4
-本地:/本地测试/本地3
-本地:/本地测试/本地2
-本地:/本地测试/本地1
-```
-
-1. 一个视频 1 2 3 4 都有的话每次访问的是 `4`
- - 如果1 3 4 使用的本地代理,2 使用的`302`,优先调用 2
-
-2. 一个视频 2 4 有 那么每次访问的都是`4`
- - 如果 4 使用的本地代理,2 使用的`302`,优先调用 2
-
-:::
-
----
-
-::: en
-Example 3. Fill in the access according to the following path(302 mode has priority)
-
-Of course, it is not limited to only 2 folders, just write according to personal needs
-
-```
-Local test:/local1/video
-Local test:/local2/video
-Test other:/test3/images
-Test other:/test4/video/tv
-```
-
-1. local1 local2 merged together
- - If 2 uses a local proxy and 1 uses `302`, call 2 first
-
-2. Test 3 and Test 4 merged together
-
-- If 3 uses a local proxy and 4 uses `302`, call 4 first
-
-3. In the above two cases, two different folders will appear for display, which will be displayed as follows without interfering with each other
-
-
-
-:::
-
-::: zh-CN
-
-例3、根据下面的路径填写访问(302模式有优先权)
-
-当然了不限于只有2个文件夹,根据个人需求来写即可
-
-```
-本地测试:/本地1/video
-本地测试:/本地2/video
-测试其他:/测试3/images
-测试其他:/测试4/video/电视
-```
-
-1. 本地1 本地2 合并在一起了
- - 如果2 使用的本地代理,1 使用的`302`,优先调用 2
-
-2. 测试3 测试4 合并在一起了
- - 如果3 使用的本地代理,4 使用的`302`,优先调用 4
-
-3. 以上两种情况会出现两个不同的文件夹来展示,会如下展示,不会互相干扰
-
-
-
-:::
-
-## The download method to use { lang="en" }
-
-## 使用的下载方式 { lang="zh-CN" }
-
-::: en
-When adding **`alias`**, `Web Proxy` and `Webdav Policy` are not modified by default. The storage path filled in the Paths path can be `302`, `Local Proxy`, `Download Proxy URL`, three modes Mixed Playback Mixed Playback is possible.
-
-If you checked `Web Proxy`, the storage filled in by the Paths path, if there is a 302 mode playback, it will be played in transit (local proxy mode) at that time, and it will become a proxy mode. If the Webdav policy is also changed, it will also change.
-
-Of course, it is up to you to choose whether to change the mode.
-:::
-::: zh-CN
-添加 **`别名-alias`** 时 `Web代理` 和 `Webdav策略` 默认不修改的情况下 Paths路径填写的存储路径可以 `302`,`本地代理`,`下载代理URL`,三种模式混合播放可以进行混合播放。
-
-如果你勾选了`Web代理` ,Paths路径填写的存储 如果有302模式播放的 到时候都会进行中转(本地代理模式)播放,变成代理模式,Webdav策略如果也进行了改动也会进行变化。
-
-当然,是否选择更换模式您自己进选择。
-:::
-
-### What if you don’t know how the cloud disks you added are different? { lang="en" }
-
-### 如果你不知道你添加的云盘是什么方式怎么办? { lang="zh-CN" }
-
-::: en
-
-1. You can go to the bottom of the corresponding document to view the document, there is a flow chart description
- - If there is a 302, the 302 method is used by default. If there are only local proxy and download proxy URLs, the default is to use the local proxy, provided that you have not manually selected
-2. You can check when adding storage, select the corresponding storage to view, for example, let’s check the methods of Alibaba Cloud and 115 respectively
- - As you can see from the figure below, Alibaba Cloud Disk has the option of `web proxy`, and `webdav policy` defaults to 302. It can be judged that Alibaba Cloud Disk uses the 302 method by default
- - As you can see from the figure below, the 115 network disk does not have the option of `web proxy`, and the `webdav strategy` defaults to the local proxy. It can be judged that the 115 network disk uses the local proxy mode by default
- 
-
-:::
-
-::: zh-CN
-
-1. 可以前往文档的相对应的文档最底部查看,有一份流程图说明
- - 如果有302的就是默认使用302方式,如果只有本地代理和下载代理URL默认的就是使用本地代理,前提是你没有进行手动选择
-2. 可以前往添加存储时进行查看,选择对应的存储进行查看,例如我们查看一下阿里云和115分别是什么方式
- - 从下图中看到,阿里云盘有 `web代理`选择,`webdav策略`默认是302,可以判断出阿里云盘默认使用的是302方式
- - 从下图中看到,115网盘没有 `web代理`选择,`webdav策略`默认是本地代理,可以判断出115网盘默认使用的是本地代理方式
- 
-
-:::
-
-## other instructions { lang="en" }
-
-## 其他说明 { lang="zh-CN" }
-
-::: en
-
-If you are using `Windows`, the following situation will occur, and folders with different capitalization will also be regenerated.
-
-For example, Local 1 and Local 2 have a lowercase v for `video` respectively, and the folder OneDrive has an uppercase V `Video` folder.
-
-Then a lowercase video folder will be generated, which contains only `local 1, local 2` files merged by two folders.
-
-At the same time, the uppercase `Video` will gather the files of the three folders.
-
-This is because Windows is case-insensitive, video and Video will be considered as the same folder, you will not have this problem if you switch to Linux or Mac.
-
-Aliases are not supported for load balancing for the time being (if it is supported later, the document will be modified here, if it is not modified, it is not yet supported).
-
-:::
-
-::: zh-CN
-如果你是使用的`Windows`,会出现如下情况,有大小写不同的文件夹也会进行二次生成。
-
-例如本地1,本地2 分别有 `video` 小写的v ,文件夹 OneDrive 有一个大写的 V `Video` 文件夹。
-
-然后会生成一个小写的 `video` 文件夹里面只有 `本地1,本地2` 两个的文件夹所合并的文件。
-
-同时大写的 `Video` 里面 会集合三个文件夹的文件
-
-这是因为 Windows 大小写不敏感,video和Video会被认为是同一个文件夹,你换成 Linux 或者 Mac 就不会有这个问题了
-
-暂时不支持别名进行负载均衡(后期若支持了这里会进行文档修改,如果没有修改就是还不支持)
-
-:::
-
-## Proxy Range { lang="en" }
-
-## 代理 Range { lang="zh-CN" }
-
-::: en
-You need to enable `Web Proxy` or` Webdav Native Proxy` to take effect. Currently only applicable to:`alias`、`139Yun`、`OpenList V3`.
-
-- The `139Yun` driver, when this option is enabled, can resolve issues that occur when a proxy is enabled but the download link does not return the correct HTTP status code, such as problems with video playback or lack of support for resume downloads.
-- The `Alias` driver is added to meet specific use cases, for example, when `139Yun` uses a 302 redirect. By enabling the `Alias` proxy, downloads can use `139Yun` with the 302 redirect, while video playback can use the proxy-enabled `Alias`, reducing unnecessary load.
-- The `OpenList` driver is added to support server-side OpenList mounting with `139Yun` using a 302 redirect. Locally, OpenList can be mounted via the proxy-enabled `OpenList` to access the server's OpenList for video playback, etc., to avoid consuming server bandwidth. This also allows for data-free video streaming on mobile networks.
-
-:::
-
-::: zh-CN
-需要先启用 `Web代理` 或者 `Webdav本地代理` 才会生效。目前仅适用于:`别名`、`中国移动云盘`、`OpenList V3`。
-
-- `139Yun` 驱动开启这个选项后,可解决即使开启代理但下载链接没有返回正确的http状态码导致的一些问题,例如视频无法播放、不支持断点续传等
-- `Alias` 驱动添加是为了满足某些场景,例如 `139Yun` 走302, 然后通过 开启代理的 `Alias` 后,下载用 `139Yun` 走302,播放视频用 开启代理的 `Alias`,减少不必要的负载
-- `OpenList` 驱动添加是为了 服务器的 OpenList 挂载 `139Yun` 走302,然后本地的 OpenList 通过 开启代理的 `OpenList` 挂载 服务器的 OpenList 播放视频等,达到不消化服务器流量的目的,移动卡还能免流
-
-:::
-
-## Protect same name { lang="en" }
-
-## 同名保护 { lang="zh-CN" }
-
-::: en
-Now alias supports the two operations of `Delete` and` Rename`,**By default, use**.
-
-File names like file names may appear in the alias. For folders with the same folder name, you cannot `Delete` or `Rename` when the `Protect same name` is opened.
-
-:::
-
-::: zh-CN
-现在别名支持 `删除`、`重命名`两个操作,**默认开启**。
-
-别名中可能会出现文件名一样的文件,对于文件夹名一致的文件夹,在`同名保护`开启状态下无法删除或者重命名。
-:::
-
-### Protect same name Use for example { lang="en" }
-
-### 同名保护使用举例 { lang="zh-CN" }
-
-::: en
-We fill in the two folders of `a` and` b` to the alias options.
-
-```
-a/ b/ alias
-a/1.png b/1.png alias/1.png
-a/2.mp3 b/2.mp3 alias/2.mp3
-a/3.mp4 b/3.mp4 ----> alias/3.mp4
-a/4.mkv b/4.mkv ----> alias/4.mkv
-a/5.bin b/6.css alias/5.bin ---> According to the rule, aliases in directories listed earlier take precedence, and files with different names in separate folders are given priority.
- alias/6.css
-```
-
-If we attempt to Rename or Delete a file named `1.png` while the `Protect same name` feature is enabled, the following message will be displayed in the top right corner:
-
-
-
- - same-name files cannot be Rename
- - same-name files cannot be Delete
-
-
-
-If we turn off the options of `Protect Same Name`, change to` a/1.png` to `a/11.png` will become the following display
-
-- Because both folders a and b contain the same files, "rename" and "download" will prioritize the folder listed first when filling out the form. Similarly, renaming conflicts will be resolved by modifying the file in the folder listed first.
-
-```
-a/ b/ alias
-a/1.png b/1.png alias/11.png
-a/2.mp3 b/2.mp3 alias/2.mp3
-a/3.mp4 b/3.mp4 ----> alias/3.mp4
-a/4.mkv b/4.mkv ----> alias/4.mkv
-a/5.bin b/6.css alias/5.bin
- alias/1.png ---> Because the b folder is in the rear, the file list display is relatively backward
- alias/6.css
-```
-
-If you really do n’t understand, you can test it yourself and then install the production environment by yourself
-
-:::
-
-::: zh-CN
-
-我们分别将 `a`和`b`两个文件夹填写到别名选项中
-
-```
-a/ b/ alias
-a/1.png b/1.png alias/1.png
-a/2.mp3 b/2.mp3 alias/2.mp3
-a/3.mp4 b/3.mp4 ----> alias/3.mp4
-a/4.mkv b/4.mkv ----> alias/4.mkv
-a/5.bin b/6.css alias/5.bin ---> 根据规则别名目录靠前的,不同文件夹中不同名的文件靠前
- alias/6.css
-```
-
-如果我们在 `同名保护` 开启状态下把同名文件 `1.png` 进行重名名或者删除会提示如下信息在右上角
-
-
-
- - same-name files cannot be Rename / 同名文件无法重命名
- - same-name files cannot be Delete / 同名文件无法删除
-
-
-
-如果我们把 `同名保护` 选项关闭,将 `a/1.png`改成 `a/11.png` 会变成如下展示
-
-- 因为a/b两个文件夹都有一样的文件,`重命名`和`下载`一样优先下载填写时候靠前的文件夹,同理重名修改也是先修改靠前文件夹中的文件
-
-```
-a/ b/ alias
-a/1.png b/1.png alias/11.png
-a/2.mp3 b/2.mp3 alias/2.mp3
-a/3.mp4 b/3.mp4 ----> alias/3.mp4
-a/4.mkv b/4.mkv ----> alias/4.mkv
-a/5.bin b/6.css alias/5.bin
- alias/1.png ---> 因为b文件夹靠后,所以文件列表展示页靠后
- alias/6.css
-```
-
-实在不懂 可以自行本地测试一下再进行生产环境实装
-
-:::
-
-## Download concurrency, Download part size { lang="en" }
-
-## 下载并发、下载分片大小 { lang="zh-CN" }
-
-::: en
-**Storage Settings:**
-
-- Alias (Alias) Drive
-- Local Proxy
-- Path: / Cloud Drive Mount Path
-- Download Concurrency: 10
-- Download Chunk Size: 1024
-
-**Effect:**
-
-- Client → OpenList Alias Drive: Uses 1 connection
-- OpenList Alias Drive → Cloud Drive: Supports 10 concurrent connections, with actual concurrency limited by the cloud drive.
-
-```mermaid
-graph LR
- A[Client] -->|Connection 1| B[OpenList Alias Drive]
-
- B -->|Concurrent Connection 1| C[Cloud Drive]
- B -->|Concurrent Connection 2| C
- B -->|Concurrent Connection 3| C
- B -->|Concurrent Connection 4| C
- B -->|Concurrent Connection 5| C
- B -->|Concurrent Connection 6| C
- B -->|Concurrent Connection 7| C
- B -->|Concurrent Connection 8| C
- B -->|Concurrent Connection 9| C
- B -->|Concurrent Connection 10| C
-```
-
-- Single-threaded speed is slower, but it supports concurrency: Using the alias drive allows concurrent downloads, significantly improving speed.
-- Video watching and download acceleration: The experience is enhanced by increasing concurrency.
-- Copying from alias drive to other drives: File transfer is also accelerated in this case.
-
-**Friendly Reminder:** Please do not abuse this feature. Excessive use may cause abnormal activity on the cloud drive account, and you will bear the consequences.
-
-**Configuration Options:**
-
-- max_concurrency: Sets the maximum concurrency for the local proxy. The default is 64, and setting it to 0 means no limit on concurrency.
-
-:::
-::: zh-CN
-**存储设置:**
-
-- 别名 (Alias) 驱动
-- 本地代理
-- 路径:/云盘挂载路径
-- 下载并发数:10
-- 下载分片大小:1024
-
-**效果:**
-
-- 客户端 → OpenList 别名驱动:使用1个连接
-- OpenList 别名驱动 → 云盘:支持10个并发连接,实际并发数受云盘限制
-
-```mermaid
-graph LR
-A[客户端] -->|连接1| B[OpenList别名驱动]
-
- B -->|并发连接1| C[云盘]
- B -->|并发连接2| C
- B -->|并发连接3| C
- B -->|并发连接4| C
- B -->|并发连接5| C
- B -->|并发连接6| C
- B -->|并发连接7| C
- B -->|并发连接8| C
- B -->|并发连接9| C
- B -->|并发连接10| C
-```
-
-- 单线程速度较慢,但支持并发:通过别名驱动可实现并发下载,显著提升速度
-- 视频观看、下载加速:通过并发连接提升体验
-- 从别名驱动复制到其他驱动:同样能够加速文件传输
-
-**温馨提示**:请勿滥用该功能,过度使用可能导致云盘账号异常,后果自负。
-
-**配置选项:**
-
-- `max_concurrency`:设置本地代理的最大并发数,默认为 64,设置为 0 表示不限制并发数。
-
-:::
+
diff --git a/pages/guide/drivers/alias_text.md b/pages/guide/drivers/alias_text.md
new file mode 100644
index 000000000..86c6c72da
--- /dev/null
+++ b/pages/guide/drivers/alias_text.md
@@ -0,0 +1,615 @@
+::: en
+
+**Alias** is a feature that allows multiple different cloud drives or storage paths to be merged into a unified directory. By combining paths, content from different cloud drives or folders can be displayed in the same interface, simplifying access and management.
+
+For example: Cloud Drive Account 1 and Cloud Drive Account 2 both contain a folder named `Movies`, but the contents of these folders may not be identical.
+
+- **Previously (Virtual Path)**:
+
+ You could only mount them to two different paths separately, like:
+ - `CloudDrive1/Movies`, `CloudDrive2/Movies`
+ - `Movies/CloudDrive1`, `Movies/CloudDrive2`
+
+- **Now (Alias)**:
+
+ An aggregated folder (Movies) is provided, which can contain content from both Cloud Drive 1 and Cloud Drive 2 simultaneously.
+
+Folders with the same name will be automatically merged into one. The contents of the folder are the sum of the contents of all folders with the same name. Regarding how this driver handles files with the same name, please refer to the [Path conflict policies](/guide/drivers/alias#path-conflict-policies) section later.
+
+For Example:
+
+
+
+In the diagram, we can see that two different folders are merged into one. Files and folders with the same name are also combined, and unique ones are displayed separately.
+
+Example explanations:
+
+- **Example 1**: `riluo.jpg` is unique to Cloud Drive 1, so it is shown separately.
+- **Example 2**: Both folders contain a `video` folder, but the contents of these folders will be merged. Subfolders also follow the **same-name merging** display rule. Both folders contain two videos, but one of them has the same name. After merging according to the **same-name merging** rule, three video files will be displayed in total.
+
+:::
+::: zh-CN
+
+**别名(Alias)** 是一种将多个不同云盘或存储路径合并为一个统一目录的功能。通过路径合并,来自不同云盘或文件夹的内容可以在同一界面中展示,从而简化访问和管理。
+
+例如:云盘账号1和云盘账号2中都包含一个名为`电影`的文件夹,但两者的内容未必完全相同。
+
+- **`以前(虚拟路径)`**:
+
+ 在此模式下,您只能将文件夹分别挂载在不同的路径上,例如:
+ - `云盘1/电影`、`云盘2/电影`
+ - `电影/云盘1`、`电影/云盘2`
+
+- **`现在(别名)`**:
+
+ 现在通过**别名**,可以创建一个聚合的文件夹(如`电影`),其中同时包含来自云盘1和云盘2的内容。
+
+同名的文件夹或文件会自动合并为一个。文件夹的内容为所有同名文件夹内容的总和,关于本驱动如何处理同名文件,请参考后文[路径冲突策略](/guide/drivers/alias#路径冲突策略)章节。
+
+例如:
+
+
+
+在图中,两个不同的文件夹被合并为一个文件夹。同名的文件和文件夹会自动合并,而独有的文件则单独展示。
+
+**示例说明:**
+
+- **例1**:`riluo.jpg` 仅存在于云盘1中,因此显示为独有文件。
+- **例2**:两个文件夹都有一个名为`video`的子文件夹。合并后,两个`video`文件夹的内容会合并展示。若其中有同名文件(例如`movie.mp4`),合并后最终展示3个视频文件。
+
+:::
+
+## Paths filling method { lang="en" }
+
+## 路径填写方式 { lang="zh-CN" }
+
+::: en
+There are two ways to fill in:
+
+1. The first one is that you can only fill in the path of the subfolder and the folder with the same name must be used at the end. It is not recommended to use :x:
+ - Paths filling example:
+ ```
+ /file1/locala
+ /file2/localb
+ ```
+2. The second is to directly mount the root folder path, using the `renaming` method, it is strongly recommended to use :heavy_check_mark:
+ - Paths filling example:
+
+ ```
+ #Example 1 Directly write the root folder
+ merge: /file1
+ merge: /file2
+
+ #Example 2 Mount different path folders for merging
+ merge: /file1/localtest233
+ merge: /file2/videos/TV series
+ merge: /file3 2/TV/Domestic TV Series/Station XX
+ ```
+
+According to the second method, we can `merge` and display different folders, which is convenient and quick.
+:::
+
+::: zh-CN
+填写方式有两种:
+
+1. 第一种是只可以填写子文件夹路径并且最后结尾时必须同名文件夹才可以,不推荐使用 :x:
+ - `路径`填写示例:
+ ```
+ /目录1/目录a
+ /目录2/目录b
+ ```
+2. 第二种是可以直接挂载根文件夹ID,利用`重命名`的方式,强烈推荐使用 :heavy_check_mark:
+ - `路径`填写示例:
+
+ ```
+ #示例1 直接写根文件夹
+ 合并显示:/目录1
+ 合并显示:/目录2
+
+ #示例2 挂载不同路径文件夹进行合并
+ 合并显示:/目录1/本地测试233
+ 合并显示:/目录2/视频/电视剧
+ 合并显示:/目录2/电视/国产电视剧/某某台
+ ```
+
+根据第二种这样我们可以将不同的文件夹进行合并显示,方便快捷。
+:::
+
+## Path conflict policies { lang="en" }
+
+## 路径冲突策略 { lang="zh-CN" }
+
+::: en
+The three configuration items—**Reading conflict policy**, **Writing conflict policy**, and **Putting conflict policy**—determine how the Alias handles files or folders with the same name and identical paths in the backend drivers. Their values and corresponding behaviors are as follows:
+
+:::
+::: zh-CN
+**读取冲突策略**、**写入冲突策略**和**上传冲突策略**三个配置项确定了别名驱动如何处理后端驱动中路径相同的同名文件或文件夹,其值与对应的行为如下:
+
+:::
+
+### Reading conflict policy { lang="en" }
+
+### 读取冲突策略 { lang="zh-CN" }
+
+::: en
+Determines the behavior for handling files with the same name when downloading, copying (as source files), and extracting (as source files) (excluding moving).
+
+- Get the file corresponding to the first conflict path: Select the file from the first available path (from top to bottom in the Paths) where the file exists.
+
+- Load balancing on a per-file basis: Randomly select one file from the available duplicates.
+
+- Load balancing on a per-part basis:
+ - During 302 downloads, copying, or extracting, it falls back to the **Load balancing on a per-file basis** strategy.
+ - When using local proxy downloads, each transmitted chunk is randomly assigned to one of the duplicate files. This requires the backend driver to support Range requests. For details on setting the chunk size, refer to the section [Download concurrency, Download part size](/guide/drivers/alias#download-concurrency-download-part-size).
+ - This policy achieves the actual effect as shown in the figure. It is important to note that this diagram is only intended to conveniently demonstrate the operation of this policy. The statement that "participating load-balanced files with the same name have different contents" is **not** a correct usage of this driver. OpenList does not guarantee stable or correct results under such circumstances, nor will it address any issues arising from this usage scenario. Furthermore, the actual minimum size for file splitting is 1 KiB, not 1 byte, so the effect depicted in the diagram will not occur in the stable version.
+
+ 
+
+::: tip
+When a copy operation involves multiple source paths and target paths, the Alias will first attempt to pair source and target paths that belong to the same drive. Only for target paths that cannot be matched in this way will the method specified by the **Reading conflict policy** be used to select a source path.
+
+For example, when copying:
+
+- `DriverA/source/file.txt`
+- `DriverB/source/file.txt`
+
+to:
+
+- `DriverB/target/`
+- `DriverA/target/`
+- `DriverC/target/`
+
+The Alias driver will perform the following operations:
+
+1. Copy `DriverA/source/file.txt` to `DriverA/target/`, since both are located in Driver A.
+2. Copy `DriverB/source/file.txt` to `DriverB/target/`, since both are located in Driver B.
+3. For `DriverC/target/`, which has no matching source in the same driver, select `file.txt` from either Driver A or Driver B according to the **Reading conflict policy**, and copy it to `DriverC/target/` via an upload operation (creating a copy task).
+
+:::
+::: en
+::: tip
+The move operation involves a matching process similar to that of the copy operation. For target paths that cannot be matched with a source path from the same driver, the Alias will randomly select from the still-unmatched source paths to create a pairing (**one-to-one correspondence**). If the number of source paths exceeds the number of target paths, the unmatched source paths will be deleted. If the number of source paths is less than the number of target paths, the move operation will fail. The matching behavior for the move operation is not affected by the **Reading conflict policy**.
+
+For example, in the case described for the copy operation, since there is no source path corresponding to `DriverC/target/`, the move operation will fail.
+
+As another example, when moving:
+
+- `DriverA/source/file.txt`
+- `DriverB/source/file.txt`
+- `DriverD/source/file.txt`
+- `DriverE/source/file.txt`
+- `DriverG/source/file.txt`
+
+to:
+
+- `DriverA/target/`
+- `DriverB/target/`
+- `DriverC/target/`
+- `DriverF/target/`
+
+The Alias will perform the following operations:
+
+1. Move `DriverA/source/file.txt` to `DriverA/target/`.
+2. Move `DriverB/source/file.txt` to `DriverB/target/`.
+3. Randomly select one file from Driver D, E, or G, and move it to `DriverC/target/` (by creating a move task, which is essentially an upload followed by deletion). Let's assume E is selected.
+4. Randomly select one file from the remaining unmatched drivers (D or G), and move it to `DriverF/target/`. Let's assume G is selected.
+5. Delete `DriverD/source/file.txt`.
+
+:::
+::: zh-CN
+影响下载、复制(作为源文件)、解压(作为源文件)(没有移动)同名文件的方式。
+
+- 读取首个有效路径:选择填写的所有路径中从上到下第一个存在该文件的路径中的同名文件。
+- 按文件负载均衡:随机选择一个同名文件。
+- 按分片负载均衡:
+ - 当 302 下载、复制、解压时,降级为**按文件负载均衡**策略。
+ - 当本地代理下载时,传输的每个分片随机选择一个同名文件,要求后端驱动支持 Range 请求。设置分片的大小见章节[下载并发、下载分片大小](/guide/drivers/alias#下载并发、下载分片大小)。
+ - 本策略实现的实际效果如图所示。需要注意的是,本图只是为了方便地展示本策略的运行效果,“参与负载均衡的同名文件具有不同的内容”**不是**本驱动的正确用法,OpenList 不保证这种情况下程序会产生稳定、正确的结果,也不会解决这种使用场景下出现的任何问题。此外,实际文件分片的最小大小为 1 KiB 而非 1 字节,因此图中这种效果在稳定版本中是不会出现的。
+
+ 
+
+::: tip
+复制操作存在多个源路径和目标路径时,会优先选择驱动相同的源路径与目标路径为一组进行复制,仅对未获得匹配的目标路径采用**读取冲突策略**给出的方案选择源路径。
+
+例如将
+
+- 驱动A/source/file.txt
+- 驱动B/source/file.txt
+
+复制到
+
+- 驱动B/target/
+- 驱动A/target/
+- 驱动C/target/
+
+则别名会执行以下操作:
+
+1. 由于均位于驱动 A,复制`驱动A/source/file.txt`到`驱动A/target/`。
+2. 由于均位于驱动 B,复制`驱动B/source/file.txt`到`驱动B/target/`。
+3. 按照**读取冲突策略**给出的方案选择驱动 A 或 B 中的`file.txt`,通过上传的方式(创建复制任务)复制到`驱动C/target/`。
+
+:::
+::: zh-CN
+::: tip
+移动操作存在与复制操作类似的匹配过程,对于未获得匹配的目标路径,随机选择同样未被匹配的源路径进行匹配(**一一对应**),源路径数量超过目标路径时,未得到匹配的源路径会被删除,源路径数量少于目标路径时,移动操作会失败。移动操作的匹配行为不会受到**读取冲突策略**的影响。
+
+例如,对于复制操作给出的案例,由于不存在与`驱动C/target/`对应的源路径,移动操作将失败。
+
+再例如,将
+
+- 驱动A/source/file.txt
+- 驱动B/source/file.txt
+- 驱动D/source/file.txt
+- 驱动E/source/file.txt
+- 驱动G/source/file.txt
+
+移动到
+
+- 驱动A/target/
+- 驱动B/target/
+- 驱动C/target/
+- 驱动F/target/
+
+则别名会执行以下操作:
+
+1. 移动`驱动A/source/file.txt`到`驱动A/target/`。
+2. 移动`驱动B/source/file.txt`到`驱动B/target/`。
+3. 随机选择驱动 D、E、G 中的一个,移动到`驱动C/target/`(创建移动任务,事实上是先上传后删除),假设选中 E。
+4. 随机选择驱动 D、G 中的一个,移动到`驱动F/target/`,假设选中 G。
+5. 删除`驱动D/source/file.txt`。
+
+:::
+
+### Writing conflict policy { lang="en" }
+
+### 写入冲突策略 { lang="zh-CN" }
+
+::: en
+Determines the behavior for renaming or deleting files/folders with the same name, as well as creating folders within identically named folders.
+
+- **Disable writing**: Prohibits rename, delete, and folder creation operations.
+- **Write into the first conflict path**: Operates on the driver containing the target path that appears first (top to bottom) in the configured path list.
+- **Allow unique path**: Executes the operation only if the target path is unique (exists in only one backend path). Otherwise, the operation is prohibited.
+- **Allow full conflict paths**: Executes the operation only if the target path exists in **all** configured backend paths, applying the operation across all of them. Otherwise, the operation is prohibited.
+- **Allow unique path and full conflict paths**: Allows the operation when the target path is either unique or exists in all configured backend paths.
+- **Write into all conflict paths**: Forwards the operation to all backend paths where the target path exists.
+
+::: tip
+If the above explanation is unclear, you can refer to the following example.
+
+- In Driver A, the file exists: `file1.txt`
+- In Driver B, the files exist: `file1.txt`, `file2.txt`, `file3.txt`
+- In Driver C, the files exist: `file1.txt`, `file3.txt`
+
+Configured backend paths:
+
+```
+test:DriverA
+test:DriverB
+test:DriverC
+```
+
+Then:
+
+- Since the sub-path `/file1.txt` is valid in all configured paths (`DriverA/`, `DriverB/`, `DriverC/`), `/file1.txt` is referred to as a **full conflict path**.
+- Since the sub-path `/file2.txt` is valid only under the single backend path `DriverB/`, `/file2.txt` is referred to as a **non-conflict path** or **unique path**.
+- Since the sub-path `/file3.txt` exists under both `DriverB/` and `DriverC/`, and the number of backend paths where it exists is neither 1 nor the maximum (3), `/file3.txt` is neither a non-conflict path nor a full conflict path.
+
+When renaming any file to `file4.txt`, the corresponding files in the following drivers will be renamed:
+
+| Writing conflict policy | file1.txt | file2.txt | file3.txt |
+| ----------------------------------------- | ---------------------------- | --------- | ------------------ |
+| Disable writing | Fails | Fails | Fails |
+| Write into the first conflict path | Driver A | Driver B | Driver B |
+| Allow unique path | Fails | Driver B | Fails |
+| Allow full conflict paths | Driver A, Driver B, Driver C | Fails | Fails |
+| Allow unique path and full conflict paths | Driver A, Driver B, Driver C | Driver B | Fails |
+| Write into all conflict paths | Driver A, Driver B, Driver C | Driver B | Driver B, Driver C |
+
+:::
+::: zh-CN
+影响重命名、删除同名文件或文件夹,在同名文件夹下创建文件夹的方式。
+
+- 禁用:禁止重命名、删除和创建文件夹操作。
+- 写入首个有效路径:操作填写的所有路径中从上到下第一个存在操作路径的驱动。
+- 仅允许不冲突路径:如果操作路径唯一,执行操作,否则禁止执行操作。
+- 仅允许全冲突路径:如果操作路径在填写的所有后端路径中都存在,在所有路径中执行操作,否则禁止执行操作。
+- 允许不冲突路径和全冲突路径:允许操作路径唯一和操作路径在所有后端路径中都存在的情况执行操作。
+- 写入所有有效路径:向所有有效路径转发操作。
+
+::: tip
+如果看不懂以上内容,可以参考以下案例。
+
+- 驱动 A 中存在:`file1.txt`
+- 驱动 B 中存在:`file1.txt`、`file2.txt`、`file3.txt`
+- 驱动 C 中存在:`file1.txt`、`file3.txt`
+
+填写后端路径:
+
+```
+test:驱动A
+test:驱动B
+test:驱动C
+```
+
+则:
+
+- 由于填写的所有路径(`驱动A/`、`驱动B/`、`驱动C/`)中,子路径`/file1.txt`均有效,因此称`/file1.txt`为**全冲突路径**。
+- 由于子路径`/file2.txt`只在`驱动B/`这唯一一个后端路径下有效,称`/file2.txt`为**不冲突路径**。
+- 由于子路径`/file3.txt`在`驱动B/`和`驱动C/`下存在,存在的后端路径数量既不为 1,也不为最大(3),因此`/file3.txt`既不是不冲突路径,也不是全冲突路径。
+
+重命名任意文件为`file4.txt`时,以下驱动中的对应文件会被重命名:
+| 写入冲突策略 | file1.txt | file2.txt | file3.txt |
+| -- | -- | -- | -- |
+| 禁用 | 操作失败 | 操作失败 | 操作失败 |
+| 写入首个有效路径 | 驱动A | 驱动B | 驱动B |
+| 仅允许不冲突路径 | 操作失败 | 驱动B | 操作失败 |
+| 仅允许全冲突路径 | 驱动A、驱动B、驱动C | 操作失败 | 操作失败 |
+| 允许不冲突路径和全冲突路径 | 驱动A、驱动B、驱动C | 驱动B | 操作失败 |
+| 写入所有有效路径 | 驱动A、驱动B、驱动C | 驱动B | 驱动B、驱动C |
+
+:::
+
+### Putting conflict policy { lang="en" }
+
+### 上传冲突策略 { lang="zh-CN" }
+
+::: en
+Determines the behavior for uploading to, copying to, moving to, or extracting to folders with the same name.
+
+- **Disable putting**, **Put into the first conflict path**, **Allow unique path**, **Allow full conflict paths**, **Allow unique path and full conflict paths**, **Put into all conflict paths**: These options function identically to their counterparts in the **Writing conflict policy**.
+- **Random load balancing**: Randomly selects one valid path for the upload.
+- **Weighted random load balancing based on remaining space**: Retrieves the remaining free space of all valid paths, skips paths that fail to report free space or have insufficient space for the file being uploaded, and then randomly selects from the remaining valid paths, weighting the choice by their remaining capacity. If none of the valid paths that successfully reported free space have enough capacity for the file, **a random selection is made from among the valid paths that failed to report capacity**.
+- **Strict weighted random load balancing based on remaining space**: Retrieves the remaining free space of all valid paths, skips paths that fail to report free space or have insufficient space for the file being uploaded, and then randomly selects from the remaining valid paths, weighting the choice by their remaining capacity. If none of the valid paths that successfully reported free space have enough capacity for the file, **an error message is returned directly**.
+
+::: tip
+The load balancing mechanisms within the **Reading conflict policy** and the **Putting conflict policy** are two largely unrelated features. Informally speaking, the load balancing in the **Reading conflict policy** is analogous to RAID 1, while the load balancing in the **Putting conflict policy** is analogous to RAID 0. For specific use cases of each, please refer to [Advanced / Load balancing](/guide/advanced/balance).
+
+If you've understood the above, you'll realize that enabling both **Reading Load Balancing** and **Putting Load Balancing** won't make load balancing more balanced. In fact, this configuration produces effects that are hardly any different from enabling only **Putting Load Balancing**.
+
+:::
+::: en
+::: tip
+The legacy version of the Alias used three Boolean configuration items—**Writable**, **Protect same name**, and **Parallel write**—to implement path conflict policy functionality. The correspondence between the legacy configuration and the new configuration is as follows:
+
+- In the legacy configuration, the **Reading conflict policy** was always set to **Get the file corresponding to the first conflict path**.
+- In the legacy configuration, when **Writable** was disabled, both the **Writing conflict policy** and the **Putting conflict policy** were set to **Disabled**.
+- When **Writable** was enabled, the **Writing conflict policy** and the **Putting conflict policy** were both determined as follows:
+ | | Parallel write disabled | Parallel write enabled |
+ | -- | -- | -- |
+ | Protect same name enabled | Allow unique path | Allow unique path and full conflict paths |
+ | Protect same name disabled | Write/Put into the first conflict path | Write/Put into all conflict paths |
+
+:::
+::: zh-CN
+影响上传到、复制到、移动到、解压到同名文件夹的方式。
+
+- 禁用、上传到首个有效路径、只允许不冲突路径、只允许全冲突路径、允许不冲突路径和全冲突路径、上传到所有有效路径:与**写入冲突策略**中的对应选项相同。
+- 随机负载均衡:随机选择一个有效路径上传。
+- 按容量加权随机负载均衡:获取所有有效路径的剩余空间大小,跳过未成功获取剩余空间,或剩余空间不足以容纳被上传文件的路径,剩余有效路径以剩余空间大小为权重随机选择。如果所有成功获取剩余空间的有效路径都没有足够的空间以容纳上传中的文件,**在未成功获取容量的有效路径中随机选择一个上传**。
+- 严格按容量加权随机负载均衡:获取所有有效路径的剩余空间大小,跳过未成功获取剩余空间,或剩余空间不足以容纳被上传文件的路径,剩余有效路径以剩余空间大小为权重随机选择。如果所有成功获取剩余空间的有效路径都没有足够的空间以容纳上传中的文件,**直接返回错误信息**。
+
+::: tip
+**读取冲突策略**和**上传冲突策略**中的负载均衡是两个没什么关系的功能,不严谨的讲,**读取冲突策略**的负载均衡类似 RAID 1,**上传冲突策略**的负载均衡类似 RAID 0。关于二者的具体使用案例见[高级设置/负载均衡](/guide/advanced/balance)。
+
+一旦理解了上述原理,你就会明白同时开启**读取负载均衡**和**上传负载均衡**并不能让你负载得均均又衡衡,这种配置产生的效果和仅开启**上传负载均衡**没有什么太大的区别。
+
+:::
+::: zh-CN
+::: tip
+旧版别名驱动使用**可写**、**保护同名**和**并行写入**三个布尔配置项实现路径冲突策略功能,旧版配置与新版配置的对应关系如下:
+
+- 在旧版配置中,**读取冲突策略**总为**读取首个有效路径**。
+- 在旧版配置中,当**可写**关闭时,**写入冲突策略**与**上传冲突策略**均为**禁用**。
+- 当**可写**开启时,**写入冲突策略**与**上传冲突策略**均为
+ | | 关闭并行写入 | 开启并行写入 |
+ | -- | -- | -- |
+ | 开启保护同名 | 仅允许不冲突路径 | 允许不冲突路径和全冲突路径 |
+ | 关闭保护同名 | 写入/上传到首个有效路径 | 写入/上传到所有有效路径 |
+
+:::
+
+## File consistency check { lang="en" }
+
+## 文件一致性校验 { lang="zh-CN" }
+
+::: en
+When enabled, the driver will filter out paths where the **size or hash value** differs from other copies during the process of collecting valid paths. This is a safety measure, and whether it is enabled has relatively minor impact. It is recommended to enable this option when using the **Load balancing on a per-part basis** reading policy.
+
+Regardless of whether this option is enabled, the Alias does not actively calculate file hashes. Instead, it performs a best-effort match using the hash values returned by the backend drivers.
+
+Different types of hash values returned by backend drivers will not lead to misjudgment. For example, if Driver 1 returns the MD5 of a file and Driver 2 returns the SHA1 of the file, even with this option enabled, the Alias will not consider either path from Driver 1 or Driver 2 invalid simply because the file's MD5 and SHA1 are not equal.
+
+:::
+::: zh-CN
+开启时,驱动在收集有效路径的过程中,会过滤掉那些**大小或哈希值**与其它副本不同的路径,是一种安全措施,开启与否影响不太大,推荐使用**按分片负载均衡**读取策略时打开。
+
+无论是否启用该选项,别名都不会主动计算文件的哈希值,而是使用后端驱动返回的哈希值做尽力而为的匹配。
+
+后端驱动返回不同种类的哈希值不会导致误判。例如驱动 1 返回了文件的 MD5,驱动 2 返回了文件的 SHA1,即便开启本选项,别名也不会因为文件的 MD5 与 SHA1 不相等而判定驱动 1 或 2 中的任何一个路径无效。
+
+:::
+
+## The download method to use { lang="en" }
+
+## 使用的下载方式 { lang="zh-CN" }
+
+::: en
+When adding **`alias`**, `Web Proxy` and `Webdav Policy` are not modified by default. The storage path filled in the Paths path can be `302`, `Local Proxy`, `Download Proxy URL`, three modes Mixed Playback Mixed Playback is possible.
+
+If you checked `Web Proxy`, the storage filled in by the Paths path, if there is a 302 mode playback, it will be played in transit (local proxy mode) at that time, and it will become a proxy mode. If the Webdav policy is also changed, it will also change.
+
+Of course, it is up to you to choose whether to change the mode.
+:::
+::: zh-CN
+添加 **`别名-alias`** 时 `Web代理` 和 `Webdav策略` 默认不修改的情况下 Paths路径填写的存储路径可以 `302`,`本地代理`,`下载代理URL`,三种模式混合播放可以进行混合播放。
+
+如果你勾选了`Web代理` ,Paths路径填写的存储 如果有302模式播放的 到时候都会进行中转(本地代理模式)播放,变成代理模式,Webdav策略如果也进行了改动也会进行变化。
+
+当然,是否选择更换模式您自己进选择。
+:::
+
+### What if you don’t know how the cloud disks you added are different? { lang="en" }
+
+### 如果你不知道你添加的云盘是什么方式怎么办? { lang="zh-CN" }
+
+::: en
+
+1. You can go to the bottom of the corresponding document to view the document, there is a flow chart description
+ - If there is a 302, the 302 method is used by default. If there are only local proxy and download proxy URLs, the default is to use the local proxy, provided that you have not manually selected
+2. You can check when adding storage, select the corresponding storage to view, for example, let’s check the methods of Alibaba Cloud and 115 respectively
+ - As you can see from the figure below, Alibaba Cloud Disk has the option of `web proxy`, and `webdav policy` defaults to 302. It can be judged that Alibaba Cloud Disk uses the 302 method by default
+ - As you can see from the figure below, the 115 network disk does not have the option of `web proxy`, and the `webdav strategy` defaults to the local proxy. It can be judged that the 115 network disk uses the local proxy mode by default
+ 
+
+:::
+
+::: zh-CN
+
+1. 可以前往文档的相对应的文档最底部查看,有一份流程图说明
+ - 如果有302的就是默认使用302方式,如果只有本地代理和下载代理URL默认的就是使用本地代理,前提是你没有进行手动选择
+2. 可以前往添加存储时进行查看,选择对应的存储进行查看,例如我们查看一下阿里云和115分别是什么方式
+ - 从下图中看到,阿里云盘有 `web代理`选择,`webdav策略`默认是302,可以判断出阿里云盘默认使用的是302方式
+ - 从下图中看到,115网盘没有 `web代理`选择,`webdav策略`默认是本地代理,可以判断出115网盘默认使用的是本地代理方式
+ 
+
+:::
+
+## Proxy Range { lang="en" }
+
+## 代理 Range { lang="zh-CN" }
+
+::: en
+You need to enable `Web Proxy` or` Webdav Native Proxy` to take effect. Currently only applicable to:`alias`、`139Yun`、`OpenList V3`.
+
+- The `139Yun` driver, when this option is enabled, can resolve issues that occur when a proxy is enabled but the download link does not return the correct HTTP status code, such as problems with video playback or lack of support for resume downloads.
+- The `Alias` driver is added to meet specific use cases, for example, when `139Yun` uses a 302 redirect. By enabling the `Alias` proxy, downloads can use `139Yun` with the 302 redirect, while video playback can use the proxy-enabled `Alias`, reducing unnecessary load.
+- The `OpenList` driver is added to support server-side OpenList mounting with `139Yun` using a 302 redirect. Locally, OpenList can be mounted via the proxy-enabled `OpenList` to access the server's OpenList for video playback, etc., to avoid consuming server bandwidth. This also allows for data-free video streaming on mobile networks.
+
+:::
+
+::: zh-CN
+需要先启用 `Web代理` 或者 `Webdav本地代理` 才会生效。目前仅适用于:`别名`、`中国移动云盘`、`OpenList V3`。
+
+- `139Yun` 驱动开启这个选项后,可解决即使开启代理但下载链接没有返回正确的http状态码导致的一些问题,例如视频无法播放、不支持断点续传等
+- `Alias` 驱动添加是为了满足某些场景,例如 `139Yun` 走302, 然后通过 开启代理的 `Alias` 后,下载用 `139Yun` 走302,播放视频用 开启代理的 `Alias`,减少不必要的负载
+- `OpenList` 驱动添加是为了 服务器的 OpenList 挂载 `139Yun` 走302,然后本地的 OpenList 通过 开启代理的 `OpenList` 挂载 服务器的 OpenList 播放视频等,达到不消化服务器流量的目的,移动卡还能免流
+
+:::
+
+## Download concurrency, Download part size { lang="en" }
+
+## 下载并发、下载分片大小 { lang="zh-CN" }
+
+::: en
+**Storage Settings:**
+
+- Alias (Alias) Drive
+- Local Proxy
+- Path: / Cloud Drive Mount Path
+- Download Concurrency: 10
+- Download Chunk Size: 1024
+
+**Effect:**
+
+- Client → OpenList Alias Drive: Uses 1 connection
+- OpenList Alias Drive → Cloud Drive: Supports 10 concurrent connections, with actual concurrency limited by the cloud drive.
+
+```mermaid
+graph LR
+ A[Client] -->|Connection 1| B[OpenList Alias Drive]
+ B -->|Concurrent Connection 1| C[Cloud Drive]
+ B -->|Concurrent Connection 2| C
+ B -->|Concurrent Connection 3| C
+ B -->|Concurrent Connection 4| C
+ B -->|Concurrent Connection 5| C
+ B -->|Concurrent Connection 6| C
+ B -->|Concurrent Connection 7| C
+ B -->|Concurrent Connection 8| C
+ B -->|Concurrent Connection 9| C
+ B -->|Concurrent Connection 10| C
+```
+
+- Single-threaded speed is slower, but it supports concurrency: Using the alias drive allows concurrent downloads, significantly improving speed.
+- Video watching and download acceleration: The experience is enhanced by increasing concurrency.
+- Copying from alias drive to other drives: File transfer is also accelerated in this case.
+
+**Friendly Reminder:** Please do not abuse this feature. Excessive use may cause abnormal activity on the cloud drive account, and you will bear the consequences.
+
+**Configuration Options:**
+
+- max_concurrency: Sets the maximum concurrency for the local proxy. The default is 64, and setting it to 0 means no limit on concurrency.
+
+:::
+::: zh-CN
+**存储设置:**
+
+- 别名 (Alias) 驱动
+- 本地代理
+- 路径:/云盘挂载路径
+- 下载并发数:10
+- 下载分片大小:1024
+
+**效果:**
+
+- 客户端 → OpenList 别名驱动:使用1个连接
+- OpenList 别名驱动 → 云盘:支持10个并发连接,实际并发数受云盘限制
+
+```mermaid
+graph LR
+ A[客户端] -->|连接1| B[OpenList别名驱动]
+ B -->|并发连接1| C[云盘]
+ B -->|并发连接2| C
+ B -->|并发连接3| C
+ B -->|并发连接4| C
+ B -->|并发连接5| C
+ B -->|并发连接6| C
+ B -->|并发连接7| C
+ B -->|并发连接8| C
+ B -->|并发连接9| C
+ B -->|并发连接10| C
+```
+
+- 单线程速度较慢,但支持并发:通过别名驱动可实现并发下载,显著提升速度
+- 视频观看、下载加速:通过并发连接提升体验
+- 从别名驱动复制到其他驱动:同样能够加速文件传输
+
+**温馨提示**:请勿滥用该功能,过度使用可能导致云盘账号异常,后果自负。
+
+**配置选项:**
+
+- `max_concurrency`:设置本地代理的最大并发数,默认为 64,设置为 0 表示不限制并发数。
+
+:::
+
+## Other instructions { lang="en" }
+
+## 其他说明 { lang="zh-CN" }
+
+::: en
+
+If you are using `Windows`, the following situation will occur, and folders with different capitalization will also be regenerated.
+
+For example, Local 1 and Local 2 have a lowercase v for `video` respectively, and the folder OneDrive has an uppercase V `Video` folder.
+
+Then a lowercase video folder will be generated, which contains only `local 1, local 2` files merged by two folders.
+
+At the same time, the uppercase `Video` will gather the files of the three folders.
+
+This is because Windows is case-insensitive, video and Video will be considered as the same folder, you will not have this problem if you switch to Linux or Mac.
+
+:::
+
+::: zh-CN
+如果你是使用的`Windows`,会出现如下情况,有大小写不同的文件夹也会进行二次生成。
+
+例如本地1,本地2 分别有 `video` 小写的v ,文件夹 OneDrive 有一个大写的 V `Video` 文件夹。
+
+然后会生成一个小写的 `video` 文件夹里面只有 `本地1,本地2` 两个的文件夹所合并的文件。
+
+同时大写的 `Video` 里面 会集合三个文件夹的文件
+
+这是因为 Windows 大小写不敏感,video和Video会被认为是同一个文件夹,你换成 Linux 或者 Mac 就不会有这个问题了
+
+:::
diff --git a/pages/guide/drivers/chunk.md b/pages/guide/drivers/chunk.md
index db65bcfbf..38059cc03 100644
--- a/pages/guide/drivers/chunk.md
+++ b/pages/guide/drivers/chunk.md
@@ -101,7 +101,7 @@ If modification is necessary, you must manually change the suffix of all chunks
## 与 Crypt 结合使用 { lang="zh-CN" }
::: en
-If you need to both chunk and encrypt files, it is recommended to encrypt first and then chunk. Specifically, set Remote path of the Crypt driver to the mount path of the chunk driver, and set Remote path of the chunk driver to the actual storage path of the files.
+If you need to both chunk and encrypt files, it is recommended to **encrypt first, then chunk**. Specifically, set Remote path of the [Crypt](/guide/drivers/crypt) driver to the mount path of the **Chunk** driver, and set Remote path of the **Chunk** driver to the actual storage path of the files.
- Best practice:
@@ -138,7 +138,7 @@ To perform emergency recovery on an encrypted file chunked according to the best
:::
::: zh-CN
-如果既需要对文件进行分块,又需要对文件进行加密,推荐先加密后分块,即将 Crypt 驱动的远程存储路径设为分块驱动的挂载路径,将分块驱动的远程存储路径设为文件真实存储路径。
+如果既需要对文件进行分块,又需要对文件进行加密,推荐**先加密后分块**,即将 [Crypt](/guide/drivers/crypt) 驱动的远程存储路径设为**分块**驱动的挂载路径,将**分块**驱动的远程存储路径设为文件真实存储路径。
- 正确实践:
@@ -151,7 +151,7 @@ graph LR
Chunk -->|文件块3| 后端驱动
```
-- 错误实践
+- 错误实践:
```mermaid
graph LR
@@ -173,3 +173,80 @@ graph LR
如果需要紧急恢复按推荐做法分块的加密文件,只需要按顺序直接拼接所有分块,再进行恢复即可。
:::
+
+## Use in combination with Alias { lang="en" }
+
+## 与别名结合使用 { lang="zh-CN" }
+
+::: en
+If you need to store chunked files across multiple load-balanced drivers, you can combine this with the [Alias](/guide/drivers/alias) driver. For details, refer to [Load Balancing / Load balancing by file chunks](/guide/advanced/balance#load-balancing-by-file-chunks).
+
+It's important to note that, unlike the approach used with Crypt, when combining with Alias, the process should be **chunk first, then load balance**. This means setting the Remote path of the **Chunk** driver to the mount path of the **Alias** driver, and setting the paths within the **Alias** driver to the actual file storage paths.
+
+- Best Practice:
+
+```mermaid
+graph LR
+ File[Upload Stream] -->|File1| Chunk
+ File -->|File2| Chunk
+ Chunk -->|File1 Block1, File1 Block2, File1 Block3| Alias
+ Chunk -->|File2 Block1, File2 Block2| Alias
+ Alias -->|File1 Block3| D1[Backend Driver 1]
+ Alias -->|File1 Block2| D2[Backend Driver 2]
+ Alias -->|File1 Block1| D3[Backend Driver 3]
+ Alias -->|File2 Block1| D1
+ Alias -->|File2 Block2| D3
+```
+
+- Bad Practice:
+
+```mermaid
+graph LR
+ File[Upload Stream] -->|File1| Alias
+ File -->|File2| Alias
+ Alias -->|File1| Chunk1[Chunk 1]
+ Alias -->|File2| Chunk2[Chunk 2]
+ Chunk1 -->|File1 Block1| D1[Backend Driver 1]
+ Chunk1 -->|File1 Block2| D1
+ Chunk1 -->|File1 Block3| D1
+ Chunk2 -->|File2 Block1| D2[Backend Driver 2]
+ Chunk2 -->|File2 Block2| D2
+```
+
+:::
+::: zh-CN
+如果需要将分块后的文件在多个负载均衡驱动上存储,可以与[别名](/guide/drivers/alias)结合使用,详见[负载均衡 / 按文件块负载均衡](/guide/advanced/balance#按文件块负载均衡)。
+
+需要注意的是,与结合 Crypt 使用的方案不同,与别名结合使用时,应**先分块后负载均衡**,即将**分块**驱动的远程存储路径设为**别名**驱动的挂载路径,将**别名**驱动的路径设为文件真实存储路径。
+
+- 正确实践:
+
+```mermaid
+graph LR
+ File[上传文件流] -->|文件1| Chunk[分块]
+ File -->|文件2| Chunk
+ Chunk -->|文件1块1,文件1块2,文件1块3| Alias[别名]
+ Chunk -->|文件2块1,文件2块2| Alias
+ Alias -->|文件1块3| D1[后端驱动 1]
+ Alias -->|文件1块2| D2[后端驱动 2]
+ Alias -->|文件1块1| D3[后端驱动 3]
+ Alias -->|文件2块1| D1
+ Alias -->|文件2块2| D3
+```
+
+- 错误实践:
+
+```mermaid
+graph LR
+ File[上传文件流] -->|文件1| Alias[别名]
+ File -->|文件2| Alias
+ Alias -->|文件1| Chunk1[分块驱动 1]
+ Alias -->|文件2| Chunk2[分块驱动 2]
+ Chunk1 -->|文件1块1| D1[后端驱动 1]
+ Chunk1 -->|文件1块2| D1
+ Chunk1 -->|文件1块3| D1
+ Chunk2 -->|文件2块1| D2[后端驱动 2]
+ Chunk2 -->|文件2块2| D2
+```
+
+:::
diff --git a/pages/guide/drivers/strm.md b/pages/guide/drivers/strm.md
index 15e8bc44f..eab3bceda 100644
--- a/pages/guide/drivers/strm.md
+++ b/pages/guide/drivers/strm.md
@@ -19,4 +19,4 @@ sticky: true
star: true
---
-
+
diff --git a/pages/guide/drivers/strm_text.md b/pages/guide/drivers/strm_text.md
new file mode 100644
index 000000000..17aedf9a8
--- /dev/null
+++ b/pages/guide/drivers/strm_text.md
@@ -0,0 +1,136 @@
+::: en
+**Strm** is a driver that allows you to convert supported files from multiple cloud drives into .strm files.
+
+::: warning Important Notes
+Please understand the function of strm files before use
+
+Only the **`Download Preview (Read-Only)`** operation is supported. Other operations such as **Copy, Delete, Rename, Offline Download, Upload** are **not supported**.
+
+Strm uses a local proxy method, and during the **`Download Preview (Read-Only)`** operation, it will consume bandwidth from the deployed machine (depending on the number of files; individual files typically consume less than 100KB).
+:::
+::: zh-CN
+**Strm** 是一种可以将多个不同云盘中的支持的文件转换为strm文件的驱动。
+
+::: warning 注意事项
+使用前请先了解strm文件作用
+
+除了 **`下载预览(只读)`** 操作外,其他操作如 **复制、删除、重命名、离线下载、上传** 均不支持。
+
+Strm采用本地代理方式,在 **`下载预览(只读)`** 操作时会消耗一定部署机器的流量(取决于文件数量、单个文件一般不超过100KB)
+:::
+
+### Parameter Descriptions { lang="en" }
+
+### 参数介绍 { lang="zh-CN" }
+
+::: en
+
+- **Path:** The full path in OpenList where .strm files should be generated.
+ Examples:
+ ```
+ /115_open/Video
+ /kuake_open/Video
+ ```
+- **Site URL:** The URL prefix for the generated .strm files.
+
+ For example, if the directory /115_open/Video contains the file:`/电影/再见,李可乐 (2023)/再见,李可乐 (2023) - 2160p.mkv`
+
+ And you enter http://localhost:5244 as the Site URL, the generated .strm file will point to: `http://localhost:5244/115_open/Video/电影/再见,李可乐 (2023)/再见,李可乐 (2023) - 2160p.strm`
+
+ This field is optional. If left blank, the current access URL will be used as the default prefix.
+
+- **File Type Filter:** Specify which file types should be included for .strm generation.
+
+ The following types are built-in:
+
+ ```
+ Video Type
+ mp4,mkv,flv,avi,wmv,ts,rmv,web
+
+ Audio Type
+ mp3,flac,aac,wav,ogg,m4a,wma,alac
+ ```
+
+ You can add more types as needed. Use **commas (,)** to separate multiple file types.
+
+- **Encode Path:** Whether to enable URL path encoding.
+
+ If disabled, the .strm URL will be:
+ `http://localhost:5244/115_open/Video/电影/再见,李可乐 (2023)/再见,李可乐 (2023) - 2160p.stm`
+
+ If enabled, it will be:
+ `http://localhost:5244/Video/%E7%94%B5%E5%BD%B1/%E5%86%8D%E8%A7%81%EF%BC%8C%E6%9D%8E%E5%8F%AF%E4%B9%90%20(2023)/%E5%86%8D%E8%A7%81%EF%BC%8C%E6%9D%8E%E5%8F%AF%E4%B9%90%20(2023)%20-%202160p.mkv`
+
+- **Without Url:** The generated strm file after opening will not contain URL prefixes
+
+- **SaveStrmToLocal:** When enabled, accessing a directory within or mounted by the Strm driver will save the Strm files locally
+
+- **SaveStrmLocalPath:** The local directory path where Strm files are stored.
+
+:::
+::: zh-CN
+
+- **路径**:需要生成strm文件的`OpenList上的完整路径`。
+
+ 例如
+
+ ```
+ /115_open/Video
+ /kuake_open/Video
+ ```
+
+- **站点URL**:Strm文件的URL前缀。
+
+ 如在`/115_open/Video`目录下有`/电影/再见,李可乐 (2023)/再见,李可乐 (2023) - 2160p.mkv`
+
+ 填写`http://localhost:5244` 则生成的Strm文件为`http://localhost:5244/115_open/Video/电影/再见,李可乐 (2023)/再见,李可乐 (2023) - 2160p.strm`
+
+ 此项可默认不填、不填时URL前缀会采用你当前访问的地址作为URL前缀
+
+- **过滤文件类型**:过滤需要生成的strm的文件类型
+
+ 目前内置了如下文件类型
+
+ ```
+ 视频类型
+ mp4,mkv,flv,avi,wmv,ts,rmv,web
+
+ 音频类型
+ mp3,flac,aac,wav,ogg,m4a,wma,alac
+ ```
+
+ 可以自行补充,多文件类型间采用 **,** 分割
+
+- **编码路径**:是否启用路径编码
+
+ 不启用时生成的strm文件为 `http://localhost:5244/115_open/Video/电影/再见,李可乐 (2023)/再见,李可乐 (2023) - 2160p.stm`
+
+ 启用时`http://localhost:5244/Video/%E7%94%B5%E5%BD%B1/%E5%86%8D%E8%A7%81%EF%BC%8C%E6%9D%8E%E5%8F%AF%E4%B9%90%20(2023)/%E5%86%8D%E8%A7%81%EF%BC%8C%E6%9D%8E%E5%8F%AF%E4%B9%90%20(2023)%20-%202160p.mkv`
+
+- **不包含URL前缀**:开启后生成的strm文件将不包含URL前缀
+
+- **保存Strm文件至本地**: 开启后访问 strm 驱动中目录或被 strm 驱动挂载的目录时会将 strm 文件保存至本地
+
+- **保存Strm文件本地路径**: strm文件保存的本地路径
+
+:::
+
+### Actively generate local files { lang="en" }
+
+### 主动生成本地文件 { lang="zh-CN" }
+
+::: en
+The local file generation feature only takes effect when users access the corresponding directory. To recursively generate files for all paths, you can use the **Manually Scan** function, located under `Manage Page / Indices / Manually Scan`. In the **Path to scan** field, enter the **mount path of the Strm driver**, and in the **Rate limit** field, specify the API rate limit for the scanning process. Click start and wait for completion.
+
+Enabling the [Global Settings / Handle hook after writing](/configuration/global#handle-hook-after-writing) allows local files to be automatically generated after performing upload, rename, delete, move, copy, or extraction operations either under the original driver.
+
+Scheduled or automatic local file generation by listening for driver changes is not currently supported.
+:::
+::: zh-CN
+
+生成本地文件功能仅会在用户访问相应目录时生效,为了递归生成所有路径,可以使用**手动扫描**功能,其位于`管理界面 / 索引 / 手动扫描`下,**扫描路径**填写**Strm驱动的挂载路径**,**限制速率**填写扫描过程中的 API 限速,点击开始,等待完成即可。
+
+开启[全局设置 / 写入操作后触发目录更新钩子](/configuration/global#写入操作后触发目录更新钩子),可以在原驱动下进行上传、重命名、删除、移动、复制、解压操作后自动生成本地文件。
+
+暂不支持定时或监听驱动更改自动生成本地文件。
+:::
diff --git a/public/img/drivers/alias/read_policy_all.png b/public/img/drivers/alias/read_policy_all.png
new file mode 100644
index 0000000000000000000000000000000000000000..87c1686005697e7a057bfdb57dd70de34ab6c57a
GIT binary patch
literal 101302
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%0ARUKb#sBuA!W3zJt2ik$?
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