An attempt at open-sourcing curated web-radio lists.
Sorry for the AI-generated readme... I'll improve this at some point.
- playlists/ - Source playlist files in various formats (CSV, JSON)
- convert_playlists.py - Converts playlists to standardized formats
- generate_index.py - Generates the master index file
The project automatically converts playlist files from various formats into both CSV and JSON standardized formats. Each input file produces two output files.
These files are then put into the latest release
CSV files can use various formats:
- Tab-delimited:
name\turl\tovol - Space-delimited:
name url ovolorurl nameorname ovol url - Double-space-delimited
name url ovol - Mixed formats with different field orders
JSON files can be:
- Ka-Radio format:
{"Name":"...","URL":"host","File":"path","Port":"80","ovol":"0"} - Standard format:
{"name":"...","url":"...","ovol":"0"}
Each input file is converted to both formats:
CSV files: Tab-delimited format
Station Name\thttp://url.com/stream\t0
JSON files: Compact JSON array format (no line breaks)
[{"name":"Station Name","url":"http://url.com/stream","ovol":"0"}]A master index file is automatically generated in playlists/index.json listing all available playlists:
[{"name":"my stations","csv":"my-stations.csv","json":"my-stations.json","total":"50"}]- name: Display name (derived from filename with underscores converted to spaces)
- csv: CSV filename
- json: JSON filename
- total: Number of stations in the playlist
Input file: playlists/my-stations.csv
Output files:
playlists-output/my-stations.csv(standardized tab-delimited)playlists-output/my-stations.json(JSON array format)
Convert playlists:
python convert_playlists.pyGenerate master index:
python generate_index.pyOr run both:
python convert_playlists.py && python generate_index.pyThis will process all files in playlists/ and output standardized files plus index.json to playlists-output/.
Any push to the main branch automatically triggers the workflow, which:
- Runs the conversion script to standardize all playlists
- Generates the master index file
- Creates a new release with all playlist files
Each workflow run creates a new release:
- Tag: Date-time format
YYYY-MM-DD-HHmmss(e.g.,2026-02-09-041400) - Name: Human-readable timestamp with colons (e.g.,
2026-02-09 04:14:00) - Marked as: Latest release
- Contains: All files from the
playlists/folder (CSV, JSON, and index.json)
To add new stations:
- Add or update files in
playlists/ - Commit and push your changes
- The workflow will automatically generate standardized output files and create a release