sync the rest of the source models

refactor music download/storage to avoid re-download during reset
add palylist to test server setup
This commit is contained in:
austinried
2025-11-07 15:20:38 +09:00
parent 0e6acbed0f
commit 0c80dbdba5
13 changed files with 451 additions and 149 deletions

View File

@@ -2,31 +2,69 @@
import { SubsonicClient } from "./util/subsonic.ts";
import { sleep } from "./util/util.ts";
async function scrobbleTrack(
async function getSongId(
client: SubsonicClient,
album: string,
track: number,
): Promise<string> {
const { xml: albumsXml } = await client.get("getAlbumList2", [
["type", "newest"],
]);
const albumId = albumsXml.querySelector(
`album[name='${album.replaceAll("'", "\\'")}']`,
)?.id;
const { xml: songsXml } = await client.get("getAlbum", [["id", albumId!]]);
return songsXml.querySelector(`song[track='${track}']`)?.id!;
}
async function scrobbleTrack(
client: SubsonicClient,
songId: string,
) {
const { xml: albumsXml } = await client.get("getAlbumList2", {
type: "newest",
});
const albumId = albumsXml.querySelector(`album[name='${album}']`)?.id;
await client.get("scrobble", [
["id", songId!],
["submission", "true"],
]);
}
const { xml: songsXml } = await client.get("getAlbum", { id: albumId! });
const songId = songsXml.querySelector(`song[track='${track}']`)?.id;
async function createPlaylist(
client: SubsonicClient,
name: string,
songs: { album: string; track: number }[],
) {
const songIds = await Promise.all(songs.map(({ album, track }) => {
return getSongId(client, album, track);
}));
await client.get("scrobble", {
id: songId!,
submission: "true",
});
await client.get("createPlaylist", [
["name", name],
...songIds.map((songId) => ["songId", songId] as [string, string]),
]);
}
async function setupTestData(client: SubsonicClient) {
await scrobbleTrack(client, "Retroconnaissance EP", 1);
await scrobbleTrack(
client,
await getSongId(client, "Retroconnaissance EP", 1),
);
await sleep(1_000);
await scrobbleTrack(client, "Retroconnaissance EP", 2);
await scrobbleTrack(
client,
await getSongId(client, "Retroconnaissance EP", 2),
);
await sleep(1_000);
await scrobbleTrack(client, "Kosmonaut", 1);
await scrobbleTrack(client, await getSongId(client, "Kosmonaut", 1));
await createPlaylist(client, "Playlist 1", [
{ album: "Retroconnaissance EP", track: 2 },
{ album: "Retroconnaissance EP", track: 1 },
{ album: "Kosmonaut", track: 2 },
{ album: "Kosmonaut", track: 4 },
{ album: "I Don't Know What I'm Doing", track: 9 },
{ album: "I Don't Know What I'm Doing", track: 10 },
{ album: "I Don't Know What I'm Doing", track: 11 },
]);
}
async function setupNavidrome() {