c49d4c72208a

add WallhavenSorting enum; make searchWallpapers accept sorting; drop unused fetchRandomWallpapers

time
2026-07-16 18:24 UTC · 3 months ago
machine
koh2
agent
claude-opus-4-8
session
feed modes latest toplist random
parent
15af22478aa0
1 file Sources/Haven/API/WallhavenAPI.swift+21 −21
Sources/Haven/API/WallhavenAPI.swift+21 −21
@@ -8,26 +8,26 @@88     case apiError(String)99 }1010 11+/// Sort order for Wallhaven search results. Maps to the `sorting` query12+/// parameter on the public API. `random` returns a fresh batch per page.13+enum WallhavenSorting: String {14+    case dateAdded = "date_added"15+    case toplist16+    case random17+}18+1119 class WallhavenAPI {1220     private let session: URLSession13-    21+1422     init(session: URLSession = .shared) {1523         self.session = session1624     }17-    18-    func fetchRandomWallpapers(limit: Int = 1) async throws -> [Wallpaper] {19-        let queryItems = [20-            URLQueryItem(name: "sorting", value: "random"),21-            URLQueryItem(name: "limit", value: String(limit))22-        ]23-        let (data, _) = try await performSearch(queryItems: queryItems)24-        return data25-    }26-    25+2726     func searchWallpapers(2827         query: String,2928         categories: String = "111",3029         purity: String = "100",30+        sorting: WallhavenSorting = .dateAdded,3131         resolutions: [String] = [],3232         ratios: [String] = [],3333         limit: Int = 24,@@ -37,37 +37,37 @@3737             URLQueryItem(name: "q", value: query),3838             URLQueryItem(name: "categories", value: categories),3939             URLQueryItem(name: "purity", value: purity),40-            URLQueryItem(name: "sorting", value: "date_added"),40+            URLQueryItem(name: "sorting", value: sorting.rawValue),4141             URLQueryItem(name: "limit", value: String(limit)),4242             URLQueryItem(name: "page", value: String(page))4343         ]44-        44+4545         if !resolutions.isEmpty {4646             queryItems.append(URLQueryItem(name: "resolutions", value: resolutions.joined(separator: ",")))4747         }48-        48+4949         if !ratios.isEmpty {5050             queryItems.append(URLQueryItem(name: "ratios", value: ratios.joined(separator: ",")))5151         }52-        52+5353         return try await performSearch(queryItems: queryItems)5454     }55-    55+5656     private func performSearch(queryItems: [URLQueryItem]) async throws -> ([Wallpaper], Meta?) {5757         var urlComponents = URLComponents(url: Configuration.baseURL.appendingPathComponent("search"), resolvingAgainstBaseURL: true)!5858         urlComponents.queryItems = queryItems59-        59+6060         guard let url = urlComponents.url else {6161             throw WallhavenError.invalidURL6262         }63-        63+6464         let (data, response) = try await session.data(from: url)65-        66-        guard let httpResponse = response as? HTTPURLResponse, 65+66+        guard let httpResponse = response as? HTTPURLResponse,6767               (200...299).contains(httpResponse.statusCode) else {6868             throw WallhavenError.apiError("Server returned an error")6969         }70-        70+7171         do {7272             let decodedResponse = try JSONDecoder().decode(WallhavenResponse.self, from: data)7373             return (decodedResponse.data, decodedResponse.meta)

view file