From dd3b97b0f2fd24aa41a080e686027a5ec30f64c7 Mon Sep 17 00:00:00 2001 From: cranci1 <100066266+cranci1@users.noreply.github.com> Date: Sun, 5 Jan 2025 16:22:26 +0100 Subject: [PATCH] bug fixes --- Sora-JS.xcodeproj/project.pbxproj | 6 ++-- Sora-JS/Info.plist | 10 +++--- Sora-JS/Loaders/JSController.swift | 8 ++--- Sora-JS/Modules/Modules.swift | 6 ++-- Sora-JS/Views/SearchView.swift | 31 +++++++++++-------- .../SubViews/SettingsViewModule.swift | 17 ++++++---- 6 files changed, 45 insertions(+), 33 deletions(-) diff --git a/Sora-JS.xcodeproj/project.pbxproj b/Sora-JS.xcodeproj/project.pbxproj index ff8f7b7..cd6dc1c 100644 --- a/Sora-JS.xcodeproj/project.pbxproj +++ b/Sora-JS.xcodeproj/project.pbxproj @@ -351,6 +351,7 @@ ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = "Sora-JS/Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = Sora; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; @@ -361,7 +362,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 0.2.0; PRODUCT_BUNDLE_IDENTIFIER = "me.cranci.Sora-JS"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; @@ -382,6 +383,7 @@ ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = "Sora-JS/Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = Sora; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; @@ -392,7 +394,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 0.2.0; PRODUCT_BUNDLE_IDENTIFIER = "me.cranci.Sora-JS"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; diff --git a/Sora-JS/Info.plist b/Sora-JS/Info.plist index cf5e9dd..6a6654d 100644 --- a/Sora-JS/Info.plist +++ b/Sora-JS/Info.plist @@ -2,10 +2,10 @@ - NSAppTransportSecurity - - NSAllowsArbitraryLoads - - + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + diff --git a/Sora-JS/Loaders/JSController.swift b/Sora-JS/Loaders/JSController.swift index 7c21259..587c9ce 100644 --- a/Sora-JS/Loaders/JSController.swift +++ b/Sora-JS/Loaders/JSController.swift @@ -28,7 +28,7 @@ class JSController: ObservableObject { context.evaluateScript(script) } - func scrapeAnime(keyword: String, module: ScrapingModule, completion: @escaping ([AnimeItem]) -> Void) { + func searchContent(keyword: String, module: ScrapingModule, completion: @escaping ([MediaItem]) -> Void) { let searchUrl = module.metadata.searchBaseUrl.replacingOccurrences(of: "%s", with: keyword.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "") guard let url = URL(string: searchUrl) else { @@ -56,14 +56,14 @@ class JSController: ObservableObject { if let parseFunction = self.context.objectForKeyedSubscript("parseHTML"), let results = parseFunction.call(withArguments: [html]).toArray() as? [[String: String]] { - let animeItems = results.map { item in - AnimeItem( + let mediaItems = results.map { item in + MediaItem( title: item["title"] ?? "", imageUrl: item["image"] ?? "" ) } DispatchQueue.main.async { - completion(animeItems) + completion(mediaItems) } } else { print("Failed to parse results") diff --git a/Sora-JS/Modules/Modules.swift b/Sora-JS/Modules/Modules.swift index 67938e2..2308b50 100644 --- a/Sora-JS/Modules/Modules.swift +++ b/Sora-JS/Modules/Modules.swift @@ -8,14 +8,14 @@ import Foundation struct ModuleMetadata: Codable, Hashable { + let sourceName: String let author: String let iconUrl: String + let version: String let language: String - let mediaType: String + let baseUrl: String let searchBaseUrl: String let scriptUrl: String - let version: String - let description: String } struct ScrapingModule: Codable, Identifiable, Hashable { diff --git a/Sora-JS/Views/SearchView.swift b/Sora-JS/Views/SearchView.swift index cd144e7..3f7fc8c 100644 --- a/Sora-JS/Views/SearchView.swift +++ b/Sora-JS/Views/SearchView.swift @@ -8,7 +8,7 @@ import SwiftUI import Kingfisher -struct AnimeItem: Identifiable { +struct MediaItem: Identifiable { let id = UUID() let title: String let imageUrl: String @@ -18,7 +18,7 @@ struct SearchView: View { @StateObject private var jsController = JSController() @EnvironmentObject var moduleManager: ModuleManager @State private var searchText = "" - @State private var animeItems: [AnimeItem] = [] + @State private var mediaItems: [MediaItem] = [] @State private var isSearching = false @AppStorage("selectedModuleId") private var selectedModuleId: String? @@ -37,7 +37,7 @@ struct SearchView: View { .font(.headline) Text("Please select a module from settings") .font(.caption) - .foregroundColor(.gray) + .foregroundColor(.secondary) } .padding() .frame(maxWidth: .infinity) @@ -55,7 +55,7 @@ struct SearchView: View { } LazyVGrid(columns: [GridItem(.adaptive(minimum: 150))], spacing: 16) { - ForEach(animeItems) { item in + ForEach(mediaItems) { item in VStack { KFImage(URL(string: item.imageUrl)) .resizable() @@ -80,9 +80,9 @@ struct SearchView: View { ToolbarItem(placement: .navigationBarTrailing) { HStack { if let selectedModule = selectedModule { - Text(selectedModule.metadata.mediaType) + Text(selectedModule.metadata.sourceName) .font(.headline) - .foregroundColor(.gray) + .foregroundColor(.secondary) } Menu { ForEach(moduleManager.modules) { module in @@ -96,7 +96,7 @@ struct SearchView: View { .frame(width: 20, height: 20) .cornerRadius(4) - Text(module.metadata.mediaType) + Text(module.metadata.sourceName) Spacer() if module.id.uuidString == selectedModuleId { Image(systemName: "checkmark") @@ -106,18 +106,23 @@ struct SearchView: View { } } label: { Image(systemName: "chevron.up.chevron.down") - .foregroundColor(.gray) + .foregroundColor(.secondary) } } } } } .navigationViewStyle(StackNavigationViewStyle()) + .onChange(of: selectedModuleId) { _ in + if !searchText.isEmpty { + performSearch() + } + } } private func performSearch() { guard !searchText.isEmpty, let module = selectedModule else { - animeItems = [] + mediaItems = [] return } @@ -127,8 +132,8 @@ struct SearchView: View { do { let jsContent = try moduleManager.getModuleContent(module) jsController.loadScript(jsContent) - jsController.scrapeAnime(keyword: searchText, module: module) { items in - animeItems = items + jsController.searchContent(keyword: searchText, module: module) { items in + mediaItems = items isSearching = false } } catch { @@ -154,7 +159,7 @@ struct SearchBar: View { .overlay( HStack { Image(systemName: "magnifyingglass") - .foregroundColor(.gray) + .foregroundColor(.secondary) .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) .padding(.leading, 8) @@ -163,7 +168,7 @@ struct SearchBar: View { self.text = "" }) { Image(systemName: "multiply.circle.fill") - .foregroundColor(.gray) + .foregroundColor(.secondary) .padding(.trailing, 8) } } diff --git a/Sora-JS/Views/SettingsView/SubViews/SettingsViewModule.swift b/Sora-JS/Views/SettingsView/SubViews/SettingsViewModule.swift index 6a21f60..735d719 100644 --- a/Sora-JS/Views/SettingsView/SubViews/SettingsViewModule.swift +++ b/Sora-JS/Views/SettingsView/SubViews/SettingsViewModule.swift @@ -26,14 +26,19 @@ struct SettingsViewModule: View { .padding(.trailing, 10) VStack(alignment: .leading) { - Text(module.metadata.mediaType) - .font(.system(size: 16)) - .foregroundColor(.primary) + HStack(alignment: .bottom, spacing: 4) { + Text(module.metadata.sourceName) + .font(.headline) + .foregroundColor(.primary) + Text("v\(module.metadata.version)") + .font(.subheadline) + .foregroundColor(.secondary) + } Text("Author: \(module.metadata.author)") - .font(.system(size: 14)) + .font(.subheadline) .foregroundColor(.secondary) - Text("\(module.metadata.language) • v\(module.metadata.version)") - .font(.system(size: 14)) + Text("Language: \(module.metadata.language)") + .font(.subheadline) .foregroundColor(.secondary) }