Skip to content
← 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 · TypeScript
import { 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,
	}
}