mirror of
https://github.com/Aminark/legado-ios.git
synced 2026-10-20 19:21:22 +08:00
43 lines
2.3 KiB
Swift
43 lines
2.3 KiB
Swift
import Foundation
|
|
|
|
public enum RuleImportInput: Sendable, Equatable {
|
|
case json(String)
|
|
case remote(URL, withoutUserAgent: Bool)
|
|
|
|
public static func parse(_ input: String, kind: String = "bookSource") throws -> Self {
|
|
var value = input.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
if value.hasPrefix("{"), value.hasSuffix("}") { return .json(value) }
|
|
if value.hasPrefix("["), value.hasSuffix("]"), (try? JSONValue.decode(data: Data(value.utf8))) != nil {
|
|
return .json(value)
|
|
}
|
|
if let start = value.range(of: "]("), value.hasSuffix(")") {
|
|
value = String(value[start.upperBound..<value.index(before: value.endIndex)])
|
|
}
|
|
value = value.trimmingCharacters(in: CharacterSet(charactersIn: "*`<> \n\r\t"))
|
|
if let url = URL(string: value), url.scheme?.lowercased() == "legado" {
|
|
guard url.host?.lowercased() == "import", url.path.lowercased() == "/" + kind.lowercased(),
|
|
let src = URLComponents(url: url, resolvingAgainstBaseURL: false)?.queryItems?.first(where: { $0.name == "src" })?.value,
|
|
!src.lowercased().hasPrefix("legado:") else {
|
|
throw BookSourceImportError.invalidDocument("二维码或深链类型不匹配,需要 \(kind)")
|
|
}
|
|
return try parse(src, kind: kind)
|
|
}
|
|
let marker = "#requestWithoutUA"
|
|
let withoutUA = value.hasSuffix(marker)
|
|
if withoutUA { value = String(value.dropLast(marker.count)) }
|
|
guard let url = URL(string: value), let scheme = url.scheme?.lowercased(),
|
|
["http", "https"].contains(scheme), url.host?.isEmpty == false else {
|
|
throw BookSourceImportError.invalidDocument("请输入 JSON、HTTP(S) 地址或 Legado 导入二维码")
|
|
}
|
|
return .remote(url, withoutUserAgent: withoutUA)
|
|
}
|
|
|
|
public func request() -> URLRequest? {
|
|
guard case .remote(let url, let withoutUA) = self else { return nil }
|
|
var request = URLRequest(url: url, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 45)
|
|
request.setValue("application/json, text/plain, */*", forHTTPHeaderField: "Accept")
|
|
if withoutUA { request.setValue("null", forHTTPHeaderField: "User-Agent") }
|
|
return request
|
|
}
|
|
}
|