a simple web player for subsonic
tinysub.devins.page
subsonic
navidrome
javascript
1import {
2 api,
3 setCredentials,
4 createToken,
5 songCache,
6} from "./client.svelte.js";
7import { loadLib } from "./library.svelte.js";
8import { syncQueue } from "./queue.svelte.js";
9
10export const auth = $state({
11 ok: false,
12 busy: false,
13 err: null as string | null,
14 server: "",
15 user: "",
16});
17
18export const login = async (
19 server: string,
20 username: string,
21 password?: string,
22) => {
23 auth.busy = true;
24 auth.err = null;
25 try {
26 if (password) {
27 setCredentials({ server, username, ...createToken(password) });
28 }
29 await api.ping();
30 await loadLib();
31 await syncQueue();
32 Object.assign(auth, { server, user: username, ok: true });
33 return true;
34 } catch (err: any) {
35 setCredentials(null);
36 auth.err = err;
37 return false;
38 } finally {
39 auth.busy = false;
40 }
41};
42
43export const logout = async () => {
44 songCache.clear();
45 localStorage.clear();
46 indexedDB.deleteDatabase("tinysub");
47 if (indexedDB.databases) {
48 const dbs = await indexedDB.databases();
49 for (const db of dbs) indexedDB.deleteDatabase(db.name!);
50 }
51 location.reload();
52};