@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,639 @@
1
+ ---
2
+ layout: template
3
+ title: atvremote
4
+ permalink: /documentation/atvremote/
5
+ link_group: documentation
6
+ ---
7
+ # Table of Contents
8
+ {:.no_toc}
9
+ * TOC
10
+ {:toc}
11
+
12
+
13
+ # atvremote
14
+
15
+ To more easily test pyatv, the atvremote application can be used. It is bundled with
16
+ pyatv and supports all the functionality implemented by the library. So it is also a
17
+ good place to go to for inspiration when implementing your own application.
18
+
19
+ # Set up a device with wizard
20
+
21
+ The atvremote command exposes more or less all functionality of pyatv, thus making it great
22
+ for exploring what pyatv can do. Version 0.14.0 introduced a *wizard* to simplify setting up
23
+ a new device (in case you don't care about the details). It will scan for devices and guide
24
+ you through all the required steps and save credentials to a file, so you don't have to care
25
+ about them ever again.
26
+
27
+ To get going, just run `atvremote wizard`:
28
+
29
+ ```raw
30
+ $ atvremote wizard
31
+ Looking for devices...
32
+ Found the following devices:
33
+ Name Model Address
34
+ -- ------------------------ ----------------------- -----------
35
+ 1 Receiver+ airupnp 10.0.10.200
36
+ 2 Receiver RX-V773 10.0.10.82
37
+ 3 Pierre's AirPort Express AirPort Express (gen 2) 10.0.10.168
38
+ 4 FakeATV Unknown 10.0.10.254
39
+ 5 Vardagsrum Apple TV 4K 10.0.10.81
40
+ 6 Apple TV Apple TV 3 10.0.10.83
41
+ Enter index of device to set up (q to quit): 4
42
+ Starting to set up FakeATV
43
+ Starting to pair Protocol.MRP
44
+ Enter PIN on screen: 1111
45
+ Successfully paired Protocol.MRP, moving on...
46
+ Pairing finished, trying to connect and get some metadata...
47
+ Currently playing:
48
+ Media type: Music
49
+ Device state: Playing
50
+ Title: Never Gonna Give You Up
51
+ Artist: Rick Astley
52
+ Position: 1/213s (0.0%)
53
+ Repeat: Off
54
+ Shuffle: Off
55
+ Device is now set up!
56
+ ```
57
+
58
+ Here the device named `FakeATV` with IP address 10.0.10.254 is set up. From now on you
59
+ can just run `atvremote -s 10.0.10.254 <command>` or `atvremote -n FakeATV <command>` to
60
+ interact with it. Skip down to [Working with commands](#working-with-commands) to see
61
+ what you can do.
62
+
63
+ # Discovering devices
64
+
65
+ To find devices, use the `scan` command:
66
+
67
+ ```raw
68
+ $ atvremote scan
69
+ ========================================
70
+ Name: Living Room
71
+ Model/SW: 4K tvOS 13.3.1 build 17K795
72
+ Address: 10.0.0.10
73
+ MAC: AA:BB:CC:DD:EE:FF
74
+ Deep Sleep: False
75
+ Identifiers:
76
+ - 01234567-89AB-CDEF-0123-4567890ABCDE
77
+ - 00:11:22:33:44:55
78
+ Services:
79
+ - Protocol: Companion, Port: 49153, Credentials: None
80
+ - Protocol: MRP, Port: 49152, Credentials: None
81
+ - Protocol: AirPlay, Port: 7000, Credentials: None
82
+
83
+ Name: Kitchen
84
+ Model/SW: 3 ATV SW
85
+ Address: 10.0.0.11
86
+ MAC: AA:AA:AA:AA:AA:AA
87
+ Identifiers:
88
+ - ABCDEFABCDEFABCD
89
+ - AA:BB:CC:DD:EE:FF
90
+ Services:
91
+ - Protocol: AirPlay, Port: 7000, Credentials: None
92
+ - Protocol: DMAP, Port: 3689, Credentials: 00000000-1111-2222-3333-444455556666
93
+ ```
94
+
95
+ In this case two devices were found, one named `Living Room` and another named
96
+ `Kitchen`. You can read more about what everything means under [Concepts](concepts.md).
97
+
98
+ ## Discovering specific devices
99
+
100
+ A normal `scan` uses multicast to discover all devices on the network. It is possible to
101
+ scan for specific devices ("unicast") by specifying `--scan-hosts`:
102
+
103
+ ```raw
104
+ $ atvremote --scan-hosts 10.0.0.10 scan
105
+ ========================================
106
+ Name: Living Room
107
+ Model/SW: 4K tvOS 13.3.1 build 17K795
108
+ Address: 10.0.0.10
109
+ MAC: AA:BB:CC:DD:EE:FF
110
+ Deep Sleep: False
111
+ Identifiers:
112
+ - 01234567-89AB-CDEF-0123-4567890ABCDE
113
+ - 00:11:22:33:44:55
114
+ Services:
115
+ - Protocol: MRP, Port: 49152, Credentials: None
116
+ - Protocol: AirPlay, Port: 7000, Credentials: None
117
+ ```
118
+
119
+ This yields the same result, but is much faster as it only has to wait for response from
120
+ one device. Downside is of course that it cannot automatically find devices, you must know the
121
+ IP-address. Multiple devices can be specified as a comma-separated list:
122
+
123
+ ```shell
124
+ $ atvremote --scan-hosts 10.0.0.10,10.0.0.11 scan
125
+ ```
126
+
127
+ If you have problems using regular scanning or have configured a static address on your Apple TV,
128
+ this is the recommended way of finding your devices. Please do note that you should not manually
129
+ specify address, port, etc. when using this method. It is not necessary.
130
+
131
+ The `--scan-hosts` flag can be used with any other command as well:
132
+
133
+ ```shell
134
+ $ atvremote --scan-hosts 10.0.0.10 -n Kitchen <some command>
135
+ ```
136
+
137
+ ## Discovering specific protocols
138
+
139
+ By default, pyatv will scan for all protocols supported by a device. It is however possible
140
+ to be more specific about which protocols to scan for with `--scan-protocols`:
141
+
142
+ ```raw
143
+ $ atvremote --scan-protocols mrp scan
144
+ Scan Results
145
+ ========================================
146
+ Name: Vardagsrum
147
+ Model/SW: Gen4K tvOS 14.x build 18L569
148
+ Address: 10.0.0.10
149
+ MAC: AA:BB:CC:DD:EE:FF
150
+ Deep Sleep: False
151
+ Identifiers:
152
+ - 01234567-89AB-CDEF-0123-4567890ABCDE
153
+ Services:
154
+ - Protocol: MRP, Port: 49153, Credentials: None
155
+ ```
156
+
157
+ Only the specified protocols are scanned for. Multiple protocols can be specified
158
+ as a comma-separated list:
159
+
160
+ ```raw
161
+ $ atvremote --scan-protocols mrp,raop,companion scan
162
+ ```
163
+
164
+ ## Specifying a device
165
+
166
+ In order for `atvremote` to know which device you want to control, you must specify the
167
+ `--id` flag (or `-i` for short) together with an identifier. You may choose any of the available
168
+ identifiers.
169
+
170
+ Based on the output in the previous chapter, you may write:
171
+
172
+ ```shell
173
+ $ atvremote -i 00:11:22:33:44:54 <some command>
174
+ ```
175
+
176
+ But this would also work equally good:
177
+
178
+ ```shell
179
+ $ atvremote -i 01234567-89AB-CDEF-0123-4567890ABCDE <some command>
180
+ ```
181
+
182
+ It is also possible to use the device name by specifying `-n` instead:
183
+
184
+ ```shell
185
+ $ atvremote -n "Living Room" <some command>
186
+ ```
187
+
188
+ ## Manually specifying a device
189
+
190
+ *Unless you know exactly what you are doing, just ignore this section.*
191
+
192
+ It is possible to bypass the automatic scanning that `atvremote` performs
193
+ by passing the `--manual` flag. This is convenient if you rely on an external
194
+ scanning process or to shorten the turn-around time during development testing.
195
+ However, doing so means that you mainly lose all benefits of unique identifiers.
196
+ They lose meaning completely. Only use this mode if you know what you are doing
197
+ and refrain from using this in conjunction with `--scan-hosts`!
198
+
199
+ When specifying `--manual` you *must* also specify `--address`, `--port`, `--protocol`
200
+ and `--id`. Even though the identifier is not used (or applicable), you must
201
+ still specify something. A simple call example looks like this:
202
+
203
+ ```shell
204
+ $ atvremote --manual --address 10.0.0.10 --port 49152 --protocol mrp --id test playing
205
+ ```
206
+
207
+ For testing purposes, it's possible to specify custom MDNS properties using
208
+ `--service-properties`. This might be useful to tinker with certain flags that
209
+ alter protocol behavior. The format looks like this:
210
+
211
+ Xvar1=value1Xvar2=value2
212
+
213
+ Where `X` is any character not present in a variable name or value. A typical example
214
+ might use `:` or `,` like this:
215
+
216
+ :name=test:flags=123
217
+
218
+ An example call to `atvremote` might look like this:
219
+
220
+ ```shell
221
+ $ atvremote --id "aa:bb:cc:dd:ee:ff" --address 10.0.10.253 --port 7000 --manual --protocol raop --service-properties :features=0x4A7FCA00,0xBC354BD0 --debug stream_file=never_gonna_give_you_up.mp3
222
+ ```
223
+
224
+ # Pairing with a device
225
+
226
+ In most cases you have to pair with a device and obtain *credentials* in order to communicate
227
+ with it. To pair you must specify a device, which protocol to pair and use the `pair` command:
228
+
229
+ ```raw
230
+ $ atvremote --id 00:11:22:33:44:55 --protocol mrp pair
231
+ Enter PIN on screen: 1234
232
+ Pairing seems to have succeeded, yey!
233
+ You may now use these credentials: xxxx
234
+ ```
235
+
236
+ What protocols a device supports can be seen with `scan`. Generally you should pair all protocols
237
+ the device supports (beware of protocols marked with *Disabled*: ignore those). Just repeat the
238
+ process multiple times, just changing the protocol (`airplay`, `companion`, `dmap`, `mrp` or
239
+ `raop`).
240
+
241
+ *Note: atvremote will automatically store credentials after paring, meaning you do not have to
242
+ manually specify them as described in the sections below anymore. See
243
+ [Storage and Settings](#storage-and-settings) for more details.*
244
+ ## Credentials
245
+
246
+ Once you have paired and received credentials, you may provide said credentials to `atvremote`
247
+ via the `--xxx-credentials` flags. Replace `xxx` with a protocol, e.g. `mrp`, `dmap` or `airplay`. You
248
+ may specify multiple credentials:
249
+
250
+ ```shell
251
+ $ atvremote -n Kitchen --mrp-credentials abcd --airplay-credentials 1234 playing
252
+ ```
253
+
254
+ Manually specifying credentials is no longer needed as `atvrmote` stores credentials persistently
255
+ in a file.
256
+
257
+ ## Password
258
+
259
+ The `raop` protocol optionally requires a password. You may specify a password using the `raop-password` flag.
260
+
261
+ ```
262
+ atvremote --id 00:11:22:33:44:55 --raop-password mypassword stream_file=mymusicfile.mp3
263
+ ```
264
+
265
+ # Push updates
266
+
267
+ With `atvremote` you can use `push_updates` to display current play status automatically
268
+ without having to ask the device for it:
269
+
270
+ ```raw
271
+ $ atvremote -n Kitchen push_updates
272
+ Press ENTER to stop
273
+ Media type: Unknown
274
+ Device state: Paused
275
+ --------------------
276
+ ```
277
+
278
+ Updates will be displayed when they happen. Just press ENTER to stop.
279
+
280
+ # Storage and Settings
281
+
282
+ By default, `atvremote` uses file based storage ({% include api i="storage/file_storage.FileStorage" %})
283
+ and saves settings and credentials automatically to `$HOME/.pyatv.conf`. This means that you don't have
284
+ to manually provide things like credentials and passwords once they have been saved to storage.
285
+
286
+ Credentials are saved to the storage automatically after pairing a protocol, i.e. you only need to pair
287
+ a protocol once and never care about credentials for that protocol again. Passwords are saved to storage
288
+ as well when using one of the `--xxx-password` arguments, thus only needs to be issued once.
289
+
290
+ Both credentials and passwords will be displayed when performing a scan:
291
+
292
+ ```raw
293
+ $ atvremote scan
294
+ Name: Pierre's AirPort Express
295
+ Model/SW: AirPort Express (gen 2), AirPortOS 7.8.1
296
+ Address: 10.0.0.5
297
+ MAC: XX:XX:XX:XX:XX:XX
298
+ Deep Sleep: False
299
+ Identifiers:
300
+ - XX:XX:XX:XX:XX:XX
301
+ - XXXXXXXXXXXX
302
+ Services:
303
+ - Protocol: AirPlay, Port: 7000, Credentials: creds_airplay, Requires Password: False, Password: airplay_password, Pairing: NotNeeded
304
+ - Protocol: RAOP, Port: 7000, Credentials: creds_raop, Requires Password: False, Password: raop_password, Pairing: NotNeeded
305
+ ```
306
+
307
+ You may also look at the settings for a specific device using `print_settings`:
308
+
309
+ ```
310
+ $ atvremote -s 10.0.0.5 print_settings
311
+ info.name = pyatv (str)
312
+ info.mac = 02:70:79:61:74:76 (str)
313
+ info.model = iPhone10,6 (str)
314
+ info.device_id = FF:70:79:61:74:76 (str)
315
+ info.os_name = iPhone OS (str)
316
+ info.os_build = 18G82 (str)
317
+ info.os_version = 14.7.1 (str)
318
+ protocols.airplay.identifier = 58:D3:49:34:A4:B4 (str, NoneType)
319
+ protocols.airplay.credentials = None (str, NoneType)
320
+ protocols.airplay.password = None (str, NoneType)
321
+ protocols.companion.identifier = None (str, NoneType)
322
+ protocols.companion.credentials = None (str, NoneType)
323
+ protocols.dmap.identifier = None (str, NoneType)
324
+ protocols.dmap.credentials = None (str, NoneType)
325
+ protocols.mrp.identifier = None (str, NoneType)
326
+ protocols.mrp.credentials = None (str, NoneType)
327
+ protocols.raop.identifier = 58D34934A4B4 (str, NoneType)
328
+ protocols.raop.credentials = None (str, NoneType)
329
+ protocols.raop.password = None (str, NoneType)
330
+ ```
331
+
332
+ Please note that output may vary depending on the version of pyatv you are using.
333
+ The output is agnostic to the underlying storage, i.e. the format will look the
334
+ same no matter what storage is used. The following sections describes how to
335
+ work with settings in more detail.
336
+
337
+ ## Configuring Storage Module
338
+
339
+ If you want to change location of your storage, use `--storage-filename` and specify another file.
340
+ It is also possible to disable file based storage altogether with `--storage none` (corresponding
341
+ to how `atvremote` worked before storage support was added).
342
+
343
+ At some point pyatv will likely support using custom storage modules as well,
344
+ but that is currently not supported.
345
+
346
+ ## Importing Existing Settings
347
+
348
+ In case you want to "import" credentials you already have, just run `atvremote` with those
349
+ credentials and they will be saved to storage automatically. For example, running:
350
+
351
+ ```raw
352
+ $ atvrmote -s <ip> --airplay-credentials xxx playing
353
+ ```
354
+
355
+ Would save AirPlay credentials. The same thing can be done with passwords as well:
356
+
357
+ ```raw
358
+ $ atvrmote -s <ip> --raop-password foobar playing
359
+ ```
360
+
361
+ Would save RAOP password to storage. If you want to unset/remote credentials or password, just
362
+ pass an empty string:
363
+
364
+ ```raw
365
+ $ atvrmote -s <ip> --raop-password "" playing
366
+ ```
367
+
368
+ ## Changing Individual Settings
369
+
370
+ To save individual settings, there is a command named `change_setting`. It
371
+ accepts a "path" to the setting in the same format as printed by `print_setting`.
372
+ Assume you want to change the OS build, look at the output for that setting:
373
+
374
+ ```raw
375
+ info.os_build = 18G82 (str)
376
+ ```
377
+
378
+ The "path" to this setting is *info.os_build* and it accepts a string (`str`)
379
+ as value type. To change this setting, run:
380
+
381
+ ```raw
382
+ $ atvremote -s 10.0.10.84 change_setting=info.os_build,19G82
383
+ ```
384
+
385
+ If a setting lists `NoneType` as supported type, you can unset the value
386
+ like this:
387
+
388
+ ```raw
389
+ $ atvremote -s 10.0.10.84 unset_setting=protocols.raop.password
390
+ ```
391
+
392
+ As `atvremote` tries to interpolate the correct data type of input (e.g. it
393
+ will try to interpret "1" as an integer), you might end up with issues if a
394
+ setting expects a number as a string. One example is this:
395
+
396
+ ```raw
397
+ protocols.raop.protocol_version = auto (AirPlayVersion)
398
+ ```
399
+
400
+ `AirPlayVersion` can be either auto, 1 or 2. Trying to change to 1 yields
401
+ an error:
402
+
403
+ ```raw
404
+ $ atvremote -s 10.0.10.84 change_setting=protocols.raop.protocol_version,1
405
+ Traceback (most recent call last):
406
+ ...
407
+ protocol_version
408
+ Input should be a valid string [type=string_type, input_value=1, input_type=int]
409
+ For further information visit https://errors.pydantic.dev/2.1/v/string_type
410
+ ```
411
+
412
+ It expects a string but `atvremote` automatically converts 1 to an integer. To
413
+ circumvent this, you can force an argument to be treated as a string like this:
414
+
415
+ ```raw
416
+ $ atvremote -s 10.0.10.81 'change_setting=protocols.raop.protocol_version,"1"'
417
+ ```
418
+
419
+
420
+
421
+ ## Removing Settings
422
+
423
+ To remove all settings for a device (reverting to defaults), run:
424
+
425
+ ```raw
426
+ $ atvrmote -s <ip> remove_settings
427
+ ```
428
+
429
+ Please beware that you lose everything saved for that device, including
430
+ credentials and passwords!
431
+
432
+ # Working with commands
433
+ <a name="working-with-commands"></a>
434
+
435
+ List supported commands:
436
+
437
+ ```raw
438
+ $ atvremote commands
439
+ Remote control commands:
440
+ - down - Press key down
441
+ - home - Press key home
442
+ - home_hold - Hold key home
443
+ - left - Press key left
444
+ - menu - Press key menu
445
+ - next - Press key next
446
+ - pause - Press key play
447
+ - play - Press key play
448
+ - play_pause - Toggle between play and pause
449
+ ...
450
+ ```
451
+
452
+ If you want additional help for a specific command, use help:
453
+
454
+ ```shell
455
+ $ atvremote help pair
456
+ COMMAND:
457
+ >> pair(self)
458
+
459
+ HELP:
460
+ Pair pyatv as a remote control with an Apple TV.
461
+ ```
462
+
463
+ Multiple commands can be specified a the same time and there's also a `delay` that sleeps
464
+ a certain amount of milliseconds before next command is executed. Here's an example where
465
+ `select` is pressed, followed by `left` after waiting a second:
466
+
467
+ ```raw
468
+ $ atvremote --id 00:11:22:33:44:54 select delay=1000 left
469
+ ```
470
+ ## Play Status
471
+
472
+ Get what is currently playing with `playing`:
473
+
474
+ ```raw
475
+ $ atvremote --id 00:11:22:33:44:54 playing
476
+ Media type: Music
477
+ Device state: Playing
478
+ Position: 0/397s (0.0%)
479
+ Repeat: Off
480
+ Shuffle: False
481
+ ```
482
+
483
+ Artwork with a specific size (width, height) and filename:
484
+
485
+ ```shell
486
+ $ atvremote --id 00:11:22:33:44:54 artwork_save=300,-1,foobar.jpg
487
+ ```
488
+
489
+ Using -1 will let the device decide that parameter in order to keep aspect ratio.
490
+
491
+ ## Remote Control
492
+
493
+ Navigation and playback control:
494
+
495
+ ```shell
496
+ $ atvremote --id 00:11:22:33:44:54 left
497
+ $ atvremote --id 00:11:22:33:44:54 menu
498
+ $ atvremote --id 00:11:22:33:44:54 play
499
+ ```
500
+
501
+ Seek in the currently playing media:
502
+
503
+ ```shell
504
+ $ atvremote --id 00:11:22:33:44:54 set_position=123
505
+ ```
506
+
507
+ ## Device Information
508
+
509
+ Check operating system version:
510
+
511
+ ```raw
512
+ $ atvremote --id 00:11:22:33:44:54 version
513
+ 13.3.1
514
+ ```
515
+
516
+ Or all device information (same as seen with `atvremote scan`):
517
+
518
+ ```raw
519
+ $ atvremote --id 00:11:22:33:44:54 device_info
520
+ Model/SW: 4K tvOS 13.3.1 build 17K795
521
+ MAC: 00:11:22:33:44:55
522
+ ```
523
+
524
+ ## Supported Features
525
+
526
+ ```raw
527
+ $ atvremote -n Vardagsrum -s 10.0.10.81 features
528
+ Feature list:
529
+ -------------
530
+ Up: Available
531
+ Down: Available
532
+ Left: Available
533
+ Right: Available
534
+ ...
535
+
536
+ Legend:
537
+ -------
538
+ Available: Supported by device and usable now
539
+ Unavailable: Supported by device but not usable now
540
+ Unknown: Supported by the device but availability not known
541
+ Unsupported: Not supported by this device (or by pyatv)
542
+ ```
543
+
544
+ ## Apps
545
+
546
+ Show app currently playing something:
547
+
548
+ ```shell
549
+ $ atvremote --id 00:11:22:33:44:54 app
550
+ App: Musik (com.apple.TVMusic)
551
+ ```
552
+
553
+ List installed apps:
554
+
555
+ ```shell
556
+ $ atvremote --id 00:11:22:33:44:54 --companion-credentials `cat companion_credentials` app_list
557
+ App: Podcaster (com.apple.podcasts), App: Filmer (com.apple.TVMovies), App: TV (com.apple.TVWatchList), App: Bilder (com.apple.TVPhotos), App: App Store (com.apple.TVAppStore), App: C More (se.cmore.CMore2), App: Arcade (com.apple.Arcade), App: Sök (com.apple.TVSearch), App: Emby (emby.media.emby-tvos), App: TV4 Play (se.tv4.tv4play), App: Datorer (com.apple.TVHomeSharing), App: YouTube (com.google.ios.youtube), App: Test (in.staahl.TvOS), App: SVT Play (se.svtplay.mobil), App: Plex (com.plexapp.plex), App: Viafree (com.MTGx.ViaFree.se), App: Inställningar (com.apple.TVSettings), App: Apple Events (com.apple.appleevents), App: discovery+ (com.kanal5.play), App: Netflix (com.netflix.Netflix), App: Viaplay (se.harbourfront.viasatondemand), App: Musik (com.apple.TVMusic)
558
+ ```
559
+
560
+ Launching an app:
561
+
562
+ ```shell
563
+ $ atvremote -s 10.0.10.81 --companion-credentials `cat companion_credentials` launch_app=com.netflix.Netflix
564
+ ```
565
+
566
+ ## Streaming
567
+
568
+ Play a video via AirPlay:
569
+
570
+ ```shell
571
+ $ atvremote --id 00:11:22:33:44:54 play_url=http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4
572
+ ```
573
+
574
+ Stream an audio file via AirPlay (RAOP):
575
+
576
+ ```shell
577
+ $ atvremote --id 00:11:22:33:44:54 stream_file=sample.mp3
578
+ ```
579
+
580
+ Stream audio from another process (`ffmpeg` in this case):
581
+
582
+ ```shell
583
+ ffmpeg -i sample.wav -f mp3 - | atvremote -s 10.0.10.194 --debug set_volume=80 stream_file=-
584
+ ```
585
+
586
+ ## Power management
587
+
588
+ You can turn your Apple TV on:
589
+
590
+ $ atvremote -i 00:11:22:33:44:54 turn_on
591
+
592
+ Or turn it off:
593
+
594
+ $ atvremote -i 00:11:22:33:44:54 turn_off
595
+
596
+ Or check the current power state:
597
+
598
+ $ atvremote -i 00:11:22:33:44:54 power_state
599
+
600
+ ## Output devices
601
+
602
+ Show current output devices:
603
+
604
+ ```shell
605
+ $ atvremote --id 00:11:22:33:44:54 --airplay-credentials `cat airplay_credentials` output_devices
606
+ Device: Living room (AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE), Device: Bedroom (FFFFFFFF-GGGG-HHHH-IIII-JJJJJJJJJJJJ)
607
+ ```
608
+
609
+ Only the AirPlay leader device returns the list of output devices, other
610
+ connected AirPlay devices will return an empty list.
611
+
612
+ Add output devices:
613
+
614
+ ```shell
615
+ $ atvremote --id 00:11:22:33:44:54 --airplay-credentials `cat airplay_credentials` add_output_devices=FFFFFFFF-GGGG-HHHH-IIII-JJJJJJJJJJJJ,KK:LL:MM:NN:OO:PP
616
+ ```
617
+
618
+ Remove output devices:
619
+
620
+ ```shell
621
+ $ atvremote --id 00:11:22:33:44:54 --airplay-credentials `cat airplay_credentials` remove_output_devices=AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE,FFFFFFFF-GGGG-HHHH-IIII-JJJJJJJJJJJJ
622
+ ```
623
+
624
+ Set output devices:
625
+
626
+ ```shell
627
+ $ atvremote --id 00:11:22:33:44:54 --airplay-credentials `cat airplay_credentials`
628
+ set_output_devices=AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE,FFFFFFFF-GGGG-HHHH-IIII-JJJJJJJJJJJJ,KK:LL:MM:NN:OO:PP
629
+ ```
630
+
631
+ To discover device IDs to use with these commands, add the devices through the
632
+ iOS UI, then use the `output_devices` command.
633
+
634
+
635
+ # Logging and debugging
636
+
637
+ You can enable additional debugging information by specifying
638
+ either `--verbose` or `--debug`. See
639
+ [Logging](../../development/logging#bundled-scripts) for additional log options.