pywiim 2.2.2__tar.gz → 2.2.3__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.
Files changed (84) hide show
  1. {pywiim-2.2.2/pywiim.egg-info → pywiim-2.2.3}/PKG-INFO +1 -1
  2. {pywiim-2.2.2 → pywiim-2.2.3}/pyproject.toml +1 -1
  3. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/__init__.py +1 -1
  4. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/api/parser.py +19 -5
  5. {pywiim-2.2.2 → pywiim-2.2.3/pywiim.egg-info}/PKG-INFO +1 -1
  6. {pywiim-2.2.2 → pywiim-2.2.3}/LICENSE +0 -0
  7. {pywiim-2.2.2 → pywiim-2.2.3}/README.md +0 -0
  8. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/api/__init__.py +0 -0
  9. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/api/audio_pro.py +0 -0
  10. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/api/audio_settings.py +0 -0
  11. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/api/base.py +0 -0
  12. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/api/bluetooth.py +0 -0
  13. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/api/constants.py +0 -0
  14. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/api/device.py +0 -0
  15. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/api/diagnostics.py +0 -0
  16. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/api/endpoints.py +0 -0
  17. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/api/eq.py +0 -0
  18. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/api/firmware.py +0 -0
  19. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/api/group.py +0 -0
  20. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/api/lms.py +0 -0
  21. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/api/loop_mode.py +0 -0
  22. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/api/misc.py +0 -0
  23. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/api/peq.py +0 -0
  24. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/api/playback.py +0 -0
  25. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/api/preset.py +0 -0
  26. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/api/ssl.py +0 -0
  27. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/api/subwoofer.py +0 -0
  28. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/api/timer.py +0 -0
  29. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/backoff.py +0 -0
  30. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/capabilities.py +0 -0
  31. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/cli/__init__.py +0 -0
  32. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/cli/diagnostics.py +0 -0
  33. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/cli/discovery_cli.py +0 -0
  34. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/cli/group_test_cli.py +0 -0
  35. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/cli/join_test_cli.py +0 -0
  36. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/cli/monitor_cli.py +0 -0
  37. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/cli/verify_cli.py +0 -0
  38. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/client.py +0 -0
  39. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/device_capabilities.py +0 -0
  40. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/discovery.py +0 -0
  41. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/exceptions.py +0 -0
  42. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/group.py +0 -0
  43. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/group_helpers.py +0 -0
  44. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/mcp/__init__.py +0 -0
  45. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/mcp/__main__.py +0 -0
  46. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/mcp/config.example.json +0 -0
  47. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/mcp/config.py +0 -0
  48. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/mcp/context.py +0 -0
  49. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/mcp/server.py +0 -0
  50. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/metadata.py +0 -0
  51. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/model_names.py +0 -0
  52. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/models.py +0 -0
  53. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/normalize.py +0 -0
  54. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/player/__init__.py +0 -0
  55. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/player/audio.py +0 -0
  56. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/player/base.py +0 -0
  57. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/player/bluetooth.py +0 -0
  58. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/player/coverart.py +0 -0
  59. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/player/debounce.py +0 -0
  60. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/player/diagnostics.py +0 -0
  61. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/player/groupops.py +0 -0
  62. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/player/media.py +0 -0
  63. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/player/playback.py +0 -0
  64. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/player/properties.py +0 -0
  65. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/player/source_capabilities.py +0 -0
  66. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/player/statemgr.py +0 -0
  67. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/player/stream.py +0 -0
  68. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/player/stream_enricher.py +0 -0
  69. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/player/volume.py +0 -0
  70. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/polling.py +0 -0
  71. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/profiles.py +0 -0
  72. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/py.typed +0 -0
  73. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/role.py +0 -0
  74. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/state.py +0 -0
  75. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/upnp/__init__.py +0 -0
  76. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/upnp/client.py +0 -0
  77. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/upnp/eventer.py +0 -0
  78. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim/upnp/health.py +0 -0
  79. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim.egg-info/SOURCES.txt +0 -0
  80. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim.egg-info/dependency_links.txt +0 -0
  81. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim.egg-info/entry_points.txt +0 -0
  82. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim.egg-info/requires.txt +0 -0
  83. {pywiim-2.2.2 → pywiim-2.2.3}/pywiim.egg-info/top_level.txt +0 -0
  84. {pywiim-2.2.2 → pywiim-2.2.3}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pywiim
