// Purpose: Interfaces for MusicBrainz data. export interface mbDefaultType { media_type: string; id: string; tags: string[]; } export enum mbArtistType { PERSON = 'Person', GROUP = 'Group', ORCHESTRA = 'Orchestra', CHOIR = 'Choir', CHARACTER = 'Character', OTHER = 'Other', } export interface mbArtist extends mbDefaultType { media_type: 'artist'; name: string; sortName: string; type: mbArtistType; recordings?: mbRecording[]; releases?: mbRelease[]; releaseGroups?: mbReleaseGroup[]; works?: mbWork[]; gender?: string; area?: string; beginDate?: string; endDate?: string; } export interface mbRecording extends mbDefaultType { media_type: 'recording'; title: string; artist: mbArtist[]; length: number; firstReleased?: Date; } export interface mbRelease extends mbDefaultType { media_type: 'release'; title: string; artist: mbArtist[]; date?: Date; tracks?: mbRecording[]; releaseGroup?: mbReleaseGroup; } export enum mbReleaseGroupType { ALBUM = 'Album', SINGLE = 'Single', EP = 'EP', BROADCAST = 'Broadcast', OTHER = 'Other', } export interface mbReleaseGroup extends mbDefaultType { media_type: 'release-group'; title: string; artist: mbArtist[]; type: mbReleaseGroupType; firstReleased?: Date; releases?: mbRelease[]; } export enum mbWorkType { ARIA = 'Aria', BALLET = 'Ballet', CANTATA = 'Cantata', CONCERTO = 'Concerto', SONATA = 'Sonata', SUITE = 'Suite', MADRIGAL = 'Madrigal', MASS = 'Mass', MOTET = 'Motet', OPERA = 'Opera', ORATORIO = 'Oratorio', OVERTURE = 'Overture', PARTITA = 'Partita', QUARTET = 'Quartet', SONG_CYCLE = 'Song-cycle', SYMPHONY = 'Symphony', SONG = 'Song', SYMPHONIC_POEM = 'Symphonic poem', ZARZUELA = 'Zarzuela', ETUDE = 'Étude', POEM = 'Poem', SOUNDTRACK = 'Soundtrack', PROSE = 'Prose', OPERETTA = 'Operetta', AUDIO_DRAMA = 'Audio drama', BEIJING_OPERA = 'Beijing opera', PLAY = 'Play', MUSICAL = 'Musical', INCIDENTAL_MUSIC = 'Incidental music', OTHER = 'Other', } export interface mbWork extends mbDefaultType { media_type: 'work'; title: string; type: mbWorkType; artist: mbArtist[]; } export interface Artist { 'end-area': Area; tags: Tag[]; name: string; country: string; ipis: string[]; gender: string; area: Area; begin_area: Area; id: string; releases: Release[]; 'type-id': string; 'begin-area': Area; isnis: string[]; recordings: Recording[]; 'sort-name': string; 'release-groups': Group[]; works: Work[]; type: string; 'gender-id': string; disambiguation: string; end_area: Area; 'life-span': LifeSpan; } export interface Tag { count: number; name: string; } export interface Area { type: string; disambiguation: string; 'iso-3166-1-codes'?: string[]; 'type-id': string; id: string; 'sort-name': string; name: string; } export interface Release { 'packaging-id'?: string; title: string; 'release-events'?: Event[]; tags: Tag[]; country?: string; status: string; 'release-group': Group; quality: string; media: Medium[]; date?: string; packaging?: string; disambiguation: string; barcode?: string; 'status-id': string; 'text-representation': TextRepresentation; id: string; 'cover-art-archive': CoverArtArchive; 'artist-credit': ArtistCredit[]; } export interface CoverArtArchive { artwork: boolean; back: boolean; count: number; darkened: boolean; front: boolean; } export interface ArtistCredit { name: string; joinphrase: string; artist: Artist; } export interface Event { area?: Area; date: string; } export interface Medium { position: number; 'format-id': string; format: string; title: string; 'track-count': number; 'track-offset'?: number; tracks?: Track[]; } export interface Track { title: string; position: number; number: string; recording: Recording; length: number; id: string; } export interface TextRepresentation { language: string; script: string; } export interface Recording { title: string; tags: Tag[]; disambiguation: string; id: string; releases: Release[]; 'first-release-date': string; length: number; 'artist-credit': ArtistCredit[]; video: boolean; } export interface Group { id: string; releases: Release[]; 'first-release-date': string; 'primary-type': string; tags: Tag[]; 'secondary-types': string[]; disambiguation: string; 'secondary-type-ids': string[]; 'primary-type-id': string; title: string; 'artist-credit': ArtistCredit[]; } export interface Work { attributes: Attribute[]; language: string; type: string; disambiguation: string; id: string; 'type-id': string; iswcs: string[]; title: string; tags: Tag[]; languages: string[]; relations: Relation[]; } export interface Relation { type: string; attributes: Attribute[]; begin: string; 'target-credit': string; end: string; 'type-id': string; direction: string; ended: boolean; 'target-type': string; 'source-credit': string; artist: Artist; } export interface Attribute { 'type-id': string; type: string; value: string; } export interface LifeSpan { ended: boolean; end: string; begin: string; } export interface SearchOptions { query: string; page?: number; limit?: number; keywords?: string; artistname?: string; albumname?: string; recordingname?: string; tag?: string; }