rss feeds scroll, needs additional testing #57

This commit is contained in:
Matt Walsh
2025-06-28 00:59:40 -05:00
parent 945c12e6c6
commit fda44e95fc
2 changed files with 30 additions and 5 deletions

View File

@@ -15,6 +15,7 @@ let screenIndex = 0;
let sinceLastUpdate = 0; let sinceLastUpdate = 0;
let nextUpdate = DEFAULT_UPDATE; let nextUpdate = DEFAULT_UPDATE;
let resetFlag; let resetFlag;
let defaultScreensLoaded = true;
// start drawing conditions // start drawing conditions
// reset starts from the first item in the text scroll list // reset starts from the first item in the text scroll list
@@ -192,10 +193,12 @@ const setHeader = (text) => {
const reset = () => { const reset = () => {
workingScreens = [...baseScreens]; workingScreens = [...baseScreens];
additionalScreens = []; additionalScreens = [];
defaultScreensLoaded = true;
}; };
// add screen, keepBase keeps the regular weather crawl // add screen, keepBase keeps the regular weather crawl
const addScreen = (screen, keepBase = true) => { const addScreen = (screen, keepBase = true) => {
defaultScreensLoaded = false;
additionalScreens.push(screen); additionalScreens.push(screen);
workingScreens = [...(keepBase ? baseScreens : []), ...additionalScreens]; workingScreens = [...(keepBase ? baseScreens : []), ...additionalScreens];
}; };
@@ -240,6 +243,9 @@ const parseMessage = (event) => {
} }
}; };
const screenCount = () => workingScreens.length;
const atDefault = () => defaultScreensLoaded;
// add event listener for start message // add event listener for start message
window.addEventListener('message', parseMessage); window.addEventListener('message', parseMessage);
@@ -247,10 +253,14 @@ window.CurrentWeatherScroll = {
addScreen, addScreen,
reset, reset,
start, start,
screenCount,
atDefault,
}; };
export { export {
addScreen, addScreen,
reset, reset,
start, start,
screenCount,
atDefault,
}; };

View File

@@ -1,5 +1,5 @@
import Setting from './utils/setting.mjs'; import Setting from './utils/setting.mjs';
import { reset as resetScroll } from './currentweatherscroll.mjs'; import { reset as resetScroll, addScreen as addScroll } from './currentweatherscroll.mjs';
import { json } from './utils/fetch.mjs'; import { json } from './utils/fetch.mjs';
let firstRun = true; let firstRun = true;
@@ -40,19 +40,34 @@ const getFeed = async (url) => {
// this returns a data url // this returns a data url
// a few sanity checks // a few sanity checks
if (rssResponse.status.content_type.indexOf('application/rss+xml') < 0) return; if (rssResponse.status.content_type.indexOf('xml') < 0) return;
if (rssResponse.contents.indexOf('base64') > 100) return; if (rssResponse.contents.indexOf('base64') > 100) return;
// base 64 decode everything after the comma // base 64 decode everything after the comma
const rss = atob(rssResponse.contents.split(',')[1]); const rss = atob(rssResponse.contents.split('base64,')[1]);
// parse the rss // parse the rss
const doc = parser.parseFromString(rss, 'text/xml'); const doc = parser.parseFromString(rss, 'text/xml');
// get the title // get the title
const title = doc.querySelector('channel title').innerHTML; const rssTitle = doc.querySelector('channel title').textContent;
// get each item // get each item
const titles = [...doc.querySelectorAll('item title')].map((t) => t.innerHTML); const titles = [...doc.querySelectorAll('item title')].map((t) => t.textContent);
// reset the scroll, then add the screens
resetScroll();
titles.forEach((title) => {
// data is provided to the screen handler, so we return a function
addScroll(
() => ({
header: rssTitle,
type: 'scroll',
text: title,
}),
// false parameter does not include the default weather scrolls
false,
);
});
}; };
// change the feed source and re-load if necessary // change the feed source and re-load if necessary