From 8c83736aba7c3082c9498bb889f386ad20888d92 Mon Sep 17 00:00:00 2001 From: Matt Walsh Date: Mon, 16 Feb 2026 21:30:13 -0600 Subject: [PATCH] remove rss feeds close #184 --- README.md | 3 - gulp/publish-frontend.mjs | 1 - server/scripts/modules/custom-rss-feed.mjs | 135 --------------------- views/index.ejs | 1 - 4 files changed, 140 deletions(-) delete mode 100644 server/scripts/modules/custom-rss-feed.mjs diff --git a/README.md b/README.md index 3c33048..d1171b0 100644 --- a/README.md +++ b/README.md @@ -336,9 +336,6 @@ When using Docker: * **Static deployment**: Mount your `custom.js` file to `/usr/share/nginx/html/scripts/custom.js` * **Server deployment**: Mount your `custom.js` file to `/app/server/scripts/custom.js` -### RSS feeds and custom scroll -If you would like your Weatherstar to have custom scrolling text in the bottom blue bar, or show headlines from an rss feed turn on the setting for `Enable RSS Feed/Text` and then enter a URL or text in the resulting text box. Then press set. - ## Issue reporting and feature requests Please do not report issues with api.weather.gov being down. It's a new service and not considered fully operational yet. I've also observed that the API can go down on a regional basis (based on NWS office locations). This means that you may have problems getting data for, say, Chicago right now, but Dallas and others are working just fine. diff --git a/gulp/publish-frontend.mjs b/gulp/publish-frontend.mjs index e6369a2..ed83fdd 100644 --- a/gulp/publish-frontend.mjs +++ b/gulp/publish-frontend.mjs @@ -86,7 +86,6 @@ const mjsSources = [ 'server/scripts/modules/travelforecast.mjs', 'server/scripts/modules/progress.mjs', 'server/scripts/modules/media.mjs', - 'server/scripts/modules/custom-rss-feed.mjs', 'server/scripts/index.mjs', ]; diff --git a/server/scripts/modules/custom-rss-feed.mjs b/server/scripts/modules/custom-rss-feed.mjs deleted file mode 100644 index ee03b96..0000000 --- a/server/scripts/modules/custom-rss-feed.mjs +++ /dev/null @@ -1,135 +0,0 @@ -import Setting from './utils/setting.mjs'; -import { reset as resetScroll, addScreen as addScroll, hazards } from './currentweatherscroll.mjs'; -import { json } from './utils/fetch.mjs'; - -let firstRun = true; - -const parser = new DOMParser(); - -// change of enable handler -const changeEnable = (newValue) => { - let newDisplay; - if (newValue) { - // add the feed to the scroll - parseFeed(customFeed.value); - // show the string box - newDisplay = 'block'; - } else { - // set scroll back to original - resetScroll(); - // hide the string entry - newDisplay = 'none'; - } - const stringEntry = document.getElementById('settings-customFeed-label'); - if (stringEntry) { - stringEntry.style.display = newDisplay; - } -}; - -// parse the feed/text provided -const parseFeed = (textInput) => { - // skip getting the feed on first run - if (firstRun) return; - - // test validity - if (textInput === undefined || textInput === '') { - resetScroll(); - } - - // test for url - if (textInput.match(/https?:\/\//)) { - getFeed(textInput); - return; - } - - // add single text scroll after hazards if present - resetScroll(); - addScroll(hazards); - addScroll( - () => ( - { - type: 'scroll', - text: textInput, - }), - // keep the existing scroll - true, - ); -}; - -// get the rss feed and then swap out the current weather scroll -const getFeed = async (url) => { - // get the text as a string - // it needs to be proxied, use a free service - const rssResponse = await json(`https://api.allorigins.win/get?url=${url}`); - - // this returns a data url - // a few sanity checks - if (rssResponse.status.content_type.indexOf('xml') < 0) return; - // determine return type - const isBase64 = rssResponse.status.content_type.substring(0, 8) !== 'text/xml'; - - // base 64 decode everything after the comma - const rss = isBase64 ? atob(rssResponse.contents.split('base64,')[1]) : rssResponse.contents; - - // parse the rss - const doc = parser.parseFromString(rss, 'text/xml'); - - // get the title - const rssTitle = doc.querySelector('channel title').textContent; - - // get each item - const titles = [...doc.querySelectorAll('item title')].map((t) => t.textContent); - - // reset the scroll, then add the screens - resetScroll(); - // add the hazards scroll first - addScroll(hazards); - 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 -const changeFeed = (newValue) => { - // first pass through won't have custom feed enable ready - if (firstRun) return; - - if (customFeedEnable.value) { - parseFeed(newValue); - } -}; - -const customFeed = new Setting('customFeed', { - name: 'Custom RSS Feed', - defaultValue: '', - type: 'string', - changeAction: changeFeed, - placeholder: 'Text or URL', -}); - -const customFeedEnable = new Setting('customFeedEnable', { - name: 'Enable RSS Feed/Text', - defaultValue: false, - changeAction: changeEnable, -}); - -// initialize the custom feed inputs on the page -document.addEventListener('DOMContentLoaded', () => { - // add the controls to the page - const settingsSection = document.querySelector('#settings'); - settingsSection.append(customFeedEnable.generate(), customFeed.generate()); - // clear the first run value - firstRun = false; - // call change enable with the current value to show/hide the url box - // and make the call to get the feed if enabled - changeEnable(customFeedEnable.value); -}); diff --git a/views/index.ejs b/views/index.ejs index e926d09..73fb8f1 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -62,7 +62,6 @@ - <% } %>