From 1e9375f5e9ca371e7242cf866120dff54caada5a Mon Sep 17 00:00:00 2001 From: Randall Winkhart Date: Sun, 11 Oct 2026 14:19:13 -0400 Subject: [PATCH] Implement library caching --- src/c/jellyPod.c | 6 ++++ src/pkjs/index.js | 71 +++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 75 insertions(+), 2 deletions(-) diff --git a/src/c/jellyPod.c b/src/c/jellyPod.c index 58811c6..3121010 100644 --- a/src/c/jellyPod.c +++ b/src/c/jellyPod.c @@ -191,6 +191,8 @@ static void to_pkjs_move_back() { } } +////////////////////// MENU LAYER CALLBACKS ////////////////////// + static uint16_t menu_get_num_rows(MenuLayer *menu_layer, uint16_t section_index, void *context) { switch (s_current_menu_scope) { case NAV_SCOPE_MAIN: @@ -256,6 +258,8 @@ static void menu_click_config_provider(void *context) { window_single_click_subscribe(BUTTON_ID_BACK, menu_back_click_handler); } +////////////////////// UI ////////////////////// + static void divider_layer_update_proc(Layer *layer, GContext *ctx) { graphics_context_set_fill_color(ctx, GColorBlack); graphics_fill_rect(ctx, layer_get_bounds(layer), 0, GCornerNone); @@ -296,6 +300,8 @@ static void main_window_unload() { menu_layer_destroy(s_menu_layer); } +////////////////////// SETUP ////////////////////// + static void init() { // initialize pkjs app_message_register_inbox_received(inbox_received_handler); diff --git a/src/pkjs/index.js b/src/pkjs/index.js index 3df0cff..6fcd5f1 100644 --- a/src/pkjs/index.js +++ b/src/pkjs/index.js @@ -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"); }