@bharper/atv-js 0.2.6 → 0.3.4

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 (283) hide show
  1. package/dist/index.d.ts +15 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +89 -9
  4. package/dist/index.js.map +1 -1
  5. package/dist/mdns.d.ts.map +1 -1
  6. package/dist/mdns.js +96 -11
  7. package/dist/mdns.js.map +1 -1
  8. package/examples/print-device-json.js +22 -0
  9. package/package.json +2 -3
  10. package/pyatv/.codecov.yml +38 -0
  11. package/pyatv/.github/FUNDING.yml +3 -0
  12. package/pyatv/.github/ISSUE_TEMPLATE/bug_report.yml +80 -0
  13. package/pyatv/.github/ISSUE_TEMPLATE/config.yml +1 -0
  14. package/pyatv/.github/ISSUE_TEMPLATE/feature_request.yml +22 -0
  15. package/pyatv/.github/ISSUE_TEMPLATE/implementation-proposal.yml +29 -0
  16. package/pyatv/.github/ISSUE_TEMPLATE/investigation.yml +16 -0
  17. package/pyatv/.github/ISSUE_TEMPLATE/minor-change.yml +10 -0
  18. package/pyatv/.github/ISSUE_TEMPLATE/question-or-idea.yml +11 -0
  19. package/pyatv/.github/dependabot.yml +26 -0
  20. package/pyatv/.github/workflows/codeql-analysis.yml +71 -0
  21. package/pyatv/.github/workflows/release.yml +160 -0
  22. package/pyatv/.github/workflows/tests.yml +104 -0
  23. package/pyatv/.gitpod.yml +23 -0
  24. package/pyatv/CHANGES.md +3708 -0
  25. package/pyatv/CODE_OF_CONDUCT.md +76 -0
  26. package/pyatv/CONTRIBUTING.md +72 -0
  27. package/pyatv/CONTRIBUTORS.md +3 -0
  28. package/pyatv/Dockerfile +15 -0
  29. package/pyatv/LICENSE.md +9 -0
  30. package/pyatv/MANIFEST.in +14 -0
  31. package/pyatv/README.md +111 -0
  32. package/pyatv/base_versions.txt +13 -0
  33. package/pyatv/chickn.yaml +75 -0
  34. package/pyatv/docs/404.html +24 -0
  35. package/pyatv/docs/CNAME +1 -0
  36. package/pyatv/docs/Gemfile +31 -0
  37. package/pyatv/docs/_config.yml +121 -0
  38. package/pyatv/docs/_includes/api +10 -0
  39. package/pyatv/docs/_includes/atvremote_scan +32 -0
  40. package/pyatv/docs/_includes/code +6 -0
  41. package/pyatv/docs/_includes/issue +14 -0
  42. package/pyatv/docs/_includes/pypi +5 -0
  43. package/pyatv/docs/_layouts/template.html +109 -0
  44. package/pyatv/docs/api/pyatv.conf.html +312 -0
  45. package/pyatv/docs/api/pyatv.const.html +974 -0
  46. package/pyatv/docs/api/pyatv.convert.html +106 -0
  47. package/pyatv/docs/api/pyatv.exceptions.html +489 -0
  48. package/pyatv/docs/api/pyatv.helpers.html +102 -0
  49. package/pyatv/docs/api/pyatv.html +120 -0
  50. package/pyatv/docs/api/pyatv.interface.html +2369 -0
  51. package/pyatv/docs/api/pyatv.settings.html +484 -0
  52. package/pyatv/docs/api/pyatv.storage.file_storage.html +102 -0
  53. package/pyatv/docs/api/pyatv.storage.html +186 -0
  54. package/pyatv/docs/api/pyatv.storage.memory_storage.html +83 -0
  55. package/pyatv/docs/assets/css/custom.css +19 -0
  56. package/pyatv/docs/assets/css/hljs.css +1 -0
  57. package/pyatv/docs/assets/css/normalize.css +349 -0
  58. package/pyatv/docs/assets/css/pdoc.css +287 -0
  59. package/pyatv/docs/assets/css/sanitize.css +566 -0
  60. package/pyatv/docs/assets/css/style.scss +9 -0
  61. package/pyatv/docs/assets/img/logo.svg +63 -0
  62. package/pyatv/docs/assets/js/highlight.9.12.0.min.js +3 -0
  63. package/pyatv/docs/assets/js/mermaid.8.9.2.min.js +32 -0
  64. package/pyatv/docs/assets/js/mermaid.min.js.map +1 -0
  65. package/pyatv/docs/development/apps.md +81 -0
  66. package/pyatv/docs/development/audio.md +42 -0
  67. package/pyatv/docs/development/control.md +56 -0
  68. package/pyatv/docs/development/development.md +15 -0
  69. package/pyatv/docs/development/device_info.md +36 -0
  70. package/pyatv/docs/development/examples.md +44 -0
  71. package/pyatv/docs/development/features.md +70 -0
  72. package/pyatv/docs/development/keyboard.md +51 -0
  73. package/pyatv/docs/development/listeners.md +144 -0
  74. package/pyatv/docs/development/logging.md +55 -0
  75. package/pyatv/docs/development/metadata.md +115 -0
  76. package/pyatv/docs/development/power_management.md +53 -0
  77. package/pyatv/docs/development/scan_pair_and_connect.md +331 -0
  78. package/pyatv/docs/development/services.md +9 -0
  79. package/pyatv/docs/development/storage.md +259 -0
  80. package/pyatv/docs/development/stream.md +241 -0
  81. package/pyatv/docs/development/testing.md +9 -0
  82. package/pyatv/docs/documentation/atvlog.md +64 -0
  83. package/pyatv/docs/documentation/atvproxy.md +244 -0
  84. package/pyatv/docs/documentation/atvremote.md +639 -0
  85. package/pyatv/docs/documentation/atvscript.md +275 -0
  86. package/pyatv/docs/documentation/concepts.md +168 -0
  87. package/pyatv/docs/documentation/documentation.md +130 -0
  88. package/pyatv/docs/documentation/getting_started.md +248 -0
  89. package/pyatv/docs/documentation/protocols.md +1959 -0
  90. package/pyatv/docs/documentation/supported_features.md +246 -0
  91. package/pyatv/docs/documentation/tutorial.md +1062 -0
  92. package/pyatv/docs/documentation/workspace.code-workspace +7 -0
  93. package/pyatv/docs/favicon.ico +0 -0
  94. package/pyatv/docs/index.md +109 -0
  95. package/pyatv/docs/internals/design.md +354 -0
  96. package/pyatv/docs/internals/documentation.md +84 -0
  97. package/pyatv/docs/internals/interfaces.md +95 -0
  98. package/pyatv/docs/internals/internals.md +157 -0
  99. package/pyatv/docs/internals/submit_pr.md +56 -0
  100. package/pyatv/docs/internals/testing.md +176 -0
  101. package/pyatv/docs/internals/tools.md +574 -0
  102. package/pyatv/docs/pdoc_templates/config.mako +46 -0
  103. package/pyatv/docs/pdoc_templates/html.mako +454 -0
  104. package/pyatv/docs/support/acknowledgements.md +87 -0
  105. package/pyatv/docs/support/faq.md +214 -0
  106. package/pyatv/docs/support/migration.md +138 -0
  107. package/pyatv/docs/support/scanning_issues.md +110 -0
  108. package/pyatv/docs/support/support.md +18 -0
  109. package/pyatv/docs/support/troubleshooting.md +83 -0
  110. package/pyatv/pyatv/protocols/mrp/protobuf/AudioFadeMessage.proto +13 -0
  111. package/pyatv/pyatv/protocols/mrp/protobuf/AudioFadeMessage_pb2.pyi +37 -0
  112. package/pyatv/pyatv/protocols/mrp/protobuf/AudioFadeResponseMessage.proto +11 -0
  113. package/pyatv/pyatv/protocols/mrp/protobuf/AudioFadeResponseMessage_pb2.pyi +32 -0
  114. package/pyatv/pyatv/protocols/mrp/protobuf/AudioFormatSettingsMessage.proto +5 -0
  115. package/pyatv/pyatv/protocols/mrp/protobuf/AudioFormatSettingsMessage_pb2.pyi +27 -0
  116. package/pyatv/pyatv/protocols/mrp/protobuf/ClientUpdatesConfigMessage.proto +16 -0
  117. package/pyatv/pyatv/protocols/mrp/protobuf/ClientUpdatesConfigMessage_pb2.pyi +44 -0
  118. package/pyatv/pyatv/protocols/mrp/protobuf/CommandInfo.proto +117 -0
  119. package/pyatv/pyatv/protocols/mrp/protobuf/CommandInfo_pb2.pyi +325 -0
  120. package/pyatv/pyatv/protocols/mrp/protobuf/CommandOptions.proto +36 -0
  121. package/pyatv/pyatv/protocols/mrp/protobuf/CommandOptions_pb2.pyi +115 -0
  122. package/pyatv/pyatv/protocols/mrp/protobuf/Common.proto +79 -0
  123. package/pyatv/pyatv/protocols/mrp/protobuf/Common_pb2.pyi +228 -0
  124. package/pyatv/pyatv/protocols/mrp/protobuf/ConfigureConnectionMessage.proto +11 -0
  125. package/pyatv/pyatv/protocols/mrp/protobuf/ConfigureConnectionMessage_pb2.pyi +32 -0
  126. package/pyatv/pyatv/protocols/mrp/protobuf/ContentItem.proto +27 -0
  127. package/pyatv/pyatv/protocols/mrp/protobuf/ContentItemMetadata.proto +213 -0
  128. package/pyatv/pyatv/protocols/mrp/protobuf/ContentItemMetadata_pb2.pyi +630 -0
  129. package/pyatv/pyatv/protocols/mrp/protobuf/ContentItem_pb2.pyi +94 -0
  130. package/pyatv/pyatv/protocols/mrp/protobuf/CryptoPairingMessage.proto +15 -0
  131. package/pyatv/pyatv/protocols/mrp/protobuf/CryptoPairingMessage_pb2.pyi +46 -0
  132. package/pyatv/pyatv/protocols/mrp/protobuf/DeviceInfoMessage.proto +69 -0
  133. package/pyatv/pyatv/protocols/mrp/protobuf/DeviceInfoMessage_pb2.pyi +226 -0
  134. package/pyatv/pyatv/protocols/mrp/protobuf/GenericMessage.proto +12 -0
  135. package/pyatv/pyatv/protocols/mrp/protobuf/GenericMessage_pb2.pyi +35 -0
  136. package/pyatv/pyatv/protocols/mrp/protobuf/GetKeyboardSessionMessage.proto +11 -0
  137. package/pyatv/pyatv/protocols/mrp/protobuf/GetKeyboardSessionMessage_pb2.pyi +26 -0
  138. package/pyatv/pyatv/protocols/mrp/protobuf/GetRemoteTextInputSessionMessage.proto +10 -0
  139. package/pyatv/pyatv/protocols/mrp/protobuf/GetRemoteTextInputSessionMessage_pb2.pyi +26 -0
  140. package/pyatv/pyatv/protocols/mrp/protobuf/GetVolumeMessage.proto +11 -0
  141. package/pyatv/pyatv/protocols/mrp/protobuf/GetVolumeMessage_pb2.pyi +32 -0
  142. package/pyatv/pyatv/protocols/mrp/protobuf/GetVolumeResultMessage.proto +11 -0
  143. package/pyatv/pyatv/protocols/mrp/protobuf/GetVolumeResultMessage_pb2.pyi +32 -0
  144. package/pyatv/pyatv/protocols/mrp/protobuf/KeyboardMessage.proto +88 -0
  145. package/pyatv/pyatv/protocols/mrp/protobuf/KeyboardMessage_pb2.pyi +261 -0
  146. package/pyatv/pyatv/protocols/mrp/protobuf/LanguageOption.proto +9 -0
  147. package/pyatv/pyatv/protocols/mrp/protobuf/LanguageOption_pb2.pyi +42 -0
  148. package/pyatv/pyatv/protocols/mrp/protobuf/ModifyOutputContextRequestMessage.proto +23 -0
  149. package/pyatv/pyatv/protocols/mrp/protobuf/ModifyOutputContextRequestMessage_pb2.pyi +86 -0
  150. package/pyatv/pyatv/protocols/mrp/protobuf/NotificationMessage.proto +12 -0
  151. package/pyatv/pyatv/protocols/mrp/protobuf/NotificationMessage_pb2.pyi +38 -0
  152. package/pyatv/pyatv/protocols/mrp/protobuf/NowPlayingClient.proto +12 -0
  153. package/pyatv/pyatv/protocols/mrp/protobuf/NowPlayingClient_pb2.pyi +49 -0
  154. package/pyatv/pyatv/protocols/mrp/protobuf/NowPlayingInfo.proto +24 -0
  155. package/pyatv/pyatv/protocols/mrp/protobuf/NowPlayingInfo_pb2.pyi +79 -0
  156. package/pyatv/pyatv/protocols/mrp/protobuf/NowPlayingPlayer.proto +11 -0
  157. package/pyatv/pyatv/protocols/mrp/protobuf/NowPlayingPlayer_pb2.pyi +45 -0
  158. package/pyatv/pyatv/protocols/mrp/protobuf/Origin.proto +17 -0
  159. package/pyatv/pyatv/protocols/mrp/protobuf/OriginClientPropertiesMessage.proto +11 -0
  160. package/pyatv/pyatv/protocols/mrp/protobuf/OriginClientPropertiesMessage_pb2.pyi +32 -0
  161. package/pyatv/pyatv/protocols/mrp/protobuf/Origin_pb2.pyi +63 -0
  162. package/pyatv/pyatv/protocols/mrp/protobuf/PlaybackQueue.proto +15 -0
  163. package/pyatv/pyatv/protocols/mrp/protobuf/PlaybackQueueCapabilities.proto +7 -0
  164. package/pyatv/pyatv/protocols/mrp/protobuf/PlaybackQueueCapabilities_pb2.pyi +33 -0
  165. package/pyatv/pyatv/protocols/mrp/protobuf/PlaybackQueueContext.proto +5 -0
  166. package/pyatv/pyatv/protocols/mrp/protobuf/PlaybackQueueContext_pb2.pyi +27 -0
  167. package/pyatv/pyatv/protocols/mrp/protobuf/PlaybackQueueRequestMessage.proto +29 -0
  168. package/pyatv/pyatv/protocols/mrp/protobuf/PlaybackQueueRequestMessage_pb2.pyi +87 -0
  169. package/pyatv/pyatv/protocols/mrp/protobuf/PlaybackQueue_pb2.pyi +53 -0
  170. package/pyatv/pyatv/protocols/mrp/protobuf/PlayerClientPropertiesMessage.proto +13 -0
  171. package/pyatv/pyatv/protocols/mrp/protobuf/PlayerClientPropertiesMessage_pb2.pyi +37 -0
  172. package/pyatv/pyatv/protocols/mrp/protobuf/PlayerPath.proto +11 -0
  173. package/pyatv/pyatv/protocols/mrp/protobuf/PlayerPath_pb2.pyi +39 -0
  174. package/pyatv/pyatv/protocols/mrp/protobuf/ProtocolMessage.proto +171 -0
  175. package/pyatv/pyatv/protocols/mrp/protobuf/ProtocolMessage_pb2.pyi +377 -0
  176. package/pyatv/pyatv/protocols/mrp/protobuf/RegisterForGameControllerEventsMessage.proto +18 -0
  177. package/pyatv/pyatv/protocols/mrp/protobuf/RegisterForGameControllerEventsMessage_pb2.pyi +54 -0
  178. package/pyatv/pyatv/protocols/mrp/protobuf/RegisterHIDDeviceMessage.proto +12 -0
  179. package/pyatv/pyatv/protocols/mrp/protobuf/RegisterHIDDeviceMessage_pb2.pyi +34 -0
  180. package/pyatv/pyatv/protocols/mrp/protobuf/RegisterHIDDeviceResultMessage.proto +12 -0
  181. package/pyatv/pyatv/protocols/mrp/protobuf/RegisterHIDDeviceResultMessage_pb2.pyi +35 -0
  182. package/pyatv/pyatv/protocols/mrp/protobuf/RegisterVoiceInputDeviceMessage.proto +12 -0
  183. package/pyatv/pyatv/protocols/mrp/protobuf/RegisterVoiceInputDeviceMessage_pb2.pyi +34 -0
  184. package/pyatv/pyatv/protocols/mrp/protobuf/RegisterVoiceInputDeviceResponseMessage.proto +12 -0
  185. package/pyatv/pyatv/protocols/mrp/protobuf/RegisterVoiceInputDeviceResponseMessage_pb2.pyi +35 -0
  186. package/pyatv/pyatv/protocols/mrp/protobuf/RemoteTextInputMessage.proto +13 -0
  187. package/pyatv/pyatv/protocols/mrp/protobuf/RemoteTextInputMessage_pb2.pyi +38 -0
  188. package/pyatv/pyatv/protocols/mrp/protobuf/RemoveClientMessage.proto +12 -0
  189. package/pyatv/pyatv/protocols/mrp/protobuf/RemoveClientMessage_pb2.pyi +34 -0
  190. package/pyatv/pyatv/protocols/mrp/protobuf/RemoveEndpointsMessage.proto +11 -0
  191. package/pyatv/pyatv/protocols/mrp/protobuf/RemoveEndpointsMessage_pb2.pyi +34 -0
  192. package/pyatv/pyatv/protocols/mrp/protobuf/RemoveOutputDevicesMessage.proto +12 -0
  193. package/pyatv/pyatv/protocols/mrp/protobuf/RemoveOutputDevicesMessage_pb2.pyi +38 -0
  194. package/pyatv/pyatv/protocols/mrp/protobuf/RemovePlayerMessage.proto +12 -0
  195. package/pyatv/pyatv/protocols/mrp/protobuf/RemovePlayerMessage_pb2.pyi +34 -0
  196. package/pyatv/pyatv/protocols/mrp/protobuf/SendButtonEventMessage.proto +13 -0
  197. package/pyatv/pyatv/protocols/mrp/protobuf/SendButtonEventMessage_pb2.pyi +38 -0
  198. package/pyatv/pyatv/protocols/mrp/protobuf/SendCommandMessage.proto +16 -0
  199. package/pyatv/pyatv/protocols/mrp/protobuf/SendCommandMessage_pb2.pyi +43 -0
  200. package/pyatv/pyatv/protocols/mrp/protobuf/SendCommandResultMessage.proto +100 -0
  201. package/pyatv/pyatv/protocols/mrp/protobuf/SendCommandResultMessage_pb2.pyi +286 -0
  202. package/pyatv/pyatv/protocols/mrp/protobuf/SendHIDEventMessage.proto +41 -0
  203. package/pyatv/pyatv/protocols/mrp/protobuf/SendHIDEventMessage_pb2.pyi +63 -0
  204. package/pyatv/pyatv/protocols/mrp/protobuf/SendPackedVirtualTouchEventMessage.proto +24 -0
  205. package/pyatv/pyatv/protocols/mrp/protobuf/SendPackedVirtualTouchEventMessage_pb2.pyi +64 -0
  206. package/pyatv/pyatv/protocols/mrp/protobuf/SendVoiceInputMessage.proto +38 -0
  207. package/pyatv/pyatv/protocols/mrp/protobuf/SendVoiceInputMessage_pb2.pyi +134 -0
  208. package/pyatv/pyatv/protocols/mrp/protobuf/SetArtworkMessage.proto +11 -0
  209. package/pyatv/pyatv/protocols/mrp/protobuf/SetArtworkMessage_pb2.pyi +32 -0
  210. package/pyatv/pyatv/protocols/mrp/protobuf/SetConnectionStateMessage.proto +18 -0
  211. package/pyatv/pyatv/protocols/mrp/protobuf/SetConnectionStateMessage_pb2.pyi +54 -0
  212. package/pyatv/pyatv/protocols/mrp/protobuf/SetDefaultSupportedCommandsMessage.proto +28 -0
  213. package/pyatv/pyatv/protocols/mrp/protobuf/SetDefaultSupportedCommandsMessage_pb2.pyi +74 -0
  214. package/pyatv/pyatv/protocols/mrp/protobuf/SetDiscoveryModeMessage.proto +12 -0
  215. package/pyatv/pyatv/protocols/mrp/protobuf/SetDiscoveryModeMessage_pb2.pyi +35 -0
  216. package/pyatv/pyatv/protocols/mrp/protobuf/SetHiliteModeMessage.proto +11 -0
  217. package/pyatv/pyatv/protocols/mrp/protobuf/SetHiliteModeMessage_pb2.pyi +32 -0
  218. package/pyatv/pyatv/protocols/mrp/protobuf/SetNowPlayingClientMessage.proto +12 -0
  219. package/pyatv/pyatv/protocols/mrp/protobuf/SetNowPlayingClientMessage_pb2.pyi +34 -0
  220. package/pyatv/pyatv/protocols/mrp/protobuf/SetNowPlayingPlayerMessage.proto +12 -0
  221. package/pyatv/pyatv/protocols/mrp/protobuf/SetNowPlayingPlayerMessage_pb2.pyi +34 -0
  222. package/pyatv/pyatv/protocols/mrp/protobuf/SetRecordingStateMessage.proto +17 -0
  223. package/pyatv/pyatv/protocols/mrp/protobuf/SetRecordingStateMessage_pb2.pyi +54 -0
  224. package/pyatv/pyatv/protocols/mrp/protobuf/SetStateMessage.proto +27 -0
  225. package/pyatv/pyatv/protocols/mrp/protobuf/SetStateMessage_pb2.pyi +72 -0
  226. package/pyatv/pyatv/protocols/mrp/protobuf/SetVolumeMessage.proto +12 -0
  227. package/pyatv/pyatv/protocols/mrp/protobuf/SetVolumeMessage_pb2.pyi +35 -0
  228. package/pyatv/pyatv/protocols/mrp/protobuf/SupportedCommands.proto +7 -0
  229. package/pyatv/pyatv/protocols/mrp/protobuf/SupportedCommands_pb2.pyi +30 -0
  230. package/pyatv/pyatv/protocols/mrp/protobuf/TextInputMessage.proto +23 -0
  231. package/pyatv/pyatv/protocols/mrp/protobuf/TextInputMessage_pb2.pyi +76 -0
  232. package/pyatv/pyatv/protocols/mrp/protobuf/TransactionKey.proto +6 -0
  233. package/pyatv/pyatv/protocols/mrp/protobuf/TransactionKey_pb2.pyi +30 -0
  234. package/pyatv/pyatv/protocols/mrp/protobuf/TransactionMessage.proto +15 -0
  235. package/pyatv/pyatv/protocols/mrp/protobuf/TransactionMessage_pb2.pyi +42 -0
  236. package/pyatv/pyatv/protocols/mrp/protobuf/TransactionPacket.proto +11 -0
  237. package/pyatv/pyatv/protocols/mrp/protobuf/TransactionPacket_pb2.pyi +41 -0
  238. package/pyatv/pyatv/protocols/mrp/protobuf/TransactionPackets.proto +7 -0
  239. package/pyatv/pyatv/protocols/mrp/protobuf/TransactionPackets_pb2.pyi +30 -0
  240. package/pyatv/pyatv/protocols/mrp/protobuf/UpdateClientMessage.proto +12 -0
  241. package/pyatv/pyatv/protocols/mrp/protobuf/UpdateClientMessage_pb2.pyi +34 -0
  242. package/pyatv/pyatv/protocols/mrp/protobuf/UpdateContentItemArtworkMessage.proto +14 -0
  243. package/pyatv/pyatv/protocols/mrp/protobuf/UpdateContentItemArtworkMessage_pb2.pyi +41 -0
  244. package/pyatv/pyatv/protocols/mrp/protobuf/UpdateContentItemMessage.proto +14 -0
  245. package/pyatv/pyatv/protocols/mrp/protobuf/UpdateContentItemMessage_pb2.pyi +41 -0
  246. package/pyatv/pyatv/protocols/mrp/protobuf/UpdateEndPointsMessage.proto +25 -0
  247. package/pyatv/pyatv/protocols/mrp/protobuf/UpdateEndPointsMessage_pb2.pyi +74 -0
  248. package/pyatv/pyatv/protocols/mrp/protobuf/UpdateOutputDeviceMessage.proto +88 -0
  249. package/pyatv/pyatv/protocols/mrp/protobuf/UpdateOutputDeviceMessage_pb2.pyi +277 -0
  250. package/pyatv/pyatv/protocols/mrp/protobuf/UpdatePlayerPath.proto +12 -0
  251. package/pyatv/pyatv/protocols/mrp/protobuf/UpdatePlayerPath_pb2.pyi +34 -0
  252. package/pyatv/pyatv/protocols/mrp/protobuf/VirtualTouchDeviceDescriptorMessage.proto +8 -0
  253. package/pyatv/pyatv/protocols/mrp/protobuf/VirtualTouchDeviceDescriptorMessage_pb2.pyi +36 -0
  254. package/pyatv/pyatv/protocols/mrp/protobuf/VoiceInputDeviceDescriptorMessage.proto +8 -0
  255. package/pyatv/pyatv/protocols/mrp/protobuf/VoiceInputDeviceDescriptorMessage_pb2.pyi +35 -0
  256. package/pyatv/pyatv/protocols/mrp/protobuf/VolumeControlAvailabilityMessage.proto +23 -0
  257. package/pyatv/pyatv/protocols/mrp/protobuf/VolumeControlAvailabilityMessage_pb2.pyi +71 -0
  258. package/pyatv/pyatv/protocols/mrp/protobuf/VolumeControlCapabilitiesDidChangeMessage.proto +14 -0
  259. package/pyatv/pyatv/protocols/mrp/protobuf/VolumeControlCapabilitiesDidChangeMessage_pb2.pyi +40 -0
  260. package/pyatv/pyatv/protocols/mrp/protobuf/VolumeDidChangeMessage.proto +13 -0
  261. package/pyatv/pyatv/protocols/mrp/protobuf/VolumeDidChangeMessage_pb2.pyi +38 -0
  262. package/pyatv/pyatv/protocols/mrp/protobuf/WakeDeviceMessage.proto +11 -0
  263. package/pyatv/pyatv/protocols/mrp/protobuf/WakeDeviceMessage_pb2.pyi +26 -0
  264. package/pyatv/pyatv/py.typed +0 -0
  265. package/pyatv/pylintrc +49 -0
  266. package/pyatv/pyproject.toml +74 -0
  267. package/pyatv/requirements/requirements.txt +14 -0
  268. package/pyatv/requirements/requirements_docs.txt +2 -0
  269. package/pyatv/requirements/requirements_test.txt +20 -0
  270. package/pyatv/scripts/build_docs.sh +17 -0
  271. package/pyatv/scripts/setup_dev_env.sh +83 -0
  272. package/pyatv/setup.cfg +14 -0
  273. package/pyatv/tests/data/README +23 -0
  274. package/pyatv/tests/data/audio_10_frames.wav +0 -0
  275. package/pyatv/tests/data/audio_1_packet_metadata.wav +0 -0
  276. package/pyatv/tests/data/audio_3_packets.wav +0 -0
  277. package/pyatv/tests/data/only_metadata.wav +0 -0
  278. package/pyatv/tests/data/only_title.wav +0 -0
  279. package/pyatv/tests/data/static_3sec.ogg +0 -0
  280. package/pyatv/tests/data/testfile.txt +1 -0
  281. package/pyatv/tests/support/pyatv.code-workspace +14 -0
  282. package/src/index.ts +122 -8
  283. package/src/mdns.ts +64 -11
