Add on-watch track listing

This commit is contained in:
RandyTheSilly committed 2026-10-11 00:17:11 -04:00
1 parent 5507ef52ea
commit 1f8d19ed3a
3 files changed
+45 -13

No files matched your search

+1 -1
View File
@@ -38,7 +38,7 @@
"messageKeys": [ "messageKeys": [
"PKJS_READY", "PKJS_READY",
"IN_VANITY_LIST[2048]", "IN_VANITY_LIST[2048]",
"IN_ID_LIST[2048]", "IN_SEQ_ID_LIST[255]",
"BIDIR_MENU_NAV_SCOPE", "BIDIR_MENU_NAV_SCOPE",
"OUT_MENU_NAV_SUBSCOPE", "OUT_MENU_NAV_SUBSCOPE",
"OUT_PLAY_SEQ_ID", "OUT_PLAY_SEQ_ID",
+11 -7
View File
@@ -11,7 +11,8 @@ typedef enum {
} NavScope; } NavScope;
// constants // constants
#define MAX_MENU_ITEMS 2048 #define MAX_ARTISTS 2048 // TODO paginate or push as high as possible
#define MAX_TRACKS_PER_ALBUM 255
#define BAR_HEIGHT 20 #define BAR_HEIGHT 20
#ifdef PBL_RECT #ifdef PBL_RECT
#define MARGIN_X 4 #define MARGIN_X 4
@@ -36,8 +37,8 @@ static MenuLayer *s_menu_layer;
// globals // globals
static bool s_pkjs_ready = false; static bool s_pkjs_ready = false;
static NavScope s_current_menu_scope = NAV_SCOPE_MAIN; static NavScope s_current_menu_scope = NAV_SCOPE_MAIN;
static const char *s_current_menu_vanity[MAX_MENU_ITEMS]; static const char *s_current_menu_vanity[MAX_ARTISTS];
// static uint16_t s_current_menu_seq_ids[MAX_MENU_ITEMS]; static uint16_t s_current_menu_seq_ids[MAX_TRACKS_PER_ALBUM];
static uint16_t s_menu_items_count = 0; static uint16_t s_menu_items_count = 0;
// resources // resources
@@ -60,7 +61,11 @@ static void inbox_received_handler(DictionaryIterator *iter, void *context) {
// handle incoming menu list items // handle incoming menu list items
Tuple *t_new_scope = dict_find(iter, MESSAGE_KEY_BIDIR_MENU_NAV_SCOPE); Tuple *t_new_scope = dict_find(iter, MESSAGE_KEY_BIDIR_MENU_NAV_SCOPE);
if (t_new_scope) { if (t_new_scope) {
for (uint16_t i = 0; i < MAX_MENU_ITEMS; i++) { for (uint16_t i = 0; i < MAX_ARTISTS; i++) {
Tuple *t_seq_ids = dict_find(iter, MESSAGE_KEY_IN_SEQ_ID_LIST + i);
if (t_seq_ids) {
s_current_menu_seq_ids[i] = t_seq_ids->value->uint16;
}
Tuple *t_vanity = dict_find(iter, MESSAGE_KEY_IN_VANITY_LIST + i); Tuple *t_vanity = dict_find(iter, MESSAGE_KEY_IN_VANITY_LIST + i);
if (t_vanity) { if (t_vanity) {
s_current_menu_vanity[i] = t_vanity->value->cstring; s_current_menu_vanity[i] = t_vanity->value->cstring;
@@ -133,10 +138,10 @@ static void menu_select_click(struct MenuLayer *menu_layer, MenuIndex *clicked_i
} }
return; return;
case NAV_SCOPE_SEARCH: case NAV_SCOPE_SEARCH:
to_pkjs_scope_change(NAV_SCOPE_ARTISTS, &clicked_index->row);
break;
case NAV_SCOPE_ARTISTS: case NAV_SCOPE_ARTISTS:
case NAV_SCOPE_ALBUMS: case NAV_SCOPE_ALBUMS:
to_pkjs_scope_change(s_current_menu_scope + 1, &clicked_index->row);
break;
case NAV_SCOPE_ALBUM_TRACKS: case NAV_SCOPE_ALBUM_TRACKS:
default: default:
return; return;
@@ -157,7 +162,6 @@ static void main_window_load() {
s_menu_layer = menu_layer_create(s_menu_grect); s_menu_layer = menu_layer_create(s_menu_grect);
menu_layer_set_callbacks(s_menu_layer, NULL, (MenuLayerCallbacks){.get_num_rows = menu_get_num_rows, .draw_row = menu_draw_row, .select_click = menu_select_click, .selection_changed = menu_selection_changed}); menu_layer_set_callbacks(s_menu_layer, NULL, (MenuLayerCallbacks){.get_num_rows = menu_get_num_rows, .draw_row = menu_draw_row, .select_click = menu_select_click, .selection_changed = menu_selection_changed});
menu_layer_pad_bottom_enable(s_menu_layer, false);
menu_layer_set_click_config_onto_window(s_menu_layer, s_main_window); menu_layer_set_click_config_onto_window(s_menu_layer, s_main_window);
#ifdef PBL_ROUND #ifdef PBL_ROUND
menu_layer_set_center_focused(s_menu_layer, false); menu_layer_set_center_focused(s_menu_layer, false);
+33 -5
View File
@@ -13,6 +13,9 @@ var NavScope = Object.freeze({
var cfg = JSON.parse(localStorage.getItem('clay-settings')); var cfg = JSON.parse(localStorage.getItem('clay-settings'));
var lookupMap = new Map(); var lookupMap = new Map();
var jfIdToSeqIdMap = new Map();
var allJfIds = [];
var currentArtist = null;
Pebble.addEventListener("ready", function () { Pebble.addEventListener("ready", function () {
// store cache of library info from Jellyfin // store cache of library info from Jellyfin
@@ -36,7 +39,9 @@ Pebble.addEventListener("ready", function () {
// format response for jellyPod // format response for jellyPod
//// build lookupMap //// build lookupMap
let lastAlbumInfo = {AlbumArtist: "", AlbumName: "", AlbumYear: 0}; let lastAlbumInfo = { AlbumArtist: "", AlbumName: "", AlbumYear: 0 };
let currentSeqId = 0;
allJfIds = [] // ensure blank
for (const track of libObj.Items) { for (const track of libObj.Items) {
if (!track.Name) continue; if (!track.Name) continue;
@@ -65,6 +70,9 @@ Pebble.addEventListener("ready", function () {
TrackName: track.Name, TrackName: track.Name,
JfId: track.Id JfId: track.Id
}); });
jfIdToSeqIdMap.set(track.Id, currentSeqId);
allJfIds.push(track.Id);
currentSeqId++;
// consider the album to have changed if the album name OR artist changed // consider the album to have changed if the album name OR artist changed
if (lastAlbumInfo.AlbumArtist !== albumArtist || lastAlbumInfo.AlbumName !== albumName) { if (lastAlbumInfo.AlbumArtist !== albumArtist || lastAlbumInfo.AlbumName !== albumName) {
@@ -98,15 +106,17 @@ Pebble.addEventListener("appmessage", function (dict) {
//console.log("expected NAV_SCOPE key", keys.BIDIR_MENU_NAV_SCOPE); //console.log("expected NAV_SCOPE key", keys.BIDIR_MENU_NAV_SCOPE);
const scope = payloadGet(dict.payload, "BIDIR_MENU_NAV_SCOPE"); const scope = payloadGet(dict.payload, "BIDIR_MENU_NAV_SCOPE");
const subscope = payloadGet(dict.payload, "OUT_MENU_NAV_SUBSCOPE");
if (scope) { if (scope) {
let vanityList; let vanityList;
let seqIdList = [];
switch (scope) { switch (scope) {
case NavScope.NAV_SCOPE_SEARCH: { // search case NavScope.NAV_SCOPE_SEARCH: {
vanityList = Array.from(lookupMap.keys()); vanityList = Array.from(lookupMap.keys());
break; break;
} }
case NavScope.NAV_SCOPE_ARTISTS: { // artists case NavScope.NAV_SCOPE_ARTISTS: {
const subscope = payloadGet(dict.payload, "OUT_MENU_NAV_SUBSCOPE");
if (subscope) { if (subscope) {
// allow filtering by starting character // allow filtering by starting character
vanityList = Array.from(lookupMap.get(subscope).keys()); vanityList = Array.from(lookupMap.get(subscope).keys());
@@ -115,14 +125,32 @@ Pebble.addEventListener("appmessage", function (dict) {
} }
break; break;
} }
case NavScope.NAV_SCOPE_ALBUMS: {
currentArtist = subscope;
const artistToAlbumsMap = lookupMap.get(Array.from(subscope)[0].toUpperCase());
vanityList = Array.from(artistToAlbumsMap.get(subscope).keys());
break;
}
case NavScope.NAV_SCOPE_ALBUM_TRACKS: {
const albumToTracksMap = lookupMap.get(Array.from(currentArtist)[0].toUpperCase()).get(currentArtist);
vanityList = albumToTracksMap.get(subscope).map((track) => track.TrackName);
const jfIdList = albumToTracksMap.get(subscope).map((track) => track.JfId);
for (const jfId of jfIdList) {
seqIdList.push(jfIdToSeqIdMap.get(jfId));
}
break;
}
default: default:
return; return;
} }
const outDict = {}; const outDict = {};
for (let i = 0; i < vanityList.length; i++) { for (let i = 0; i < vanityList.length; i++) {
outDict[keys.IN_VANITY_LIST + i] = vanityList[i]; outDict[keys.IN_VANITY_LIST + i] = vanityList[i];
outDict[keys.BIDIR_MENU_NAV_SCOPE] = scope; if (scope === NavScope.NAV_SCOPE_ALBUM_TRACKS) {
outDict[keys.IN_SEQ_ID_LIST + i] = seqIdList[i];
}
} }
outDict[keys.BIDIR_MENU_NAV_SCOPE] = scope;
Pebble.sendAppMessage(outDict); Pebble.sendAppMessage(outDict);
} }
}); });