postlund / pyatv

A client library for Apple TV and AirPlay devices
https://pyatv.dev
MIT License
839 stars 91 forks source link

Add setting to force AirPlay version used by RAOP #2204

Open postlund opened 9 months ago

postlund commented 9 months ago

What to change?

Since AirPlay 2 is broken for some devices but AirPlay 1 seems to work, it would be good to support overriding the version used for AirPlay with a flag.

postlund commented 9 months ago

Once #2206 Is merged, this can be tested more or less like this:

This should force AirPlay to use version 1 instead of 2 in case the latter is supported.

Maztah commented 8 months ago

@postlund I tried to test it with the developer version, following the instructions you mentioned. But it doesn't seem to work.

Content of .pyatv.conf

{"version": 1, "devices": [{"protocols": {"airplay": {"identifier": "F0:2F:4B:0C:E2:21"}, "raop": {"identifier": "F02F4B0CE221"}}}, {"protocols": {"airplay": {"identifier": "48:6B:54:7F:12:47"}, "raop": {"identifier": "486B547F1247", "protocol_version": "1"}}}]}

The debug output:

martinmaxrohling@MBP-von-Martin ~ % /Users/martinmaxrohling/Library/Python/3.9/bin/atvremote -s 192.168.188.25 stream_file=http://mp3.ffh.de/radioffh/hqlivestream.mp3 --debug 2023-10-15 23:45:31 DEBUG [pyatv.scripts]: Running with pyatv 0.14.1 2023-10-15 23:45:31 DEBUG [pyatv.storage.file_storage]: Loading settings from /Users/martinmaxrohling/.pyatv.conf 2023-10-15 23:45:31 DEBUG [pyatv.support.knock]: Knocking at port 3689 on 192.168.188.25 2023-10-15 23:45:31 DEBUG [pyatv.support.knock]: Knocking at port 7000 on 192.168.188.25 2023-10-15 23:45:31 DEBUG [pyatv.support.knock]: Knocking at port 49152 on 192.168.188.25 2023-10-15 23:45:31 DEBUG [pyatv.support.knock]: Knocking at port 32498 on 192.168.188.25 2023-10-15 23:45:32 DEBUG [pyatv.core.scan]: Auto-discovered SOUNDFORM CONNECT at 192.168.188.25:7000 via Protocol.AirPlay ({'acl': '0', 'deviceid': '48:6B:54:7F:12:47', 'features': '0x445F8A00,0x4001C340', 'rsf': '0x0', 'fv': 'p20.4.6.333053', 'flags': '0x404', 'model': 'SOUNDFORM AirPlay2 Adapter', 'manufacturer': 'Belkin International Inc.', 'serialnumber': 'FF9700101845C51603B2FA15', 'protovers': '1.1', 'srcvers': '366.0', 'pi': '48:6B:54:7F:12:47', 'gid': 'FBCD58B8-C867-4E73-9538-D581138F17AD', 'gcgl': '0', 'pk': '0a705c4bc5bc147b65ecff3e524ab68415c095a9984de5bb9596149ec9bc15dc'}) 2023-10-15 23:45:32 DEBUG [pyatv.core.scan]: Auto-discovered 486B547F1247@SOUNDFORM CONNECT at 192.168.188.25:7000 via Protocol.RAOP ({'cn': '0,1', 'da': 'true', 'et': '0,4', 'ft': '0x445F8A00,0x4001C340', 'fv': 'p20.4.6.333053', 'md': '0,1,2', 'am': 'SOUNDFORM AirPlay2 Adapter', 'sf': '0x404', 'tp': 'UDP', 'vn': '65537', 'vs': '366.0', 'pk': '0a705c4bc5bc147b65ecff3e524ab68415c095a9984de5bb9596149ec9bc15dc'}) 2023-10-15 23:45:32 INFO [pyatv.scripts.atvremote]: Auto-discovered SOUNDFORM CONNECT at 192.168.188.25 2023-10-15 23:45:32 DEBUG [pyatv]: Loading settings from FileStorage:/Users/martinmaxrohling/.pyatv.conf 2023-10-15 23:45:32 DEBUG [pyatv.core.facade]: Adding handler for protocol Protocol.AirPlay 2023-10-15 23:45:32 DEBUG [pyatv.protocols.airplay]: Remote control not supported by device 2023-10-15 23:45:32 DEBUG [pyatv.core.facade]: Adding handler for protocol Protocol.RAOP 2023-10-15 23:45:32 DEBUG [pyatv.core.facade]: Connecting to protocol: Protocol.AirPlay 2023-10-15 23:45:32 DEBUG [pyatv.core.facade]: Connected to protocol: Protocol.AirPlay 2023-10-15 23:45:32 DEBUG [pyatv.core.facade]: Connecting to protocol: Protocol.RAOP 2023-10-15 23:45:32 DEBUG [pyatv.core.facade]: Connected to protocol: Protocol.RAOP 2023-10-15 23:45:32 DEBUG [pyatv.core.facade]: Power management not supported by any protocols 2023-10-15 23:45:32 DEBUG [pyatv.core.facade]: Takeover (<class 'pyatv.interface.Audio'>, <class 'pyatv.interface.Metadata'>, <class 'pyatv.interface.PushUpdater'>, <class 'pyatv.interface.RemoteControl'>) by Protocol.RAOP 2023-10-15 23:45:32 DEBUG [pyatv.support.http]: Connected to 192.168.188.25 2023-10-15 23:45:32 DEBUG [pyatv.protocols.raop]: Using AirPlay version AirPlayMajorVersion.AirPlayV1 2023-10-15 23:45:32 DEBUG [pyatv.protocols.raop.stream_client]: Initializing RTSP with encryption=EncryptionType.MFiSAP|Unencrypted, metadata=MetadataType.Progress|Artwork|Text 2023-10-15 23:45:32 DEBUG [pyatv.protocols.raop.stream_client]: Update play settings to 44100/2/16bit 2023-10-15 23:45:32 DEBUG [pyatv.protocols.raop.stream_client]: Local ports: control=52960, timing=50499 2023-10-15 23:45:32 DEBUG [pyatv.support.http]: Sending RTSP/1.0 message: b'GET /info RTSP/1.0\r\nUser-Agent: AirPlay/550.10\r\nCSeq: 0\r\nDACP-ID: 1DC84F0474344F67\r\nActive-Remote: 3524692128\r\nClient-Instance: 1DC84F0474344F67\r\n\r\n' 2023-10-15 23:45:32 DEBUG [pyatv.support.http]: Received: b'RTSP/1.0 200 OK\r\nContent-Length: 601\r\nContent-Type: application/x-apple-binary-plist\r\nServer: AirTunes/366.0\r\nCSeq: 0\r\n\r\nbplist00\xdf\x10\x13\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x19\x1c\x19\x1d\x15\x1e\x1f !"#SsdkRpi_\x10\x10firmwareRevisionVOSInfo\\manufacturer_\x10\x11keepAliveLowPower_\x10\x11firmwareBuildDateUmodel_\x10\x14nameIsFactoryDefault_\x10\x10hardwareRevision_\x10\x18keepAliveSendStatsAsBody[statusFlagsXdeviceIDUbuildWPTPInfo_\x10\x0fprotocolVersion]sourceVersionXfeaturesTname]AirPlay;2.5.0_\x10\x1148:6B:54:7F:12:47Z4.6.333053_\x10\x11Linux 4.9.118 ARM_\x10\x19Belkin International Inc.\t[Oct 20 2021_\x10\x1aSOUNDFORM AirPlay2 AdapterS1.0\x11\x04\x04T36.0_\x10\x11PTP-AirPlay;2.5.0S1.1U366.0\x13@\x01\xc3@D_\x8a\x00_\x10\x11SOUNDFORM CONNECT\x00\x08\x001\x005\x008\x00K\x00R\x00_\x00s\x00\x87\x00\x8d\x00\xa4\x00\xb7\x00\xd2\x00\xde\x00\xe7\x00\xed\x00\xf5\x01\x07\x01\x15\x01\x1e\x01#\x011\x01E\x01P\x01d\x01\x80\x01\x81\x01\x8d\x01\xaa\x01\xae\x01\xb1\x01\xb6\x01\xca\x01\xce\x01\xd4\x01\xdd\x00\x00\x00\x00\x00\x00\x02\x01\x00\x00\x00\x00\x00\x00\x00$\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xf1' 2023-10-15 23:45:32 DEBUG [pyatv.support.http]: Got RTSP response: HttpResponse(protocol='RTSP', version='1.0', code=200, message='OK', headers={'Content-Length': '601', 'Content-Type': 'application/x-apple-binary-plist', 'Server': 'AirTunes/366.0', 'CSeq': '0'}, body=b'bplist00\xdf\x10\x13\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x19\x1c\x19\x1d\x15\x1e\x1f !"#SsdkRpi_\x10\x10firmwareRevisionVOSInfo\\manufacturer_\x10\x11keepAliveLowPower_\x10\x11firmwareBuildDateUmodel_\x10\x14nameIsFactoryDefault_\x10\x10hardwareRevision_\x10\x18keepAliveSendStatsAsBody[statusFlagsXdeviceIDUbuildWPTPInfo_\x10\x0fprotocolVersion]sourceVersionXfeaturesTname]AirPlay;2.5.0_\x10\x1148:6B:54:7F:12:47Z4.6.333053_\x10\x11Linux 4.9.118 ARM_\x10\x19Belkin International Inc.\t[Oct 20 2021_\x10\x1aSOUNDFORM AirPlay2 AdapterS1.0\x11\x04\x04T36.0_\x10\x11PTP-AirPlay;2.5.0S1.1U366.0\x13@\x01\xc3@D_\x8a\x00_\x10\x11SOUNDFORM CONNECT\x00\x08\x001\x005\x008\x00K\x00R\x00_\x00s\x00\x87\x00\x8d\x00\xa4\x00\xb7\x00\xd2\x00\xde\x00\xe7\x00\xed\x00\xf5\x01\x07\x01\x15\x01\x1e\x01#\x011\x01E\x01P\x01d\x01\x80\x01\x81\x01\x8d\x01\xaa\x01\xae\x01\xb1\x01\xb6\x01\xca\x01\xce\x01\xd4\x01\xdd\x00\x00\x00\x00\x00\x00\x02\x01\x00\x00\x00\x00\x00\x00\x00$\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xf1'): 2023-10-15 23:45:32 DEBUG [pyatv.protocols.raop.stream_client]: Updated info parameters to: {'sdk': 'AirPlay;2.5.0', 'pi': '48:6B:54:7F:12:47', 'firmwareRevision': '4.6.333053', 'OSInfo': 'Linux 4.9.118 ARM', 'manufacturer': 'Belkin International Inc.', 'keepAliveLowPower': True, 'firmwareBuildDate': 'Oct 20 2021', 'model': 'SOUNDFORM AirPlay2 Adapter', 'nameIsFactoryDefault': True, 'hardwareRevision': '1.0', 'keepAliveSendStatsAsBody': True, 'statusFlags': 1028, 'deviceID': '48:6B:54:7F:12:47', 'build': '36.0', 'PTPInfo': 'PTP-AirPlay;2.5.0', 'protocolVersion': '1.1', 'sourceVersion': '366.0', 'features': 4612182174196533760, 'name': 'SOUNDFORM CONNECT'} 2023-10-15 23:45:32 DEBUG [pyatv.protocols.airplay.auth]: Setting up new AirPlay Pair-Verify procedure with type AuthenticationType.Transient 2023-10-15 23:45:32 DEBUG [pyatv.support.http]: Sending HTTP/1.1 message: b'POST /pair-pin-start HTTP/1.1\r\nUser-Agent: AirPlay/320.20\r\nConnection: keep-alive\r\nX-Apple-HKP: 4\r\nContent-Type: application/octet-stream\r\n\r\n' 2023-10-15 23:45:32 DEBUG [pyatv.support.http]: Received: b'HTTP/1.1 200 OK\r\nServer: AirTunes/366.0\r\n\r\n' 2023-10-15 23:45:32 DEBUG [pyatv.support.http]: Got HTTP response: HttpResponse(protocol='HTTP', version='1.1', code=200, message='OK', headers={'Server': 'AirTunes/366.0'}, body=''): 2023-10-15 23:45:32 DEBUG [pyatv.support.http]: Sending HTTP/1.1 message: b'POST /pair-setup HTTP/1.1\r\nContent-Length: 9\r\nUser-Agent: AirPlay/320.20\r\nConnection: keep-alive\r\nX-Apple-HKP: 4\r\nContent-Type: application/octet-stream\r\n\r\n\x00\x01\x00\x06\x01\x01\x13\x01\x10' 2023-10-15 23:45:32 DEBUG [pyatv.support.http]: Received: b'HTTP/1.1 200 OK\r\nContent-Length: 409\r\nContent-Type: application/octet-stream\r\nServer: AirTunes/366.0\r\n\r\n\x06\x01\x02\x02\x10\xd4\xf5\xb6\x88\\\x1a\xf0^\x83\xbf\xaf6OC\x8eR\x03\xff\xa4^\xd0(\x16z(\xd0t8\x1f\xde\r\xf6\x03\x00\x9d\tyb\x06P"\x11\xd7\x1c9#&\x87\x83JZnt.f\xeb\x80\x86\xc0\xe06\x00!\x08d\x93T1\x0f\xc3\xd9\x0e\x9aPb\xfb\x19\xe8j\x9dtBso\x16\xd9\xb5\x85\xefu;\xa4\xea\x8ef\xc2@K\x08\xfb!\x8eL\xd1\x02\xb3\x02\x07\xa10x\xd1\xec\x9f\xd8DpB\xb0h\xfe\x01^I\xaeV\x1e\xf8g#\xfe4\xa5?W\xc9\xce^\xfcT\xc1x\xfa\xb9\x1d\x92\x99\xf5\xac"\xd8d\xdc\x10\x17*\xb9m\xef\x03F[\x1f%\xb0\x9f\xd6\xae\x83\x86\x11u\xd2Q\x1bu\x19\xe9\xa9(~\xa3\x1d\xc9\x06\xdf>U\xcc\xf3O\xd6\xee\x84%\x0f\x00f\xc9\x0ct\x99O\xfa\x89\xaa\xbaptG\xed"L\xfc\x97\x15\xf6\x0f\xe1L;}M.\xf1\x10R\xfc\xcff\x9aw\xdaT\x10z,\xd0\xeb\xb5\xbc\x9d\x05O\x1c\xe1\xfbz\x9a\xaf\xfb\x96\x97\xbc\xb0:y@v\xf9\xb4\xe1x\xe8\xc4\x85\xff\x81\xad\x13\xe8A\xab\x03\x81 \x0fR\xf3\xf2bRALw0\x82\x87\xf6MX\xa4";\x04d\xb3\xce\xe1\xe9x\x9fCE\xc9\xeb\xedw\x01%jDd\xaf\x0c\xce\xf9}\xd0Z\x81;\xf8\xa2$HK\x8d\xd4\xdc\xd3\xfd\xfc[=b\x0c\x1f{\xe6"\n\x0en\x1e\x1d\xe9\x0e\xe6x\x8b\xc5\xa1\xf3\xd5\x8cz@x0\xf0\x8b\xc19\xa5\xa3\xa0\x03\x00\xb4\'\x936C\x97\xdfz\xad\x85\x07\xb4T\xc5\x05\xe3\xee\x03nB\xf6j\xf5pl.t\xd5\xc4KC\xa4\xbe:_' 2023-10-15 23:45:32 DEBUG [pyatv.support.http]: Got HTTP response: HttpResponse(protocol='HTTP', version='1.1', code=200, message='OK', headers={'Content-Length': '409', 'Content-Type': 'application/octet-stream', 'Server': 'AirTunes/366.0'}, body=b'\x06\x01\x02\x02\x10\xd4\xf5\xb6\x88\\\x1a\xf0^\x83\xbf\xaf6OC\x8eR\x03\xff\xa4^\xd0(\x16z(\xd0t8\x1f\xde\r\xf6\x03\x00\x9d\tyb\x06P"\x11\xd7\x1c9#&\x87\x83JZnt.f\xeb\x80\x86\xc0\xe06\x00!\x08d\x93T1\x0f\xc3\xd9\x0e\x9aPb\xfb\x19\xe8j\x9dtBso\x16\xd9\xb5\x85\xefu;\xa4\xea\x8ef\xc2@K\x08\xfb!\x8eL\xd1\x02\xb3\x02\x07\xa10x\xd1\xec\x9f\xd8DpB\xb0h\xfe\x01^I\xaeV\x1e\xf8g#\xfe4\xa5?W\xc9\xce^\xfcT\xc1x\xfa\xb9\x1d\x92\x99\xf5\xac"\xd8d\xdc\x10\x17*\xb9m\xef\x03F[\x1f%\xb0\x9f\xd6\xae\x83\x86\x11u\xd2Q\x1bu\x19\xe9\xa9(~\xa3\x1d\xc9\x06\xdf>U\xcc\xf3O\xd6\xee\x84%\x0f\x00f\xc9\x0ct\x99O\xfa\x89\xaa\xbaptG\xed"L\xfc\x97\x15\xf6\x0f\xe1L;}M.\xf1\x10R\xfc\xcff\x9aw\xdaT\x10z,\xd0\xeb\xb5\xbc\x9d\x05O\x1c\xe1\xfbz\x9a\xaf\xfb\x96\x97\xbc\xb0:y@v\xf9\xb4\xe1x\xe8\xc4\x85\xff\x81\xad\x13\xe8A\xab\x03\x81 \x0fR\xf3\xf2bRALw0\x82\x87\xf6MX\xa4";\x04d\xb3\xce\xe1\xe9x\x9fCE\xc9\xeb\xedw\x01%jDd\xaf\x0c\xce\xf9}\xd0Z\x81;\xf8\xa2$HK\x8d\xd4\xdc\xd3\xfd\xfc[=b\x0c\x1f{\xe6"\n\x0en\x1e\x1d\xe9\x0e\xe6x\x8b\xc5\xa1\xf3\xd5\x8cz@x0\xf0\x8b\xc19\xa5\xa3\xa0\x03\x00\xb4\'\x936C\x97\xdfz\xad\x85\x07\xb4T\xc5\x05\xe3\xee\x03nB\xf6j\xf5pl.t\xd5\xc4KC\xa4\xbe:_'): 2023-10-15 23:45:32 DEBUG [pyatv.auth.hap_srp]: Client (Proof=40929f533d84d7c14e66d270ed77d28282187cbd073aa67859651da26b459a14e72e251a1848f174a2fa0c05a7e3068dbeea695903e900ba0431d7a58d71580b, Public=86ca18b75e960f3dcedc7c7b361a3b2eff930bd7c3a63190cdcde4abf9730aad439dd6978489aff755c56fc81676681e791a50418dd0c798765a4cca12c7a794b5ee2b46ef6b4e19b045514c66e99cca66ad4c84ee53786482ad0969131512881c80c05269626bc1dc476d55b9f3484447928ba60e35a68f77851cce90987ec3617dba994fa1476954939b76b89744034ed053cba308f6f7edf78f1f68583575c552bc296001196a8594700b9e2ca26af01ad75ed8a0548ed1bf3a50847ca102f4b159425995933138084b83c89e28459bfb4cdf4970ca0c04d8449d84d186e5a0ae3970961c4f2546f81ea83193325c5748567725baf4ee089347d193489...) 2023-10-15 23:45:32 DEBUG [pyatv.support.http]: Sending HTTP/1.1 message: b'POST /pair-setup HTTP/1.1\r\nContent-Length: 457\r\nUser-Agent: AirPlay/320.20\r\nConnection: keep-alive\r\nX-Apple-HKP: 4\r\nContent-Type: application/octet-stream\r\n\r\n\x06\x01\x03\x03\xff\x86\xca\x18\xb7^\x96\x0f=\xce\xdc|{6\x1a;.\xff\x93\x0b\xd7\xc3\xa61\x90\xcd\xcd\xe4\xab\xf9s\n\xadC\x9d\xd6\x97\x84\x89\xaf\xf7U\xc5o\xc8\x16vh\x1ey\x1aPA\x8d\xd0\xc7\x98vZL\xca\x12\xc7\xa7\x94\xb5\xee+F\xefkN\x19\xb0EQLf\xe9\x9c\xcaf\xadL\x84\xeeSxd\x82\xad\ti\x13\x15\x12\x88\x1c\x80\xc0Ribk\xc1\xdcGmU\xb9\xf3HDG\x92\x8b\xa6\x0e5\xa6\x8fw\x85\x1c\xce\x90\x98~\xc3a}\xba\x99O\xa1GiT\x93\x9bv\xb8\x97D\x03N\xd0S\xcb\xa3\x08\xf6\xf7\xed\xf7\x8f\x1fhX5u\xc5R\xbc)\x01\x19j\x85\x94p\x0b\x9e,\xa2j\xf0\x1a\xd7^\xd8\xa0T\x8e\xd1\xbf:P\x84|\xa1\x02\xf4\xb1YBY\x95\x9318\x08K\x83\xc8\x9e(E\x9b\xfbL\xdfIp\xca\x0c\x04\xd8D\x9d\x84\xd1\x86\xe5\xa0\xae9p\x96\x1cO%F\xf8\x1e\xa81\x932\WHVw%\xba\xf4\xee\x08\x93G\xd1\x93H\x93\x03\x81^\xcc\xc2\xe1R\x97\xdb\xfe\x82\x19B\xb1a\xfb\x14m&\x84\x89n\x89\x15\xd3\n$\xd5\xa1g\xcb\xe5"\xcd\xa3r\xd2\x97)\xe8\xc0L\x0b\xae-\xc6\xb7O\xd9\xa4\x87\xfb5\x8bQ\x85y\xda:\x8e\xbc\xa9\x0c\xd2J\xf3\x0c\x86"\xd4\x17m3z\xf5\xa7\xbacq\xdbBl\xb4\xbe:\x83(\xfd^\x19\x18rn\x87\x85`r\xbf6\x0fA\xd4\x11\xe2\x91\xfe\x1e\x80y\x96\x0b\xb7\xce\xec\x85\xb5\xe3\xe1\xca\xc3\xf9\x15\xce\xdf\x84!E\xee\xc3F\xc0\x04@@\x92\x9fS=\x84\xd7\xc1Nf\xd2p\xedw\xd2\x82\x82\x18|\xbd\x07:\xa6xYe\x1d\xa2kE\x9a\x14\xe7.%\x1a\x18H\xf1t\xa2\xfa\x0c\x05\xa7\xe3\x06\x8d\xbe\xeaiY\x03\xe9\x00\xba\x041\xd7\xa5\x8dqX\x0b' 2023-10-15 23:45:32 DEBUG [pyatv.support.http]: Received: b'HTTP/1.1 200 OK\r\nContent-Length: 69\r\nContent-Type: application/octet-stream\r\nServer: AirTunes/366.0\r\n\r\n\x06\x01\x04\x04@o\t\xb6\xb8\x9d\x0b\xe1\x9a]f\xf8\x84\xf7\xee)\xf6\x9b\x88\xa9\x9f\x08\x18\x9d\xf6\xbb\xfd(\x99\xba\x03\xb1\xd2P\x81\x93\x1e\x8f\xca\x8d\x08\xf8\x9d\x1a\xf8\xd1y\xd2\xfbQ\x89\xe9%\xd4Q\xb9\xe7\x8e#=\x02\xe2q\xe7' 2023-10-15 23:45:32 DEBUG [pyatv.support.http]: Got HTTP response: HttpResponse(protocol='HTTP', version='1.1', code=200, message='OK', headers={'Content-Length': '69', 'Content-Type': 'application/octet-stream', 'Server': 'AirTunes/366.0'}, body=b'\x06\x01\x04\x04@o\t\xb6\xb8\x9d\x0b\xe1\x9a]f\xf8\x84\xf7\xee)\xf6\x9b\x88\xa9\x9f\x08\x18\x9d\xf6\xbb\xfd(\x99\xba\x03\xb1\xd2P\x81\x93\x1e\x8f\xca\x8d\x08\xf8\x9d\x1a\xf8\xd1y\xd2\xfbQ\x89\xe9%\xd4Q\xb9\xe7\x8e#=\x02\xe2q\xe7'): 2023-10-15 23:45:32 DEBUG [pyatv.support.http]: Sending RTSP/1.0 message: b'ANNOUNCE rtsp://192.168.188.35/3205591886 RTSP/1.0\r\nUser-Agent: AirPlay/550.10\r\nContent-Type: application/sdp\r\nContent-Length: 184\r\nCSeq: 1\r\nDACP-ID: 1DC84F0474344F67\r\nActive-Remote: 3524692128\r\nClient-Instance: 1DC84F0474344F67\r\n\r\nv=0\r\no=iTunes 3205591886 0 IN IP4 192.168.188.35\r\ns=iTunes\r\nc=IN IP4 192.168.188.25\r\nt=0 0\r\nm=audio 0 RTP/AVP 96\r\na=rtpmap:96 L16/44100/2\r\na=fmtp:96 352 0 16 40 10 14 2 255 0 0 44100\r\n' 2023-10-15 23:45:32 DEBUG [pyatv.support.http]: Connection closed 2023-10-15 23:45:32 DEBUG [pyatv.core.facade]: Release (<class 'pyatv.interface.Audio'>, <class 'pyatv.interface.Metadata'>, <class 'pyatv.interface.PushUpdater'>, <class 'pyatv.interface.RemoteControl'>) by Protocol.RAOP 2023-10-15 23:45:32 DEBUG [pyatv.scripts.atvremote]: Waiting for 0 remaining tasks 2023-10-15 23:45:32 DEBUG [pyatv.protocols.raop.stream_client]: Control connection lost (None) Traceback (most recent call last): File "/Users/martinmaxrohling/Library/Python/3.9/lib/python/site-packages/pyatv/scripts/atvremote.py", line 978, in _run_application return await cli_handler(loop) File "/Users/martinmaxrohling/Library/Python/3.9/lib/python/site-packages/pyatv/scripts/atvremote.py", line 723, in cli_handler return await _handle_commands(args, config, storage, loop) File "/Users/martinmaxrohling/Library/Python/3.9/lib/python/site-packages/pyatv/scripts/atvremote.py", line 862, in _handle_commands ret = await _handle_device_command(args, cmd, atv, storage, loop) File "/Users/martinmaxrohling/Library/Python/3.9/lib/python/site-packages/pyatv/scripts/atvremote.py", line 916, in _handle_device_command return await _exec_command(atv.stream, cmd, True, cmd_args) File "/Users/martinmaxrohling/Library/Python/3.9/lib/python/site-packages/pyatv/scripts/atvremote.py", line 945, in _exec_command value = await tmp(args) File "/Users/martinmaxrohling/Library/Python/3.9/lib/python/site-packages/pyatv/core/facade.py", line 371, in stream_file await self.relay("stream_file")( File "/Users/martinmaxrohling/Library/Python/3.9/lib/python/site-packages/pyatv/protocols/raop/init.py", line 356, in stream_file await client.initialize(self.core.service.properties) File "/Users/martinmaxrohling/Library/Python/3.9/lib/python/site-packages/pyatv/protocols/raop/stream_client.py", line 337, in initialize await self._protocol.setup(self.timing_server.port, self.control_client.port) File "/Users/martinmaxrohling/Library/Python/3.9/lib/python/site-packages/pyatv/protocols/raop/protocols/airplayv1.py", line 51, in setup await self.rtsp.announce( File "/Users/martinmaxrohling/Library/Python/3.9/lib/python/site-packages/pyatv/support/rtsp.py", line 148, in announce response = await self.exchange( File "/Users/martinmaxrohling/Library/Python/3.9/lib/python/site-packages/pyatv/support/rtsp.py", line 293, in exchange resp = await self.connection.send_and_receive( File "/Users/martinmaxrohling/Library/Python/3.9/lib/python/site-packages/pyatv/support/http.py", line 466, in send_and_receive raise exceptions.ConnectionLostError("connection was lost") pyatv.exceptions.ConnectionLostError: connection was lost

An error occurred, full stack trace above `