Internet Radio Proxy

Relay internet radio streams from a Windows PC to a Raspberry Pi running Volumio on the local network, using Icecast2 as the local streaming server and Liquidsoap as the stream relay engine — both running in Docker.

Architecture

Internet Radio Stream
        ↓
  [Liquidsoap container]  ← pulls & relays the stream
        ↓
  [Icecast2 container]    ← serves it locally on port 8000
        ↓
  Volumio (Raspberry Pi)  ← connects to http://[PC-IP]:8000/radio

File Structure

Create this folder on your PC:

radio-proxy/
  docker-compose.yaml
  config/
    icecast.xml
    radio.liq

docker-compose.yaml

services:
  icecast:
    image: infiniteproject/icecast
    container_name: icecast
    ports:
      - "8000:8000"
    volumes:
      - ./config/icecast.xml:/etc/icecast2/icecast.xml:ro
    restart: unless-stopped
 
  liquidsoap:
    image: savonet/liquidsoap:2.2.5
    container_name: liquidsoap
    volumes:
      - ./config/radio.liq:/etc/liquidsoap/radio.liq:ro
    command: ["liquidsoap", "/etc/liquidsoap/radio.liq"]
    depends_on:
      - icecast
    restart: unless-stopped

config/icecast.xml

<icecast>
  <location>Home</location>
  <admin>admin@localhost</admin>
 
  <limits>
    <clients>10</clients>
    <sources>2</sources>
    <queue-size>524288</queue-size>
    <client-timeout>30</client-timeout>
    <header-timeout>15</header-timeout>
    <source-timeout>10</source-timeout>
    <burst-on-connect>1</burst-on-connect>
    <burst-size>65536</burst-size>
  </limits>
 
  <authentication>
    <!-- Password Liquidsoap uses to connect as a source -->
    <source-password>CHANGE_ME_SOURCE</source-password>
    <relay-password>CHANGE_ME_RELAY</relay-password>
    <admin-user>admin</admin-user>
    <admin-password>CHANGE_ME_ADMIN</admin-password>
  </authentication>
 
  <hostname>localhost</hostname>
 
  <listen-socket>
    <port>8000</port>
  </listen-socket>
 
  <http-headers>
    <header name="Access-Control-Allow-Origin" value="*" />
  </http-headers>
 
  <paths>
    <basedir>/usr/share/icecast2</basedir>
    <logdir>/var/log/icecast2</logdir>
    <webroot>/usr/share/icecast2/web</webroot>
    <adminroot>/usr/share/icecast2/admin</adminroot>
  </paths>
 
  <logging>
    <accesslog>access.log</accesslog>
    <errorlog>error.log</errorlog>
    <loglevel>3</loglevel>
  </logging>
 
  <security>
    <chroot>0</chroot>
  </security>
</icecast>

config/radio.liq

# Log level (1=critical, 2=error, 3=warning, 4=info)
settings.log.level := 3
 
# Pull the internet radio stream
# Replace this URL with your actual stream URL
radio = input.http("http://YOUR_STREAM_URL_HERE")
 
# Relay it to local Icecast2
# source-password must match icecast.xml
output.icecast(
  %mp3(bitrate=128),
  host="icecast",
  port=8000,
  password="CHANGE_ME_SOURCE",
  mount="/radio",
  name="My Radio Proxy",
  description="Proxied internet radio stream",
  radio
)

Setup Steps

  1. Create the folder structure above on your PC
  2. Replace all CHANGE_ME_* values in icecast.xml and radio.liq with real passwords
  3. Replace YOUR_STREAM_URL_HERE in radio.liq with the actual radio stream URL
  4. Open a terminal in the radio-proxy/ folder and run:
    docker compose up -d
    
  5. Verify Icecast2 is running: open http://localhost:8000 in a browser — you should see the Icecast status page
  6. Check that your stream is mounted at http://localhost:8000/radio

Volumio Setup

  1. In Volumio, go to Browse → My Web Radio → Add Web Radio
  2. Add a new station with this URL:
    http://[YOUR-PC-LOCAL-IP]:8000/radio
    
  3. Find your PC’s local IP: run ipconfig in Windows CMD and look for the IPv4 address on your local network adapter (usually starts with 192.168.x.x)

Tip: Set a static IP or DHCP reservation for your PC so this URL never changes.


Adding More Stations

To proxy multiple streams, add additional output.icecast() blocks in radio.liq with different mount points (e.g., /jazz, /classical), and add each as a separate station in Volumio:

jazz = input.http("http://jazz-stream-url")
output.icecast(%mp3(bitrate=128), host="icecast", port=8000,
  password="CHANGE_ME_SOURCE", mount="/jazz", jazz)
 
classical = input.http("http://classical-stream-url")
output.icecast(%mp3(bitrate=128), host="icecast", port=8000,
  password="CHANGE_ME_SOURCE", mount="/classical", classical)

Outstanding

  • Identify the actual radio stream URL(s) to proxy
  • Choose and set real passwords
  • Find PC’s local IP and set static reservation on router
  • Test end-to-end: Docker → Icecast → Volumio

0 items under this folder.