Emby高级教程:中文搜索增强实现教程

2022-08-28 16:47:07 27点赞 213收藏 21评论

【写作说明】

整体思路和操作来源于B站大神 Choyakawa,本人也是小白一枚,只是对自己的操作过程做一个详细记录。

【写作缘由】

Emby 的搜索功能太烂了,中文支持极差。通过分析Emby数据库采用sqlite3,sqlite3的原生FTS索引本来中文搜索就比较烂,所以Emby的搜索烂这也不能完全算是Emby的锅。

Emby本身采用c# net跨平台开发,我们可以通过反编译的方式修改搜索功能,使用wangfenjin大神的simple FTS扩展插件,建立FTS索引搜索,以此来支持中文拼音全拼搜索,中文拼音首字母搜索。

【效果展示】

Emby高级教程:中文搜索增强实现教程

Emby高级教程:中文搜索增强实现教程

【simple插件介绍】

simple 是一个支持中文和拼音的 sqlite3 fts5 拓展。它完整提供了 微信移动端的全文检索多音字问题解决方案 一文中的方案四,非常简单和高效地支持中文及拼音的搜索。

【准备工作和注意事项】

1、 .Net反编译工具

  • 推荐使用 dnSpyEx/dnSpy 的最新版本6.2,不要使用 dnSpy/dnSpy 6.1.8,

  • 反编译中所有的修改请使用编辑方法而不是编辑类

2、SQLite 数据库管理软件:所有的都可以,比如Navicat,也可以使用命令行。

3、请自行查找所用平台Emby的安装目录,本教程需要修改三个文件:

  • 软件安装目录下system目录下的SQLitePCL.pretty.dll文件

  • 软件安装目录下system目录下的Emby.Server.Implementations.dll文件

  • 软件安装目录下data目录下的library.db文件

注意:请做好这三个文件的备份,以防数据丢失。Emby高级教程:中文搜索增强实现教程

system文件夹下的dll文件之间存在依赖,建议将system文件夹(包含所有文件)拷贝出来。

4、所有的修改请在Emby关闭的情况下进行。

5、所用到的工具:dnSpyEx/dnSpy 和 wangfenjin/simple 请自行到全球最大的代码托管网站搜索下载。

【修改SQLitePCL.pretty.dll】

反编译修改 SQLitePCL.pretty.dll 文件中 Emby链接SQLite 数据库的方法,增加允许运行时可加载扩展 sqlite3_enable_load_extension 的 SQLite C - API 调用。

raw.sqlite3_enable_load_extension(sqlite, 1);

Emby高级教程:中文搜索增强实现教程

Emby高级教程:中文搜索增强实现教程

Emby高级教程:中文搜索增强实现教程

Emby高级教程:中文搜索增强实现教程

Emby高级教程:中文搜索增强实现教程

Emby高级教程:中文搜索增强实现教程

【修改Emby.Server.Implementations.dll】

1、点击 文件-----打开 选择 Emby.Server.Implementations.dll

2、修改 Emby FTS5实现,使用自定义 tokenizer

using System.IO;

databaseConnection.Execute("SELECT load_extension('" + Path.Combine(this._config.ApplicationPaths.DataPath, "libsimple") + "');");

Emby高级教程:中文搜索增强实现教程

Emby高级教程:中文搜索增强实现教程

Emby高级教程:中文搜索增强实现教程

Emby高级教程:中文搜索增强实现教程

还是在这个方法下面,一长串SQL中,修改FTS5 tokenize 为simple

Emby高级教程:中文搜索增强实现教程

Emby高级教程:中文搜索增强实现教程

private string GetJoinCommandText 中 @SearchTerm 修改为 simple_query(@SearchTerm)

Emby高级教程:中文搜索增强实现教程

Emby高级教程:中文搜索增强实现教程

3、兼容输入法候选词(作者说能省,但是实际测试不能省,省了搜索结果为零),重写CreateSearchTerm方法

  • 需要增加引用System.Text.RegularExpressions

using System.Text.RegularExpressions;

private string CreateSearchTerm(string searchTerm)
{
string newSearchTerm = searchTerm;
if (Regex.Matches(searchTerm, "'").Count >= 3)
{
newSearchTerm = searchTerm.Replace("'", "");
}
return newSearchTerm;
}

Emby高级教程:中文搜索增强实现教程

Emby高级教程:中文搜索增强实现教程

4、修改搜索实现部分代码,增强和优化部分功能

if (!string.IsNullOrEmpty(query.NameStartsWith))
{
query.SearchTerm = query.NameStartsWith;
query.NameStartsWith = null;
}

