From a76abc39ee1916868885a471335cedc3f3448994 Mon Sep 17 00:00:00 2001 From: Max Goodhart Date: Sat, 22 Feb 2025 15:49:01 -0800 Subject: [PATCH] Initial v2 overhaul --- .eslintrc.json | 16 + .github/FUNDING.yml | 1 - .github/dependabot.yml | 18 - .github/workflows/release.yml | 34 + .github/workflows/test.yml | 39 - .gitignore | 9 +- LICENSE | 2 +- README.md | 51 +- __mocks__/fileMock.js | 1 - babel.config.json | 18 - jest.config.js | 21 - package-lock.json | 19894 +++++++--------- package.json | 84 +- packages/streamwall-control-ui/.gitignore | 24 + packages/streamwall-control-ui/package.json | 27 + .../streamwall-control-ui/src/index.tsx | 1228 +- packages/streamwall-control-ui/tsconfig.json | 23 + packages/streamwall-control-ui/vite.config.ts | 7 + packages/streamwall-shared/package.json | 13 + .../streamwall-shared/src/colors.ts | 4 +- .../streamwall-shared/src/geometry.ts | 51 +- packages/streamwall-shared/src/index.ts | 4 + packages/streamwall-shared/src/roles.ts | 43 + packages/streamwall-shared/src/types.ts | 102 + packages/streamwall-shared/tsconfig.json | 31 + packages/streamwall/.gitignore | 92 + packages/streamwall/forge.config.ts | 76 + packages/streamwall/forge.env.d.ts | 1 + packages/streamwall/package.json | 68 + packages/streamwall/src/main/ControlWindow.ts | 68 + packages/streamwall/src/main/StreamWindow.ts | 364 + .../streamwall/src/main/StreamdelayClient.ts | 24 +- .../streamwall/src/main/data.ts | 69 +- .../streamwall/src/main/index.ts | 457 +- packages/streamwall/src/main/loadHTML.ts | 24 + .../streamwall/src/main/viewStateMachine.ts | 330 + .../streamwall/src/preload/controlPreload.ts | 30 + .../streamwall/src/preload/layerPreload.ts | 19 + .../streamwall/src/preload/mediaPreload.ts | 103 +- .../streamwall/src/renderer}/background.html | 4 +- .../streamwall/src/renderer/background.tsx | 55 + packages/streamwall/src/renderer/control.html | 14 + packages/streamwall/src/renderer/control.tsx | 98 + packages/streamwall/src/renderer/index.css | 3 + .../streamwall/src/renderer}/overlay.html | 4 +- .../streamwall/src/renderer/overlay.tsx | 144 +- .../streamwall/src/renderer}/playHLS.html | 4 +- packages/streamwall/src/renderer/playHLS.ts | 19 + .../src/renderer/svg-loaders-react.d.ts | 5 + .../streamwall/src/util.ts | 2 +- packages/streamwall/tsconfig.json | 23 + packages/streamwall/vite.main.config.ts | 8 + packages/streamwall/vite.preload.config.ts | 8 + packages/streamwall/vite.renderer.config.ts | 34 + prettier.config.js | 1 + screenshot.png | Bin 1338724 -> 0 bytes src/browser/background.js | 45 - src/browser/layerPreload.js | 6 - src/browser/playHLS.js | 14 - src/geometry.test.js | 150 - src/index.css | 15 - src/node/StreamWindow.js | 336 - src/node/TwitchBot.js | 165 - src/node/auth.js | 163 - src/node/persistence.js | 31 - src/node/server.js | 285 - src/node/server.test.js | 392 - src/node/viewStateMachine.js | 203 - src/roles.js | 32 - src/roles.test.js | 39 - src/static/NotoSans-Regular.ttf | Bin 455188 -> 0 bytes src/static/NotoSans-SemiBold.ttf | Bin 456228 -> 0 bytes src/static/exchange-alt-solid.svg | 1 - src/static/facebook.svg | 1 - src/static/instagram.svg | 1 - src/static/life-ring-regular.svg | 1 - src/static/periscope.svg | 1 - src/static/redo-alt-solid.svg | 1 - src/static/sync-alt-solid.svg | 1 - src/static/tiktok.svg | 1 - src/static/twitch.svg | 1 - src/static/video-slash-solid.svg | 1 - src/static/volume-up-solid.svg | 1 - src/static/window-maximize-regular.svg | 1 - src/static/youtube.svg | 1 - src/util.test.js | 17 - src/web/colors.test.js | 44 - src/web/control.ejs | 21 - src/web/control.test.js | 50 - src/web/entrypoint.js | 3 - webpack.config.js | 130 - 91 files changed, 11832 insertions(+), 14218 deletions(-) create mode 100644 .eslintrc.json delete mode 100644 .github/FUNDING.yml delete mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/release.yml delete mode 100644 .github/workflows/test.yml delete mode 100644 __mocks__/fileMock.js delete mode 100644 babel.config.json delete mode 100644 jest.config.js create mode 100644 packages/streamwall-control-ui/.gitignore create mode 100644 packages/streamwall-control-ui/package.json rename src/web/control.js => packages/streamwall-control-ui/src/index.tsx (51%) create mode 100644 packages/streamwall-control-ui/tsconfig.json create mode 100644 packages/streamwall-control-ui/vite.config.ts create mode 100644 packages/streamwall-shared/package.json rename src/web/colors.js => packages/streamwall-shared/src/colors.ts (90%) rename src/geometry.js => packages/streamwall-shared/src/geometry.ts (55%) create mode 100644 packages/streamwall-shared/src/index.ts create mode 100644 packages/streamwall-shared/src/roles.ts create mode 100644 packages/streamwall-shared/src/types.ts create mode 100644 packages/streamwall-shared/tsconfig.json create mode 100644 packages/streamwall/.gitignore create mode 100644 packages/streamwall/forge.config.ts create mode 100644 packages/streamwall/forge.env.d.ts create mode 100644 packages/streamwall/package.json create mode 100644 packages/streamwall/src/main/ControlWindow.ts create mode 100644 packages/streamwall/src/main/StreamWindow.ts rename src/node/StreamdelayClient.js => packages/streamwall/src/main/StreamdelayClient.ts (70%) rename src/node/data.js => packages/streamwall/src/main/data.ts (66%) rename src/node/index.js => packages/streamwall/src/main/index.ts (57%) create mode 100644 packages/streamwall/src/main/loadHTML.ts create mode 100644 packages/streamwall/src/main/viewStateMachine.ts create mode 100644 packages/streamwall/src/preload/controlPreload.ts create mode 100644 packages/streamwall/src/preload/layerPreload.ts rename src/browser/mediaPreload.js => packages/streamwall/src/preload/mediaPreload.ts (75%) rename {src/browser => packages/streamwall/src/renderer}/background.html (78%) create mode 100644 packages/streamwall/src/renderer/background.tsx create mode 100644 packages/streamwall/src/renderer/control.html create mode 100644 packages/streamwall/src/renderer/control.tsx create mode 100644 packages/streamwall/src/renderer/index.css rename {src/browser => packages/streamwall/src/renderer}/overlay.html (79%) rename src/browser/overlay.js => packages/streamwall/src/renderer/overlay.tsx (65%) rename {src/browser => packages/streamwall/src/renderer}/playHLS.html (78%) create mode 100644 packages/streamwall/src/renderer/playHLS.ts create mode 100644 packages/streamwall/src/renderer/svg-loaders-react.d.ts rename src/util.js => packages/streamwall/src/util.ts (77%) create mode 100644 packages/streamwall/tsconfig.json create mode 100644 packages/streamwall/vite.main.config.ts create mode 100644 packages/streamwall/vite.preload.config.ts create mode 100644 packages/streamwall/vite.renderer.config.ts delete mode 100644 screenshot.png delete mode 100644 src/browser/background.js delete mode 100644 src/browser/layerPreload.js delete mode 100644 src/browser/playHLS.js delete mode 100644 src/geometry.test.js delete mode 100644 src/index.css delete mode 100644 src/node/StreamWindow.js delete mode 100644 src/node/TwitchBot.js delete mode 100644 src/node/auth.js delete mode 100644 src/node/persistence.js delete mode 100644 src/node/server.js delete mode 100644 src/node/server.test.js delete mode 100644 src/node/viewStateMachine.js delete mode 100644 src/roles.js delete mode 100644 src/roles.test.js delete mode 100644 src/static/NotoSans-Regular.ttf delete mode 100644 src/static/NotoSans-SemiBold.ttf delete mode 100644 src/static/exchange-alt-solid.svg delete mode 100644 src/static/facebook.svg delete mode 100644 src/static/instagram.svg delete mode 100644 src/static/life-ring-regular.svg delete mode 100644 src/static/periscope.svg delete mode 100644 src/static/redo-alt-solid.svg delete mode 100644 src/static/sync-alt-solid.svg delete mode 100644 src/static/tiktok.svg delete mode 100644 src/static/twitch.svg delete mode 100644 src/static/video-slash-solid.svg delete mode 100644 src/static/volume-up-solid.svg delete mode 100644 src/static/window-maximize-regular.svg delete mode 100644 src/static/youtube.svg delete mode 100644 src/util.test.js delete mode 100644 src/web/colors.test.js delete mode 100644 src/web/control.ejs delete mode 100644 src/web/control.test.js delete mode 100644 src/web/entrypoint.js delete mode 100644 webpack.config.js diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..2d7aa60 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,16 @@ +{ + "env": { + "browser": true, + "es6": true, + "node": true + }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + "plugin:import/recommended", + "plugin:import/electron", + "plugin:import/typescript" + ], + "parser": "@typescript-eslint/parser" +} diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index d244fb5..0000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1 +0,0 @@ -ko_fi: streamwall diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 0d0fa55..0000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,18 +0,0 @@ -# To get started with Dependabot version updates, you'll need to specify which -# package ecosystems to update and where the package manifests are located. -# Please see the documentation for all configuration options: -# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file - -version: 2 -updates: - - package-ecosystem: "github-actions" - directory: "/" - schedule: - interval: "weekly" - open-pull-requests-limit: 25 - - - package-ecosystem: "npm" - directory: "/" - schedule: - interval: "weekly" - open-pull-requests-limit: 25 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..4d2afe2 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,34 @@ +permissions: + contents: write + +on: + workflow_dispatch: + +jobs: + build: + strategy: + matrix: + os: + [ + { name: 'linux', image: 'ubuntu-latest' }, + { name: 'windows', image: 'windows-latest' }, + { name: 'macos', image: 'macos-latest' }, + ] + + runs-on: ${{ matrix.os.image }} + + steps: + - name: Github checkout + uses: actions/checkout@v4 + + - name: Use Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + + - run: npm ci + + - name: Publish app + env: + GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} + run: npm run publish \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index 4500fc3..0000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,39 +0,0 @@ -name: test - -on: - pull_request: - push: - -permissions: - contents: read - actions: read - checks: write - -jobs: - jest-coverage: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 18.x - cache: 'npm' - - - name: Install Dependencies - run: npm install - - - name: Run Tests - run: npm run test:ci - env: - CI: true - - - name: Test Report - uses: dorny/test-reporter@v1 - if: success() || failure() # run this step even if previous step failed - with: - name: Jest Tests # Name of the check run which will be created - path: junit*.xml # Path to test results - reporter: jest-junit # Format of test results diff --git a/.gitignore b/.gitignore index 00eb3f2..b512c09 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1 @@ -# Entire directories -coverage -dist -node_modules -reports - -# Individual files -junit.xml \ No newline at end of file +node_modules \ No newline at end of file diff --git a/LICENSE b/LICENSE index 8a68e43..745a532 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright 2020 Max Goodhart +Copyright 2025 Max Goodhart Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: diff --git a/README.md b/README.md index 9d2c26d..fe053a0 100644 --- a/README.md +++ b/README.md @@ -1,33 +1,22 @@ # Streamwall -:construction: Early WIP release! :construction: +:construction: Streamwall v2.0 is a work-in-progress :construction: + +Goals for the v2 branch: + +- TypeScript +- Use Electron Forge to distribute packaged releases +- Split out control server; refactor for local-only use without a webserver + +--- Streamwall makes it easy to compose multiple livestreams into a mosaic, with source attributions and audio control. -![Screenshot of Streamwall displaying a grid of streams](screenshot.png) ## How it works Under the hood, think of Streamwall as a specialized web browser for mosaicing video streams. It uses [Electron](https://www.electronjs.org) to create a grid of web browser views, loading the specified webpages into them. Once the page loads, Streamwall finds the `