diff options
| author | Fuwn <[email protected]> | 2026-02-23 09:14:04 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2026-02-23 13:33:42 -0800 |
| commit | 0f53ed0fc04952fb2fb43518be11c545da535f5b (patch) | |
| tree | 8b16594291ff7a5e7dd289193eaa1998030edefe /Sora/Data/Danbooru/DanbooruPostParser.swift | |
| parent | (no commit message) (diff) | |
| download | sora-testing-0f53ed0fc04952fb2fb43518be11c545da535f5b.tar.xz sora-testing-0f53ed0fc04952fb2fb43518be11c545da535f5b.zip | |
fix: harden danbooru decoding and pagination flow
Diffstat (limited to 'Sora/Data/Danbooru/DanbooruPostParser.swift')
| -rw-r--r-- | Sora/Data/Danbooru/DanbooruPostParser.swift | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/Sora/Data/Danbooru/DanbooruPostParser.swift b/Sora/Data/Danbooru/DanbooruPostParser.swift index f990ed5..1e5cdc4 100644 --- a/Sora/Data/Danbooru/DanbooruPostParser.swift +++ b/Sora/Data/Danbooru/DanbooruPostParser.swift @@ -1,6 +1,16 @@ import Foundation nonisolated class DanbooruPostParser { + private struct FailableDecodable<Value: Decodable>: Decodable { + let value: Value? + + init(from decoder: Decoder) throws { + let container = try decoder.singleValueContainer() + + value = try? container.decode(Value.self) + } + } + private let data: Data init(data: Data) { @@ -17,10 +27,20 @@ nonisolated class DanbooruPostParser { } do { - return try decoder.decode([DanbooruPost].self, from: data).compactMap { post in - post.toBooruPost() + let decodedPosts = try decoder.decode([FailableDecodable<DanbooruPost>].self, from: data) + let validPosts = decodedPosts.compactMap(\.value) + let droppedRecordCount = decodedPosts.count - validPosts.count + + if droppedRecordCount > 0 { + debugPrint( + "DanbooruPostParser.parse: dropped \(droppedRecordCount) malformed records while decoding page." + ) } + + return validPosts.compactMap { post in post.toBooruPost() } } catch { + debugPrint("DanbooruPostParser.parse: failed to decode response: \(error)") + return [] } } |