dbus2mqtt 0.5.0__tar.gz → 0.5.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of dbus2mqtt might be problematic. Click here for more details.

Files changed (100) hide show
  1. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/.github/workflows/ci.yml +1 -0
  2. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/.github/workflows/docker-dev.yml +1 -0
  3. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/.github/workflows/trivy.yml +1 -1
  4. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/.pre-commit-config.yaml +3 -3
  5. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/PKG-INFO +3 -3
  6. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/README.md +1 -1
  7. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/docker/Dockerfile.dev +1 -1
  8. dbus2mqtt-0.5.0/docs/examples/home_assistant_media_player.md → dbus2mqtt-0.5.1/docs/examples/home_assistant_media_player/mqtt_mediaplayer.yaml +0 -78
  9. dbus2mqtt-0.5.1/docs/examples/home_assistant_media_player.md +82 -0
  10. dbus2mqtt-0.5.1/docs/examples/linux_desktop/notify.json +13 -0
  11. dbus2mqtt-0.5.1/docs/examples/linux_desktop/notify_with_actions_and_hints.json +13 -0
  12. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/docs/examples/linux_desktop.md +6 -32
  13. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/docs/flows/flow_triggers.md +4 -4
  14. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/mkdocs.yml +2 -0
  15. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/pyproject.toml +1 -1
  16. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/src/dbus2mqtt/config/__init__.py +16 -10
  17. dbus2mqtt-0.5.1/src/dbus2mqtt/config/jsonarparse.py +38 -0
  18. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/tests/__init__.py +1 -2
  19. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/uv.lock +0 -125
  20. dbus2mqtt-0.5.0/src/dbus2mqtt/config/jsonarparse.py +0 -32
  21. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/.dockerignore +0 -0
  22. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/.env.example +0 -0
  23. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  24. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  25. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/.github/release-drafter.yml +0 -0
  26. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/.github/scripts/release-versions.py +0 -0
  27. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/.github/workflows/deploy-docs.yml +0 -0
  28. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/.github/workflows/docker-stable.yml +0 -0
  29. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/.github/workflows/pre-commit.yml +0 -0
  30. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/.github/workflows/publish.yml +0 -0
  31. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/.github/workflows/release-drafter.yml +0 -0
  32. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/.gitignore +0 -0
  33. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/.markdownlint.json +0 -0
  34. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/.python-version +0 -0
  35. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/.vscode/launch.json +0 -0
  36. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/.vscode/settings.json +0 -0
  37. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/.yamllint.yml +0 -0
  38. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/LICENSE +0 -0
  39. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/docker/Dockerfile.pypi +0 -0
  40. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/docs/assets/favicon.svg +0 -0
  41. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/docs/assets/logo-dark-img.svg +0 -0
  42. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/docs/assets/logo-dark-text.png +0 -0
  43. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/docs/assets/logo-dark-text.svg +0 -0
  44. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/docs/assets/logo-light-img.svg +0 -0
  45. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/docs/assets/logo-light-text.svg +0 -0
  46. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/docs/developer/debugging_dbus.md +0 -0
  47. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/docs/developer/index.md +0 -0
  48. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/docs/examples/bluez.md +0 -0
  49. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/docs/examples/bluez.yaml +0 -0
  50. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/docs/examples/connman-config.md +0 -0
  51. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/docs/examples/connman-config.yaml +0 -0
  52. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/docs/examples/dbus2mqtt_internal_state.md +0 -0
  53. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/docs/examples/dbus2mqtt_internal_state.yaml +0 -0
  54. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/docs/examples/home_assistant_media_player.yaml +0 -0
  55. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/docs/examples/index.md +0 -0
  56. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/docs/examples/linux_desktop.yaml +0 -0
  57. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/docs/flows/flow_actions.md +0 -0
  58. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/docs/flows/index.md +0 -0
  59. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/docs/hooks.py +0 -0
  60. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/docs/index.md +0 -0
  61. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/docs/overrides/main.html +0 -0
  62. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/docs/setup.md +0 -0
  63. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/docs/stylesheets/extra.css +0 -0
  64. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/docs/subscriptions.md +0 -0
  65. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/docs/templating/index.md +0 -0
  66. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/renovate.json +0 -0
  67. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/src/dbus2mqtt/__init__.py +0 -0
  68. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/src/dbus2mqtt/__main__.py +0 -0
  69. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/src/dbus2mqtt/dbus/dbus_client.py +0 -0
  70. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/src/dbus2mqtt/dbus/dbus_types.py +0 -0
  71. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/src/dbus2mqtt/dbus/dbus_util.py +0 -0
  72. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/src/dbus2mqtt/dbus/introspection_patches/mpris_playerctl.py +0 -0
  73. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/src/dbus2mqtt/dbus/introspection_patches/mpris_vlc.py +0 -0
  74. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/src/dbus2mqtt/event_broker.py +0 -0
  75. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/src/dbus2mqtt/flow/__init__.py +0 -0
  76. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/src/dbus2mqtt/flow/actions/context_set.py +0 -0
  77. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/src/dbus2mqtt/flow/actions/log_action.py +0 -0
  78. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/src/dbus2mqtt/flow/actions/mqtt_publish.py +0 -0
  79. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/src/dbus2mqtt/flow/flow_processor.py +0 -0
  80. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/src/dbus2mqtt/main.py +0 -0
  81. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/src/dbus2mqtt/mqtt/mqtt_client.py +0 -0
  82. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/src/dbus2mqtt/template/dbus_template_functions.py +0 -0
  83. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/src/dbus2mqtt/template/templating.py +0 -0
  84. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/tests/config/fixtures/payload_template_jinja_expressions.yaml +0 -0
  85. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/tests/config/fixtures/payload_template_off.yaml +0 -0
  86. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/tests/config/fixtures/schedule_cron_trigger.yaml +0 -0
  87. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/tests/config/test_config.py +0 -0
  88. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/tests/config/test_examples.py +0 -0
  89. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/tests/conftest.py +0 -0
  90. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/tests/dbus/test_dbus_client.py +0 -0
  91. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/tests/dbus/test_dbus_client_mqtt_command.py +0 -0
  92. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/tests/dbus/test_dbus_utils.py +0 -0
  93. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/tests/flow/actions/test_context_set.py +0 -0
  94. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/tests/flow/actions/test_log.py +0 -0
  95. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/tests/flow/actions/test_mqtt_publish.py +0 -0
  96. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/tests/flow/test_flow_processor.py +0 -0
  97. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/tests/flow/triggers/test_dbus_client_triggers.py +0 -0
  98. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/tests/flow/triggers/test_mqtt_client_triggers.py +0 -0
  99. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/tests/template/test_templating.py +0 -0
  100. {dbus2mqtt-0.5.0 → dbus2mqtt-0.5.1}/tests/template/test_templating_config.py +0 -0
