[project] name = "tidal-dl-ng" authors = [{ name = "Robert Honz", email = "" }] version = "0.25.9" description = "TIDAL Medial Downloader Next Generation!" readme = "README.md" classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: GNU Affero General Public License v3", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.12", ] requires-python = ">=3.12,<3.13" dynamic = ["dependencies"] [project.urls] repository = "https://github.com/exislow/tidal-dl-ng" documentation = "https://exislow.github.io/tidal-dl-ng/" [project.scripts] tidal-dl-ng = "tidal_dl_ng.cli:app" tidal-dl-ng-gui = "tidal_dl_ng.gui:gui_activate" tdn = "tidal_dl_ng.cli:app" tdng = "tidal_dl_ng.gui:gui_activate" [tool.poetry] packages = [{ include = "tidal_dl_ng" }] [tool.poetry.dependencies] requests = "~2.32.4" mutagen = "^1.47.0" dataclasses-json = "^0.6.7" pathvalidate = "^3.3.1" m3u8 = "^6.0.0" coloredlogs = "^15.0.1" pyside6 = { version = "6.8.0.1", optional = true } pyqtdarktheme-fork = { version = "^2.3.2", optional = true } mpegdash = "^0.4.0" rich = "^14.0.0" toml = "^0.10.2" typer = "^0.16.0" tidalapi = "^0.8.3" python-ffmpeg = "^2.0.12" pycryptodome = "^3.23.0" [project.optional-dependencies] gui = ["pyside6", "pyqtdarktheme-fork"] [tool.poetry.group.dev] optional = true [tool.poetry.group.dev.dependencies] pytest = "^8.4.1" deptry = "^0.23.0" mypy = "^1.16.1" pre-commit = "^4.2.0" tox = "^4.27.0" pyupgrade = "^3.20.0" bandit = "^1.8.5" darglint = "^1.8.1" isort = { extras = ["colors"], version = "^6.0.1" } mypy-extensions = "^1.1.0" pydocstyle = "^6.3.0" pylint = "^3.3.7" pillow = "^11.2.1" pytest-cov = "^6.2.1" black = "^25.1.0" nuitka = "^2.6.9" [tool.poetry.group.docs] optional = true [tool.poetry.group.docs.dependencies] mkdocs = "^1.6.1" mkdocs-material = "^9.5.44" mkdocstrings = { extras = ["python"], version = "^0.27.0" } griffe = "^1.5.1" [build-system] requires = ["poetry-core>=2.0.0,<3.0.0"] build-backend = "poetry.core.masonry.api" [tool.pytest.ini_options] testpaths = ["tests"] [tool.ruff] target-version = "py312" line-length = 120 fix = true # Overview: https://docs.astral.sh/ruff/rules/ select = [ # flake8-2020 "YTT", # flake8-bandit "S", # flake8-bugbear "B", # flake8-builtins "A", # flake8-comprehensions "C4", # flake8-debugger "T10", # flake8-simplify "SIM", # isort "I", # mccabe "C90", # pycodestyle "E", "W", # pyflakes "F", # pygrep-hooks "PGH", # pyupgrade "UP", # ruff "RUF", # tryceratops "TRY", ] ignore = [ # LineTooLong "E501", # DoNotAssignLambda "E731", # Do not use bare `except` "E722", # PEP 484 prohibits implicit `Optional` # Disabled only temporarely. "RUF013", ] [tool.ruff.per-file-ignores] "tests/*" = ["S101"] "tidal_dl_ng/cli.py" = ["UP007"] [tool.black] # https://github.com/psf/black target-version = ["py312"] line-length = 120 color = true preview = true exclude = ''' /( \.git | \.mypy_cache | \.tox | \.venv | _build | buck-out | build | dist | env | venv | site | docs | tidal_dl_ng/ui/main.py | tidal_dl_ng/ui/dialog_version.py )/ ''' [tool.isort] # https://github.com/timothycrosley/isort/ py_version = 312 line_length = 120 known_typing = [ "typing", "types", "typing_extensions", "mypy", "mypy_extensions", ] sections = [ "FUTURE", "TYPING", "STDLIB", "THIRDPARTY", "FIRSTPARTY", "LOCALFOLDER", ] include_trailing_comma = true profile = "black" multi_line_output = 3 indent = 4 color_output = true known_third_party = [ "Crypto", "PySide6", "coloredlogs", "dataclasses_json", "ffmpeg", "m3u8", "mutagen", "pathvalidate", "requests", "rich", "tidalapi", "toml", "typer", ] [tool.mypy] # https://mypy.readthedocs.io/en/latest/config_file.html#using-a-pyproject-toml-file files = ["tidal_dl_ng"] python_version = "3.12" pretty = true show_traceback = true color_output = true allow_redefinition = false check_untyped_defs = true disallow_any_generics = true disallow_incomplete_defs = true ignore_missing_imports = true implicit_reexport = false no_implicit_optional = true show_column_numbers = true show_error_codes = true show_error_context = true strict_equality = true strict_optional = true warn_no_return = true warn_redundant_casts = true warn_return_any = true warn_unreachable = true warn_unused_configs = true warn_unused_ignores = true disallow_untyped_defs = true disallow_any_unimported = true