Temat: Magnetowid na OperWRT
#1. Mam przyjemność brać internet od operatora, który ma też usługę telewizji IPTV. Wysyła mi więc do domu, na innym VLANie piękne strumienie 200 kanałów, przy czym to co w powietrzu jest FTA i co nie jest zbyt płatne i premium szyfrowane nie jest. Czasem nawet premium leci otwartym tekstem, bo taki CANAL+ w ramach promocji daje wszystkim. Nagrywanie na STB jest kłopotliwe, bo tam dysk mały, tylko na STB otworzyć się da.... zrobiłem więc sobie z OperWRT taki mały magnetowid.
#2. Korzystam z ruskiego udpxrec - śliczny program z pakietu udpxy zamieniającego multicasty na strumien http (togo znowu używam do oglądania niezakodowanych (TVP1, TVP-Kultura, TV Trwam) kanałów w kuchni, na iPadzie).
To udpxyrec jest śliczne, ale wywoływanie z konsoli było kłopotliwe dla mnie i domowników. Logować się na jakiegoś Linuxa? Oj, nie..... Zrobiłem więc nakładkę, aby z WWW dało się to wywołać i jeżeli ma to być inspiracją dla kogoś, kto też ma IPTV to polecam.
#3. Wyjaśnienia do kodu:
- multicasty mam dostępne na innym fizycznym porcie. Zabawa w VLANy na TP-1043 jakoś mi nie wychodziła, wieszało się, szalało więc na swiczu obok wydzieliłem port z IPTV i wprowadzilem do TP-linka odobno.
- nagrywanie dokonuje się na domowy serwer (zwie się mk-125). W tej chwili jest to Synology - i dlatego takie cuda z montowanie katalogów. Do TP-linka nie chciałem podłączać dysków skoro obok leży porządny serwer.
- fajnie się tego używa. Rodzinka zadowolona, a jak jeszcze u operatora przez chwile zepsuł się system szyfrowania... ale już naprawili.
- wgrywa się to w katalog /www/cgi-bin - jak widać, zapisałem to w shell'u bo w tym pisać kiedyś umiałem
- to co się nagrywa określa się poprzez adres grupy multicastowej. Dla rodzinki dorobiłem też wybór z menu i pierwszy raz w życiu użyłem AWK'a :-)
- aby działał wybór z menu to w tym samym katalogu powinien też być plik lista-kanalow-nagrywanych o strukturze
nazwa kanalu ; grupa multicastowa ;
#4. Miłego nagrywania fajnych filmów z TVP-Kultura i nie tylko.
W.
#!/bin/sh
#
# Obs3uga przez www i cgi-bin procesu nagrywania multicastów programem udpxrec
#
# wersje:
# 1.0 - 29 lipca 2012 - pierwsza stabilna wersja
# 1.1 - 12 sierpnia - wszystko w jednym, wykonywalnym pliku
# 1.2 - 3 pa_dziernika - dok3adam wypisywanie do loga komend i parametrow bo co¶ _le nagrywa - inny kana3 i inn± godzinê
# 1.3 - 8 pa_dziernika - dorabiak drugi formularz, z wyborem kanalu z menu
# - jakies tyle formatuj±ce dla zabawy
# 1.4 - 13 pa_dziernika - dok3adam automatyczne montowanie serwera jezeli nie jest podmontowany
#
#
version="1.4"
echo "Content-type: text/html"
echo ""
cat <<EOT
<?xml version="1.0" encoding="ISO-8859-2"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>Magnetowid $version</title>
<style>
body {
font-family: Verdana, sans-serif, Arial;
background-color: #FFFFF4;
}
div {
margin: 0.4em;
padding: 0.3em 1em;
}
h1, h2, h3 {
margin: 0;
padding: 0.2em 0;
}
</style>
</head>
<body>
EOT
data=`date "+%Y-%m-%d %H:%M:%S"`
cmd=`echo "$QUERY_STRING" | grep -oE "(^|[?&])cmd=[^&]+" | sed "s/%3A/:/g" | sed "s/%2B/+/g" | cut -f 2 -d "=" | head -n1`
# w celach debugingowych wsadam w log informacje o wywo3aniu i parametrach
cat <<EOT >> /var/log/udpxrec.log
*********************************
$data Uruchomienie /cgi-bin/magnetowid
--- command: $cmd
--- query_string: $QUERY_STRING
EOT
if [ $DEBUG ] ; then
echo "$QUERY_STRING"
echo "Komenda: $cmd"
echo "<hr>"
fi
case $cmd in
ps)
echo "<h1>Lista procesow udpxy i udpxrec</h1>"
echo "<pre>"
ps | grep "udpx" | grep -v "grep"
echo "</pre>"
;;
killur)
echo "<h1>Lista procesow udpxrec</h1>"
echo "<pre>"
echo "Przed skasowaniem"
ps | grep "udpxrec" | grep -v "grep"
killall udpxrec
sleep 1 # kilowanie troszkê trwa
echo "Po skasowaniu"
ps | grep "udpxrec" | grep -v "grep"
echo "</pre>"
;;
log)
echo "<h1>Plik z logiem udpxyrec</h1>"
echo "<pre>"
cat /var/log/udpxrec.log
echo "</pre>"
;;
ls)
echo "<h1>Katalogi zamontowane - sprawdz czy je widac</h1>"
echo "<pre>"
echo "<h3>Katalog: //mk-125/video - wszystkie materialy wideo na serwerze</h3>"
ls -l /mk-125-video
echo "<h3>Katalog: //mk-125/video/magnetowid - uzywany do nagrywania</h3>"
ls -l /mk-125-video/magnetowid
echo "</pre>"
;;
umount)
umount /mk-125-video
echo "<pre>"
echo "<H3>Efekt dzialania komendy mount</H3>"
mount
echo "</pre>"
;;
mount)
mount -t cifs //192.168.1.12/video /mk-125-video -o user=magnetowid,password=magda1towid
echo "<pre>"
echo "<H3>Efekt dzialania komendy mount</H3>"
mount
echo "<H3>Jezeli poniezej widac pliki z mk-125 to dobrze, jak nie to masz problem</H3>"
echo
ls -l /mk-125-video
echo
ls -l /mk-125-video/magnetowid
echo "</pre>"
;;
kanaly)
echo "<pre>"
cat /www/cgi-bin/lista-kanalow-nagrywanych
echo "</pre>"
;;
rec)
echo "<h1>Uruchamiam udpxyrec</h1>"
data=`date +%Y-%m-%d-%H-%M`
path="/mk-125-video/magnetowid/"
file="$data-magnetowid.ts"
start=`echo "$QUERY_STRING" | grep -oE "(^|[?&])g_start=[^&]+" | sed "s/%3A/:/g" | sed "s/%2B/+/g" | cut -f 2 -d "=" | head -n1`
stop=`echo "$QUERY_STRING" | grep -oE "(^|[?&])g_stop=[^&]+" | sed "s/%3A/:/g" | sed "s/%2B/+/g" | cut -f 2 -d "=" | head -n1`
kanal=`echo "$QUERY_STRING" | grep -oE "(^|[?&])kanal=[^&]+" | sed "s/%3A/:/g" | cut -f 2 -d "=" | head -n1`
cat <<EOT >>/var/log/udpxrec.log
--- start: $start
--- stop: $stop
--- kanal: $kanal
--- plik: $file
EOT
# parametry:
# -v - wypisuje na konsoli loga opisujacego to co czyni a czyni wiele (gdy pracuje jako demon to w pliku loga -l)
# -l - plik z logiem - przydatne gdy pracuje jako demon
# -T - to, ze ma byc nie-demonem czyli czekac az skonczy (jezeli demon to wtedy jest -v to musi byc -l)
# -m - wstakuje interfejs z ktorego ma brac multicasty (bez tego tez dziala, bo ustawilem routing)
# -B - ustawia wielkosc jakiego bufora domyslnego na 2K wiec powiekszam na 64K ale nie wiem po co
# -M - maksymalna wielkosc pliku
udpxrec -M 10Gb -B 64K -m eth0.100 -p /var/run/udpxrec.pid -l /var/log/udpxrec.log -v -b $start -e $stop -c $kanal $path$file
sleep 2 # bo udpxrex potrzebuje czasu zanim wszystko napisze w logu
echo "<pre>"
echo "<h3>Sprawdzenie uruchomionych procesow udpxrec poleceniem ps</h3>"
ps | grep "udpxrec" | grep -v "grep"
echo "<h3>Plik loga - ostatnie 44 linijki</h3>"
tail -n 44 /var/log/udpxrec.log
echo "</pre>"
;;
*)
# je¿eli niew3a¶ciwa komenda albo pusta komenta to wysletla formatkê
godzina=`date +%H:%M`
ListaKanalow=`awk 'BEGIN { FS=";" } ; { print "<OPTION value=",$2,">",$1,"</OPTION>" }' /www/cgi-bin/lista-kanalow-nagrywanych`
cat <<EOT
<H1>Magnetowid $version</h1>
<div style="border: 1px solid green;">
<H3>Sprawdzenie serwera</H3>
<UL>
EOT
if [ -d /mk-125-video/magnetowid ]
then
echo "<LI>Server MK-125 podmontowany"
else {
echo "<LI>Próbuje zamontowaæ serwer MK-125"
mount -t cifs //192.168.1.12/video /mk-125-video -o user=magnetowid,password=magda1towid
if [ -d /mk-125-video/magnetowid ]
then
echo "<LI>Sukces! Serwer MK-125 zamontowany w katalogu /mk-125-video/magnetowid"
else
echo '<LI style='color: red;'>Problem z podmontowaniem serwera MK-125!'
fi
}
fi
echo "<LI style='color: blue;'>Gdy prze3adowano strone by3a godzina: $godzina"
cat <<EOT
</UL>
</div>
<div style="border: 1px solid red;">
<h3>Zlecanie nagrania</h3>
<P>Format godziny:<br>
[+]dd:hh:mm.ss a dokladnie [[+]dd:]hh:mm[.ss]<br>
+ - oznacza, ze za tyle czasu, bez + oznacza czas bezwzgledny<br>
dd - liczba dni, ale gdy nie ma to tego samego dnia, moze nie byc wtedy bez :<br>
hh - godzina w formacie 24-godzinnym<br>
mm - minuty<br>
ss - sekrundy - moze nie byc wtedy bez kropki<br>
<table><tr><td style="margin: 0; padding: 1em; border: 1px solid gray;">
<B>Klasyczne programowanie</B>
<form method="GET">
Start: <input class="input" type="text" maxlength="8" name="g_start"><BR>
Stop: <input class="input" type="text" maxlength="8" name="g_stop"><BR>
Kanal: <input class="input" type="text" maxlength="25" name="kanal"><BR>
<input type="submit" value="Zlec nagrywanie"><br>
<input type="hidden" name="cmd" value="rec">
</form>
</td>
<td style="margin: 0; padding: 1em; border: 1px solid red;">
<B>Wybór z menu wszystkich kana3ów</B>
<form method="GET">
Start: <input class="input" type="text" maxlength="8" name="g_start"><BR>
Stop: <input class="input" type="text" maxlength="8" name="g_stop"><BR>
Kanal: <SELECT name="kanal">$ListaKanalow</SELECT><br>
<input type="submit" value="Zlec nagrywanie"><br>
<input type="hidden" name="cmd" value="rec">
</form>
</td></tr></table>
</div>
<div style="border: 1px solid brown;">
<H3>Pozostale komendy</H3>
<UL>
<LI><A href="/cgi-bin/magnetowid?cmd=kanaly">Lista kanalow</A>
<LI><A href="/cgi-bin/magnetowid?cmd=ps">Stan procesow magnetowidu (udpxyrec)</A>
<LI><A href="/cgi-bin/magnetowid?cmd=killur">Zakoñczenie (brutalne - killall) procesów nagrywania udpxyrec</A>
<LI><A href="/cgi-bin/magnetowid?cmd=log">Plik logu magnetowidu</A>
<LI><A href="/cgi-bin/magnetowid?cmd=ls">Zobacz pliki w katalogu //mk-125/video/magnetowid </a>
<LI><A href="/cgi-bin/magnetowid?cmd=mount">Podlacz (zamontuj) do magnetowidu katalog serwera MK-125</A>
<LI><A href="/cgi-bin/magnetowid?cmd=umount">Odlacz (odmontuj) katalog serwera</A>
</UL>
</div>
EOT
;;
esac
echo "</body></html>"