@@ -19,6 +19,7 @@ jobs:
19
19
  - "3.11"
20
20
  - "3.12"
21
21
  - "3.13"
22
+ - "3.14"
22
23
 
23
24
  steps:
24
25
  - uses: actions/checkout@v5
@@ -10,6 +10,7 @@ name: docker-dev
10
10
  - '.pre-commit-config.yaml'
11
11
  - 'README.md'
12
12
  - 'renovate.json'
13
+ - 'mkdocs.yaml'
13
14
  workflow_dispatch:
14
15
 
15
16
  jobs:
@@ -21,7 +21,7 @@ jobs:
21
21
  uses: actions/checkout@v5
22
22
 
23
23
  - name: Run Trivy vulnerability scanner
24
- uses: aquasecurity/trivy-action@0.33.0
24
+ uses: aquasecurity/trivy-action@0.33.1
25
25
  with:
26
26
  image-ref: ghcr.io/jwnmulder/dbus2mqtt:latest
27
27
  format: 'sarif'
@@ -33,7 +33,7 @@ repos:
33
33
  - --strict
34
34
 
35
35
  - repo: https://github.com/astral-sh/ruff-pre-commit
36
- rev: v0.12.11
36
+ rev: v0.12.12
37
37
  hooks:
38
38
  - id: ruff
39
39
  args:
@@ -42,12 +42,12 @@ repos:
42
42
  - I
43
43
 
44
44
  - repo: https://github.com/astral-sh/uv-pre-commit
45
- rev: 0.8.14
45
+ rev: 0.8.15
46
46
  hooks:
47
47
  - id: uv-lock
48
48
 
49
49
  - repo: https://github.com/RobertCraigie/pyright-python
50
- rev: v1.1.404
50
+ rev: v1.1.405
51
51
  hooks:
52
52
  - id: pyright
53
53
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dbus2mqtt
3
- Version: 0.5.0
3
+ Version: 0.5.1
4
4
  Summary: General purpose DBus to MQTT bridge - expose signals, methods and properties over MQTT - featuring jinja based templating, payload enrichment and MPRIS / BlueZ / Home Assistant ready examples
5
5
  Project-URL: Documentation, https://jwnmulder.github.io/dbus2mqtt
6
6
  Project-URL: Source, https://github.com/jwnmulder/dbus2mqtt
@@ -17,6 +17,7 @@ Classifier: Programming Language :: Python :: 3.10
17
17
  Classifier: Programming Language :: Python :: 3.11
18
18
  Classifier: Programming Language :: Python :: 3.12
19
19
  Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Programming Language :: Python :: 3.14
20
21
  Classifier: Topic :: Home Automation
21
22
  Requires-Python: >=3.10
22
23
  Requires-Dist: apscheduler>=3.11.0
@@ -27,7 +28,6 @@ Requires-Dist: jinja2-ansible-filters>=1.3.2
27
28
  Requires-Dist: jinja2>=3.1.6
28
29
  Requires-Dist: jsonargparse>=4.38.0
29
30
  Requires-Dist: paho-mqtt>=2.1.0
30
- Requires-Dist: pydantic>=2.11.3
31
31
  Requires-Dist: python-dotenv>=1.1.0
32
32
  Requires-Dist: pyyaml>=6.0.2
33
33
  Description-Content-Type: text/markdown
