<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[StreamPath 基于Flutter的适用于Windows平台的MPV&amp;Openlist链接器]]></title><description><![CDATA[<h1>StreamPath</h1>
<p dir="auto"><img src="/assets/uploads/files/1786015969686-icon.png" alt="icon.png" class=" img-fluid img-markdown" /><br />
StreamPath 是一个面向 Windows 桌面的 WebDAV 媒体浏览器。它负责浏览远程目录、组织播放列表、匹配同目录字幕、调用外部播放器，并保存播放进度与继续播放记录。</p>
<p dir="auto">项目默认针对 mpv 做完整增强；其他外部播放器可以播放直链，但不一定支持播放列表、字幕脚本、状态同步和进度回写等能力。</p>
<p dir="auto">开发与维护说明见 <a href="PROJECT.md">PROJECT.md</a>。</p>
<h2>主要功能</h2>
<ul>
<li>WebDAV <code>PROPFIND Depth: 1</code> 目录浏览，支持 Basic 认证。</li>
<li>Hive 目录缓存、后台刷新和并发请求合并。</li>
<li>中文长路径缓存键摘要，避免 Hive 255 字符键限制导致目录为空。</li>
<li>名称、修改时间、文件体积排序，以及正序、倒序切换。</li>
<li>按目录与排序组合记忆滚动位置，软件重启后清除。</li>
<li>视频和 STRM 播放；STRM 内容会先解析为真实媒体地址。</li>
<li>同目录自然名称播放列表，从所选条目开始播放并自动切集。</li>
<li>严格限制在同源、同级目录内匹配外挂字幕。</li>
<li>外挂字幕“自动注入”和“自动选择”两个独立开关。</li>
<li>最多两个独立播放会话，分别跟踪对应 MPV 进程和播放状态。</li>
<li>播放进度、继续播放记录、暂停/恢复与定向关闭播放器。</li>
<li>Windows 11 剪贴板历史右键菜单和 Win+V 粘贴兼容处理。</li>
</ul>
<h2>环境要求</h2>
<ul>
<li>Flutter：使用支持 <code>pubspec.yaml</code> 中 Dart SDK <code>^3.12.2</code> 的版本。</li>
<li>桌面平台：Windows 10/11。</li>
<li>WebDAV 服务：支持 <code>PROPFIND</code>，当前认证方式为 Basic Authentication。</li>
<li>推荐播放器：mpv。</li>
</ul>
<p dir="auto">Windows 开发环境还需要启用 Flutter Windows Desktop 工具链。</p>
<h2>已测试的 MPV 版本</h2>
<p dir="auto">以下 64 位 MPV 构建均已实测可正常配合 StreamPath 使用（播放、字幕注入、暂停/恢复、续播）：</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>版本</th>
<th>构建</th>
</tr>
</thead>
<tbody>
<tr>
<td>0.34.0</td>
<td><code>mpv-0.34.0-x86_64</code></td>
</tr>
<tr>
<td>0.41.0</td>
<td><code>mpv-v0.41.0-x86_64-pc-windows-msvc</code></td>
</tr>
<tr>
<td>0.41.0-460-g2f6561947</td>
<td>mpv-config 版（<code>built on Apr 14 2026</code>，libplacebo v7.362.0，FFmpeg N-123957）</td>
</tr>
<tr>
<td>lazy 260510</td>
<td><code>mpv-lazy-20260510-noVS</code></td>
</tr>
<tr>
<td>shinchiro 260610</td>
<td><code>mpv-x86_64-20260610-git-304426c</code></td>
</tr>
</tbody>
</table>
<blockquote>
<p dir="auto"><strong>32 位 MPV 不适用</strong>：实测无法正常播放签名链接，启动后立即闪退，请使用 64 位构建。</p>
</blockquote>
<h2>运行与构建</h2>
<p dir="auto">在项目根目录安装依赖：</p>
<pre><code class="language-powershell">flutter pub get
</code></pre>
<p dir="auto">Windows 开发运行：</p>
<pre><code class="language-powershell">flutter run -d windows
</code></pre>
<p dir="auto">Windows 构建（统一使用 Debug 模式，产物位于 <code>build\windows\x64\runner\Debug\</code>）：</p>
<pre><code class="language-powershell">flutter build windows --debug
</code></pre>
<blockquote>
<p dir="auto">当前 <a href="build.ps1">build.ps1</a> 只包含 Windows 开发运行命令。<a href="run-d.ps1">run-d.ps1</a> 含开发者本机绝对路径，不适合作为其他环境的通用启动脚本。</p>
</blockquote>
<h2>首次连接</h2>
<ol>
<li>启动 StreamPath。</li>
<li>输入完整的 WebDAV 根地址，例如 <code>http://192.168.2.124:5244/dav</code>。</li>
<li>输入用户名和密码并连接。</li>
<li>连接成功后配置会写入 <code>stream_path_config.json</code>，下次启动自动连接。</li>
</ol>
<p dir="auto">右上角的断开连接只结束当前内存连接并返回登录页，不会删除已保存的账号配置。</p>
<h2>浏览与排序</h2>
<h3>文件操作</h3>
<ul>
<li>单击目录进入下一级。</li>
<li>单击“返回上级目录”或面包屑返回指定层级。</li>
<li>单击视频或 STRM 启动播放。</li>
<li>普通文件和字幕文件目前只显示，不提供下载或预览操作。</li>
<li>右上角刷新按钮和下拉刷新会强制请求网络；失败时保留最后一次成功结果。</li>
</ul>
<h3>排序规则</h3>
<p dir="auto">浏览页始终保持“返回上级、目录、文件”三个分组，只改变组内顺序。</p>
<ul>
<li><strong>按名称</strong>：使用自然排序，<code>E2</code> 排在 <code>E10</code> 前。</li>
<li><strong>按时间</strong>：正序为从早到晚，倒序为从晚到早；显示到同一分钟的条目再按名称排序，缺少时间的条目放在最后。</li>
<li><strong>按体积</strong>：只排序普通文件，目录不计算总体积。纯目录页面会禁用该选项；已选中的体积参数不会因此被改写。</li>
</ul>
<p dir="auto">名称排序支持剧集编号、数字分段、全角数字、前导零、中文序数、罗马数字季名等常见格式。对于 <code>视频名 - 2012</code>、<code>视频名 - 2013</code> 这类名称，末尾由空格、横线或下划线分隔的数字也会参与排序；名称前后都有显式数字时，优先使用开头数字。</p>
<p dir="auto">右上角临时排序和滚动位置只保存在内存中。设置页中的默认排序方式和方向会持久化，并在下次启动时生效。</p>
<h2>播放与播放列表</h2>
<p dir="auto">单击可播放条目后，StreamPath 会收集当前目录的全部视频和有效 STRM，按后台自然名称正序创建播放列表，并从所选条目开始播放。浏览页临时切换到时间或体积排序不会改变播放列表顺序。</p>
<p dir="auto">STRM 文件应包含一个可解析的媒体地址，可以是同源的绝对 HTTP/HTTPS URL，也可以是相对于 WebDAV 根地址的路径。为避免把认证信息发送给第三方，解析后的地址必须与当前 WebDAV 服务器同源。无效、跨源或读取失败的 STRM 会从本次播放列表中排除；所选 STRM 无法解析时会显示错误提示。</p>
<p dir="auto">mpv 模式下还会提供：</p>
<ul>
<li>播放列表与当前集标题。</li>
<li>Basic 认证请求头。</li>
<li>播放进度保存和续播。</li>
<li>每个会话独立的状态、命令和临时脚本。</li>
<li>软件内暂停、恢复和关闭对应 MPV。</li>
</ul>
<h2>外挂字幕</h2>
<p dir="auto">字幕匹配必须同时满足：</p>
<ol>
<li>字幕与视频或 STRM 在同一个 WebDAV 来源。</li>
<li>字幕与媒体条目位于完全相同的父目录。</li>
<li>名称、季号和集号通过匹配规则。</li>
</ol>
<p dir="auto">支持的字幕扩展名为 <code>.srt</code>、<code>.ass</code>、<code>.vtt</code>、<code>.ssa</code>、<code>.sub</code>、<code>.sup</code>、<code>.idx</code>、<code>.smi</code>。匹配规则会识别 <code>S01E01</code>、<code>1x01</code>、<code>E01</code>、<code>EP01</code>、<code>第01集</code>、纯数字集号，以及常见语言和字幕属性后缀。</p>
<p dir="auto">设置页提供两个开关：</p>
<ul>
<li><strong>自动注入匹配的外挂字幕</strong>：搜索同目录字幕并加入 MPV 字幕轨道。</li>
<li><strong>自动选择已注入的外挂字幕</strong>：注入后切换到外挂字幕；关闭时保留注入前的内封字幕或无字幕状态。</li>
</ul>
<p dir="auto">自动选择依赖自动注入。关闭自动注入后，自动选择项会变灰且不生效。多集播放时，每次自动或手动切集都会根据当前 <code>playlist-pos</code> 注入该集对应字幕；关闭自动选择不会关闭逐集注入。</p>
<p dir="auto">自动注入开启时，StreamPath 会向 mpv 添加 <code>--sub-auto=no</code>，避免 mpv 配置中的字幕搜索路径加载其他目录的字幕。</p>
<h2>继续播放栏</h2>
<p dir="auto">浏览页底部最多保留两个播放会话，新会话显示在上方，较早的会话显示在下方。每个会话独立保存：</p>
<ul>
<li>当前目录和文件名。</li>
<li>播放列表与当前位置。</li>
<li>MPV PID、IPC 标识、状态文件和命令文件。</li>
<li>正在打开、正在播放、已暂停或继续播放状态。</li>
</ul>
<p dir="auto">播放栏支持：</p>
<ul>
<li>点击暂停或恢复对应 MPV。</li>
<li>播放器退出后继续播放。</li>
<li>删除按钮或右键菜单删除记录并关闭对应播放器。</li>
<li>播放位置已满时阻止第三个会话并显示提示。</li>
</ul>
<p dir="auto">新启动的 MPV 在写出首个有效播放状态前会进入启动保护期，底栏保持“继续播放”。StreamPath 每秒探测一次对应进程；超过配置等待时间仍未激活时，会定向终止该会话进程并清除底栏。</p>
<p dir="auto">直接关闭 MPV 后，未播放完成的会话会稳定切换为“继续播放”。仅当 MPV 已退出且最后上报进度达到 99%，或播放列表明确结束时，该会话才会隐藏；MPV 仍在运行时不会因达到 99% 提前隐藏。</p>
<h2>播放进度</h2>
<p dir="auto">播放进度按媒体 URL 存入 SQLite。重新播放时，若时长已知且距离片尾不足一分钟，则视为已看完并从头开始；时长未知不会自动判定为已看完。</p>
<p dir="auto">mpv 使用独立的 <code>watch_later</code> 目录保存原生进度，播放器退出后 StreamPath 再将结果同步到自己的进度库。</p>
<h2>设置与配置</h2>
<p dir="auto">设置页可修改：</p>
<ul>
<li>播放器名称、可执行文件和参数模板。</li>
<li>隐藏文件后缀。</li>
<li>默认排序方式与排序方向。</li>
<li>WebDAV 地址、用户名和密码。</li>
<li>外挂字幕自动注入和自动选择。</li>
<li>自动续播。</li>
</ul>
<p dir="auto">配置文件还支持手工修改 <code>playerStartupTimeoutSeconds</code>，用于控制 MPV 启动保护的最长等待秒数。默认值为 60，允许范围为 5 到 3600。</p>
<p dir="auto">播放器参数模板支持：</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>占位符</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>{url}</code></td>
<td>媒体地址</td>
</tr>
<tr>
<td><code>{subfile}</code></td>
<td>匹配到的字幕地址，主要用于非 mpv 播放器</td>
</tr>
<tr>
<td><code>{start}</code></td>
<td>续播秒数</td>
</tr>
</tbody>
</table>
<p dir="auto">mpv 的字幕注入由 Lua 脚本完成，因此启动参数中的 <code>{subfile}</code> 不会作为 mpv 的 <code>--sub-file</code> 生效入口。非 mpv 播放器仍可使用该占位符。</p>
<p dir="auto">默认 mpv 模板为：</p>
<pre><code class="language-text">--sub-file={subfile}
{url}
--start={start}
</code></pre>
<h2>数据目录</h2>
<p dir="auto">源码目录内运行或从标准 Flutter <code>build/...</code> 产物运行时，数据通常位于项目根目录的 <code>stream_path_data/</code>。若项目根不可写，则回退到系统应用支持目录；脱离标准构建目录运行时，根目录定位还可能使用当前工作目录。</p>
<p dir="auto">主要数据：</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>路径</th>
<th>用途</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>stream_path_config.json</code></td>
<td>WebDAV、播放器、字幕开关、隐藏后缀和默认排序</td>
</tr>
<tr>
<td><code>playback_history.json</code></td>
<td>最多两个继续播放会话</td>
</tr>
<tr>
<td><code>streampath.db</code></td>
<td>播放进度 SQLite</td>
</tr>
<tr>
<td><code>directory_cache/</code></td>
<td>Hive 目录缓存</td>
</tr>
<tr>
<td><code>mpv-watch-later/</code></td>
<td>mpv 续播记录和会话脚本</td>
</tr>
<tr>
<td><code>mpv-current-&lt;会话&gt;.txt</code></td>
<td>MPV 状态上报</td>
</tr>
<tr>
<td><code>mpv-command-&lt;会话&gt;.txt</code></td>
<td>暂停和恢复命令</td>
</tr>
<tr>
<td><code>clipboard_history_fix.log</code></td>
<td>Windows 剪贴板诊断日志，仅 Debug 构建</td>
</tr>
</tbody>
</table>
<p dir="auto">配置文件中的密码为明文，适合受信任的单机环境，不应把真实配置提交到版本控制或共享给他人。</p>
<p dir="auto">旧版 <code>player_config.json</code> 和 <code>connection_config.json</code> 会在迁移时合并到统一配置。旧字段 <code>subtitleEnabled</code> 会同时迁移为字幕注入和自动选择开关。</p>
<h2>清理运行数据</h2>
<p dir="auto">保留配置并清除缓存、进度、播放历史和 MPV 临时数据：</p>
<pre><code class="language-powershell">.\cleanup.ps1
</code></pre>
<p dir="auto">保留继续播放记录：</p>
<pre><code class="language-powershell">.\cleanup.ps1 -KeepHistory
</code></pre>
<p dir="auto">清理脚本只适用于 PowerShell，并会同时尝试清除旧版本遗留的数据目录。</p>
<h2>Windows 剪贴板支持</h2>
<p dir="auto">Windows 输入框右键菜单会显示最近五条应用内剪贴板历史，并提供粘贴当前剪贴板与清空历史。Windows 11 的 Win+V 合成按键兼容逻辑只在 Windows 启用。</p>
<h2>常见问题</h2>
<h3>目录内容不完整，刷新也没有恢复</h3>
<p dir="auto">先确认 WebDAV 服务实际返回了条目。StreamPath 已对长中文 URL 使用固定长度缓存键，缓存写入异常不会阻断网络结果；刷新失败时界面会保留最后一次成功快照。必要时使用 <code>cleanup.ps1</code> 清除目录缓存后重试。</p>
<h3>字幕没有注入</h3>
<p dir="auto">确认“自动注入匹配的外挂字幕”已开启，并检查字幕是否与媒体位于同源、同级目录。剧集编号冲突会被明确拒绝，例如 <code>S01E01</code> 不会匹配 <code>S01E23</code>。</p>
<h3>字幕已注入但没有自动显示</h3>
<p dir="auto">确认“自动选择已注入的外挂字幕”已开启。该选项关闭时，外挂字幕只进入轨道列表，当前内封字幕保持不变。</p>
<h3>无法启动播放器</h3>
<p dir="auto">在设置页填写有效的播放器命令名或可执行文件路径。命令名需要位于系统 <code>PATH</code>；文件路径会在保存前校验。</p>
<h3>STRM 无法播放</h3>
<p dir="auto">确认文件内容包含一个有效地址，并且 StreamPath 能通过当前 WebDAV 账号读取该文件。绝对地址必须与当前 WebDAV 服务器同源；也可以使用基于 WebDAV 根地址补全的相对路径。</p>
<h3>续播从头开始</h3>
<p dir="auto">时长已知且距离片尾不足一分钟的记录会被视为已看完。除此之外，检查 mpv 是否能写入 <code>mpv-watch-later/</code>，以及数据目录是否可写。</p>
<h2>质量检查</h2>
<pre><code class="language-powershell">flutter analyze
flutter test
</code></pre>
<p dir="auto">当前测试覆盖目录解析与缓存、排序、字幕匹配、STRM、播放器参数、MPV 会话、进度和播放历史、配置迁移、文件列表组件及 Windows 剪贴板逻辑。</p>
<h2>已知维护事项</h2>
<ul>
<li><a href="scripts/fix-cargokit-symlinks.ps1">scripts/fix-cargokit-symlinks.ps1</a> 当前包含未解决的 Git 合并冲突标记，修复前不要执行。</li>
<li><a href="run-d.ps1">run-d.ps1</a> 使用开发者本机绝对路径，需要改为当前环境路径后才能使用。</li>
</ul>
<h2>项目地址</h2>
<p dir="auto"><a href="https://github.com/Yufuxk/StreamPath-Openlist-MPV-MPV-Openlist-" rel="nofollow ugc">https://github.com/Yufuxk/StreamPath-Openlist-MPV-MPV-Openlist-</a><br />
<s>我发的第一个Github项目，要是有人能给我点点Star就好了<img src="https://bf.gias.top/assets/plugins/nodebb-plugin-emoji/emoji/android/1f62d.png?v=9ceba6e3dc3" class="not-responsive emoji emoji-android emoji--sob" style="height:23px;width:auto;vertical-align:middle" title="😭" alt="😭" /></s></p>
]]></description><link>https://bf.gias.top/topic/790/streampath-基于flutter的适用于windows平台的mpv-openlist链接器</link><generator>RSS for Node</generator><lastBuildDate>Thu, 03 Sep 2026 18:36:35 GMT</lastBuildDate><atom:link href="https://bf.gias.top/topic/790.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 06 Aug 2026 11:33:10 GMT</pubDate><ttl>60</ttl></channel></rss>