Files
driver-manager/scripts/kodi_dvbt_setup.sh
sssnake 6e027b2c1b Add RTL-SDR mode switcher, DVB-T to Kodi pipeline, FM radio
Mode switcher (rtl_mode_switch.sh) handles exclusive dongle access
between DVB-T, FM, SDR scanner, ADS-B, spectrum, and HackRF modes.
DVB-T pipeline: RTL-SDR -> GNU Radio demod -> MPEG-TS -> HTTP -> Kodi.
Kodi setup script generates M3U playlist for PVR IPTV Simple Client.
Includes dvbt_rx.py and sdr_tv.py from dvbt-rx project.
WebUI updated with mode switcher, channel selector, and Kodi controls.
2026-03-31 07:38:02 -07:00

169 lines
5.6 KiB
Bash
Executable File

#!/system/bin/sh
# Kodi DVB-T Live TV Setup
#
# Sets up the pipeline: RTL-SDR -> DVB-T demod -> MPEG-TS -> HTTP -> Kodi
#
# Kodi PVR connection:
# 1. Install "PVR IPTV Simple Client" addon in Kodi
# 2. Configure M3U playlist URL: http://127.0.0.1:8554/dvbt.m3u
# 3. Or add single channel: http://127.0.0.1:8554
#
# This script generates the M3U playlist from configured channels
# and starts the DVB-T HTTP stream server.
MODDIR="/data/adb/modules/driver-manager"
CONFDIR="$MODDIR/config"
STREAMDIR="$MODDIR/streams"
LOGFILE="$MODDIR/driver-manager.log"
KODI_PORT=$(cat "$CONFDIR/kodi_stream_port" 2>/dev/null || echo "8554")
CHANNELS_FILE="$CONFDIR/dvbt_channels.conf"
mkdir -p "$STREAMDIR"
mlog() {
echo "$(date '+%Y-%m-%d %H:%M:%S') [kodi] $1" >> "$LOGFILE"
}
# Generate M3U playlist from channel config
# Format of dvbt_channels.conf:
# # Channel Name | Frequency (Hz) | Bandwidth | TX Mode | Constellation | Code Rate | Guard
# BBC One|506000000|8|8k|64qam|2/3|1/32
# ITV|514000000|8|8k|64qam|2/3|1/32
generate_m3u() {
M3U="$STREAMDIR/dvbt.m3u"
echo '#EXTM3U' > "$M3U"
if [ ! -f "$CHANNELS_FILE" ]; then
# Create default channel config
cat > "$CHANNELS_FILE" << 'CHANNELS'
# DVB-T Channel List
# Format: Name|Frequency(Hz)|Bandwidth(MHz)|TxMode|Constellation|CodeRate|Guard
# Edit this file to add your local channels
# Find channels with: rtl_mode_switch.sh spectrum (then check results)
#
# Example channels (UK Freeview):
Channel 1|506000000|8|8k|64qam|2/3|1/32
Channel 2|514000000|8|8k|64qam|2/3|1/32
Channel 3|522000000|8|8k|64qam|2/3|1/32
CHANNELS
mlog "Created default channel config at $CHANNELS_FILE"
fi
CH_NUM=1
while IFS='|' read -r NAME FREQ BW TXMODE CONST CR GUARD; do
# Skip comments and empty lines
case "$NAME" in
\#*|"") continue ;;
esac
# Each channel gets its own stream port
CH_PORT=$((KODI_PORT + CH_NUM))
echo "#EXTINF:-1,$NAME" >> "$M3U"
echo "http://127.0.0.1:$CH_PORT" >> "$M3U"
CH_NUM=$((CH_NUM + 1))
done < "$CHANNELS_FILE"
mlog "Generated M3U playlist: $M3U ($((CH_NUM - 1)) channels)"
}
# Start a stream server for a specific channel
# Called when Kodi connects to a channel URL
start_channel_stream() {
CH_PORT=$1
FREQ=$2
BW=$3
TXMODE=$4
CONST=$5
CR=$6
GUARD=$7
CH_NAME=$8
TERMUX="/data/data/com.termux/files/usr/bin"
SDR_TV="$MODDIR/scripts/sdr_tv.py"
FIFO="$STREAMDIR/ch_${CH_PORT}.ts"
rm -f "$FIFO"
mkfifo "$FIFO" 2>/dev/null
if [ -x "$TERMUX/python3" ] && [ -f "$SDR_TV" ]; then
# Start DVB-T demodulator
"$TERMUX/python3" "$SDR_TV" dvbt \
--freq "$FREQ" \
--bandwidth "$BW" \
--transmission-mode "$TXMODE" \
--constellation "$CONST" \
--code-rate "$CR" \
--guard-interval "$GUARD" \
> "$FIFO" 2>>"$LOGFILE" &
DVB_PID=$!
# HTTP stream server for this channel
(while true; do
(echo -e "HTTP/1.1 200 OK\r\nContent-Type: video/mp2t\r\nTransfer-Encoding: chunked\r\nConnection: close\r\n\r"; cat "$FIFO") | \
nc -l -p "$CH_PORT" 2>/dev/null
# If Kodi disconnects, kill the demodulator
kill "$DVB_PID" 2>/dev/null
break
done) &
mlog "Channel stream started: $CH_NAME on port $CH_PORT (freq=$FREQ)"
else
mlog "ERROR: python3 or sdr_tv.py not found for channel stream"
fi
}
# Serve M3U playlist on the base port
serve_m3u() {
M3U="$STREAMDIR/dvbt.m3u"
(while true; do
M3U_CONTENT=$(cat "$M3U" 2>/dev/null)
RESPONSE="HTTP/1.1 200 OK\r\nContent-Type: audio/x-mpegurl\r\nContent-Length: ${#M3U_CONTENT}\r\nConnection: close\r\n\r\n${M3U_CONTENT}"
echo -e "$RESPONSE" | nc -l -p "$KODI_PORT" 2>/dev/null
done) &
mlog "M3U server on port $KODI_PORT"
}
case "$1" in
setup)
generate_m3u
serve_m3u
mlog "Kodi DVB-T setup complete"
mlog "Add to Kodi PVR IPTV Simple Client:"
mlog " M3U URL: http://127.0.0.1:$KODI_PORT/dvbt.m3u"
echo "Kodi setup complete."
echo "In Kodi: Settings > PVR & Live TV > PVR IPTV Simple Client"
echo "M3U URL: http://127.0.0.1:$KODI_PORT/dvbt.m3u"
;;
scan)
# Scan for DVB-T channels using spectrum analysis
echo "Scanning for DVB-T channels..."
echo "Common DVB-T frequency ranges:"
echo " VHF Band III: 174-230 MHz"
echo " UHF Band IV: 470-582 MHz"
echo " UHF Band V: 582-862 MHz"
echo ""
echo "Starting spectrum scan on UHF band..."
"$MODDIR/scripts/rtl_mode_switch.sh" spectrum
echo "Check $MODDIR/streams/spectrum_data.csv for results"
;;
channels)
# List configured channels
if [ -f "$CHANNELS_FILE" ]; then
echo "Configured DVB-T channels:"
grep -v "^#" "$CHANNELS_FILE" | grep -v "^$" | while IFS='|' read -r NAME FREQ BW TXMODE CONST CR GUARD; do
FREQ_MHZ=$(echo "scale=1; $FREQ / 1000000" | bc 2>/dev/null || echo "$FREQ")
echo " $NAME${FREQ_MHZ} MHz (${BW}MHz BW, $TXMODE, $CONST, $CR, $GUARD)"
done
else
echo "No channels configured. Edit: $CHANNELS_FILE"
fi
;;
*)
echo "Usage: kodi_dvbt_setup.sh {setup|scan|channels}"
echo ""
echo " setup - Generate M3U and start stream servers"
echo " scan - Scan spectrum for DVB-T channels"
echo " channels - List configured channels"
;;
esac