[project]
name = "ytptube"
version = "1.0.0"
description = "A WebUI for yt-dlp with concurrent downloads support, presets and scheduled tasks and many more."
readme = "README.md"
requires-python = ">=3.13"
license = { text = "MIT" }
authors = [{ name = "Abdulmohsen", email = "contact@arabcoders.org" }]
dependencies = [
  # Windows‐only
  "tzdata; sys_platform == 'win32'",
  "python-magic-bin; sys_platform == 'win32'",
  # Non‐Windows
  "python-magic>=0.4.27; sys_platform != 'win32'",
  # Cross‐platform
  "aiohttp>=3.9.3",
  "coloredlogs>=15.0.1",
  "aiocron>=1.8",
  "python-dotenv>=1.0.1",
  "debugpy>=1.8.1",
  "httpx[brotli,http2,socks,zstd]",
  "async-timeout",
  "pyjson5",
  "curl_cffi==0.14",
  "pysubs2",
  "regex",
  "mutagen",
  "brotli",
  "brotlicffi",
  "anyio",
  "yt-dlp[default]",
  "platformdirs",
  "multidict==6.5.1",
  "dateparser>=1.2.1",
  "defusedxml>=0.7.1",
  "zipstream-ng>=1.8.0",
  "apprise>=1.9.3",
  "bgutil-ytdlp-pot-provider>=1.2.1",
  "pycryptodome>=3.23.0",
  "httpx-curl-cffi>=0.1.4",
  "selenium>=4.35.0",
  "parsel>=1.10.0",
  "jmespath>=1.0.1",
  "jsonschema>=4.23.0",
  "aiosqlite>=0.22.0",
  "sqlalchemy>=2.0.45",
  "pydantic>=2.12.5",
  "playwright>=1.58.0",
]

[tool.ruff]
exclude = [
  ".bzr",
  ".direnv",
  ".eggs",
  ".git",
  ".git-rewrite",
  ".hg",
  ".mypy_cache",
  ".nox",
  ".pants.d",
  ".pyenv",
  ".pytest_cache",
  ".pytype",
  ".ruff_cache",
  ".svn",
  ".tox",
  ".venv",
  ".vscode",
  "__pypackages__",
  "_build",
  "buck-out",
  "build",
  "dist",
  "node_modules",
  "site-packages",
  "venv",
]

line-length = 120
indent-width = 4

target-version = "py313"

[project.optional-dependencies]
installer = ["pyinstaller"]

[tool.ruff.lint]
select = ["ALL"]
per-file-ignores = { "test_*.py" = [
  "ALL",
], "migrations/versions/*.py" = [
  "ALL",
] }

ignore = [
  "ANN",
  "COM",
  "C90",
  "DJ",
  "EXE",
  "T10",
  "TID",
  "PTH",

  "D100",
  "D101",
  "D102",
  "D103",
  "D104",
  "D105",
  "D106",
  "D107",
  "D200",
  "D205",
  "D212",
  "D400",
  "D401",
  "D415",
  "E402",
  "E501",
  "TRY003",
  "TD002",
  "TD003",
  "FIX002",
  "N806",
  "PGH003",
  "D404",
  "PLR0913",
  "INP001",
  "G004",
  "SIM105",
  "SIM300",
  "BLE001",
  "TRY400",
  "S104",
  "PLR2004",
  "S110",
  "N812",
  "S108",
  "RUF006",
  "RUF012",
  "RUF013",
  "TRY002",
  "TRY401",
  "A001",
  "A002",
  "SLF001",
  "FBT001",
  "FBT002",
  "TRY300",
  "PLR0911",
  "PLR0912",
  "PLR0915",
  "PLW2901",
  "ERA001",
  "S101",
  "LOG015",
  "PLC0415",
  "S603",
  "D203",
  "TRY004",
  "PT011",
  "RUF001",
  "S311",
  "TC001",
  "ASYNC240",
  # will be fixed in the future
  "UP042",
  "FURB171",
  "FURB110",
  "PLW0108",
]

fixable = ["ALL"]
unfixable = []

dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"

[tool.ruff.format]
quote-style = "double"
indent-style = "space"
skip-magic-trailing-comma = false
line-ending = "auto"
docstring-code-format = false
docstring-code-line-length = "dynamic"

[tool.uv]
link-mode = "copy"

[tool.pytest.ini_options]
pythonpath = ["."]
testpaths = ["app/tests", "app/features"]
addopts = "-v --tb=short"
filterwarnings = [
  "ignore:Parsing dates involving a day of month without a year:DeprecationWarning",
]

[dependency-groups]
dev = [
  "debugpy>=1.8.16",
  "pytest>=8.4.2",
  "pytest-asyncio>=1.1.0",
  "ruff>=0.13.0",
  "pip>=26.0.0",
]
