{"id":34031775,"url":"https://github.com/txoof/querylms","last_synced_at":"2026-03-17T20:36:59.996Z","repository":{"id":57459337,"uuid":"313421793","full_name":"txoof/querylms","owner":"txoof","description":"Query Logitech Media Server for server status and player information","archived":false,"fork":false,"pushed_at":"2024-07-30T20:49:07.000Z","size":134,"stargazers_count":5,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-02-17T08:59:40.302Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/txoof.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-11-16T20:41:22.000Z","updated_at":"2026-02-14T23:12:45.000Z","dependencies_parsed_at":"2022-09-10T15:41:12.362Z","dependency_job_id":"ed513e13-3587-4b8b-bc24-3cf123174b34","html_url":"https://github.com/txoof/querylms","commit_stats":{"total_commits":20,"total_committers":1,"mean_commits":20.0,"dds":0.0,"last_synced_commit":"ad6f7242f8a9830a58830e09bf4b9ae68f6e34e3"},"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/txoof/querylms","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/txoof%2Fquerylms","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/txoof%2Fquerylms/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/txoof%2Fquerylms/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/txoof%2Fquerylms/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/txoof","download_url":"https://codeload.github.com/txoof/querylms/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/txoof%2Fquerylms/sbom","scorecard":{"id":904591,"data":{"date":"2025-08-11","repo":{"name":"github.com/txoof/querylms","commit":"09ddbed75f4d73e4721afb852b4c0aaf1856f1d3"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.4,"checks":[{"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":"Code-Review","score":0,"reason":"Found 1/30 approved changesets -- score normalized to 0","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":"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":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/release.yml:1","Info: no jobLevel write permissions found"],"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":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/txoof/querylms/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/txoof/querylms/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/txoof/querylms/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:51: update your workflow using https://app.stepsecurity.io/secureworkflow/txoof/querylms/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:56: update your workflow using https://app.stepsecurity.io/secureworkflow/txoof/querylms/release.yml/master?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/release.yml:21","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   1 pipCommand dependencies pinned"],"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":"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":"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/release.yml:36"],"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":"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":"Vulnerabilities","score":5,"reason":"5 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2014-14 / GHSA-652x-xj99-gmcc","Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: GHSA-9wx4-h78v-vm56","Warn: Project is vulnerable to: PYSEC-2014-13 / GHSA-cfj3-7x9c-4p3h","Warn: Project is vulnerable to: PYSEC-2018-28 / GHSA-x84v-xcm2-53pg"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 3 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-24T16:52:39.059Z","repository_id":57459337,"created_at":"2025-08-24T16:52:39.059Z","updated_at":"2025-08-24T16:52:39.059Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30631403,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-17T17:32:55.572Z","status":"ssl_error","status_checked_at":"2026-03-17T17:32:38.732Z","response_time":56,"last_error":"SSL_read: 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":"2025-12-13T18:26:12.243Z","updated_at":"2026-03-17T20:36:59.991Z","avatar_url":"https://github.com/txoof.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# QueryLMS Python Library\nQueryLMS manages queries to a Logitech Media Server and associates with a single player. A QueryLMS object can be used to query server or player status information and control an LMS player.\n\nQueryLMS is a rewrite of [LMSQuery](https://github.com/roberteinhaus/lmsquery) and reuses a significant portion of the LMSQuery code.\n\nUsage:\n```\n    import QueryLMS\n    # create the object and try to discover LMS on the local network\n    # try to associate with \"My Player\"\n    my_player = QueryLMS(player_name='My Player')\n    # get now playing tracks\n    my_player.get_now_playing()\n    \u003e\u003e\u003e {'time': 0,\n         'mode': 'stop',\n         'id': 17001,\n         'title': 'We Belong Together',\n         'artist': 'Vampire Weekend feat. Danielle Haim',\n         'coverid': 'c9d646ff',\n         'duration': 190.733,\n         'album_id': '2064',\n         'genre': 'No Genre',\n         'album': 'Father of the Bride',\n         'artwork_url': 'http://192.168.178.9:9000/music/c9d646ff/cover.jpg'}\n  \n  # create the object with a defined hostname and port\n  # try to associate with player \"Living Room\"\n  living_room = QueryLMS(host=\"media-server.local\", port=9001, player_name=\"Living Room\")\n  \n```\n\n## Changes\n\n**V 0.2**\n\n* add additional keys to `get_now_playing` method\n* return now-playing information for streams \n\nNotes:\n\n* Album artwork is not properly returned for streams\n* Album information may not be returned at all for streams\n\n## API\n\nAll player related calls will raise ValueError if player_id is not set.\n\n```\nclass QueryLMS(builtins.object)\n  QueryLMS(host=None, port=None, player_name=None, player_id=None, scan_timeout=1, handle_requests_exceptions=False, request_timeout=5)\n  \n  Class to handle queries for an LMS player\n  \n  Each Query LMS object is associated with a single player_id\n  \n  If no host and port number are specified, the QueryLMS object will attempt to locate\n  an active LMS Server on the network. If a player_name is specified, the Query\n  object will attempt to find the player_id associated with that name.\n  \n  All queries are run against the first located (or specified) \n  server or a single player.\n  \n  By default any http requests exceptions encoutered when communicating\n  with the server are raised and should be handled by your program. \n  Suppress and log exceptions with handle_reqests_exceptions=True\n  \n  Attributes:\n      host(str): LMS Server hostname or ip address\n      port(int): LMS Server port number\n      player_name(str): Player name\n      player_id(str): unique player id in hex\n      scan_timeout(int): seconds to search local network for an LMS server\n      server_query_url(str): url to use when querying host status\n      server_base_url(str): base url of server: http://host:port/\n      handle_requests_exceptions(bool): True: quietly handle exceptions; False: raise exceptions\n      request_timeout(int): seconds to wait for server to respond\n      \n  \n  Additional API documentation: https://github.com/elParaguayo/LMS-CLI-Documentation/blob/master/LMS-CLI.md\n  \n  Methods defined here:\n  \n  __init__(self, host=None, port=None, player_name=None, player_id=None, scan_timeout=1, handle_requests_exceptions=False, request_timeout=5)\n      inits QueryLMS Class with host, port, player_id, player_name and scan_timeout\n      \n      Args:\n          host(str): LMS host name or ip address \n          port(int): LMS port number\n          player_name(str): name of player to associate with\n          player_id(str): player_id in hex \n          scan_timeout(int): seconds to search for LMS host\n  \n  display(self, line1, line2, duration=5)\n      display line1 and line2 on associated player\n      \n      Args:\n          line1(str)\n          line1(str)\n  \n  display_all(self, line1, line2, duration=5)\n      display line1 and line2 on all connected players\n      \n      Args:\n          line1(str)\n          line1(str)\n  \n  get_alarms(self, enabled=True)\n      ???\n  \n  get_artist_album(self, artist_id)\n      query associated player for currently playing album artist\n      \n      Returns:\n          (str)\n  \n  get_artist_count(self)\n      query server for total number of artists\n      \n      Returns:\n          (int): count of unique artist ids\n  \n  get_artists(self)\n      query server for internal artist id, names\n      Returns:\n          (dict): JSON formatted list of ids and artists\n  \n  get_current_album(self)\n      query associated player for currently playing track album\n      \n      Returns:\n          (str)\n  \n  get_current_artist(self)\n      query associated player for currently playing artist\n      \n      Returns:\n          (str)\n  \n  get_current_radio_title(self, radio)\n      return title of favorite radio stations\n  \n  get_current_song_title(self)\n      query associated player for currently playing track title\n      \n      Returns:\n          (str)\n  \n  get_current_title(self)\n      query associated player for currently playing track title\n      \n      Returns:\n          (str)\n  \n  get_favorite_radio(self)\n      return favorited radio stations\n  \n  get_next_alarm(self)\n      ???\n  \n  get_now_playing(self)\n      query associated player for now playing information including:\n      * album\n      * artist\n      * artwork_url\n      * duration\n      * genre\n      * coverid\n      * id\n      * title\n      \n      Returns:\n          dict\n  \n  get_player_count(self)\n      query server for total number of connected players\n      \n      Returns:\n          (int): count of unique players connected\n  \n  get_player_pref(self, pref)\n      ???\n  \n  get_players(self)\n      query server for connected player information\n      \n      Returns:\n          (dict): JSON formatted list of player information\n  \n  get_radios_count(self)\n      query server for total number of saved radio stations\n      \n      Returns:\n          (int): count of unique radios connected\n  \n  get_server_status(self)\n      query server status in JSON\n      \n      Returns:\n          (dict): JSON formatted server status\n  \n  get_volume(self)\n      query associated player for volume\n      \n      Returns:\n          (str)\n  \n  next_song(self)\n      fast forward one track on associated player\n      \n      Returns:\n          (dict): {}\n  \n  pause(self)\n      pause associated player\n      \n      Returns:\n          (dict): {}\n  \n  play_album(self, album_id)\n      play an album on associated player\n      \n      Args:\n          album_id(int): internal album id\n          \n      Returns:\n          (dict): {'count': int} total tracks on album\n  \n  play_radio(self, radio)\n      play radio??? on associated player\n\n  play_stream(self, url)\n      play compatible stream such as Internet Radio or sound file on associated player\n  \n  previous_song(self)\n      rewind one track on associated player\n      \n      Returns:\n          (dict): {}\n  \n  query(self, player_id=None, *args)\n      # Basic Query\n      #####################################\n  \n  rescan(self)\n      rescan LMS library\n      \n      Returns:\n          (dict): {}\n  \n  search(self, searchstring, count=9999)\n      query server for searchstring (ignoring case)\n      \n      Args:\n          searchstring(str): string to search for\n      \n      Returns:\n          (dict): JSON formatted list of all entities containing searchstring\n  \n  search_albums(self, searchstring, count=9999)\n      query server for searchstring in album names (ignoring case)\n      \n      Args:\n          searchstring(str): string to search tracks for\n          \n      Returns:\n          (dict): JSON formatted list of all album entities containing searchstring\n  \n  search_contributors(self, searchstring, count=9999)\n      query server for searchstring in contributors names (ignoring case)\n      \n      Args:\n          searchstring(str): string to search tracks for\n          \n      Returns:\n          (dict): JSON formatted list of all contributors entities containing searchstring\n  \n  search_players(self, searchstring, count=9999)\n      query server for searchstring in player names (ignoring case)\n      \n      Args:\n          searchstring(str): string to search tracks for\n          \n      Returns:\n          (dict): JSON formatted list of all player entities containing searchstring\n  \n  search_tracks(self, searchstring, count=9999)\n      query server for searchstring in track names (ignoring case)\n      \n      Args:\n          searchstring(str): string to search tracks for\n          \n      Returns:\n          (dict): JSON formatted list of all track entities containing searchstring\n  \n  set_player_pref(self, pref, value)\n      ???\n  \n  set_power(self, power=1)\n      send power command to connected player\n  \n  set_power_all(self, power=1)\n  \n  set_server(self)\n      set the server details using \"host\" and \"port\"\n      \n      If no host and port is specified, queryLMS will search for the \n      first LMS server on the local network segment.\n      \n      If the server IP/name or port change it is necessary\n      to run set_server() again to trigger updates of the query urls\n      \n      QueryLMS will not detect dynamic changes of player name.\n      \n      Use the static method scan_lms() to find host information\n      \n      Use the get_players() method to list player names/ids associated with a LMS\n      \n      Sets:\n          server_query_url\n          server_base_url\n          player_id (if not already set)\n  \n  set_volume(self, volume)\n      set volume on associated player\n      \n      Args:\n          volume(int): 0-100\n          \n      Returns:\n          (dict): {}\n  \n  skip_songs(self, amount=1)\n      skip n tracks on associated player\n      \n      Args:\n          amount(int): number of tracks to skip\n      \n      Returns:\n          (dict): {}\n  \n  ----------------------------------------------------------------------\n  Static methods defined here:\n  \n  scan_lms(scan_timeout=None)\n      Search local network for Logitech Media Servers\n      \n      Based on netdisco/lms.py by cxlwill - https://github.com/cxlwill\n      \n      Args:\n        scan_timeout (int): timeout seconds\n      \n      Returns:\n        list: Dictionary of LMS Server IP and listen ports\n  \n  ----------------------------------------------------------------------\n  Readonly properties defined here:\n  \n  is_playing_remote_stream\n  \n  ----------------------------------------------------------------------\n  Data descriptors defined here:\n  \n  __dict__\n      dictionary for instance variables (if defined)\n  \n  __weakref__\n      list of weak references to the object (if defined)\n  \n  host\n      LMS ip address or hostname: (str)\n  \n  player_id\n      LMS player unique hexidecimal id (str)\n  \n  player_name\n      human readable name of player: (str)\n  \n  port\n      LMS server port: (int)\n\n ```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftxoof%2Fquerylms","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftxoof%2Fquerylms","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftxoof%2Fquerylms/lists"}