From 8b7a1f81ad166289f4916638279cf07ea10f35cf Mon Sep 17 00:00:00 2001 From: James Magahern Date: Fri, 1 May 2026 21:51:25 -0700 Subject: [PATCH] initial commit --- .dockerignore | 8 + .gitignore | 4 + Dockerfile | 29 ++ README.md | 57 +++ docker-compose-example.yml | 22 + package-lock.json | 849 +++++++++++++++++++++++++++++++++++++ package.json | 18 + public/app.js | 413 ++++++++++++++++++ public/index.html | 45 ++ public/styles.css | 253 +++++++++++ server/index.js | 538 +++++++++++++++++++++++ 11 files changed, 2236 insertions(+) create mode 100644 .dockerignore create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 docker-compose-example.yml create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/app.js create mode 100644 public/index.html create mode 100644 public/styles.css create mode 100644 server/index.js diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..7478707 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +node_modules +npm-debug.log* +.git +.gitignore +.env +.DS_Store +Dockerfile +public/_smoke.avi diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0c97d47 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +.env +.DS_Store +npm-debug.log* diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..e0cc450 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,29 @@ +FROM node:22-bookworm-slim + +ENV NODE_ENV=production +ENV PORT=3000 +ARG DEBIAN_FRONTEND=noninteractive + +WORKDIR /app + +RUN apt-get update \ + && apt-get install -y --no-install-recommends ca-certificates ffmpeg \ + && rm -rf /var/lib/apt/lists/* + +COPY package*.json ./ +RUN npm ci --omit=dev + +COPY public ./public +COPY server ./server +COPY README.md ./ + +RUN chown -R node:node /app + +USER node + +EXPOSE 3000 + +HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \ + CMD node -e "fetch('http://127.0.0.1:' + (process.env.PORT || 3000) + '/api/health').then(r => process.exit(r.ok ? 0 : 1)).catch(() => process.exit(1))" + +CMD ["npm", "start"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..7fb8553 --- /dev/null +++ b/README.md @@ -0,0 +1,57 @@ +# Frame Stream Player + +A small web app that plays a remote video stream without using browser video decoding. The server uses `ffmpeg` to decode the input URL into: + +- an MP3 audio stream served to a normal `