mirror of
https://github.com/netbymatt/ws4kp.git
synced 2026-04-14 23:59:30 -07:00
Compare commits
14 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7bb024eff5 | ||
|
|
f4a1a3a1d8 | ||
|
|
9a5efe9d48 | ||
|
|
58e0611a46 | ||
|
|
9ed496c892 | ||
|
|
31315d1ace | ||
|
|
77838e1a81 | ||
|
|
64d6484bd8 | ||
|
|
20cab8c25e | ||
|
|
b4de17ccd0 | ||
|
|
0fd90feb7a | ||
|
|
8c3b596b69 | ||
|
|
e57b9bcb20 | ||
|
|
e27750e915 |
@@ -179,7 +179,7 @@ I've made several changes to this Weather Star 4000 simulation compared to the o
|
||||
* Radar displays the timestamp of the image.
|
||||
* A new hour-by-hour graph of the temperature, cloud cover and precipitation chances for the next 24 hours.
|
||||
* A new hourly forecast display for the next 24 hours is available, and is shown in the style of the travel cities forecast. (off by default because it duplicates the hourly graph)
|
||||
* The SPC Outlook is shown in the style of the old air quality screen. This shows the probability of severe weather over the next 3 days at your location.
|
||||
* The SPC Outlook is shown in the style of the old air quality screen. This shows the probability of severe weather over the next 3 days at your location. SPC outlook only displays if you're within one of the highlight areas over the next 3 day. You can view the [maps](https://www.weather.gov/crh/outlooks) and pick a location within one of the risk categories to see if the screen is working for you.
|
||||
* The "Local Forecast" and "Extended Forecast" provide several additional days of information compared to the original format in the 90s.
|
||||
* The original music has been replaced. More info in [Music](#music).
|
||||
* Marine forecast (tides) is not available as it is not reliably part of the new API.
|
||||
@@ -321,6 +321,7 @@ Thanks to the WeatherStar+ community for providing these discussions to further
|
||||
* [ws4channels](https://github.com/rice9797/ws4channels) A Dockerized Node.js application to stream WeatherStar 4000 data into Channels DVR using Puppeteer and FFmpeg.
|
||||
* [SSL Certificates](https://github.com/netbymatt/ws4kp/issues/135) Discussion about how to host with an SSL certificate (enables geolocation).
|
||||
* [Changing playlists](https://github.com/netbymatt/ws4kp/issues/138) Possible ways to automatically change the playlist on a schedule.
|
||||
* [Customize Travel Forecast Cities](https://github.com/netbymatt/ws4kp/issues/146#issuecomment-3363940202)
|
||||
|
||||
## Customization
|
||||
|
||||
|
||||
@@ -84,8 +84,8 @@
|
||||
"Latitude": 29.7633,
|
||||
"Longitude": -95.3633,
|
||||
"point": {
|
||||
"x": 65,
|
||||
"y": 97,
|
||||
"x": 63,
|
||||
"y": 95,
|
||||
"wfo": "HGX"
|
||||
}
|
||||
},
|
||||
|
||||
@@ -5,8 +5,8 @@ import rename from 'gulp-rename';
|
||||
const clean = () => deleteAsync(['./server/scripts/vendor/auto/**']);
|
||||
|
||||
const vendorFiles = [
|
||||
'./node_modules/luxon/build/es6/luxon.js',
|
||||
'./node_modules/luxon/build/es6/luxon.js.map',
|
||||
'./node_modules/luxon/build/es6/luxon.mjs',
|
||||
'./node_modules/luxon/build/es6/luxon.mjs.map',
|
||||
'./node_modules/nosleep.js/dist/NoSleep.js',
|
||||
'./node_modules/suncalc/suncalc.js',
|
||||
'./node_modules/swiped-events/src/swiped-events.js',
|
||||
@@ -23,7 +23,6 @@ const copy = () => src(vendorFiles)
|
||||
path.dirname = path.dirname.toLowerCase();
|
||||
path.basename = path.basename.toLowerCase();
|
||||
path.extname = path.extname.toLowerCase();
|
||||
if (path.basename === 'luxon') path.extname = '.mjs';
|
||||
}))
|
||||
.pipe(dest('./server/scripts/vendor/auto'));
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ import {
|
||||
import playlist from './src/playlist.mjs';
|
||||
import OVERRIDES from './src/overrides.mjs';
|
||||
import cache from './proxy/cache.mjs';
|
||||
import devTools from './src/com.chrome.devtools.mjs';
|
||||
|
||||
const travelCities = JSON.parse(await readFile('./datagenerators/output/travelcities.json'));
|
||||
const regionalCities = JSON.parse(await readFile('./datagenerators/output/regionalcities.json'));
|
||||
@@ -168,6 +169,7 @@ if (process.env?.DIST === '1') {
|
||||
app.use('/geoip', geoip);
|
||||
app.use('/resources', express.static('./server/scripts/modules'));
|
||||
app.get('/', index);
|
||||
app.get('/.well-known/appspecific/com.chrome.devtools.json', devTools);
|
||||
app.get('*name', express.static('./server', staticOptions));
|
||||
}
|
||||
|
||||
|
||||
4150
package-lock.json
generated
4150
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
10
package.json
10
package.json
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "ws4kp",
|
||||
"version": "6.2.0",
|
||||
"version": "6.2.3",
|
||||
"description": "Welcome to the WeatherStar 4000+ project page!",
|
||||
"main": "index.mjs",
|
||||
"type": "module",
|
||||
@@ -8,6 +8,7 @@
|
||||
"start": "node index.mjs",
|
||||
"stop": "pkill -f 'node index.mjs' || echo 'No process found'",
|
||||
"test": "echo \"Error: no test specified\" && exit 1",
|
||||
"build:travelcities": "node datagenerators/travelcities.mjs",
|
||||
"build:css": "sass --style=compressed ./server/styles/scss/main.scss ./server/styles/main.css",
|
||||
"build": "gulp buildDist",
|
||||
"lint": "eslint ./server/scripts/**/*.mjs ./proxy/**/*.mjs ./src/**/*.mjs *.mjs",
|
||||
@@ -50,13 +51,12 @@
|
||||
"swiped-events": "^1.1.4",
|
||||
"terser-webpack-plugin": "^5.3.6",
|
||||
"webpack": "^5.99.9",
|
||||
"webpack-stream": "^7.0.0"
|
||||
"webpack-stream": "^7.0.0",
|
||||
"metar-taf-parser": "^9.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"dotenv": "^17.0.1",
|
||||
"ejs": "^3.1.5",
|
||||
"express": "^5.1.0",
|
||||
"metar-taf-parser": "^9.0.0",
|
||||
"npm": "^11.6.0"
|
||||
"express": "^5.1.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,9 +12,14 @@ const secondsToTicks = (seconds) => Math.ceil((seconds * 1000) / TICK_INTERVAL_M
|
||||
const DEFAULT_UPDATE = secondsToTicks(4.0); // 4 second default for each current conditions
|
||||
|
||||
// items on page
|
||||
const mainScroll = document.querySelector('#container>.scroll');
|
||||
const fixedScroll = document.querySelector('#container>.scroll .fixed');
|
||||
const header = document.querySelector('#container>.scroll .scroll-header');
|
||||
let mainScroll;
|
||||
let fixedScroll;
|
||||
let header;
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
mainScroll = document.querySelector('#container>.scroll');
|
||||
fixedScroll = document.querySelector('#container>.scroll .fixed');
|
||||
header = document.querySelector('#container>.scroll .scroll-header');
|
||||
});
|
||||
|
||||
// local variables
|
||||
let interval;
|
||||
@@ -293,4 +298,5 @@ export {
|
||||
hide,
|
||||
screenCount,
|
||||
atDefault,
|
||||
hazards,
|
||||
};
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import Setting from './utils/setting.mjs';
|
||||
import { reset as resetScroll, addScreen as addScroll } from './currentweatherscroll.mjs';
|
||||
import { reset as resetScroll, addScreen as addScroll, hazards } from './currentweatherscroll.mjs';
|
||||
import { json } from './utils/fetch.mjs';
|
||||
|
||||
let firstRun = true;
|
||||
@@ -42,8 +42,9 @@ const parseFeed = (textInput) => {
|
||||
return;
|
||||
}
|
||||
|
||||
// add single text scroll
|
||||
// add single text scroll after hazards if present
|
||||
resetScroll();
|
||||
addScroll(hazards);
|
||||
addScroll(
|
||||
() => (
|
||||
{
|
||||
@@ -81,6 +82,8 @@ const getFeed = async (url) => {
|
||||
|
||||
// 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(
|
||||
|
||||
@@ -57,6 +57,7 @@ class SpcOutlook extends WeatherDisplay {
|
||||
}
|
||||
|
||||
async getData(weatherParameters, refresh) {
|
||||
if (weatherParameters) this.weatherParameters = weatherParameters;
|
||||
if (!super.getData(weatherParameters, refresh)) return;
|
||||
|
||||
// SPC outlook data does not need to be reloaded on a location change, only during silent refresh
|
||||
@@ -93,7 +94,7 @@ class SpcOutlook extends WeatherDisplay {
|
||||
}
|
||||
}
|
||||
// parse the data
|
||||
this.data = testAllPoints([weatherParameters.longitude, weatherParameters.latitude], this.rawOutlookData);
|
||||
this.data = testAllPoints([this.weatherParameters.longitude, this.weatherParameters.latitude], this.rawOutlookData);
|
||||
|
||||
// check if there's a "risk" for any of the three days, otherwise skip the SPC Outlook screen
|
||||
if (this.data.reduce((prev, cur) => prev || !!cur, false)) {
|
||||
|
||||
1
server/scripts/vendor/auto/luxon.js.map
vendored
1
server/scripts/vendor/auto/luxon.js.map
vendored
File diff suppressed because one or more lines are too long
4
server/scripts/vendor/auto/luxon.mjs
vendored
4
server/scripts/vendor/auto/luxon.mjs
vendored
@@ -8127,7 +8127,7 @@ function friendlyDateTime(dateTimeish) {
|
||||
}
|
||||
}
|
||||
|
||||
const VERSION = "3.7.1";
|
||||
const VERSION = "3.7.2";
|
||||
|
||||
export { DateTime, Duration, FixedOffsetZone, IANAZone, Info, Interval, InvalidZone, Settings, SystemZone, VERSION, Zone };
|
||||
//# sourceMappingURL=luxon.js.map
|
||||
//# sourceMappingURL=luxon.mjs.map
|
||||
|
||||
1
server/scripts/vendor/auto/luxon.mjs.map
vendored
Normal file
1
server/scripts/vendor/auto/luxon.mjs.map
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
25
src/com.chrome.devtools.mjs
Normal file
25
src/com.chrome.devtools.mjs
Normal file
@@ -0,0 +1,25 @@
|
||||
import path from 'path';
|
||||
|
||||
// get values for devtools json
|
||||
const uuid = 'd2bd1130-560f-4c8e-b2c5-e91073784964';
|
||||
const root = path.resolve('server');
|
||||
|
||||
const DEVTOOLS_CONFIG = {
|
||||
workspace: {
|
||||
uuid,
|
||||
root,
|
||||
},
|
||||
};
|
||||
|
||||
const devTools = (req, res) => {
|
||||
// test for localhost
|
||||
if (['127.0.0.1', '::1', '::ffff:127.0.0.1'].includes(req.ip)) {
|
||||
console.log(DEVTOOLS_CONFIG);
|
||||
res.json(DEVTOOLS_CONFIG);
|
||||
} else {
|
||||
// not localhost
|
||||
res.status(404).send('File not found');
|
||||
}
|
||||
};
|
||||
|
||||
export default devTools;
|
||||
@@ -188,14 +188,22 @@
|
||||
|
||||
<div class='heading'>Headend Information</div>
|
||||
<div id="divInfo">
|
||||
Location: <span id="spanCity"></span> <span id="spanState"></span><br />
|
||||
Station Id: <span id="spanStationId"></span><br />
|
||||
Radar Id: <span id="spanRadarId"></span><br />
|
||||
Zone Id: <span id="spanZoneId"></span><br />
|
||||
Office Id: <span id="spanOfficeId"></span><br />
|
||||
Grid X,Y: <span id="spanGridPoint"></span><br />
|
||||
Music: <span id="musicTrack">Not playing</span><br />
|
||||
Ws4kp Version: <span><%- version %></span>
|
||||
<div class="header">Location:</div>
|
||||
<div class="header"><span id="spanCity"></span> <span id="spanState"></span></div>
|
||||
<div class="header">Station Id:</div>
|
||||
<div class="header"><span id="spanStationId"></span></div>
|
||||
<div class="header">Radar Id:</div>
|
||||
<div class="header"><span id="spanRadarId"></span></div>
|
||||
<div class="header">Zone Id:</div>
|
||||
<div class="header"><span id="spanZoneId"></span></div>
|
||||
<div class="header">Office Id:</div>
|
||||
<div class="header"><span id="spanOfficeId"></span></div>
|
||||
<div class="header">Grid X,Y:</div>
|
||||
<div class="header"><span id="spanGridPoint"></span></div>
|
||||
<div class="header">Music:</div>
|
||||
<div class="header"><span id="musicTrack">Not playing</span></div>
|
||||
<div class="header">Ws4kp Version:</div>
|
||||
<div class="header"><span><%- version %></span></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user