Experiment to rebuild Diffuse using web applets.
1<main class="container">
2 <h1>OpenSubsonic input</h1>
3
4 <h4>Mounted servers</h4>
5
6 <div id="servers">
7 <p>
8 <span class="with-icon">
9 <i class="iconoir-bonfire"></i>
10 <small>Just a moment, loading mounted servers.</small>
11 </span>
12 </p>
13 </div>
14
15 <h4>Add a new OpenSubsonic-compatible server</h4>
16
17 <form id="form"></form>
18</main>
19
20<script>
21 import type { Tasks } from "@scripts/input/opensubsonic/worker";
22 import type { Track } from "@applets/core/types.d.ts";
23 import { register } from "@scripts/applet/common";
24 import { endpoint, inIframe, SharedWorker, transfer } from "@scripts/common";
25 import manifest from "./_manifest.json";
26
27 ////////////////////////////////////////////
28 // SETUP
29 ////////////////////////////////////////////
30 const worker = endpoint<Tasks>(
31 new Worker(new URL("../../../scripts/input/opensubsonic/worker", import.meta.url), {
32 type: "module",
33 name: manifest.name,
34 }),
35 );
36
37 // Register applet
38 const context = register({ worker });
39
40 ////////////////////////////////////////////
41 // ACTIONS
42 ////////////////////////////////////////////
43 const consult = async (fileUriOrScheme: string) => {
44 return await worker.consult(fileUriOrScheme);
45 };
46
47 const contextualize = async (tracks: Track[]) => {
48 const s = await worker.contextualize(transfer(tracks));
49 ui?.setServers({ ...ui?.servers(), ...s });
50 };
51
52 const groupConsult = async (tracks: Track[]) => {
53 return await worker.groupConsult(transfer(tracks));
54 };
55
56 const list = async (cachedTracks: Track[] = []) => {
57 return await worker.list(transfer(cachedTracks));
58 };
59
60 const resolve = async (args: { method: string; uri: string }) => {
61 return await worker.resolve(args);
62 };
63
64 const mount = async () => {};
65
66 const unmount = async () => {};
67
68 context.setActionHandler("consult", consult);
69 context.setActionHandler("contextualize", contextualize);
70 context.setActionHandler("groupConsult", groupConsult);
71 context.setActionHandler("list", list);
72 context.setActionHandler("resolve", resolve);
73 context.setActionHandler("mount", mount);
74 context.setActionHandler("unmount", unmount);
75
76 ////////////////////////////////////////////
77 // UI
78 ////////////////////////////////////////////
79 const ui = inIframe() ? undefined : await import("@scripts/input/opensubsonic/ui");
80</script>