@@ -122,4 +122,4 @@ See [subscriptions](https://jwnmulder.github.io/dbus2mqtt/subscriptions.html) fo
122
122
 
123
123
  For more advanced use-cases, dbus2mqtt has support for flows and Jinja2 based templates. A reference of all supported flow triggers and actions can be found on [flows](https://jwnmulder.github.io/dbus2mqtt/flows/index.html)
124
124
 
125
- Jinja templating documentation can be found here: [templating](templating/index.md)
125
+ Jinja templating documentation can be found here: [templating](https://jwnmulder.github.io/dbus2mqtt/templating/index.html)
@@ -88,4 +88,4 @@ See [subscriptions](https://jwnmulder.github.io/dbus2mqtt/subscriptions.html) fo
88
88
 
89
89
  For more advanced use-cases, dbus2mqtt has support for flows and Jinja2 based templates. A reference of all supported flow triggers and actions can be found on [flows](https://jwnmulder.github.io/dbus2mqtt/flows/index.html)
90
90
 
91
- Jinja templating documentation can be found here: [templating](templating/index.md)
91
+ Jinja templating documentation can be found here: [templating](https://jwnmulder.github.io/dbus2mqtt/templating/index.html)
@@ -20,7 +20,7 @@ RUN --mount=type=cache,target=/root/.cache/uv \
20
20
  --mount=type=bind,source=pyproject.toml,target=pyproject.toml \
21
21
  uv sync --frozen --no-install-project --no-dev
22
22
 
23
- ADD src/ pyproject.toml uv.lock README.md /app
23
+ ADD src/ pyproject.toml uv.lock README.md /app/
24
24
  RUN --mount=type=cache,target=/root/.cache/uv \
25
25
  uv sync --frozen --no-dev
26
26
 
@@ -1,80 +1,3 @@
1
- ---
2
- hide:
3
- - toc
4
- ---
5
-
6
- # Mediaplayer integration with Home Assistant
7
-
8
- With dbus2mqtt as a bridge between MPRIS players and Home Assistant, it becomes possible to control Linux based media players via Home Assistant.
9
-
10
- The Media Player Remote Interfacing Specification (MPRIS) is a standard for controlling Linux media players. It provides a mechanism for compliant media players discovery, basic playback and media player state control as well as a tracklist interface which is used to add context to the current item.
11
-
12
- Pre-requisites:
13
-
14
- * Home-Assistant with a working MQTT setup
15
- * The community Home-Assistant plugin [github.com/Sennevds/media_player.template](https://github.com/Sennevds/media_player.template)
16
-
17
- ## Features
18
-
19
- * dbus subscription using `org.mpris.MediaPlayer2.*` wildcard to support multiple concurrent MRPIS players
20
- * Every 5 seconds, the state of the `first` known MPRIS player is published to MQTT topic `dbus2mqtt/org.mpris.MediaPlayer2/state`
21
- * Every MPRIS property update immediately publishes the state to MQTT topic `dbus2mqtt/org.mpris.MediaPlayer2/state`
22
- * Support for player commands (see below)
23
-
24
- ## Setup activities
25
-
26
- * Configure the MQTT Sensor and player configuration in Home Assistant with the configuration listed below
27
- * Config dbus2mqtt using the supplied [home_assistant_media_player.yaml](https://github.com/jwnmulder/dbus2mqtt/blob/main/docs/examples/home_assistant_media_player.yaml)
28
-
29
- To run, execute the following commands
30
-
31
- ```bash
32
- dbus2mqtt --config docs/examples/home_assistant_media_player.yaml
33
- ```
34
-
35
- ## Tested configurations
36
-
37
- The following MPRIS players are known to work with Home Assistant.
38
-
39
- | Application | Play<br />Pause<br /> | Stop | Next<br />Previous | Seek<br />SetPosition | Volume | Quit | Media Info | Media Image | Notes |
40
- |--------------|-----------------------|------|--------------------|------|--------|------|------------|-------------|-------------------|
41
- | `Firefox` | ✅ | ✅ | ✅ | ✅ | | ❌ | ✅ | ✅ | |
42
- | `VLC` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | |
43
- | `Chromium` | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✔️ | Images not working when Chromium is running as snap |
44
- | `Kodi` | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | Requires Kodi plugin [MediaPlayerRemoteInterface](https://github.com/wastis/MediaPlayerRemoteInterface) |
45
-
46
- !!! note
47
- More players that support MPRIS (but have not been tested) can be found here: <https://wiki.archlinux.org/title/MPRIS>
48
-
49
- ## Player commands
50
-
51
- The following table lists player commands, their descriptions, and an example JSON payload for invoking them via MQTT.
52
-
53
- Dbus methods can be invoked by sendig the JSON payload to MQTT topic `dbus2mqtt/org.mpris.MediaPlayer2/command`. Method calls will be done for all matching players. The same applies to property updates.
54
-
55
- | Method<br />Property | Description | Example MQTT JSON Payload |
56
- |---------------|------------------------------------------|------------------------------------------------|
57
- | `Play` | Starts playback | `#!json { "method": "Play" }` |
58
- | `Pause` | Pauses playback | `#!json { "method": "Pause" }` |
59
- | `PlayPause` | Toggles between play and pause | `#!json { "method": "PlayPause" }` |
60
- | `Stop` | Stops playback | `#!json { "method": "Stop" }` |
61
- | `Next` | Next | `#!json { "method": "Next" }` |
62
- | `Previous` | Previous | `#!json { "method": "Previous" }` |
63
- | `Seek` | Seek forward or backward in micro seconds | `#!json { "method": "Seek", "args": [60000000] }` |
64
- | `Volume` | Set volume (double between 0 and 1) | `#!json { "property": "Volume", "value": 1.0 }` |
65
- | `SetPosition` | Set / seek to position in micro seconds. First arguments needs to be trackid which can be determined via Metadata.mpris:trackid | `#!json { "method": "SetPosition", "args": ["/org/mpris/MediaPlayer2/firefox", 170692139] }` |
66
- | `Quit` | Quits the media player | `#!json { "method": "Quit" }` |
67
-
68
- For an overview of MPRIS commands have a look at <https://mpris2.readthedocs.io/en/latest/interfaces.html#mpris2.MediaPlayer2>
69
-
70
- ## Home Assistant configuration
71
-
72
- The configuration shown below creates a few components in Home Assistant
73
-
74
- * Media Player
75
- * MQTT sensor listening on topic `dbus2mqtt/org.mpris.MediaPlayer2/state`
76
-
77
- ```yaml+jinja
78
1
  mqtt:
79
2
  sensor:
80
3
  - name: MPRIS Media Player
@@ -198,4 +121,3 @@ media_player:
198
121
  topic: dbus2mqtt/org.mpris.MediaPlayer2/command
199
122
  payload: >
200
123
  {"property": "Volume", "value": {{ [0, (state_attr('sensor.mpris_media_player', 'Volume') - 0.1)] | max }} }
201
- ```
@@ -0,0 +1,82 @@
1
+ ---
2
+ hide:
3
+ - toc
4
+ ---
5
+
6
+ # Mediaplayer integration with Home Assistant
7
+
8
+ With dbus2mqtt as a bridge between MPRIS players and Home Assistant, it becomes possible to control Linux based media players via Home Assistant.
9
+
10
+ The Media Player Remote Interfacing Specification (MPRIS) is a standard for controlling Linux media players. It provides a mechanism for compliant media players discovery, basic playback and media player state control as well as a tracklist interface which is used to add context to the current item.
11
+
12
+ Pre-requisites:
13
+
14
+ * Home-Assistant with a working MQTT setup
15
+ * The community Home-Assistant plugin [github.com/Sennevds/media_player.template](https://github.com/Sennevds/media_player.template)
16
+
17
+ ## Features
18
+
19
+ * dbus subscription using `org.mpris.MediaPlayer2.*` wildcard to support multiple concurrent MRPIS players
20
+ * Every 5 seconds, the state of the `first` known MPRIS player is published to MQTT topic `dbus2mqtt/org.mpris.MediaPlayer2/state`
21
+ * Every MPRIS property update immediately publishes the state to MQTT topic `dbus2mqtt/org.mpris.MediaPlayer2/state`
22
+ * Support for player commands (see below)
23
+
24
+ ## Setup activities
25
+
26
+ * Configure the MQTT Sensor and player configuration in Home Assistant with the configuration listed below
27
+ * Config dbus2mqtt using the supplied [home_assistant_media_player.yaml](https://github.com/jwnmulder/dbus2mqtt/blob/main/docs/examples/home_assistant_media_player.yaml)
28
+
29
+ To run, execute the following commands
30
+
31
+ ```bash
32
+ dbus2mqtt --config docs/examples/home_assistant_media_player.yaml
33
+ ```
34
+
35
+ ## Tested configurations
36
+
37
+ The following MPRIS players are known to work with Home Assistant.
38
+
39
+ | Application | Play<br />Pause<br /> | Stop | Next<br />Previous | Seek<br />SetPosition | Volume | Quit | Media Info | Media Image | Notes |
40
+ |--------------|-----------------------|------|--------------------|------|--------|------|------------|-------------|-------------------|
41
+ | `Firefox` | ✅ | ✅ | ✅ | ✅ | | ❌ | ✅ | ✅ | |
42
+ | `VLC` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | |
43
+ | `Chromium` | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✔️ | Images not working when Chromium is running as snap |
44
+ | `Kodi` | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | Requires Kodi plugin [MediaPlayerRemoteInterface](https://github.com/wastis/MediaPlayerRemoteInterface) |
45
+
46
+ !!! note
47
+ More players that support MPRIS (but have not been tested) can be found here: <https://wiki.archlinux.org/title/MPRIS>
48
+
49
+ ## Player commands
50
+
51
+ The following table lists player commands, their descriptions, and an example JSON payload for invoking them via MQTT.
52
+
53
+ Dbus methods can be invoked by sendig the JSON payload to MQTT topic `dbus2mqtt/org.mpris.MediaPlayer2/command`. Method calls will be done for all matching players. The same applies to property updates.
54
+
55
+ | Method<br />Property | Description | Example MQTT JSON Payload |
56
+ |---------------|------------------------------------------|------------------------------------------------|
57
+ | `Play` | Starts playback | `#!json { "method": "Play" }` |
58
+ | `Pause` | Pauses playback | `#!json { "method": "Pause" }` |
59
+ | `PlayPause` | Toggles between play and pause | `#!json { "method": "PlayPause" }` |
60
+ | `Stop` | Stops playback | `#!json { "method": "Stop" }` |
61
+ | `Next` | Next | `#!json { "method": "Next" }` |
62
+ | `Previous` | Previous | `#!json { "method": "Previous" }` |
63
+ | `Seek` | Seek forward or backward in micro seconds | `#!json { "method": "Seek", "args": [60000000] }` |
64
+ | `Volume` | Set volume (double between 0 and 1) | `#!json { "property": "Volume", "value": 1.0 }` |
65
+ | `SetPosition` | Set / seek to position in micro seconds. First arguments needs to be trackid which can be determined via Metadata.mpris:trackid | `#!json { "method": "SetPosition", "args": ["/org/mpris/MediaPlayer2/firefox", 170692139] }` |
66
+ | `Quit` | Quits the media player | `#!json { "method": "Quit" }` |
67
+
68
+ For an overview of MPRIS commands have a look at <https://mpris2.readthedocs.io/en/latest/interfaces.html#mpris2.MediaPlayer2>
69
+
70
+ ## Home Assistant configuration
71
+
72
+ Besides setting up `dbus2mqtt`, Home Assistant needs to be configured as well. The configuration shown below creates the necessary components in Home Assistant for controlling MPRIS Media Players. Three components will be setup.
73
+
74
+ * MQTT sensor listening on topic `dbus2mqtt/org.mpris.MediaPlayer2/state`
75
+ * MQTT image listening on topic `dbus2mqtt/org.mpris.MediaPlayer2/artUrlImage`
76
+ * Media Player
77
+
78
+ ```yaml+jinja title='config/packages/mqtt_mediaplayer.yaml'
79
+ --8<-- "docs/examples/home_assistant_media_player/mqtt_mediaplayer.yaml"
80
+ ```
81
+
82
+ Source: [mqtt_mediaplayer.yaml](https://github.com/jwnmulder/dbus2mqtt/blob/main/docs/examples/home_assistant_media_player/mqtt_mediaplayer.yaml)
@@ -0,0 +1,13 @@
1
+ {
2
+ "method": "Notify",
3
+ "args": [
4
+ "dbus2mqtt",
5
+ 0,
6
+ "dialog-information",
7
+ "dbus2mqtt",
8
+ "Message from <b><i>dbus2mqtt</i></b>",
9
+ [],
10
+ {},
11
+ 0
12
+ ]
13
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "method": "Notify",
3
+ "args": [
4
+ "dbus2mqtt",
5
+ 0,
6
+ "dialog-information",
7
+ "dbus2mqtt",
8
+ "Message from <b><i>dbus2mqtt</i></b>",
9
+ ["ok", "OK", "cancel", "Cancel"],
10
+ { "urgency": 1, "category": "device" },
11
+ 5000
12
+ ]
13
+ }
@@ -5,8 +5,6 @@ hide:
5
5
 
6
6
  # Linux Desktop
7
7
 
8
- ## Introduction
9
-
10
8
  Use dbus2mqtt to interface with your Linux desktop
11
9
 
12
10
  Pre-requisites:
@@ -29,40 +27,16 @@ uv run dbus2mqtt --config docs/examples/linux_desktop.yaml
29
27
 
30
28
  Trigger a desktop notification by sending one of the following example payloads to `dbus2mqtt/Notifications/command`
31
29
 
32
- Simple notification with no timeout
30
+ Example notification with no timeout
33
31
 
34
32
  ```json
35
- {
36
- "method": "Notify",
37
- "args": [
38
- "dbus2mqtt",
39
- 0,
40
- "dialog-information",
41
- "dbus2mqtt",
42
- "Message from <b><i>dbus2mqtt</i></b>",
43
- [],
44
- {},
45
- 0
46
- ]
47
- }
33
+ --8<-- "docs/examples/linux_desktop/notify.json"
48
34
  ```
49
35
 
50
- Notification with actions and hints that automatically disappears after 5 seconds
36
+ Example notification with actions and hints, that automatically disappears after 5 seconds
51
37
 
52
38
  ```json
53
- {
54
- "method": "Notify",
55
- "args": [
56
- "dbus2mqtt",
57
- 0,
58
- "dialog-information",
59
- "dbus2mqtt",
60
- "Message from <b><i>dbus2mqtt</i></b>",
61
- ["ok", "OK", "cancel", "Cancel"],
62
- { "urgency": 1, "category": "device" },
63
- 5000
64
- ]
65
- }
39
+ --8<-- "docs/examples/linux_desktop/notify_with_actions_and_hints.json"
66
40
  ```
67
41
 
68
42
  Further references:
@@ -70,7 +44,7 @@ Further references:
70
44
  * <https://specifications.freedesktop.org/notification-spec/1.3/>
71
45
  * <https://specifications.freedesktop.org/icon-naming-spec/latest/>
72
46
 
73
- ## Gnome SessionManager
47
+ <!-- ## Gnome SessionManager
74
48
 
75
49
  !!! note
76
50
  work in progress
@@ -79,4 +53,4 @@ The following table lists the supported commands, their descriptions, and an exa
79
53
 
80
54
  dbus methods can be invoked by sendig the JSON payload to MQTT topic `dbus2mqtt/SessionManager/command`.
81
55
 
82
- For an overview of commands have a look at <https://docs.flatpak.org/en/latest/portal-api-reference.html>
56
+ For an overview of commands have a look at <https://docs.flatpak.org/en/latest/portal-api-reference.html> -->
@@ -81,16 +81,13 @@ When triggered, the following context parameters are available
81
81
  filter: "{{ payload.get('action') == 'Mute' }}"
82
82
  ```
83
83
 
84
- Listens for MQTT message on the configured topic. The message payload is expected to be JSON formatted
84
+ Listens for MQTT messages on the configured topic. The message payload is expected to be JSON formatted
85
85
 
86
86
  | key | description |
87
87
  |------|-------------|
88
88
  | topic | topic to subscribe to, e.g. 'dbus2mqtt/org.mpris.MediaPlayer2/flow-trigger' |
89
89
  | filter | A templated string that must evaluate to a boolean result. When False, the flow is not triggered |
90
90
 
91
- !!! note
92
- If `topic` overlaps with `subscription[].interfaces[].mqtt_command_topic` and the JSON payload structure follows `mqtt_command_topic` layout, a dbus call will be executed as well.
93
-
94
91
  When triggered, the following context parameters are available
95
92
 
96
93
  | name | type | description |
@@ -112,3 +109,6 @@ flows:
112
109
  msg: |
113
110
  Flow triggered by MQTT message, payload.action={{ payload.get('action') }}
114
111
  ```
112
+
113
+ !!! note
114
+ If `topic` overlaps with `subscription[].interfaces[].mqtt_command_topic` and the JSON payload structure follows `mqtt_command_topic` layout, a dbus call will be executed as well. Similar, warnings will be logged if a message does not match any flow or D-Bus method.
@@ -134,6 +134,8 @@ markdown_extensions:
134
134
  - pymdownx.snippets:
135
135
  check_paths: true
136
136
 
137
+ - footnotes
138
+
137
139
  hooks:
138
140
  - docs/hooks.py
139
141
 
@@ -34,6 +34,7 @@ classifiers = [
34
34
  "Programming Language :: Python :: 3.11",
35
35
  "Programming Language :: Python :: 3.12",
36
36
  "Programming Language :: Python :: 3.13",
37
+ "Programming Language :: Python :: 3.14",
37
38
  ]
38
39
 
39
40
  requires-python = ">=3.10"
@@ -47,7 +48,6 @@ dependencies = [
47
48
  "jinja2-ansible-filters>=1.3.2",
48
49
  "jsonargparse>=4.38.0",
49
50
  "paho-mqtt>=2.1.0",
50
- "pydantic>=2.11.3",
51
51
  "python-dotenv>=1.1.0",
52
52
  "pyyaml>=6.0.2",
53
53
  ]
@@ -3,9 +3,9 @@ import uuid
3
3
  import warnings
4
4
 
5
5
  from dataclasses import dataclass, field
6
- from typing import Annotated, Any, Literal
6
+ from typing import Any, Literal
7
7
 
8
- from pydantic import Field, SecretStr
8
+ from jsonargparse.typing import SecretStr
9
9
 
10
10
  from dbus2mqtt.template.templating import TemplateEngine
11
11
 
@@ -98,10 +98,15 @@ class FlowTriggerMqttMessageConfig:
98
98
  return template_engine.render_template(self.filter, bool, trigger_context)
99
99
  return True
100
100
 
101
- FlowTriggerConfig = Annotated[
102
- FlowTriggerScheduleConfig | FlowTriggerDbusSignalConfig | FlowTriggerBusNameAddedConfig | FlowTriggerBusNameRemovedConfig | FlowTriggerObjectAddedConfig | FlowTriggerObjectRemovedConfig | FlowTriggerMqttMessageConfig,
103
- Field(discriminator="type")
104
- ]
101
+ FlowTriggerConfig = (
102
+ FlowTriggerScheduleConfig
103
+ | FlowTriggerDbusSignalConfig
104
+ | FlowTriggerBusNameAddedConfig
105
+ | FlowTriggerBusNameRemovedConfig
106
+ | FlowTriggerObjectAddedConfig
107
+ | FlowTriggerObjectRemovedConfig
108
+ | FlowTriggerMqttMessageConfig
109
+ )
105
110
 
106
111
  @dataclass
107
112
  class FlowActionContextSetConfig:
@@ -124,10 +129,11 @@ class FlowActionLogConfig:
124
129
  type: Literal["log"] = "log"
125
130
  level: Literal["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"] = "INFO"
126
131
 
127
- FlowActionConfig = Annotated[
128
- FlowActionMqttPublishConfig | FlowActionContextSetConfig | FlowActionLogConfig,
129
- Field(discriminator="type")
130
- ]
132
+ FlowActionConfig = (
133
+ FlowActionMqttPublishConfig
134
+ | FlowActionContextSetConfig
135
+ | FlowActionLogConfig
136
+ )
131
137
 
132
138
  @dataclass
133
139
  class FlowConfig:
@@ -0,0 +1,38 @@
1
+ from typing import Any
2
+
3
+ import jsonargparse
4
+
5
+ from yaml import YAMLError
6
+
7
+ default_yaml_loader = jsonargparse.get_loader("yaml")
8
+ def _custom_yaml_load(stream: str) -> Any:
9
+
10
+ v = stream.strip()
11
+
12
+ # jsonargparse tries to parse yaml 1.1 boolean like values
13
+ # Without this, str:"{'PlaybackStatus': 'Off'}" would become dict:{'PlaybackStatus': False}
14
+ if v in ['on', 'On', 'off', 'Off', 'TRUE', 'FALSE', 'True', 'False']:
15
+ return stream
16
+
17
+ # Delegate to default yaml loader from jsonargparse
18
+ return default_yaml_loader(stream)
19
+
20
+ def new_argument_parser() -> jsonargparse.ArgumentParser:
21
+
22
+ # register out custom yaml loader for jsonargparse
23
+ jsonargparse.set_loader(
24
+ mode="yaml_custom",
25
+ loader_fn=_custom_yaml_load,
26
+ exceptions=(YAMLError,),
27
+ json_superset=True
28
+ )
29
+
30
+ # unless specified otherwise, load config from config.yaml
31
+ parser = jsonargparse.ArgumentParser(
32
+ default_config_files=["config.yaml"],
33
+ default_env=True,
34
+ env_prefix=False,
35
+ parser_mode="yaml_custom"
36
+ )
37
+
38
+ return parser
@@ -1,9 +1,8 @@
1
-
2
1
  from unittest.mock import patch
3
2
 
4
3
  import dbus_fast.aio as dbus_aio
5
4
 
6
- from pydantic import SecretStr
5
+ from jsonargparse.typing import SecretStr
7
6
 
8
7
  from dbus2mqtt import AppContext, config
9
8
  from dbus2mqtt.config import (
@@ -2,15 +2,6 @@ version = 1
2
2
  revision = 2
3
3
  requires-python = ">=3.10"
4
4
 
5
- [[package]]
6
- name = "annotated-types"
7
- version = "0.7.0"
8
- source = { registry = "https://pypi.org/simple" }
9
- sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" }
10
- wheels = [
11
- { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" },
12
- ]
13
-
14
5
  [[package]]
15
6
  name = "apscheduler"
16
7
  version = "3.11.0"
@@ -223,7 +214,6 @@ dependencies = [
223
214
  { name = "jinja2-ansible-filters" },
224
215
  { name = "jsonargparse" },
225
216
  { name = "paho-mqtt" },
226
- { name = "pydantic" },
227
217
  { name = "python-dotenv" },
228
218
  { name = "pyyaml" },
229
219
  ]
@@ -254,7 +244,6 @@ requires-dist = [
254
244
  { name = "jinja2-ansible-filters", specifier = ">=1.3.2" },
255
245
  { name = "jsonargparse", specifier = ">=4.38.0" },
256
246
  { name = "paho-mqtt", specifier = ">=2.1.0" },
257
- { name = "pydantic", specifier = ">=2.11.3" },
258
247
  { name = "python-dotenv", specifier = ">=1.1.0" },
259
248
  { name = "pyyaml", specifier = ">=6.0.2" },
260
249
  ]
@@ -690,108 +679,6 @@ wheels = [
690
679
  { url = "https://files.pythonhosted.org/packages/7b/d7/7831438e6c3ebbfa6e01a927127a6cb42ad3ab844247f3c5b96bea25d73d/psutil-6.1.1-cp37-abi3-win_amd64.whl", hash = "sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649", size = 254444, upload-time = "2024-12-19T18:22:11.335Z" },
691
680
  ]
692
681
 
693
- [[package]]
694
- name = "pydantic"
695
- version = "2.11.7"
696
- source = { registry = "https://pypi.org/simple" }
697
- dependencies = [
698
- { name = "annotated-types" },
699
- { name = "pydantic-core" },
700
- { name = "typing-extensions" },
701
- { name = "typing-inspection" },
702
- ]
703
- sdist = { url = "https://files.pythonhosted.org/packages/00/dd/4325abf92c39ba8623b5af936ddb36ffcfe0beae70405d456ab1fb2f5b8c/pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db", size = 788350, upload-time = "2025-06-14T08:33:17.137Z" }
704
- wheels = [
705
- { url = "https://files.pythonhosted.org/packages/6a/c0/ec2b1c8712ca690e5d61979dee872603e92b8a32f94cc1b72d53beab008a/pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b", size = 444782, upload-time = "2025-06-14T08:33:14.905Z" },
706
- ]
707
-
708
- [[package]]
709
- name = "pydantic-core"
710
- version = "2.33.2"
711
- source = { registry = "https://pypi.org/simple" }
712
- dependencies = [
713
- { name = "typing-extensions" },
714
- ]
715
- sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload-time = "2025-04-23T18:33:52.104Z" }
716
- wheels = [
717
- { url = "https://files.pythonhosted.org/packages/e5/92/b31726561b5dae176c2d2c2dc43a9c5bfba5d32f96f8b4c0a600dd492447/pydantic_core-2.33.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8", size = 2028817, upload-time = "2025-04-23T18:30:43.919Z" },
718
- { url = "https://files.pythonhosted.org/packages/a3/44/3f0b95fafdaca04a483c4e685fe437c6891001bf3ce8b2fded82b9ea3aa1/pydantic_core-2.33.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d", size = 1861357, upload-time = "2025-04-23T18:30:46.372Z" },
719
- { url = "https://files.pythonhosted.org/packages/30/97/e8f13b55766234caae05372826e8e4b3b96e7b248be3157f53237682e43c/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d", size = 1898011, upload-time = "2025-04-23T18:30:47.591Z" },
720
- { url = "https://files.pythonhosted.org/packages/9b/a3/99c48cf7bafc991cc3ee66fd544c0aae8dc907b752f1dad2d79b1b5a471f/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572", size = 1982730, upload-time = "2025-04-23T18:30:49.328Z" },
721
- { url = "https://files.pythonhosted.org/packages/de/8e/a5b882ec4307010a840fb8b58bd9bf65d1840c92eae7534c7441709bf54b/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02", size = 2136178, upload-time = "2025-04-23T18:30:50.907Z" },
722
- { url = "https://files.pythonhosted.org/packages/e4/bb/71e35fc3ed05af6834e890edb75968e2802fe98778971ab5cba20a162315/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b", size = 2736462, upload-time = "2025-04-23T18:30:52.083Z" },
723
- { url = "https://files.pythonhosted.org/packages/31/0d/c8f7593e6bc7066289bbc366f2235701dcbebcd1ff0ef8e64f6f239fb47d/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2", size = 2005652, upload-time = "2025-04-23T18:30:53.389Z" },
724
- { url = "https://files.pythonhosted.org/packages/d2/7a/996d8bd75f3eda405e3dd219ff5ff0a283cd8e34add39d8ef9157e722867/pydantic_core-2.33.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a", size = 2113306, upload-time = "2025-04-23T18:30:54.661Z" },
725
- { url = "https://files.pythonhosted.org/packages/ff/84/daf2a6fb2db40ffda6578a7e8c5a6e9c8affb251a05c233ae37098118788/pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac", size = 2073720, upload-time = "2025-04-23T18:30:56.11Z" },
726
- { url = "https://files.pythonhosted.org/packages/77/fb/2258da019f4825128445ae79456a5499c032b55849dbd5bed78c95ccf163/pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a", size = 2244915, upload-time = "2025-04-23T18:30:57.501Z" },
727
- { url = "https://files.pythonhosted.org/packages/d8/7a/925ff73756031289468326e355b6fa8316960d0d65f8b5d6b3a3e7866de7/pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b", size = 2241884, upload-time = "2025-04-23T18:30:58.867Z" },
728
- { url = "https://files.pythonhosted.org/packages/0b/b0/249ee6d2646f1cdadcb813805fe76265745c4010cf20a8eba7b0e639d9b2/pydantic_core-2.33.2-cp310-cp310-win32.whl", hash = "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22", size = 1910496, upload-time = "2025-04-23T18:31:00.078Z" },
729
- { url = "https://files.pythonhosted.org/packages/66/ff/172ba8f12a42d4b552917aa65d1f2328990d3ccfc01d5b7c943ec084299f/pydantic_core-2.33.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640", size = 1955019, upload-time = "2025-04-23T18:31:01.335Z" },
730
- { url = "https://files.pythonhosted.org/packages/3f/8d/71db63483d518cbbf290261a1fc2839d17ff89fce7089e08cad07ccfce67/pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7", size = 2028584, upload-time = "2025-04-23T18:31:03.106Z" },
731
- { url = "https://files.pythonhosted.org/packages/24/2f/3cfa7244ae292dd850989f328722d2aef313f74ffc471184dc509e1e4e5a/pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246", size = 1855071, upload-time = "2025-04-23T18:31:04.621Z" },
732
- { url = "https://files.pythonhosted.org/packages/b3/d3/4ae42d33f5e3f50dd467761304be2fa0a9417fbf09735bc2cce003480f2a/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f", size = 1897823, upload-time = "2025-04-23T18:31:06.377Z" },
733
- { url = "https://files.pythonhosted.org/packages/f4/f3/aa5976e8352b7695ff808599794b1fba2a9ae2ee954a3426855935799488/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc", size = 1983792, upload-time = "2025-04-23T18:31:07.93Z" },
734
- { url = "https://files.pythonhosted.org/packages/d5/7a/cda9b5a23c552037717f2b2a5257e9b2bfe45e687386df9591eff7b46d28/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de", size = 2136338, upload-time = "2025-04-23T18:31:09.283Z" },
735
- { url = "https://files.pythonhosted.org/packages/2b/9f/b8f9ec8dd1417eb9da784e91e1667d58a2a4a7b7b34cf4af765ef663a7e5/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a", size = 2730998, upload-time = "2025-04-23T18:31:11.7Z" },
736
- { url = "https://files.pythonhosted.org/packages/47/bc/cd720e078576bdb8255d5032c5d63ee5c0bf4b7173dd955185a1d658c456/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef", size = 2003200, upload-time = "2025-04-23T18:31:13.536Z" },
737
- { url = "https://files.pythonhosted.org/packages/ca/22/3602b895ee2cd29d11a2b349372446ae9727c32e78a94b3d588a40fdf187/pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e", size = 2113890, upload-time = "2025-04-23T18:31:15.011Z" },
738
- { url = "https://files.pythonhosted.org/packages/ff/e6/e3c5908c03cf00d629eb38393a98fccc38ee0ce8ecce32f69fc7d7b558a7/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d", size = 2073359, upload-time = "2025-04-23T18:31:16.393Z" },
739
- { url = "https://files.pythonhosted.org/packages/12/e7/6a36a07c59ebefc8777d1ffdaf5ae71b06b21952582e4b07eba88a421c79/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30", size = 2245883, upload-time = "2025-04-23T18:31:17.892Z" },
740
- { url = "https://files.pythonhosted.org/packages/16/3f/59b3187aaa6cc0c1e6616e8045b284de2b6a87b027cce2ffcea073adf1d2/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf", size = 2241074, upload-time = "2025-04-23T18:31:19.205Z" },
741
- { url = "https://files.pythonhosted.org/packages/e0/ed/55532bb88f674d5d8f67ab121a2a13c385df382de2a1677f30ad385f7438/pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51", size = 1910538, upload-time = "2025-04-23T18:31:20.541Z" },
742
- { url = "https://files.pythonhosted.org/packages/fe/1b/25b7cccd4519c0b23c2dd636ad39d381abf113085ce4f7bec2b0dc755eb1/pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab", size = 1952909, upload-time = "2025-04-23T18:31:22.371Z" },
743
- { url = "https://files.pythonhosted.org/packages/49/a9/d809358e49126438055884c4366a1f6227f0f84f635a9014e2deb9b9de54/pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65", size = 1897786, upload-time = "2025-04-23T18:31:24.161Z" },
744
- { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000, upload-time = "2025-04-23T18:31:25.863Z" },
745
- { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996, upload-time = "2025-04-23T18:31:27.341Z" },
746
- { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957, upload-time = "2025-04-23T18:31:28.956Z" },
747
- { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199, upload-time = "2025-04-23T18:31:31.025Z" },
748
- { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296, upload-time = "2025-04-23T18:31:32.514Z" },
749
- { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109, upload-time = "2025-04-23T18:31:33.958Z" },
750
- { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028, upload-time = "2025-04-23T18:31:39.095Z" },
751
- { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044, upload-time = "2025-04-23T18:31:41.034Z" },
752
- { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881, upload-time = "2025-04-23T18:31:42.757Z" },
753
- { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034, upload-time = "2025-04-23T18:31:44.304Z" },
754
- { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187, upload-time = "2025-04-23T18:31:45.891Z" },
755
- { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628, upload-time = "2025-04-23T18:31:47.819Z" },
756
- { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866, upload-time = "2025-04-23T18:31:49.635Z" },
757
- { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894, upload-time = "2025-04-23T18:31:51.609Z" },
758
- { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688, upload-time = "2025-04-23T18:31:53.175Z" },
759
- { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808, upload-time = "2025-04-23T18:31:54.79Z" },
760
- { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580, upload-time = "2025-04-23T18:31:57.393Z" },
761
- { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859, upload-time = "2025-04-23T18:31:59.065Z" },
762
- { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810, upload-time = "2025-04-23T18:32:00.78Z" },
763
- { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498, upload-time = "2025-04-23T18:32:02.418Z" },
764
- { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611, upload-time = "2025-04-23T18:32:04.152Z" },
765
- { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924, upload-time = "2025-04-23T18:32:06.129Z" },
766
- { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196, upload-time = "2025-04-23T18:32:08.178Z" },
767
- { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389, upload-time = "2025-04-23T18:32:10.242Z" },
768
- { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223, upload-time = "2025-04-23T18:32:12.382Z" },
769
- { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473, upload-time = "2025-04-23T18:32:14.034Z" },
770
- { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269, upload-time = "2025-04-23T18:32:15.783Z" },
771
- { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921, upload-time = "2025-04-23T18:32:18.473Z" },
772
- { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162, upload-time = "2025-04-23T18:32:20.188Z" },
773
- { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560, upload-time = "2025-04-23T18:32:22.354Z" },
774
- { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777, upload-time = "2025-04-23T18:32:25.088Z" },
775
- { url = "https://files.pythonhosted.org/packages/30/68/373d55e58b7e83ce371691f6eaa7175e3a24b956c44628eb25d7da007917/pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa", size = 2023982, upload-time = "2025-04-23T18:32:53.14Z" },
776
- { url = "https://files.pythonhosted.org/packages/a4/16/145f54ac08c96a63d8ed6442f9dec17b2773d19920b627b18d4f10a061ea/pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29", size = 1858412, upload-time = "2025-04-23T18:32:55.52Z" },
777
- { url = "https://files.pythonhosted.org/packages/41/b1/c6dc6c3e2de4516c0bb2c46f6a373b91b5660312342a0cf5826e38ad82fa/pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d", size = 1892749, upload-time = "2025-04-23T18:32:57.546Z" },
778
- { url = "https://files.pythonhosted.org/packages/12/73/8cd57e20afba760b21b742106f9dbdfa6697f1570b189c7457a1af4cd8a0/pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e", size = 2067527, upload-time = "2025-04-23T18:32:59.771Z" },
779
- { url = "https://files.pythonhosted.org/packages/e3/d5/0bb5d988cc019b3cba4a78f2d4b3854427fc47ee8ec8e9eaabf787da239c/pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c", size = 2108225, upload-time = "2025-04-23T18:33:04.51Z" },
780
- { url = "https://files.pythonhosted.org/packages/f1/c5/00c02d1571913d496aabf146106ad8239dc132485ee22efe08085084ff7c/pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec", size = 2069490, upload-time = "2025-04-23T18:33:06.391Z" },
781
- { url = "https://files.pythonhosted.org/packages/22/a8/dccc38768274d3ed3a59b5d06f59ccb845778687652daa71df0cab4040d7/pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052", size = 2237525, upload-time = "2025-04-23T18:33:08.44Z" },
782
- { url = "https://files.pythonhosted.org/packages/d4/e7/4f98c0b125dda7cf7ccd14ba936218397b44f50a56dd8c16a3091df116c3/pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c", size = 2238446, upload-time = "2025-04-23T18:33:10.313Z" },
783
- { url = "https://files.pythonhosted.org/packages/ce/91/2ec36480fdb0b783cd9ef6795753c1dea13882f2e68e73bce76ae8c21e6a/pydantic_core-2.33.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808", size = 2066678, upload-time = "2025-04-23T18:33:12.224Z" },
784
- { url = "https://files.pythonhosted.org/packages/7b/27/d4ae6487d73948d6f20dddcd94be4ea43e74349b56eba82e9bdee2d7494c/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8", size = 2025200, upload-time = "2025-04-23T18:33:14.199Z" },
785
- { url = "https://files.pythonhosted.org/packages/f1/b8/b3cb95375f05d33801024079b9392a5ab45267a63400bf1866e7ce0f0de4/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593", size = 1859123, upload-time = "2025-04-23T18:33:16.555Z" },
786
- { url = "https://files.pythonhosted.org/packages/05/bc/0d0b5adeda59a261cd30a1235a445bf55c7e46ae44aea28f7bd6ed46e091/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612", size = 1892852, upload-time = "2025-04-23T18:33:18.513Z" },
787
- { url = "https://files.pythonhosted.org/packages/3e/11/d37bdebbda2e449cb3f519f6ce950927b56d62f0b84fd9cb9e372a26a3d5/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7", size = 2067484, upload-time = "2025-04-23T18:33:20.475Z" },
788
- { url = "https://files.pythonhosted.org/packages/8c/55/1f95f0a05ce72ecb02a8a8a1c3be0579bbc29b1d5ab68f1378b7bebc5057/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e", size = 2108896, upload-time = "2025-04-23T18:33:22.501Z" },
789
- { url = "https://files.pythonhosted.org/packages/53/89/2b2de6c81fa131f423246a9109d7b2a375e83968ad0800d6e57d0574629b/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8", size = 2069475, upload-time = "2025-04-23T18:33:24.528Z" },
790
- { url = "https://files.pythonhosted.org/packages/b8/e9/1f7efbe20d0b2b10f6718944b5d8ece9152390904f29a78e68d4e7961159/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf", size = 2239013, upload-time = "2025-04-23T18:33:26.621Z" },
791
- { url = "https://files.pythonhosted.org/packages/3c/b2/5309c905a93811524a49b4e031e9851a6b00ff0fb668794472ea7746b448/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb", size = 2238715, upload-time = "2025-04-23T18:33:28.656Z" },
792
- { url = "https://files.pythonhosted.org/packages/32/56/8a7ca5d2cd2cda1d245d34b1c9a942920a718082ae8e54e5f3e5a58b7add/pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1", size = 2066757, upload-time = "2025-04-23T18:33:30.645Z" },
793
- ]
794
-
795
682
  [[package]]
796
683
  name = "pygments"
797
684
  version = "2.19.2"
@@ -1069,18 +956,6 @@ wheels = [
1069
956
  { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" },
1070
957
  ]
1071
958
 
1072
- [[package]]
1073
- name = "typing-inspection"
1074
- version = "0.4.1"
1075
- source = { registry = "https://pypi.org/simple" }
1076
- dependencies = [
1077
- { name = "typing-extensions" },
1078
- ]
1079
- sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726, upload-time = "2025-05-21T18:55:23.885Z" }
1080
- wheels = [
1081
- { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload-time = "2025-05-21T18:55:22.152Z" },
1082
- ]
1083
-
1084
959
  [[package]]
1085
960
  name = "tzdata"
1086
961
  version = "2025.2"
@@ -1,32 +0,0 @@
1
- import jsonargparse
2
-
3
-
4
- def _custom_yaml_load(stream):
5
- if isinstance(stream, str):
6
- v = stream.strip()
7
-
8
- # jsonargparse tries to parse yaml 1.1 boolean like values
9
- # Without this, str:"{'PlaybackStatus': 'Off'}" would become dict:{'PlaybackStatus': False}
10
- if v in ['on', 'On', 'off', 'Off', 'TRUE', 'FALSE', 'True', 'False']:
11
- return stream
12
-
13
- # Anoyingly, values starting with {{ and ending with }} are working with the default yaml_loader
14
- # from jsonargparse. Somehow its not when we use the custom yaml loader.
15
- # This fixes it
16
- first_line = v.splitlines()[0].strip()
17
- if "#" not in first_line and ("{{" in first_line or first_line.startswith("{%")):
18
- return stream
19
-
20
- # Delegate to default yaml loader from jsonargparse
21
- yaml_loader = jsonargparse.get_loader("yaml")
22
- return yaml_loader(stream)
23
-
24
- def new_argument_parser() -> jsonargparse.ArgumentParser:
25
-
26
- # register out custom yaml loader for jsonargparse
27
- jsonargparse.set_loader("yaml_custom", _custom_yaml_load)
28
-
29
- # unless specified otherwise, load config from config.yaml
30
- parser = jsonargparse.ArgumentParser(default_config_files=["config.yaml"], default_env=True, env_prefix=False, parser_mode="yaml_custom")
31
-
32
- return parser
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes