Implement library caching
This commit is contained in:
1 parent
6fb0a6dae6
commit
1e9375f5e9
2 files changed
+75
-2
No files matched your search
@@ -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) {
|
static uint16_t menu_get_num_rows(MenuLayer *menu_layer, uint16_t section_index, void *context) {
|
||||||
switch (s_current_menu_scope) {
|
switch (s_current_menu_scope) {
|
||||||
case NAV_SCOPE_MAIN:
|
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);
|
window_single_click_subscribe(BUTTON_ID_BACK, menu_back_click_handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////// UI //////////////////////
|
||||||
|
|
||||||
static void divider_layer_update_proc(Layer *layer, GContext *ctx) {
|
static void divider_layer_update_proc(Layer *layer, GContext *ctx) {
|
||||||
graphics_context_set_fill_color(ctx, GColorBlack);
|
graphics_context_set_fill_color(ctx, GColorBlack);
|
||||||
graphics_fill_rect(ctx, layer_get_bounds(layer), 0, GCornerNone);
|
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);
|
menu_layer_destroy(s_menu_layer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////// SETUP //////////////////////
|
||||||
|
|
||||||
static void init() {
|
static void init() {
|
||||||
// initialize pkjs
|
// initialize pkjs
|
||||||
app_message_register_inbox_received(inbox_received_handler);
|
app_message_register_inbox_received(inbox_received_handler);
|
||||||
|
|||||||
+69
-2
@@ -12,10 +12,69 @@ var NavScope = Object.freeze({
|
|||||||
});
|
});
|
||||||
|
|
||||||
var cfg = JSON.parse(localStorage.getItem('clay-settings'));
|
var cfg = JSON.parse(localStorage.getItem('clay-settings'));
|
||||||
|
var currentArtist = null;
|
||||||
|
|
||||||
|
////////////////////// LIBRARY CACHE //////////////////////
|
||||||
|
|
||||||
|
var LIBRARY_CACHE_KEY = 'library-cache';
|
||||||
var lookupMap = new Map();
|
var lookupMap = new Map();
|
||||||
var jfIdToSeqIdMap = new Map();
|
var jfIdToSeqIdMap = new Map();
|
||||||
var allJfIds = [];
|
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) {
|
function toggleReadyState(ready) {
|
||||||
const readyDict = {};
|
const readyDict = {};
|
||||||
@@ -50,7 +109,9 @@ function syncLibrary() {
|
|||||||
let lastAlbumInfo = { AlbumArtist: "", AlbumName: ""};
|
let lastAlbumInfo = { AlbumArtist: "", AlbumName: ""};
|
||||||
//let lastAlbumInfo = { AlbumArtist: "", AlbumName: "", AlbumYear: 0 }; // TODO FUTURE USE
|
//let lastAlbumInfo = { AlbumArtist: "", AlbumName: "", AlbumYear: 0 }; // TODO FUTURE USE
|
||||||
let currentSeqId = 0;
|
let currentSeqId = 0;
|
||||||
allJfIds = [] // ensure blank
|
allJfIds = [];
|
||||||
|
lookupMap = new Map();
|
||||||
|
jfIdToSeqIdMap = new Map();
|
||||||
for (const track of libObj.Items) {
|
for (const track of libObj.Items) {
|
||||||
if (!track.Name) continue;
|
if (!track.Name) continue;
|
||||||
|
|
||||||
@@ -94,12 +155,15 @@ function syncLibrary() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//console.log(JSON.stringify(lookupMap, (k, v) => v instanceof Map ? Object.fromEntries(v) : v));
|
//console.log(JSON.stringify(lookupMap, (k, v) => v instanceof Map ? Object.fromEntries(v) : v));
|
||||||
|
saveLibraryCache();
|
||||||
toggleReadyState(true);
|
toggleReadyState(true);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////// EVENT HANDLING //////////////////////
|
||||||
|
|
||||||
Pebble.addEventListener('showConfiguration', function () {
|
Pebble.addEventListener('showConfiguration', function () {
|
||||||
Pebble.openURL(clay.generateUrl());
|
Pebble.openURL(clay.generateUrl());
|
||||||
});
|
});
|
||||||
@@ -119,6 +183,7 @@ Pebble.addEventListener('webviewclosed', function(e) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
Pebble.addEventListener("ready", function () {
|
Pebble.addEventListener("ready", function () {
|
||||||
|
loadLibraryCache();
|
||||||
toggleReadyState(true);
|
toggleReadyState(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -183,6 +248,8 @@ Pebble.addEventListener("appmessage", function (dict) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
////////////////////// JELLYFIN API //////////////////////
|
||||||
|
|
||||||
function reportAPIFailure() {
|
function reportAPIFailure() {
|
||||||
console.log("API FAILURE");
|
console.log("API FAILURE");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user