{ # nix build inputs lib, buildPythonApplication, fetchFromGitHub, python, # deps aiohttp, beautifulsoup4, bencoding, # from overrides flask, flask-socketio, pycryptodome, requests, setuptools, simplejson, tenacity, # from overrides typing-extensions, # from overrides waitress, ... }: let pname = "kapowarr"; version = "1.1.1"; in buildPythonApplication { inherit pname version; src = fetchFromGitHub { owner = "Casvt"; repo = "Kapowarr"; rev = "V${version}"; hash = "sha256-EeDzgi37f0cA86lQ1Z6hzLgpE3ORfz0YPoMWp5R4uPs="; }; patches = [./raise-errors.patch]; postPatch = '' # Insert import for following substituteInPlace sed -i '/# -\*- coding: utf-8 -\*-/a from os import environ' ./backend/base/logging.py substituteInPlace ./backend/base/logging.py --replace-fail \ "return folder_path(Constants.LOGGER_FILENAME)" \ "return f\"{environ.get('KAPOWARR_LOG_DIR')}/{Constants.LOGGER_FILENAME}\"" substituteInPlace ./backend/internals/settings.py \ --replace-fail \ "from os import urandom" \ "from os import urandom, environ" \ --replace-fail \ "port: int = 5656" \ "port: int = int(environ.get('KAPOWARR_PORT'))" \ --replace-fail \ "download_folder: str = folder_path('temp_downloads')" \ "download_folder: str = environ.get('KAPOWARR_DOWNLOAD_DIR')" \ --replace-fail \ "filename = folder_path('frontend', 'static', 'json', 'pwa_manifest.json')" \ "filename = f\"{environ.get('KAPOWARR_STATE_DIR')}/pwa_manifest.json\"" ''; build-system = [setuptools]; dependencies = [ typing-extensions requests beautifulsoup4 flask waitress pycryptodome tenacity bencoding simplejson aiohttp flask-socketio ]; preBuild = '' cat > setup.py << EOF from setuptools import setup, find_packages, find_namespace_packages with open('requirements.txt') as f: install_requires = f.read().splitlines() setup( name='${pname}', version = '${version}', install_requires=install_requires, packages=[ 'frontend', 'backend', 'backend.base', 'backend.features', 'backend.implementations', 'backend.implementations.torrent_clients', 'backend.internals', 'backend.lib', ], scripts=[ 'Kapowarr.py' ], ) EOF ''; # Use XDG-ish dirs for configuration. These would otherwise be in the kapowarr package. # # Using --run as `makeWrapper` evaluates variables for --set and --set-default at build # time and then single quotes the vars in the wrapper, thus they wouldn't get expanded. # But using --run allows setting default vars that are evaluated on run and not during # build time. makeWrapperArgs = [ "--set-default KAPOWARR_PORT 5656" '' --run "OUTDIR=\"$out\"" --run ' configDir="''${XDG_CONFIG_HOME:-$HOME/.config}/kapowarr" export KAPOWARR_STATE_DIR="''${KAPOWARR_STATE_DIR-$configDir}" export KAPOWARR_LOG_DIR="''${KAPOWARR_LOG_DIR-$configDir}" export KAPOWARR_DOWNLOAD_DIR="''${KAPOWARR_DOWNLOAD_DIR-$configDir/temp_downloads}" mkdir -p "$KAPOWARR_STATE_DIR" "$KAPOWARR_LOG_DIR" if [ ! -f "$KAPOWARR_STATE_DIR/pwa_manifest.json" ]; then cat "$OUTDIR/${python.sitePackages}/frontend/static/json/pwa_manifest.json" > "$KAPOWARR_STATE_DIR/pwa_manifest.json" fi ' '' ]; postFixup = '' # I prefer a clean name for the executable mv $out/bin/Kapowarr.py $out/bin/${pname} # Add missing resources that Kapowarr uses at runtime in sitePackages cp -r ./frontend/{static,templates} "$out/${python.sitePackages}/frontend" ''; meta = { mainProgram = pname; license = lib.licenses.gpl3Only; homepage = "https://casvt.github.io/Kapowarr"; description = '' Kapowarr is a software to build and manage a comic book library, fitting in the *arr suite of software ''; }; }