@ -0,0 +1,23 @@ | |||
#!/usr/bin/python3 | |||
#this script splits text on space with a maximum of 240 characters | |||
#but on whole words. because icy_medata has a max of 255 characters. | |||
import sys | |||
text = sys.stdin.readlines() | |||
output = [] | |||
line = [] | |||
sentence = "" | |||
for words in text: | |||
for word in words.split(): | |||
if len(word) + len(" ".join(line)) < 240: | |||
line.append(word) | |||
else: | |||
output.append(" ".join(line)) | |||
line = [] | |||
line.append(word) | |||
"#add the last word" | |||
output.append(" ".join(line)) | |||
for line in output: | |||
print(line.replace(',', '')) |
@ -0,0 +1,12 @@ | |||
# Bag of radio scripts | |||
This are some messy scripts. They don't work out of the box. | |||
You need maybe another tool like pallangana and maybe some | |||
python code to generate a radio html | |||
[palanggana](https://git.vvvvvvaria.org/crunk/palanggana) | |||
It assumes you have icecast2, liquidsoap and python installed. | |||
This repo is meant to inspire other radio streamers that want to | |||
tie together a few tools. | |||
@ -0,0 +1,19 @@ | |||
#This is a pretty weird script, it gets lines of text from somewhere | |||
#And it makes a playlist, to keep the amount of tracks loosely connected | |||
#To the amount of text. | |||
import sys | |||
from subprocess import Popen, PIPE | |||
magic = sys.stdin.readlines() | |||
lines = [] | |||
for line in magic: | |||
lines.append(line) | |||
pfind = Popen(["find", "/media/mp3" ], stdout=PIPE) | |||
pgrep = Popen(["grep", "mp3"], stdin=pfind.stdout, stdout=PIPE) | |||
pfind.stdout.close() # Allow pfind to receive a SIGPIPE if pgrep exits. | |||
pshuf = Popen(["shuf", "-n {0}".format(len(lines))], stdin=pgrep.stdout) | |||
pgrep.stdout.close() | |||
@ -0,0 +1,12 @@ | |||
#!/bin/zsh | |||
echo "let's go" | |||
find $PWD /home/user/incoming | grep .mp3 | shuf > /media/mp3/playlist.m3u | |||
source .venv/bin/activate | |||
python palanggana.py --magic shoutout | \ | |||
python renderradiopage.py | \ | |||
python buildplaylist.py >> /media/mp3/playlist.m3u; | |||
liquidsoap ../radio/radio.liq && | |||
echo "the radio is currently off" | python renderradiopage.py; | |||
deactivate; | |||
@ -0,0 +1,71 @@ | |||
#!/usr/bin/liquidsoap | |||
set("log.file.path","/tmp/<script>.log") | |||
%include "passwords.liq" | |||
# Print log messages to the console, | |||
set("log.stdout", true) | |||
set("server.telnet",true) | |||
#If the playlist crashes | |||
security = single("~/radio/default.ogg") | |||
#Regular playlist | |||
go = playlist.once("/media/vault/playlist.m3u") | |||
#1. this doesn't work and | |||
#2. who the fuck makes a list read from the back? | |||
#radio = sequence([go, first]) | |||
radio = fallback(track_sensitive = false, [go, security]) | |||
###======================= update metadata from telnet============== | |||
def icy_update(v) = | |||
# Parse the argument | |||
l = string.split(separator=",",v) | |||
def split(l,v) = | |||
v = string.split(separator="=",v) | |||
if list.length(v) >= 2 then | |||
list.append(l,[(list.nth(v,0,default=""),list.nth(v,1,default=""))]) | |||
else | |||
l | |||
end | |||
end | |||
meta = list.fold(split,[],l) | |||
# Update metadata | |||
icy.update_metadata(mount="/radio",password=ICECAST_SERVER_PASSWORD, | |||
host=ICECAST_SERVER_HOST,meta) | |||
icy.update_metadata(mount="/radio.ogg",password=ICECAST_SERVER_PASSWORD, | |||
host=ICECAST_SERVER_HOST,meta) | |||
"Done !" | |||
end | |||
###============ register the ability for telnet metadata update ===== | |||
server.register("update",namespace="metadata", | |||
description="Update metadata", | |||
usage="update song=..", | |||
icy_update) | |||
###======= sound collage of 5 seconds(for testing lists) ============ | |||
def add_cue_out (m) = | |||
[("liq_cue_in","0"),("liq_cue_out","5")] | |||
end | |||
#==turn on to test playlist generation etc.========================= | |||
#=========== will only play 5 seconds per track =================== | |||
#radio = map_metadata(add_cue_out, radio) | |||
#radio = cue_cut(radio) | |||
#============= shutdown function =================================== | |||
def shutdownhandler() | |||
print("blank detected and shutting down stream") | |||
shutdown() | |||
end | |||
#========= upon 20 seconds of silence shutdown the radio =========== | |||
#====== (end of stream or other problem) =========================== | |||
radio = on_blank(shutdownhandler, radio) | |||
output.icecast(%mp3, | |||
icy_metadata="true",host=ICECAST_SERVER_HOST,port=ICECAST_SERVER_PORT,password=ICECAST_SERVER_PASSWORD, | |||
mount="radio",radio) | |||
output.icecast(%vorbis, | |||
icy_metadata="true",host=ICECAST_SERVER_HOST,port=ICECAST_SERVER_PORT,password=ICECAST_SERVER_PASSWORD, | |||
mount="radio.ogg",radio) |
@ -0,0 +1,12 @@ | |||
#!/bin/sh | |||
# script to inject any text into icy_metadata of icecast | |||
# using telnet and liquidsoap. | |||
IFS=$"\n" | |||
while read -r line; | |||
do | |||
echo "$line" | |||
(sleep 2; echo "metadata.update song=$line";echo quit) | \ | |||
nc localhost 1234; | |||
sleep 30; | |||
done |
@ -0,0 +1 @@ | |||
youtube-dl -x -o '%(title)s.%(ext)s' 'youtube-id' --audio-format mp3 --ignore-errors |