← Public packages
@kentcdodds/audible
Personal Audible library app — browser re-auth, library, wishlist, NAS archive stub.
src/library-item.ts
59 lines · 1.7 KB · TypeScriptimport { createClient } from './client.ts'
import { classifyArchiveEligibility } from './archive-eligibility.ts'
const DEFAULT_RESPONSE_GROUPS = [
'product_desc',
'product_attrs',
'contributors',
'media',
'series',
'percent_complete',
'is_finished',
'product_details',
'relationships',
'category_ladders',
// Required for reliable is_ayce / benefit_id (Plus catalog).
'customer_rights',
].join(',')
/**
* Fetch one owned library title by ASIN (GET /1.0/library/{asin}).
* Use when you already know the ASIN from `./library` or a previous archive run.
*
* @param input - ASIN and optional response_groups / locale
* @returns Library item payload for that ASIN
*
* @example
* import getLibraryItem from 'kody:@kentcdodds/audible/library-item'
*
* const item = await getLibraryItem({ asin: 'B08G9PRS1K' })
*/
export default async function getLibraryItem(input: {
asin: string
responseGroups?: string
locale?: string
}) {
const asin = input.asin?.trim()
if (!asin) throw new Error('asin is required.')
const client = await createClient({ locale: input.locale })
const item = await client.request<Record<string, unknown>>({
path: `/1.0/library/${encodeURIComponent(asin)}`,
query: {
response_groups: input.responseGroups ?? DEFAULT_RESPONSE_GROUPS,
},
})
const product =
item && typeof item === 'object' && 'item' in item && item.item
? (item.item as Record<string, unknown>)
: item
const eligibility = classifyArchiveEligibility(product)
return {
locale: client.locale.countryCode,
apiHost: client.locale.apiHost,
asin,
item,
archiveEligibility: eligibility.archiveEligibility,
archiveHint: eligibility.archiveHint,
downloadable: eligibility.downloadable,
}
}