denonavr 0.11.2__py3-none-any.whl → 0.11.6__py3-none-any.whl

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.
denonavr/tonecontrol.py CHANGED
@@ -9,7 +9,8 @@ This module implements the handler for state of Denon AVR receivers.
9
9
 
10
10
  import logging
11
11
  import time
12
- from typing import Hashable, Optional
12
+ from collections.abc import Hashable
13
+ from typing import Optional
13
14
 
14
15
  import attr
15
16
 
@@ -68,14 +69,14 @@ class DenonAVRToneControl(DenonAVRFoundation):
68
69
  return
69
70
 
70
71
  if parameter[0:3] == "BAS":
71
- self._bass = int(parameter[4:])
72
- self._bass_level = "{}dB".format(self._bass - 50)
72
+ self._bass = int(parameter[4:]) - 44
73
+ self._bass_level = f"{int(parameter[4:]) - 50}dB"
73
74
  elif parameter[0:3] == "TRE":
74
- self._treble = int(parameter[4:])
75
- self._treble_level = "{}dB".format(self._treble - 50)
75
+ self._treble = int(parameter[4:]) - 44
76
+ self._treble_level = f"{int(parameter[4:]) - 50}dB"
76
77
  elif parameter == "TONE CTRL OFF":
77
78
  self._tone_control_adjust = False
78
- self._tone_control_status = False
79
+ self._tone_control_status = True
79
80
  elif parameter == "TONE CTRL ON":
80
81
  self._tone_control_adjust = True
81
82
  self._tone_control_status = True
@@ -85,7 +86,7 @@ class DenonAVRToneControl(DenonAVRFoundation):
85
86
  ) -> None:
86
87
  """Update volume asynchronously."""
87
88
  # Ensure instance is setup before updating
88
- if self._is_setup is False:
89
+ if not self._is_setup:
89
90
  self.setup()
90
91
 
91
92
  # Update state
@@ -97,20 +98,19 @@ class DenonAVRToneControl(DenonAVRFoundation):
97
98
  self, global_update: bool = False, cache_id: Optional[Hashable] = None
98
99
  ):
99
100
  """Update tone control status of device."""
100
- if self._device.use_avr_2016_update is True:
101
+ if self._device.use_avr_2016_update is None:
102
+ raise AvrProcessingError(
103
+ "Device is not setup correctly, update method not set"
104
+ )
105
+
106
+ # Tone control is only available for avr 2016 update
107
+ if self._device.use_avr_2016_update:
101
108
  await self.async_update_attrs_appcommand(
102
109
  self.appcommand_attrs,
103
110
  global_update=global_update,
104
111
  cache_id=cache_id,
105
112
  ignore_missing_response=True,
106
113
  )
107
- elif self._device.use_avr_2016_update is False:
108
- # Not available
109
- pass
110
- else:
111
- raise AvrProcessingError(
112
- "Device is not setup correctly, update method not set"
113
- )
114
114
 
