fix search

This commit is contained in:
JinJiangHuang
2026-03-01 22:57:20 +08:00
parent ee8c71dcd4
commit e58322339f
4 changed files with 58 additions and 4 deletions
+5 -1
View File
@@ -15,6 +15,8 @@ struct SourceBean: Codable, Identifiable, Hashable {
let searchable: Int
/// 0 1
let filterable: Int
/// 0 1 remote quick
let quickSearch: Int
/// Swift
let playerType: Int
/// 0 XML1 JSON3 JAR4 Remote
@@ -23,13 +25,14 @@ struct SourceBean: Codable, Identifiable, Hashable {
let ext: String?
init(key: String = "", name: String = "", api: String = "",
searchable: Int = 1, filterable: Int = 1,
searchable: Int = 1, filterable: Int = 1, quickSearch: Int = 0,
playerType: Int = 0, type: Int = 1, ext: String? = nil) {
self.key = key
self.name = name
self.api = api
self.searchable = searchable
self.filterable = filterable
self.quickSearch = quickSearch
self.playerType = playerType
self.type = type
self.ext = ext
@@ -37,6 +40,7 @@ struct SourceBean: Codable, Identifiable, Hashable {
var isSearchable: Bool { searchable == 1 }
var isFilterable: Bool { filterable == 1 }
var isQuickSearchEnabled: Bool { quickSearch == 1 }
/// Swift type=3 JAR/Spider Java
var isSupportedInSwift: Bool {
+1
View File
@@ -519,6 +519,7 @@ class ApiConfig: ObservableObject {
api: site.api ?? "",
searchable: site.searchable?.value ?? 1,
filterable: site.filterable?.value ?? 1,
quickSearch: site.quickSearch?.value ?? 0,
playerType: site.playerType?.value ?? 0,
type: site.type?.value ?? 1,
ext: site.ext?.stringValue
+42 -3
View File
@@ -325,9 +325,10 @@ class SourceService {
url = "\(api)?wd=\(encodedKeyword)"
} else if sourceBean.type == 4 {
// Type 4:
let quickValue = sourceBean.isQuickSearchEnabled ? "true" : "false"
url = api.contains("?")
? "\(api)&wd=\(encodedKeyword)&ac=detail&quick=false"
: "\(api)?wd=\(encodedKeyword)&ac=detail&quick=false"
? "\(api)&wd=\(encodedKeyword)&ac=detail&quick=\(quickValue)"
: "\(api)?wd=\(encodedKeyword)&ac=detail&quick=\(quickValue)"
// extend
if let ext = sourceBean.ext, !ext.isEmpty {
@@ -345,7 +346,8 @@ class SourceService {
}
let jsonStr = try await network.getString(from: url)
return try parseVideoList(jsonStr, sourceKey: sourceBean.key, type: sourceBean.type)
let videos = try parseVideoList(jsonStr, sourceKey: sourceBean.key, type: sourceBean.type)
return filterSearchResults(videos, keyword: keyword)
}
///
@@ -374,6 +376,43 @@ class SourceService {
}
}
/// /
private func filterSearchResults(_ videos: [Movie.Video], keyword: String) -> [Movie.Video] {
let tokens = keyword
.split(whereSeparator: \.isWhitespace)
.map { normalizeSearchText(String($0)) }
.filter { !$0.isEmpty }
guard !tokens.isEmpty else { return videos }
return videos.filter { video in
let searchableText = normalizeSearchText([
video.name,
video.note,
video.actor,
video.director,
video.type,
video.area,
video.year
].joined(separator: " "))
guard !searchableText.isEmpty else { return false }
return tokens.allSatisfy { searchableText.contains($0) }
}
}
private func normalizeSearchText(_ text: String) -> String {
let folded = text.folding(
options: [.caseInsensitive, .diacriticInsensitive, .widthInsensitive],
locale: .current
)
let scalars = folded.unicodeScalars.filter { scalar in
!CharacterSet.whitespacesAndNewlines.contains(scalar) &&
!CharacterSet.punctuationCharacters.contains(scalar) &&
!CharacterSet.symbols.contains(scalar)
}
return String(String.UnicodeScalarView(scalars)).lowercased()
}
// MARK: - Extend
/// extend Android getFixUrl
+10
View File
@@ -17,6 +17,8 @@ class SearchViewModel: ObservableObject {
///
private let sourceService = SourceService.shared
///
private var latestSearchRequestId: UUID = UUID()
///
init() {
@@ -27,6 +29,8 @@ class SearchViewModel: ObservableObject {
func search() async {
let trimmed = keyword.trimmingCharacters(in: .whitespacesAndNewlines)
guard !trimmed.isEmpty else { return }
let requestId = UUID()
latestSearchRequestId = requestId
isSearching = true
errorMessage = nil
@@ -37,6 +41,7 @@ class SearchViewModel: ObservableObject {
//
let videos = await sourceService.searchAll(keyword: trimmed)
guard requestId == latestSearchRequestId else { return }
self.results = videos
if videos.isEmpty {
@@ -50,13 +55,18 @@ class SearchViewModel: ObservableObject {
func searchInSource(_ source: SourceBean) async {
let trimmed = keyword.trimmingCharacters(in: .whitespacesAndNewlines)
guard !trimmed.isEmpty else { return }
let requestId = UUID()
latestSearchRequestId = requestId
isSearching = true
errorMessage = nil
do {
let videos = try await sourceService.search(sourceBean: source, keyword: trimmed)
guard requestId == latestSearchRequestId else { return }
self.results = videos
} catch {
guard requestId == latestSearchRequestId else { return }
errorMessage = error.localizedDescription
}