import type { XmlMetadata } from './xml/xml-metadata.js'; import { RateLimitThreshold } from 'rate-limit-threshold'; import * as mb from './musicbrainz.types.js'; import { HttpClient, type MultiQueryFormData } from "./http-client.js"; export { XmlMetadata } from './xml/xml-metadata.js'; export { XmlIsrc } from './xml/xml-isrc.js'; export { XmlIsrcList } from './xml/xml-isrc-list.js'; export { XmlRecording } from './xml/xml-recording.js'; export * from './musicbrainz.types.js'; export type RelationsIncludes = 'area-rels' | 'artist-rels' | 'event-rels' | 'genre-rels' | 'instrument-rels' | 'label-rels' | 'place-rels' | 'recording-rels' | 'release-rels' | 'release-group-rels' | 'series-rels' | 'url-rels' | 'work-rels'; export type SubQueryIncludes = /** * include discids for all media in the releases */ 'discids' /** * include media for all releases, this includes the # of tracks on each medium and its format. */ | 'media' /** * include isrcs for all recordings */ | 'isrcs' /** * include artists credits for all releases and recordings */ | 'artist-credits' /** * include only those releases where the artist appears on one of the tracks, only valid on artists in combination with `releases` */ | 'various-artists'; export type MiscIncludes = 'aliases' | 'annotation' | 'tags' | 'genres' | 'ratings' | 'media'; export type AreaIncludes = MiscIncludes | RelationsIncludes; export type ArtistIncludes = MiscIncludes | RelationsIncludes | 'recordings' | 'releases' | 'release-groups' | 'works'; export type CollectionIncludes = MiscIncludes | RelationsIncludes | 'user-collections'; export type EventIncludes = MiscIncludes | RelationsIncludes; export type GenreIncludes = MiscIncludes; export type InstrumentIncludes = MiscIncludes | RelationsIncludes; export type LabelIncludes = MiscIncludes | RelationsIncludes | 'releases'; export type PlaceIncludes = MiscIncludes | RelationsIncludes; export type RecordingIncludes = MiscIncludes | RelationsIncludes | SubQueryIncludes | 'artists' | 'releases' | 'isrcs'; export type ReleaseIncludes = MiscIncludes | SubQueryIncludes | RelationsIncludes | 'artists' | 'collections' | 'labels' | 'recordings' | 'release-groups' | 'recording-level-rels'; export type ReleaseGroupIncludes = MiscIncludes | SubQueryIncludes | RelationsIncludes | 'artists' | 'releases'; export type SeriesIncludes = MiscIncludes | RelationsIncludes; export type WorkIncludes = MiscIncludes | RelationsIncludes; export type UrlIncludes = RelationsIncludes; export type IFormData = { [key: string]: string | number; }; export interface IMusicBrainzConfig { botAccount?: { username?: string; password?: string; }; baseUrl?: string; appName?: string; appVersion?: string; /** * HTTP Proxy */ proxy?: string; /** * User e-mail address or application URL */ appContactInfo?: string; disableRateLimiting?: boolean; /** * Optional rate limit configuration. * * [maxRequests, periodSeconds] * * maxRequests The maximum number of allowed requests within the period * periodSeconds The time window in seconds during which requests are counted * * Default is [15, 18], which allows up to 15 requests every 18 seconds */ rateLimit?: [number, number]; } interface IInternalConfig extends IMusicBrainzConfig { baseUrl: string; } export interface ICsrfSession { sessionKey: string; token: string; } export interface ISessionInformation { csrf: ICsrfSession; loggedIn?: boolean; } export declare class MusicBrainzApiError extends Error { readonly status: number; readonly statusText: string; readonly body?: unknown; readonly url?: string; constructor(message: string, opts: { status: number; statusText: string; body?: unknown; url?: string; }); } export declare class MusicBrainzApi { readonly config: IInternalConfig; protected rateLimiter: RateLimitThreshold; protected httpClient: HttpClient; protected session?: ISessionInformation; static fetchCsrf(html: string): ICsrfSession; private static fetchValue; constructor(_config?: IMusicBrainzConfig); protected initHttpClient(): HttpClient; restGet(relUrl: string, query?: MultiQueryFormData): Promise; /** * Lookup entity * @param entity 'area', 'artist', collection', 'instrument', 'label', 'place', 'release', 'release-group', 'recording', 'series', 'work', 'url' or 'event' * @param mbid Entity MBID * @param inc Includes, which allows you to request more information to be included about the entity */ lookup(entity: 'area', mbid: string, inc?: AreaIncludes[]): Promise; lookup(entity: 'artist', mbid: string, inc?: ArtistIncludes[]): Promise; lookup(entity: 'collection', mbid: string, inc?: CollectionIncludes[]): Promise; lookup(entity: 'instrument', mbid: string, inc?: InstrumentIncludes[]): Promise; lookup(entity: 'label', mbid: string, inc?: LabelIncludes[]): Promise; lookup(entity: 'place', mbid: string, inc?: PlaceIncludes[]): Promise; lookup(entity: 'release', mbid: string, inc?: ReleaseIncludes[]): Promise; lookup(entity: 'release-group', mbid: string, inc?: ReleaseGroupIncludes[]): Promise; lookup(entity: 'recording', mbid: string, inc?: RecordingIncludes[]): Promise; lookup(entity: 'series', mbid: string, inc?: SeriesIncludes[]): Promise; lookup(entity: 'work', mbid: string, inc?: WorkIncludes[]): Promise; lookup(entity: 'url', mbid: string, inc?: UrlIncludes[]): Promise; lookup(entity: 'event', mbid: string, inc?: EventIncludes[]): Promise; lookupUrl(url: string, inc?: UrlIncludes[]): Promise; lookupUrl(url: string[], inc?: UrlIncludes[]): Promise; /** * Browse entity * https://wiki.musicbrainz.org/MusicBrainz_API#Browse * https://wiki.musicbrainz.org/MusicBrainz_API#Linked_entities * https://wiki.musicbrainz.org/Development/JSON_Web_Service#Browse_Requests * For example: http://musicbrainz.org/ws/2/release?label=47e718e1-7ee4-460c-b1cc-1192a841c6e5&offset=12&limit=2 * @param entity MusicBrainz entity * @param query Query, like: {: ; browse(entity: 'artist', query?: mb.IBrowseArtistsQuery, inc?: ArtistIncludes[]): Promise; browse(entity: 'collection', query?: mb.IBrowseCollectionsQuery, inc?: CollectionIncludes[]): Promise; browse(entity: 'event', query?: mb.IBrowseEventsQuery, inc?: EventIncludes[]): Promise; browse(entity: 'label', query?: mb.IBrowseLabelsQuery, inc?: LabelIncludes[]): Promise; browse(entity: 'instrument', query?: mb.IBrowseInstrumentsQuery, inc?: InstrumentIncludes[]): Promise; browse(entity: 'place', query?: mb.IBrowsePlacesQuery, inc?: PlaceIncludes[]): Promise; browse(entity: 'recording', query?: mb.IBrowseRecordingsQuery, inc?: RecordingIncludes[]): Promise; browse(entity: 'release', query?: mb.IBrowseReleasesQuery, inc?: ReleaseIncludes[]): Promise; browse(entity: 'release-group', query?: mb.IBrowseReleaseGroupsQuery, inc?: ReleaseGroupIncludes[]): Promise; browse(entity: 'series', query?: mb.IBrowseSeriesQuery, inc?: SeriesIncludes[]): Promise; browse(entity: 'url', query?: mb.IBrowseUrlsQuery, inc?: UrlIncludes[]): Promise; browse(entity: 'work', query?: mb.IBrowseWorksQuery, inc?: WorkIncludes[]): Promise; /** * Search an entity using a search query * @param entity e.g. 'recording' * @param query e.g.: '" artist: Madonna, track: Like a virgin"' or object with search terms: {artist: Madonna} */ search(entity: 'annotation', query: mb.ISearchQuery<(MiscIncludes | RelationsIncludes)>): Promise; search(entity: 'area', query: mb.ISearchQuery & mb.ILinkedEntitiesArea): Promise; search(entity: 'artist', query: mb.ISearchQuery & mb.ILinkedEntitiesArea): Promise; search(entity: 'cdstub', query: mb.ISearchQuery<(MiscIncludes | RelationsIncludes)>): Promise; search(entity: 'event', query: mb.ISearchQuery & mb.ILinkedEntitiesEvent): Promise; search(entity: 'instrument', query: mb.ISearchQuery & mb.ILinkedEntitiesInstrument): Promise; search(entity: 'label', query: mb.ISearchQuery & mb.ILinkedEntitiesLabel): Promise; search(entity: 'place', query: mb.ISearchQuery & mb.ILinkedEntitiesPlace): Promise; search(entity: 'recording', query: mb.ISearchQuery & mb.ILinkedEntitiesArea): Promise; search(entity: 'release', query: mb.ISearchQuery & mb.ILinkedEntitiesArea): Promise; search(entity: 'release-group', query: mb.ISearchQuery & mb.ILinkedEntitiesArea): Promise; search(entity: 'series', query: mb.ISearchQuery & mb.ILinkedEntitiesSeries): Promise; search(entity: 'tag', query: mb.ISearchQuery): Promise; search(entity: 'url', query: mb.ISearchQuery & mb.ILinkedEntitiesUrl): Promise; search(entity: 'work', query: mb.ISearchQuery & mb.ILinkedEntitiesWork): Promise; postRecording(xmlMetadata: XmlMetadata): Promise; post(entity: mb.EntityType, xmlMetadata: XmlMetadata): Promise; /** * Submit entity * @param entity Entity type e.g. 'recording' * @param mbid * @param formData */ editEntity(entity: mb.EntityType, mbid: string, formData: Record): Promise; /** * Set URL to recording * @param recording Recording to update * @param url2add URL to add to the recording * @param editNote Edit note */ addUrlToRecording(recording: mb.IRecording, url2add: { linkTypeId: mb.LinkType; text: string; }, editNote?: string): Promise; /** * Add ISRC to recording * @param recording Recording to update * @param isrc ISRC code to add */ addIsrc(recording: mb.IRecording, isrc: string): Promise; /** * Add Spotify-ID to MusicBrainz recording. * This function will automatically lookup the recording title, which is required to submit the recording URL * @param recording MBID of the recording * @param spotifyId Spotify ID * @param editNote Comment to add. */ addSpotifyIdToRecording(recording: mb.IRecording, spotifyId: string, editNote: string): Promise; protected getSession(): Promise; protected applyRateLimiter(): Promise; } export declare function makeAndQueryString(keyValuePairs: IFormData): string;