Compare commits

...

2 commits

Author SHA1 Message Date
ae487a9a40
feat: package WebStudio/presenter 2024-04-01 01:16:39 +01:00
31c89a6808
feat: initial flake with running server 2024-03-31 23:16:34 +01:00
8 changed files with 290 additions and 1 deletions

1
.envrc Normal file
View file

@ -0,0 +1 @@
use flake

5
.gitignore vendored
View file

@ -26,4 +26,7 @@ music-tmp/
presenter-build presenter-build
node_modules/ node_modules/
.direnv/
result

61
flake.lock Normal file
View file

@ -0,0 +1,61 @@
{
"nodes": {
"flake-utils": {
"inputs": {
"systems": "systems"
},
"locked": {
"lastModified": 1710146030,
"narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1711715736,
"narHash": "sha256-9slQ609YqT9bT/MNX9+5k5jltL9zgpn36DpFB7TkttM=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "807c549feabce7eddbf259dbdcec9e0600a0660d",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs"
}
},
"systems": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
}
},
"root": "root",
"version": 7
}

70
flake.nix Normal file
View file

@ -0,0 +1,70 @@
{
inputs = {
nixpkgs.url = github:NixOS/nixpkgs/nixpkgs-unstable;
flake-utils.url = github:numtide/flake-utils;
};
outputs = { self, nixpkgs, flake-utils }:
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = import nixpkgs {
inherit system;
};
sanic-cors = import ./sanic-cors.nix {
inherit (pkgs) lib;
inherit (pkgs.python311Packages) setuptools packaging sanic buildPythonPackage fetchPypi;
};
webstudio = import ./webstudio.nix {
inherit pkgs;
};
dependencies = ps: with ps; [
setuptools
wheel
sanic
sanic-cors
pygame
syncer
aiohttp
mutagen
sounddevice
setproctitle
pyttsx3
websockets
pyserial
requests
jinja2
pydub
psutil
];
version = self.shortRev or self.dirtyShortRev or "dirty-inputs";
in
{
packages = rec {
default = pkgs.python311Packages.buildPythonApplication {
pname = "bapsicle";
inherit version;
doCheck = false;
propagatedBuildInputs = dependencies pkgs.python311Packages;
src = ./.;
patches = [
./patches/0-setup.py-fixes.patch
(pkgs.substituteAll {
src = ./patches/1-presenter-build-path.patch;
baps_presenter = "${webstudio}";
})
];
};
inherit webstudio;
};
devShells.default = pkgs.mkShell {
nativeBuildInputs = with pkgs; [
(python311.withPackages dependencies)
nodejs_20
yarn
ffmpeg_6-full
];
};
});
}

View file

@ -0,0 +1,53 @@
diff --git a/launch.py b/launch.py
index 712bb6a..6210095 100755
--- a/launch.py
+++ b/launch.py
@@ -54,14 +54,7 @@ def notif(msg: str):
print("NOTIFICATION:{}".format(msg))
-if __name__ == "__main__":
- # On Windows, calling this function is necessary.
- # Causes all kinds of loops if not present.
- # IT HAS TO BE RIGHT HERE, AT THE TOP OF __MAIN__
- # NOT INSIDE AN IF STATEMENT. RIGHT. HERE.
- # If it's not here, multiprocessing just doesn't run in the package.
- # Freeze support refers to being packaged with Pyinstaller.
- multiprocessing.freeze_support()
+def main():
setproctitle("BAPSicle - Launcher")
if len(sys.argv) > 1:
# We got an argument! It's probably Platypus's UI.
@@ -86,3 +79,13 @@ if __name__ == "__main__":
else:
startServer()
sys.exit(0)
+
+if __name__ == "__main__":
+ # On Windows, calling this function is necessary.
+ # Causes all kinds of loops if not present.
+ # IT HAS TO BE RIGHT HERE, AT THE TOP OF __MAIN__
+ # NOT INSIDE AN IF STATEMENT. RIGHT. HERE.
+ # If it's not here, multiprocessing just doesn't run in the package.
+ # Freeze support refers to being packaged with Pyinstaller.
+ multiprocessing.freeze_support()
+ main()
diff --git a/setup.py b/setup.py
index 9af4e1d..3a6db65 100644
--- a/setup.py
+++ b/setup.py
@@ -7,5 +7,13 @@ setup(
description=package.DESCRIPTION,
author=package.AUTHOR,
license=package.LICENSE,
- packages=find_packages(),
+ packages=find_packages() + [
+ '.',
+ 'alerts',
+ ],
+ entry_points={
+ 'console_scripts': [
+ 'bapsicle = launch:main'
+ ],
+ },
)

View file

@ -0,0 +1,18 @@
diff --git a/web_server.py b/web_server.py
index ccc3979..dc36db3 100644
--- a/web_server.py
+++ b/web_server.py
@@ -449,11 +449,11 @@ app.static(
app.static("/static", resolve_local_file_path("ui-static"), name="ui-static")
-dist_directory = resolve_local_file_path("presenter-build")
+dist_directory = "@baps_presenter@";
app.static("/presenter", dist_directory)
app.static(
"/presenter/",
- resolve_local_file_path("presenter-build/index.html"),
+ "@baps_presenter@/index.html",
strict_slashes=True,
name="presenter-index",
)

36
sanic-cors.nix Normal file
View file

@ -0,0 +1,36 @@
{ lib
, buildPythonPackage
, fetchPypi
, setuptools
, packaging
, sanic
}:
buildPythonPackage rec {
pname = "Sanic-Cors";
version = "2.2.0";
pyproject= true;
src = fetchPypi {
inherit pname version;
hash = "sha256-+NdRXaTIuDeHHUIsZjFMS1cEOWp4iUtZxQ4mqnKpWHM=";
};
nativeBuildInputs = [
setuptools
];
propagatedBuildInputs = [
sanic
packaging
];
meta = with lib; {
changelog = "https://github.com/ashleysommer/sanic-cors/releases/tag/${version}";
description = "A Sanic extension for handling Cross Origin Resource Sharing (CORS), making cross-origin AJAX possible.";
homepage = "https://github.com/ashleysommer/sanic-cors";
license = licenses.mit;
maintainers = with maintainers; [];
};
}

47
webstudio.nix Normal file
View file

@ -0,0 +1,47 @@
{ pkgs }:
let
src = pkgs.fetchFromGitHub {
owner = "UniversityRadioYork";
repo = "WebStudio";
rev= "8b7f59cdc6ed80b525b2dff665308d808a526d97";
hash = "sha256-I+N/mskX8/gN065SqPxmOn3nrHKPWPcIZygSGbB6GEE=";
};
yarnOfflineCache = pkgs.fetchYarnDeps {
yarnLock = "${src}/yarn.lock";
hash = "sha256-AmKui+Sqyipy4/9lcg8vGWfp9lM2+/fHHDzEWoG8fqw=";
};
in
pkgs.stdenv.mkDerivation {
pname = "baps-presenter";
name = "baps-presenter";
inherit src;
nativeBuildInputs = with pkgs; [
nodejs
yarn
yarn2nix-moretea.fixup_yarn_lock
];
configurePhase = ''
export HOME=$(mktemp -d)
'';
buildPhase = ''
yarn config --offline set yarn-offline-mirror ${yarnOfflineCache}
fixup_yarn_lock yarn.lock
yarn install --offline \
--frozen-lockfile \
--ignore-engines \
--ignore-scripts
patchShebangs .
yarn run build-baps
'';
installPhase = ''
mkdir -p $out
cp -R build/. $out
'';
doDist = false;
}