Open
Conversation
Member
|
Please fix compilation errors and add unit test. |
Member
|
现在的实现并不是很好,本地导入的视频应该也接入 MediaCacheStorage,在缓存页显示。目前已有 TorrentMediaCacheStorage 和 HttpMediaCacheStorage,可以新建一个 LocalImportMediaCacheStorage (或者按照你 PR 里的名字延申的 LocalBindingMediaCacheStorage) 来存储本地的导入的视频信息,这样比较方便统一管理,还可以在启动时检测有效性。 |
Author
|
收到,感谢您的建议。 |
Author
|
还有一点,我想实现的播放本地视频的功能并不是想将本地的视频导入,而是想可以将U盘或移动硬盘上的视频直接播放,不将视频复制到缓存目录,这也是我一开始没有直接用现有的逻辑的原因。如果您有什么建议可以告诉我 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
标题:feat: 支持为剧集绑定本地视频文件并持久化复用(桌面端)
变更概述
这个 PR 为剧集播放页增加了“绑定本地视频文件”的能力。
用户在桌面端为某一集手动选择本地视频后,应用会将该绑定关系持久化保存。之后再次进入同一条目/同一剧集时,这个本地文件会作为一个特殊的数据源参与现有的媒体选择与播放流程,用户不需要每次重新手动选择。
这个改动的目标是让“本地已有视频文件”的使用场景能够无缝接入现有播放流程,同时尽量不影响原有的在线数据源选择逻辑。
主要功能
支持为当前剧集手动绑定一个本地视频文件
支持清除当前剧集的本地文件绑定
绑定关系会持久化保存,重启应用后仍然有效
已绑定的本地文件会作为一个特殊媒体源出现在当前剧集的数据源选择流程中
在绑定完成后,会自动刷新媒体列表并优先选中对应的本地文件
实现方式
增加剧集与本地文件的持久化绑定存储
新增了
EpisodeLocalFileBindingRepository,用于保存(subjectId, episodeId) -> 本地文件路径的映射关系。除了文件路径之外,还会在绑定时尽量复用当前已选媒体的一些属性信息,例如:字幕语言、分辨率、字幕组/联盟信息、字幕类型
这些信息会一起保存,目的是让本地文件在后续作为媒体源参与选择时,仍然能尽量保留原有媒体的展示信息与筛选体验。
绑定数据通过独立的 DataStore 条目持久化保存。
新增本地绑定媒体源
新增了
LocalEpisodeFileBindingMediaSource,作为一个特殊媒体源接入现有媒体查询流程。这个媒体源在查询时会:
根据当前
subjectId和episodeId查找是否存在本地绑定检查绑定的文件是否仍然存在、是否为普通文件
如果有效,则构造一个
ResourceLocation.LocalFile类型的媒体项返回如果文件不存在或无效,则返回空结果
这样做的目的,是把本地文件纳入现有“查询 -> 选择 -> 播放”的统一流程,而不是额外维护一条完全独立的播放分支。
在依赖注入中注册绑定仓库与本地媒体源
在 Koin 模块中注册了新的本地绑定仓库,并将本地绑定媒体源加入媒体源管理流程,使其能参与剧集页面现有的数据源选择逻辑。
在播放页 ViewModel 中接入绑定能力
在
EpisodeViewModel中增加了:当前剧集本地绑定状态的监听
绑定本地文件的方法
清除本地绑定的方法
绑定流程大致为:
(subjectId, episodeId)对应的绑定关系清除绑定时则会删除当前剧集的绑定记录,并重新触发媒体查询,使界面与候选列表状态保持一致。
在媒体选择侧栏中增加了桌面端入口,提供:
使用本地视频
重新绑定
清除绑定
这个入口当前只在桌面平台显示,不在移动端显示。
平台范围
这个功能当前面向桌面平台,UI 开关基于项目内的桌面平台抽象
按当前实现意图,桌面平台包括:
Windows
macOS
Linux
与现有逻辑的关系
不会替换原有在线数据源逻辑
如果当前剧集没有本地绑定,则行为与现有版本一致
如果本地绑定文件已经不存在,则本地媒体源不会返回可播放结果
本地文件只是作为一个额外的、可选择的特殊媒体源接入现有流程
已知限制
需要用户自己为每个新视频绑定本地视频,不过如果后续可以考虑增加自动绑定功能
潜在风险
弹幕加载流程会使用当前选中视频的一些信息参与匹配,包括文件名、文件大小以及视频时长。
因此,如果用户为某一集绑定了错误的视频,尤其是在视频时长与实际剧集差异较大时,可能出现弹幕匹配结果不准确
只能通过手动时间校准部分修正,无法完全解决“不同剪辑版本”带来的时间轴差异
当前实现没有针对“错误绑定但文件本身合法”的场景做额外阻止,因为从程序角度它仍然是一个有效的本地媒体文件。
自动相关功能会基于当前实际播放文件的时长工作
例如:自动标记已观看、自动连播下一集、播放进度记忆与恢复
这些逻辑依赖播放器当前返回的视频时长。
因此,如果用户绑定的是错误视频,且视频长度明显不同于目标剧集,可能导致:
自动标记已观看触发时机不准确
自动切换下一集的时机不准确
播放进度恢复行为基于错误文件长度工作
从当前测试看,这类情况更可能表现为逻辑偏差,而不是直接导致程序崩溃。
当前没有对“错误绑定”做内容级校验
这意味着功能设计上默认允许用户显式绑定任意本地视频文件;相应地,错误绑定带来的行为偏差也需要由用户自行承担。
验证情况
我在Windows平台上进行了编译,并绑定了本地视频进行观看,目前弹幕等都是正常的,但是无法验证来自弹弹play是否正常,不过从代码的角度是看应该没有问题
后续可选优化
如果这个方向可以接受,后续我认为还可以继续补充:
在本地绑定文件失效时提供更明确的 UI 提示
在恢复播放进度时增加更严格的边界保护
增加自动绑定等自动化功能
增加对Android平台的支持