115
115
  async def async_set_tone_control_command(
116
116
  self, parameter_type: str, value: int
@@ -129,6 +129,16 @@ class DenonAVRToneControl(DenonAVRFoundation):
129
129
  ##############
130
130
  # Properties #
131
131
  ##############
132
+ @property
133
+ def tone_control_status(self) -> Optional[bool]:
134
+ """Return value of tone control status."""
135
+ return self._tone_control_status
136
+
137
+ @property
138
+ def tone_control_adjust(self) -> Optional[bool]:
139
+ """Return value of tone control adjust."""
140
+ return self._tone_control_adjust
141
+
132
142
  @property
133
143
  def bass(self) -> Optional[int]:
134
144
  """Return value of bass."""
@@ -154,21 +164,28 @@ class DenonAVRToneControl(DenonAVRFoundation):
154
164
  ##########
155
165
  async def async_enable_tone_control(self) -> None:
156
166
  """Enable tone control to change settings like bass or treble."""
157
- if self._tone_control_status is False:
167
+ if self._tone_control_status is None:
158
168
  raise AvrCommandError(
159
169
  "Cannot enable tone control, Dynamic EQ must be deactivated"
160
170
  )
161
171
 
162
- await self.async_set_tone_control_command("adjust", 1)
172
+ if self._device.telnet_available:
173
+ telnet_command = self._device.telnet_commands.command_tonecontrol + "ON"
174
+ await self._device.telnet_api.async_send_commands(telnet_command)
175
+ else:
176
+ await self.async_set_tone_control_command("adjust", 1)
163
177
 
164
178
  async def async_disable_tone_control(self) -> None:
165
179
  """Disable tone control to change settings like bass or treble."""
166
- if self._tone_control_status is False:
180
+ if self._tone_control_status is None:
167
181
  raise AvrCommandError(
168
182
  "Cannot disable tone control, Dynamic EQ must be deactivated"
169
183
  )
170
-
171
- await self.async_set_tone_control_command("adjust", 0)
184
+ if self._device.telnet_available:
185
+ telnet_command = self._device.telnet_commands.command_tonecontrol + "OFF"
186
+ await self._device.telnet_api.async_send_commands(telnet_command)
187
+ else:
188
+ await self.async_set_tone_control_command("adjust", 0)
172
189
 
173
190
  async def async_set_bass(self, value: int) -> None:
174
191
  """
@@ -181,8 +198,14 @@ class DenonAVRToneControl(DenonAVRFoundation):
181
198
  """
182
199
  if value < 0 or value > 12:
183
200
  raise AvrCommandError("Invalid value for bass")
184
- await self.async_enable_tone_control()
185
- await self.async_set_tone_control_command("bassvalue", value)
201
+ if self._device.telnet_available:
202
+ if not self.tone_control_adjust:
203
+ await self.async_enable_tone_control()
204
+ telnet_command = self._device.telnet_commands.command_bass + str(value + 44)
205
+ await self._device.telnet_api.async_send_commands(telnet_command)
206
+ else:
207
+ await self.async_enable_tone_control()
208
+ await self.async_set_tone_control_command("bassvalue", value)
186
209
 
187
210
  async def async_bass_up(self) -> None:
188
211
  """
@@ -193,9 +216,15 @@ class DenonAVRToneControl(DenonAVRFoundation):
193
216
  """
194
217
  if self.bass == 12:
195
218
  return
196
- await self.async_enable_tone_control()
197
- await self.async_set_tone_control_command("bassvalue", self.bass + 1)
198
- await self.async_update()
219
+ if self._device.telnet_available:
220
+ if not self.tone_control_adjust:
221
+ await self.async_enable_tone_control()
222
+ telnet_command = self._device.telnet_commands.command_bass + "UP"
223
+ await self._device.telnet_api.async_send_commands(telnet_command)
224
+ else:
225
+ await self.async_enable_tone_control()
226
+ await self.async_set_tone_control_command("bassvalue", self.bass + 1)
227
+ await self.async_update()
199
228
 
200
229
  async def async_bass_down(self) -> None:
201
230
  """
@@ -206,9 +235,15 @@ class DenonAVRToneControl(DenonAVRFoundation):
206
235
  """
207
236
  if self.bass == 0:
208
237
  return
209
- await self.async_enable_tone_control()
210
- await self.async_set_tone_control_command("bassvalue", self.bass - 1)
211
- await self.async_update()
238
+ if self._device.telnet_available:
239
+ if not self.tone_control_adjust:
240
+ await self.async_enable_tone_control()
241
+ telnet_command = self._device.telnet_commands.command_bass + "DOWN"
242
+ await self._device.telnet_api.async_send_commands(telnet_command)
243
+ else:
244
+ await self.async_enable_tone_control()
245
+ await self.async_set_tone_control_command("bassvalue", self.bass - 1)
246
+ await self.async_update()
212
247
 
213
248
  async def async_set_treble(self, value: int) -> None:
214
249
  """
@@ -221,8 +256,16 @@ class DenonAVRToneControl(DenonAVRFoundation):
221
256
  """
222
257
  if value < 0 or value > 12:
223
258
  raise AvrCommandError("Invalid value for treble")
224
- await self.async_enable_tone_control()
225
- await self.async_set_tone_control_command("treblevalue", value)
259
+ if self._device.telnet_available:
260
+ if not self.tone_control_adjust:
261
+ await self.async_enable_tone_control()
262
+ telnet_command = self._device.telnet_commands.command_treble + str(
263
+ value + 44
264
+ )
265
+ await self._device.telnet_api.async_send_commands(telnet_command)
266
+ else:
267
+ await self.async_enable_tone_control()
268
+ await self.async_set_tone_control_command("treblevalue", value)
226
269
 
227
270
  async def async_treble_up(self) -> None:
228
271
  """
@@ -233,9 +276,15 @@ class DenonAVRToneControl(DenonAVRFoundation):
233
276
  """
234
277
  if self.treble == 12:
235
278
  return
236
- await self.async_enable_tone_control()
237
- await self.async_set_tone_control_command("treblevalue", self.treble + 1)
238
- await self.async_update()
279
+ if self._device.telnet_available:
280
+ if not self.tone_control_adjust:
281
+ await self.async_enable_tone_control()
282
+ telnet_command = self._device.telnet_commands.command_treble + "UP"
283
+ await self._device.telnet_api.async_send_commands(telnet_command)
284
+ else:
285
+ await self.async_enable_tone_control()
286
+ await self.async_set_tone_control_command("treblevalue", self.treble + 1)
287
+ await self.async_update()
239
288
 
240
289
  async def async_treble_down(self) -> None:
241
290
  """
@@ -246,9 +295,15 @@ class DenonAVRToneControl(DenonAVRFoundation):
246
295
  """
247
296
  if self.treble == 0:
248
297
  return
249
- await self.async_enable_tone_control()
250
- await self.async_set_tone_control_command("treblevalue", self.treble - 1)
251
- await self.async_update()
298
+ if self._device.telnet_available:
299
+ if not self.tone_control_adjust:
300
+ await self.async_enable_tone_control()
301
+ telnet_command = self._device.telnet_commands.command_treble + "DOWN"
302
+ await self._device.telnet_api.async_send_commands(telnet_command)
303
+ else:
304
+ await self.async_enable_tone_control()
305
+ await self.async_set_tone_control_command("treblevalue", self.treble - 1)
306
+ await self.async_update()
252
307
 
253
308
 
254
309
  def tone_control_factory(instance: DenonAVRFoundation) -> DenonAVRToneControl:
denonavr/volume.py CHANGED
@@ -8,7 +8,8 @@ This module implements the handler for volume of Denon AVR receivers.
8
8
  """
9
9
 
10
10
  import logging
11
- from typing import Hashable, Optional, Union
11
+ from collections.abc import Hashable
12
+ from typing import Optional, Union
12
13
 
13
14
  import attr
14
15
 
@@ -89,7 +90,7 @@ class DenonAVRVolume(DenonAVRFoundation):
89
90
  ) -> None:
90
91
  """Update volume asynchronously."""
91
92
  # Ensure instance is setup before updating
92
- if self._is_setup is False:
93
+ if not self._is_setup:
93
94
  self.setup()
94
95
 
95
96
  # Update state
@@ -99,21 +100,22 @@ class DenonAVRVolume(DenonAVRFoundation):
99
100
  self, global_update: bool = False, cache_id: Optional[Hashable] = None
100
101
  ):
101
102
  """Update volume status of device."""
102
- if self._device.use_avr_2016_update is True:
103
+ if self._device.use_avr_2016_update is None:
104
+ raise AvrProcessingError(
105
+ "Device is not setup correctly, update method not set"
106
+ )
107
+
108
+ if self._device.use_avr_2016_update:
103
109
  await self.async_update_attrs_appcommand(
104
110
  self.appcommand_attrs, global_update=global_update, cache_id=cache_id
105
111
  )
106
- elif self._device.use_avr_2016_update is False:
112
+ else:
107
113
  urls = [self._device.urls.status]
108
114
  if self._device.zone == MAIN_ZONE:
109
115
  urls.append(self._device.urls.mainzone)
110
116
  await self.async_update_attrs_status_xml(
111
117
  self.status_xml_attrs, urls, cache_id=cache_id
112
118
  )
113
- else:
114
- raise AvrProcessingError(
115
- "Device is not setup correctly, update method not set"
116
- )
117
119
 
118
120
  ##############
119
121
  # Properties #
@@ -142,11 +144,25 @@ class DenonAVRVolume(DenonAVRFoundation):
142
144
  ##########
143
145
  async def async_volume_up(self) -> None:
144
146
  """Volume up receiver via HTTP get command."""
145
- await self._device.api.async_get_command(self._device.urls.command_volume_up)
147
+ if self._device.telnet_available:
148
+ await self._device.telnet_api.async_send_commands(
149
+ self._device.telnet_commands.command_volume_up
150
+ )
151
+ else:
152
+ await self._device.api.async_get_command(
153
+ self._device.urls.command_volume_up
154
+ )
146
155
 
147
156
  async def async_volume_down(self) -> None:
148
157
  """Volume down receiver via HTTP get command."""
149
- await self._device.api.async_get_command(self._device.urls.command_volume_down)
158
+ if self._device.telnet_available:
159
+ await self._device.telnet_api.async_send_commands(
160
+ self._device.telnet_commands.command_volume_down
161
+ )
162
+ else:
163
+ await self._device.api.async_get_command(
164
+ self._device.urls.command_volume_down
165
+ )
150
166
 
151
167
  async def async_set_volume(self, volume: float) -> None:
152
168
  """
@@ -156,21 +172,41 @@ class DenonAVRVolume(DenonAVRFoundation):
156
172
  Minimum is -80.0, maximum at 18.0
157
173
  """
158
174
  if volume < -80 or volume > 18:
159
- raise AvrCommandError("Invalid volume: {}".format(volume))
175
+ raise AvrCommandError(f"Invalid volume: {volume}")
160
176
 
161
177
  # Round volume because only values which are a multi of 0.5 are working
162
178
  volume = round(volume * 2) / 2.0
163
-
164
- await self._device.api.async_get_command(
165
- self._device.urls.command_set_volume.format(volume=volume)
166
- )
179
+ if self._device.telnet_available:
180
+ await self._device.telnet_api.async_send_commands(
181
+ self._device.telnet_commands.command_set_volume.format(
182
+ volume=int(volume + 80)
183
+ )
184
+ )
185
+ else:
186
+ await self._device.api.async_get_command(
187
+ self._device.urls.command_set_volume.format(volume=volume)
188
+ )
167
189
 
168
190
  async def async_mute(self, mute: bool) -> None:
169
191
  """Mute receiver via HTTP get command."""
170
192
  if mute:
171
- await self._device.api.async_get_command(self._device.urls.command_mute_on)
193
+ if self._device.telnet_available:
194
+ await self._device.telnet_api.async_send_commands(
195
+ self._device.telnet_commands.command_mute_on
196
+ )
197
+ else:
198
+ await self._device.api.async_get_command(
199
+ self._device.urls.command_mute_on
200
+ )
172
201
  else:
173
- await self._device.api.async_get_command(self._device.urls.command_mute_off)
202
+ if self._device.telnet_available:
203
+ await self._device.telnet_api.async_send_commands(
204
+ self._device.telnet_commands.command_mute_off
205
+ )
206
+ else:
207
+ await self._device.api.async_get_command(
208
+ self._device.urls.command_mute_off
209
+ )
174
210
 
175
211
 
176
212
  def volume_factory(instance: DenonAVRFoundation) -> DenonAVRVolume:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: denonavr
3
- Version: 0.11.2
3
+ Version: 0.11.6
4
4
  Summary: Automation Library for Denon AVR receivers
5
5
  Author-email: Oliver Goetz <scarface@mywoh.de>
6
6
  License: MIT
@@ -19,15 +19,17 @@ Classifier: Programming Language :: Python :: 3.8
19
19
  Classifier: Programming Language :: Python :: 3.9
20
20
  Classifier: Programming Language :: Python :: 3.10
21
21
  Classifier: Programming Language :: Python :: 3.11
22
+ Classifier: Programming Language :: Python :: 3.12
22
23
  Requires-Python: >=3.7
23
24
  Description-Content-Type: text/markdown; charset=UTF-8
24
25
  License-File: LICENSE
25
- Requires-Dist: asyncstdlib (>=3.10.2)
26
- Requires-Dist: attrs (>=21.2.0)
27
- Requires-Dist: defusedxml (>=0.7.1)
28
- Requires-Dist: httpx (>=0.23.1)
29
- Requires-Dist: netifaces (>=0.11.0)
30
- Requires-Dist: async-timeout (>=4.0.2) ; python_version < "3.11"
26
+ Requires-Dist: asyncstdlib >=3.10.2
27
+ Requires-Dist: attrs >=21.2.0
28
+ Requires-Dist: defusedxml >=0.7.1
29
+ Requires-Dist: ftfy >=6.1.1
30
+ Requires-Dist: httpx >=0.23.1
31
+ Requires-Dist: netifaces >=0.11.0
32
+ Requires-Dist: async-timeout >=4.0.2 ; python_version < "3.11"
31
33
  Provides-Extra: testing
32
34
  Requires-Dist: pydocstyle ; extra == 'testing'
33
35
  Requires-Dist: pylint ; extra == 'testing'
@@ -58,7 +60,7 @@ In addition to retrieving the current device status via HTTP calls, this version
58
60
 
59
61
  As of version 0.10.0 and newer, the `denonavr` library has switched to using`async` methods to interact with Denon receivers.
60
62
 
61
- Legacy synchronous methods are still availlable to avoid breaking existing implementations, but may be deprecated in the future. Switching to `async` methods is recommended. The existing sync methods are inefficient because they use the corresponding async methods by starting and stopping its own `asyncio` loop for each command.
63
+ Legacy synchronous methods are still available to avoid breaking existing implementations, but may be deprecated in the future. Switching to `async` methods is recommended. The existing sync methods are inefficient because they use the corresponding async methods by starting and stopping its own `asyncio` loop for each command.
62
64
 
63
65
  ### Other changes:
64
66
 
@@ -129,8 +131,8 @@ The `asyncio` library should automatically be imported in the REPL. Import the
129
131
  ```
130
132
  ### Sound
131
133
  ```
132
- >>> await d.async_mute_on(True)
133
- >>> await d.async_mute_off(False)
134
+ >>> await d.async_mute(True)
135
+ >>> await d.async_mute(False)
134
136
  ```
135
137
 
136
138
  ### Other methods
@@ -284,5 +286,5 @@ MIT
284
286
  @bdraco: https://github.com/bdraco
285
287
 
286
288
  ## Users
287
- Home Assistant: https://github.com/home-assistant/home-assistant/
289
+ Home Assistant: https://github.com/home-assistant/home-assistant/
288
290
  denonavr-cli: https://pypi.org/project/denonavr-cli/
@@ -0,0 +1,19 @@
1
+ denonavr/__init__.py,sha256=-divkN4DxZpILQgRgqab1PE7GszFDjdkCdy7aCI63nw,2035
2
+ denonavr/api.py,sha256=8s_TXeUidCDh4wzgbibOaJjZ1Nba5pcbGmKyLhL1m9s,28671
3
+ denonavr/appcommand.py,sha256=H37VK4n-yW0ISvR1hfX8G4udQtGASoY44QNaXtLSidE,7784
4
+ denonavr/audyssey.py,sha256=tbfOerXxjv6l3TAJ4zMBn08UPNqx-tVJEpDhwyYZ3iw,10797
5
+ denonavr/const.py,sha256=7jXrdTrqSrRJsYf_twqersNtdGx6odiMSsCajIHfsPA,17458
6
+ denonavr/decorators.py,sha256=j1Icyfw64LPLD67H2yd9nbREbTvicqG-kAxawfgvXuE,5062
7
+ denonavr/denonavr.py,sha256=hnsYJiVSXD9qaYr6mjlwkQL3I8NrbXXfAo8uWT35HBU,28159
8
+ denonavr/exceptions.py,sha256=naP7MCuNH98rv7y_lDdO7ayyvQGywnsfpHhW-o9tKeo,1725
9
+ denonavr/foundation.py,sha256=lCPxcbpbjbUCSNquNjaW5RXHQXdSR7Q0O8og2hcPXOY,27911
10
+ denonavr/input.py,sha256=kkswPrMiys1Qq7YWfwrveB-w2aaTgXAkkBa05rolbOA,41085
11
+ denonavr/soundmode.py,sha256=G36Nmf6lTe8Ku6sQ-2nDYHjmSjrnNr9l4wq3-B45I1g,11737
12
+ denonavr/ssdp.py,sha256=4gyvN0yo9qSnJ7l6iJmSC_5qW45Fq2Tt2RACpxFMSqg,7839
13
+ denonavr/tonecontrol.py,sha256=jg3d_OnnXKR5mq7S3mtKHyYhg7Y_qmDloqIm7WRJ71U,11093
14
+ denonavr/volume.py,sha256=bGEOyeNGaI4X-7C7hjEBBH4RlFCYngf4Dl2IM8ooxOo,7197
15
+ denonavr-0.11.6.dist-info/LICENSE,sha256=hcKXAoZnRee1NRWnxTpKyjKCz4aHhw76sZUZoB3qPTw,1068
16
+ denonavr-0.11.6.dist-info/METADATA,sha256=0He0qq32YZidhfW5a5K0NjPhojr5Ul1Q5zXip2SeCDs,10361
17
+ denonavr-0.11.6.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
18
+ denonavr-0.11.6.dist-info/top_level.txt,sha256=GKwe6bOaw_R68BR7x-C7VD3bDFKKNBf0pRkWywUZWIs,9
19
+ denonavr-0.11.6.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.40.0)
2
+ Generator: bdist_wheel (0.42.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,19 +0,0 @@
1
- denonavr/__init__.py,sha256=IEE3zELRRUtf7Bn2gkzIBSxDdM7RW6K2DzOPYDj9rmk,2035
2
- denonavr/api.py,sha256=SRpUMEIWonRE0zkA6-GBQqcArMHHLji9Zl6JYU8gxoo,23824
3
- denonavr/appcommand.py,sha256=H37VK4n-yW0ISvR1hfX8G4udQtGASoY44QNaXtLSidE,7784
4
- denonavr/audyssey.py,sha256=tt4XpWpi5RQyFhT0IWMGeHGUTHDdzlLyits9gfRG6JI,8709
5
- denonavr/const.py,sha256=5zboqVrJfg5Qu6PGUc5snI9ADggJRq-HHY8p8hgZs0I,12932
6
- denonavr/decorators.py,sha256=0V3PAM2ZNZr911f1W1CXXeTJvOWxqs1S5EjEJkkB53o,5323
7
- denonavr/denonavr.py,sha256=FbPBV-iSCjbn1Jjgrb9IHUR3bpHlVnL_756L7OSZiBQ,26578
8
- denonavr/exceptions.py,sha256=naP7MCuNH98rv7y_lDdO7ayyvQGywnsfpHhW-o9tKeo,1725
9
- denonavr/foundation.py,sha256=Os2A1JxVHQOo0R85O8XbM0XRNzqmL3ZrDbIx9Jxpxik,26828
10
- denonavr/input.py,sha256=gUQJZZ8pL_9cxQhxl1kCLVzsrl8Rls9qtVazAJpt2x8,39322
11
- denonavr/soundmode.py,sha256=XBUElzd2y2h4AK73JxBvwvaqFs3ICJMJd0C_UG4XNzA,11009
12
- denonavr/ssdp.py,sha256=7r8DVb9voIlH09IDNY5iSjhmpyJKf6MlZZanEO7Uqos,8011
13
- denonavr/tonecontrol.py,sha256=UrK1OAKWKeSacsURsnFcSf21D51_uvcsl6FEZ5o2CTU,8310
14
- denonavr/volume.py,sha256=T4SgIauLo0btkHmqxY2mqw2x7FZ7o5TKxgOv1654-9A,5940
15
- denonavr-0.11.2.dist-info/LICENSE,sha256=hcKXAoZnRee1NRWnxTpKyjKCz4aHhw76sZUZoB3qPTw,1068
16
- denonavr-0.11.2.dist-info/METADATA,sha256=_jk1Tj83X7T7QniPBSt5VLRZ7ZyUj_4hyBBmLmHy3d0,10300
17
- denonavr-0.11.2.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
18
- denonavr-0.11.2.dist-info/top_level.txt,sha256=GKwe6bOaw_R68BR7x-C7VD3bDFKKNBf0pRkWywUZWIs,9
19
- denonavr-0.11.2.dist-info/RECORD,,