{
  lib,
  fetchPypi,
  nixosTests,
  python3,
}:

python3.pkgs.buildPythonApplication rec {
  version = "0.5.0b3.dev87";
  pname = "pyload-ng";
  pyproject = true;

  src = fetchPypi {
    inherit version;
    # The uploaded tarball uses an underscore in recent releases
    pname = "pyload_ng";
    hash = "sha256-LbixaUfsWeU8WVpZsSLJmFR/hVLhCr1DRsIeFYCcxFA=";
  };

  patches = [
    # Makes it possible to change the default username/password in the module
    ./declarative-default-user.patch
    # Makes it possible to change the configuration through environment variables
    # in the NixOS module (aimed mostly at listen address/port)
    ./declarative-env-config.patch
  ];

  postPatch = ''
    # relax version bounds
    sed -i -E 's/([A-z0-9]*)~=[^;]*(.*)/\1\2/' setup.cfg
  '';

  dependencies = with python3.pkgs; [
    bitmath
    certifi
    cheroot
    cryptography
    dukpy
    filetype
    flask
    flask-babel
    flask-caching
    flask-compress
    flask-session
    flask-themes2
    pycurl
    semver
    setuptools
  ];

  optional-dependencies = {
    plugins = with python3.pkgs; [
      beautifulsoup4 # for some plugins
      colorlog # colorful console logging
      pillow # for some CAPTCHA plugin
      send2trash # send some files to trash instead of deleting them
      slixmpp # XMPP plugin
    ];
  };

  passthru.tests = {
    inherit (nixosTests) pyload;
  };

  meta = {
    description = "Free and open-source download manager with support for 1-click-hosting sites";
    homepage = "https://github.com/pyload/pyload";
    license = lib.licenses.agpl3Plus;
    maintainers = with lib.maintainers; [ ruby0b ];
    mainProgram = "pyload";
  };
}