@@ -0,0 +1,286 @@
1
+ """
2
+ @generated by mypy-protobuf. Do not edit manually!
3
+ isort:skip_file
4
+ """
5
+
6
+ import builtins
7
+ import collections.abc
8
+ import google.protobuf.descriptor
9
+ import google.protobuf.internal.containers
10
+ import google.protobuf.internal.enum_type_wrapper
11
+ import google.protobuf.internal.extension_dict
12
+ import google.protobuf.message
13
+ import pyatv.protocols.mrp.protobuf.PlayerPath_pb2
14
+ import pyatv.protocols.mrp.protobuf.ProtocolMessage_pb2
15
+ import sys
16
+ import typing
17
+
18
+ if sys.version_info >= (3, 10):
19
+ import typing as typing_extensions
20
+ else:
21
+ import typing_extensions
22
+
23
+ DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
24
+
25
+ @typing.final
26
+ class SendError(google.protobuf.message.Message):
27
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
28
+
29
+ class _Enum:
30
+ ValueType = typing.NewType("ValueType", builtins.int)
31
+ V: typing_extensions.TypeAlias = ValueType
32
+
33
+ class _EnumEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[SendError._Enum.ValueType], builtins.type):
34
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
35
+ NoError: SendError._Enum.ValueType # 0
36
+ """This is None in original message definitions (no-go with python)"""
37
+ ApplicationNotFound: SendError._Enum.ValueType # 1
38
+ ConnectionFailed: SendError._Enum.ValueType # 2
39
+ Ignored: SendError._Enum.ValueType # 3
40
+ CouldNotLaunchApplication: SendError._Enum.ValueType # 4
41
+ TimedOut: SendError._Enum.ValueType # 5
42
+ OriginDoesNotExist: SendError._Enum.ValueType # 6
43
+ InvalidOptions: SendError._Enum.ValueType # 7
44
+ NoCommandHandlers: SendError._Enum.ValueType # 8
45
+ ApplicationNotInstalled: SendError._Enum.ValueType # 9
46
+ NotSupported: SendError._Enum.ValueType # 10
47
+
48
+ class Enum(_Enum, metaclass=_EnumEnumTypeWrapper): ...
49
+ NoError: SendError.Enum.ValueType # 0
50
+ """This is None in original message definitions (no-go with python)"""
51
+ ApplicationNotFound: SendError.Enum.ValueType # 1
52
+ ConnectionFailed: SendError.Enum.ValueType # 2
53
+ Ignored: SendError.Enum.ValueType # 3
54
+ CouldNotLaunchApplication: SendError.Enum.ValueType # 4
55
+ TimedOut: SendError.Enum.ValueType # 5
56
+ OriginDoesNotExist: SendError.Enum.ValueType # 6
57
+ InvalidOptions: SendError.Enum.ValueType # 7
58
+ NoCommandHandlers: SendError.Enum.ValueType # 8
59
+ ApplicationNotInstalled: SendError.Enum.ValueType # 9
60
+ NotSupported: SendError.Enum.ValueType # 10
61
+
62
+ def __init__(
63
+ self,
64
+ ) -> None: ...
65
+
66
+ global___SendError = SendError
67
+
68
+ @typing.final
69
+ class HandlerReturnStatus(google.protobuf.message.Message):
70
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
71
+
72
+ class _Enum:
73
+ ValueType = typing.NewType("ValueType", builtins.int)
74
+ V: typing_extensions.TypeAlias = ValueType
75
+
76
+ class _EnumEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[HandlerReturnStatus._Enum.ValueType], builtins.type):
77
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
78
+ Success: HandlerReturnStatus._Enum.ValueType # 0
79
+ NoSuchContent: HandlerReturnStatus._Enum.ValueType # 1
80
+ CommandFailed: HandlerReturnStatus._Enum.ValueType # 2
81
+ NoActionableNowPlayingItem: HandlerReturnStatus._Enum.ValueType # 10
82
+ DeviceNotFound: HandlerReturnStatus._Enum.ValueType # 20
83
+ UIKitLegacy: HandlerReturnStatus._Enum.ValueType # 3
84
+ SkipAdProhibited: HandlerReturnStatus._Enum.ValueType # 100
85
+ QueueIsUserCurated: HandlerReturnStatus._Enum.ValueType # 101
86
+ UserModifiedQueueDisabled: HandlerReturnStatus._Enum.ValueType # 102
87
+ UserQueueModificationNotSupportedForCurrentItem: HandlerReturnStatus._Enum.ValueType # 103
88
+ SubscriptionRequiredForSharedQueue: HandlerReturnStatus._Enum.ValueType # 104
89
+ InsertionPositionNotSpecified: HandlerReturnStatus._Enum.ValueType # 105
90
+ InvalidInsertionPosition: HandlerReturnStatus._Enum.ValueType # 106
91
+ RequestParametersOutOfBounds: HandlerReturnStatus._Enum.ValueType # 107
92
+ SkipLimitReached: HandlerReturnStatus._Enum.ValueType # 108
93
+ AuthenticationFailure: HandlerReturnStatus._Enum.ValueType # 401
94
+ MediaServiceUnavailable: HandlerReturnStatus._Enum.ValueType # 501
95
+
96
+ class Enum(_Enum, metaclass=_EnumEnumTypeWrapper): ...
97
+ Success: HandlerReturnStatus.Enum.ValueType # 0
98
+ NoSuchContent: HandlerReturnStatus.Enum.ValueType # 1
99
+ CommandFailed: HandlerReturnStatus.Enum.ValueType # 2
100
+ NoActionableNowPlayingItem: HandlerReturnStatus.Enum.ValueType # 10
101
+ DeviceNotFound: HandlerReturnStatus.Enum.ValueType # 20
102
+ UIKitLegacy: HandlerReturnStatus.Enum.ValueType # 3
103
+ SkipAdProhibited: HandlerReturnStatus.Enum.ValueType # 100
104
+ QueueIsUserCurated: HandlerReturnStatus.Enum.ValueType # 101
105
+ UserModifiedQueueDisabled: HandlerReturnStatus.Enum.ValueType # 102
106
+ UserQueueModificationNotSupportedForCurrentItem: HandlerReturnStatus.Enum.ValueType # 103
107
+ SubscriptionRequiredForSharedQueue: HandlerReturnStatus.Enum.ValueType # 104
108
+ InsertionPositionNotSpecified: HandlerReturnStatus.Enum.ValueType # 105
109
+ InvalidInsertionPosition: HandlerReturnStatus.Enum.ValueType # 106
110
+ RequestParametersOutOfBounds: HandlerReturnStatus.Enum.ValueType # 107
111
+ SkipLimitReached: HandlerReturnStatus.Enum.ValueType # 108
112
+ AuthenticationFailure: HandlerReturnStatus.Enum.ValueType # 401
113
+ MediaServiceUnavailable: HandlerReturnStatus.Enum.ValueType # 501
114
+
115
+ def __init__(
116
+ self,
117
+ ) -> None: ...
118
+
119
+ global___HandlerReturnStatus = HandlerReturnStatus
120
+
121
+ @typing.final
122
+ class SendCommandStatusCode(google.protobuf.message.Message):
123
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
124
+
125
+ class _Enum:
126
+ ValueType = typing.NewType("ValueType", builtins.int)
127
+ V: typing_extensions.TypeAlias = ValueType
128
+
129
+ class _EnumEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[SendCommandStatusCode._Enum.ValueType], builtins.type):
130
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
131
+ Success: SendCommandStatusCode._Enum.ValueType # 0
132
+ NoSuchContent: SendCommandStatusCode._Enum.ValueType # 1
133
+ CommandFailed: SendCommandStatusCode._Enum.ValueType # 2
134
+ NoActionableNowPlayingItem: SendCommandStatusCode._Enum.ValueType # 10
135
+ DeviceNotFound: SendCommandStatusCode._Enum.ValueType # 20
136
+ UIKitLegacy: SendCommandStatusCode._Enum.ValueType # 3
137
+ SkipAdProhibited: SendCommandStatusCode._Enum.ValueType # 100
138
+ QueueIsUserCurated: SendCommandStatusCode._Enum.ValueType # 101
139
+ UserModifiedQueueDisabled: SendCommandStatusCode._Enum.ValueType # 102
140
+ UserQueueModificationNotSupportedForCurrentItem: SendCommandStatusCode._Enum.ValueType # 103
141
+ SubscriptionRequiredForSharedQueue: SendCommandStatusCode._Enum.ValueType # 104
142
+ InsertionPositionNotSpecified: SendCommandStatusCode._Enum.ValueType # 105
143
+ InvalidInsertionPosition: SendCommandStatusCode._Enum.ValueType # 106
144
+ RequestParametersOutOfBounds: SendCommandStatusCode._Enum.ValueType # 107
145
+ SkipLimitReached: SendCommandStatusCode._Enum.ValueType # 108
146
+ AuthenticationFailure: SendCommandStatusCode._Enum.ValueType # 401
147
+ MediaServiceUnavailable: SendCommandStatusCode._Enum.ValueType # 501
148
+
149
+ class Enum(_Enum, metaclass=_EnumEnumTypeWrapper): ...
150
+ Success: SendCommandStatusCode.Enum.ValueType # 0
151
+ NoSuchContent: SendCommandStatusCode.Enum.ValueType # 1
152
+ CommandFailed: SendCommandStatusCode.Enum.ValueType # 2
153
+ NoActionableNowPlayingItem: SendCommandStatusCode.Enum.ValueType # 10
154
+ DeviceNotFound: SendCommandStatusCode.Enum.ValueType # 20
155
+ UIKitLegacy: SendCommandStatusCode.Enum.ValueType # 3
156
+ SkipAdProhibited: SendCommandStatusCode.Enum.ValueType # 100
157
+ QueueIsUserCurated: SendCommandStatusCode.Enum.ValueType # 101
158
+ UserModifiedQueueDisabled: SendCommandStatusCode.Enum.ValueType # 102
159
+ UserQueueModificationNotSupportedForCurrentItem: SendCommandStatusCode.Enum.ValueType # 103
160
+ SubscriptionRequiredForSharedQueue: SendCommandStatusCode.Enum.ValueType # 104
161
+ InsertionPositionNotSpecified: SendCommandStatusCode.Enum.ValueType # 105
162
+ InvalidInsertionPosition: SendCommandStatusCode.Enum.ValueType # 106
163
+ RequestParametersOutOfBounds: SendCommandStatusCode.Enum.ValueType # 107
164
+ SkipLimitReached: SendCommandStatusCode.Enum.ValueType # 108
165
+ AuthenticationFailure: SendCommandStatusCode.Enum.ValueType # 401
166
+ MediaServiceUnavailable: SendCommandStatusCode.Enum.ValueType # 501
167
+
168
+ def __init__(
169
+ self,
170
+ ) -> None: ...
171
+
172
+ global___SendCommandStatusCode = SendCommandStatusCode
173
+
174
+ @typing.final
175
+ class SendCommandResultType(google.protobuf.message.Message):
176
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
177
+
178
+ class _Enum:
179
+ ValueType = typing.NewType("ValueType", builtins.int)
180
+ V: typing_extensions.TypeAlias = ValueType
181
+
182
+ class _EnumEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[SendCommandResultType._Enum.ValueType], builtins.type):
183
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
184
+ Dialog: SendCommandResultType._Enum.ValueType # 1
185
+ Error: SendCommandResultType._Enum.ValueType # 2
186
+ Custom: SendCommandResultType._Enum.ValueType # 999
187
+
188
+ class Enum(_Enum, metaclass=_EnumEnumTypeWrapper): ...
189
+ Dialog: SendCommandResultType.Enum.ValueType # 1
190
+ Error: SendCommandResultType.Enum.ValueType # 2
191
+ Custom: SendCommandResultType.Enum.ValueType # 999
192
+
193
+ def __init__(
194
+ self,
195
+ ) -> None: ...
196
+
197
+ global___SendCommandResultType = SendCommandResultType
198
+
199
+ @typing.final
200
+ class SendCommandResultStatus(google.protobuf.message.Message):
201
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
202
+
203
+ STATUSCODE_FIELD_NUMBER: builtins.int
204
+ TYPE_FIELD_NUMBER: builtins.int
205
+ CUSTOMDATA_FIELD_NUMBER: builtins.int
206
+ CUSTOMDATATYPE_FIELD_NUMBER: builtins.int
207
+ statusCode: global___SendCommandStatusCode.Enum.ValueType
208
+ type: global___SendCommandResultType.Enum.ValueType
209
+ customData: builtins.bytes
210
+ """optional ... dialog = 3;
211
+ optional ... error = 4;
212
+ """
213
+ customDataType: builtins.str
214
+ def __init__(
215
+ self,
216
+ *,
217
+ statusCode: global___SendCommandStatusCode.Enum.ValueType | None = ...,
218
+ type: global___SendCommandResultType.Enum.ValueType | None = ...,
219
+ customData: builtins.bytes | None = ...,
220
+ customDataType: builtins.str | None = ...,
221
+ ) -> None: ...
222
+ def HasField(self, field_name: typing.Literal["customData", b"customData", "customDataType", b"customDataType", "statusCode", b"statusCode", "type", b"type"]) -> builtins.bool: ...
223
+ def ClearField(self, field_name: typing.Literal["customData", b"customData", "customDataType", b"customDataType", "statusCode", b"statusCode", "type", b"type"]) -> None: ...
224
+
225
+ global___SendCommandResultStatus = SendCommandResultStatus
226
+
227
+ @typing.final
228
+ class SendCommandResult(google.protobuf.message.Message):
229
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
230
+
231
+ PLAYERPATH_FIELD_NUMBER: builtins.int
232
+ SENDERROR_FIELD_NUMBER: builtins.int
233
+ STATUSES_FIELD_NUMBER: builtins.int
234
+ sendError: global___SendError.Enum.ValueType
235
+ @property
236
+ def playerPath(self) -> pyatv.protocols.mrp.protobuf.PlayerPath_pb2.PlayerPath: ...
237
+ @property
238
+ def statuses(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___SendCommandResultStatus]: ...
239
+ def __init__(
240
+ self,
241
+ *,
242
+ playerPath: pyatv.protocols.mrp.protobuf.PlayerPath_pb2.PlayerPath | None = ...,
243
+ sendError: global___SendError.Enum.ValueType | None = ...,
244
+ statuses: collections.abc.Iterable[global___SendCommandResultStatus] | None = ...,
245
+ ) -> None: ...
246
+ def HasField(self, field_name: typing.Literal["playerPath", b"playerPath", "sendError", b"sendError"]) -> builtins.bool: ...
247
+ def ClearField(self, field_name: typing.Literal["playerPath", b"playerPath", "sendError", b"sendError", "statuses", b"statuses"]) -> None: ...
248
+
249
+ global___SendCommandResult = SendCommandResult
250
+
251
+ @typing.final
252
+ class SendCommandResultMessage(google.protobuf.message.Message):
253
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
254
+
255
+ SENDERROR_FIELD_NUMBER: builtins.int
256
+ HANDLERRETURNSTATUS_FIELD_NUMBER: builtins.int
257
+ HANDLERRETURNSTATUSDATAS_FIELD_NUMBER: builtins.int
258
+ COMMANDID_FIELD_NUMBER: builtins.int
259
+ PLAYERPATH_FIELD_NUMBER: builtins.int
260
+ COMMANDRESULT_FIELD_NUMBER: builtins.int
261
+ sendError: global___SendError.Enum.ValueType
262
+ handlerReturnStatus: global___HandlerReturnStatus.Enum.ValueType
263
+ commandID: builtins.str
264
+ @property
265
+ def handlerReturnStatusDatas(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.bytes]: ...
266
+ @property
267
+ def playerPath(self) -> pyatv.protocols.mrp.protobuf.PlayerPath_pb2.PlayerPath: ...
268
+ @property
269
+ def commandResult(self) -> global___SendCommandResult: ...
270
+ def __init__(
271
+ self,
272
+ *,
273
+ sendError: global___SendError.Enum.ValueType | None = ...,
274
+ handlerReturnStatus: global___HandlerReturnStatus.Enum.ValueType | None = ...,
275
+ handlerReturnStatusDatas: collections.abc.Iterable[builtins.bytes] | None = ...,
276
+ commandID: builtins.str | None = ...,
277
+ playerPath: pyatv.protocols.mrp.protobuf.PlayerPath_pb2.PlayerPath | None = ...,
278
+ commandResult: global___SendCommandResult | None = ...,
279
+ ) -> None: ...
280
+ def HasField(self, field_name: typing.Literal["commandID", b"commandID", "commandResult", b"commandResult", "handlerReturnStatus", b"handlerReturnStatus", "playerPath", b"playerPath", "sendError", b"sendError"]) -> builtins.bool: ...
281
+ def ClearField(self, field_name: typing.Literal["commandID", b"commandID", "commandResult", b"commandResult", "handlerReturnStatus", b"handlerReturnStatus", "handlerReturnStatusDatas", b"handlerReturnStatusDatas", "playerPath", b"playerPath", "sendError", b"sendError"]) -> None: ...
282
+
283
+ global___SendCommandResultMessage = SendCommandResultMessage
284
+
285
+ SENDCOMMANDRESULTMESSAGE_FIELD_NUMBER: builtins.int
286
+ sendCommandResultMessage: google.protobuf.internal.extension_dict._ExtensionFieldDescriptor[pyatv.protocols.mrp.protobuf.ProtocolMessage_pb2.ProtocolMessage, global___SendCommandResultMessage]
@@ -0,0 +1,41 @@
1
+ syntax = "proto2";
2
+
3
+ import "pyatv/protocols/mrp/protobuf/ProtocolMessage.proto";
4
+
5
+ extend ProtocolMessage {
6
+ optional SendHIDEventMessage sendHIDEventMessage = 13;
7
+ }
8
+
9
+ message SendHIDEventMessage {
10
+ // This data corresponds to a "keyboardEvent" in IOHIDEvent.h encoded as raw
11
+ // data. Here is one source:
12
+ //
13
+ // https://opensource.apple.com/source/IOHIDFamily/IOHIDFamily-308/IOHIDFamily/IOHIDEvent.h.auto.html
14
+ //
15
+ // The interesting parts are:
16
+ // - usagePage (UInt32)
17
+ // - usage (Uint32)
18
+ // - down (bool)
19
+ //
20
+ // The parameters usagePage and usage corresponds to the key being pressed.
21
+ // It is mapped to the USB HID values, which can be found here:
22
+ //
23
+ // https://github.com/Daij-Djan/DDHidLib/blob/master/usb_hid_usages.txt
24
+ //
25
+ // Pressing left key would for instance map to usagePage=0x01, usage=0x8B. In
26
+ // the hid data, these values are stored as big endian uint16 values in the
27
+ // mentioned order. So the same example would be: 0x0001008B0001, assuming
28
+ // down = true (key being pressed). For each key press, the same usagePage
29
+ // and usage are sent with down=true and down=false (key down + key up).
30
+ //
31
+ // There is a bit of magic in the raw data that's just not decoded yet, but
32
+ // that doesn't matter. Just use this and it will work:
33
+ //
34
+ // 438922cf080200000000000000000000010000000000000002000000200000000300000001000000000000<data>0000000000000001000000
35
+ //
36
+ // <data> corresponds to the values above, e.g. 0001008B0001. The first 8
37
+ // bytes is a timestamp (mach AbsoluteTime). It's a bit tricky to derive but
38
+ // tvOS seems to accept old timestamps here. So it's probably fine to send
39
+ // anything.
40
+ optional bytes hidEventData = 1;
41
+ }
@@ -0,0 +1,63 @@
1
+ """
2
+ @generated by mypy-protobuf. Do not edit manually!
3
+ isort:skip_file
4
+ """
5
+
6
+ import builtins
7
+ import google.protobuf.descriptor
8
+ import google.protobuf.internal.extension_dict
9
+ import google.protobuf.message
10
+ import pyatv.protocols.mrp.protobuf.ProtocolMessage_pb2
11
+ import typing
12
+
13
+ DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
14
+
15
+ @typing.final
16
+ class SendHIDEventMessage(google.protobuf.message.Message):
17
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
18
+
19
+ HIDEVENTDATA_FIELD_NUMBER: builtins.int
20
+ hidEventData: builtins.bytes
21
+ """This data corresponds to a "keyboardEvent" in IOHIDEvent.h encoded as raw
22
+ data. Here is one source:
23
+
24
+ https://opensource.apple.com/source/IOHIDFamily/IOHIDFamily-308/IOHIDFamily/IOHIDEvent.h.auto.html
25
+
26
+ The interesting parts are:
27
+ - usagePage (UInt32)
28
+ - usage (Uint32)
29
+ - down (bool)
30
+
31
+ The parameters usagePage and usage corresponds to the key being pressed.
32
+ It is mapped to the USB HID values, which can be found here:
33
+
34
+ https://github.com/Daij-Djan/DDHidLib/blob/master/usb_hid_usages.txt
35
+
36
+ Pressing left key would for instance map to usagePage=0x01, usage=0x8B. In
37
+ the hid data, these values are stored as big endian uint16 values in the
38
+ mentioned order. So the same example would be: 0x0001008B0001, assuming
39
+ down = true (key being pressed). For each key press, the same usagePage
40
+ and usage are sent with down=true and down=false (key down + key up).
41
+
42
+ There is a bit of magic in the raw data that's just not decoded yet, but
43
+ that doesn't matter. Just use this and it will work:
44
+
45
+ 438922cf080200000000000000000000010000000000000002000000200000000300000001000000000000<data>0000000000000001000000
46
+
47
+ <data> corresponds to the values above, e.g. 0001008B0001. The first 8
48
+ bytes is a timestamp (mach AbsoluteTime). It's a bit tricky to derive but
49
+ tvOS seems to accept old timestamps here. So it's probably fine to send
50
+ anything.
51
+ """
52
+ def __init__(
53
+ self,
54
+ *,
55
+ hidEventData: builtins.bytes | None = ...,
56
+ ) -> None: ...
57
+ def HasField(self, field_name: typing.Literal["hidEventData", b"hidEventData"]) -> builtins.bool: ...
58
+ def ClearField(self, field_name: typing.Literal["hidEventData", b"hidEventData"]) -> None: ...
59
+
60
+ global___SendHIDEventMessage = SendHIDEventMessage
61
+
62
+ SENDHIDEVENTMESSAGE_FIELD_NUMBER: builtins.int
63
+ sendHIDEventMessage: google.protobuf.internal.extension_dict._ExtensionFieldDescriptor[pyatv.protocols.mrp.protobuf.ProtocolMessage_pb2.ProtocolMessage, global___SendHIDEventMessage]
@@ -0,0 +1,24 @@
1
+ syntax = "proto2";
2
+
3
+ import "pyatv/protocols/mrp/protobuf/ProtocolMessage.proto";
4
+
5
+ extend ProtocolMessage {
6
+ optional SendPackedVirtualTouchEventMessage sendPackedVirtualTouchEventMessage = 47;
7
+ }
8
+
9
+ message SendPackedVirtualTouchEventMessage {
10
+
11
+ // Corresponds to "phase" in data
12
+ enum Phase {
13
+ Began = 1;
14
+ Moved = 2;
15
+ Stationary = 3;
16
+ Ended = 4;
17
+ Cancelled = 5;
18
+ }
19
+
20
+ // The packed version of VirtualTouchEvent contains X, Y, phase, deviceID
21
+ // and finger stored as a byte array. Each value is written as 16bit little
22
+ // endian integers.
23
+ optional bytes data = 1;
24
+ }
@@ -0,0 +1,64 @@
1
+ """
2
+ @generated by mypy-protobuf. Do not edit manually!
3
+ isort:skip_file
4
+ """
5
+
6
+ import builtins
7
+ import google.protobuf.descriptor
8
+ import google.protobuf.internal.enum_type_wrapper
9
+ import google.protobuf.internal.extension_dict
10
+ import google.protobuf.message
11
+ import pyatv.protocols.mrp.protobuf.ProtocolMessage_pb2
12
+ import sys
13
+ import typing
14
+
15
+ if sys.version_info >= (3, 10):
16
+ import typing as typing_extensions
17
+ else:
18
+ import typing_extensions
19
+
20
+ DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
21
+
22
+ @typing.final
23
+ class SendPackedVirtualTouchEventMessage(google.protobuf.message.Message):
24
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
25
+
26
+ class _Phase:
27
+ ValueType = typing.NewType("ValueType", builtins.int)
28
+ V: typing_extensions.TypeAlias = ValueType
29
+
30
+ class _PhaseEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[SendPackedVirtualTouchEventMessage._Phase.ValueType], builtins.type):
31
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
32
+ Began: SendPackedVirtualTouchEventMessage._Phase.ValueType # 1
33
+ Moved: SendPackedVirtualTouchEventMessage._Phase.ValueType # 2
34
+ Stationary: SendPackedVirtualTouchEventMessage._Phase.ValueType # 3
35
+ Ended: SendPackedVirtualTouchEventMessage._Phase.ValueType # 4
36
+ Cancelled: SendPackedVirtualTouchEventMessage._Phase.ValueType # 5
37
+
38
+ class Phase(_Phase, metaclass=_PhaseEnumTypeWrapper):
39
+ """Corresponds to "phase" in data"""
40
+
41
+ Began: SendPackedVirtualTouchEventMessage.Phase.ValueType # 1
42
+ Moved: SendPackedVirtualTouchEventMessage.Phase.ValueType # 2
43
+ Stationary: SendPackedVirtualTouchEventMessage.Phase.ValueType # 3
44
+ Ended: SendPackedVirtualTouchEventMessage.Phase.ValueType # 4
45
+ Cancelled: SendPackedVirtualTouchEventMessage.Phase.ValueType # 5
46
+
47
+ DATA_FIELD_NUMBER: builtins.int
48
+ data: builtins.bytes
49
+ """The packed version of VirtualTouchEvent contains X, Y, phase, deviceID
50
+ and finger stored as a byte array. Each value is written as 16bit little
51
+ endian integers.
52
+ """
53
+ def __init__(
54
+ self,
55
+ *,
56
+ data: builtins.bytes | None = ...,
57
+ ) -> None: ...
58
+ def HasField(self, field_name: typing.Literal["data", b"data"]) -> builtins.bool: ...
59
+ def ClearField(self, field_name: typing.Literal["data", b"data"]) -> None: ...
60
+
61
+ global___SendPackedVirtualTouchEventMessage = SendPackedVirtualTouchEventMessage
62
+
63
+ SENDPACKEDVIRTUALTOUCHEVENTMESSAGE_FIELD_NUMBER: builtins.int
64
+ sendPackedVirtualTouchEventMessage: google.protobuf.internal.extension_dict._ExtensionFieldDescriptor[pyatv.protocols.mrp.protobuf.ProtocolMessage_pb2.ProtocolMessage, global___SendPackedVirtualTouchEventMessage]
@@ -0,0 +1,38 @@
1
+ syntax = "proto2";
2
+
3
+ import "pyatv/protocols/mrp/protobuf/ProtocolMessage.proto";
4
+ import "pyatv/protocols/mrp/protobuf/AudioFormatSettingsMessage.proto";
5
+
6
+ extend ProtocolMessage {
7
+ optional SendVoiceInputMessage sendVoiceInputMessage = 36;
8
+ }
9
+
10
+ message AudioStreamPacketDescription {
11
+ optional int64 startOffset = 1;
12
+ optional uint32 variableFramesInPacket = 2;
13
+ optional uint32 dataByteSize = 3;
14
+ }
15
+
16
+ message AudioBuffer {
17
+ optional AudioFormatSettings formatSettings = 1;
18
+ optional int64 packetCapacity = 2;
19
+ optional int64 maximumPacketSize = 3;
20
+ optional int64 packetCount = 4;
21
+ optional bytes contents = 5;
22
+ repeated AudioStreamPacketDescription packetDescriptions = 6;
23
+ }
24
+
25
+ message AudioTime {
26
+ optional double timestamp = 1;
27
+ optional double sampleRate = 2;
28
+ }
29
+
30
+ message AudioDataBlock {
31
+ optional AudioBuffer buffer = 1;
32
+ optional AudioTime time = 2;
33
+ optional double gain = 3;
34
+ }
35
+
36
+ message SendVoiceInputMessage {
37
+ optional AudioDataBlock dataBlock = 1;
38
+ }
@@ -0,0 +1,134 @@
1
+ """
2
+ @generated by mypy-protobuf. Do not edit manually!
3
+ isort:skip_file
4
+ """
5
+
6
+ import builtins
7
+ import collections.abc
8
+ import google.protobuf.descriptor
9
+ import google.protobuf.internal.containers
10
+ import google.protobuf.internal.extension_dict
11
+ import google.protobuf.message
12
+ import pyatv.protocols.mrp.protobuf.AudioFormatSettingsMessage_pb2
13
+ import pyatv.protocols.mrp.protobuf.ProtocolMessage_pb2
14
+ import typing
15
+
16
+ DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
17
+
18
+ @typing.final
19
+ class AudioStreamPacketDescription(google.protobuf.message.Message):
20
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
21
+
22
+ STARTOFFSET_FIELD_NUMBER: builtins.int
23
+ VARIABLEFRAMESINPACKET_FIELD_NUMBER: builtins.int
24
+ DATABYTESIZE_FIELD_NUMBER: builtins.int
25
+ startOffset: builtins.int
26
+ variableFramesInPacket: builtins.int
27
+ dataByteSize: builtins.int
28
+ def __init__(
29
+ self,
30
+ *,
31
+ startOffset: builtins.int | None = ...,
32
+ variableFramesInPacket: builtins.int | None = ...,
33
+ dataByteSize: builtins.int | None = ...,
34
+ ) -> None: ...
35
+ def HasField(self, field_name: typing.Literal["dataByteSize", b"dataByteSize", "startOffset", b"startOffset", "variableFramesInPacket", b"variableFramesInPacket"]) -> builtins.bool: ...
36
+ def ClearField(self, field_name: typing.Literal["dataByteSize", b"dataByteSize", "startOffset", b"startOffset", "variableFramesInPacket", b"variableFramesInPacket"]) -> None: ...
37
+
38
+ global___AudioStreamPacketDescription = AudioStreamPacketDescription
39
+
40
+ @typing.final
41
+ class AudioBuffer(google.protobuf.message.Message):
42
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
43
+
44
+ FORMATSETTINGS_FIELD_NUMBER: builtins.int
45
+ PACKETCAPACITY_FIELD_NUMBER: builtins.int
46
+ MAXIMUMPACKETSIZE_FIELD_NUMBER: builtins.int
47
+ PACKETCOUNT_FIELD_NUMBER: builtins.int
48
+ CONTENTS_FIELD_NUMBER: builtins.int
49
+ PACKETDESCRIPTIONS_FIELD_NUMBER: builtins.int
50
+ packetCapacity: builtins.int
51
+ maximumPacketSize: builtins.int
52
+ packetCount: builtins.int
53
+ contents: builtins.bytes
54
+ @property
55
+ def formatSettings(self) -> pyatv.protocols.mrp.protobuf.AudioFormatSettingsMessage_pb2.AudioFormatSettings: ...
56
+ @property
57
+ def packetDescriptions(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___AudioStreamPacketDescription]: ...
58
+ def __init__(
59
+ self,
60
+ *,
61
+ formatSettings: pyatv.protocols.mrp.protobuf.AudioFormatSettingsMessage_pb2.AudioFormatSettings | None = ...,
62
+ packetCapacity: builtins.int | None = ...,
63
+ maximumPacketSize: builtins.int | None = ...,
64
+ packetCount: builtins.int | None = ...,
65
+ contents: builtins.bytes | None = ...,
66
+ packetDescriptions: collections.abc.Iterable[global___AudioStreamPacketDescription] | None = ...,
67
+ ) -> None: ...
68
+ def HasField(self, field_name: typing.Literal["contents", b"contents", "formatSettings", b"formatSettings", "maximumPacketSize", b"maximumPacketSize", "packetCapacity", b"packetCapacity", "packetCount", b"packetCount"]) -> builtins.bool: ...
69
+ def ClearField(self, field_name: typing.Literal["contents", b"contents", "formatSettings", b"formatSettings", "maximumPacketSize", b"maximumPacketSize", "packetCapacity", b"packetCapacity", "packetCount", b"packetCount", "packetDescriptions", b"packetDescriptions"]) -> None: ...
70
+
71
+ global___AudioBuffer = AudioBuffer
72
+
73
+ @typing.final
74
+ class AudioTime(google.protobuf.message.Message):
75
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
76
+
77
+ TIMESTAMP_FIELD_NUMBER: builtins.int
78
+ SAMPLERATE_FIELD_NUMBER: builtins.int
79
+ timestamp: builtins.float
80
+ sampleRate: builtins.float
81
+ def __init__(
82
+ self,
83
+ *,
84
+ timestamp: builtins.float | None = ...,
85
+ sampleRate: builtins.float | None = ...,
86
+ ) -> None: ...
87
+ def HasField(self, field_name: typing.Literal["sampleRate", b"sampleRate", "timestamp", b"timestamp"]) -> builtins.bool: ...
88
+ def ClearField(self, field_name: typing.Literal["sampleRate", b"sampleRate", "timestamp", b"timestamp"]) -> None: ...
89
+
90
+ global___AudioTime = AudioTime
91
+
92
+ @typing.final
93
+ class AudioDataBlock(google.protobuf.message.Message):
94
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
95
+
96
+ BUFFER_FIELD_NUMBER: builtins.int
97
+ TIME_FIELD_NUMBER: builtins.int
98
+ GAIN_FIELD_NUMBER: builtins.int
99
+ gain: builtins.float
100
+ @property
101
+ def buffer(self) -> global___AudioBuffer: ...
102
+ @property
103
+ def time(self) -> global___AudioTime: ...
104
+ def __init__(
105
+ self,
106
+ *,
107
+ buffer: global___AudioBuffer | None = ...,
108
+ time: global___AudioTime | None = ...,
109
+ gain: builtins.float | None = ...,
110
+ ) -> None: ...
111
+ def HasField(self, field_name: typing.Literal["buffer", b"buffer", "gain", b"gain", "time", b"time"]) -> builtins.bool: ...
112
+ def ClearField(self, field_name: typing.Literal["buffer", b"buffer", "gain", b"gain", "time", b"time"]) -> None: ...
113
+
114
+ global___AudioDataBlock = AudioDataBlock
115
+
116
+ @typing.final
117
+ class SendVoiceInputMessage(google.protobuf.message.Message):
118
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
119
+
120
+ DATABLOCK_FIELD_NUMBER: builtins.int
121
+ @property
122
+ def dataBlock(self) -> global___AudioDataBlock: ...
123
+ def __init__(
124
+ self,
125
+ *,
126
+ dataBlock: global___AudioDataBlock | None = ...,
127
+ ) -> None: ...
128
+ def HasField(self, field_name: typing.Literal["dataBlock", b"dataBlock"]) -> builtins.bool: ...
129
+ def ClearField(self, field_name: typing.Literal["dataBlock", b"dataBlock"]) -> None: ...
130
+
131
+ global___SendVoiceInputMessage = SendVoiceInputMessage
132
+
133
+ SENDVOICEINPUTMESSAGE_FIELD_NUMBER: builtins.int
134
+ sendVoiceInputMessage: google.protobuf.internal.extension_dict._ExtensionFieldDescriptor[pyatv.protocols.mrp.protobuf.ProtocolMessage_pb2.ProtocolMessage, global___SendVoiceInputMessage]
@@ -0,0 +1,11 @@
1
+ syntax = "proto2";
2
+
3
+ import "pyatv/protocols/mrp/protobuf/ProtocolMessage.proto";
4
+
5
+ extend ProtocolMessage {
6
+ optional SetArtworkMessage setArtworkMessage = 10;
7
+ }
8
+
9
+ message SetArtworkMessage {
10
+ optional bytes jpegData = 1;
11
+ }