{"adoption": {"forks": 141, "observed_at": "2026-08-28T04:03:50.942773+00:00", "stars": 1168}, "canonical_url": "https://ross.abutalabs.com/products/pyatv", "card": {"archived": false, "artifact_type": "library", "description": "A client library for Apple TV and AirPlay devices", "domain": ["developer-tools", "media", "self-hosted"], "enriched": true, "function": ["sdk", "cli", "audio-processing", "developer-tools"], "health_score": 98, "homepage": "https://pyatv.dev", "language": "Python", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["postlund/pyatv"], "name": "postlund/pyatv", "platform": ["python", "windows", "cross-platform", "cli"], "pushed_at": "2026-08-14T04:04:07+00:00", "repo": "postlund/pyatv", "stars": 1168, "tags": ["apple-tv", "airplay", "raop", "asyncio", "home-automation", "media-streaming", "zeroconf", "remote-control", "automation", "macos", "linux"], "topics": ["home-automation", "apple-tv", "python3", "asyncio", "pypi", "hacktoberfest", "airplay", "raop"], "urls": [], "use_cases": ["control an Apple TV from a Python script", "stream audio to AirPlay speakers like HomePod", "get currently playing metadata from an Apple TV", "integrate Apple TV control into Home Assistant", "discover Apple TV devices on the local network", "launch apps on an Apple TV programmatically", "script Apple TV commands with JSON output"], "what_it_is": "pyatv is an asyncio-based Python client library for interacting with Apple TV and AirPlay devices, supporting remote control, metadata retrieval, app launching, and audio streaming. It also ships with CLI tools like atvremote and atvscript for device control and scripting without writing code.", "when_to_avoid": ["you need to control Chromecast, Roku, or non-Apple streaming devices", "you need full video streaming to AirPlay, which has only basic support", "you want a ready-made GUI remote app rather than a library", "your project is not Python-based and you cannot call CLI tools"], "when_to_choose": ["you need programmatic control of Apple TVs or AirPlay devices from Python", "you are building home automation integrations with Apple media devices", "you want CLI tools to control or script Apple TV interactions", "you need to support all Apple TV generations including tvOS 15+"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/pyatv", "repo": "postlund/pyatv", "role": "main", "score": 86}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:03:50.942773+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T06:28:48.698857+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8b81328cd6e4cfbf09dc6c4ef1d22dd72f233d0db4ef7e7feeae934621428c49", "fetched_at": "2026-08-28T04:03:50.942773+00:00", "kind": "readme", "missing": false, "url": "https://github.com/postlund/pyatv"}, {"content_hash": "4a8f446808626369aa441f995a2cba2ae774416452942af7c03fc7fc0f2943f0", "fetched_at": "2026-08-29T12:35:06.492852+00:00", "kind": "homepage", "missing": false, "url": "https://pyatv.dev"}, {"content_hash": "13140da8a42d6224ee77a2237c4877e22aad3d8bc2ae4b5ab9b2b0a264d948c7", "fetched_at": "2026-08-29T12:35:06.503828+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvscript"}, {"content_hash": "490960158a9a99be66f05057f1d680720b97cd5cfc25fe2544f682f9da8e2756", "fetched_at": "2026-08-29T12:35:06.495645+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation"}, {"content_hash": "ab3d02ac194451410f84ad183a0d7f4902b4feda37da0812ad745defed67837d", "fetched_at": "2026-08-29T12:35:06.497770+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/supported_features"}, {"content_hash": "a3504d02ce7b1e773852e8400e0c5b3b81542c53dec1fe199beedbf8776f7c33", "fetched_at": "2026-08-29T12:35:06.499743+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvremote"}, {"content_hash": "7808a75c7c3f9747b9f895850379c62c7a17c3c59656d38fc3a11b467585a5d7", "fetched_at": "2026-08-29T12:35:06.501970+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvproxy"}, {"content_hash": "96a7215d95671a16ac8cbf4af78282479dd268bcc747ed3b5705b380a912d012", "fetched_at": "2026-08-29T12:35:06.505393+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvlog"}, {"content_hash": "373ed7351ef2f973a72c0c4de66d6c4e70105dfabe412efaa45ffc95cecc2736", "fetched_at": "2026-08-29T12:35:06.506791+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/getting-started"}, {"content_hash": "b77a765a216546c0e4e4ebbee3654f809c43db7954a0047acd14f3864db185fb", "fetched_at": "2026-08-29T12:35:06.508392+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/tutorial"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:03:50.942773+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T06:28:48.698857+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8b81328cd6e4cfbf09dc6c4ef1d22dd72f233d0db4ef7e7feeae934621428c49", "fetched_at": "2026-08-28T04:03:50.942773+00:00", "kind": "readme", "missing": false, "url": "https://github.com/postlund/pyatv"}, {"content_hash": "4a8f446808626369aa441f995a2cba2ae774416452942af7c03fc7fc0f2943f0", "fetched_at": "2026-08-29T12:35:06.492852+00:00", "kind": "homepage", "missing": false, "url": "https://pyatv.dev"}, {"content_hash": "13140da8a42d6224ee77a2237c4877e22aad3d8bc2ae4b5ab9b2b0a264d948c7", "fetched_at": "2026-08-29T12:35:06.503828+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvscript"}, {"content_hash": "490960158a9a99be66f05057f1d680720b97cd5cfc25fe2544f682f9da8e2756", "fetched_at": "2026-08-29T12:35:06.495645+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation"}, {"content_hash": "ab3d02ac194451410f84ad183a0d7f4902b4feda37da0812ad745defed67837d", "fetched_at": "2026-08-29T12:35:06.497770+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/supported_features"}, {"content_hash": "a3504d02ce7b1e773852e8400e0c5b3b81542c53dec1fe199beedbf8776f7c33", "fetched_at": "2026-08-29T12:35:06.499743+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvremote"}, {"content_hash": "7808a75c7c3f9747b9f895850379c62c7a17c3c59656d38fc3a11b467585a5d7", "fetched_at": "2026-08-29T12:35:06.501970+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvproxy"}, {"content_hash": "96a7215d95671a16ac8cbf4af78282479dd268bcc747ed3b5705b380a912d012", "fetched_at": "2026-08-29T12:35:06.505393+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvlog"}, {"content_hash": "373ed7351ef2f973a72c0c4de66d6c4e70105dfabe412efaa45ffc95cecc2736", "fetched_at": "2026-08-29T12:35:06.506791+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/getting-started"}, {"content_hash": "b77a765a216546c0e4e4ebbee3654f809c43db7954a0047acd14f3864db185fb", "fetched_at": "2026-08-29T12:35:06.508392+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/tutorial"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T06:28:48.698857+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8b81328cd6e4cfbf09dc6c4ef1d22dd72f233d0db4ef7e7feeae934621428c49", "fetched_at": "2026-08-28T04:03:50.942773+00:00", "kind": "readme", "missing": false, "url": "https://github.com/postlund/pyatv"}, {"content_hash": "4a8f446808626369aa441f995a2cba2ae774416452942af7c03fc7fc0f2943f0", "fetched_at": "2026-08-29T12:35:06.492852+00:00", "kind": "homepage", "missing": false, "url": "https://pyatv.dev"}, {"content_hash": "13140da8a42d6224ee77a2237c4877e22aad3d8bc2ae4b5ab9b2b0a264d948c7", "fetched_at": "2026-08-29T12:35:06.503828+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvscript"}, {"content_hash": "490960158a9a99be66f05057f1d680720b97cd5cfc25fe2544f682f9da8e2756", "fetched_at": "2026-08-29T12:35:06.495645+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation"}, {"content_hash": "ab3d02ac194451410f84ad183a0d7f4902b4feda37da0812ad745defed67837d", "fetched_at": "2026-08-29T12:35:06.497770+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/supported_features"}, {"content_hash": "a3504d02ce7b1e773852e8400e0c5b3b81542c53dec1fe199beedbf8776f7c33", "fetched_at": "2026-08-29T12:35:06.499743+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvremote"}, {"content_hash": "7808a75c7c3f9747b9f895850379c62c7a17c3c59656d38fc3a11b467585a5d7", "fetched_at": "2026-08-29T12:35:06.501970+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvproxy"}, {"content_hash": "96a7215d95671a16ac8cbf4af78282479dd268bcc747ed3b5705b380a912d012", "fetched_at": "2026-08-29T12:35:06.505393+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvlog"}, {"content_hash": "373ed7351ef2f973a72c0c4de66d6c4e70105dfabe412efaa45ffc95cecc2736", "fetched_at": "2026-08-29T12:35:06.506791+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/getting-started"}, {"content_hash": "b77a765a216546c0e4e4ebbee3654f809c43db7954a0047acd14f3864db185fb", "fetched_at": "2026-08-29T12:35:06.508392+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/tutorial"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:03:50.942773+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:03:50.942773+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:03:50.942773+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T06:28:48.698857+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8b81328cd6e4cfbf09dc6c4ef1d22dd72f233d0db4ef7e7feeae934621428c49", "fetched_at": "2026-08-28T04:03:50.942773+00:00", "kind": "readme", "missing": false, "url": "https://github.com/postlund/pyatv"}, {"content_hash": "4a8f446808626369aa441f995a2cba2ae774416452942af7c03fc7fc0f2943f0", "fetched_at": "2026-08-29T12:35:06.492852+00:00", "kind": "homepage", "missing": false, "url": "https://pyatv.dev"}, {"content_hash": "13140da8a42d6224ee77a2237c4877e22aad3d8bc2ae4b5ab9b2b0a264d948c7", "fetched_at": "2026-08-29T12:35:06.503828+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvscript"}, {"content_hash": "490960158a9a99be66f05057f1d680720b97cd5cfc25fe2544f682f9da8e2756", "fetched_at": "2026-08-29T12:35:06.495645+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation"}, {"content_hash": "ab3d02ac194451410f84ad183a0d7f4902b4feda37da0812ad745defed67837d", "fetched_at": "2026-08-29T12:35:06.497770+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/supported_features"}, {"content_hash": "a3504d02ce7b1e773852e8400e0c5b3b81542c53dec1fe199beedbf8776f7c33", "fetched_at": "2026-08-29T12:35:06.499743+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvremote"}, {"content_hash": "7808a75c7c3f9747b9f895850379c62c7a17c3c59656d38fc3a11b467585a5d7", "fetched_at": "2026-08-29T12:35:06.501970+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvproxy"}, {"content_hash": "96a7215d95671a16ac8cbf4af78282479dd268bcc747ed3b5705b380a912d012", "fetched_at": "2026-08-29T12:35:06.505393+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvlog"}, {"content_hash": "373ed7351ef2f973a72c0c4de66d6c4e70105dfabe412efaa45ffc95cecc2736", "fetched_at": "2026-08-29T12:35:06.506791+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/getting-started"}, {"content_hash": "b77a765a216546c0e4e4ebbee3654f809c43db7954a0047acd14f3864db185fb", "fetched_at": "2026-08-29T12:35:06.508392+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/tutorial"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:03:50.942773+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:03:50.942773+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T06:28:48.698857+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8b81328cd6e4cfbf09dc6c4ef1d22dd72f233d0db4ef7e7feeae934621428c49", "fetched_at": "2026-08-28T04:03:50.942773+00:00", "kind": "readme", "missing": false, "url": "https://github.com/postlund/pyatv"}, {"content_hash": "4a8f446808626369aa441f995a2cba2ae774416452942af7c03fc7fc0f2943f0", "fetched_at": "2026-08-29T12:35:06.492852+00:00", "kind": "homepage", "missing": false, "url": "https://pyatv.dev"}, {"content_hash": "13140da8a42d6224ee77a2237c4877e22aad3d8bc2ae4b5ab9b2b0a264d948c7", "fetched_at": "2026-08-29T12:35:06.503828+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvscript"}, {"content_hash": "490960158a9a99be66f05057f1d680720b97cd5cfc25fe2544f682f9da8e2756", "fetched_at": "2026-08-29T12:35:06.495645+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation"}, {"content_hash": "ab3d02ac194451410f84ad183a0d7f4902b4feda37da0812ad745defed67837d", "fetched_at": "2026-08-29T12:35:06.497770+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/supported_features"}, {"content_hash": "a3504d02ce7b1e773852e8400e0c5b3b81542c53dec1fe199beedbf8776f7c33", "fetched_at": "2026-08-29T12:35:06.499743+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvremote"}, {"content_hash": "7808a75c7c3f9747b9f895850379c62c7a17c3c59656d38fc3a11b467585a5d7", "fetched_at": "2026-08-29T12:35:06.501970+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvproxy"}, {"content_hash": "96a7215d95671a16ac8cbf4af78282479dd268bcc747ed3b5705b380a912d012", "fetched_at": "2026-08-29T12:35:06.505393+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvlog"}, {"content_hash": "373ed7351ef2f973a72c0c4de66d6c4e70105dfabe412efaa45ffc95cecc2736", "fetched_at": "2026-08-29T12:35:06.506791+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/getting-started"}, {"content_hash": "b77a765a216546c0e4e4ebbee3654f809c43db7954a0047acd14f3864db185fb", "fetched_at": "2026-08-29T12:35:06.508392+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/tutorial"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:03:50.942773+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:03:50.942773+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:03:50.942773+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T06:28:48.698857+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8b81328cd6e4cfbf09dc6c4ef1d22dd72f233d0db4ef7e7feeae934621428c49", "fetched_at": "2026-08-28T04:03:50.942773+00:00", "kind": "readme", "missing": false, "url": "https://github.com/postlund/pyatv"}, {"content_hash": "4a8f446808626369aa441f995a2cba2ae774416452942af7c03fc7fc0f2943f0", "fetched_at": "2026-08-29T12:35:06.492852+00:00", "kind": "homepage", "missing": false, "url": "https://pyatv.dev"}, {"content_hash": "13140da8a42d6224ee77a2237c4877e22aad3d8bc2ae4b5ab9b2b0a264d948c7", "fetched_at": "2026-08-29T12:35:06.503828+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvscript"}, {"content_hash": "490960158a9a99be66f05057f1d680720b97cd5cfc25fe2544f682f9da8e2756", "fetched_at": "2026-08-29T12:35:06.495645+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation"}, {"content_hash": "ab3d02ac194451410f84ad183a0d7f4902b4feda37da0812ad745defed67837d", "fetched_at": "2026-08-29T12:35:06.497770+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/supported_features"}, {"content_hash": "a3504d02ce7b1e773852e8400e0c5b3b81542c53dec1fe199beedbf8776f7c33", "fetched_at": "2026-08-29T12:35:06.499743+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvremote"}, {"content_hash": "7808a75c7c3f9747b9f895850379c62c7a17c3c59656d38fc3a11b467585a5d7", "fetched_at": "2026-08-29T12:35:06.501970+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvproxy"}, {"content_hash": "96a7215d95671a16ac8cbf4af78282479dd268bcc747ed3b5705b380a912d012", "fetched_at": "2026-08-29T12:35:06.505393+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvlog"}, {"content_hash": "373ed7351ef2f973a72c0c4de66d6c4e70105dfabe412efaa45ffc95cecc2736", "fetched_at": "2026-08-29T12:35:06.506791+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/getting-started"}, {"content_hash": "b77a765a216546c0e4e4ebbee3654f809c43db7954a0047acd14f3864db185fb", "fetched_at": "2026-08-29T12:35:06.508392+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/tutorial"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:03:50.942773+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:03:50.942773+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T06:28:48.698857+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8b81328cd6e4cfbf09dc6c4ef1d22dd72f233d0db4ef7e7feeae934621428c49", "fetched_at": "2026-08-28T04:03:50.942773+00:00", "kind": "readme", "missing": false, "url": "https://github.com/postlund/pyatv"}, {"content_hash": "4a8f446808626369aa441f995a2cba2ae774416452942af7c03fc7fc0f2943f0", "fetched_at": "2026-08-29T12:35:06.492852+00:00", "kind": "homepage", "missing": false, "url": "https://pyatv.dev"}, {"content_hash": "13140da8a42d6224ee77a2237c4877e22aad3d8bc2ae4b5ab9b2b0a264d948c7", "fetched_at": "2026-08-29T12:35:06.503828+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvscript"}, {"content_hash": "490960158a9a99be66f05057f1d680720b97cd5cfc25fe2544f682f9da8e2756", "fetched_at": "2026-08-29T12:35:06.495645+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation"}, {"content_hash": "ab3d02ac194451410f84ad183a0d7f4902b4feda37da0812ad745defed67837d", "fetched_at": "2026-08-29T12:35:06.497770+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/supported_features"}, {"content_hash": "a3504d02ce7b1e773852e8400e0c5b3b81542c53dec1fe199beedbf8776f7c33", "fetched_at": "2026-08-29T12:35:06.499743+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvremote"}, {"content_hash": "7808a75c7c3f9747b9f895850379c62c7a17c3c59656d38fc3a11b467585a5d7", "fetched_at": "2026-08-29T12:35:06.501970+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvproxy"}, {"content_hash": "96a7215d95671a16ac8cbf4af78282479dd268bcc747ed3b5705b380a912d012", "fetched_at": "2026-08-29T12:35:06.505393+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvlog"}, {"content_hash": "373ed7351ef2f973a72c0c4de66d6c4e70105dfabe412efaa45ffc95cecc2736", "fetched_at": "2026-08-29T12:35:06.506791+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/getting-started"}, {"content_hash": "b77a765a216546c0e4e4ebbee3654f809c43db7954a0047acd14f3864db185fb", "fetched_at": "2026-08-29T12:35:06.508392+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/tutorial"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T06:28:48.698857+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8b81328cd6e4cfbf09dc6c4ef1d22dd72f233d0db4ef7e7feeae934621428c49", "fetched_at": "2026-08-28T04:03:50.942773+00:00", "kind": "readme", "missing": false, "url": "https://github.com/postlund/pyatv"}, {"content_hash": "4a8f446808626369aa441f995a2cba2ae774416452942af7c03fc7fc0f2943f0", "fetched_at": "2026-08-29T12:35:06.492852+00:00", "kind": "homepage", "missing": false, "url": "https://pyatv.dev"}, {"content_hash": "13140da8a42d6224ee77a2237c4877e22aad3d8bc2ae4b5ab9b2b0a264d948c7", "fetched_at": "2026-08-29T12:35:06.503828+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvscript"}, {"content_hash": "490960158a9a99be66f05057f1d680720b97cd5cfc25fe2544f682f9da8e2756", "fetched_at": "2026-08-29T12:35:06.495645+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation"}, {"content_hash": "ab3d02ac194451410f84ad183a0d7f4902b4feda37da0812ad745defed67837d", "fetched_at": "2026-08-29T12:35:06.497770+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/supported_features"}, {"content_hash": "a3504d02ce7b1e773852e8400e0c5b3b81542c53dec1fe199beedbf8776f7c33", "fetched_at": "2026-08-29T12:35:06.499743+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvremote"}, {"content_hash": "7808a75c7c3f9747b9f895850379c62c7a17c3c59656d38fc3a11b467585a5d7", "fetched_at": "2026-08-29T12:35:06.501970+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvproxy"}, {"content_hash": "96a7215d95671a16ac8cbf4af78282479dd268bcc747ed3b5705b380a912d012", "fetched_at": "2026-08-29T12:35:06.505393+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvlog"}, {"content_hash": "373ed7351ef2f973a72c0c4de66d6c4e70105dfabe412efaa45ffc95cecc2736", "fetched_at": "2026-08-29T12:35:06.506791+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/getting-started"}, {"content_hash": "b77a765a216546c0e4e4ebbee3654f809c43db7954a0047acd14f3864db185fb", "fetched_at": "2026-08-29T12:35:06.508392+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/tutorial"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T06:28:48.698857+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8b81328cd6e4cfbf09dc6c4ef1d22dd72f233d0db4ef7e7feeae934621428c49", "fetched_at": "2026-08-28T04:03:50.942773+00:00", "kind": "readme", "missing": false, "url": "https://github.com/postlund/pyatv"}, {"content_hash": "4a8f446808626369aa441f995a2cba2ae774416452942af7c03fc7fc0f2943f0", "fetched_at": "2026-08-29T12:35:06.492852+00:00", "kind": "homepage", "missing": false, "url": "https://pyatv.dev"}, {"content_hash": "13140da8a42d6224ee77a2237c4877e22aad3d8bc2ae4b5ab9b2b0a264d948c7", "fetched_at": "2026-08-29T12:35:06.503828+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvscript"}, {"content_hash": "490960158a9a99be66f05057f1d680720b97cd5cfc25fe2544f682f9da8e2756", "fetched_at": "2026-08-29T12:35:06.495645+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation"}, {"content_hash": "ab3d02ac194451410f84ad183a0d7f4902b4feda37da0812ad745defed67837d", "fetched_at": "2026-08-29T12:35:06.497770+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/supported_features"}, {"content_hash": "a3504d02ce7b1e773852e8400e0c5b3b81542c53dec1fe199beedbf8776f7c33", "fetched_at": "2026-08-29T12:35:06.499743+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvremote"}, {"content_hash": "7808a75c7c3f9747b9f895850379c62c7a17c3c59656d38fc3a11b467585a5d7", "fetched_at": "2026-08-29T12:35:06.501970+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvproxy"}, {"content_hash": "96a7215d95671a16ac8cbf4af78282479dd268bcc747ed3b5705b380a912d012", "fetched_at": "2026-08-29T12:35:06.505393+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvlog"}, {"content_hash": "373ed7351ef2f973a72c0c4de66d6c4e70105dfabe412efaa45ffc95cecc2736", "fetched_at": "2026-08-29T12:35:06.506791+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/getting-started"}, {"content_hash": "b77a765a216546c0e4e4ebbee3654f809c43db7954a0047acd14f3864db185fb", "fetched_at": "2026-08-29T12:35:06.508392+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/tutorial"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T06:28:48.698857+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8b81328cd6e4cfbf09dc6c4ef1d22dd72f233d0db4ef7e7feeae934621428c49", "fetched_at": "2026-08-28T04:03:50.942773+00:00", "kind": "readme", "missing": false, "url": "https://github.com/postlund/pyatv"}, {"content_hash": "4a8f446808626369aa441f995a2cba2ae774416452942af7c03fc7fc0f2943f0", "fetched_at": "2026-08-29T12:35:06.492852+00:00", "kind": "homepage", "missing": false, "url": "https://pyatv.dev"}, {"content_hash": "13140da8a42d6224ee77a2237c4877e22aad3d8bc2ae4b5ab9b2b0a264d948c7", "fetched_at": "2026-08-29T12:35:06.503828+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvscript"}, {"content_hash": "490960158a9a99be66f05057f1d680720b97cd5cfc25fe2544f682f9da8e2756", "fetched_at": "2026-08-29T12:35:06.495645+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation"}, {"content_hash": "ab3d02ac194451410f84ad183a0d7f4902b4feda37da0812ad745defed67837d", "fetched_at": "2026-08-29T12:35:06.497770+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/supported_features"}, {"content_hash": "a3504d02ce7b1e773852e8400e0c5b3b81542c53dec1fe199beedbf8776f7c33", "fetched_at": "2026-08-29T12:35:06.499743+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvremote"}, {"content_hash": "7808a75c7c3f9747b9f895850379c62c7a17c3c59656d38fc3a11b467585a5d7", "fetched_at": "2026-08-29T12:35:06.501970+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvproxy"}, {"content_hash": "96a7215d95671a16ac8cbf4af78282479dd268bcc747ed3b5705b380a912d012", "fetched_at": "2026-08-29T12:35:06.505393+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/atvlog"}, {"content_hash": "373ed7351ef2f973a72c0c4de66d6c4e70105dfabe412efaa45ffc95cecc2736", "fetched_at": "2026-08-29T12:35:06.506791+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/getting-started"}, {"content_hash": "b77a765a216546c0e4e4ebbee3654f809c43db7954a0047acd14f3864db185fb", "fetched_at": "2026-08-29T12:35:06.508392+00:00", "kind": "site_page", "missing": false, "url": "https://pyatv.dev/documentation/tutorial"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 97, "longevity": 100, "rhythm": 65}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 3500, "days_push": 19, "days_rel": 75, "gap_med": 171.0, "n_releases_24m": 5}, "score": 86, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}