Реализация Торрент ТВ тут http://torrent-tv.ru/local_ts_proxy.php
Написал скрипт, тут описал процесс как и что происходит, если интересно конечно ...
Ну конечно это будет интересно! Выкладывайте на githab, если хотите чтобы сторонние разработчики подтянулись и внесли свою лепту.
Не нашел github, поэтому выложил сюда ...
Все написано на PHP, старался максимально комментировать - я, вообще, не программист, так на энтузиазме, было просто интересно, так что сильно не пинайте ...
Так что вот, на Ваш суд ...
ace.php:
#!/usr/bin/php
<?phpinclude "./config.php";//соедниение с acestreamengine-client$ace_sock = fsockopen($ace_host, $ace_port, $errno, $errstr, 30);if (!$ace_sock) { echo "$errstr ($errno)<br />\n";} else { //timeout's stream_set_timeout($ace_sock, 5); stream_set_blocking($ace_sock, false); //Рукопожатие с acestreamengine-client $out = "HELLOBG\r\n"; fwrite($ace_sock, $out); while(!feof($ace_sock)) { usleep(80000); //ждем в цикле появления cmd-файла, и в работу его, ежели появился if(file_exists($ace_cmd_file)) { $cmd = file($ace_cmd_file, true); //читаем cmd-файл foreach($cmd as &$_cmd) { print $_cmd . "\r\n"; $hash = explode(' ', $_cmd); $hash = $hash[2]; //останавливаем предыдущий канал fwrite($ace_sock, "STOP\r\n"); //запускаем новый из cmd-файла fwrite($ace_sock, $_cmd . "\r\n"); } //удаляем cmd-файл unlink($ace_cmd_file); } //читаем URL из вывода acestreamengine-client $url = fread($ace_sock, 128); //выдергиваем ... if(preg_match("/START /i", $url)) { $red_url = explode(' ', $url); //log сообщение URL'а от acestreamengine-client echo $red_url[1] . "\r\n"; //открываем соединение к консоли VLC $vlc_sock = fsockopen($vlc_host, $vlc_port, $errno, $errstr, 30); if (!$vlc_sock) { echo "$errstr ($errno)<br />\n"; } else { //timeout's stream_set_timeout($vlc_sock, 5); stream_set_blocking($vlc_sock, false); //вводим password для доступа к VLC fwrite($vlc_sock, $vlc_pass . "\r\n"); //log сообщение в STOUT echo fgets($vlc_sock, 128); usleep(10000); //удаляем все вещание ваапще $vlc_cmd = "del all\r\n"; fwrite($vlc_sock, $vlc_cmd); //log сообщение в STOUT echo fgets($vlc_sock, 128); usleep(10000); //организовываем новое $vlc_cmd = "new " . $hash . " broadcast enabled\r\n"; fwrite($vlc_sock, $vlc_cmd); //log сообщение в STOUT echo fgets($vlc_sock, 128); usleep(10000); $vlc_cmd = "setup " . $hash . " input " . $red_url[1] . "\r\n"; fwrite($vlc_sock, $vlc_cmd); //log сообщение в STOUT echo fgets($vlc_sock, 128); usleep(10000); $vlc_cmd = "setup " . $hash . " output #std{access=http,mux=ts,dst=:" . $vlc_out_port . "/" . $hash . "}\r\n"; fwrite($vlc_sock, $vlc_cmd); //log сообщение в STOUT echo fgets($vlc_sock, 128); usleep(10000); $vlc_cmd = "control " . $hash . " play\r\n"; fwrite($vlc_sock, $vlc_cmd); //log сообщение в STOUT echo fgets($vlc_sock, 128); fclose($vlc_sock); //Созадем файл, который ждет a.php $f_url = fopen($ace_url_file, "a+"); //пишем в него URL на который будет redirect плеера fwrite($f_url, "http://" . $vlc_out_host . ":" . $vlc_out_port . "/" . $hash); //log сообщение в STOUT echo "http://" . $vlc_out_host . ":" . $vlc_out_port . "/" . $hash; //закрываем файл для a.php fclose($f_url); //chown'им файл для a.php под пользователя, от которого работает веб-сервер, дабы он мог его удалить chown($ace_url_file, $apache_user); } } }}fclose($ace_sock);?>
a.php:
<?php// Берем настройкиinclude "./config.php";// Берем PID канала$id = $_GET['id'];// Создаем врмененный файл для acestreamengine-client-console$f_cmd = fopen($ace_cmd_file, "a+");// Пишем команду для acestreamengine-client-console в файлfwrite($f_cmd, "START PID " . $id . " 0");// Закрываем файлfclose($f_cmd);// Ждем в бесконечном цикле, пока отработает основной скрипт (ace.php) и создаст файл с URL от acestreamengine-client-consolewhile(true) { if($f_url = @fopen($ace_url_file, "r")) { // Читаем URL $url = fread($f_url, 256); // Закрываем файл fclose($ace_url_file); // Удаляем файл unlink($ace_url_file); // Редиректим на URL из файла header("Location: " . $url); // Останваливаем цикл break; } }?>
config.php:
<?php// Пользователь от которого работает http-сервер$apache_user = "www-data";// Пароль для telnet vlc сессии, по default - admin$vlc_pass = "admin";// Хост на котором запущен vlc$vlc_host = "127.0.0.1";// Порт который слушает vlc$vlc_port = "4212";// IP на котором будет выходной поток vlc$vlc_out_host = "192.168.100.2";// Порт на котором будет выходной поток vlc$vlc_out_port = "8903";// Хост на котором запущен acestreamengine-client-console$ace_host = "127.0.0.1";// Порт который слушает acestreamengine-client-console$ace_port = "62062";// Временный файл для передачи параметров acestreamengine-client-console -> daemon (этот скрипт) -> vlc$ace_url_file = "/var/www/tmp/ace.url";// Временный файл для передачи параметров Smart-tv -> http-server (скрипт a.php) -> acestreamengine-client-console$ace_cmd_file = "/var/www/tmp/ace.cmd";//?>
и скрипт запуска stream_tv.sh:
#!/bin/bash
#
case $1 in
start)
echo "Starting VLC ..."
su www-data -c '/usr/bin/vlc-wrapper -d -I telnet --telnet-port 4212 --telnet-password admin'
sleep 5
echo "Starting ACEStreamengine ..."
su www-data -c 'nohup /usr/bin/acestreamengine-client-console & 2> /dev/null'
sleep 5
echo "Starting ACE PHP ..."
su www-data -c 'nohup ./ace.php & 2> /dev/null'
;;
stop)
echo "Stopping ..."
kill `ps ax | grep "acestreamengine" | grep -v "grep" | awk '{print $1}'`
kill `ps ax | grep "start_engine" | grep -v "grep" | awk '{print $1}'`
kill `ps ax | grep "vlc" | grep -v "grep" | awk '{print $1}'`
kill `ps ax | grep "ace.php" | grep -v "grep" | awk '{print $1}'`
;;
*)
echo " * Usage: ./stream_tv.sh {start|stop}"
esac
P.S.
Соответственно, для пользователя $apache_user, в моем случае это www-data - нужен валидный shell, правильнее было бы завести нового пользователя и запускать все от него ...
P.S.2.
HTTP-запрос должен быть, в моем случае, следующего вида:
http://192.168.100.2:8903/a.php?id=<PID>