✨ Add Python 3.13 support and update dependencies

Extends Python version support to include 3.13 in CI workflows,
tox environments, and documentation. Updates dependencies to
ensure compatibility with the new Python version and resolves
legacy workarounds for macOS GitHub Actions runners.

Upgrades include:
- `pyside6` to version 6.9.1
- `click` to version 8.2.1
- Other relevant dependency updates for compatibility.

Re-enables `pyupgrade` pre-commit hook targeting Python 3.12+.

Fixed binary creation for Intel macOS.
This commit is contained in:
Robert Honz
2025-07-01 08:04:21 +02:00
parent e35f5eef78
commit d3164f48de
8 changed files with 67 additions and 58 deletions
+1 -1
View File
@@ -29,7 +29,7 @@ jobs:
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
strategy: strategy:
matrix: matrix:
python-version: ["3.12"] python-version: ["3.12", "3.13"]
fail-fast: false fail-fast: false
steps: steps:
- name: Check out - name: Check out
+1 -7
View File
@@ -98,13 +98,7 @@ jobs:
CMD_BUILD: > CMD_BUILD: >
brew install create-dmg && brew install create-dmg &&
source $VENV && source $VENV &&
# Ugly workaround to allow AppleEvents access for the provisioner. poetry run make gui-macos-dmg-intel APP_NAME=${{needs.compute.outputs.OUT_NAME_FILE}} &&
# See: https://github.com/actions/runner-images/issues/7531
sudo sqlite3 $HOME/Library/Application\ Support/com.apple.TCC/TCC.db "INSERT OR REPLACE INTO access VALUES('kTCCServiceAppleEvents','/usr/local/opt/runner/provisioner/provisioner',1,2,3,1,NULL,NULL,0,'com.apple.finder',X'fade0c000000002c00000001000000060000000200000010636f6d2e6170706c652e66696e64657200000003',NULL,1592919552);" &&
sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "INSERT OR REPLACE INTO access VALUES('kTCCServiceAppleEvents','/usr/local/opt/runner/provisioner/provisioner',1,2,3,1,NULL,NULL,0,'com.apple.finder',X'fade0c000000002c00000001000000060000000200000010636f6d2e6170706c652e66696e64657200000003',NULL,1592919552);" &&
echo killing XProtect...; sudo pkill -9 XProtect >/dev/null || true &&
echo waiting ...; while pgrep XProtect; do sleep 3; done &&
poetry run make gui-macos-dmg APP_NAME=${{needs.compute.outputs.OUT_NAME_FILE}} &&
cd dist && cd dist &&
zip -r ${{needs.compute.outputs.OUT_NAME_FILE}}_${{needs.compute.outputs.ARCH_MACOS_X64}}${{needs.compute.outputs.ASSET_EXTENSION}} ${{needs.compute.outputs.OUT_NAME_FILE}}.dmg -x "*.DS_Store" && zip -r ${{needs.compute.outputs.OUT_NAME_FILE}}_${{needs.compute.outputs.ARCH_MACOS_X64}}${{needs.compute.outputs.ASSET_EXTENSION}} ${{needs.compute.outputs.OUT_NAME_FILE}}.dmg -x "*.DS_Store" &&
cd .. cd ..
+7 -8
View File
@@ -31,14 +31,13 @@ repos:
- id: end-of-file-fixer - id: end-of-file-fixer
exclude: LICENSE exclude: LICENSE
# Due to UP007 and Typer this stays disabled: https://github.com/tiangolo/typer/issues/533 - repo: local
# - repo: local hooks:
# hooks: - id: pyupgrade
# - id: pyupgrade name: pyupgrade
# name: pyupgrade entry: poetry run pyupgrade --py312-plus
# entry: poetry run pyupgrade --py310-plus types: [python]
# types: [python] language: system
# language: system
# Disabled du to conflicts with black and I like the style of black more. # Disabled du to conflicts with black and I like the style of black more.
# - repo: local # - repo: local
+10
View File
@@ -97,4 +97,14 @@ gui-macos-dmg: gui ## Package GUI in a *.dmg file
"$(app_path_dist)/$(APP_NAME).dmg" \ "$(app_path_dist)/$(APP_NAME).dmg" \
"$(app_path_dist)/$(DMG_NAME)/" "$(app_path_dist)/$(DMG_NAME)/"
.PHONY: gui-macos-dmg-intel
gui-macos-dmg-intel: gui ## Package GUI in a *.dmg file; Workaround for Intel Macs, since Apple Script permissions are not set correctly on GitHub Actiion Runner images
@poetry run mkdir -p $(app_path_dist)/dmg
@poetry run mv "$(app_path_dist)/$(APP_BUNDLE_NAME).app" "$(app_path_dist)/$(DMG_NAME)/$(APP_NAME).app"
@poetry run hdiutil create -volname "$(APP_NAME)" \
-srcfolder "$(app_path_dist)/$(DMG_NAME)/" \
-ov -format UDZO \
-fs APFS \
"$(app_path_dist)/$(APP_NAME).dmg"
.DEFAULT_GOAL := help .DEFAULT_GOAL := help
+1 -1
View File
@@ -42,7 +42,7 @@ If you like this projects and want to support it, feel free to buy me a coffee
## 💻 Installation / Upgrade ## 💻 Installation / Upgrade
**Requirements**: Python == 3.12 (other versions might work but are not tested!) **Requirements**: Python version 3.12 or 3.13 (other versions might work but are not tested!)
```bash ```bash
pip install --upgrade tidal-dl-ng pip install --upgrade tidal-dl-ng
Generated
+40 -36
View File
@@ -350,14 +350,14 @@ files = [
[[package]] [[package]]
name = "click" name = "click"
version = "8.1.8" version = "8.2.1"
description = "Composable command line interface toolkit" description = "Composable command line interface toolkit"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.10"
groups = ["main", "dev", "docs"] groups = ["main", "dev", "docs"]
files = [ files = [
{file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, {file = "click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b"},
{file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, {file = "click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202"},
] ]
[package.dependencies] [package.dependencies]
@@ -1634,60 +1634,63 @@ dev = ["build", "flake8", "mypy", "pytest", "twine"]
[[package]] [[package]]
name = "pyside6" name = "pyside6"
version = "6.8.0.1" version = "6.9.1"
description = "Python bindings for the Qt cross-platform application and UI framework" description = "Python bindings for the Qt cross-platform application and UI framework"
optional = true optional = true
python-versions = "<3.13,>=3.9" python-versions = "<3.14,>=3.9"
groups = ["main"] groups = ["main"]
markers = "extra == \"gui\"" markers = "extra == \"gui\""
files = [ files = [
{file = "PySide6-6.8.0.1-cp39-abi3-macosx_12_0_universal2.whl", hash = "sha256:a8f8ce89094e28a384821e5a4ba4ea952f3a02fe97a2b2ce5912eba4876554d0"}, {file = "PySide6-6.9.1-cp39-abi3-macosx_12_0_universal2.whl", hash = "sha256:f843ef39970a2f79757810fffd7b8e93ac42a3de9ea62f2a03648cde57648aed"},
{file = "PySide6-6.8.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1730d80f52cf9fb04c5267e652ddb1b7857fba5302860392fc73bfb9ab81ef8e"}, {file = "PySide6-6.9.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:db44ac08b8f7ac1b421bc1c6a44200d03f08d80dc7b3f68dfdb1684f30f41c17"},
{file = "PySide6-6.8.0.1-cp39-abi3-manylinux_2_31_aarch64.whl", hash = "sha256:6567a4bc1a6bf77c13ea1fbe128ff68379afb31e92795cb501a7e085d8bf744e"}, {file = "PySide6-6.9.1-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:531a6e67c429b045674d57fe9864b711eb59e4cded753c2640982e368fd468d1"},
{file = "PySide6-6.8.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:9eb918758b9ca838febceb972db2c651ff652b7e5a893d8e59a38a744579ccc4"}, {file = "PySide6-6.9.1-cp39-abi3-win_amd64.whl", hash = "sha256:c82dbb7d32bbdd465e01059174f71bddc97de152ab71bded3f1907c40f9a5f16"},
{file = "PySide6-6.9.1-cp39-abi3-win_arm64.whl", hash = "sha256:1525d63dc6dc425b8c2dc5bc01a8cb1d67530401449f3a3490c09a14c095b9f9"},
] ]
[package.dependencies] [package.dependencies]
PySide6-Addons = "6.8.0.1" PySide6-Addons = "6.9.1"
PySide6-Essentials = "6.8.0.1" PySide6-Essentials = "6.9.1"
shiboken6 = "6.8.0.1" shiboken6 = "6.9.1"
[[package]] [[package]]
name = "pyside6-addons" name = "pyside6-addons"
version = "6.8.0.1" version = "6.9.1"
description = "Python bindings for the Qt cross-platform application and UI framework (Addons)" description = "Python bindings for the Qt cross-platform application and UI framework (Addons)"
optional = true optional = true
python-versions = "<3.13,>=3.9" python-versions = "<3.14,>=3.9"
groups = ["main"] groups = ["main"]
markers = "extra == \"gui\"" markers = "extra == \"gui\""
files = [ files = [
{file = "PySide6_Addons-6.8.0.1-cp39-abi3-macosx_12_0_universal2.whl", hash = "sha256:db3622c257920e0d20de2f80ade6c064a48ee1e0c9a1cfe1f1d3bc2685c93996"}, {file = "PySide6_Addons-6.9.1-cp39-abi3-macosx_12_0_universal2.whl", hash = "sha256:7be0708fa89715c282541fca47e2ba97c0c8d2886e0236ef994b2dd8f52aacdd"},
{file = "PySide6_Addons-6.8.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:4cf9aebd26d908de4cbd5c7274f432370f8b0dc8dc7b748a6e6ade035fe28f28"}, {file = "PySide6_Addons-6.9.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:da7869b02e3599d26546fad582db4656060786bc5ec8ece5ec9ee8aa8b42371c"},
{file = "PySide6_Addons-6.8.0.1-cp39-abi3-manylinux_2_31_aarch64.whl", hash = "sha256:ed8f73e41b24ae6ea5ebb9dca1d4d6a6ddf06cffda63fa929d5e180ea9ac3cdd"}, {file = "PySide6_Addons-6.9.1-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:53fd08c8152b6ba8c435458afd189835ba905793a5077a2bb0b1b11222b375d4"},
{file = "PySide6_Addons-6.8.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:066f0b6555f3351263a8d4936da5a95bd1b3e9bc83881f9f477d9146ccd3282f"}, {file = "PySide6_Addons-6.9.1-cp39-abi3-win_amd64.whl", hash = "sha256:cd93a3a5e3886cd958f3a5acc7c061c24f10a394ce9f4ce657ac394544ca7ec2"},
{file = "PySide6_Addons-6.9.1-cp39-abi3-win_arm64.whl", hash = "sha256:4f589631bdceb518080ae9c9fa288e64f092cd5bebe25adc8ad89e8eadd4db29"},
] ]
[package.dependencies] [package.dependencies]
PySide6-Essentials = "6.8.0.1" PySide6-Essentials = "6.9.1"
shiboken6 = "6.8.0.1" shiboken6 = "6.9.1"
[[package]] [[package]]
name = "pyside6-essentials" name = "pyside6-essentials"
version = "6.8.0.1" version = "6.9.1"
description = "Python bindings for the Qt cross-platform application and UI framework (Essentials)" description = "Python bindings for the Qt cross-platform application and UI framework (Essentials)"
optional = true optional = true
python-versions = "<3.13,>=3.9" python-versions = "<3.14,>=3.9"
groups = ["main"] groups = ["main"]
markers = "extra == \"gui\"" markers = "extra == \"gui\""
files = [ files = [
{file = "PySide6_Essentials-6.8.0.1-cp39-abi3-macosx_12_0_universal2.whl", hash = "sha256:2ae533a318b563ef7b73b1d7de3254e966423215589329207e45ee9adcb2e83c"}, {file = "PySide6_Essentials-6.9.1-cp39-abi3-macosx_12_0_universal2.whl", hash = "sha256:ed43435a70e018e1c22efcaf34a9430b83cfcad716dba661b03de21c13322fab"},
{file = "PySide6_Essentials-6.8.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:327a0f08cb1ee5af7f7ed81527bbdb3058e2a39a300efcc806e0289b50192f98"}, {file = "PySide6_Essentials-6.9.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:e5da48883f006c6206ef85874db74ddebcdf69b0281bd4f1642b1c5ac1d54aea"},
{file = "PySide6_Essentials-6.8.0.1-cp39-abi3-manylinux_2_31_aarch64.whl", hash = "sha256:6f573331261889992d450145c0f3a9a317e798b63c1318cc271422c0a74b2298"}, {file = "PySide6_Essentials-6.9.1-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:e46a2801c9c6098025515fd0af6c594b9e9c951842f68b8f6f3da9858b9b26c2"},
{file = "PySide6_Essentials-6.8.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:800d26aa51003b41c73e9c4cd4fd6c96fe91fc21f9862c3d459a7e2209f9475f"}, {file = "PySide6_Essentials-6.9.1-cp39-abi3-win_amd64.whl", hash = "sha256:ad1ac94011492dba33051bc33db1c76a7d6f815a81c01422cb6220273b369145"},
{file = "PySide6_Essentials-6.9.1-cp39-abi3-win_arm64.whl", hash = "sha256:35c2c2bb4a88db74d11e638cf917524ff35785883f10b439ead07960a5733aa4"},
] ]
[package.dependencies] [package.dependencies]
shiboken6 = "6.8.0.1" shiboken6 = "6.9.1"
[[package]] [[package]]
name = "pytest" name = "pytest"
@@ -1957,17 +1960,18 @@ files = [
[[package]] [[package]]
name = "shiboken6" name = "shiboken6"
version = "6.8.0.1" version = "6.9.1"
description = "Python/C++ bindings helper module" description = "Python/C++ bindings helper module"
optional = true optional = true
python-versions = "<3.13,>=3.9" python-versions = "<3.14,>=3.9"
groups = ["main"] groups = ["main"]
markers = "extra == \"gui\"" markers = "extra == \"gui\""
files = [ files = [
{file = "shiboken6-6.8.0.1-cp39-abi3-macosx_12_0_universal2.whl", hash = "sha256:99cbb8d53bd2abcb61717a675bb3c1d7513868298b56cdfcae8aa27ed367577a"}, {file = "shiboken6-6.9.1-cp39-abi3-macosx_12_0_universal2.whl", hash = "sha256:40e92afc88da06b5100c56b761e59837ff282166e9531268f3d910b6128e621e"},
{file = "shiboken6-6.8.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:77b6e2eae8d48fe32a058e234778c42642eca1755de8b793e2d57857d7d037cf"}, {file = "shiboken6-6.9.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:efcdfa8655d34aaf8d7a0c7724def3440bd46db02f5ad3b1785db5f6ccb0a8ff"},
{file = "shiboken6-6.8.0.1-cp39-abi3-manylinux_2_31_aarch64.whl", hash = "sha256:eb2db6f0cac42f10dc5b4bcf4ab5a8e079acb870877d0cb3d95cac80c20e4554"}, {file = "shiboken6-6.9.1-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:efcf75d48a29ae072d0bf54b3cd5a59ae91bb6b3ab7459e17c769355486c2e0b"},
{file = "shiboken6-6.8.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:3f2601c0db8d1e860a2a1265936e616361b073360eb15153806638fbc3b7ff26"}, {file = "shiboken6-6.9.1-cp39-abi3-win_amd64.whl", hash = "sha256:209ccf02c135bd70321143dcbc5023ae0c056aa4850a845955dd2f9b2ff280a9"},
{file = "shiboken6-6.9.1-cp39-abi3-win_arm64.whl", hash = "sha256:2a39997ce275ced7853defc89d3a1f19a11c90991ac6eef3435a69bb0b7ff1de"},
] ]
[[package]] [[package]]
@@ -2337,5 +2341,5 @@ gui = ["pyqtdarktheme-fork", "pyside6"]
[metadata] [metadata]
lock-version = "2.1" lock-version = "2.1"
python-versions = ">=3.12,<3.13" python-versions = ">=3.12,<3.14"
content-hash = "57c0352221bedbee53a72958d37b1f6b0efb1ce6272d9d77a1c2c4beaa6b1435" content-hash = "018ac8314b5ad902bf03eb269b201b58f97ab112b99ea3046078aa93a61479fb"
+5 -4
View File
@@ -10,8 +10,9 @@ classifiers = [
"License :: OSI Approved :: GNU Affero General Public License v3", "License :: OSI Approved :: GNU Affero General Public License v3",
"Programming Language :: Python :: 3", "Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
] ]
requires-python = ">=3.12,<3.13" requires-python = ">=3.12,<3.14"
dynamic = ["dependencies"] dynamic = ["dependencies"]
[project.urls] [project.urls]
@@ -34,8 +35,8 @@ dataclasses-json = "^0.6.7"
pathvalidate = "^3.3.1" pathvalidate = "^3.3.1"
m3u8 = "^6.0.0" m3u8 = "^6.0.0"
coloredlogs = "^15.0.1" coloredlogs = "^15.0.1"
pyside6 = { version = "6.8.0.1", optional = true } pyside6 = { version = "6.9.1", optional = true }
pyqtdarktheme-fork = { version = "^2.3.2", optional = true } pyqtdarktheme-fork = { version = "^2.3.4", optional = true }
mpegdash = "^0.4.0" mpegdash = "^0.4.0"
rich = "^14.0.0" rich = "^14.0.0"
toml = "^0.10.2" toml = "^0.10.2"
@@ -140,7 +141,7 @@ ignore = [
[tool.black] [tool.black]
# https://github.com/psf/black # https://github.com/psf/black
target-version = ["py312"] target-version = ["py312", "py313"]
line-length = 120 line-length = 120
color = true color = true
preview = true preview = true
+2 -1
View File
@@ -1,10 +1,11 @@
[tox] [tox]
skipsdist = true skipsdist = true
envlist = py312 envlist = py312,py313
[gh-actions] [gh-actions]
python = python =
3.12: py312 3.12: py312
3.13: py313
[testenv] [testenv]
passenv = PYTHON_VERSION passenv = PYTHON_VERSION