@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,454 @@
|
|
|
1
|
+
<%
|
|
2
|
+
import os
|
|
3
|
+
import sys
|
|
4
|
+
|
|
5
|
+
import pdoc
|
|
6
|
+
from pdoc.html_helpers import extract_toc, glimpse, to_html as _to_html, format_git_link
|
|
7
|
+
|
|
8
|
+
import pyatv
|
|
9
|
+
|
|
10
|
+
def link(d, name=None, fmt='{}'):
|
|
11
|
+
name = fmt.format(name or d.qualname + ('()' if isinstance(d, pdoc.Function) else ''))
|
|
12
|
+
if not isinstance(d, pdoc.Doc) or isinstance(d, pdoc.External) and not external_links:
|
|
13
|
+
return name
|
|
14
|
+
url = d.url(relative_to=module, link_prefix=link_prefix,
|
|
15
|
+
top_ancestor=not show_inherited_members).replace("index.html", "").replace(".html", "")
|
|
16
|
+
# Ugly, ugly hack to make navigation working in submodules...
|
|
17
|
+
if url == "":
|
|
18
|
+
url = ".."
|
|
19
|
+
elif url.startswith("#"):
|
|
20
|
+
pass
|
|
21
|
+
elif "#" not in url:
|
|
22
|
+
if not url.endswith("/"):
|
|
23
|
+
url += "/"
|
|
24
|
+
else:
|
|
25
|
+
url = "../" + url
|
|
26
|
+
return '<a title="{}" href="{}">{}</a>'.format(d.refname, url, name)
|
|
27
|
+
|
|
28
|
+
def const_link(refname):
|
|
29
|
+
desc = ".".join(refname.split(".")[-2:])
|
|
30
|
+
return f'<a title="{refname}" href="/api/const#{refname}">{desc}</a>'
|
|
31
|
+
|
|
32
|
+
def to_html(text):
|
|
33
|
+
return _to_html(text, module=module, link=link, latex_math=latex_math)
|
|
34
|
+
|
|
35
|
+
# Hack to convert Union[x, NoneType] to Optional[x] like in python 3.9
|
|
36
|
+
def insert_union_types(returns, is_return=True):
|
|
37
|
+
if "Union" in returns and "NoneType" in returns:
|
|
38
|
+
returns = returns.replace("Union[", "Optional[")
|
|
39
|
+
returns = returns.replace(",\N{NBSP}NoneType", "")
|
|
40
|
+
return (' ->\N{NBSP}' if is_return else '') + returns
|
|
41
|
+
%>
|
|
42
|
+
|
|
43
|
+
<%def name="ident(name)"><span class="ident">${name}</span></%def>
|
|
44
|
+
|
|
45
|
+
<%def name="show_source(d)">
|
|
46
|
+
% if (show_source_code or git_link_template) and d.source and d.obj is not getattr(d.inherits, 'obj', None):
|
|
47
|
+
<% git_link = format_git_link(git_link_template, d) %>
|
|
48
|
+
% if show_source_code:
|
|
49
|
+
<details class="source">
|
|
50
|
+
<summary>
|
|
51
|
+
<span>Expand source code</span>
|
|
52
|
+
% if git_link:
|
|
53
|
+
<a href="${git_link}" class="git-link">View at GitHub</a>
|
|
54
|
+
%endif
|
|
55
|
+
</summary>
|
|
56
|
+
<pre><code class="python">${d.source | h}</code></pre>
|
|
57
|
+
</details>
|
|
58
|
+
% elif git_link:
|
|
59
|
+
<div class="git-link-div"><a href="${git_link}" class="git-link">Browse git</a></div>
|
|
60
|
+
%endif
|
|
61
|
+
%endif
|
|
62
|
+
</%def>
|
|
63
|
+
|
|
64
|
+
<%def name="show_desc(d, subclasses=None, short=False)">
|
|
65
|
+
<%
|
|
66
|
+
inherits = ' inherited' if d.inherits else ''
|
|
67
|
+
docstring = glimpse(d.docstring) if short or inherits else d.docstring
|
|
68
|
+
%>
|
|
69
|
+
% if d.inherits:
|
|
70
|
+
<p class="inheritance">
|
|
71
|
+
<em>Inherited from:</em>
|
|
72
|
+
% if hasattr(d.inherits, 'cls'):
|
|
73
|
+
<code>${link(d.inherits.cls)}</code>.<code>${link(d.inherits, d.name)}</code>
|
|
74
|
+
% else:
|
|
75
|
+
<code>${link(d.inherits)}</code>
|
|
76
|
+
% endif
|
|
77
|
+
</p>
|
|
78
|
+
% endif
|
|
79
|
+
${show_protocols(d, subclasses)}
|
|
80
|
+
<section class="desc${inherits}">${docstring | to_html}</section>
|
|
81
|
+
% if not isinstance(d, pdoc.Module):
|
|
82
|
+
${show_source(d)}
|
|
83
|
+
% endif
|
|
84
|
+
</%def>
|
|
85
|
+
|
|
86
|
+
<%def name="show_module_list(modules)">
|
|
87
|
+
<h1>Python module list</h1>
|
|
88
|
+
|
|
89
|
+
% if not modules:
|
|
90
|
+
<p>No modules found.</p>
|
|
91
|
+
% else:
|
|
92
|
+
<dl id="http-server-module-list">
|
|
93
|
+
% for name, desc in modules:
|
|
94
|
+
<div class="flex">
|
|
95
|
+
<dt><a href="${link_prefix}${name}">${name}</a></dt>
|
|
96
|
+
<dd>${desc | glimpse, to_html}</dd>
|
|
97
|
+
</div>
|
|
98
|
+
% endfor
|
|
99
|
+
</dl>
|
|
100
|
+
% endif
|
|
101
|
+
</%def>
|
|
102
|
+
|
|
103
|
+
<%def name="show_column_list(items)">
|
|
104
|
+
<%
|
|
105
|
+
two_column = len(items) >= 6 and all(len(i.name) < 20 for i in items)
|
|
106
|
+
%>
|
|
107
|
+
<ul class="${'two-column' if two_column else ''}">
|
|
108
|
+
% for item in items:
|
|
109
|
+
<li><code>${link(item, item.name)}</code></li>
|
|
110
|
+
% endfor
|
|
111
|
+
</ul>
|
|
112
|
+
</%def>
|
|
113
|
+
|
|
114
|
+
<%def name="show_protocols(f, subclasses)">
|
|
115
|
+
<%
|
|
116
|
+
feature_name = getattr(f.obj, "_feature_name", "")
|
|
117
|
+
refname = "pyatv.const.FeatureName." + feature_name
|
|
118
|
+
protocols = []
|
|
119
|
+
proto_map = {proto.name.lower(): proto for proto in pyatv.const.Protocol}
|
|
120
|
+
%>
|
|
121
|
+
% if feature_name:
|
|
122
|
+
% for subclass in subclasses or []:
|
|
123
|
+
<%
|
|
124
|
+
# Get reference to method/property in protocol implementation
|
|
125
|
+
module_name, name = subclass.qualname.rsplit(".", maxsplit=1)
|
|
126
|
+
module = sys.modules[module_name]
|
|
127
|
+
method = getattr(getattr(module, name), f.name)
|
|
128
|
+
|
|
129
|
+
# If method is a property, extract the getter method
|
|
130
|
+
target = getattr(method, "fget", method)
|
|
131
|
+
if target != f.obj and "facade" not in module.__name__:
|
|
132
|
+
protocols.append(proto_map[module.__name__.split(".")[-1]])
|
|
133
|
+
%>
|
|
134
|
+
% endfor
|
|
135
|
+
<div class="api_feature">
|
|
136
|
+
<span>Feature: ${const_link(refname)},</span>
|
|
137
|
+
<span>Supported by: ${", ".join([const_link(f"pyatv.const.Protocol.{x.name}") for x in protocols])}</span>
|
|
138
|
+
</div>
|
|
139
|
+
%endif
|
|
140
|
+
</%def>
|
|
141
|
+
|
|
142
|
+
<%def name="show_module(module)">
|
|
143
|
+
<%
|
|
144
|
+
variables = module.variables(sort=sort_identifiers)
|
|
145
|
+
classes = module.classes(sort=sort_identifiers)
|
|
146
|
+
functions = module.functions(sort=sort_identifiers)
|
|
147
|
+
submodules = module.submodules()
|
|
148
|
+
%>
|
|
149
|
+
|
|
150
|
+
<%def name="show_func(f, subclasses)">
|
|
151
|
+
<dt id="${f.refname}">
|
|
152
|
+
<code class="name flex">
|
|
153
|
+
<%
|
|
154
|
+
params = ', '.join([insert_union_types(param, is_return=False) for param in f.params(annotate=show_type_annotations, link=link)])
|
|
155
|
+
returns = show_type_annotations and f.return_annotation(link=link) or ''
|
|
156
|
+
if returns:
|
|
157
|
+
returns = insert_union_types(returns)
|
|
158
|
+
%>
|
|
159
|
+
<span>${f.funcdef()} ${ident(f.name)}</span>(<span>${params})${returns}</span>
|
|
160
|
+
</code>
|
|
161
|
+
</dt>
|
|
162
|
+
<dd>
|
|
163
|
+
${show_desc(f, subclasses)}
|
|
164
|
+
</dd>
|
|
165
|
+
</%def>
|
|
166
|
+
|
|
167
|
+
<header>
|
|
168
|
+
% if http_server:
|
|
169
|
+
<nav class="http-server-breadcrumbs">
|
|
170
|
+
<a href="/">All packages</a>
|
|
171
|
+
<% parts = module.name.split('.')[:-1] %>
|
|
172
|
+
% for i, m in enumerate(parts):
|
|
173
|
+
<% parent = '.'.join(parts[:i+1]) %>
|
|
174
|
+
:: <a href="/${parent.replace('.', '/')}/">${parent}</a>
|
|
175
|
+
% endfor
|
|
176
|
+
</nav>
|
|
177
|
+
% endif
|
|
178
|
+
<h1 class="title">${'Namespace' if module.is_namespace else 'Module'} <code>${module.name}</code></h1>
|
|
179
|
+
</header>
|
|
180
|
+
|
|
181
|
+
<section id="section-intro">
|
|
182
|
+
${module.docstring | to_html}
|
|
183
|
+
${show_source(module)}
|
|
184
|
+
</section>
|
|
185
|
+
|
|
186
|
+
<section>
|
|
187
|
+
% if submodules:
|
|
188
|
+
<h2 class="section-title" id="header-submodules">Sub-modules</h2>
|
|
189
|
+
<dl>
|
|
190
|
+
% for m in submodules:
|
|
191
|
+
<dt><code class="name">${link(m)}</code></dt>
|
|
192
|
+
<dd>${show_desc(m, short=True)}</dd>
|
|
193
|
+
% endfor
|
|
194
|
+
</dl>
|
|
195
|
+
% endif
|
|
196
|
+
</section>
|
|
197
|
+
|
|
198
|
+
<section>
|
|
199
|
+
% if variables:
|
|
200
|
+
<h2 class="section-title" id="header-variables">Global variables</h2>
|
|
201
|
+
<dl>
|
|
202
|
+
% for v in variables:
|
|
203
|
+
<dt id="${v.refname}"><code class="name">var ${ident(v.name)}</code></dt>
|
|
204
|
+
<dd>${show_desc(v)}</dd>
|
|
205
|
+
% endfor
|
|
206
|
+
</dl>
|
|
207
|
+
% endif
|
|
208
|
+
</section>
|
|
209
|
+
|
|
210
|
+
<section>
|
|
211
|
+
% if functions:
|
|
212
|
+
<h2 class="section-title" id="header-functions">Functions</h2>
|
|
213
|
+
<dl>
|
|
214
|
+
% for f in functions:
|
|
215
|
+
${show_func(f, [])}
|
|
216
|
+
% endfor
|
|
217
|
+
</dl>
|
|
218
|
+
% endif
|
|
219
|
+
</section>
|
|
220
|
+
|
|
221
|
+
<section>
|
|
222
|
+
% if classes:
|
|
223
|
+
<h2 class="section-title" id="header-classes">Classes</h2>
|
|
224
|
+
<dl>
|
|
225
|
+
% for c in classes:
|
|
226
|
+
<%
|
|
227
|
+
class_vars = c.class_variables(show_inherited_members, sort=sort_identifiers)
|
|
228
|
+
smethods = c.functions(show_inherited_members, sort=sort_identifiers)
|
|
229
|
+
inst_vars = c.instance_variables(show_inherited_members, sort=sort_identifiers)
|
|
230
|
+
methods = c.methods(show_inherited_members, sort=sort_identifiers)
|
|
231
|
+
mro = c.mro()
|
|
232
|
+
subclasses = c.subclasses()
|
|
233
|
+
params = ', '.join([insert_union_types(param, is_return=False) for param in c.params(annotate=show_type_annotations, link=link)])
|
|
234
|
+
%>
|
|
235
|
+
<dt id="${c.refname}"><code class="flex name class">
|
|
236
|
+
<span>class ${ident(c.name)}</span>
|
|
237
|
+
% if params:
|
|
238
|
+
<span>(</span><span>${params})</span>
|
|
239
|
+
% endif
|
|
240
|
+
</code></dt>
|
|
241
|
+
|
|
242
|
+
<dd>${show_desc(c)}
|
|
243
|
+
|
|
244
|
+
% if mro:
|
|
245
|
+
<h3>Ancestors</h3>
|
|
246
|
+
<ul class="hlist">
|
|
247
|
+
% for cls in mro:
|
|
248
|
+
<li>${link(cls)}</li>
|
|
249
|
+
% endfor
|
|
250
|
+
</ul>
|
|
251
|
+
%endif
|
|
252
|
+
|
|
253
|
+
% if subclasses:
|
|
254
|
+
<h3>Subclasses</h3>
|
|
255
|
+
<ul class="hlist">
|
|
256
|
+
% for sub in subclasses:
|
|
257
|
+
<li>${link(sub)}</li>
|
|
258
|
+
% endfor
|
|
259
|
+
</ul>
|
|
260
|
+
% endif
|
|
261
|
+
% if class_vars:
|
|
262
|
+
<h3>Class variables</h3>
|
|
263
|
+
<dl>
|
|
264
|
+
% for v in class_vars:
|
|
265
|
+
<%
|
|
266
|
+
var_type = show_type_annotations and v.type_annotation(link=link) or ''
|
|
267
|
+
if var_type:
|
|
268
|
+
var_type = insert_union_types(var_type)
|
|
269
|
+
|
|
270
|
+
# Try to extract value from enums and pydantic models
|
|
271
|
+
var_value = ""
|
|
272
|
+
if any(cls.name.startswith("enum.") for cls in mro):
|
|
273
|
+
var_value = f" = {getattr(c.obj, v.name).value}"
|
|
274
|
+
elif any(cls.name.startswith("pydantic.main.BaseModel") for cls in mro):
|
|
275
|
+
if hasattr(c.obj, "__fields__"):
|
|
276
|
+
field_info = c.obj.__fields__[v.name]
|
|
277
|
+
else:
|
|
278
|
+
field_info = c.obj.model_fields[v.name]
|
|
279
|
+
|
|
280
|
+
# Ignore fields that are pydantic models as they produce unnecessary output
|
|
281
|
+
if "__pydantic_serializer__" not in dir(field_info.annotation):
|
|
282
|
+
var_value = f" = {field_info.default}"
|
|
283
|
+
%>
|
|
284
|
+
<dt id="${v.refname}"><code class="name">var ${ident(v.name)}${var_type}${var_value}</code></dt>
|
|
285
|
+
<dd>${show_desc(v)}</dd>
|
|
286
|
+
% endfor
|
|
287
|
+
</dl>
|
|
288
|
+
% endif
|
|
289
|
+
% if smethods:
|
|
290
|
+
<h3>Static methods</h3>
|
|
291
|
+
<dl>
|
|
292
|
+
% for f in smethods:
|
|
293
|
+
${show_func(f, subclasses)}
|
|
294
|
+
% endfor
|
|
295
|
+
</dl>
|
|
296
|
+
% endif
|
|
297
|
+
% if inst_vars:
|
|
298
|
+
<h3>Instance variables</h3>
|
|
299
|
+
<dl>
|
|
300
|
+
% for v in inst_vars:
|
|
301
|
+
<%
|
|
302
|
+
var_type = show_type_annotations and v.type_annotation(link=link) or ''
|
|
303
|
+
if var_type:
|
|
304
|
+
var_type = insert_union_types(var_type)
|
|
305
|
+
%>
|
|
306
|
+
<dt id="${v.refname}"><code class="name">var ${ident(v.name)}${var_type}</code></dt>
|
|
307
|
+
<dd>${show_desc(v, subclasses)}</dd>
|
|
308
|
+
% endfor
|
|
309
|
+
</dl>
|
|
310
|
+
% endif
|
|
311
|
+
% if methods:
|
|
312
|
+
<h3>Methods</h3>
|
|
313
|
+
<dl>
|
|
314
|
+
% for f in methods:
|
|
315
|
+
${show_func(f, subclasses)}
|
|
316
|
+
% endfor
|
|
317
|
+
</dl>
|
|
318
|
+
% endif
|
|
319
|
+
|
|
320
|
+
% if not show_inherited_members:
|
|
321
|
+
<%
|
|
322
|
+
members = c.inherited_members()
|
|
323
|
+
%>
|
|
324
|
+
% if members:
|
|
325
|
+
<h3>Inherited members</h3>
|
|
326
|
+
<ul class="hlist">
|
|
327
|
+
% for cls, mems in members:
|
|
328
|
+
<li><code><b>${link(cls)}</b></code>:
|
|
329
|
+
<ul class="hlist">
|
|
330
|
+
% for m in mems:
|
|
331
|
+
<li><code>${link(m, name=m.name)}</code></li>
|
|
332
|
+
% endfor
|
|
333
|
+
</ul>
|
|
334
|
+
|
|
335
|
+
</li>
|
|
336
|
+
% endfor
|
|
337
|
+
</ul>
|
|
338
|
+
% endif
|
|
339
|
+
% endif
|
|
340
|
+
|
|
341
|
+
</dd>
|
|
342
|
+
% endfor
|
|
343
|
+
</dl>
|
|
344
|
+
% endif
|
|
345
|
+
</section>
|
|
346
|
+
</%def>
|
|
347
|
+
|
|
348
|
+
<%def name="module_index(module)">
|
|
349
|
+
<%
|
|
350
|
+
variables = module.variables(sort=sort_identifiers)
|
|
351
|
+
classes = module.classes(sort=sort_identifiers)
|
|
352
|
+
functions = module.functions(sort=sort_identifiers)
|
|
353
|
+
submodules = module.submodules()
|
|
354
|
+
supermodule = module.supermodule
|
|
355
|
+
%>
|
|
356
|
+
<nav id="sidebar">
|
|
357
|
+
|
|
358
|
+
<h1>Index</h1>
|
|
359
|
+
${extract_toc(module.docstring) if extract_module_toc_into_sidebar else ''}
|
|
360
|
+
|
|
361
|
+
% if "__pdoc_dev_page__" in dir(module.obj):
|
|
362
|
+
This module has additional documentation
|
|
363
|
+
<a title="test" href=${f"{module.obj.__pdoc_dev_page__}"}>here</a>.
|
|
364
|
+
% endif
|
|
365
|
+
|
|
366
|
+
<ul id="index">
|
|
367
|
+
% if supermodule:
|
|
368
|
+
<li><h3>Super-module</h3>
|
|
369
|
+
<ul>
|
|
370
|
+
<li><code>${link(supermodule)}</code></li>
|
|
371
|
+
</ul>
|
|
372
|
+
</li>
|
|
373
|
+
% endif
|
|
374
|
+
|
|
375
|
+
% if submodules:
|
|
376
|
+
<li><h3><a href="#header-submodules">Sub-modules</a></h3>
|
|
377
|
+
<ul>
|
|
378
|
+
% for m in submodules:
|
|
379
|
+
<li><code>${link(m)}</code></li>
|
|
380
|
+
% endfor
|
|
381
|
+
</ul>
|
|
382
|
+
</li>
|
|
383
|
+
% endif
|
|
384
|
+
|
|
385
|
+
% if variables:
|
|
386
|
+
<li><h3><a href="#header-variables">Global variables</a></h3>
|
|
387
|
+
${show_column_list(variables)}
|
|
388
|
+
</li>
|
|
389
|
+
% endif
|
|
390
|
+
|
|
391
|
+
% if functions:
|
|
392
|
+
<li><h3><a href="#header-functions">Functions</a></h3>
|
|
393
|
+
${show_column_list(functions)}
|
|
394
|
+
</li>
|
|
395
|
+
% endif
|
|
396
|
+
|
|
397
|
+
% if classes:
|
|
398
|
+
<li><h3><a href="#header-classes">Classes</a></h3>
|
|
399
|
+
<ul>
|
|
400
|
+
% for c in classes:
|
|
401
|
+
<li>
|
|
402
|
+
<h4><code>${link(c)}</code></h4>
|
|
403
|
+
<%
|
|
404
|
+
members = c.functions(sort=sort_identifiers) + c.methods(sort=sort_identifiers)
|
|
405
|
+
if list_class_variables_in_index:
|
|
406
|
+
members += (c.instance_variables(sort=sort_identifiers) +
|
|
407
|
+
c.class_variables(sort=sort_identifiers))
|
|
408
|
+
if not show_inherited_members:
|
|
409
|
+
members = [i for i in members if not i.inherits]
|
|
410
|
+
if sort_identifiers:
|
|
411
|
+
members = sorted(members)
|
|
412
|
+
%>
|
|
413
|
+
% if members:
|
|
414
|
+
${show_column_list(members)}
|
|
415
|
+
% endif
|
|
416
|
+
</li>
|
|
417
|
+
% endfor
|
|
418
|
+
</ul>
|
|
419
|
+
</li>
|
|
420
|
+
% endif
|
|
421
|
+
|
|
422
|
+
</ul>
|
|
423
|
+
</nav>
|
|
424
|
+
</%def>
|
|
425
|
+
|
|
426
|
+
<%
|
|
427
|
+
url = module.name.replace("pyatv", "").replace(".", "/")
|
|
428
|
+
if url.startswith("/"):
|
|
429
|
+
url = url[1:]
|
|
430
|
+
if not url.endswith("/"):
|
|
431
|
+
url += "/"
|
|
432
|
+
%>
|
|
433
|
+
|
|
434
|
+
---
|
|
435
|
+
layout: template
|
|
436
|
+
title: API - ${module.name}
|
|
437
|
+
permalink: /api/${url}
|
|
438
|
+
link_group: api
|
|
439
|
+
---
|
|
440
|
+
|
|
441
|
+
% if module_list:
|
|
442
|
+
<article id="content">
|
|
443
|
+
${show_module_list(modules)}
|
|
444
|
+
</article>
|
|
445
|
+
% else:
|
|
446
|
+
${module_index(module)}
|
|
447
|
+
<article id="content">
|
|
448
|
+
${show_module(module)}
|
|
449
|
+
</article>
|
|
450
|
+
% endif
|
|
451
|
+
|
|
452
|
+
<footer id="footer">
|
|
453
|
+
<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite>.</p>
|
|
454
|
+
</footer>
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
---
|
|
2
|
+
layout: template
|
|
3
|
+
title: Acknowledgements
|
|
4
|
+
permalink: /support/acknowledgements/
|
|
5
|
+
link_group: support
|
|
6
|
+
---
|
|
7
|
+
# Acknowledgements
|
|
8
|
+
|
|
9
|
+
A *lot* of time and effort has been put into this project in order
|
|
10
|
+
to get where it is today. Some things I've done myself, but I could
|
|
11
|
+
of course not have done it all without help. So this page is a small
|
|
12
|
+
dedication the rest of you!
|
|
13
|
+
|
|
14
|
+
## External Projects
|
|
15
|
+
|
|
16
|
+
**[GitHub](https://github.com)**
|
|
17
|
+
|
|
18
|
+
Thanks for providing a good, integrated platform supporting free and
|
|
19
|
+
open source software. Since the launch of Pages and Actions I've
|
|
20
|
+
managed to move more or less completely to rely on GitHub services,
|
|
21
|
+
which is great!
|
|
22
|
+
|
|
23
|
+
**[mediaremotetv-protocol](https://github.com/jeanregisser/mediaremotetv-protocol)**
|
|
24
|
+
|
|
25
|
+
Thanks to Jean Regisser, which started exploring the Media Remote Protocol
|
|
26
|
+
and giving early insights. The `MRP` support is based on this findings.
|
|
27
|
+
It also helped me complete the reverse engineering of the protocol.
|
|
28
|
+
Some of my findings I have already submitted back.
|
|
29
|
+
|
|
30
|
+
**[pdoc3](https://pdoc3.github.io/pdoc/)**
|
|
31
|
+
|
|
32
|
+
Every library needs an API reference. I use pdoc3 for that due to its
|
|
33
|
+
flexibility. With some tweaks it integrates neatly with the rest of the
|
|
34
|
+
documentation.
|
|
35
|
+
|
|
36
|
+
**[miniaudio](https://github.com/mackron/miniaudio) / [pyminiaudio](https://github.com/irmen/pyminiaudio)**
|
|
37
|
+
|
|
38
|
+
Excellent minimalistic library for decoding and working with audio files! Supports
|
|
39
|
+
most relevant audio formats and operating systems. This library is vital
|
|
40
|
+
for audio streaming in RAOP (used via the python library).
|
|
41
|
+
|
|
42
|
+
## Contributors
|
|
43
|
+
|
|
44
|
+
This is a complete list of everyone that has contributed code to
|
|
45
|
+
the project: thank you!
|
|
46
|
+
|
|
47
|
+
```raw
|
|
48
|
+
acheronfail <acheronfail at gmail.com>
|
|
49
|
+
Alexandre Pulido <apulido at free.fr>
|
|
50
|
+
Alexey <alexey.www at gmail.com>
|
|
51
|
+
Andreas Billmeier <b at edevau.net>
|
|
52
|
+
Colin <12702068+ckeehan at users.noreply.github.com>
|
|
53
|
+
Colin <ckeehan at me.com>
|
|
54
|
+
crxporter <38265886+crxporter at users.noreply.github.com>
|
|
55
|
+
Dennis Frommknecht <dfrommi at users.noreply.github.com>
|
|
56
|
+
Doug Hoffman <doug+github at hoff.mn>
|
|
57
|
+
Erik Hendrix <hendrix_erik at hotmail.com>
|
|
58
|
+
jakobjjw <73580309+jakobjjw at users.noreply.github.com>
|
|
59
|
+
jdsnape <joel at sna.pe>
|
|
60
|
+
J. Nick Koston <nick at koston.org>
|
|
61
|
+
John Lian <jlian at users.noreply.github.com>
|
|
62
|
+
KibosJ <29429479+KibosJ at users.noreply.github.com>
|
|
63
|
+
Lucas Christian <lucas at lucasec.com>
|
|
64
|
+
Maximilian Leith <maximilian at leith.de>
|
|
65
|
+
Michael Carroll <mrc at apple.com>
|
|
66
|
+
Michał Modzelewski <michal.modzelewski at gmail.com>
|
|
67
|
+
Nebz <28622481+NebzHB at users.noreply.github.com>
|
|
68
|
+
Paul <itsascambutmailmeanyway at gmail.com>
|
|
69
|
+
Pierre Ståhl <pierre.sigma at renzgroup.com>
|
|
70
|
+
Pierre Ståhl <pierre.staahl at gmail.com>
|
|
71
|
+
Pierrick Rouxel <pierrick.rouxel at me.com>
|
|
72
|
+
Raymond Ha <raymond at shraymonks.com>
|
|
73
|
+
Robbie Trencheny <me at robbiet.us>
|
|
74
|
+
Rob Nee <robnee at hotmail.com>
|
|
75
|
+
sassukeuchiha <116432455+sassukeuchiha at users.noreply.github.com>
|
|
76
|
+
SchlaubiSchlump <Schlaubischlump at users.noreply.github.com>
|
|
77
|
+
Sebastian Pekarek <mail at sebbo.net>
|
|
78
|
+
Stackie Jia <jsq2627 at gmail.com>
|
|
79
|
+
stickpin <630000+stickpin at users.noreply.github.com>
|
|
80
|
+
stimulated <56211318+xpnewmedia at users.noreply.github.com>
|
|
81
|
+
Sylvain CECCHETTO <cecchetto.sylvain at me.com>
|
|
82
|
+
Will Ross <paxswill at paxswill.com>
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
*The list is manuallt updated, so if you are missing feel to send a
|
|
86
|
+
PR. The list is generated with:
|
|
87
|
+
`git log --format="%aN <%aE>" | sort | uniq | egrep -v "dependabot" | sed -s 's/@/ at /'`*
|