mirror of
https://github.com/cranci1/Sora.git
synced 2026-04-21 08:32:00 +00:00
Added logging for js modules, and for modules(adding/removing)
This commit is contained in:
parent
9eab39a3bc
commit
292c5ca770
3 changed files with 37 additions and 27 deletions
|
|
@ -17,45 +17,52 @@ class JSController: ObservableObject {
|
||||||
|
|
||||||
private func setupContext() {
|
private func setupContext() {
|
||||||
let logFunction: @convention(block) (String) -> Void = { message in
|
let logFunction: @convention(block) (String) -> Void = { message in
|
||||||
Logger.shared.log("JavaScript log: \(message)")
|
Logger.shared.log("JavaScript log: \(message)", level: .info)
|
||||||
}
|
}
|
||||||
context.setObject(logFunction, forKeyedSubscript: "log" as NSString)
|
context.setObject(logFunction, forKeyedSubscript: "log" as NSString)
|
||||||
|
|
||||||
|
// Override console.log
|
||||||
|
let consoleLogOverride = """
|
||||||
|
var console = {
|
||||||
|
log: function() {
|
||||||
|
var message = Array.from(arguments).map(String).join(" ");
|
||||||
|
log(message);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
"""
|
||||||
|
context.evaluateScript(consoleLogOverride)
|
||||||
|
|
||||||
|
// Add other JavaScript functions like fetchNative
|
||||||
let fetchNativeFunction: @convention(block) (String, JSValue, JSValue) -> Void = { urlString, resolve, reject in
|
let fetchNativeFunction: @convention(block) (String, JSValue, JSValue) -> Void = { urlString, resolve, reject in
|
||||||
guard let url = URL(string: urlString) else {
|
guard let url = URL(string: urlString) else {
|
||||||
Logger.shared.log("Invalid URL")
|
Logger.shared.log("Invalid URL", level: .error)
|
||||||
reject.call(withArguments: ["Invalid URL"])
|
reject.call(withArguments: ["Invalid URL"])
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
let task = URLSession.custom.dataTask(with: url) { data, _, error in
|
let task = URLSession.shared.dataTask(with: url) { data, _, error in
|
||||||
if let error = error {
|
if let error = error {
|
||||||
Logger.shared.log("Network error in fetchNativeFunction: \(error.localizedDescription)")
|
Logger.shared.log("Network error in fetchNative: \(error.localizedDescription)", level: .error)
|
||||||
reject.call(withArguments: [error.localizedDescription])
|
reject.call(withArguments: [error.localizedDescription])
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
guard let data = data else {
|
guard let data = data, let text = String(data: data, encoding: .utf8) else {
|
||||||
Logger.shared.log("No data in response")
|
Logger.shared.log("Failed to decode response data", level: .error)
|
||||||
reject.call(withArguments: ["No data"])
|
reject.call(withArguments: ["Failed to decode response data"])
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if let text = String(data: data, encoding: .utf8) {
|
resolve.call(withArguments: [text])
|
||||||
resolve.call(withArguments: [text])
|
|
||||||
} else {
|
|
||||||
Logger.shared.log("Unable to decode data to text")
|
|
||||||
reject.call(withArguments: ["Unable to decode data"])
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
task.resume()
|
task.resume()
|
||||||
}
|
}
|
||||||
context.setObject(fetchNativeFunction, forKeyedSubscript: "fetchNative" as NSString)
|
context.setObject(fetchNativeFunction, forKeyedSubscript: "fetchNative" as NSString)
|
||||||
|
|
||||||
let fetchDefinition = """
|
let fetchDefinition = """
|
||||||
function fetch(url) {
|
function fetch(url) {
|
||||||
return new Promise(function(resolve, reject) {
|
return new Promise(function(resolve, reject) {
|
||||||
fetchNative(url, resolve, reject);
|
fetchNative(url, resolve, reject);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
context.evaluateScript(fetchDefinition)
|
context.evaluateScript(fetchDefinition)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -182,6 +189,7 @@ class JSController: ObservableObject {
|
||||||
|
|
||||||
if let parseFunction = self.context.objectForKeyedSubscript("extractStreamUrl"),
|
if let parseFunction = self.context.objectForKeyedSubscript("extractStreamUrl"),
|
||||||
let streamUrl = parseFunction.call(withArguments: [html]).toString() {
|
let streamUrl = parseFunction.call(withArguments: [html]).toString() {
|
||||||
|
Logger.shared.log("Staring stream from: \(streamUrl)", level: .info)
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
completion(streamUrl)
|
completion(streamUrl)
|
||||||
}
|
}
|
||||||
|
|
@ -230,13 +238,13 @@ class JSController: ObservableObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
Logger.shared.log("Failed to parse JSON")
|
Logger.shared.log("Failed to parse JSON", level: .error)
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
completion([])
|
completion([])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
Logger.shared.log("JSON parsing error: \(error)")
|
Logger.shared.log("JSON parsing error: \(error)", level: .error)
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
completion([])
|
completion([])
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@ class Logger {
|
||||||
let dateFormatter = DateFormatter()
|
let dateFormatter = DateFormatter()
|
||||||
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
|
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
|
||||||
return logs.map { "[\(dateFormatter.string(from: $0.timestamp))] [\($0.level.rawValue)] \($0.message)" }
|
return logs.map { "[\(dateFormatter.string(from: $0.timestamp))] [\($0.level.rawValue)] \($0.message)" }
|
||||||
.joined(separator: "\n---\n")
|
.joined(separator: "\n----------------------------------------------------------\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
func clearLogs() {
|
func clearLogs() {
|
||||||
|
|
@ -82,4 +82,4 @@ class Logger {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -103,19 +103,21 @@ class ModuleManager: ObservableObject {
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
self.modules.append(module)
|
self.modules.append(module)
|
||||||
self.saveModules()
|
self.saveModules()
|
||||||
|
Logger.shared.log("Added module: \(module.metadata.sourceName)")
|
||||||
}
|
}
|
||||||
|
|
||||||
return module
|
return module
|
||||||
}
|
}
|
||||||
|
|
||||||
func deleteModule(_ module: ScrapingModule) {
|
func deleteModule(_ module: ScrapingModule) {
|
||||||
let localUrl = getDocumentsDirectory().appendingPathComponent(module.localPath)
|
let localUrl = getDocumentsDirectory().appendingPathComponent(module.localPath)
|
||||||
try? fileManager.removeItem(at: localUrl)
|
try? fileManager.removeItem(at: localUrl)
|
||||||
|
|
||||||
modules.removeAll { $0.id == module.id }
|
modules.removeAll { $0.id == module.id }
|
||||||
saveModules()
|
saveModules()
|
||||||
|
Logger.shared.log("Deleted module: \(module.metadata.sourceName)")
|
||||||
}
|
}
|
||||||
|
|
||||||
func getModuleContent(_ module: ScrapingModule) throws -> String {
|
func getModuleContent(_ module: ScrapingModule) throws -> String {
|
||||||
let localUrl = getDocumentsDirectory().appendingPathComponent(module.localPath)
|
let localUrl = getDocumentsDirectory().appendingPathComponent(module.localPath)
|
||||||
return try String(contentsOf: localUrl, encoding: .utf8)
|
return try String(contentsOf: localUrl, encoding: .utf8)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue