music source and client for subsonic

test fixture setup for navidrome
This commit is contained in:
austinried
2025-11-01 22:24:59 +09:00
parent 9f05ebb201
commit 3408a3988e
18 changed files with 1556 additions and 8 deletions

View File

@@ -0,0 +1,44 @@
#!/usr/bin/env -S deno --allow-all
import * as path from "jsr:@std/path@1.1.2";
import { MUSIC_DIR } from "./util/env.ts";
import { SubsonicClient } from "./util/subsonic.ts";
await new Deno.Command("rm", { args: ["-rf", path.join(MUSIC_DIR, "*")] })
.output();
const client = new SubsonicClient(
"http://demo.subsonic.org",
"guest1",
"guest",
);
for (const id of ["197", "199", "321"]) {
const res = await client.get("download", { id });
let filename = res.headers.get("Content-Disposition")
?.split(";")[1];
filename = (filename?.includes("*=")
? decodeURIComponent(filename.split("''")[1])
: filename?.split("=")[1]) ?? `${id}.zip`;
console.log("downloading album:", filename);
const downloadPath = path.join(MUSIC_DIR, filename);
const file = await Deno.open(downloadPath, {
write: true,
create: true,
});
await res.body?.pipeTo(file.writable);
await new Deno.Command("unzip", {
args: [
downloadPath,
"-d",
path.join(MUSIC_DIR, filename.split(".")[0]),
],
}).output();
await Deno.remove(downloadPath);
}
console.log("music-download complete");

View File

@@ -0,0 +1,18 @@
#!/usr/bin/env -S deno --allow-all
async function setupNavidrome() {
console.log("setting up navidrome...");
await fetch("http://navidrome:4533/auth/createAdmin", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
username: "admin",
password: "password",
}),
});
}
await setupNavidrome();
console.log("setup-servers complete");

View File

@@ -0,0 +1 @@
export const MUSIC_DIR = Deno.env.get("MUSIC_DIR") ?? "/music";

View File

@@ -0,0 +1,24 @@
export class SubsonicClient {
constructor(
readonly baseUrl: string,
readonly username: string,
readonly password: string,
) {}
get(method: string, params?: Record<string, string>) {
const url = new URL(`rest/${method}.view`, this.baseUrl);
url.searchParams.set("u", this.username);
url.searchParams.set("p", this.password);
url.searchParams.set("v", "1.13.0");
url.searchParams.set("c", "subtracks-test-fixture");
if (params) {
Object.entries(params).forEach(([key, value]) =>
url.searchParams.append(key, value)
);
}
return fetch(url);
}
}