{"id":13455984,"url":"https://github.com/bendavid/aiopylgtv","last_synced_at":"2026-01-14T09:51:18.821Z","repository":{"id":43254240,"uuid":"217925991","full_name":"bendavid/aiopylgtv","owner":"bendavid","description":"Library to control webOS based LG Tv devices","archived":false,"fork":true,"pushed_at":"2022-04-12T19:56:47.000Z","size":184,"stargazers_count":166,"open_issues_count":38,"forks_count":49,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-12-22T01:36:37.133Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"TheRealLink/pylgtv","license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bendavid.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-10-27T22:38:39.000Z","updated_at":"2025-12-15T21:45:13.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/bendavid/aiopylgtv","commit_stats":null,"previous_names":[],"tags_count":33,"template":false,"template_full_name":null,"purl":"pkg:github/bendavid/aiopylgtv","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bendavid%2Faiopylgtv","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bendavid%2Faiopylgtv/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bendavid%2Faiopylgtv/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bendavid%2Faiopylgtv/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bendavid","download_url":"https://codeload.github.com/bendavid/aiopylgtv/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bendavid%2Faiopylgtv/sbom","scorecard":{"id":231758,"data":{"date":"2025-08-11","repo":{"name":"github.com/bendavid/aiopylgtv","commit":"6b676ea69cb77f4e363d8fc5934cc126d07ad537"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.4,"checks":[{"name":"Code-Review","score":3,"reason":"Found 6/17 approved changesets -- score normalized to 3","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: MIT License: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 19 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-17T04:58:34.524Z","repository_id":43254240,"created_at":"2025-08-17T04:58:34.524Z","updated_at":"2025-08-17T04:58:34.524Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28416120,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T08:38:59.149Z","status":"ssl_error","status_checked_at":"2026-01-14T08:38:43.588Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-31T08:01:14.405Z","updated_at":"2026-01-14T09:51:18.806Z","avatar_url":"https://github.com/bendavid.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"# aiopylgtv\nLibrary to control webOS based LG Tv devices.\n\nBased on pylgtv library at https://github.com/TheRealLink/pylgtv which is no longer maintained.\n\n## Requirements\n- Python \u003e= 3.7\n\n## Install\n```bash\npip install aiopylgtv\n```\n\n## Install from Source\nRun the following command inside this folder\n```bash\npip install --upgrade .\n```\n\n## Basic Example\n\n```python\nimport asyncio\nfrom aiopylgtv import WebOsClient\n\nasync def runloop():\n    client = await WebOsClient.create('192.168.1.53')\n    await client.connect()\n    apps = await client.get_apps()\n    for app in apps:\n        print(app)\n\n    await client.disconnect()\n\nasyncio.get_event_loop().run_until_complete(runloop())\n```\n\n## Subscribed state updates\nA callback coroutine can be registered with the client in order to be notified of any state changes.\n```python\nimport asyncio\nfrom aiopylgtv import WebOsClient\n\nasync def on_state_change():\n    print(\"State changed:\")\n    print(client.current_appId)\n    print(client.muted)\n    print(client.volume)\n    print(client.current_channel)\n    print(client.apps)\n    print(client.inputs)\n    print(client.system_info)\n    print(client.software_info)\n\n\nasync def runloop():\n    client = await WebOsClient.create('192.168.1.53')\n    await client.register_state_update_callback(on_state_change)\n\n    await client.connect()\n\n    print(client.inputs)\n    ret = await client.set_input(\"HDMI_3\")\n    print(ret)\n\n    await client.disconnect()\n\nasyncio.get_event_loop().run_until_complete(runloop())\n```\n\n## Calibration functionality\nWARNING: Messing with the calibration data COULD brick your TV in some circumstances, requiring a mainboard replacement.\nAll of the currently implemented functions SHOULD be safe, but no guarantees.\n\nOn supported models, calibration functionality and upload to internal LUTs is supported.  The supported input formats for LUTs are IRIDAS .cube format for both 1D and 3D LUTs, and ArgyllCMS .cal files for 1D LUTs.\n\nNot yet supported:\n-Dolby Vision config upload\n-Custom tone mapping for 2019 models (functionality does not exist on 2018 models)\n\nSupported models:\nLG 2019 Alpha 9 G2 OLED R9 Z9 W9 W9S E9 C9 NanoCell SM99\nLG 2019 Alpha 7 G2 NanoCell (8000 \u0026 higher model numbers)\nLG 2018 Alpha 7 Super UHD LED (8000 \u0026 higher model numbers)\nLG 2018 Alpha 7 OLED B8\nLG 2018 Alpha 9 OLED C8 E8 G8 W8\n\nModels with Alpha 9 use 33 point 3D LUTs, while those with Alpha 7 use 17 points.\n\nn.b. this has only been extensively tested for the 2018 Alpha 9 case, so fixes may be needed still for the others.\n\nWARNING:  When running the ddc_reset or uploading LUT data on 2018 models the only way to restore the factory\nLUTs and behaviour for a given input mode is to do a factory reset of the TV.\nddc_reset uploads unity 1d and 3d luts and resets oled light/brightness/contrast/color/ to default values (80/50/85/50).\nWhen running the ddc_reset or uploading any 1D LUT data, service menu white balance settings are ignored, and gamma,\ncolorspace, and white balance settings in the user menu are greyed out and inaccessible.\n\nCalibration data is specific to each picture mode, and picture modes are independent for SDR, HDR10+HLG, and Dolby Vision.\nPicture modes from each of the three groups are only accessible when the TV is in the appropriate mode.  Ie to upload\ncalibration data for HDR10 picture modes, one has to send the TV an HDR10 signal or play an HDR10 file, and similarly\nfor Dolby Vision.\n\nFor SDR and HDR10 modes there are two 3D LUTs which will be automatically selected depending on the colorspace flags of the signal\nor content.  In principle almost all SDR content should be bt709 and HDR10 content should be bt2020 but there could be\nnonstandard cases where this is not true.\n\nFor Dolby Vision the bt709 3d LUT seems to be active and the only one used.\n\nKnown supported picMode strings are:\nSDR: cinema, expert1, expert2, game, technicolorExpert\nHDR10(+HLG): hdr_technicolorExpert, hdr_cinema, hdr_game\nDV: dolby_cinema_dark, dolby_cinema_bright, dolby_game\n\nCalibration commands can only be run while in calibration mode (controlled by \"start_calibration\" and \"end_calibration\").\n\nWhile in calibration mode for HDR10 tone mapping is bypassed.\nThere may be other not fully known/understood changes in the image processing pipeline while in calibration mode.\n\n```python\nimport asyncio\nfrom aiopylgtv import WebOsClient\n\nasync def runloop():\n    client = await WebOsClient.create('192.168.1.53')\n    await client.connect()\n\n    await client.set_input(\"HDMI_2\")\n    await client.start_calibration(picMode=\"expert1\")\n    await client.ddc_reset(picMode=\"expert1\")\n    await client.set_oled_light(picMode=\"expert1\", value=26)\n    await client.set_contrast(picMode=\"expert1\", value=100)\n    await client.upload_1d_lut_from_file(picMode=\"expert1\", filename=\"test.cal\")\n    await client.upload_3d_lut_bt709_from_file(picMode=\"expert1\", filename=\"test3d.cube\")\n    await client.upload_3d_lut_bt2020_from_file(picMode=\"expert1\", filename=\"test3d.cube\")\n    await client.end_calibration(picMode=\"expert1\")\n\n    await client.disconnect()\n\nasyncio.run(runloop())\n```\n\n## Development of `aiopylgtv`\n\nWe use [`pre-commit`](https://pre-commit.com) to keep a consistent code style, so ``pip install pre_commit`` and run\n```bash\npre-commit install\n```\nto install the hooks.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbendavid%2Faiopylgtv","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbendavid%2Faiopylgtv","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbendavid%2Faiopylgtv/lists"}