{"id":14986562,"url":"https://github.com/andreztz/pyradios","last_synced_at":"2025-09-07T14:09:35.178Z","repository":{"id":32945165,"uuid":"147169591","full_name":"andreztz/pyradios","owner":"andreztz","description":"A Client for the Radio Browser API ","archived":false,"fork":false,"pushed_at":"2025-06-06T05:07:22.000Z","size":299,"stargazers_count":71,"open_issues_count":2,"forks_count":24,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-06-06T06:19:14.407Z","etag":null,"topics":["api","data-collection","entertainment","internet-radio","internet-radio-stations","music","open-api","python","radio-browser","radio-stations","streaming"],"latest_commit_sha":null,"homepage":"https://api.radio-browser.info/","language":"Python","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/andreztz.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,"zenodo":null}},"created_at":"2018-09-03T07:45:41.000Z","updated_at":"2025-06-06T05:07:25.000Z","dependencies_parsed_at":"2023-09-27T04:45:04.056Z","dependency_job_id":"41f283e3-2e59-4dfa-966f-bfc991221a92","html_url":"https://github.com/andreztz/pyradios","commit_stats":{"total_commits":220,"total_committers":7,"mean_commits":"31.428571428571427","dds":0.1636363636363637,"last_synced_commit":"5053ab1f95725f4b3ed89aab37abfa1b4e1bdff1"},"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/andreztz/pyradios","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreztz%2Fpyradios","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreztz%2Fpyradios/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreztz%2Fpyradios/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreztz%2Fpyradios/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/andreztz","download_url":"https://codeload.github.com/andreztz/pyradios/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreztz%2Fpyradios/sbom","scorecard":{"id":194465,"data":{"date":"2025-08-11","repo":{"name":"github.com/andreztz/pyradios","commit":"cd32f023fe6b73953ca4f163cd00408c3212753c"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.9,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/25 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":1,"reason":"2 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 1","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":"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":["Info: jobLevel 'contents' permission set to 'read': .github/workflows/publish.yml:51","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/publish.yml:73","Warn: no topLevel permission defined: .github/workflows/publish.yml:1","Warn: no topLevel permission defined: .github/workflows/python-package.yml:1"],"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/publish.yml:56: update your workflow using https://app.stepsecurity.io/secureworkflow/andreztz/pyradios/publish.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/publish.yml:62: update your workflow using https://app.stepsecurity.io/secureworkflow/andreztz/pyradios/publish.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish.yml:78: update your workflow using https://app.stepsecurity.io/secureworkflow/andreztz/pyradios/publish.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/publish.yml:84: update your workflow using https://app.stepsecurity.io/secureworkflow/andreztz/pyradios/publish.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/andreztz/pyradios/publish.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/andreztz/pyradios/publish.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish.yml:34: update your workflow using https://app.stepsecurity.io/secureworkflow/andreztz/pyradios/publish.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/python-package.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/andreztz/pyradios/python-package.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/python-package.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/andreztz/pyradios/python-package.yml/main?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/publish.yml:27","Warn: pipCommand not pinned by hash: .github/workflows/publish.yml:28","Info:   0 out of   7 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 third-party GitHubAction dependencies pinned","Info:   0 out of   2 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":"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":"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":"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":"Signed-Releases","score":8,"reason":"2 out of the last 2 releases have a total of 2 signed artifacts.","details":["Info: signed release artifact: pyradios-2.1.1-py3-none-any.whl.sigstore.json: https://github.com/andreztz/pyradios/releases/tag/v2.1.1","Info: signed release artifact: pyradios-2.1.0.dev2-py3-none-any.whl.sigstore.json: https://github.com/andreztz/pyradios/releases/tag/v2.1.0.dev2","Warn: release artifact v2.1.1 does not have provenance: https://api.github.com/repos/andreztz/pyradios/releases/215249320","Warn: release artifact v2.1.0.dev2 does not have provenance: https://api.github.com/repos/andreztz/pyradios/releases/215248198"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/publish.yml:39"],"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":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"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":6,"reason":"4 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2013-22 / GHSA-27x4-j476-jp5f","Warn: Project is vulnerable to: PYSEC-2025-49 / GHSA-5rjg-fvgr-3xxf","Warn: Project is vulnerable to: GHSA-cx63-2mw6-8hw5","Warn: Project is vulnerable to: PYSEC-2022-43012 / GHSA-r9hx-vwmv-q579"],"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 14 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-16T21:33:59.343Z","repository_id":32945165,"created_at":"2025-08-16T21:33:59.343Z","updated_at":"2025-08-16T21:33:59.343Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":274046000,"owners_count":25212982,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-07T02:00:09.463Z","response_time":67,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["api","data-collection","entertainment","internet-radio","internet-radio-stations","music","open-api","python","radio-browser","radio-stations","streaming"],"created_at":"2024-09-24T14:13:08.801Z","updated_at":"2025-09-07T14:09:35.117Z","avatar_url":"https://github.com/andreztz.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Pyradios\n\n![Upload Python Package](https://github.com/andreztz/pyradios/workflows/Upload%20Python%20Package/badge.svg)  \n![Python package](https://github.com/andreztz/pyradios/workflows/Python%20package/badge.svg)\n\n\u003e A Python client for the [Radio Browser API](https://api.radio-browser.info), allowing users to search and filter thousands of online radio stations.\n\n## 📥 Installation\n\nInstall `pyradios` via pip:\n\n```sh\npip install pyradios\n\n```\n\n## 🚀 Usage\n\n### Basic Example\n\n```python\nfrom pyradios import RadioBrowser\n\nrb = RadioBrowser()\nresults = rb.search(name=\"BBC Radio 1\", name_exact=True)\n\nprint(results)\n\n```\n\n### Sample Output\n\n```json\n[\n  {\n    \"changeuuid\": \"4f7e4097-4354-11e8-b74d-52543be04c81\",\n    \"stationuuid\": \"96062a7b-0601-11e8-ae97-52543be04c81\",\n    \"name\": \"BBC Radio 1\",\n    \"url\": \"http://bbcmedia.ic.llnwd.net/stream/bbcmedia_radio1_mf_p\",\n    \"homepage\": \"http://www.bbc.co.uk/radio1/\",\n    \"tags\": \"bbc,indie,entertainment,music,rock,pop\",\n    \"country\": \"United Kingdom\",\n    \"countrycode\": \"GB\",\n    \"language\": \"english\",\n    \"codec\": \"MP3\",\n    \"bitrate\": 128\n  }\n]\n\n```\n\n## 🔍 Faceted Search with `RadioFacets`\n\n### What is `RadioFacets`?\n\n`RadioFacets` extends `RadioBrowser` by providing faceted search functionality. It allows you to filter radio stations by various attributes such as:\n\n-   **Tags** (`tags`)\n-   **Country Code** (`countrycode`)\n-   **Language** (`language`)\n-   **State/Region** (`state`)\n-   **Audio Codec** (`codec`)\n\n### Example: Using `RadioFacets`\n\n```python\nfrom pyradios import RadioBrowser, RadioFacets\n\nrb = RadioBrowser()\nrf = RadioFacets(rb)\n\nprint(len(rf))  # Total stations available\n\nrf_be = rf.narrow(countrycode=\"BE\")  # Narrow by Belgium (BE)\nprint(len(rf_be))\n\nrf_nl = rf_be.narrow(language=\"dutch\")  # Further narrow by Dutch language\nprint(len(rf_nl))\n\nrf_reset = rf_nl.broaden(countrycode=\"BE\", language=\"dutch\")  # Remove filters\nprint(len(rf_reset))  # Back to original count\n\n```\n\n### Explanation\n\n-   **`narrow(**params)`** → Adds filters and narrows results.\n-   **`broaden(*keys, **params)`** → Removes filters and broadens results.\n-   **`len(rf)`** → Returns the number of stations matching the filters.\n-   **`rf.result`** → Stores the list of filtered stations.\n\n### Example Output\n\n```sh\n53768  # Total available stations\n398    # Stations in Belgium\n108    # Dutch-speaking stations in Belgium\n53768  # Reset back to all stations\n\n```\n\n## 📖 Documentation\n\nTo explore all available methods and options, use Python’s built-in `help()` function:\n\n```python\nfrom pyradios import RadioBrowser, RadioFacets\n\nhelp(RadioBrowser)\nhelp(RadioFacets)\n\n```\n\n## 🛠 Development Setup\n\nClone the repository and set up the environment:\n\n```sh\ngit clone https://github.com/andreztz/pyradios.git\ncd pyradios\nvirtualenv venv\nsource venv/bin/activate\npip install -e .[dev]\n\n```\n\n## ✅ Running Tests\n\nExecute the test suite using `pytest`:\n\n```sh\npytest\n\n```\n\n## 📌 Release History\n\n-   **Work in progress**\n\n## 📄 License\n\nDistributed under the MIT License. See `LICENSE` for more details.\n\n## 👥 Contributing\n\nContributions are welcome! Follow these steps to contribute:\n\n1.  **Fork the repository** ([https://github.com/andreztz/pyradios/fork](https://github.com/andreztz/pyradios/fork))\n2.  **Create a feature branch** (`git checkout -b feature/fooBar`)\n3.  **Commit your changes** (`git commit -am 'Add feature fooBar'`)\n4.  **Push to your branch** (`git push origin feature/fooBar`)\n5.  **Submit a Pull Request**\n\n----------\n\n📧 **Author:** Andre P. Santos – [@ztzandre](https://twitter.com/ztzandre) – [andreztz@gmail.com](mailto:andreztz@gmail.com)\n\nGitHub: [https://github.com/andreztz](https://github.com/andreztz/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandreztz%2Fpyradios","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandreztz%2Fpyradios","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandreztz%2Fpyradios/lists"}