feat(openlist): 集成OpenList多网盘聚合服务,新增相关接口与文档

新增OpenList集成模块,支持80+种网盘接入,添加创建关联网盘、文件同步、获取播放链接等接口,更新API文档完善相关说明
This commit is contained in:
liRQ 2026-06-27 15:22:52 +08:00
parent 04e57473b4
commit ac0d94bd00
6 changed files with 738 additions and 0 deletions

View File

@ -300,6 +300,7 @@
<div class="nav-item" data-section="drive">网盘服务</div> <div class="nav-item" data-section="drive">网盘服务</div>
<div class="nav-item" data-section="icon">Icon服务</div> <div class="nav-item" data-section="icon">Icon服务</div>
<div class="nav-item" data-section="tmdb">TMDB服务</div> <div class="nav-item" data-section="tmdb">TMDB服务</div>
<div class="nav-item" data-section="openlist">OpenList集成</div>
<div class="nav-item" data-section="status">状态码</div> <div class="nav-item" data-section="status">状态码</div>
</div> </div>
@ -339,6 +340,17 @@
<span class="arch-arrow"></span> <span class="arch-arrow"></span>
<div class="arch-box tmdb">TMDB:8083</div> <div class="arch-box tmdb">TMDB:8083</div>
</div> </div>
<div class="arch-flow" style="margin-top: 8px;">
<div class="arch-box" style="background: #4a5568; visibility: hidden;">前端</div>
<span class="arch-arrow" style="visibility: hidden;"></span>
<div class="arch-box gateway" style="visibility: hidden;">Gateway</div>
<span class="arch-arrow"></span>
<div class="arch-box drive">Drive:8082</div>
<span class="arch-arrow"></span>
<div class="arch-box" style="background: #38b2ac;">OpenList:13000</div>
<span class="arch-arrow"></span>
<div class="arch-box" style="background: #e53e3e;">各网盘</div>
</div>
</div> </div>
<div class="service-card"> <div class="service-card">
@ -350,6 +362,8 @@
<tr><td>/api/users/**</td><td>user-service</td><td>用户管理</td></tr> <tr><td>/api/users/**</td><td>user-service</td><td>用户管理</td></tr>
<tr><td>/api/profile/**</td><td>user-service</td><td>个人资料</td></tr> <tr><td>/api/profile/**</td><td>user-service</td><td>个人资料</td></tr>
<tr><td>/api/drive/**</td><td>drive-service</td><td>网盘管理</td></tr> <tr><td>/api/drive/**</td><td>drive-service</td><td>网盘管理</td></tr>
<tr><td>/api/drive/**/sync-files</td><td>drive-service</td><td>OpenList 文件同步</td></tr>
<tr><td>/api/drive/**/play-url</td><td>drive-service</td><td>OpenList 播放链接</td></tr>
<tr><td>/api/icon/**</td><td>drive-service</td><td>Icon管理</td></tr> <tr><td>/api/icon/**</td><td>drive-service</td><td>Icon管理</td></tr>
<tr><td>/api/movies/**</td><td>tmdb-service</td><td>电影管理</td></tr> <tr><td>/api/movies/**</td><td>tmdb-service</td><td>电影管理</td></tr>
<tr><td>/api/tmdb/**, /api/tmdb-scraper/**</td><td>tmdb-service</td><td>TMDB刮削</td></tr> <tr><td>/api/tmdb/**, /api/tmdb-scraper/**</td><td>tmdb-service</td><td>TMDB刮削</td></tr>
@ -3480,6 +3494,361 @@
</div> </div>
</div> </div>
<!-- OpenList 集成 -->
<div class="section" id="openlist">
<div class="service-card">
<h2>OpenList 多网盘聚合服务</h2>
<span class="port">wangpan-drive-service : 8082 · 依赖 OpenList 服务 (http://ldfun.asia:13000)</span>
</div>
<div class="service-card" style="border-left-color: #48bb78;">
<h2>功能说明</h2>
<p style="font-size: 14px; color: #4a5568; line-height: 1.8; margin-top: 8px;">
OpenList 集成模块将 OpenList 作为多网盘聚合后端,支持 80+ 种网盘服务阿里云盘、百度网盘、UC网盘、OneDrive 等)。
Java 服务负责业务逻辑用户、权限、TMDB 刮削OpenList 负责文件操作(上传、下载、预览)。
</p>
<div class="arch-diagram" style="margin-top: 16px;">
<div class="arch-flow">
<div class="arch-box" style="background: #4a5568;">前端</div>
<span class="arch-arrow"></span>
<div class="arch-box gateway">Gateway:8888</div>
<span class="arch-arrow"></span>
<div class="arch-box drive">Drive:8082</div>
<span class="arch-arrow"></span>
<div class="arch-box" style="background: #38b2ac;">OpenList:13000</div>
<span class="arch-arrow"></span>
<div class="arch-box" style="background: #e53e3e;">各网盘</div>
</div>
</div>
</div>
<div class="service-card" style="border-left-color: #ed8936;">
<h2>前置配置</h2>
<p style="font-size: 14px; color: #4a5568; line-height: 1.8; margin-top: 8px;">
1. 在 OpenList 管理后台 (<code>http://ldfun.asia:13000/@manage</code>) 添加网盘存储<br>
2. 记录存储的 <strong>挂载路径</strong>(如 <code>/uc</code>)和 <strong>存储 ID</strong>(通过 API 获取)<br>
3. 在 <code>application.yml</code> 中配置 OpenList 服务地址和账号密码<br>
4. 创建网盘时传入 <code>openlistStorageId</code><code>openlistMountPath</code> 关联 OpenList 存储
</p>
</div>
<!-- 创建网盘(关联 OpenList -->
<div class="api-item">
<div class="api-header" onclick="toggleDetail(this)">
<span class="method POST">POST</span>
<span class="api-path">/api/drive</span>
<span class="api-desc">创建网盘(关联 OpenList 存储)</span>
<span class="auth-badge">需Token</span>
</div>
<div class="api-detail">
<div class="detail-section">
<h4>请求头</h4>
<div class="code-block">Authorization: Bearer &lt;token&gt;
Content-Type: application/json</div>
</div>
<div class="detail-section">
<h4>请求体</h4>
<div class="code-block">{
<span class="key">"name"</span>: <span class="string">"UC网盘电影库"</span>,
<span class="key">"description"</span>: <span class="string">"UC网盘存储"</span>,
<span class="key">"openlistStorageId"</span>: <span class="string">"1"</span>,
<span class="key">"openlistMountPath"</span>: <span class="string">"/uc"</span>
}</div>
</div>
<div class="detail-section">
<h4>字段说明</h4>
<table class="param-table">
<tr><th>字段</th><th>类型</th><th>必填</th><th>说明</th></tr>
<tr><td>name</td><td>String</td><td></td><td>网盘名称</td></tr>
<tr><td>description</td><td>String</td><td></td><td>网盘描述</td></tr>
<tr><td>openlistStorageId</td><td>String</td><td></td><td>OpenList 存储 ID不传则仅记录元数据</td></tr>
<tr><td>openlistMountPath</td><td>String</td><td></td><td>OpenList 挂载路径(如 "/uc"</td></tr>
</table>
</div>
<div class="detail-section">
<h4>成功响应示例</h4>
<div class="code-block">{
<span class="key">"code"</span>: <span class="number">200</span>,
<span class="key">"message"</span>: <span class="string">"创建成功"</span>,
<span class="key">"data"</span>: {
<span class="key">"id"</span>: <span class="number">1</span>,
<span class="key">"name"</span>: <span class="string">"UC网盘电影库"</span>,
<span class="key">"description"</span>: <span class="string">"UC网盘存储"</span>,
<span class="key">"openlistStorageId"</span>: <span class="string">"1"</span>,
<span class="key">"openlistMountPath"</span>: <span class="string">"/uc"</span>,
<span class="key">"folderCount"</span>: <span class="number">0</span>,
<span class="key">"fileCount"</span>: <span class="number">0</span>,
<span class="key">"totalSize"</span>: <span class="number">0</span>,
<span class="key">"status"</span>: <span class="string">"active"</span>,
<span class="key">"createTime"</span>: <span class="string">"2026-06-26T15:00:00"</span>,
<span class="key">"updateTime"</span>: <span class="string">"2026-06-26T15:00:00"</span>
}
}</div>
</div>
<div class="detail-section">
<h4>失败响应示例</h4>
<div class="code-block">{
<span class="key">"code"</span>: <span class="number">400</span>,
<span class="key">"message"</span>: <span class="string">"创建网盘失败:网盘名称不能为空"</span>,
<span class="key">"data"</span>: <span class="keyword">null</span>
}</div>
</div>
</div>
</div>
<!-- 同步文件夹文件 -->
<div class="api-item">
<div class="api-header" onclick="toggleDetail(this)">
<span class="method POST">POST</span>
<span class="api-path">/api/drive/{driveId}/folders/{folderId}/sync-files</span>
<span class="api-desc">从 OpenList 同步文件夹文件</span>
<span class="auth-badge">需Token</span>
</div>
<div class="api-detail">
<div class="detail-section">
<h4>请求头</h4>
<div class="code-block">Authorization: Bearer &lt;token&gt;</div>
</div>
<div class="detail-section">
<h4>路径参数</h4>
<table class="param-table">
<tr><th>参数</th><th>类型</th><th>说明</th></tr>
<tr><td>driveId</td><td>Long</td><td>网盘 ID</td></tr>
<tr><td>folderId</td><td>Long</td><td>文件夹 ID0 表示根目录)</td></tr>
</table>
</div>
<div class="detail-section">
<h4>功能说明</h4>
<p style="font-size: 13px; color: #4a5568; line-height: 1.6;">
调用 OpenList API 获取指定路径下的文件列表,自动创建数据库中缺失的电影记录。
已存在的文件不会重复创建。同步后文件可进行 TMDB 刮削。
</p>
</div>
<div class="detail-section">
<h4>成功响应示例</h4>
<div class="code-block">{
<span class="key">"code"</span>: <span class="number">200</span>,
<span class="key">"message"</span>: <span class="string">"同步成功"</span>,
<span class="key">"data"</span>: {
<span class="key">"syncCount"</span>: <span class="number">5</span>,
<span class="key">"totalFiles"</span>: <span class="number">10</span>
}
}</div>
</div>
<div class="detail-section">
<h4>响应字段说明</h4>
<table class="param-table">
<tr><th>字段</th><th>说明</th></tr>
<tr><td>syncCount</td><td>本次新增的电影记录数量</td></tr>
<tr><td>totalFiles</td><td>OpenList 中该路径下的文件总数</td></tr>
</table>
</div>
<div class="detail-section">
<h4>失败响应示例</h4>
<div class="code-block">{
<span class="key">"code"</span>: <span class="number">400</span>,
<span class="key">"message"</span>: <span class="string">"同步失败:网盘未关联 OpenList 存储"</span>,
<span class="key">"data"</span>: <span class="keyword">null</span>
}</div>
</div>
</div>
</div>
<!-- 获取电影播放链接 -->
<div class="api-item">
<div class="api-header" onclick="toggleDetail(this)">
<span class="method GET">GET</span>
<span class="api-path">/api/drive/{driveId}/movies/{movieId}/play-url</span>
<span class="api-desc">获取电影真实播放链接</span>
<span class="auth-badge">需Token</span>
</div>
<div class="api-detail">
<div class="detail-section">
<h4>请求头</h4>
<div class="code-block">Authorization: Bearer &lt;token&gt;</div>
</div>
<div class="detail-section">
<h4>路径参数</h4>
<table class="param-table">
<tr><th>参数</th><th>类型</th><th>说明</th></tr>
<tr><td>driveId</td><td>Long</td><td>网盘 ID</td></tr>
<tr><td>movieId</td><td>Long</td><td>电影 ID</td></tr>
</table>
</div>
<div class="detail-section">
<h4>功能说明</h4>
<p style="font-size: 13px; color: #4a5568; line-height: 1.6;">
调用 OpenList API 获取文件的真实下载地址,返回的 URL 可直接用于视频播放器播放。
仅支持 <code>storageType</code><code>openlist</code> 的电影记录。
</p>
</div>
<div class="detail-section">
<h4>成功响应示例</h4>
<div class="code-block">{
<span class="key">"code"</span>: <span class="number">200</span>,
<span class="key">"message"</span>: <span class="string">"获取成功"</span>,
<span class="key">"data"</span>: {
<span class="key">"playUrl"</span>: <span class="string">"https://uc网盘真实下载地址/xxx.mp4"</span>,
<span class="key">"fileName"</span>: <span class="string">"阿凡达.mp4"</span>,
<span class="key">"fileSize"</span>: <span class="number">1073741824</span>
}
}</div>
</div>
<div class="detail-section">
<h4>响应字段说明</h4>
<table class="param-table">
<tr><th>字段</th><th>说明</th></tr>
<tr><td>playUrl</td><td>真实播放/下载地址,可直接用于视频播放器</td></tr>
<tr><td>fileName</td><td>文件名</td></tr>
<tr><td>fileSize</td><td>文件大小(字节)</td></tr>
</table>
</div>
<div class="detail-section">
<h4>失败响应示例</h4>
<div class="code-block">{
<span class="key">"code"</span>: <span class="number">400</span>,
<span class="key">"message"</span>: <span class="string">"获取失败:该电影不是 OpenList 管理的文件"</span>,
<span class="key">"data"</span>: <span class="keyword">null</span>
}</div>
</div>
</div>
</div>
<!-- 查看网盘列表 -->
<div class="api-item">
<div class="api-header" onclick="toggleDetail(this)">
<span class="method GET">GET</span>
<span class="api-path">/api/drive</span>
<span class="api-desc">查看网盘列表(含 OpenList 信息)</span>
<span class="auth-badge">需Token</span>
</div>
<div class="api-detail">
<div class="detail-section">
<h4>请求头</h4>
<div class="code-block">Authorization: Bearer &lt;token&gt;</div>
</div>
<div class="detail-section">
<h4>成功响应示例</h4>
<div class="code-block">{
<span class="key">"code"</span>: <span class="number">200</span>,
<span class="key">"data"</span>: [
{
<span class="key">"id"</span>: <span class="number">1</span>,
<span class="key">"name"</span>: <span class="string">"UC网盘电影库"</span>,
<span class="key">"openlistStorageId"</span>: <span class="string">"1"</span>,
<span class="key">"openlistMountPath"</span>: <span class="string">"/uc"</span>,
<span class="key">"folderCount"</span>: <span class="number">2</span>,
<span class="key">"fileCount"</span>: <span class="number">10</span>,
<span class="key">"totalSize"</span>: <span class="number">10737418240</span>,
<span class="key">"status"</span>: <span class="string">"active"</span>
}
]
}</div>
</div>
<div class="detail-section">
<h4>新增字段说明</h4>
<table class="param-table">
<tr><th>字段</th><th>说明</th></tr>
<tr><td>openlistStorageId</td><td>关联的 OpenList 存储 IDnull 表示未关联)</td></tr>
<tr><td>openlistMountPath</td><td>OpenList 挂载路径(如 "/uc"</td></tr>
</table>
</div>
</div>
</div>
<!-- 查看电影列表 -->
<div class="api-item">
<div class="api-header" onclick="toggleDetail(this)">
<span class="method GET">GET</span>
<span class="api-path">/api/drive/{driveId}/folders/{folderId}/movies</span>
<span class="api-desc">查看电影列表(含 OpenList 信息)</span>
<span class="auth-badge">需Token</span>
</div>
<div class="api-detail">
<div class="detail-section">
<h4>请求头</h4>
<div class="code-block">Authorization: Bearer &lt;token&gt;</div>
</div>
<div class="detail-section">
<h4>路径参数</h4>
<table class="param-table">
<tr><th>参数</th><th>类型</th><th>说明</th></tr>
<tr><td>driveId</td><td>Long</td><td>网盘 ID</td></tr>
<tr><td>folderId</td><td>Long</td><td>文件夹 ID0 表示根目录)</td></tr>
</table>
</div>
<div class="detail-section">
<h4>成功响应示例</h4>
<div class="code-block">{
<span class="key">"code"</span>: <span class="number">200</span>,
<span class="key">"data"</span>: {
<span class="key">"list"</span>: [
{
<span class="key">"id"</span>: <span class="number">1</span>,
<span class="key">"title"</span>: <span class="string">"阿凡达.mp4"</span>,
<span class="key">"openlistFilePath"</span>: <span class="string">"/uc/阿凡达.mp4"</span>,
<span class="key">"storageType"</span>: <span class="string">"openlist"</span>,
<span class="key">"fileSize"</span>: <span class="number">1073741824</span>,
<span class="key">"mimeType"</span>: <span class="string">"video/mp4"</span>
}
],
<span class="key">"total"</span>: <span class="number">10</span>,
<span class="key">"page"</span>: <span class="number">1</span>,
<span class="key">"pageSize"</span>: <span class="number">20</span>
}
}</div>
</div>
<div class="detail-section">
<h4>新增字段说明</h4>
<table class="param-table">
<tr><th>字段</th><th>说明</th></tr>
<tr><td>openlistFilePath</td><td>OpenList 文件路径(如 "/uc/阿凡达.mp4"</td></tr>
<tr><td>storageType</td><td>存储类型:<code>metadata</code>(仅元数据)/ <code>openlist</code>OpenList 管理)</td></tr>
<tr><td>fileSize</td><td>文件大小(字节)</td></tr>
</table>
</div>
</div>
</div>
<!-- 前端调用示例 -->
<div class="service-card" style="border-left-color: #9f7aea;">
<h2>前端调用示例</h2>
<div class="detail-section">
<h4>创建网盘</h4>
<div class="code-block">const response = await fetch('/api/drive', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'UC网盘电影库',
openlistStorageId: '1',
openlistMountPath: '/uc'
})
});</div>
</div>
<div class="detail-section">
<h4>同步文件</h4>
<div class="code-block">const response = await fetch(`/api/drive/${driveId}/folders/${folderId}/sync-files`, {
method: 'POST',
headers: { 'Authorization': `Bearer ${token}` }
});
const data = await response.json();
console.log(`同步了 ${data.data.syncCount} 个文件`);</div>
</div>
<div class="detail-section">
<h4>播放视频</h4>
<div class="code-block">const response = await fetch(`/api/drive/${driveId}/movies/${movieId}/play-url`, {
headers: { 'Authorization': `Bearer ${token}` }
});
const data = await response.json();
videoPlayer.src = data.data.playUrl; // 直接设置视频源
videoPlayer.play();</div>
</div>
</div>
</div>
<!-- 状态码 --> <!-- 状态码 -->
<div class="section" id="status"> <div class="section" id="status">
<div class="service-card"> <div class="service-card">

View File

@ -300,6 +300,7 @@
<div class="nav-item" data-section="drive">网盘服务</div> <div class="nav-item" data-section="drive">网盘服务</div>
<div class="nav-item" data-section="icon">Icon服务</div> <div class="nav-item" data-section="icon">Icon服务</div>
<div class="nav-item" data-section="tmdb">TMDB服务</div> <div class="nav-item" data-section="tmdb">TMDB服务</div>
<div class="nav-item" data-section="openlist">OpenList集成</div>
<div class="nav-item" data-section="status">状态码</div> <div class="nav-item" data-section="status">状态码</div>
</div> </div>
@ -339,6 +340,17 @@
<span class="arch-arrow"></span> <span class="arch-arrow"></span>
<div class="arch-box tmdb">TMDB:8083</div> <div class="arch-box tmdb">TMDB:8083</div>
</div> </div>
<div class="arch-flow" style="margin-top: 8px;">
<div class="arch-box" style="background: #4a5568; visibility: hidden;">前端</div>
<span class="arch-arrow" style="visibility: hidden;"></span>
<div class="arch-box gateway" style="visibility: hidden;">Gateway</div>
<span class="arch-arrow"></span>
<div class="arch-box drive">Drive:8082</div>
<span class="arch-arrow"></span>
<div class="arch-box" style="background: #38b2ac;">OpenList:13000</div>
<span class="arch-arrow"></span>
<div class="arch-box" style="background: #e53e3e;">各网盘</div>
</div>
</div> </div>
<div class="service-card"> <div class="service-card">
@ -350,6 +362,8 @@
<tr><td>/api/users/**</td><td>user-service</td><td>用户管理</td></tr> <tr><td>/api/users/**</td><td>user-service</td><td>用户管理</td></tr>
<tr><td>/api/profile/**</td><td>user-service</td><td>个人资料</td></tr> <tr><td>/api/profile/**</td><td>user-service</td><td>个人资料</td></tr>
<tr><td>/api/drive/**</td><td>drive-service</td><td>网盘管理</td></tr> <tr><td>/api/drive/**</td><td>drive-service</td><td>网盘管理</td></tr>
<tr><td>/api/drive/**/sync-files</td><td>drive-service</td><td>OpenList 文件同步</td></tr>
<tr><td>/api/drive/**/play-url</td><td>drive-service</td><td>OpenList 播放链接</td></tr>
<tr><td>/api/icon/**</td><td>drive-service</td><td>Icon管理</td></tr> <tr><td>/api/icon/**</td><td>drive-service</td><td>Icon管理</td></tr>
<tr><td>/api/movies/**</td><td>tmdb-service</td><td>电影管理</td></tr> <tr><td>/api/movies/**</td><td>tmdb-service</td><td>电影管理</td></tr>
<tr><td>/api/tmdb/**, /api/tmdb-scraper/**</td><td>tmdb-service</td><td>TMDB刮削</td></tr> <tr><td>/api/tmdb/**, /api/tmdb-scraper/**</td><td>tmdb-service</td><td>TMDB刮削</td></tr>
@ -3480,6 +3494,361 @@
</div> </div>
</div> </div>
<!-- OpenList 集成 -->
<div class="section" id="openlist">
<div class="service-card">
<h2>OpenList 多网盘聚合服务</h2>
<span class="port">wangpan-drive-service : 8082 · 依赖 OpenList 服务 (http://ldfun.asia:13000)</span>
</div>
<div class="service-card" style="border-left-color: #48bb78;">
<h2>功能说明</h2>
<p style="font-size: 14px; color: #4a5568; line-height: 1.8; margin-top: 8px;">
OpenList 集成模块将 OpenList 作为多网盘聚合后端,支持 80+ 种网盘服务阿里云盘、百度网盘、UC网盘、OneDrive 等)。
Java 服务负责业务逻辑用户、权限、TMDB 刮削OpenList 负责文件操作(上传、下载、预览)。
</p>
<div class="arch-diagram" style="margin-top: 16px;">
<div class="arch-flow">
<div class="arch-box" style="background: #4a5568;">前端</div>
<span class="arch-arrow"></span>
<div class="arch-box gateway">Gateway:8888</div>
<span class="arch-arrow"></span>
<div class="arch-box drive">Drive:8082</div>
<span class="arch-arrow"></span>
<div class="arch-box" style="background: #38b2ac;">OpenList:13000</div>
<span class="arch-arrow"></span>
<div class="arch-box" style="background: #e53e3e;">各网盘</div>
</div>
</div>
</div>
<div class="service-card" style="border-left-color: #ed8936;">
<h2>前置配置</h2>
<p style="font-size: 14px; color: #4a5568; line-height: 1.8; margin-top: 8px;">
1. 在 OpenList 管理后台 (<code>http://ldfun.asia:13000/@manage</code>) 添加网盘存储<br>
2. 记录存储的 <strong>挂载路径</strong>(如 <code>/uc</code>)和 <strong>存储 ID</strong>(通过 API 获取)<br>
3. 在 <code>application.yml</code> 中配置 OpenList 服务地址和账号密码<br>
4. 创建网盘时传入 <code>openlistStorageId</code><code>openlistMountPath</code> 关联 OpenList 存储
</p>
</div>
<!-- 创建网盘(关联 OpenList -->
<div class="api-item">
<div class="api-header" onclick="toggleDetail(this)">
<span class="method POST">POST</span>
<span class="api-path">/api/drive</span>
<span class="api-desc">创建网盘(关联 OpenList 存储)</span>
<span class="auth-badge">需Token</span>
</div>
<div class="api-detail">
<div class="detail-section">
<h4>请求头</h4>
<div class="code-block">Authorization: Bearer &lt;token&gt;
Content-Type: application/json</div>
</div>
<div class="detail-section">
<h4>请求体</h4>
<div class="code-block">{
<span class="key">"name"</span>: <span class="string">"UC网盘电影库"</span>,
<span class="key">"description"</span>: <span class="string">"UC网盘存储"</span>,
<span class="key">"openlistStorageId"</span>: <span class="string">"1"</span>,
<span class="key">"openlistMountPath"</span>: <span class="string">"/uc"</span>
}</div>
</div>
<div class="detail-section">
<h4>字段说明</h4>
<table class="param-table">
<tr><th>字段</th><th>类型</th><th>必填</th><th>说明</th></tr>
<tr><td>name</td><td>String</td><td></td><td>网盘名称</td></tr>
<tr><td>description</td><td>String</td><td></td><td>网盘描述</td></tr>
<tr><td>openlistStorageId</td><td>String</td><td></td><td>OpenList 存储 ID不传则仅记录元数据</td></tr>
<tr><td>openlistMountPath</td><td>String</td><td></td><td>OpenList 挂载路径(如 "/uc"</td></tr>
</table>
</div>
<div class="detail-section">
<h4>成功响应示例</h4>
<div class="code-block">{
<span class="key">"code"</span>: <span class="number">200</span>,
<span class="key">"message"</span>: <span class="string">"创建成功"</span>,
<span class="key">"data"</span>: {
<span class="key">"id"</span>: <span class="number">1</span>,
<span class="key">"name"</span>: <span class="string">"UC网盘电影库"</span>,
<span class="key">"description"</span>: <span class="string">"UC网盘存储"</span>,
<span class="key">"openlistStorageId"</span>: <span class="string">"1"</span>,
<span class="key">"openlistMountPath"</span>: <span class="string">"/uc"</span>,
<span class="key">"folderCount"</span>: <span class="number">0</span>,
<span class="key">"fileCount"</span>: <span class="number">0</span>,
<span class="key">"totalSize"</span>: <span class="number">0</span>,
<span class="key">"status"</span>: <span class="string">"active"</span>,
<span class="key">"createTime"</span>: <span class="string">"2026-06-26T15:00:00"</span>,
<span class="key">"updateTime"</span>: <span class="string">"2026-06-26T15:00:00"</span>
}
}</div>
</div>
<div class="detail-section">
<h4>失败响应示例</h4>
<div class="code-block">{
<span class="key">"code"</span>: <span class="number">400</span>,
<span class="key">"message"</span>: <span class="string">"创建网盘失败:网盘名称不能为空"</span>,
<span class="key">"data"</span>: <span class="keyword">null</span>
}</div>
</div>
</div>
</div>
<!-- 同步文件夹文件 -->
<div class="api-item">
<div class="api-header" onclick="toggleDetail(this)">
<span class="method POST">POST</span>
<span class="api-path">/api/drive/{driveId}/folders/{folderId}/sync-files</span>
<span class="api-desc">从 OpenList 同步文件夹文件</span>
<span class="auth-badge">需Token</span>
</div>
<div class="api-detail">
<div class="detail-section">
<h4>请求头</h4>
<div class="code-block">Authorization: Bearer &lt;token&gt;</div>
</div>
<div class="detail-section">
<h4>路径参数</h4>
<table class="param-table">
<tr><th>参数</th><th>类型</th><th>说明</th></tr>
<tr><td>driveId</td><td>Long</td><td>网盘 ID</td></tr>
<tr><td>folderId</td><td>Long</td><td>文件夹 ID0 表示根目录)</td></tr>
</table>
</div>
<div class="detail-section">
<h4>功能说明</h4>
<p style="font-size: 13px; color: #4a5568; line-height: 1.6;">
调用 OpenList API 获取指定路径下的文件列表,自动创建数据库中缺失的电影记录。
已存在的文件不会重复创建。同步后文件可进行 TMDB 刮削。
</p>
</div>
<div class="detail-section">
<h4>成功响应示例</h4>
<div class="code-block">{
<span class="key">"code"</span>: <span class="number">200</span>,
<span class="key">"message"</span>: <span class="string">"同步成功"</span>,
<span class="key">"data"</span>: {
<span class="key">"syncCount"</span>: <span class="number">5</span>,
<span class="key">"totalFiles"</span>: <span class="number">10</span>
}
}</div>
</div>
<div class="detail-section">
<h4>响应字段说明</h4>
<table class="param-table">
<tr><th>字段</th><th>说明</th></tr>
<tr><td>syncCount</td><td>本次新增的电影记录数量</td></tr>
<tr><td>totalFiles</td><td>OpenList 中该路径下的文件总数</td></tr>
</table>
</div>
<div class="detail-section">
<h4>失败响应示例</h4>
<div class="code-block">{
<span class="key">"code"</span>: <span class="number">400</span>,
<span class="key">"message"</span>: <span class="string">"同步失败:网盘未关联 OpenList 存储"</span>,
<span class="key">"data"</span>: <span class="keyword">null</span>
}</div>
</div>
</div>
</div>
<!-- 获取电影播放链接 -->
<div class="api-item">
<div class="api-header" onclick="toggleDetail(this)">
<span class="method GET">GET</span>
<span class="api-path">/api/drive/{driveId}/movies/{movieId}/play-url</span>
<span class="api-desc">获取电影真实播放链接</span>
<span class="auth-badge">需Token</span>
</div>
<div class="api-detail">
<div class="detail-section">
<h4>请求头</h4>
<div class="code-block">Authorization: Bearer &lt;token&gt;</div>
</div>
<div class="detail-section">
<h4>路径参数</h4>
<table class="param-table">
<tr><th>参数</th><th>类型</th><th>说明</th></tr>
<tr><td>driveId</td><td>Long</td><td>网盘 ID</td></tr>
<tr><td>movieId</td><td>Long</td><td>电影 ID</td></tr>
</table>
</div>
<div class="detail-section">
<h4>功能说明</h4>
<p style="font-size: 13px; color: #4a5568; line-height: 1.6;">
调用 OpenList API 获取文件的真实下载地址,返回的 URL 可直接用于视频播放器播放。
仅支持 <code>storageType</code><code>openlist</code> 的电影记录。
</p>
</div>
<div class="detail-section">
<h4>成功响应示例</h4>
<div class="code-block">{
<span class="key">"code"</span>: <span class="number">200</span>,
<span class="key">"message"</span>: <span class="string">"获取成功"</span>,
<span class="key">"data"</span>: {
<span class="key">"playUrl"</span>: <span class="string">"https://uc网盘真实下载地址/xxx.mp4"</span>,
<span class="key">"fileName"</span>: <span class="string">"阿凡达.mp4"</span>,
<span class="key">"fileSize"</span>: <span class="number">1073741824</span>
}
}</div>
</div>
<div class="detail-section">
<h4>响应字段说明</h4>
<table class="param-table">
<tr><th>字段</th><th>说明</th></tr>
<tr><td>playUrl</td><td>真实播放/下载地址,可直接用于视频播放器</td></tr>
<tr><td>fileName</td><td>文件名</td></tr>
<tr><td>fileSize</td><td>文件大小(字节)</td></tr>
</table>
</div>
<div class="detail-section">
<h4>失败响应示例</h4>
<div class="code-block">{
<span class="key">"code"</span>: <span class="number">400</span>,
<span class="key">"message"</span>: <span class="string">"获取失败:该电影不是 OpenList 管理的文件"</span>,
<span class="key">"data"</span>: <span class="keyword">null</span>
}</div>
</div>
</div>
</div>
<!-- 查看网盘列表 -->
<div class="api-item">
<div class="api-header" onclick="toggleDetail(this)">
<span class="method GET">GET</span>
<span class="api-path">/api/drive</span>
<span class="api-desc">查看网盘列表(含 OpenList 信息)</span>
<span class="auth-badge">需Token</span>
</div>
<div class="api-detail">
<div class="detail-section">
<h4>请求头</h4>
<div class="code-block">Authorization: Bearer &lt;token&gt;</div>
</div>
<div class="detail-section">
<h4>成功响应示例</h4>
<div class="code-block">{
<span class="key">"code"</span>: <span class="number">200</span>,
<span class="key">"data"</span>: [
{
<span class="key">"id"</span>: <span class="number">1</span>,
<span class="key">"name"</span>: <span class="string">"UC网盘电影库"</span>,
<span class="key">"openlistStorageId"</span>: <span class="string">"1"</span>,
<span class="key">"openlistMountPath"</span>: <span class="string">"/uc"</span>,
<span class="key">"folderCount"</span>: <span class="number">2</span>,
<span class="key">"fileCount"</span>: <span class="number">10</span>,
<span class="key">"totalSize"</span>: <span class="number">10737418240</span>,
<span class="key">"status"</span>: <span class="string">"active"</span>
}
]
}</div>
</div>
<div class="detail-section">
<h4>新增字段说明</h4>
<table class="param-table">
<tr><th>字段</th><th>说明</th></tr>
<tr><td>openlistStorageId</td><td>关联的 OpenList 存储 IDnull 表示未关联)</td></tr>
<tr><td>openlistMountPath</td><td>OpenList 挂载路径(如 "/uc"</td></tr>
</table>
</div>
</div>
</div>
<!-- 查看电影列表 -->
<div class="api-item">
<div class="api-header" onclick="toggleDetail(this)">
<span class="method GET">GET</span>
<span class="api-path">/api/drive/{driveId}/folders/{folderId}/movies</span>
<span class="api-desc">查看电影列表(含 OpenList 信息)</span>
<span class="auth-badge">需Token</span>
</div>
<div class="api-detail">
<div class="detail-section">
<h4>请求头</h4>
<div class="code-block">Authorization: Bearer &lt;token&gt;</div>
</div>
<div class="detail-section">
<h4>路径参数</h4>
<table class="param-table">
<tr><th>参数</th><th>类型</th><th>说明</th></tr>
<tr><td>driveId</td><td>Long</td><td>网盘 ID</td></tr>
<tr><td>folderId</td><td>Long</td><td>文件夹 ID0 表示根目录)</td></tr>
</table>
</div>
<div class="detail-section">
<h4>成功响应示例</h4>
<div class="code-block">{
<span class="key">"code"</span>: <span class="number">200</span>,
<span class="key">"data"</span>: {
<span class="key">"list"</span>: [
{
<span class="key">"id"</span>: <span class="number">1</span>,
<span class="key">"title"</span>: <span class="string">"阿凡达.mp4"</span>,
<span class="key">"openlistFilePath"</span>: <span class="string">"/uc/阿凡达.mp4"</span>,
<span class="key">"storageType"</span>: <span class="string">"openlist"</span>,
<span class="key">"fileSize"</span>: <span class="number">1073741824</span>,
<span class="key">"mimeType"</span>: <span class="string">"video/mp4"</span>
}
],
<span class="key">"total"</span>: <span class="number">10</span>,
<span class="key">"page"</span>: <span class="number">1</span>,
<span class="key">"pageSize"</span>: <span class="number">20</span>
}
}</div>
</div>
<div class="detail-section">
<h4>新增字段说明</h4>
<table class="param-table">
<tr><th>字段</th><th>说明</th></tr>
<tr><td>openlistFilePath</td><td>OpenList 文件路径(如 "/uc/阿凡达.mp4"</td></tr>
<tr><td>storageType</td><td>存储类型:<code>metadata</code>(仅元数据)/ <code>openlist</code>OpenList 管理)</td></tr>
<tr><td>fileSize</td><td>文件大小(字节)</td></tr>
</table>
</div>
</div>
</div>
<!-- 前端调用示例 -->
<div class="service-card" style="border-left-color: #9f7aea;">
<h2>前端调用示例</h2>
<div class="detail-section">
<h4>创建网盘</h4>
<div class="code-block">const response = await fetch('/api/drive', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'UC网盘电影库',
openlistStorageId: '1',
openlistMountPath: '/uc'
})
});</div>
</div>
<div class="detail-section">
<h4>同步文件</h4>
<div class="code-block">const response = await fetch(`/api/drive/${driveId}/folders/${folderId}/sync-files`, {
method: 'POST',
headers: { 'Authorization': `Bearer ${token}` }
});
const data = await response.json();
console.log(`同步了 ${data.data.syncCount} 个文件`);</div>
</div>
<div class="detail-section">
<h4>播放视频</h4>
<div class="code-block">const response = await fetch(`/api/drive/${driveId}/movies/${movieId}/play-url`, {
headers: { 'Authorization': `Bearer ${token}` }
});
const data = await response.json();
videoPlayer.src = data.data.playUrl; // 直接设置视频源
videoPlayer.play();</div>
</div>
</div>
</div>
<!-- 状态码 --> <!-- 状态码 -->
<div class="section" id="status"> <div class="section" id="status">
<div class="service-card"> <div class="service-card">