diff options
| author | Fuwn <[email protected]> | 2025-09-03 22:28:08 -0700 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2025-09-03 22:28:08 -0700 |
| commit | e42ace815c0e33e90a6e576942d7905f01a314dd (patch) | |
| tree | 4e3a8b15e6e2ebfb5436014660c990a57350e069 /Sora/Data/Booru/Post/BooruPostXMLParser.swift | |
| parent | feat: Development commit (diff) | |
| download | sora-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.swift | 63 |
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 } |