From a08e92fb35803532a2e3f356a117d87ed0532dbe Mon Sep 17 00:00:00 2001 From: simojenki Date: Fri, 9 Apr 2021 10:56:19 +1000 Subject: [PATCH] Add Starred albums --- src/music_service.ts | 2 +- src/smapi.ts | 14 +++++++++---- tests/smapi.test.ts | 50 +++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 60 insertions(+), 6 deletions(-) diff --git a/src/music_service.ts b/src/music_service.ts index f0c4100..cd0cc09 100644 --- a/src/music_service.ts +++ b/src/music_service.ts @@ -94,7 +94,7 @@ export const asResult = ([results, total]: [T[], number]) => ({ export type ArtistQuery = Paging; -export type AlbumQueryType = 'alphabeticalByArtist' | 'byGenre' | 'random' | 'recent' | 'frequent' | 'newest'; +export type AlbumQueryType = 'alphabeticalByArtist' | 'byGenre' | 'random' | 'recent' | 'frequent' | 'newest' | 'starred'; export type AlbumQuery = Paging & { type: AlbumQueryType; diff --git a/src/smapi.ts b/src/smapi.ts index 4588138..adfdec5 100644 --- a/src/smapi.ts +++ b/src/smapi.ts @@ -419,6 +419,7 @@ function bindSmapiSoapServiceToExpress( container({ id: "albums", title: "Albums" }), container({ id: "genres", title: "Genres" }), container({ id: "randomAlbums", title: "Random" }), + container({ id: "starredAlbums", title: "Starred" }), container({ id: "recentlyAdded", title: "Recently Added", @@ -433,7 +434,7 @@ function bindSmapiSoapServiceToExpress( }), ], index: 0, - total: 7, + total: 8, }); case "artists": return musicLibrary.artists(paging).then((result) => { @@ -451,15 +452,20 @@ function bindSmapiSoapServiceToExpress( ...paging, }); } + case "genre": + return albums({ + type: "byGenre", + genre: typeId, + ...paging, + }); case "randomAlbums": return albums({ type: "random", ...paging, }); - case "genre": + case "starredAlbums": return albums({ - type: "byGenre", - genre: typeId, + type: "starred", ...paging, }); case "recentlyAdded": diff --git a/tests/smapi.test.ts b/tests/smapi.test.ts index 2e73182..493960d 100644 --- a/tests/smapi.test.ts +++ b/tests/smapi.test.ts @@ -542,6 +542,11 @@ describe("api", () => { id: "randomAlbums", title: "Random", }, + { + itemType: "container", + id: "starredAlbums", + title: "Starred", + }, { itemType: "container", id: "recentlyAdded", @@ -559,7 +564,7 @@ describe("api", () => { }, ], index: 0, - total: 7, + total: 8, }) ); }); @@ -938,6 +943,49 @@ describe("api", () => { }); }); + describe("asking for starred albums", () => { + const albums = [rock2, rock1, pop2]; + + beforeEach(() => { + musicLibrary.albums.mockResolvedValue({ + results: albums, + total: allAlbums.length, + }); + }); + + it("should return some", async () => { + const paging = { + index: 0, + count: 100, + }; + + const result = await ws.getMetadataAsync({ + id: "starredAlbums", + ...paging, + }); + + expect(result[0]).toEqual( + getMetadataResult({ + mediaCollection: albums.map((it) => ({ + itemType: "album", + id: `album:${it.id}`, + title: it.name, + albumArtURI: defaultAlbumArtURI(rootUrl, accessToken, it), + canPlay: true, + })), + index: 0, + total: 6, + }) + ); + + expect(musicLibrary.albums).toHaveBeenCalledWith({ + type: "starred", + _index: paging.index, + _count: paging.count, + }); + }); + }); + describe("asking for recently played albums", () => { const recentlyPlayed = [rock2, rock1, pop2];