Audible: switch to JSON catalog API

Move Audible catalog operations from HTML scraping to Audible's unauthenticated JSON catalog API (/1.0/catalog/*) while keeping Audnexus as the primary per‑ASIN detail source. audible.service.ts: remove cheerio parsing, add apiClient/htmlClient split, CATALOG_RESPONSE_GROUPS constant, catalog response types, stripHtml and mapCatalogProduct mappers, and paging (API is 0-indexed) + author-ASIN client-side filtering. Update search, popular, new-releases and author endpoints to call the catalog API, use apiClient for retries/backoff, and preserve htmlClient only for series-page scraping and link generation. Improve retry logic to accept an Axios client, move to jittered/exponential backoff for API/external calls, and adjust delays/AdaptivePacer usage. Documentation updated to reflect architecture, data sources, region handling, and gotchas.
This commit is contained in:
kikootwo
2026-04-21 03:08:08 -04:00
parent ade12cb82d
commit f564d0a574
3 changed files with 547 additions and 997 deletions
File diff suppressed because it is too large Load Diff
+10 -1
View File
@@ -11,6 +11,7 @@ export interface AudibleRegionConfig {
code: AudibleRegion;
name: string;
baseUrl: string;
apiBaseUrl: string;
audnexusParam: string;
language: SupportedLanguage;
}
@@ -20,6 +21,7 @@ export const AUDIBLE_REGIONS: Record<AudibleRegion, AudibleRegionConfig> = {
code: 'us',
name: 'United States',
baseUrl: 'https://www.audible.com',
apiBaseUrl: 'https://api.audible.com',
audnexusParam: 'us',
language: 'en',
},
@@ -27,6 +29,7 @@ export const AUDIBLE_REGIONS: Record<AudibleRegion, AudibleRegionConfig> = {
code: 'ca',
name: 'Canada',
baseUrl: 'https://www.audible.ca',
apiBaseUrl: 'https://api.audible.ca',
audnexusParam: 'ca',
language: 'en',
},
@@ -34,6 +37,7 @@ export const AUDIBLE_REGIONS: Record<AudibleRegion, AudibleRegionConfig> = {
code: 'uk',
name: 'United Kingdom',
baseUrl: 'https://www.audible.co.uk',
apiBaseUrl: 'https://api.audible.co.uk',
audnexusParam: 'uk',
language: 'en',
},
@@ -41,6 +45,7 @@ export const AUDIBLE_REGIONS: Record<AudibleRegion, AudibleRegionConfig> = {
code: 'au',
name: 'Australia',
baseUrl: 'https://www.audible.com.au',
apiBaseUrl: 'https://api.audible.com.au',
audnexusParam: 'au',
language: 'en',
},
@@ -48,6 +53,7 @@ export const AUDIBLE_REGIONS: Record<AudibleRegion, AudibleRegionConfig> = {
code: 'in',
name: 'India',
baseUrl: 'https://www.audible.in',
apiBaseUrl: 'https://api.audible.in',
audnexusParam: 'in',
language: 'en',
},
@@ -55,6 +61,7 @@ export const AUDIBLE_REGIONS: Record<AudibleRegion, AudibleRegionConfig> = {
code: 'de',
name: 'Germany',
baseUrl: 'https://www.audible.de',
apiBaseUrl: 'https://api.audible.de',
audnexusParam: 'de',
language: 'de',
},
@@ -62,6 +69,7 @@ export const AUDIBLE_REGIONS: Record<AudibleRegion, AudibleRegionConfig> = {
code: 'es',
name: 'Spain',
baseUrl: 'https://www.audible.es',
apiBaseUrl: 'https://api.audible.es',
audnexusParam: 'es',
language: 'es',
},
@@ -69,9 +77,10 @@ export const AUDIBLE_REGIONS: Record<AudibleRegion, AudibleRegionConfig> = {
code: 'fr',
name: 'France',
baseUrl: 'https://www.audible.fr',
apiBaseUrl: 'https://api.audible.fr',
audnexusParam: 'fr',
language: 'fr',
}
},
};
export const DEFAULT_AUDIBLE_REGION: AudibleRegion = 'us';