summaryrefslogtreecommitdiff
path: root/Sora/Data/Danbooru/DanbooruManager.swift
diff options
context:
space:
mode:
authorFuwn <[email protected]>2025-02-20 19:37:12 -0800
committerFuwn <[email protected]>2025-02-20 19:37:12 -0800
commit2a20920675c82a64131b7c41d5c5288f718c7a0b (patch)
treef29285405cffe545489ecaf2fa825eec56410b29 /Sora/Data/Danbooru/DanbooruManager.swift
parentfeat: Development commit (diff)
downloadsora-testing-2a20920675c82a64131b7c41d5c5288f718c7a0b.tar.xz
sora-testing-2a20920675c82a64131b7c41d5c5288f718c7a0b.zip
feat: Development commit
Diffstat (limited to 'Sora/Data/Danbooru/DanbooruManager.swift')
-rw-r--r--Sora/Data/Danbooru/DanbooruManager.swift114
1 files changed, 0 insertions, 114 deletions
diff --git a/Sora/Data/Danbooru/DanbooruManager.swift b/Sora/Data/Danbooru/DanbooruManager.swift
deleted file mode 100644
index 7bbb3a7..0000000
--- a/Sora/Data/Danbooru/DanbooruManager.swift
+++ /dev/null
@@ -1,114 +0,0 @@
-import SwiftUI
-
-@MainActor
-class DanbooruManager: ObservableObject {
- @Published var posts: [DanbooruPost] = []
- @Published var allTags: [BooruTag] = []
- @Published var isLoading: Bool = false
- @Published var currentPage: Int = 1
- @Published var searchText = ""
- @Published var endOfData: Bool = false
- #if os(macOS)
- @Published var selectedPost: MoebooruPost?
- #endif
- private var currentTask: Task<Void, Never>?
- var tags: [String] {
- if searchText.isEmpty {
- return []
- }
-
- return searchText
- .split(separator: " ")
- .map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
- .filter { !$0.isEmpty }
- }
-
- init() {
- fetchAllTags()
- }
-
- func fetchPosts(page: Int = 1, limit: Int = 100, tags: [String] = [], replace: Bool = false) async {
- guard !isLoading else { return }
-
- currentTask?.cancel()
-
- currentTask = Task {
- isLoading = true
-
- defer { isLoading = false }
-
- if replace {
- self.posts = []
- self.currentPage = 1
- }
-
- guard let url = URL(string: "https://safebooru.org/index.php?page=dapi&s=post&q=index&pid=\(page)&limit=\(limit)&tags=\(tags.joined(separator: "+"))") else { return }
-
- do {
- let (data, _) = try await URLSession.shared.data(from: url)
-
- if Task.isCancelled { return }
-
- DispatchQueue.main.async {
- let newPosts = Array(Set(DanbooruPostXMLParser(data: data).parse())).sorted { $0.id > $1.id }
-
- if newPosts == [] {
- self.endOfData = true
- } else {
- self.posts += newPosts
- }
- }
- } catch {
- if (error as? URLError)?.code != .cancelled {
- #if DEBUG
- print(error)
- #endif
- }
- }
- }
- }
-
- func performSearch() {
- Task {
- await fetchPosts(
- page: 1,
- tags: tags,
- replace: true
- )
- }
- }
-
- func loadNextPage() {
- guard !isLoading else { return }
-
- Task {
- await fetchPosts(page: currentPage + 1, tags: tags)
-
- DispatchQueue.main.async {
- self.currentPage += 1
- }
- }
- }
-
- func fetchAllTags(limit: Int = 100_000) {
- Task {
- guard let url = URL(string: "https://safebooru.org/index.php?page=dapi&s=tag&q=index&limit=\(limit)") else { return }
-
- do {
- let (data, _) = try await URLSession.shared.data(from: url)
-
- if Task.isCancelled { return }
-
- DispatchQueue.main.async {
- self.allTags = (BooruTagXMLParser(data: data).parse()).sorted { $0.count > $1.count }
- }
- } catch {
- if (error as? URLError)?.code != .cancelled {
- #if DEBUG
- print(error)
- #endif
- }
- }
- }
- }
-}