Подкупая своей ценой (всего 1500-2000 рос.рублей/шт. здесь) такие маги, как выснилось, обладают некоторыми недостатками. Во-первых, в них отсутствует поддержка Dolby Digital, что вызовет необходимость фильтровать в потоке соответствующую дорожку. Во-вторых, в отличие от оригинальных «инфомировских», «ростелекомы» не способны корректно работать с файлом services.html для одного канала — событийные функции почему-то не работают 🙁
Поковырявшись в носу вечерок с данной проблемой, пришлось соорудить свой вел. Решено было мониторить состояние сетевого интерфейса, а именно — входящий трафик. Если он упал до неприлично малого битрейта (а чаще это 0 kbps), то перезапускаем воспроизведение.
Итак. В маге от ростелекома с прошивкой от infomir необходимо перезаписать два файла:
/home/default/action.sh
#!/bin/sh if [ ! -f "/home/web/ifstat.txt" ] then ln -s "$1" /home/web/ifstat.txt fi STAT=`ifconfig eth0 | grep bytes | cut -d':' -f2 | cut -d' ' -f1` echo $(( $STAT / 1000000 )) > "$1"
/home/web/services.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1251"><title></title> <script src="ajax.js" type="text/javascript"></script> <script type="text/javascript"> // Copyleft by Unidiag (www.conture.by) var cout = 0; var sol = "ffrt"; // solution var url = "http://192.168.2.50:8080/534-domashniy-int"; function init(){ var stb; netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); stb = gSTB; stb.InitPlayer(); stb.SetStereoMode(1); stb.SetVolume(100); setInterval(function(){ SendRequest("GET","ifstat.txt","",function(r){ var b = parseInt(r.responseText); if((b-1)<cout){ stb.Play(sol+" "+url); } cout=b; stb.ExecAction("/tmp/ifstat.txt"); }); }, 10000); } </script> </head> <body onload="init()"></body></html>
Кроме того, для возможности чтения файла с данными о битрейте, надо добавить новый файл /home/web/ajax.js
function SendRequest(a,c,d,e){var b=CreateRequest();b&&(b.onreadystatechange=function(){4==b.readyState&&e(b)},"get"==a.toLowerCase()&&0<d.length&&(c+="?"+d),b.open(a,c,!0),"post"==a.toLowerCase()?(b.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=utf-8"),b.send(d)):b.send(null))} function CreateRequest(){var a=!1;if(window.XMLHttpRequest)a=new XMLHttpRequest;else if(window.ActiveXObject)try{a=new ActiveXObject("Microsoft.XMLHTTP")}catch(c){a=new ActiveXObject("Msxml2.XMLHTTP")}a||alert("\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c XMLHttpRequest");return a};
Алгоритм работы. Каждые 10 секунд, скрипт action.sh делает запрос к ifconfig и парсингом выхлопа достаём значение RX bytes основного интерфейса eth0, которое сохраняется в файл в ОЗУ. Также action.sh проверяет существование симлинка в рабочей дирке на озу-ный файл /tmp/ifstat.txt . Значение из файла сравнивается со значением в глобальной переменной cout, присвоенное в предыдущем такте. Если оно не отличается (трафик не изменился) — вызывается stb.Play(); .
Ниже представлен расширенный файл services.html (в момент отсутствия потока выводится информационное сообщение). Кодировка файла UTF-8.
<!doctype html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>new MAG 200-250</title> <script src="ajax.js" type="text/javascript"></script> <script type="text/javascript"> // Copyleft by Unidiag (www.conture.by) var cout =-1; var sol = "ffrt"; // solution var url = "http://192.168.2.50:8080/466-viasat-nature"; function init(){ var stb; netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); stb = gSTB; stb.InitPlayer(); stb.SetStereoMode(1); stb.SetVolume(100); stb.ExecAction("/tmp/ifstat.txt"); stb.Play(sol+" "+url); setInterval(function(){ SendRequest("GET","ifstat.txt","",function(r){ var t = ""; var b = parseInt(r.responseText); if(b<=cout){ t = "<div style='position:absolute;background-color:#aaa;color:#000;width:140px;height:25px;font:21px/1em sans-serif;top:250px;left:290px;text-align:center;padding-top:5px;'>Нет сигнала</div><div style='position:absolute; color:#a3a2a2; font:21px/1.1em sans-serif; width:100%; text-align:center; bottom:35px; cursor:none'>По вопросам вещания обращайтесь в дежурную службу:<br /><b>+375 (29) xxx-xx-xx мтс</b> [с 9-00 до 22-00 без выходных]<hr style='color:#011f82;border:1px solid #454444;' /><span style='font:18px/1em sans-serif;'>Отзывы о работе дежурной службы принимаются по эл.почте:</span><br />Email: <b>info@tv.by</b></div>"; stb.Play(sol+" "+url); } document.getElementById('loading').innerHTML = t; cout=b; stb.ExecAction("/tmp/ifstat.txt"); } ); }, 10000); } </script> </head> <body onload="init()"><div id="loading" style="width:100%; height:100%; background-color:#000822; position:absolute; top:0; left:0; z-index:2010; display:block; cursor:none"></div> </body></html> <style> b{color: #eee !important;} </style>
P.S. также выснилось, что маги ростелекома после перепрошивки меняют mac-адрес (слава богу не на один и тот же 😉 )