mirror of
https://github.com/austinried/subtracks.git
synced 2025-12-27 00:59:28 +01:00
127 lines
3.9 KiB
TypeScript
127 lines
3.9 KiB
TypeScript
import { AlbumID3Element, ArtistElement, ArtistID3Element, BaseArtistElement, ChildElement } from "./elements";
|
|
|
|
export type ResponseStatus = 'ok' | 'failed';
|
|
|
|
export class SubsonicResponse<T> {
|
|
status: ResponseStatus;
|
|
version: string;
|
|
data: T;
|
|
|
|
constructor(xml: Document, data: T) {
|
|
this.data = data;
|
|
this.status = xml.documentElement.getAttribute('status') as ResponseStatus;
|
|
this.version = xml.documentElement.getAttribute('version') as string;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Browsing
|
|
//
|
|
|
|
export class GetArtistsResponse {
|
|
ignoredArticles: string;
|
|
artists: ArtistID3Element[] = [];
|
|
|
|
constructor(xml: Document) {
|
|
this.ignoredArticles = xml.getElementsByTagName('artists')[0].getAttribute('ignoredArticles') as string;
|
|
|
|
const artistElements = xml.getElementsByTagName('artist');
|
|
for (let i = 0; i < artistElements.length; i++) {
|
|
this.artists.push(new ArtistID3Element(artistElements[i]));
|
|
}
|
|
}
|
|
}
|
|
|
|
export class GetIndexesResponse {
|
|
ignoredArticles: string;
|
|
lastModified: number;
|
|
artists: ArtistElement[] = [];
|
|
|
|
constructor(xml: Document) {
|
|
const indexesElement = xml.getElementsByTagName('indexes')[0];
|
|
|
|
this.ignoredArticles = indexesElement.getAttribute('ignoredArticles') as string;
|
|
this.lastModified = parseInt(indexesElement.getAttribute('lastModified') as string);
|
|
|
|
const artistElements = xml.getElementsByTagName('artist');
|
|
for (let i = 0; i < artistElements.length; i++) {
|
|
this.artists.push(new ArtistElement(artistElements[i]));
|
|
}
|
|
}
|
|
}
|
|
|
|
class BaseGetArtistInfoResponse<T extends BaseArtistElement> {
|
|
similarArtists: T[] = [];
|
|
biography?: string;
|
|
musicBrainzId?: string;
|
|
lastFmUrl?: string;
|
|
smallImageUrl?: string;
|
|
mediumImageUrl?: string;
|
|
largeImageUrl?: string;
|
|
|
|
constructor(xml: Document, artistType: new (e: Element) => T) {
|
|
if (xml.getElementsByTagName('biography').length > 0) {
|
|
this.biography = xml.getElementsByTagName('biography')[0].textContent as string;
|
|
}
|
|
if (xml.getElementsByTagName('musicBrainzId').length > 0) {
|
|
this.musicBrainzId = xml.getElementsByTagName('musicBrainzId')[0].textContent as string;
|
|
}
|
|
if (xml.getElementsByTagName('lastFmUrl').length > 0) {
|
|
this.lastFmUrl = xml.getElementsByTagName('lastFmUrl')[0].textContent as string;
|
|
}
|
|
if (xml.getElementsByTagName('smallImageUrl').length > 0) {
|
|
this.smallImageUrl = xml.getElementsByTagName('smallImageUrl')[0].textContent as string;
|
|
}
|
|
if (xml.getElementsByTagName('mediumImageUrl').length > 0) {
|
|
this.mediumImageUrl = xml.getElementsByTagName('mediumImageUrl')[0].textContent as string;
|
|
}
|
|
if (xml.getElementsByTagName('largeImageUrl').length > 0) {
|
|
this.largeImageUrl = xml.getElementsByTagName('largeImageUrl')[0].textContent as string;
|
|
}
|
|
|
|
const similarArtistElements = xml.getElementsByTagName('similarArtist');
|
|
for (let i = 0; i < similarArtistElements.length; i++) {
|
|
this.similarArtists.push(new artistType(similarArtistElements[i]));
|
|
}
|
|
}
|
|
}
|
|
|
|
export class GetArtistInfoResponse extends BaseGetArtistInfoResponse<ArtistElement> {
|
|
constructor(xml: Document) {
|
|
super(xml, ArtistElement);
|
|
}
|
|
}
|
|
|
|
export class GetArtistInfo2Response extends BaseGetArtistInfoResponse<ArtistID3Element> {
|
|
constructor(xml: Document) {
|
|
super(xml, ArtistID3Element);
|
|
}
|
|
}
|
|
|
|
//
|
|
// Album/song lists
|
|
//
|
|
|
|
class BaseGetAlbumListResponse<T> {
|
|
albums: T[] = [];
|
|
|
|
constructor(xml: Document, albumType: new (e: Element) => T) {
|
|
const albumElements = xml.getElementsByTagName('album');
|
|
for (let i = 0; i < albumElements.length; i++) {
|
|
this.albums.push(new albumType(albumElements[i]));
|
|
}
|
|
}
|
|
}
|
|
|
|
export class GetAlbumListResponse extends BaseGetAlbumListResponse<ChildElement> {
|
|
constructor(xml: Document) {
|
|
super(xml, ChildElement);
|
|
}
|
|
}
|
|
|
|
export class GetAlbumList2Response extends BaseGetAlbumListResponse<AlbumID3Element> {
|
|
constructor(xml: Document) {
|
|
super(xml, AlbumID3Element);
|
|
}
|
|
}
|