mirror of
https://github.com/wkulhanek/bonob.git
synced 2025-12-21 17:33:29 +01:00
Genres on main menu
This commit is contained in:
20
src/smapi.ts
20
src/smapi.ts
@@ -164,6 +164,12 @@ const container = ({
|
|||||||
title,
|
title,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const genre = (genre: string) => ({
|
||||||
|
itemType: "container",
|
||||||
|
id: `genre:${genre}`,
|
||||||
|
title: genre,
|
||||||
|
})
|
||||||
|
|
||||||
const album = (album: AlbumSummary) => ({
|
const album = (album: AlbumSummary) => ({
|
||||||
itemType: "album",
|
itemType: "album",
|
||||||
id: `album:${album.id}`,
|
id: `album:${album.id}`,
|
||||||
@@ -237,9 +243,10 @@ function bindSmapiSoapServiceToExpress(
|
|||||||
mediaCollection: [
|
mediaCollection: [
|
||||||
container({ id: "artists", title: "Artists" }),
|
container({ id: "artists", title: "Artists" }),
|
||||||
container({ id: "albums", title: "Albums" }),
|
container({ id: "albums", title: "Albums" }),
|
||||||
|
container({ id: "genres", title: "Genres" }),
|
||||||
],
|
],
|
||||||
index: 0,
|
index: 0,
|
||||||
total: 2,
|
total: 3,
|
||||||
});
|
});
|
||||||
case "artists":
|
case "artists":
|
||||||
return await musicLibrary.artists(paging).then((result) =>
|
return await musicLibrary.artists(paging).then((result) =>
|
||||||
@@ -263,6 +270,17 @@ function bindSmapiSoapServiceToExpress(
|
|||||||
total: result.total,
|
total: result.total,
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
case "genres":
|
||||||
|
return await musicLibrary
|
||||||
|
.genres()
|
||||||
|
.then(slice2(paging))
|
||||||
|
.then(([page, total]) =>
|
||||||
|
getMetadataResult({
|
||||||
|
mediaCollection: page.map(genre),
|
||||||
|
index: paging._index,
|
||||||
|
total,
|
||||||
|
})
|
||||||
|
);
|
||||||
case "artist":
|
case "artist":
|
||||||
return await musicLibrary
|
return await musicLibrary
|
||||||
.artist(typeId!)
|
.artist(typeId!)
|
||||||
|
|||||||
@@ -353,23 +353,79 @@ describe("api", () => {
|
|||||||
mediaCollection: [
|
mediaCollection: [
|
||||||
{ itemType: "container", id: "artists", title: "Artists" },
|
{ itemType: "container", id: "artists", title: "Artists" },
|
||||||
{ itemType: "container", id: "albums", title: "Albums" },
|
{ itemType: "container", id: "albums", title: "Albums" },
|
||||||
|
{ itemType: "container", id: "genres", title: "Genres" },
|
||||||
],
|
],
|
||||||
index: 0,
|
index: 0,
|
||||||
total: 2,
|
total: 3,
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("asking for a genres", () => {
|
||||||
|
const artist1 = anArtist({
|
||||||
|
albums: [anAlbum({ genre: "Pop" }), anAlbum({ genre: "Rock" })],
|
||||||
|
});
|
||||||
|
const artist2 = anArtist({
|
||||||
|
albums: [
|
||||||
|
anAlbum({ genre: "Trip-Hop" }),
|
||||||
|
anAlbum({ genre: "Punk" }),
|
||||||
|
anAlbum({ genre: "Pop" }),
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
const expectedGenres = ["Pop", "Punk", "Rock", "Trip-Hop"];
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
musicService.hasArtists(artist1, artist2);
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("asking for all genres", () => {
|
||||||
|
it("should return a collection of genres", async () => {
|
||||||
|
const result = await ws.getMetadataAsync({
|
||||||
|
id: `genres`,
|
||||||
|
index: 0,
|
||||||
|
count: 100,
|
||||||
|
});
|
||||||
|
expect(result[0]).toEqual(
|
||||||
|
getMetadataResult({
|
||||||
|
mediaCollection: expectedGenres.map((genre) => ({
|
||||||
|
itemType: "container",
|
||||||
|
id: `genre:${genre}`,
|
||||||
|
title: genre,
|
||||||
|
})),
|
||||||
|
index: 0,
|
||||||
|
total: expectedGenres.length,
|
||||||
|
})
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("asking for a page of genres", () => {
|
||||||
|
it("should return just that page", async () => {
|
||||||
|
const result = await ws.getMetadataAsync({
|
||||||
|
id: `genres`,
|
||||||
|
index: 1,
|
||||||
|
count: 2,
|
||||||
|
});
|
||||||
|
expect(result[0]).toEqual(
|
||||||
|
getMetadataResult({
|
||||||
|
mediaCollection: ["Punk", "Rock"].map((genre) => ({
|
||||||
|
itemType: "container",
|
||||||
|
id: `genre:${genre}`,
|
||||||
|
title: genre,
|
||||||
|
})),
|
||||||
|
index: 1,
|
||||||
|
total: expectedGenres.length,
|
||||||
|
})
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe("asking for a single artist", () => {
|
describe("asking for a single artist", () => {
|
||||||
const artistWithManyAlbums = anArtist({
|
const artistWithManyAlbums = anArtist({
|
||||||
albums: [
|
albums: [anAlbum(), anAlbum(), anAlbum(), anAlbum(), anAlbum()],
|
||||||
anAlbum(),
|
|
||||||
anAlbum(),
|
|
||||||
anAlbum(),
|
|
||||||
anAlbum(),
|
|
||||||
anAlbum(),
|
|
||||||
],
|
|
||||||
});
|
});
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
|
|||||||
Reference in New Issue
Block a user