soco 0.1.4 copy "soco: ^0.1.4" to clipboard
soco: ^0.1.4 copied to clipboard

Control Sonos speakers programmatically. Discover devices, manage playback, groups, alarms, and more. Port of Python SoCo library.

Changelog #

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

0.1.4 - 2025-12-06 #

Added - 100% API Completeness #

All missing API methods have been implemented, achieving 100% feature parity with Python SoCo.

Queue Management

  • addToQueue(): Add DidlObject instances directly to the queue (previously only addUriToQueue() was available)
  • addMultipleToQueue(): Batch queue addition for multiple items (up to 16 items per request, more efficient than individual calls)

Convenience Wrappers (API Compatibility)

  • dialogLevel / setDialogLevel(): Convenience wrapper for dialogMode to match raw Sonos API
  • musicSurroundLevel / setMusicSurroundLevel(): Convenience wrapper for surroundVolumeMusic
  • surroundLevel / setSurroundLevel(): Convenience wrapper for surroundVolumeTv
  • surroundMode / setSurroundMode(): Convenience wrapper for surroundFullVolumeEnabled

Soundbar Audio Input

  • soundbarAudioInputFormatCode: Get audio input format code as integer (e.g., 18 for Dolby 5.1)
  • soundbarAudioInputFormat: Get human-readable audio input format string (e.g., "Dolby 5.1", "No input")

Speech Enhancement

  • speechEnhanceEnabled / setSpeechEnhanceEnabled(): Speech enhancement mode for Arc Ultra soundbars

Changed #

  • API Completeness: Dart port now has 100% API compatibility with Python SoCo
  • Test Suite: 954+ passing unit tests (up from 867)
  • Documentation: Added comprehensive API comparison document (API_COMPARISON.md)

Documentation #

  • Added API_COMPARISON.md documenting full API compatibility status
  • Updated README.md to reflect 100% API completeness
  • Updated TODO.md with completion status

0.1.0 - 2025-11-30 #

Initial Release #

First public release of the SoCo Dart port. This is a complete port of the Python SoCo library, providing programmatic control of Sonos speakers from Dart applications.

Added #

Core Features

  • SoCo class with 120+ methods for comprehensive speaker control
  • Device discovery via SSDP multicast and network scanning
  • Playback control: play, pause, stop, next, previous, seek, play from queue
  • Volume & audio: volume, mute, bass, treble, loudness, balance
  • Queue management: get, add, remove, clear, reorder queue items
  • Group management: join, unjoin, party mode, zone groups
  • Music library: browse and search local music library
  • Alarms: full CRUD operations for Sonos alarms
  • Snapshot/restore: save and restore speaker state
  • Events: UPnP subscriptions with Dart Streams
  • Sleep timer and battery info support

Advanced Features

  • Home theater: night mode, dialog mode, audio delay
  • Surround speakers: enable/disable, volume control
  • Subwoofer: enable/disable, gain, crossover settings
  • Stereo pairs: create and separate stereo pairs
  • Trueplay and fixed volume support
  • Line-in and TV input switching

Music Services

  • Music service accounts management
  • Token store for service authentication
  • Service-specific data structures
  • Music service browsing and playback

Plugins

  • Plugin system base infrastructure
  • ShareLink plugin: Share music links across services
  • Plex plugin: Plex media server integration
  • Example plugin template

Data Structures

  • DIDL-Lite metadata classes (tracks, albums, artists, playlists)
  • Search results with pagination
  • Zone group and zone member structures
  • Alarm and snapshot data models

Project Statistics #

  • 18 core modules fully ported
  • 5 music service modules
  • 4 plugin modules
  • 21 test modules with 567+ unit tests
  • 80% code coverage (1843/2304 lines)
  • 7 comprehensive examples
  • Zero analyzer warnings

Differences from Python SoCo #

  • All I/O operations are async (Future-based)
  • Events use Dart Streams instead of callbacks
  • Full null-safety support
  • Dart naming conventions (camelCase)
  • Immutable data structures where appropriate

0.1.1 - 2025-11-30 #

