Skill for collecting and managing an internet radio stream database.
The easiest way to manage both playback and the stream database is the internet-radio-music-webui plugin.
The plugin provides an embeddable web panel with:
[embed url="http://127.0.0.1:18789/mplayer"]Install the plugin:
openclaw plugins install "clawhub:internet-radio-music-webui"
openclaw gateway restart
The plugin auto-detects the database scripts (cli.py, show_stats.py, build_db.py, check_availability.py) from this skill. Both this skill AND the internet-radio-music-player skill must be installed for the plugin to work.
https://www.internet-radio.com/ — the largest internet radio station catalog.
MAX_PAGES pages per genre (/stations/{genre}/), stopping on empty page. With the default MAX_PAGES = 10 this yields ~2700+ stations across 29 genres (~150+ after dedup and filtering). Adjust MAX_PAGES to control search depth..pls playlist link from each stationhttp://server:port/stream)state.jsonEach stream has a bitrate (kbps) stored in the database. The minimum speed threshold is:
threshold_KBps = max(5.0, min((bitrate_kbps / 8) * 0.75, 50.0))
| Stream bitrate | Nominal speed | Threshold (75%) | Effective min |
|---|---|---|---|
| ---------------- | --------------- | ----------------- | --------------- |
| 320 kbps | 40 KB/s | 30 KB/s | 30 KB/s |
| 256 kbps | 32 KB/s | 24 KB/s | 24 KB/s |
| 192 kbps | 24 KB/s | 18 KB/s | 18 KB/s |
| 128 kbps | 16 KB/s | 12 KB/s | 12 KB/s |
| 64 kbps | 8 KB/s | 6 KB/s | 6 KB/s |
| 32 kbps | 4 KB/s | 3 KB/s | 5 KB/s (floor) |
| unknown | — | — | 5 KB/s (floor) |
This means a 64k stream only needs 6 KB/s to pass, while a 320k stream needs 30 KB/s.
check_stream.py module)failed_checks >= 3 are automatically removedcheck_speed_bps, check_threshold_kbs, check_bytes_received{
"url": "http://server:8000/stream",
"name": "Station Name",
"genre": "rock",
"language": "en",
"bitrate": 128,
"available": true,
"source": "internet-radio.com",
"added_at": "2026-05-23T18:00:00+00:00",
"last_checked": "2026-05-23T19:00:00+00:00",
"last_speed_bps": 12288,
"failed_checks": 0
}
| File | Purpose |
|---|---|
| ------ | --------- |
scripts/check_stream.py | Shared module — adaptive speed check logic |
scripts/build_db.py | Database population (imports from check_stream.py) |
scripts/check_availability.py | Availability check (imports from check_stream.py) |
scripts/cli.py | Stream management (list/add/remove/export) |
scripts/show_stats.py | Statistics (genres, languages, speed, efficiency) |
state.json | Stream database (not included in publication) |
# Populate database (parallel, 29 genres, ~1000+ streams)
python ~/.openclaw/skills/internet-radio-music-db/scripts/build_db.py
# Check availability (120 workers, adaptive thresholds)
python ~/.openclaw/skills/internet-radio-music-db/scripts/check_availability.py
# Full statistics
python ~/.openclaw/skills/internet-radio-music-db/scripts/show_stats.py
# Genre breakdown
python ~/.openclaw/skills/internet-radio-music-db/scripts/show_stats.py --genres
# Language distribution
python ~/.openclaw/skills/internet-radio-music-db/scripts/show_stats.py --lang
# Speed distribution
python ~/.openclaw/skills/internet-radio-music-db/scripts/show_stats.py --speed
# Top-10 fastest
python ~/.openclaw/skills/internet-radio-music-db/scripts/show_stats.py --top-speed 10
# Efficiency report (actual speed vs bitrate)
python ~/.openclaw/skills/internet-radio-music-db/scripts/show_stats.py --effective
# List streams by genre
python ~/.openclaw/skills/internet-radio-music-db/scripts/cli.py list rock
# Add/remove streams
python ~/.openclaw/skills/internet-radio-music-db/scripts/cli.py add <url> <name> <genre> [lang]
python ~/.openclaw/skills/internet-radio-music-db/scripts/cli.py remove <url>
# Export database
python ~/.openclaw/skills/internet-radio-music-db/scripts/cli.py export backup.json
0 /4 30 /4 openclaw cron add --name "DB Population" --schedule "0 */4 * * *" --tz "Europe/Samara" \
--message "Run: python ~/.openclaw/skills/internet-radio-music-db/scripts/build_db.py"
openclaw cron add --name "Availability Check" --schedule "30 */4 * * *" --tz "Europe/Samara" \
--message "Run: python ~/.openclaw/skills/internet-radio-music-db/scripts/check_availability.py"
check_stream.py module for identical criteria in population and checkingavailable: false, failed_checks counter incrementedfailed_checks >= 3 auto-removedMAX_PAGES per genre (default 10, configurable in build_db.py). Default settings yield ~150+ unique streams per cycle; increase MAX_PAGES for broader coverageMAX_PAGE to MAX_PAGES for clarityMAX_PAGES is configurable in build_db.py for deeper/faster scanscheck_stream.py used by both build_db.py and check_availability.py--effective flag shows actual vs nominal bitrate speedcheck_stream() to probe_stream() in build_db.py.clawhubignorebuild_db.py — added seen_urls setMAX_PAGES = 10共 4 个版本