Send and display last watched on watch

This commit is contained in:
2026-04-22 22:17:28 -04:00
parent 017051ccbe
commit 6ad8ced5bb
3 changed files with 38 additions and 42 deletions

View File

@@ -24,7 +24,8 @@
"CLAY_API_IS_JELLYFIN", "CLAY_API_IS_JELLYFIN",
"CLAY_USER", "CLAY_USER",
"PKJS_READY", "PKJS_READY",
"PKJS_SLEEP_TIMESTAMP" "PKJS_SLEEP_TIMESTAMP",
"PKJS_LAST_WATCHED"
], ],
"projectType": "native", "projectType": "native",
"resources": { "resources": {

View File

@@ -2,15 +2,12 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
// declare pkjs statics
static bool s_js_ready;
// declare window statics // declare window statics
static Window *s_main_window; static Window *s_main_window;
static TextLayer *s_sleep_time_header_layer; static TextLayer *s_sleep_time_header_layer;
static TextLayer *s_sleep_time_layer; static TextLayer *s_sleep_time_layer;
static TextLayer *s_last_episode_header_layer; static TextLayer *s_last_watched_header_layer;
static TextLayer *s_last_episode_layer; static TextLayer *s_last_watched_layer;
static TextLayer *s_pin_notice_layer; static TextLayer *s_pin_notice_layer;
// declare time tracking statics // declare time tracking statics
@@ -20,36 +17,32 @@ static void send_sleep_time_to_pkjs() {
DictionaryIterator *out; DictionaryIterator *out;
AppMessageResult result = app_message_outbox_begin(&out); AppMessageResult result = app_message_outbox_begin(&out);
if (result != APP_MSG_OK) { if (result != APP_MSG_OK) {
text_layer_set_text(s_last_episode_layer, "outbox_begin failure"); text_layer_set_text(s_last_watched_layer, "outbox_begin failure");
return; return;
} }
dict_write_uint32(out, MESSAGE_KEY_PKJS_SLEEP_TIMESTAMP, s_sleep_timestamp); dict_write_uint32(out, MESSAGE_KEY_PKJS_SLEEP_TIMESTAMP, s_sleep_timestamp);
result = app_message_outbox_send(); result = app_message_outbox_send();
if (result != APP_MSG_OK) { if (result != APP_MSG_OK) {
text_layer_set_text(s_last_episode_layer, "outbox_send failure"); text_layer_set_text(s_last_watched_layer, "outbox_send failure");
return; return;
} }
} }
static void inbox_received_handler(DictionaryIterator *iter, void *context) { static void inbox_received_handler_watched(DictionaryIterator *iter, void *context) {
Tuple *watched_tuple = dict_find(iter, MESSAGE_KEY_PKJS_LAST_WATCHED);
if (watched_tuple) {
APP_LOG(APP_LOG_LEVEL_INFO, "Received PKJS_LAST_WATCHED, displaying...");
text_layer_set_text(s_last_watched_layer, watched_tuple->value->cstring);
}
}
static void inbox_received_handler_ready(DictionaryIterator *iter, void *context) {
Tuple *ready_tuple = dict_find(iter, MESSAGE_KEY_PKJS_READY); Tuple *ready_tuple = dict_find(iter, MESSAGE_KEY_PKJS_READY);
if (ready_tuple) { if (ready_tuple) {
s_js_ready = true; APP_LOG(APP_LOG_LEVEL_INFO, "Received PKJS_READY, calling PKJS...");
send_sleep_time_to_pkjs();
app_message_register_inbox_received(inbox_received_handler_watched);
} }
APP_LOG(APP_LOG_LEVEL_INFO, "Received JS_READY, calling PKJS...");
send_sleep_time_to_pkjs();
}
static void inbox_dropped_handler(AppMessageResult reason, void *context) {
APP_LOG(APP_LOG_LEVEL_DEBUG, "Inbox dropped: %d", reason);
}
static void outbox_failed_handler(DictionaryIterator *iter, AppMessageResult reason, void *context) {
APP_LOG(APP_LOG_LEVEL_DEBUG, "Outbox send failed: %d", reason);
}
static void outbox_sent_handler(DictionaryIterator *iter, void *context) {
APP_LOG(APP_LOG_LEVEL_DEBUG, "Outbox send success");
} }
static bool cb_update_sleep_time(HealthActivity activity, time_t start_time, time_t end_time, void *context) { static bool cb_update_sleep_time(HealthActivity activity, time_t start_time, time_t end_time, void *context) {
@@ -79,14 +72,17 @@ static void main_window_load(Window *window) {
} else { } else {
text_layer_set_text(s_sleep_time_layer, "N/A (rough night?)"); text_layer_set_text(s_sleep_time_layer, "N/A (rough night?)");
} }
s_last_episode_header_layer = text_layer_create(GRect(6, 72, PBL_DISPLAY_WIDTH, 30)); s_last_watched_header_layer = text_layer_create(GRect(6, 72, PBL_DISPLAY_WIDTH, 30));
text_layer_set_background_color(s_last_episode_header_layer, GColorClear); text_layer_set_background_color(s_last_watched_header_layer, GColorClear);
text_layer_set_font(s_last_episode_header_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD)); text_layer_set_font(s_last_watched_header_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD));
text_layer_set_text(s_last_episode_header_layer, "Last Episode"); text_layer_set_text(s_last_watched_header_layer, "Last Episode");
s_last_episode_layer = text_layer_create(GRect(10, 96, PBL_DISPLAY_WIDTH, 30)); s_last_watched_layer = text_layer_create(GRect(10, 96, PBL_DISPLAY_WIDTH, PBL_DISPLAY_HEIGHT));
text_layer_set_background_color(s_last_episode_layer, GColorClear); #if PBL_ROUND
text_layer_set_font(s_last_episode_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24)); text_layer_set_text_alignment(s_last_watched_layer, GTextAlignmentCenter);
text_layer_set_text(s_last_episode_layer, "N/A"); // default - will be updated before display #endif
text_layer_set_background_color(s_last_watched_layer, GColorClear);
text_layer_set_font(s_last_watched_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24));
text_layer_set_text(s_last_watched_layer, "N/A"); // default - will be updated before display
s_pin_notice_layer = text_layer_create(GRect(0, PBL_DISPLAY_HEIGHT - 50, PBL_DISPLAY_WIDTH, 50)); s_pin_notice_layer = text_layer_create(GRect(0, PBL_DISPLAY_HEIGHT - 50, PBL_DISPLAY_WIDTH, 50));
text_layer_set_background_color(s_pin_notice_layer, GColorClear); text_layer_set_background_color(s_pin_notice_layer, GColorClear);
text_layer_set_font(s_pin_notice_layer, fonts_get_system_font(FONT_KEY_GOTHIC_14)); text_layer_set_font(s_pin_notice_layer, fonts_get_system_font(FONT_KEY_GOTHIC_14));
@@ -96,16 +92,16 @@ static void main_window_load(Window *window) {
Layer *window_layer = window_get_root_layer(window); Layer *window_layer = window_get_root_layer(window);
layer_add_child(window_layer, text_layer_get_layer(s_sleep_time_header_layer)); layer_add_child(window_layer, text_layer_get_layer(s_sleep_time_header_layer));
layer_add_child(window_layer, text_layer_get_layer(s_sleep_time_layer)); layer_add_child(window_layer, text_layer_get_layer(s_sleep_time_layer));
layer_add_child(window_layer, text_layer_get_layer(s_last_episode_header_layer)); layer_add_child(window_layer, text_layer_get_layer(s_last_watched_header_layer));
layer_add_child(window_layer, text_layer_get_layer(s_last_episode_layer)); layer_add_child(window_layer, text_layer_get_layer(s_last_watched_layer));
layer_add_child(window_layer, text_layer_get_layer(s_pin_notice_layer)); layer_add_child(window_layer, text_layer_get_layer(s_pin_notice_layer));
} }
static void main_window_unload(Window *window) { static void main_window_unload(Window *window) {
text_layer_destroy(s_sleep_time_header_layer); text_layer_destroy(s_sleep_time_header_layer);
text_layer_destroy(s_sleep_time_layer); text_layer_destroy(s_sleep_time_layer);
text_layer_destroy(s_last_episode_header_layer); text_layer_destroy(s_last_watched_header_layer);
text_layer_destroy(s_last_episode_layer); text_layer_destroy(s_last_watched_layer);
text_layer_destroy(s_pin_notice_layer); text_layer_destroy(s_pin_notice_layer);
} }
@@ -117,10 +113,7 @@ static void init() {
(WindowHandlers){.load = main_window_load, .unload = main_window_unload}); (WindowHandlers){.load = main_window_load, .unload = main_window_unload});
// initialize pkjs // initialize pkjs
app_message_register_inbox_received(inbox_received_handler); app_message_register_inbox_received(inbox_received_handler_ready);
app_message_register_inbox_dropped(inbox_dropped_handler);
app_message_register_outbox_failed(outbox_failed_handler);
app_message_register_outbox_sent(outbox_sent_handler);
app_message_open(1024, 1024); app_message_open(1024, 1024);
// get sleep time (UNIX timestamp) // get sleep time (UNIX timestamp)

View File

@@ -33,7 +33,7 @@ function callAPI(fullURL, apiKey, isJellyfin, trackedUser, sleepTimestamp) {
if (resp && ((isJellyfin === true && Array.isArray(resp.Items)) || (isJellyfin === false && Array.isArray(resp.response.data.data)))) { if (resp && ((isJellyfin === true && Array.isArray(resp.Items)) || (isJellyfin === false && Array.isArray(resp.response.data.data)))) {
let delta; let delta;
let bestDelta = Infinity; let bestDelta = Infinity;
let lastWatched = null; let lastWatched = "";
if (isJellyfin === true) { if (isJellyfin === true) {
const re = /^(.+) is playing (.+) on .*$/; const re = /^(.+) is playing (.+) on .*$/;
let arr; let arr;
@@ -64,8 +64,10 @@ function callAPI(fullURL, apiKey, isJellyfin, trackedUser, sleepTimestamp) {
} }
}); });
} }
if (lastWatched != null) { if (lastWatched != "") {
console.log("Last watched: " + lastWatched); console.log("Last watched: " + lastWatched);
var dict = { 'PKJS_LAST_WATCHED': lastWatched }
Pebble.sendAppMessage(dict);
} }
} }
} }