@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.
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +89 -9
- package/dist/index.js.map +1 -1
- package/dist/mdns.d.ts.map +1 -1
- package/dist/mdns.js +96 -11
- package/dist/mdns.js.map +1 -1
- package/examples/print-device-json.js +22 -0
- package/package.json +2 -3
- package/pyatv/.codecov.yml +38 -0
- package/pyatv/.github/FUNDING.yml +3 -0
- package/pyatv/.github/ISSUE_TEMPLATE/bug_report.yml +80 -0
- package/pyatv/.github/ISSUE_TEMPLATE/config.yml +1 -0
- package/pyatv/.github/ISSUE_TEMPLATE/feature_request.yml +22 -0
- package/pyatv/.github/ISSUE_TEMPLATE/implementation-proposal.yml +29 -0
- package/pyatv/.github/ISSUE_TEMPLATE/investigation.yml +16 -0
- package/pyatv/.github/ISSUE_TEMPLATE/minor-change.yml +10 -0
- package/pyatv/.github/ISSUE_TEMPLATE/question-or-idea.yml +11 -0
- package/pyatv/.github/dependabot.yml +26 -0
- package/pyatv/.github/workflows/codeql-analysis.yml +71 -0
- package/pyatv/.github/workflows/release.yml +160 -0
- package/pyatv/.github/workflows/tests.yml +104 -0
- package/pyatv/.gitpod.yml +23 -0
- package/pyatv/CHANGES.md +3708 -0
- package/pyatv/CODE_OF_CONDUCT.md +76 -0
- package/pyatv/CONTRIBUTING.md +72 -0
- package/pyatv/CONTRIBUTORS.md +3 -0
- package/pyatv/Dockerfile +15 -0
- package/pyatv/LICENSE.md +9 -0
- package/pyatv/MANIFEST.in +14 -0
- package/pyatv/README.md +111 -0
- package/pyatv/base_versions.txt +13 -0
- package/pyatv/chickn.yaml +75 -0
- package/pyatv/docs/404.html +24 -0
- package/pyatv/docs/CNAME +1 -0
- package/pyatv/docs/Gemfile +31 -0
- package/pyatv/docs/_config.yml +121 -0
- package/pyatv/docs/_includes/api +10 -0
- package/pyatv/docs/_includes/atvremote_scan +32 -0
- package/pyatv/docs/_includes/code +6 -0
- package/pyatv/docs/_includes/issue +14 -0
- package/pyatv/docs/_includes/pypi +5 -0
- package/pyatv/docs/_layouts/template.html +109 -0
- package/pyatv/docs/api/pyatv.conf.html +312 -0
- package/pyatv/docs/api/pyatv.const.html +974 -0
- package/pyatv/docs/api/pyatv.convert.html +106 -0
- package/pyatv/docs/api/pyatv.exceptions.html +489 -0
- package/pyatv/docs/api/pyatv.helpers.html +102 -0
- package/pyatv/docs/api/pyatv.html +120 -0
- package/pyatv/docs/api/pyatv.interface.html +2369 -0
- package/pyatv/docs/api/pyatv.settings.html +484 -0
- package/pyatv/docs/api/pyatv.storage.file_storage.html +102 -0
- package/pyatv/docs/api/pyatv.storage.html +186 -0
- package/pyatv/docs/api/pyatv.storage.memory_storage.html +83 -0
- package/pyatv/docs/assets/css/custom.css +19 -0
- package/pyatv/docs/assets/css/hljs.css +1 -0
- package/pyatv/docs/assets/css/normalize.css +349 -0
- package/pyatv/docs/assets/css/pdoc.css +287 -0
- package/pyatv/docs/assets/css/sanitize.css +566 -0
- package/pyatv/docs/assets/css/style.scss +9 -0
- package/pyatv/docs/assets/img/logo.svg +63 -0
- package/pyatv/docs/assets/js/highlight.9.12.0.min.js +3 -0
- package/pyatv/docs/assets/js/mermaid.8.9.2.min.js +32 -0
- package/pyatv/docs/assets/js/mermaid.min.js.map +1 -0
- package/pyatv/docs/development/apps.md +81 -0
- package/pyatv/docs/development/audio.md +42 -0
- package/pyatv/docs/development/control.md +56 -0
- package/pyatv/docs/development/development.md +15 -0
- package/pyatv/docs/development/device_info.md +36 -0
- package/pyatv/docs/development/examples.md +44 -0
- package/pyatv/docs/development/features.md +70 -0
- package/pyatv/docs/development/keyboard.md +51 -0
- package/pyatv/docs/development/listeners.md +144 -0
- package/pyatv/docs/development/logging.md +55 -0
- package/pyatv/docs/development/metadata.md +115 -0
- package/pyatv/docs/development/power_management.md +53 -0
- package/pyatv/docs/development/scan_pair_and_connect.md +331 -0
- package/pyatv/docs/development/services.md +9 -0
- package/pyatv/docs/development/storage.md +259 -0
- package/pyatv/docs/development/stream.md +241 -0
- package/pyatv/docs/development/testing.md +9 -0
- package/pyatv/docs/documentation/atvlog.md +64 -0
- package/pyatv/docs/documentation/atvproxy.md +244 -0
- package/pyatv/docs/documentation/atvremote.md +639 -0
- package/pyatv/docs/documentation/atvscript.md +275 -0
- package/pyatv/docs/documentation/concepts.md +168 -0
- package/pyatv/docs/documentation/documentation.md +130 -0
- package/pyatv/docs/documentation/getting_started.md +248 -0
- package/pyatv/docs/documentation/protocols.md +1959 -0
- package/pyatv/docs/documentation/supported_features.md +246 -0
- package/pyatv/docs/documentation/tutorial.md +1062 -0
- package/pyatv/docs/documentation/workspace.code-workspace +7 -0
- package/pyatv/docs/favicon.ico +0 -0
- package/pyatv/docs/index.md +109 -0
- package/pyatv/docs/internals/design.md +354 -0
- package/pyatv/docs/internals/documentation.md +84 -0
- package/pyatv/docs/internals/interfaces.md +95 -0
- package/pyatv/docs/internals/internals.md +157 -0
- package/pyatv/docs/internals/submit_pr.md +56 -0
- package/pyatv/docs/internals/testing.md +176 -0
- package/pyatv/docs/internals/tools.md +574 -0
- package/pyatv/docs/pdoc_templates/config.mako +46 -0
- package/pyatv/docs/pdoc_templates/html.mako +454 -0
- package/pyatv/docs/support/acknowledgements.md +87 -0
- package/pyatv/docs/support/faq.md +214 -0
- package/pyatv/docs/support/migration.md +138 -0
- package/pyatv/docs/support/scanning_issues.md +110 -0
- package/pyatv/docs/support/support.md +18 -0
- package/pyatv/docs/support/troubleshooting.md +83 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/AudioFadeMessage.proto +13 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/AudioFadeMessage_pb2.pyi +37 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/AudioFadeResponseMessage.proto +11 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/AudioFadeResponseMessage_pb2.pyi +32 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/AudioFormatSettingsMessage.proto +5 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/AudioFormatSettingsMessage_pb2.pyi +27 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/ClientUpdatesConfigMessage.proto +16 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/ClientUpdatesConfigMessage_pb2.pyi +44 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/CommandInfo.proto +117 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/CommandInfo_pb2.pyi +325 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/CommandOptions.proto +36 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/CommandOptions_pb2.pyi +115 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/Common.proto +79 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/Common_pb2.pyi +228 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/ConfigureConnectionMessage.proto +11 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/ConfigureConnectionMessage_pb2.pyi +32 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/ContentItem.proto +27 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/ContentItemMetadata.proto +213 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/ContentItemMetadata_pb2.pyi +630 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/ContentItem_pb2.pyi +94 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/CryptoPairingMessage.proto +15 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/CryptoPairingMessage_pb2.pyi +46 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/DeviceInfoMessage.proto +69 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/DeviceInfoMessage_pb2.pyi +226 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/GenericMessage.proto +12 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/GenericMessage_pb2.pyi +35 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/GetKeyboardSessionMessage.proto +11 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/GetKeyboardSessionMessage_pb2.pyi +26 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/GetRemoteTextInputSessionMessage.proto +10 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/GetRemoteTextInputSessionMessage_pb2.pyi +26 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/GetVolumeMessage.proto +11 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/GetVolumeMessage_pb2.pyi +32 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/GetVolumeResultMessage.proto +11 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/GetVolumeResultMessage_pb2.pyi +32 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/KeyboardMessage.proto +88 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/KeyboardMessage_pb2.pyi +261 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/LanguageOption.proto +9 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/LanguageOption_pb2.pyi +42 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/ModifyOutputContextRequestMessage.proto +23 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/ModifyOutputContextRequestMessage_pb2.pyi +86 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/NotificationMessage.proto +12 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/NotificationMessage_pb2.pyi +38 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/NowPlayingClient.proto +12 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/NowPlayingClient_pb2.pyi +49 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/NowPlayingInfo.proto +24 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/NowPlayingInfo_pb2.pyi +79 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/NowPlayingPlayer.proto +11 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/NowPlayingPlayer_pb2.pyi +45 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/Origin.proto +17 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/OriginClientPropertiesMessage.proto +11 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/OriginClientPropertiesMessage_pb2.pyi +32 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/Origin_pb2.pyi +63 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/PlaybackQueue.proto +15 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/PlaybackQueueCapabilities.proto +7 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/PlaybackQueueCapabilities_pb2.pyi +33 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/PlaybackQueueContext.proto +5 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/PlaybackQueueContext_pb2.pyi +27 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/PlaybackQueueRequestMessage.proto +29 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/PlaybackQueueRequestMessage_pb2.pyi +87 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/PlaybackQueue_pb2.pyi +53 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/PlayerClientPropertiesMessage.proto +13 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/PlayerClientPropertiesMessage_pb2.pyi +37 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/PlayerPath.proto +11 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/PlayerPath_pb2.pyi +39 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/ProtocolMessage.proto +171 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/ProtocolMessage_pb2.pyi +377 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/RegisterForGameControllerEventsMessage.proto +18 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/RegisterForGameControllerEventsMessage_pb2.pyi +54 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/RegisterHIDDeviceMessage.proto +12 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/RegisterHIDDeviceMessage_pb2.pyi +34 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/RegisterHIDDeviceResultMessage.proto +12 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/RegisterHIDDeviceResultMessage_pb2.pyi +35 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/RegisterVoiceInputDeviceMessage.proto +12 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/RegisterVoiceInputDeviceMessage_pb2.pyi +34 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/RegisterVoiceInputDeviceResponseMessage.proto +12 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/RegisterVoiceInputDeviceResponseMessage_pb2.pyi +35 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/RemoteTextInputMessage.proto +13 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/RemoteTextInputMessage_pb2.pyi +38 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/RemoveClientMessage.proto +12 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/RemoveClientMessage_pb2.pyi +34 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/RemoveEndpointsMessage.proto +11 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/RemoveEndpointsMessage_pb2.pyi +34 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/RemoveOutputDevicesMessage.proto +12 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/RemoveOutputDevicesMessage_pb2.pyi +38 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/RemovePlayerMessage.proto +12 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/RemovePlayerMessage_pb2.pyi +34 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SendButtonEventMessage.proto +13 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SendButtonEventMessage_pb2.pyi +38 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SendCommandMessage.proto +16 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SendCommandMessage_pb2.pyi +43 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SendCommandResultMessage.proto +100 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SendCommandResultMessage_pb2.pyi +286 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SendHIDEventMessage.proto +41 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SendHIDEventMessage_pb2.pyi +63 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SendPackedVirtualTouchEventMessage.proto +24 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SendPackedVirtualTouchEventMessage_pb2.pyi +64 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SendVoiceInputMessage.proto +38 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SendVoiceInputMessage_pb2.pyi +134 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SetArtworkMessage.proto +11 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SetArtworkMessage_pb2.pyi +32 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SetConnectionStateMessage.proto +18 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SetConnectionStateMessage_pb2.pyi +54 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SetDefaultSupportedCommandsMessage.proto +28 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SetDefaultSupportedCommandsMessage_pb2.pyi +74 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SetDiscoveryModeMessage.proto +12 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SetDiscoveryModeMessage_pb2.pyi +35 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SetHiliteModeMessage.proto +11 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SetHiliteModeMessage_pb2.pyi +32 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SetNowPlayingClientMessage.proto +12 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SetNowPlayingClientMessage_pb2.pyi +34 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SetNowPlayingPlayerMessage.proto +12 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SetNowPlayingPlayerMessage_pb2.pyi +34 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SetRecordingStateMessage.proto +17 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SetRecordingStateMessage_pb2.pyi +54 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SetStateMessage.proto +27 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SetStateMessage_pb2.pyi +72 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SetVolumeMessage.proto +12 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SetVolumeMessage_pb2.pyi +35 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SupportedCommands.proto +7 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/SupportedCommands_pb2.pyi +30 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/TextInputMessage.proto +23 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/TextInputMessage_pb2.pyi +76 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/TransactionKey.proto +6 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/TransactionKey_pb2.pyi +30 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/TransactionMessage.proto +15 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/TransactionMessage_pb2.pyi +42 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/TransactionPacket.proto +11 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/TransactionPacket_pb2.pyi +41 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/TransactionPackets.proto +7 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/TransactionPackets_pb2.pyi +30 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/UpdateClientMessage.proto +12 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/UpdateClientMessage_pb2.pyi +34 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/UpdateContentItemArtworkMessage.proto +14 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/UpdateContentItemArtworkMessage_pb2.pyi +41 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/UpdateContentItemMessage.proto +14 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/UpdateContentItemMessage_pb2.pyi +41 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/UpdateEndPointsMessage.proto +25 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/UpdateEndPointsMessage_pb2.pyi +74 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/UpdateOutputDeviceMessage.proto +88 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/UpdateOutputDeviceMessage_pb2.pyi +277 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/UpdatePlayerPath.proto +12 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/UpdatePlayerPath_pb2.pyi +34 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/VirtualTouchDeviceDescriptorMessage.proto +8 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/VirtualTouchDeviceDescriptorMessage_pb2.pyi +36 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/VoiceInputDeviceDescriptorMessage.proto +8 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/VoiceInputDeviceDescriptorMessage_pb2.pyi +35 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/VolumeControlAvailabilityMessage.proto +23 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/VolumeControlAvailabilityMessage_pb2.pyi +71 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/VolumeControlCapabilitiesDidChangeMessage.proto +14 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/VolumeControlCapabilitiesDidChangeMessage_pb2.pyi +40 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/VolumeDidChangeMessage.proto +13 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/VolumeDidChangeMessage_pb2.pyi +38 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/WakeDeviceMessage.proto +11 -0
- package/pyatv/pyatv/protocols/mrp/protobuf/WakeDeviceMessage_pb2.pyi +26 -0
- package/pyatv/pyatv/py.typed +0 -0
- package/pyatv/pylintrc +49 -0
- package/pyatv/pyproject.toml +74 -0
- package/pyatv/requirements/requirements.txt +14 -0
- package/pyatv/requirements/requirements_docs.txt +2 -0
- package/pyatv/requirements/requirements_test.txt +20 -0
- package/pyatv/scripts/build_docs.sh +17 -0
- package/pyatv/scripts/setup_dev_env.sh +83 -0
- package/pyatv/setup.cfg +14 -0
- package/pyatv/tests/data/README +23 -0
- package/pyatv/tests/data/audio_10_frames.wav +0 -0
- package/pyatv/tests/data/audio_1_packet_metadata.wav +0 -0
- package/pyatv/tests/data/audio_3_packets.wav +0 -0
- package/pyatv/tests/data/only_metadata.wav +0 -0
- package/pyatv/tests/data/only_title.wav +0 -0
- package/pyatv/tests/data/static_3sec.ogg +0 -0
- package/pyatv/tests/data/testfile.txt +1 -0
- package/pyatv/tests/support/pyatv.code-workspace +14 -0
- package/src/index.ts +122 -8
- 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.
|