mirror of
https://github.com/netbymatt/ws4kp.git
synced 2026-04-17 17:19:30 -07:00
rss feeds scroll, needs additional testing #57
This commit is contained in:
@@ -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,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user