[build-system] requires = ["setuptools~=84.1.0"] build-backend = "setuptools.build_meta" [project] name = "moviepilot" dynamic = ["version"] requires-python = ">=3.14" dependencies = [ "aiofiles~=25.1.0", "aioshutil~=1.6", "aiosqlite~=0.22.1", "alembic~=1.18.4", "anitopy~=2.1.1", "anthropic~=0.109.1", "anyio~=4.14.2", "apscheduler~=3.11.2", "asyncpg~=0.31.0", "beautifulsoup4~=4.15.0", "boto3~=1.42.42", "cachetools~=7.1.4", "chardet~=7.6.0", "click~=8.4.1", "cloakbrowser~=0.5.3", "cn2an~=0.5.24", "crcmod-plus==2.3.1", "cryptography~=50.0.0", "dateparser~=1.4.0", "ddgs~=9.14.4", "discord.py==2.7.1", "fast-bencode~=1.1.8", "fastapi~=0.141.1", "google-genai~=2.8.0", "http-ece~=1.2.1", "httpx[http2,socks]~=0.28.1", "httpx2[http2,socks]~=2.12.0", "jinja2~=3.1.6", "langchain~=1.3.15", "langchain-anthropic~=1.4.6", "langchain-aws~=1.6.2", "langchain-community~=0.4.2", "langchain-core~=1.5.4", "langchain-deepseek~=1.1.0", "langchain-google-genai~=4.2.5", "langchain-openai~=1.3.2", "langgraph~=1.2.14", "langgraph-checkpoint~=4.2.0", # 宿主飞书渠道已改用自研 OpenAPI 与长连接客户端,此 SDK 暂时保留给插件使用。 "lark-oapi~=1.6.8", "moviepilot-rust~=0.3.12", "mutagen~=1.47.0", "openai~=2.41.1", "orjson==3.12.0", "oss2~=2.19.1", "packaging~=26.3", "parse~=1.22.1", "pillow~=13.0.0", "pillow-avif-plugin~=1.5.5", "pinyin2hanzi~=0.1.1", "plexapi~=4.18.1", "psutil~=7.2.2", "py-vapid~=1.9.4", "pycryptodome~=3.23.0", "pydantic>=2.13.4,<3.0.0", "pydantic-settings>=2.14.2,<3.0.0", "pyjwt~=2.15.0", "pyotp~=2.9.0", "pyparsing~=3.3.2", "pyquery~=2.0.1", "pystray~=0.19.5", # 宿主 Telegram 渠道已改用自研 Bot API 客户端,此 SDK 暂时保留给插件使用。 "pytelegrambotapi~=4.36.0", "python-dateutil~=2.9.0.post0", "python-dotenv~=1.2.2", "python-multipart~=0.0.32", "pytz~=2026.2", "pyvirtualdisplay~=3.0", # 宿主 Web Push 已直接使用 http-ece 与 py-vapid,此 SDK 暂时保留给插件使用。 "pywebpush~=2.3.0", "pyyaml~=6.0.3", "qbittorrent-api==2026.6.0", "redis~=8.1.0", "regex~=2026.5.9", "requests[socks]~=2.34.2", "rsa~=4.9.1", "ruamel-yaml~=0.19.1", "setproctitle~=1.3.7", "setuptools~=84.1.0", "slack-bolt~=1.28.0", "slack-sdk~=3.42.0", "smbprotocol~=1.16.1", "sqlalchemy~=2.0.50", "starlette~=1.6.0", "telegramify-markdown~=1.2.0", "torrentool~=1.2.0", "tqdm~=4.68.2", "transmission-rpc~=7.0.11", "urllib3~=2.8.0", "uvicorn~=0.52.4", "watchdog~=6.0.0", "watchfiles~=1.2.0", "webauthn~=2.8.0", "websocket-client~=1.9.0", ] [dependency-groups] dev = [ "cython~=3.2.5", "docker~=7.1.0", "mypy~=1.18.2", "pylint~=4.0.6", "pytest~=9.0.3", "pytest-asyncio~=1.4.0", "pytest-cov~=7.1.0", "pytest-timeout~=2.4.0", "ruff~=0.16.4", "types-aiofiles~=25.1.0.20260518", "types-dateparser~=1.4.3.20260907", "types-psutil~=7.2.2.20260906", "types-python-dateutil~=2.9.0.20260807", "types-pytz~=2026.5.0.20261006", "types-pyyaml~=6.0.12.20260906", "types-regex~=2026.9.29.20261017", "types-tqdm~=4.70.0.20260906", ] runtime-standard = [ "Brotli==1.2.1", "bcrypt~=4.3.0", "lxml~=6.1.2", "psycopg2-binary~=2.9.12", "pywin32==312 ; sys_platform == 'win32'", ] runtime-free-threaded = [ "Brotli==1.2.0", "bcrypt~=5.0.0", "lxml==7.0.0b1", "psycopg[c]==3.3.4", ] [tool.ruff] target-version = "py314" line-length = 120 exclude = ["app/plugins"] [tool.ruff.lint] select = ["E4", "E7", "E9", "F", "I"] [tool.ruff.lint.per-file-ignores] # 启动入口必须先完成缓存装配 / 导入路径与标准流重定向,再导入业务模块,晚导入是启动契约 "app/startup/lifecycle/__init__.py" = ["E402"] "app/main.py" = ["E402"] [tool.uv] package = false required-version = ">=0.12.5" default-groups = ["dev", "runtime-standard"] conflicts = [ [ { group = "runtime-standard" }, { group = "runtime-free-threaded" }, ], ] exclude-dependencies = [ { package = { name = "docker" }, dependencies = ["pywin32"] }, { package = { name = "oss2" }, dependencies = ["crcmod"] }, ] environments = [ "sys_platform == 'linux' and platform_machine == 'x86_64'", "sys_platform == 'linux' and platform_machine == 'aarch64'", "sys_platform == 'darwin' and platform_machine == 'x86_64'", "sys_platform == 'darwin' and platform_machine == 'arm64'", "sys_platform == 'win32' and platform_machine == 'AMD64'", ] required-environments = [ "sys_platform == 'linux' and platform_machine == 'x86_64'", "sys_platform == 'linux' and platform_machine == 'aarch64'", "sys_platform == 'darwin' and platform_machine == 'x86_64'", "sys_platform == 'darwin' and platform_machine == 'arm64'", "sys_platform == 'win32' and platform_machine == 'AMD64'", ] [tool.uv.extra-build-variables] orjson = { ORJSON_BUILD_FREETHREADED = "1" } [tool.uv.sources] # 1.2.1 发布分支尚无无 GIL 声明;源码分支保留 1.2.0 版本号,固定到官方解码器安全修复提交。 brotli = { url = "https://github.com/google/brotli/archive/0ed4268a4401abcb4472096340477cf4af7d1a2b.tar.gz", group = "runtime-free-threaded" } [tool.setuptools] py-modules = ["version"] [tool.setuptools.dynamic] version = { attr = "version.APP_VERSION" }