作者:jacksky6
【写作说明】
整体思路和操作来源于B站大神 Choyakawa,本人也是小白一枚,只是对自己的操作过程做一个详细记录。
【写作缘由】
Emby 的搜索功能太烂了,中文支持极差。通过分析Emby数据库采用sqlite3,sqlite3的原生FTS索引本来中文搜索就比较烂,所以Emby的搜索烂这也不能完全算是Emby的锅。
Emby本身采用c# net跨平台开发,我们可以通过反编译的方式修改搜索功能,使用wangfenjin大神的simple FTS扩展插件,建立FTS索引搜索,以此来支持中文拼音全拼搜索,中文拼音首字母搜索。
【效果展示】
【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文件
注意:请做好这三个文件的备份,以防数据丢失。
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.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") + "');");
还是在这个方法下面,一长串SQL中,修改FTS5 tokenize 为simple
private string GetJoinCommandText 中 @SearchTerm 修改为 simple_query(@SearchTerm)
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;
}
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"};
}
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)));
}
6、保存Emby.Server.Implementations.dll
【修改SQLite 数据库,重建索引表】
注意拷贝library.db的时候请在Emby关闭的情况下进行,如果有library.db、library.db-shm、library.db-wal三个文件请同时备份并拷贝出来进行修改,修改后一般只剩一个文件:library.db,请用这个文件替换原有的三个文件。
以Mac的Navicat为例:
断开并删除链接即可
【替换文件】
请将修改的两个dll文件替换源文件
将修改后的db数据库文件替换源文件
在
wangfenjin/simple 项目下下载对应平台下的simple编译好的插件并放在和数据库相同的目录下。注意:群晖请下载 libsimple-linux-ubuntu-18.04.zip,实在不行的请自行编译。
在linux下替换文件时请注意修改权限。
【总结】
如果你看的一头雾水请不要尝试,对linux命令了解甚少请不要尝试。
4000520066 欢迎批评指正
All Rights Reserved 新浪公司 版权所有