···3030 "desc": "Store tracks locally for offline usage automatically after they've been playing for a while."
3131 },
3232 {
3333+ "url": "facets/connect/atproto/index.html",
3434+ "title": "Connect / AT Protocol",
3535+ "category": "Data",
3636+ "featured": true,
3737+ "desc": "Use your AT Protocol identity for user-data storage."
3838+ },
3939+ {
3340 "url": "facets/connect/s3/index.html",
3434- "title": "Connect to S3",
4141+ "title": "Connect / S3",
3542 "category": "Data",
3643 "featured": true,
3744 "desc": "Connect to an S3-compatible storage for audio input or user-data storage."
···4855 "kind": "prelude",
4956 "category": "Data",
5057 "featured": true,
5151- "desc": "The default setup for audio input sources. Supports these services: HTTPS, Icecast, the local filesystem, OpenSubsonic, and S3-compatible storage."
5858+ "desc": "The default setup for audio input sources. Adds support for: HTTPS, Icecast, the local filesystem, OpenSubsonic, and S3-compatible storage."
5259 },
5360 {
5461 "url": "facets/data/output-bundle/index.html",
···5663 "kind": "prelude",
5764 "category": "Data",
5865 "featured": true,
5959- "desc": "The default setup for user-data storage output. Supports these services: AT Protocol and S3-compatible storage. For both of these a custom local-first syncing algorithm is used."
6666+ "desc": "The default setup for user-data storage output. Adds support for: AT Protocol and S3-compatible storage. For both of these a custom local-first syncing algorithm is used."
6067 },
6168 {
6269 "url": "facets/data/process-tracks/index.html",
···109116 "url": "themes/winamp/configurators/input/facet/index.html",
110117 "title": "Winamp / Input",
111118 "category": "Data",
112112- "featured": true,
113119 "desc": "Add your audio sources."
114120 },
115121 {
116122 "url": "themes/winamp/configurators/output/facet/index.html",
117123 "title": "Winamp / Output",
118124 "category": "Data",
119119- "featured": true,
120125 "desc": "Manage your data storage."
121126 }
122127]
+2-2
src/common/facets/constants.js
···11+import * as TID from "@atcute/tid";
12import facets from "../../_data/facets.json" with {
23 type: "json",
34};
···2930 ) {
3031 return [{
3132 ...properties,
3232- id: "defaults/" +
3333- facet.url.replace(/^\facets\/\w+\//, "").replace(/\/index.html/, ""),
3333+ id: TID.now(),
3434 }];
3535 }
3636
···6666 // Track deletions: any id present in local but absent in
6767 // newData has been deleted by the user.
6868 const oldCol = await Output.data(l[name]);
6969- if (Array.isArray(oldCol.data)) {
6969+ if (oldCol && Array.isArray(oldCol.data)) {
7070 const newIds = new Set(newData.map((/** @type {any} */ r) => r.id));
71717272 for (const record of oldCol.data) {