diff --git a/kernel/conf/search.go b/kernel/conf/search.go index 31b36d163..1eb93f396 100644 --- a/kernel/conf/search.go +++ b/kernel/conf/search.go @@ -38,6 +38,10 @@ type Search struct { HTMLBlock bool `json:"htmlBlock"` EmbedBlock bool `json:"embedBlock"` DatabaseBlock bool `json:"databaseBlock"` + AudioBlock bool `json:"audioBlock"` + VideoBlock bool `json:"videoBlock"` + IFrameBlock bool `json:"iframeBlock"` + WidgetBlock bool `json:"widgetBlock"` Limit int `json:"limit"` CaseSensitive bool `json:"caseSensitive"` @@ -76,6 +80,10 @@ func NewSearch() *Search { HTMLBlock: true, EmbedBlock: false, DatabaseBlock: true, + AudioBlock: true, + VideoBlock: true, + IFrameBlock: true, + WidgetBlock: true, Limit: 64, CaseSensitive: false, @@ -195,11 +203,30 @@ func (s *Search) TypeFilter() string { buf.WriteByte('\'') buf.WriteString(",") } - - // 无法搜索到 iframe 块、视频块和音频块 https://github.com/siyuan-note/siyuan/issues/3604 - buf.WriteString("'iframe','video','audio',") - // 挂件块支持内置属性搜索 https://github.com/siyuan-note/siyuan/issues/4497 - buf.WriteString("'widget',") + if s.AudioBlock { + buf.WriteByte('\'') + buf.WriteString(treenode.TypeAbbr(ast.NodeAudio.String())) + buf.WriteByte('\'') + buf.WriteString(",") + } + if s.VideoBlock { + buf.WriteByte('\'') + buf.WriteString(treenode.TypeAbbr(ast.NodeVideo.String())) + buf.WriteByte('\'') + buf.WriteString(",") + } + if s.IFrameBlock { + buf.WriteByte('\'') + buf.WriteString(treenode.TypeAbbr(ast.NodeIFrame.String())) + buf.WriteByte('\'') + buf.WriteString(",") + } + if s.WidgetBlock { + buf.WriteByte('\'') + buf.WriteString(treenode.TypeAbbr(ast.NodeWidget.String())) + buf.WriteByte('\'') + buf.WriteString(",") + } ret := buf.String() if "" == ret { diff --git a/kernel/mobile/kernel.go b/kernel/mobile/kernel.go index 7aff63245..8ecd3d9f7 100644 --- a/kernel/mobile/kernel.go +++ b/kernel/mobile/kernel.go @@ -99,6 +99,10 @@ func GetAssetAbsPath(asset string) (ret string) { return } +func GetMimeTypeByExt(ext string) string { + return util.GetMimeTypeByExt(ext) +} + func SetTimezone(container, appDir, timezoneID string) { if "ios" == container { os.Setenv("ZONEINFO", filepath.Join(appDir, "app", "zoneinfo.zip")) diff --git a/kernel/model/search.go b/kernel/model/search.go index 925ca5b14..0fcd5f484 100644 --- a/kernel/model/search.go +++ b/kernel/model/search.go @@ -971,6 +971,10 @@ func buildTypeFilter(types map[string]bool) string { s.HTMLBlock = types["htmlBlock"] s.EmbedBlock = types["embedBlock"] s.DatabaseBlock = types["databaseBlock"] + s.AudioBlock = types["audioBlock"] + s.VideoBlock = types["videoBlock"] + s.IFrameBlock = types["iFrameBlock"] + s.WidgetBlock = types["widgetBlock"] } else { s.Document = Conf.Search.Document s.Heading = Conf.Search.Heading @@ -985,6 +989,10 @@ func buildTypeFilter(types map[string]bool) string { s.HTMLBlock = Conf.Search.HTMLBlock s.EmbedBlock = Conf.Search.EmbedBlock s.DatabaseBlock = Conf.Search.DatabaseBlock + s.AudioBlock = Conf.Search.AudioBlock + s.VideoBlock = Conf.Search.VideoBlock + s.IFrameBlock = Conf.Search.IFrameBlock + s.WidgetBlock = Conf.Search.WidgetBlock } return s.TypeFilter() } diff --git a/kernel/util/file.go b/kernel/util/file.go index 9dafed651..4af6e40b0 100644 --- a/kernel/util/file.go +++ b/kernel/util/file.go @@ -20,6 +20,7 @@ import ( "bytes" "io" "io/fs" + "mime" "os" "path" "path/filepath" @@ -28,10 +29,26 @@ import ( "github.com/88250/gulu" "github.com/88250/lute/ast" + "github.com/gabriel-vasile/mimetype" "github.com/siyuan-note/filelock" "github.com/siyuan-note/logging" ) +func GetMimeTypeByExt(filePath string) (ret string) { + ret = mime.TypeByExtension(filepath.Ext(filePath)) + if "" == ret { + m, err := mimetype.DetectFile(filePath) + if nil != err { + logging.LogErrorf("detect mime type of [%s] failed: %s", filePath, err) + return + } + if nil != m { + ret = m.String() + } + } + return +} + func IsSymlinkPath(absPath string) bool { fi, err := os.Lstat(absPath) if nil != err {