UNPKG

lastfm-api-lib

Version:

A TypeScript library for interacting with the Last.fm API

1 lines 25.2 kB
{"version":3,"sources":["../src/index.ts","../src/httpClient.ts","../src/endpoints/baseEndpoint.ts","../src/endpoints/artist.ts","../src/endpoints/album.ts","../src/endpoints/track.ts","../src/endpoints/tag.ts","../src/endpoints/chart.ts","../src/main.ts"],"sourcesContent":["/**\n * @file index.ts\n * @description Main entry point for lastfm-api-lib\n * @author Caleb Price\n * @version 1.0.0\n * @date 2025-07-23\n */\n\n// Main API class\nexport { LastFm } from './main'\n\n// HTTP client for advanced usage\nexport { LastFmHttpClient } from './httpClient'\n\n// All endpoint classes\nexport { ArtistEndpoints } from './endpoints/artist'\nexport { AlbumEndpoints } from './endpoints/album'\nexport { TrackEndpoints } from './endpoints/track'\nexport { TagEndpoints } from './endpoints/tag'\nexport { ChartEndpoints } from './endpoints/chart'\n\n// All types\nexport * from './types'\n\n// Default export\nexport { LastFm as default } from './main'","/**\n * @file httpClient.ts\n * @description HTTP client for making requests to Last.fm API\n * @author Caleb Price\n * @version 1.0.0\n * @date 2025-07-23\n */\n\nimport axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'\n\nexport interface RequestOptions {\n method?: 'GET' | 'POST'\n params?: Record<string, any>\n headers?: Record<string, string>\n retries?: number\n}\n\nexport interface LastFmApiError extends Error {\n status?: number\n response?: any\n code?: number\n}\n\n// HTTP status codes that should be retried\nconst RETRYABLE_STATUS_CODES = new Set([408, 429, 500, 502, 503, 504])\n\nexport class LastFmHttpClient {\n private client: AxiosInstance\n private apiKey: string\n private readonly baseURL = 'https://ws.audioscrobbler.com/2.0/'\n\n constructor(apiKey?: string) {\n this.apiKey = apiKey || ''\n \n this.client = axios.create({\n baseURL: this.baseURL,\n timeout: 10000,\n headers: {\n 'User-Agent': 'lastfm-api-lib/1.0.0',\n 'Accept': 'application/json',\n },\n })\n\n // Add response interceptor for error handling\n this.client.interceptors.response.use(\n (response) => response,\n (error) => this.handleResponseError(error)\n )\n }\n\n /**\n * Set API key for requests\n */\n public setApiKey(apiKey: string): void {\n this.apiKey = apiKey\n }\n\n /**\n * Clear the API key\n */\n public clearApiKey(): void {\n this.apiKey = ''\n }\n\n /**\n * Make a request to the Last.fm API\n */\n public async request(\n method: string,\n params: Record<string, any> = {},\n options: RequestOptions = {}\n ): Promise<any> {\n if (!this.apiKey) {\n throw new Error('API key is required')\n }\n\n const requestParams = {\n method,\n api_key: this.apiKey,\n format: 'json',\n ...params,\n }\n\n const config: AxiosRequestConfig = {\n method: options.method || 'GET',\n params: requestParams,\n headers: options.headers,\n }\n\n try {\n const response = await this.client.request(config)\n \n // Check for Last.fm API errors in response\n if (response.data?.error) {\n const error = new Error(response.data.message || 'Last.fm API error') as LastFmApiError\n error.code = response.data.error\n error.status = response.status\n throw error\n }\n\n return response.data\n } catch (error: any) {\n if (error.isAxiosError) {\n const lastFmError = new Error(\n error.response?.data?.message || error.message || 'Request failed'\n ) as LastFmApiError\n lastFmError.status = error.response?.status\n lastFmError.response = error.response?.data\n throw lastFmError\n }\n throw error\n }\n }\n\n /**\n * Handle response errors with retries for certain status codes\n */\n private async handleResponseError(error: any): Promise<any> {\n if (\n error.response?.status &&\n RETRYABLE_STATUS_CODES.has(error.response.status) &&\n error.config &&\n !error.config._retryCount\n ) {\n error.config._retryCount = 1\n \n // Add delay for rate limiting\n if (error.response.status === 429) {\n await this.delay(1000)\n }\n \n return this.client.request(error.config)\n }\n \n return Promise.reject(error)\n }\n\n /**\n * Delay helper for rate limiting\n */\n private delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms))\n }\n\n /**\n * Get the HTTP client instance\n */\n public getHttpClient(): AxiosInstance {\n return this.client\n }\n}","/**\n * @file baseEndpoint.ts\n * @description Base class for Last.fm API endpoints\n * @author Caleb Price\n * @version 1.0.0\n * @date 2025-07-23\n */\n\nimport { LastFmHttpClient } from '../httpClient'\n\nexport abstract class BaseEndpoint {\n protected httpClient: LastFmHttpClient\n\n constructor(httpClient: LastFmHttpClient) {\n this.httpClient = httpClient\n }\n\n /**\n * Make a request to the API\n */\n protected async request(method: string, params: Record<string, any> = {}): Promise<any> {\n return this.httpClient.request(method, params)\n }\n\n /**\n * Clean up undefined/null parameters\n */\n protected cleanParams(params: Record<string, any>): Record<string, any> {\n const cleaned: Record<string, any> = {}\n \n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null && value !== '') {\n cleaned[key] = value\n }\n }\n \n return cleaned\n }\n}","/**\n * @file artist.ts\n * @description Artist endpoints for Last.fm API\n * @author Caleb Price\n * @version 1.0.0\n * @date 2025-07-23\n */\n\nimport { BaseEndpoint } from './baseEndpoint'\nimport { \n LastFmArtist, \n LastFmAlbum, \n LastFmTrack, \n LastFmTag,\n LastFmSearchResults,\n ArtistSearchOptions,\n LastFmRequestOptions,\n InfoOptions,\n SimilarOptions,\n TopTagsOptions\n} from '../types'\n\nexport class ArtistEndpoints extends BaseEndpoint {\n /**\n * Get artist correction\n */\n async getCorrection(artist: string): Promise<{ corrections?: { correction: { artist: LastFmArtist } } }> {\n const params = this.cleanParams({ artist })\n return this.request('artist.getCorrection', params)\n }\n\n /**\n * Get artist information\n */\n async getInfo(artist: string, options: InfoOptions = {}): Promise<{ artist: LastFmArtist }> {\n const params = this.cleanParams({\n artist,\n ...options\n })\n return this.request('artist.getInfo', params)\n }\n\n /**\n * Get similar artists\n */\n async getSimilar(artist: string, options: SimilarOptions = {}): Promise<{ similarartists: { artist: LastFmArtist[] } }> {\n const params = this.cleanParams({\n artist,\n ...options\n })\n return this.request('artist.getSimilar', params)\n }\n\n /**\n * Get top albums for an artist\n */\n async getTopAlbums(artist: string, options: LastFmRequestOptions = {}): Promise<{ topalbums: { album: LastFmAlbum[] } }> {\n const params = this.cleanParams({\n artist,\n ...options\n })\n return this.request('artist.getTopAlbums', params)\n }\n\n /**\n * Get top tags for an artist\n */\n async getTopTags(artist: string, options: TopTagsOptions = {}): Promise<{ toptags: { tag: LastFmTag[] } }> {\n const params = this.cleanParams({\n artist,\n ...options\n })\n return this.request('artist.getTopTags', params)\n }\n\n /**\n * Get top tracks for an artist\n */\n async getTopTracks(artist: string, options: LastFmRequestOptions = {}): Promise<{ toptracks: { track: LastFmTrack[] } }> {\n const params = this.cleanParams({\n artist,\n ...options\n })\n return this.request('artist.getTopTracks', params)\n }\n\n /**\n * Search for an artist\n */\n async search(artist: string, options: LastFmRequestOptions = {}): Promise<LastFmSearchResults> {\n const params = this.cleanParams({\n artist,\n ...options\n })\n return this.request('artist.search', params)\n }\n}","/**\n * @file album.ts\n * @description Album endpoints for Last.fm API\n * @author Caleb Price\n * @version 1.0.0\n * @date 2025-07-23\n */\n\nimport { BaseEndpoint } from './baseEndpoint'\nimport { \n LastFmAlbum, \n LastFmTag,\n LastFmSearchResults,\n AlbumSearchOptions,\n LastFmRequestOptions,\n InfoOptions,\n TopTagsOptions\n} from '../types'\n\nexport class AlbumEndpoints extends BaseEndpoint {\n /**\n * Get album information\n */\n async getInfo(artist: string, album: string, options: InfoOptions = {}): Promise<{ album: LastFmAlbum }> {\n const params = this.cleanParams({\n artist,\n album,\n ...options\n })\n return this.request('album.getInfo', params)\n }\n\n /**\n * Get top tags for an album\n */\n async getTopTags(artist: string, album: string, options: TopTagsOptions = {}): Promise<{ toptags: { tag: LastFmTag[] } }> {\n const params = this.cleanParams({\n artist,\n album,\n ...options\n })\n return this.request('album.getTopTags', params)\n }\n\n /**\n * Search for an album\n */\n async search(album: string, options: LastFmRequestOptions = {}): Promise<LastFmSearchResults> {\n const params = this.cleanParams({\n album,\n ...options\n })\n return this.request('album.search', params)\n }\n}","/**\n * @file track.ts\n * @description Track endpoints for Last.fm API\n * @author Caleb Price\n * @version 1.0.0\n * @date 2025-07-23\n */\n\nimport { BaseEndpoint } from './baseEndpoint'\nimport { \n LastFmTrack, \n LastFmTag,\n LastFmSearchResults,\n TrackSearchOptions,\n LastFmRequestOptions,\n InfoOptions,\n SimilarOptions,\n TopTagsOptions\n} from '../types'\n\nexport class TrackEndpoints extends BaseEndpoint {\n /**\n * Get track correction\n */\n async getCorrection(artist: string, track: string): Promise<{ corrections?: { correction: { track: LastFmTrack } } }> {\n const params = this.cleanParams({ artist, track })\n return this.request('track.getCorrection', params)\n }\n\n /**\n * Get track information\n */\n async getInfo(artist: string, track: string, options: InfoOptions = {}): Promise<{ track: LastFmTrack }> {\n const params = this.cleanParams({\n artist,\n track,\n ...options\n })\n return this.request('track.getInfo', params)\n }\n\n /**\n * Get similar tracks\n */\n async getSimilar(artist: string, track: string, options: SimilarOptions = {}): Promise<{ similartracks: { track: LastFmTrack[] } }> {\n const params = this.cleanParams({\n artist,\n track,\n ...options\n })\n return this.request('track.getSimilar', params)\n }\n\n /**\n * Get top tags for a track\n */\n async getTopTags(artist: string, track: string, options: TopTagsOptions = {}): Promise<{ toptags: { tag: LastFmTag[] } }> {\n const params = this.cleanParams({\n artist,\n track,\n ...options\n })\n return this.request('track.getTopTags', params)\n }\n\n /**\n * Search for a track\n */\n async search(track: string, options: LastFmRequestOptions = {}): Promise<LastFmSearchResults> {\n const params = this.cleanParams({\n track,\n ...options\n })\n return this.request('track.search', params)\n }\n}","/**\n * @file tag.ts\n * @description Tag endpoints for Last.fm API\n * @author Caleb Price\n * @version 1.0.0\n * @date 2025-07-23\n */\n\nimport { BaseEndpoint } from './baseEndpoint'\nimport { \n LastFmTag,\n LastFmAlbum,\n LastFmArtist,\n LastFmTrack,\n LastFmRequestOptions,\n TagOptions,\n InfoOptions\n} from '../types'\n\nexport class TagEndpoints extends BaseEndpoint {\n /**\n * Get tag information\n */\n async getInfo(tag: string, options: InfoOptions = {}): Promise<{ tag: LastFmTag }> {\n const params = this.cleanParams({\n tag,\n ...options\n })\n return this.request('tag.getInfo', params)\n }\n\n /**\n * Get similar tags\n */\n async getSimilar(tag: string): Promise<{ similartags: { tag: LastFmTag[] } }> {\n const params = this.cleanParams({ tag })\n return this.request('tag.getSimilar', params)\n }\n\n /**\n * Get top albums for a tag\n */\n async getTopAlbums(tag: string, options: LastFmRequestOptions = {}): Promise<{ albums: { album: LastFmAlbum[] } }> {\n const params = this.cleanParams({\n tag,\n ...options\n })\n return this.request('tag.getTopAlbums', params)\n }\n\n /**\n * Get top artists for a tag\n */\n async getTopArtists(tag: string, options: LastFmRequestOptions = {}): Promise<{ topartists: { artist: LastFmArtist[] } }> {\n const params = this.cleanParams({\n tag,\n ...options\n })\n return this.request('tag.getTopArtists', params)\n }\n\n /**\n * Get top tracks for a tag\n */\n async getTopTracks(tag: string, options: LastFmRequestOptions = {}): Promise<{ tracks: { track: LastFmTrack[] } }> {\n const params = this.cleanParams({\n tag,\n ...options\n })\n return this.request('tag.getTopTracks', params)\n }\n\n /**\n * Get top tags\n */\n async getTopTags(): Promise<{ toptags: { tag: LastFmTag[] } }> {\n return this.request('tag.getTopTags')\n }\n}","/**\n * @file chart.ts\n * @description Chart endpoints for Last.fm API\n * @author Caleb Price\n * @version 1.0.0\n * @date 2025-07-23\n */\n\nimport { BaseEndpoint } from './baseEndpoint'\nimport { \n LastFmArtist,\n LastFmTrack,\n LastFmTag,\n LastFmRequestOptions\n} from '../types'\n\nexport class ChartEndpoints extends BaseEndpoint {\n /**\n * Get top artists chart\n */\n async getTopArtists(options: LastFmRequestOptions = {}): Promise<{ artists: { artist: LastFmArtist[] } }> {\n const params = this.cleanParams(options)\n return this.request('chart.getTopArtists', params)\n }\n\n /**\n * Get top tracks chart\n */\n async getTopTracks(options: LastFmRequestOptions = {}): Promise<{ tracks: { track: LastFmTrack[] } }> {\n const params = this.cleanParams(options)\n return this.request('chart.getTopTracks', params)\n }\n\n /**\n * Get top tags chart\n */\n async getTopTags(options: LastFmRequestOptions = {}): Promise<{ tags: { tag: LastFmTag[] } }> {\n const params = this.cleanParams(options)\n return this.request('chart.getTopTags', params)\n }\n}","/**\n * @file main.ts\n * @description Main Last.fm API class with constructor pattern for organized API access\n * @author Caleb Price\n * @version 1.0.0\n * @date 2025-07-23\n *\n * @description\n * Constructor-based Last.fm API wrapper that provides organized methods for\n * interacting with the Last.fm Web API. Supports artists, albums, tracks, tags, and charts.\n *\n * @usage\n * ```javascript\n * const lastfm = new LastFm(apiKey);\n * const artistInfo = await lastfm.artist.getInfo('Radiohead');\n * const albumInfo = await lastfm.album.getInfo('Radiohead', 'OK Computer');\n * const topTracks = await lastfm.track.search('Creep');\n * ```\n */\n\nimport { LastFmHttpClient } from './httpClient'\nimport { ArtistEndpoints } from './endpoints/artist'\nimport { AlbumEndpoints } from './endpoints/album'\nimport { TrackEndpoints } from './endpoints/track'\nimport { TagEndpoints } from './endpoints/tag'\nimport { ChartEndpoints } from './endpoints/chart'\n\n// Endpoint classes mapping for optimized initialization\nconst ENDPOINT_CLASSES = {\n artist: ArtistEndpoints,\n album: AlbumEndpoints,\n track: TrackEndpoints,\n tag: TagEndpoints,\n chart: ChartEndpoints,\n} as const\n\nexport class LastFm {\n private httpClient: LastFmHttpClient\n\n // Endpoint groups\n public artist!: ArtistEndpoints\n public album!: AlbumEndpoints\n public track!: TrackEndpoints\n public tag!: TagEndpoints\n public chart!: ChartEndpoints\n\n constructor(apiKey?: string) {\n // Validate API key format if provided\n if (apiKey && !this.isValidApiKeyFormat(apiKey)) {\n console.warn('LastFm: API key format appears invalid')\n }\n\n this.httpClient = new LastFmHttpClient(apiKey)\n\n // Initialize endpoint groups using optimized pattern\n this.initializeEndpoints()\n }\n\n /**\n * Initialize all endpoint groups\n */\n private initializeEndpoints(): void {\n for (const [name, EndpointClass] of Object.entries(ENDPOINT_CLASSES)) {\n ;(this as any)[name] = new EndpointClass(this.httpClient)\n }\n }\n\n /**\n * Basic API key format validation\n */\n private isValidApiKeyFormat(apiKey: string): boolean {\n // Last.fm API keys are typically 32 character hexadecimal strings\n return typeof apiKey === 'string' && /^[a-f0-9]{32}$/i.test(apiKey)\n }\n\n /**\n * Set API key for API requests\n */\n public setApiKey(apiKey: string): void {\n this.httpClient.setApiKey(apiKey)\n }\n\n /**\n * Clear the API key\n */\n public clearApiKey(): void {\n this.httpClient.clearApiKey()\n }\n\n /**\n * Make a raw API request\n */\n public async request(\n method: string,\n params: Record<string, any> = {}\n ): Promise<any> {\n return this.httpClient.request(method, params)\n }\n\n /**\n * Get the HTTP client instance for advanced usage\n */\n public getHttpClient(): LastFmHttpClient {\n return this.httpClient\n }\n\n /**\n * Clean up resources and clear API key\n */\n public destroy(): void {\n this.clearApiKey()\n // Clear any cached data if endpoints have cleanup methods\n Object.values(ENDPOINT_CLASSES).forEach((_, key) => {\n const endpoint = (this as any)[Object.keys(ENDPOINT_CLASSES)[key]]\n if (endpoint && typeof endpoint.cleanup === 'function') {\n endpoint.cleanup()\n }\n })\n }\n}"],"mappings":"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","names":["axios"]}