Implement library caching

This commit is contained in:
RandyTheSilly committed 2026-10-11 14:19:13 -04:00
1 parent 6fb0a6dae6
commit 1e9375f5e9
2 files changed
+75 -2

No files matched your search

+69 -2
View File
@@ -12,10 +12,69 @@ var NavScope = Object.freeze({
});
var cfg = JSON.parse(localStorage.getItem('clay-settings'));
var currentArtist = null;
////////////////////// LIBRARY CACHE //////////////////////
var LIBRARY_CACHE_KEY = 'library-cache';
var lookupMap = new Map();
var jfIdToSeqIdMap = new Map();
var allJfIds = [];
var currentArtist = null;
function saveLibraryCache() {
function encodeValue(value) {
if (value instanceof Map) {
const entries = [];
for (const [k, v] of value.entries()) {
entries.push([k, encodeValue(v)]);
}
return { __type: 'Map', entries: entries };
}
if (Array.isArray(value)) {
return value.map(encodeValue);
}
return value;
}
try {
localStorage.setItem(LIBRARY_CACHE_KEY, JSON.stringify({
lookupMap: encodeValue(lookupMap),
jfIdToSeqIdMap: encodeValue(jfIdToSeqIdMap),
allJfIds: allJfIds
}));
} catch (err) {
console.log('failed to save library cache: ' + err);
}
}
function loadLibraryCache() {
function decodeValue(value) {
if (value && typeof value === 'object' && value.__type === 'Map') {
const map = new Map();
for (const [k, v] of value.entries) {
map.set(k, decodeValue(v));
}
return map;
}
if (Array.isArray(value)) {
return value.map(decodeValue);
}
return value;
}
const raw = localStorage.getItem(LIBRARY_CACHE_KEY);
if (!raw) { return; }
try {
const cache = JSON.parse(raw);
lookupMap = decodeValue(cache.lookupMap);
jfIdToSeqIdMap = decodeValue(cache.jfIdToSeqIdMap);
allJfIds = cache.allJfIds || [];
} catch (err) {
console.log('failed to load library cache: ' + err);
}
}
////////////////////// SYNC //////////////////////
function toggleReadyState(ready) {
const readyDict = {};
@@ -50,7 +109,9 @@ function syncLibrary() {
let lastAlbumInfo = { AlbumArtist: "", AlbumName: ""};
//let lastAlbumInfo = { AlbumArtist: "", AlbumName: "", AlbumYear: 0 }; // TODO FUTURE USE
let currentSeqId = 0;
allJfIds = [] // ensure blank
allJfIds = [];
lookupMap = new Map();
jfIdToSeqIdMap = new Map();
for (const track of libObj.Items) {
if (!track.Name) continue;
@@ -94,12 +155,15 @@ function syncLibrary() {
}
//console.log(JSON.stringify(lookupMap, (k, v) => v instanceof Map ? Object.fromEntries(v) : v));
saveLibraryCache();
toggleReadyState(true);
});
});
}
}
////////////////////// EVENT HANDLING //////////////////////
Pebble.addEventListener('showConfiguration', function () {
Pebble.openURL(clay.generateUrl());
});
@@ -119,6 +183,7 @@ Pebble.addEventListener('webviewclosed', function(e) {
});
Pebble.addEventListener("ready", function () {
loadLibraryCache();
toggleReadyState(true);
});
@@ -183,6 +248,8 @@ Pebble.addEventListener("appmessage", function (dict) {
}
});
////////////////////// JELLYFIN API //////////////////////
function reportAPIFailure() {
console.log("API FAILURE");
}