From ab1d1669a6a22f79cc12ce3b36c069d6d94d540c Mon Sep 17 00:00:00 2001 From: Quentin Roussel Date: Sun, 18 Aug 2024 00:57:29 +0800 Subject: [PATCH] added possibility to download latest images --- Dockerfile | 20 +++++++++++++++++ Makefile | 12 +++++++++++ generate.mjs | 55 +++++++++++++++++++++++++++++++++++++++++++++++ images/.gitignore | 1 + index.mjs | 6 ++++++ package.json | 12 +++++++++++ 6 files changed, 106 insertions(+) create mode 100644 Dockerfile create mode 100644 Makefile create mode 100644 generate.mjs create mode 100644 images/.gitignore create mode 100644 index.mjs create mode 100644 package.json diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..8547af4 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,20 @@ +FROM node:18 + +# Set TZ to Singapore to help with syncronizing with singapore's website time +ENV TZ="Asia/Singapore" + +RUN apt-get update && apt-get install -y ffmpeg && apt-get clean + +RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app + +WORKDIR /home/node/app + +COPY package*.json ./ + +USER node + +RUN npm install + +COPY --chown=node:node . . + +CMD [ "npm", "start" ] \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..cad9d1c --- /dev/null +++ b/Makefile @@ -0,0 +1,12 @@ +APP_NAME = "sg_rainradar_video" + +build: + docker build . -t $(APP_NAME) + +debug:build + docker run \ + -it \ + --mount type=bind,source=$(PWD)/images,target=/home/node/app/images \ + $(APP_NAME) + +.PHONY: build debug run \ No newline at end of file diff --git a/generate.mjs b/generate.mjs new file mode 100644 index 0000000..5e73492 --- /dev/null +++ b/generate.mjs @@ -0,0 +1,55 @@ +import fs from 'fs'; +import client from 'https'; + +function getTimeString(count) { + let date = new Date(Date.now() - count * 60000 * 5); + return ( + date.getFullYear().toString() + + (date.getMonth() + 1).toString().padStart(2, "0") + + date.getDate().toString().padStart(2, "0") + + date.getHours().toString().padStart(2, "0") + + (date.getMinutes() - date.getMinutes() % 5).toString().padStart(2, "0") + ); +} + +function downloadImage(time_string, filepath) { + return new Promise((resolve, reject) => { + let options = { + hostname: 'www.nea.gov.sg', + port: 443, + path: `/docs/default-source/rain-area/dpsri_70km_${time_string}0000dBR.dpsri.png`, + headers: { + 'Host': 'www.nea.gov.sg', + 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:129.0) Gecko/20100101 Firefox/129.0', + 'Accept': 'image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5', + 'Accept-Language': 'en-US,en;q=0.5', + } + } + client.get(options, (res) => { + console.log(`Downloading ${time_string}`); + if (res.statusCode === 200) { + res.pipe(fs.createWriteStream(filepath)) + .on('error', reject) + .once('close', () => resolve(filepath)); + } else { + // Consume response data to free up memory + res.resume(); + reject(new Error(`Request Failed With a Status Code: ${res.statusCode}`)); + + } + }); + }); +} + +export async function initImages(count) { + for (let i = count; i >= 0; i--) { + let time_string = getTimeString(i); + let filename = `images/${time_string}.png`; + try { + await downloadImage(time_string, filename) + } catch (error) { + //Response 302, we've reached the latest available image + return; + } + } +} \ No newline at end of file diff --git a/images/.gitignore b/images/.gitignore new file mode 100644 index 0000000..aab52d9 --- /dev/null +++ b/images/.gitignore @@ -0,0 +1 @@ +*.png \ No newline at end of file diff --git a/index.mjs b/index.mjs new file mode 100644 index 0000000..c7cceff --- /dev/null +++ b/index.mjs @@ -0,0 +1,6 @@ +import { initImages } from './generate.mjs'; + +initImages(10).then(() => { + console.log('Downloaded images successfully'); +}); + diff --git a/package.json b/package.json new file mode 100644 index 0000000..b5f2e16 --- /dev/null +++ b/package.json @@ -0,0 +1,12 @@ +{ + "name": "sg_rain_video", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node index.mjs" + }, + "author": "", + "license": "ISC" +}