Fixed #

  • UPnP Service Control URLs: Fixed incorrect control URLs that caused HTTP 405 errors when communicating with real Sonos hardware. Services now use correct paths:

    • RenderingControl: /MediaRenderer/RenderingControl/Control
    • AVTransport: /MediaRenderer/AVTransport/Control
    • ContentDirectory: /MediaServer/ContentDirectory/Control
    • And other services with appropriate prefixes
  • getSpeakerInfo Caching: Fixed issue where getSpeakerInfo() would return incomplete data after device discovery. The method now correctly fetches speaker info even when ZoneGroupState data is already present.

Added #

  • Integration Test Suite: Added comprehensive integration test (test_integration.dart) that validates all core functionality against real Sonos hardware:
    • Discovery (11 devices found)
    • Volume and mute controls
    • Transport state and track info
    • Speaker info (zone name, model, versions)
    • Group operations (coordinator, members, all groups)
    • Play mode (shuffle, repeat)
    • Audio settings (bass, treble, loudness)
    • Sleep timer and available actions
    • TV/Line-in/Radio detection
    • Music library browsing
    • Zone enumeration (all zones, visible zones)

Changed #

  • Updated services.dart with proper eventSubscriptionUrl and defaultArgs for all UPnP services to match Python SoCo implementation

0.1.3 - 2025-12-01 #

Test Coverage Improvements #

  • Increased overall test coverage to 80.9% (2727/3370 lines)
  • Improved coverage for key modules:
    • discovery.dart: 64.4% → 81.4% (+17.0%)
    • data_structures_entry.dart: 74.1% → 92.6% (+18.5%)
  • Added comprehensive tests for:
    • Discovery module: factory usage, error handling, logging paths, includeInvisible, multiHousehold parameters
    • Data structures: error recovery, caching, subclass stripping, dynamic class creation
    • Core module: getSpeakerInfo, isSoundbar, and other getter methods
  • Test suite: 867 passing unit tests

Changed #

  • Tests requiring complex ZoneGroupState integration documented for future integration testing
  • Improved test organization and error handling coverage

0.1.2 - 2025-12-01 #

Performance Improvements #

  • XML Serialization Optimizations: Significant performance improvements for DIDL-Lite XML operations:

    • Direct XML builder usage (toElementInBuilder) avoids intermediate object creation
    • Pre-computed namespace tags for common DIDL elements (dc:title, upnp:class, etc.)
    • Optimized child element lookup using pre-built maps instead of repeated tree traversal
    • Pre-computed translation lookup keys for faster metadata extraction
    • Conditional logging to eliminate overhead when logging is disabled
    • Cache key optimization using hash codes instead of full strings
  • Performance Benchmarks: Added comprehensive benchmark suite (benchmark/benchmark.dart) comparing Dart vs Python SoCo:

    • DIDL to String: 50% faster (~30K ops/sec vs ~20K ops/sec baseline)
    • Round-trip (parse → serialize): 84% faster (~83K ops/sec vs ~45K ops/sec baseline)
    • fromElement: Maintained high performance (~151K ops/sec)
    • Round-trip operations now 2x faster than Python SoCo

Added #

  • Performance Benchmark Suite: Added benchmark/benchmark.dart and benchmark/benchmark_python.py for performance comparison
  • Performance Documentation: Added benchmark/PERFORMANCE_COMPARISON.md and benchmark/OPTIMIZATION_NOTES.md documenting optimizations

Changed #

  • DidlResource.toElementInBuilder(): New optimized method for direct XML building
  • DidlObject.toElement(): Now uses optimized boolean string conversion
  • fromDidlString(): Improved error recovery using pre-compiled RegExp
  • Metadata extraction: Uses pre-computed lookup keys for faster access

Technical Details #

  • XML serialization now uses direct builder methods instead of parse/serialize cycles
  • Child element collection optimized to single pass with map-based lookups
  • Namespace tag generation uses pre-computed constants for common cases
  • Translation lookup keys pre-computed at class initialization
1
likes
140
points
125
downloads

Documentation

Documentation
API reference

Publisher

verified publisherhornmicro.com

Weekly Downloads

Control Sonos speakers programmatically. Discover devices, manage playback, groups, alarms, and more. Port of Python SoCo library.

Repository (GitHub)
View/report issues

Topics

#sonos #audio #upnp #iot #smart-home

License

MIT (license)

Dependencies

http, logging, meta, network_info_plus, path, path_provider, xml

More

Packages that depend on soco