Release history
- Version 1.2
Support Python version 3.14:
Fix warnings upon return/break/continue that exit a finally block (PEP 765).
Restrict the configparser delimiters set to
'='when writing the default configuration file to fix the check (made starting with Python 3.14) that triggers configparser.InvalidWriteError: Cannot write key that contains the':'delimiter. See Cpython PR #129270.
Fix a crash upon a race condition that occurs when the DLNA device is about to be closed and is simultaneously discovered again by an SSDP notify/msearch datagram.
The UPnP device is now closed instead of being permanently disabled after a connection error ocurring while pa-dlna is streaming a track. It will be discovered again by the next SSDP_NOTIFY or SSDP_MSEARCH udp datagram after the connection is up again (issue #55).
- Version 1.1
Fix the
test_libpulsedeadlock inpytestwhen another pa-dlna instance is already running. The corresponding test cases are skipped.Fix the
test_mainfailure and the warning aboutTestEncoderwhen the test suite is run bypytest.A run of the test suite aborts and prints a clear error message when the
libpulseversion in use is invalid (issue #52).
- Version 1.0
Ignore spaces in the
max-agesetting of theCACHE-CONTROLfield of SSDP_NOTIFY datagrams (issue #50).
- Version 0.16
The required libpulse version is now
0.7after the error handling changes made in the libpulse release.Fix music player on KDE randomly raises exception while switching to next track (issue #49).
KDE music players (Juk, Elisa, Strawberry) misbehave by sending
removepulse events just before switching to a next track. A work-around to this problem using a timer is implemented that discards those events (issue #48).[Sonos] Accept HTTP 1.1 chunked encoding response to pa-dlna HTTP 1.0 requests.
- Version 0.15
The
Transfer-EncodingHTTP 1.1 header in response to HTTP 1.0 GET requests is not supported (issue #47).Ignore invalid subelements in
Icons(issue #40).Use
friendlyName, the name displayed by pavucontrol, as Renderer’s name.Add the pa-dlna systemd service unit.
Fix L16Encoder failing to set the correct mime type when the
ProtocolInfo <contentFormat>entry is simplyaudio/L16without the rate parameter (issue #36).Added a test framework that runs tests with Upmpdcli (a software DLNA MediaRenderer) and MPD on the PulseAudio or Pipewire sound server.
A pdf document is part of the pa-dlna documentation. To access the documentation as a pdf document one must click on the icon at the down-right corner of any page of the documentation on the web. It allows to switch between stable and latest versions and to select the corresponding pdf document.
Fix the development version name as PEP 440 conformant (issue #33).
- Version 0.14
pa-dlna versioning conforms to PEP 440.
Exit with an error message when the
libpulseversion is older than the required one. The required libpulse version is currently0.5.[Upmpdcli] Fix cannot play on
upmpdclitracks whose metadata includes the&character (issue #30).Add the
--clients-uuidscommand line option that may be used as a work around to Wireplumber issue 511 (issue #15).
- Version 0.13
The backtraces of unhandled exceptions that occur in asyncio tasks are logged at the debug log level. Otherwise these exceptions are just logged as an error with a message saying that the backtrace can be obtained by running the program at the debug log level.
[Moode UPNP] Fix libexpat called by
upmpdclifails parsing the DIDL-Lite xml strings (issue #29).
- Version 0.12
Rename LibPulse.get_events() to get_events_iterator(). The change has been introduced by version 0.4 of the libpulse package (issue #26).
Handle exceptions raised while getting the sink after
module-null-sinkhas been loaded.Fix a typo in the installation documentation.
- Version 0.11
Import the libpulse package from Pypi.
Support Python version 3.12 - Fix some network mock tests by forcing the release of control to the asyncio loop.
- Version 0.10
[Teufel 3sixty] Handle HTTP HEAD requests from DLNA devices. Some renderers fetch stream meta data via HEAD request before requesting actual media streams.
Fix crash upon parsing empty deviceList in device description.
- Version 0.9
Support Pipewire version 1.0 and the previous version 0.3.
Log the name of the sound server and its version.
- Version 0.8
Changing the volume level with
pavucontroldoes not interfere with the current audio stream.[Marantz NR1200] Support multiple embedded MediaRenderers in a DLNA device.
The
deviceListattribute of UPnPDevice is now a list instead of a dictionary.Do not age an UPnP root device upon receiving a
CACHE-CONTROLheader with a value set tomax-age=0.
- Version 0.7
Name
libpulsethe Python package, interface to thelibpulselibrary.Document which TCP/UDP ports may not be blocked by a firewall.
Add the
--msearch-portcommand line option.Tests are run in GitLab CI/CD with Pulseaudio and with Pipewire.
Add Docker files to allow running the test suite in Pulseaudio and Pipewire debian containers.
Update the README with package requirements for linux distributions.
The
psutilPython package must be installed now separately as this package is included by many distributions (debian, archlinux, fedora, …).Log the sound server name and version.
- Version 0.6
[Yamaha RN402D] Spread out UPnP SOAP actions that start/stop a stream (issue #16).
Fix the
argsoption in the [EncoderName.UDN] section of the user configuration is always None.Log a warning when the sink-input enters the
suspendedstate.Fix assertion error upon
exitPulseaudio event (issue #14).Support PipeWire. No change is needed to support PipeWire. The test suite runs successfully on PipeWire.
Fix no sound when pa-dlna is started while the track is already playing (issue #13).
Use the built-in libpulse package that uses ctypes to interface with the libpulse library and remove the dependency to
pulsectl_asyncio.Wait for the http server to be ready before starting the renderer task. This also fixes the test_None_nullsink and test_no_path_in_request tests on GitLab CI/CD (issue #12).
Support Python 3.11.
- Version 0.5
Log a warning upon an empty body in the HTTP response from a DLNA device (issue #11).
UPnP discovery is triggered by NICs [1] state changes (issue #10).
Add the
--ip-addresses,-acommand line argument (issue #9).Fix changing the
argsencoder option is ignored (issue #8).
- Version 0.4
sample_formatis a new encoder configuration option (issue #3).The encoders sample format is
s16leexcept for theaudio/l16encoder (issue #7).The encoder command line is now updated with
pa-dlna.confuser configuration (issue #6).Fix the parec command line length keeps increasing at each new track when the encoder is set to track metadata (issue #5).
Fix failing to start a new stream session while the device is still playing when the encoder is set to not track metadata (issue #4).
Fix
pa-dlnahangs when one types <Control-S> in the terminal where the program has been started (issue #2).
- Version 0.3
The test coverage of
pa-dlnais 95%.UPnPControlPoint supports now the context manager protocol, not the asynchronous one.
UPnPControlPoint.get_notification() returns now QUEUE_CLOSED upon closing.
Fix some fatal errors on startup that were silent. Here are the missing error messages that are now printed when one of those fatal errors occurs:
Error: No encoder is available.
Error: The pulseaudio ‘parec’ program cannot be found.
Fix curl: (18) transfer closed with outstanding read data remaining.
Fix a race condition upon the reception of an SSDP msearch response that occurs just after the reception of an SSDP notification and while the instantiation of the root device is not yet complete.
Failure to set SSDP multicast membership is reported only once.
- Version 0.2
Test coverage of the UPnP package is 94%.
Fix unknown UPnPXMLFatalError exception.
The
descriptioncommands ofupnp-cmddon’t prefix tags with a namespace.Fix the
descriptioncommands ofupnp-cmdwhen run with Python 3.8.Fix IndexError exception raised upon OSError in network.Notify.manage_membership().
Fix removing multicast membership when the socket is closed.
Don’t print a stack traceback upon error parsing the configuration file.
Abort on error setting the file logging handler with
--logfile PATH.
- Version 0.1
Publish the project on PyPi.
Footnotes