summaryrefslogtreecommitdiff
path: root/Sora/Data/Booru/Post/BooruPostXMLParser.swift
diff options
context:
space:
mode:
authorFuwn <[email protected]>2025-09-03 22:28:08 -0700
committerFuwn <[email protected]>2025-09-03 22:28:08 -0700
commite42ace815c0e33e90a6e576942d7905f01a314dd (patch)
tree4e3a8b15e6e2ebfb5436014660c990a57350e069 /Sora/Data/Booru/Post/BooruPostXMLParser.swift
parentfeat: Development commit (diff)
downloadsora-testing-e42ace815c0e33e90a6e576942d7905f01a314dd.tar.xz
sora-testing-e42ace815c0e33e90a6e576942d7905f01a314dd.zip
feat: Development commit
Diffstat (limited to 'Sora/Data/Booru/Post/BooruPostXMLParser.swift')
-rw-r--r--Sora/Data/Booru/Post/BooruPostXMLParser.swift63
1 files changed, 45 insertions, 18 deletions
diff --git a/Sora/Data/Booru/Post/BooruPostXMLParser.swift b/Sora/Data/Booru/Post/BooruPostXMLParser.swift
index 89fceb7..8b6260e 100644
--- a/Sora/Data/Booru/Post/BooruPostXMLParser.swift
+++ b/Sora/Data/Booru/Post/BooruPostXMLParser.swift
@@ -18,6 +18,19 @@ class BooruPostXMLParser: NSObject, XMLParserDelegate {
parser.delegate = self
}
+ func reset(with data: Data) {
+ posts.removeAll()
+
+ currentPost = nil
+
+ currentPostData.removeAll()
+
+ currentElementName = nil
+ currentText = ""
+ parser = XMLParser(data: data)
+ parser.delegate = self
+ }
+
func parse() -> [BooruPost] {
parser.parse()
@@ -26,30 +39,41 @@ class BooruPostXMLParser: NSObject, XMLParserDelegate {
private func makePost(from dict: [String: String]) -> BooruPost? {
guard let id = dict["id"],
- let heightStr = dict["height"], let height = Int(heightStr),
let score = dict["score"],
- let fileUrlString = dict["file_url"], let fileUrl = URL(string: fileUrlString),
let parentId = dict["parent_id"],
- let sampleUrlString = dict["sample_url"], let sampleUrl = URL(string: sampleUrlString),
- let sampleWidthString = dict["sample_width"], let sampleWidth = Int(sampleWidthString),
- let sampleHeightString = dict["sample_height"], let sampleHeight = Int(sampleHeightString),
- let previewUrlString = dict["preview_url"], let previewUrl = URL(string: previewUrlString),
let rating = dict["rating"],
let tagsString = dict["tags"],
- let widthString = dict["width"], let width = Int(widthString),
let change = dict["change"],
let md5 = dict["md5"],
let creatorId = dict["creator_id"],
let createdAtString = dict["created_at"],
- let createdAt = parseCreatedAt(createdAtString),
let status = dict["status"],
- let source = dict["source"],
- let previewWidthString = dict["preview_width"], let previewWidth = Int(previewWidthString),
- let previewHeightString = dict["preview_height"], let previewHeight = Int(previewHeightString)
+ let source = dict["source"]
else {
return nil
}
+ guard let height = Int(dict["height"] ?? ""),
+ let sampleWidth = Int(dict["sample_width"] ?? ""),
+ let sampleHeight = Int(dict["sample_height"] ?? ""),
+ let width = Int(dict["width"] ?? ""),
+ let previewWidth = Int(dict["preview_width"] ?? ""),
+ let previewHeight = Int(dict["preview_height"] ?? "")
+ else {
+ return nil
+ }
+
+ guard let fileUrl = URL(string: dict["file_url"] ?? ""),
+ let sampleUrl = URL(string: dict["sample_url"] ?? ""),
+ let previewUrl = URL(string: dict["preview_url"] ?? ""),
+ let createdAt = parseCreatedAt(createdAtString)
+ else {
+ return nil
+ }
+
+ let tags = tagsString.components(separatedBy: .whitespacesAndNewlines)
+ .filter { !$0.isEmpty }
+
return BooruPost(
id: id,
height: height,
@@ -61,8 +85,7 @@ class BooruPostXMLParser: NSObject, XMLParserDelegate {
sampleHeight: sampleHeight,
previewURL: previewUrl,
rating: BooruRating(rating),
- tags: tagsString.components(separatedBy: CharacterSet.whitespacesAndNewlines)
- .filter { !$0.isEmpty },
+ tags: tags,
width: width,
change: change,
md5: md5,
@@ -141,13 +164,17 @@ class BooruPostXMLParser: NSObject, XMLParserDelegate {
}
#endif
- func parseCreatedAt(_ input: String) -> Date? {
- let dateFormatter = DateFormatter()
+ private static let dateFormatter: DateFormatter = {
+ let formatter = DateFormatter()
- dateFormatter.dateFormat = "EEE MMM dd HH:mm:ss Z yyyy"
- dateFormatter.locale = Locale(identifier: "en_US_POSIX")
+ formatter.dateFormat = "EEE MMM dd HH:mm:ss Z yyyy"
+ formatter.locale = Locale(identifier: "en_US_POSIX")
- if let date = dateFormatter.date(from: input) {
+ return formatter
+ }()
+
+ func parseCreatedAt(_ input: String) -> Date? {
+ if let date = Self.dateFormatter.date(from: input) {
return date
}