if (!string.IsNullOrEmpty(query.SearchTerm) && query.IncludeItemTypes.Length == 0)
{
query.IncludeItemTypes = new string[]{ "Movie", "Series", "BoxSet", "Audio", "MusicAlbum","MusicArtist"};
}

Emby高级教程:中文搜索增强实现教程

Emby高级教程:中文搜索增强实现教程

5、修改EnableJoinFtsSearch

  • 增加Limit=50 的条件限制EnableFts

说明:此处作者给的,增加Limit=50、GroupProgramsBySeries=true两个条件限制EnableFts,实测这样修改的话,搜索页面即时没有结果也会默认出现50个无关结果,所以我只增加了Limit=50的限制。

private bool EnableJoinFtsSearch(InternalItemsQuery query)

{

int? limit = query.Limit;

int num = 50;

return (limit.GetValueOrDefault() == num & limit != null) && (!string.IsNullOrEmpty(query.SearchTerm) || (!string.IsNullOrEmpty(query.Name) && this.IsNameSearchaleWithFts(query.Name)));

}

Emby高级教程:中文搜索增强实现教程

6、保存Emby.Server.Implementations.dll

Emby高级教程:中文搜索增强实现教程

Emby高级教程:中文搜索增强实现教程

【修改SQLite 数据库,重建索引表】

注意拷贝library.db的时候请在Emby关闭的情况下进行,如果有library.db、library.db-shm、library.db-wal三个文件请同时备份并拷贝出来进行修改,修改后一般只剩一个文件:library.db,请用这个文件替换原有的三个文件。

以Mac的Navicat为例:

Emby高级教程:中文搜索增强实现教程

Emby高级教程:中文搜索增强实现教程

Emby高级教程:中文搜索增强实现教程

断开并删除链接即可

【替换文件】

  1. 请将修改的两个dll文件替换源文件

  2. 将修改后的db数据库文件替换源文件

  3. wangfenjin/simple 项目下下载对应平台下的simple编译好的插件并放在和数据库相同的目录下。注意:群晖请下载 libsimple-linux-ubuntu-18.04.zip,实在不行的请自行编译。

  4. 在linux下替换文件时请注意修改权限。

【总结】

如果你看的一头雾水请不要尝试,对linux命令了解甚少请不要尝试。

作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

展开 收起
21评论

  • 精彩
  • 最新
  • 其实最简单的办法就是改好生成一个docker镜像来分享,这种方式是不是就怕emby升级导致数据库崩了啊

    校验提示文案

    提交
    用开心版的比较多,个人原因还是不太想涉及这个,回头可以基于docker原版搞一个镜像。此处只做技术分享

    校验提示文案

    提交
    收起所有回复
  • 非常好!我选择plex

    校验提示文案

    提交
    要不是黄鱼没有plex没有车 我也不想上emby的车 有一说一 确实很尴尬 易用不如plex 收费不如jellyph 轮解码 我的nas又没核显 [喜极而泣]

    校验提示文案

    提交
    plex只花了30块钱解锁了远程播放内购。 其他没花钱。感觉够了

    校验提示文案

    提交
    收起所有回复
  • 膜拜大佬 没看懂 [喜极而泣]

    校验提示文案

    提交
  • 有点高级。。算了吧

    校验提示文案

    提交
  • docker开心版怎么搞

    校验提示文案

    提交
  • 单开个docker开心版呗

    校验提示文案

    提交
  • jellyfin支持不 他俩师出同门

    校验提示文案

    提交
  • 一旦升级,就全完了

    校验提示文案

    提交
  • 你这个太深奥,教我怎么替换docker开心版文件就可以了

    校验提示文案

    提交
  • 这个是方便在emby里面按中文搜影片?

    校验提示文案

    提交
  • 有没开心版的教程。。

    校验提示文案

    提交
  • 点赞不收藏了

    校验提示文案

    提交
  • 非常好,感谢分享 让我的docker下emby搜索更完美

    校验提示文案

    提交
  • 现在是个设备就能本地远程解码4k,nas上的jellyfin已经被我删了,电视机上用kodi,清爽得很。

    校验提示文案

    提交
  • 为什么dnspy一点编译就报一堆错误,哪怕什么内容都不改

    校验提示文案

    提交
  • docker弄完怎么整进去?

    校验提示文案

    提交
  • 这三个文件是通用的吗?能作者分享这几个编译好的,然后直接替换吗?

    校验提示文案

    提交
  • 如果可以挂MySQL很多问题都解决了

    校验提示文案

    提交
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
213
扫一下,分享更方便,购买更轻松