[build-system] requires = [ "setuptools >=65.6", "wheel", # The versioningit build-requirement gets removed from the source distribution, # as the version string is already built into it (see the onbuild versioningit hook): "versioningit >=2.0.0,<4", # disabled in sdist ] # setuptools build-backend override # https://setuptools.pypa.io/en/stable/build_meta.html backend-path = ["build_backend"] build-backend = "__init__" # https://peps.python.org/pep-0621/ # https://packaging.python.org/en/latest/specifications/declaring-project-metadata/ [project] name = "streamlink" description = """\ Streamlink is a command-line utility that extracts streams from various services and pipes them into a video player of choice.\ """ readme = "README.md" license = { text = "Simplified BSD" } authors = [ { name = "Streamlink" }, { email = "streamlink@protonmail.com" } ] classifiers = [ "Development Status :: 5 - Production/Stable", "License :: OSI Approved :: BSD License", "Environment :: Console", "Intended Audience :: End Users/Desktop", "Operating System :: POSIX", "Operating System :: MacOS", "Operating System :: Microsoft :: Windows", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Topic :: Internet :: WWW/HTTP", "Topic :: Multimedia :: Sound/Audio", "Topic :: Multimedia :: Video", "Topic :: Utilities", ] dynamic = [ "version", "entry-points", "scripts", "gui-scripts", ] requires-python = ">=3.8" dependencies = [ "certifi", "exceptiongroup", "isodate", "lxml >=4.6.4,<6", "pycountry", "pycryptodome >=3.4.3,<4", "PySocks >=1.5.6,!=1.5.7", "requests >=2.26.0,<3", "trio >=0.22.0,<1", "trio-websocket >=0.9.0,<1", "typing-extensions >=4.0.0", "urllib3 >=1.26.0,<3", "websocket-client >=1.2.1,<2", ] [project.urls] Homepage = "https://github.com/streamlink/streamlink" Documentation = "https://streamlink.github.io/" Tracker = "https://github.com/streamlink/streamlink/issues" Source = "https://github.com/streamlink/streamlink" Funding = "https://streamlink.github.io/latest/donate.html" # https://setuptools.pypa.io/en/stable/userguide/pyproject_config.html # https://setuptools.pypa.io/en/stable/userguide/package_discovery.html # https://setuptools.pypa.io/en/stable/userguide/datafiles.html [tool.setuptools] license-files = ["LICENSE"] [tool.setuptools.packages.find] where = ["src"] namespaces = false [tool.setuptools.package-data] streamlink = [ "py.typed", ] "streamlink.plugins" = [ "_plugins.json", ] # https://versioningit.readthedocs.io/en/stable/index.html [tool.versioningit] # Packagers: don't patch the `default-version` string while using the tarball built by GitHub from the tagged git commit! # Instead, use Streamlink's signed source distribution as package source, which has the correct version string built in. # This fallback `default-version` string is only used when not building from the sdist or a git repo with at least one tag. # See the versioningit comment at the very top of this file! default-version = "0.0.0+unknown" [tool.versioningit.vcs] method = "git" [tool.versioningit.format] distance = "{base_version}+{distance}.{vcs}{rev}" dirty = "{base_version}+{distance}.{vcs}{rev}.dirty" distance-dirty = "{base_version}+{distance}.{vcs}{rev}.dirty" [tool.versioningit.next-version] method = "null" [tool.versioningit.onbuild] # When building the sdist or wheel, remove versioningit build-requirement and set the static version string method = { module = "build_backend.onbuild", value = "onbuild" } # https://docs.pytest.org/en/latest/reference/customize.html#configuration # https://docs.pytest.org/en/latest/reference/reference.html#ini-options-ref [tool.pytest.ini_options] testpaths = [ "build_backend", "tests", ] filterwarnings = [ "always", ] # https://coverage.readthedocs.io/en/latest/config.html [tool.coverage.run] branch = true source = [ "build_backend", "src", "tests", ] [tool.coverage.report] omit = [ "build_backend/commands.py", "src/streamlink/packages/*", "src/streamlink/webbrowser/cdp/devtools/*", "src/streamlink_cli/packages/*", "src/streamlink_cli/_parser.py", ] exclude_lines = [ "pragma: no cover", "def __repr__", "raise NotImplementedError", "if __name__ == \"__main__\":", "if (?:typing\\.)?TYPE_CHECKING:", ] # https://docs.astral.sh/ruff/configuration/ [tool.ruff] src = [ "build_backend", "src", "tests", ] target-version = "py38" fix = false line-length = 128 output-format = "full" preview = true extend-exclude = [ "docs/conf.py", "src/streamlink/packages/", "src/streamlink_cli/packages/", ] [tool.ruff.lint] ignore-init-module-imports = true select = [ # pycodestyle "E", "W", # pyflakes "F", # pylint "PLC", "PLE", "PLW", # isort "I", # flake8-builtins "A", # flake8-bugbear "B", # flake8-commas "COM", # flake8-comprehensions "C4", # flake8-datetimez "DTZ", # flake8-implicit-str-concat "ISC", # flake8-no-pep420 "INP", # flake8-pie "PIE", # flake8-print "T20", # flake8-pytest-style "PT", # flake8-quotes "Q", # flake8-tidy-imports "TID", # Ruff-specific rules "RUF", ] ignore = [ "A003", # builtin-attribute-shadowing "C408", # unnecessary-collection-call "ISC003", # explicit-string-concatenation "PLC1901", # compare-to-empty-string "PLC2801", # unnecessary-dunder-call "PLW2901", # redefined-loop-name "RUF021", # parenthesize-chained-operators "RUF022", # unsorted-dunder-all "RUF027", # missing-f-string-syntax ] [tool.ruff.lint.per-file-ignores] "__init__.py" = ["F401"] "docs/**" = ["INP", "RUF012"] "script/**" = ["INP"] "src/streamlink/__init__.py" = ["I"] "src/streamlink/_version.py" = ["I"] "src/streamlink/plugin/api/useragents.py" = ["E501"] "src/streamlink/plugins/*" = ["RUF012"] "src/streamlink/webbrowser/cdp/devtools/*" = ["E303", "E501", "F401"] "src/streamlink_cli/main.py" = ["PLW0603"] "tests/**" = ["RUF012"] [tool.ruff.lint.isort] known-first-party = ["streamlink", "streamlink_cli"] lines-after-imports = 2 combine-as-imports = true [tool.ruff.lint.flake8-tidy-imports] ban-relative-imports = "all" [tool.ruff.lint.flake8-quotes] avoid-escape = false [tool.ruff.lint.flake8-implicit-str-concat] allow-multiline = false # https://mypy.readthedocs.io/en/stable/config_file.html [tool.mypy] python_version = 3.8 show_error_codes = true show_error_context = true show_column_numbers = true warn_no_return = false files = [ "build_backend", "src/streamlink/", "src/streamlink_cli/", "tests/", "setup.py", ]