From 8199a667b04e3d1d276ce2c1b38d232d18b837ee Mon Sep 17 00:00:00 2001 From: Mikhail Akopov Date: Fri, 5 Aug 2022 09:10:44 +0300 Subject: [PATCH] Allow to set language of search results --- Sources/AppStoreScraper/Scraper.swift | 30 +++++++++++++++++-- Tests/AppStoreScraperTests/ScraperTests.swift | 2 +- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/Sources/AppStoreScraper/Scraper.swift b/Sources/AppStoreScraper/Scraper.swift index 16b6497..b34d57b 100644 --- a/Sources/AppStoreScraper/Scraper.swift +++ b/Sources/AppStoreScraper/Scraper.swift @@ -29,19 +29,23 @@ public struct Scraper { public func searchApplications( _ term: String, country: Country = .US, + language: Language? = nil, limit: Int = 10 ) async throws -> [Application] { let encodedTerm = term.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? term - let url = "\(baseURL)/search?term=\(encodedTerm)&country=\(country.rawValue.lowercased())&limit=\(limit)&entity=software" + let language = makeLanguage(language, country: country) + let url = "\(baseURL)/search?term=\(encodedTerm)&country=\(country.rawValue.lowercased())&limit=\(limit)&entity=software\(language)" let result: SearchResult = try await get(url) return result.applications } public func getApplication( _ id: Int, - country: Country = .US + country: Country = .US, + language: Language? = nil ) async throws -> Application? { - let url = "\(baseURL)/\(country.rawValue.lowercased())/lookup?id=\(id)" + let language = makeLanguage(language, country: country) + let url = "\(baseURL)/\(country.rawValue.lowercased())/lookup?id=\(id)\(language)" let result: SearchResult = try await get(url) return result.applications.first } @@ -74,6 +78,26 @@ public struct Scraper { return [rankingType.rawValue.lowercased(), suffix].joined() } + private func makeLanguage(_ language: Language?, country: Country) -> String { + guard let language = language else { + return "" + } + let supported = country.languages + guard + language != supported.main, + supported.additional.contains(language) + else { + return "" + } + let code: String = { + switch language { + case .zh_Hans: return "zh_CN" + default: return String(language.rawValue.prefix(2)) + } + }() + return "&lang=\(code)" + } + private struct Feed: Codable { let content: Entries diff --git a/Tests/AppStoreScraperTests/ScraperTests.swift b/Tests/AppStoreScraperTests/ScraperTests.swift index bff3023..c3969b2 100644 --- a/Tests/AppStoreScraperTests/ScraperTests.swift +++ b/Tests/AppStoreScraperTests/ScraperTests.swift @@ -10,7 +10,7 @@ final class ScraperTests: XCTestCase { func testSearchApplications() async throws { let scraper = Scraper() - let applications = try await scraper.searchApplications("pros and cons") + let applications = try await scraper.searchApplications("pros and cons", language: .zh_Hans) XCTAssertFalse(applications.isEmpty) }