MySQL如何实现多用户独立的Kodi观看标记字段且无需修改Kodi代码
可行性结论
你要求的「Kodi侧查询语句无改动、MySQL按登录账号返回不同seen字段值」的需求完全可实现,无需修改Kodi源码,也无需部署多套MySQL实例,具体落地方案如下:
方案1:MySQL视图+用户关联表无侵入方案(最符合需求)
核心原理是用同名视图替代原业务表,结合MySQL内置CURRENT_USER()函数动态获取当前登录账号,关联不同用户的观看状态数据,Kodi侧完全感知不到底层变化。
具体操作步骤:
- 第一步:拆分原表结构
假设存储媒体路径的原表名为media_files,原包含file_id(主键)、file_path、seen等字段,先做如下调整:- 将原表重命名为
media_files_base,删除原表中的seen字段 - 新建用户观看状态关联表
user_watch_status,字段设置为:user_namevarchar(64):存储MySQL登录用户名file_idint:关联media_files_base的文件主键seentinyint(1):对应用户的观看标记- 联合主键设置为(
user_name,file_id),避免重复数据
- 将原表重命名为
- 第二步:创建与原表同名的视图
执行以下SQL创建视图,替代原表对外提供服务:CREATE VIEW media_files AS SELECT base.file_id, base.file_path, -- 此处添加原表所有其他需要返回的字段 IFNULL(status.seen, 0) AS seen FROM media_files_base base LEFT JOIN user_watch_status status ON base.file_id = status.file_id AND status.user_name = SUBSTRING_INDEX(CURRENT_USER(), '@', 1); - 第三步:兼容Kodi的更新操作
如果Kodi需要更新seen字段,给视图添加INSTEAD OF触发器,自动将状态写入关联表:DELIMITER // CREATE TRIGGER media_files_seen_update INSTEAD OF UPDATE ON media_files FOR EACH ROW BEGIN -- 仅更新seen字段时写入用户状态表 IF OLD.seen != NEW.seen THEN REPLACE INTO user_watch_status (user_name, file_id, seen) VALUES (SUBSTRING_INDEX(CURRENT_USER(), '@', 1), OLD.file_id, NEW.seen); END IF; -- 其他字段更新同步到基础表 UPDATE media_files_base SET file_path = NEW.file_path /* 此处添加其他需要更新的字段 */ WHERE file_id = OLD.file_id; END // DELIMITER ; - 第四步:配置用户权限
给每个家人创建独立的MySQL登录账号,仅开放media_files视图的读写权限,关闭基础表、关联表的访问权限即可。
方案2:低门槛替代方案(适配性更强)
如果Kodi的复杂查询逻辑导致视图触发器适配成本高,可以选择以下更简单的落地方案:
- 单实例多库方案:同一个MySQL实例下为每个用户创建独立的Kodi库,库名加用户名后缀,初始批量导入媒体路径基础数据,仅需要修改各用户Kodi客户端的数据库连接配置中的库名即可,无需修改源码。
- Kodi原生多用户插件方案:直接安装Kodi官方仓库的多用户管理插件,插件会自动处理观看状态、播放进度等数据的用户隔离,无需操作数据库。
内容的提问来源于stack exchange,提问作者user9118749
相关产品推荐
相关产品推荐