3
- Version: 2.2.2
3
+ Version: 2.2.3
4
4
  Summary: Python library for WiiM/LinkPlay device communication
5
5
  Author-email: Michael Cumming <mjcumming@gmail.com>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "pywiim"
7
- version = "2.2.2"
7
+ version = "2.2.3"
8
8
  description = "Python library for WiiM/LinkPlay device communication"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -87,7 +87,7 @@ from .profiles import (
87
87
  from .role import RoleDetectionResult, detect_role
88
88
  from .state import GroupStateSynchronizer, StateSynchronizer
89
89
 
90
- __version__ = "2.2.2"
90
+ __version__ = "2.2.3"
91
91
  __all__ = [
92
92
  # Main client
93
93
  "WiiMClient",
@@ -469,7 +469,7 @@ def _handle_qobuz_connect_state_quirks(data: dict[str, Any], raw: dict[str, Any]
469
469
  """Handle Qobuz Connect state detection quirks.
470
470
 
471
471
  Addresses GitHub issue #35: Qobuz Connect shows playing briefly then switches to idle.
472
- This implements the enhanced state detection logic that was added in python-linkplay v0.2.9.
472
+ Also handles HTTP ``status: "none"`` with live timeline/metadata (mjcumming/wiim#222).
473
473
 
474
474
  Args:
475
475
  data: Parsed data dictionary (modified in place)
@@ -477,16 +477,30 @@ def _handle_qobuz_connect_state_quirks(data: dict[str, Any], raw: dict[str, Any]
477
477
  """
478
478
  current_status = data.get("play_status", "").lower()
479
479
 
480
- # Only apply workaround when status appears to be incorrectly reported as stopped/idle
481
- if current_status not in {"stop", "stopped", "idle", ""}:
482
- return # Status appears correct, don't interfere
480
+ # Only skip when the device already reports a normal transport state we should not override.
481
+ # Qobuz Connect often reports ``status: "none"`` while ``curpos`` / ``totlen`` and metadata
482
+ # still reflect an active stream (see mjcumming/wiim#222); ``none`` must not bypass this path.
483
+ if current_status in {
484
+ "play",
485
+ "playing",
486
+ "pause",
487
+ "paused",
488
+ "paused playback",
489
+ "load",
490
+ "loading",
491
+ "buffering",
492
+ "transitioning",
493
+ }:
494
+ return
483
495
 
484
496
  # Enhanced detection: Look for multiple indicators that suggest active playback
485
497
  # This mimics the improved logic from python-linkplay v0.2.9
486
498
 
487
499
  title = data.get("title")
488
500
  has_track_info = bool(title and isinstance(title, str) and title.strip() and title != "Unknown")
489
- has_position_info = bool(data.get("position") or raw.get("curpos") or raw.get("offset_pts"))
501
+ has_position_info = (
502
+ data.get("position") is not None or raw.get("curpos") is not None or raw.get("offset_pts") is not None
503
+ )
490
504
  has_duration_info = bool(data.get("duration") or raw.get("totlen"))
491
505
  has_artwork = bool(data.get("entity_picture") or raw.get("cover") or raw.get("albumArtURI"))
492
506
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pywiim
3
- Version: 2.2.2
3
+ Version: 2.2.3
4
4
  Summary: Python library for WiiM/LinkPlay device communication
5
5
  Author-email: Michael Cumming <mjcumming@gmail.com>
6
6
  License: MIT
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
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
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
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
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes