Fix issue where track numbers on playlists were album track numbers rather than playlist track numbers

This commit is contained in:
simojenki
2021-05-10 12:51:05 +10:00
parent 4229ad1836
commit 290229ef1c
2 changed files with 55 additions and 33 deletions

View File

@@ -657,31 +657,34 @@ export class Navidrome implements MusicService {
id, id,
}) })
.then((it) => it.playlist) .then((it) => it.playlist)
.then((playlist) => ({ .then((playlist) => {
id: playlist._id, let trackNumber = 1;
name: playlist._name, return {
entries: (playlist.entry || []).map((entry) => ({ id: playlist._id,
id: entry._id, name: playlist._name,
name: entry._title, entries: (playlist.entry || []).map((entry) => ({
mimeType: entry._contentType, id: entry._id,
duration: parseInt(entry._duration || "0"), name: entry._title,
number: parseInt(entry._track || "0"), mimeType: entry._contentType,
genre: maybeAsGenre(entry._genre), duration: parseInt(entry._duration || "0"),
album: { number: trackNumber++,
id: entry._albumId,
name: entry._album,
year: entry._year,
genre: maybeAsGenre(entry._genre), genre: maybeAsGenre(entry._genre),
album: {
id: entry._albumId,
name: entry._album,
year: entry._year,
genre: maybeAsGenre(entry._genre),
artistName: entry._artist, artistName: entry._artist,
artistId: entry._artistId, artistId: entry._artistId,
}, },
artist: { artist: {
id: entry._artistId, id: entry._artistId,
name: entry._artist, name: entry._artist,
}, },
})), })),
})), }
}),
}; };
return Promise.resolve(musicLibrary); return Promise.resolve(musicLibrary);

View File

@@ -3163,30 +3163,49 @@ describe("Navidrome", () => {
describe("when there is a playlist with the id", () => { describe("when there is a playlist with the id", () => {
describe("and it has tracks", () => { describe("and it has tracks", () => {
it("should return the playlist with entries", async () => { it("should return the playlist with entries", async () => {
const playlist = aPlaylist({ const id = uuid();
entries: [ const name = "Great Playlist";
aTrack({ genre: { id: "pop", name: "pop" } }), const track1 = aTrack({
aTrack({ genre: { id: "rock", name: "rock" } }), genre: { id: "pop", name: "pop" },
], number: 66,
});
const track2 = aTrack({
genre: { id: "rock", name: "rock" },
number: 77,
}); });
mockGET mockGET
.mockImplementationOnce(() => Promise.resolve(ok(PING_OK))) .mockImplementationOnce(() => Promise.resolve(ok(PING_OK)))
.mockImplementationOnce(() => .mockImplementationOnce(() =>
Promise.resolve(ok(getPlayList(playlist))) Promise.resolve(
ok(
getPlayList({
id,
name,
entries: [track1, track2],
})
)
)
); );
const result = await navidrome const result = await navidrome
.generateToken({ username, password }) .generateToken({ username, password })
.then((it) => it as AuthSuccess) .then((it) => it as AuthSuccess)
.then((it) => navidrome.login(it.authToken)) .then((it) => navidrome.login(it.authToken))
.then((it) => it.playlist(playlist.id)); .then((it) => it.playlist(id));
expect(result).toEqual(playlist); expect(result).toEqual({
id,
name,
entries: [
{ ...track1, number: 1 },
{ ...track2, number: 2 },
],
});
expect(mockGET).toHaveBeenCalledWith(`${url}/rest/getPlaylist`, { expect(mockGET).toHaveBeenCalledWith(`${url}/rest/getPlaylist`, {
params: { params: {
id: playlist.id, id,
...authParams, ...authParams,
}, },
headers, headers,