{"id":65,"date":"2010-08-12T18:25:50","date_gmt":"2010-08-12T16:25:50","guid":{"rendered":"https:\/\/caipirinha.spdns.org\/wp\/?p=65"},"modified":"2020-12-31T17:50:49","modified_gmt":"2020-12-31T16:50:49","slug":"caipithek","status":"publish","type":"post","link":"https:\/\/caipirinha.spdns.org\/wp\/?p=65","title":{"rendered":"Caipithek"},"content":{"rendered":"\n<p>Die <a href=\"https:\/\/caipirinha.homelinux.org\/MM\/caipithek.php\"><strong>Caipithek<\/strong><\/a> ist eine <em><strong>private<\/strong><\/em> Online-Videothek auf dem Caipirinha-Server. Sie basiert im Wesentlichen auf dem <a href=\"http:\/\/www.videolan.org\/vlc\/\"><strong>VLC Media Player<\/strong><\/a>, einem <a href=\"https:\/\/caipirinha.spdns.org\/mediawiki\/index.php\/Caipithek#Shell-Skript\">Shell-Skript<\/a> und einem <a href=\"https:\/\/caipirinha.spdns.org\/mediawiki\/index.php\/Caipithek#PHP-Skript\">PHP-Skript<\/a>. <\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"752\" height=\"821\" src=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Caipithek.jpg\" alt=\"Caipithek\" class=\"wp-image-66\" srcset=\"https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Caipithek.jpg 752w, https:\/\/caipirinha.spdns.org\/wp\/wp-content\/uploads\/Caipithek-275x300.jpg 275w\" sizes=\"auto, (max-width: 752px) 100vw, 752px\" \/><figcaption>Caipithek<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Benutzung<\/h2>\n\n\n\n<p>Zur Benutzung der <a href=\"https:\/\/caipirinha.homelinux.org\/MM\/caipithek.php\"><strong>Caipithek<\/strong><\/a> sollte auf dem Client-Computer der <a href=\"http:\/\/www.videolan.org\/vlc\/\"><strong>VLC Media Player<\/strong><\/a>\n installiert sein. Mit diesem gelungenen Programm, welches f\u00fcr \nverschiedene Plattformen erh\u00e4ltlich ist, k\u00f6nnen n\u00e4mlich sehr viele \nVideo- und Audioformate wiedergegeben werden.\n<\/p>\n\n\n\n<p>Nach dem Aufrufen der durch eine Anmeldung gesch\u00fctzte Startseite der <a href=\"https:\/\/caipirinha.homelinux.org\/MM\/caipithek.php\"><strong>Caipithek<\/strong><\/a>\n bekommt der Benutzer ein Auswahlfenster mit der zur Verf\u00fcgung stehenden\n Videos angezeigt. Die maximale Anzahl der Videos, welche zur Wiedergabe\n ausgew\u00e4hlt werden k\u00f6nnen, ist \u00fcber diesem Auswahlfenster angegeben.\n<\/p>\n\n\n\n<p>Der Benutzer w\u00e4hlt nun einen oder mehrere Video aus und \nkonfiguriert die unter dem Auswahlfenster aufgelisteten \nWiedergabe-Optionen. Darunter fallen:\n<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Video-Codec<\/strong>: Hier ist H.264 vorselektiert, weil bei diesem Format die beste Qualit\u00e4t erreicht wird.<\/li><li><strong>Bandwidth<\/strong>: Hier wird die Bandbreite f\u00fcr den Stream \neingestellt. Eine h\u00f6here Bandbreite bietet eine bessere \nWiedergabe-Qualit\u00e4t, erh\u00f6ht aber auch die Wahrscheinlichkeit von \nAussetzern, wenn der \u00dcbertragungskanal beschr\u00e4nkt ist.<\/li><li><strong>Audio Stream<\/strong>: Die meisten Videos haben mehrere Tonspuren. W\u00e4hlt man hier <strong>1<\/strong>, hat man meist den deutschen Ton, die Auswahl von <strong>2<\/strong>\n liefert meist den englischen Ton. Haben nicht alle ausgew\u00e4hlten Videos \nmehrere Tonspuren, so wird bei der Wiedergabe immer Tonspur <strong>1<\/strong> benutzt.<\/li><\/ul>\n\n\n\n<p><br>\nNach Bet\u00e4tigen des <strong>Start<\/strong>-Knopfes erscheint eine neue Seite mit \nAngaben zu den ausgew\u00e4hlten Videos und zu den Wiedergabe-Optionen. Die \nWiedergabe der Videos sollte nach wenigen Sekunden starten. Das \nWiedergabefenster kann auch auf ein Vollbild aufgezogen werden.\n<\/p>\n\n\n\n<p>Will man die Wiedergabe abbrechen, muss beachtet werden, dass man\n nicht einfach das Browserfenster schlie\u00dfen darf, sondern dass man \nwirklich auf den <strong>Exit<\/strong>-Knopf dr\u00fcckt, damit das Streaming des Videos auch im Server korrekt abgebrochen wird.\n<\/p>\n\n\n\n<p>Man kommt dann nach einigen Sekunden wieder auf die Startseite der <a href=\"https:\/\/caipirinha.homelinux.org\/MM\/caipithek.php\"><strong>Caipithek<\/strong><\/a> zur\u00fcck.\n<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Installation<\/h2>\n\n\n\n<p>Die <a href=\"https:\/\/caipirinha.homelinux.org\/MM\/caipithek.php\"><strong>Caipithek<\/strong><\/a> basiert auf dem erfolgreichen Zusammenspiel dieser Komponenten:\n<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>einem im Hintergrund laufenden <a href=\"https:\/\/caipirinha.spdns.org\/mediawiki\/index.php\/Caipithek#VLC-Serverproze.C3.9F\">VLC-Serverproze\u00df<\/a><\/li><li>einem <a href=\"https:\/\/caipirinha.spdns.org\/mediawiki\/index.php\/Caipithek#Shell-Skript\">Shell-Skript<\/a>, das eine Liste aller Videos erzeugt<\/li><li>einer <a href=\"https:\/\/caipirinha.spdns.org\/mediawiki\/index.php\/Caipithek#Konfigurationsdatei\">Konfigurationsdatei<\/a> f\u00fcr das <a href=\"https:\/\/caipirinha.spdns.org\/mediawiki\/index.php\/Caipithek#PHP-Skript\">PHP-Skript<\/a><\/li><li>einem <a href=\"https:\/\/caipirinha.spdns.org\/mediawiki\/index.php\/Caipithek#PHP-Skript\">PHP-Skript<\/a>, welches \u00fcber den <a href=\"https:\/\/caipirinha.spdns.org\/mediawiki\/index.php\/Apache\">Apache<\/a>-Server die Schnittstelle zum Benutzer darstellt<\/li><\/ul>\n\n\n\n<p> Zun\u00e4chst m\u00fcssen aber folgende Pakete auf dem Server installiert werden: <\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>gnome-vfs2<\/li><li>grep<\/li><li>mediainfo (ab Version <strong>0.7.26<\/strong>)<\/li><li>sed<\/li><li>vlc<\/li><li>vlc-noX<\/li><\/ul>\n\n\n\n<p> Eventuell werden dadurch noch weitere Pakete automatisch installiert.  Weiterhin m\u00fcssen ein funktionierender Webserver, beispielsweise <a href=\"https:\/\/caipirinha.spdns.org\/mediawiki\/index.php\/Apache\">Apache<\/a>, und eine korrekte <a href=\"https:\/\/caipirinha.spdns.org\/mediawiki\/index.php\/PHP\">PHP<\/a>-Installation vorhanden sein. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Icons<\/h3>\n\n\n\n<p>Das <a href=\"https:\/\/caipirinha.spdns.org\/mediawiki\/index.php\/Caipithek#PHP-Skript\">PHP-Skript<\/a> benutzt Buttons zur Visualisierung von Funktionen. Unter <strong>\/usr\/share\/icons\/gnome\/32&#215;32\/actions<\/strong> habe ich einige sch\u00f6ne Buttons gefunden, welche nun zun\u00e4chst \u00fcber den <a href=\"https:\/\/caipirinha.spdns.org\/mediawiki\/index.php\/Apache\">Apache<\/a>-Server &#8220;sichtbar&#8221; gemacht werden sollen. Dazu werden folgende Eintr\u00e4ge in der Datei <strong>\/etc\/apache2\/httpd.conf.local<\/strong> vorgenommen:\n<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Alias \/gnome-icons     \/usr\/share\/icons\/gnome\/32x32\n\n&lt;Directory \/usr\/share\/icons\/gnome\/32x32&gt;\n    Order             allow,deny\n    Allow from all\n&lt;\/Directory&gt;<\/pre>\n\n\n\n<p>Danach muss die ge\u00e4nderte Konfiguration noch mit <code>\/etc\/init.d\/apache2 reload<\/code> oder mit <code>\/etc\/init.d\/apache2 restart<\/code> aktiviert werden.\n<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">VLC-Serverproze\u00df<\/h3>\n\n\n\n<p>Dann wird der VLC-Serverproze\u00df mit einem <a href=\"http:\/\/de.wikipedia.org\/wiki\/Telnet\">telnet<\/a>-Interface im Hintergrund gestartet. Ich verwende dazu den gleichen Benutzer (<em>wwwrun<\/em>) wie f\u00fcr den <a href=\"https:\/\/caipirinha.spdns.org\/mediawiki\/index.php\/Apache\">Apache<\/a>-Webserver. F\u00fcr diesen Benutzer muss dann aber auch eine Login-Shell existieren; man also beispielsweise f\u00fcr <em>wwwrun<\/em> in der Benutzer-Verwaltung <strong>\/bin\/bash<\/strong> anstatt <strong>\/bin\/false<\/strong>\n einstellen. Dementsprechend sollte man auch ein sicheres Passwort \nw\u00e4hlen. Die entsprechenden Befehle sehen bei mir in einer root-Konsole \nalso so aus:\n<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">caipirinha:~ # su -l wwwrun\nwwwrun@caipirinha:~&gt; cvlc -I oldtelnet --telnet-password geheimes_passwort &gt; cvlc.log 2&gt;&amp;1 &amp;\n[1] 21639\nwwwrun@caipirinha:~&gt; exit\nlogout\ncaipirinha:~ #<\/pre>\n\n\n\n<p><strong>geheimes_passwort<\/strong> muss nat\u00fcrlich durch ein selbstgew\u00e4hltes Passwort ersetzt werden.  Wichtig ist die Option <strong>oldtelnet<\/strong>, welche seit VLC 1.1.0 benutzt werden muss (davor war es nur <strong>telnet<\/strong>). Damit wurde nun VLC im Hintergrund gestartet, und auf Port 4212 kann man sich nun mit dem VLC-Server \u00fcber <a href=\"http:\/\/de.wikipedia.org\/wiki\/Telnet\">telnet<\/a>\n verbinden. Der VLC-Serverproze\u00df ist der Kern der Videothek. \u00dcber diesen\n Proze\u00df wird der Video-Stream erzeugt und bei Bedarf auch transkodiert \n(also gro\u00dfe Videos auf eine kleine Bitrate &#8220;herunter gerechnet&#8221;).\n<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Shell-Skript<\/h3>\n\n\n\n<p>Das n\u00e4chste wichtige Element ist ein Shell-Skript (<strong>filmliste.sh<\/strong>), welches \u00fcber <strong>cron<\/strong>\n regelm\u00e4\u00dfig aufgerufen wird, in meinem Fall immer montags. Dieses \nShell-Skript erstellt eine Liste aller Videos mit einigen \nZusatzinformationen. Dazu durchsucht es mit dem Befehl <code>gnomevfs-info<\/code> das Verzeichnis <strong>VIDEODIR<\/strong> nach Videos, extrahiert mit dem Programm <code>mediainfo<\/code>, und zwar ab Version <strong>0.7.26<\/strong>.\n Einzelheiten \u00fcber as Format, die Anzahl der Video-Streams, die Anzahl \nder Audio-Streams und die L\u00e4nge des Videos und schreibt dann f\u00fcr jede \ngefundene Video eine Zeile in die Datei <strong>VIDEOLIST<\/strong>.\n<\/p>\n\n\n\n<p><strong>filmliste.sh<\/strong>:\n<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#!\/bin\/bash\n#\n# This script searches for video files in the specified folder and creates an ordered list of the files.\n#\n# Gabriel R\u00fceck, gabriel@caipirinha.homelinux.org, 18.01.2010\n#\n\n# Pre-define some variables and read the configuration files.\nreadonly VIDEODIR='\/home\/public\/Video'\nreadonly VIDEOLIST='\/home\/public\/Video\/Filmliste.txt'\n\n# Delete the old file\nrm \"$VIDEOLIST\"\n\n# Scan the specified directory for a sorted list of files that can be read by \"others\".\ncd \"$VIDEODIR\" &amp;&amp; find . -perm -004 -type f -print 2&gt;\/dev\/null | sort |\n                       # The following commands will be executed in a subshell; they would anyway because they follow the pipe (|) symbol.\n                       # But first the variable IFS is set to \"|\" as separator. Normally, IFS is set to \" \". This is important for the read command as IFS\n                       # contains the character that is used as a separator for the read command. A \" \" as separator leads to problems when the file name has\n                       # a double white space like \"  \" or so in the name as read would report this back as a single white space \" \". That&nbsp;!$#% cost me a day...\n                       (OLD_IFS=$IFS\n                        IFS=\"\"\n                        while read -r FILE_NAME;\n                        # Use gnomevfs-info as it determines videos with a higher reliability than the file command. Test if the MIME type starts with \"video\/\".\n                        # If that is the case, store the MIME type in $VIDEO_TYPE, otherwise set $VIDEO_TYPE to \"\".\n                        do VIDEO_TYPE=$(gnomevfs-info $FILE_NAME | sed -n 's\/\\(^MIME type *:\\) \\(.*\\)\/\\2\/p' | fgrep 'video\/')\n                           if [ $VIDEO_TYPE ]; then\n                              # If a video stream has been identified, store the result in the output file. Use \":\" as separator.\n                              DATA=$(mediainfo -f \"$FILE_NAME\")\n                              WIDTH=$(echo $DATA | sed -n 's\/^Width[^:]*:[^0-9]*\\([0-9].*\\)\/\\1\/p' | head -n1)\n                              HEIGHT=$(echo $DATA | sed -n 's\/^Height[^:]*:[^0-9]*\\([0-9].*\\)\/\\1\/p' | head -n1)\n                              DURATION=$[$(echo $DATA | sed -n 's\/^Duration[^:]*:[^0-9]*\\([0-9].*\\)\/\\1\/p' | head -n1)\/1000]\n                              VIDEO_STREAMS=$(echo $DATA | sed -n 's\/^Count of video streams[^:]*:[^0-9]*\\([0-9].*\\)\/\\1\/p' | head -n1)\n                              AUDIO_STREAMS=$(echo $DATA | sed -n 's\/^Count of audio streams[^:]*:[^0-9]*\\([0-9].*\\)\/\\1\/p' | head -n1)\n                              echo -e \"${FILE_NAME:2}:$WIDTH:$HEIGHT:$VIDEO_STREAMS:$AUDIO_STREAMS:$DURATION\" &gt;&gt; $VIDEOLIST\n                           fi\n                        done;\n                        # Reset IFS to its old value\n                        IFS=$OLD_IFS)\n<\/pre>\n\n\n\n<p>Das Skript l\u00e4uft unter einem normalen Benutzer-Account und sucht sowieso nur nach Dateien, die f\u00fcr <em><strong>others<\/strong><\/em> lesbar sind. Die resultierende Text-Datei hat dann beispielsweise Eintr\u00e4ge wie diese:\n<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">_BRASILIEN\/Cidade dos Homens\/Folge 1.avi:672:512:1:2:2121\n_BRASILIEN\/Cidade dos Homens\/Folge 2.avi:672:496:1:2:1646\n_BRASILIEN\/Cidade dos Homens\/Folge 3.avi:672:464:1:2:1781\n_BRASILIEN\/Cidade dos Homens\/Folge 4.avi:672:496:1:2:1895\n<\/pre>\n\n\n\n<p>Alle Eintr\u00e4ge einer Zeile sind durch einen Doppelpunkt getrennt. F\u00fcr jedes Video werden folgende Informationen erfasst:\n<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Pfad und Name des Videos, relativ zu <strong>VIDEODIR<\/strong><\/li><li>Breite des Videos in Pixeln<\/li><li>H\u00f6he des Videos in Pixeln<\/li><li>Anzahl der Video-Streams<\/li><li>Anzahl der Audio-Streams<\/li><li>L\u00e4nge des Videos in Sekunden<\/li><\/ul>\n\n\n\n<p>Damit dieses Skript erfolgreich funktioniert, d\u00fcrfen allerdings weder im Pfadnamen noch im Dateinamen Doppelpunkte vorkommen.\n<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Konfigurationsdatei<\/h3>\n\n\n\n<p>Das <a href=\"https:\/\/caipirinha.spdns.org\/mediawiki\/index.php\/Caipithek#PHP-Skript\">PHP-Skript<\/a> der <a href=\"https:\/\/caipirinha.homelinux.org\/MM\/caipithek.php\"><strong>Caipithek<\/strong><\/a> selbst ben\u00f6tigt noch eine Konfigurationsdatei namens <strong>.caipithek<\/strong>, welche sich im gleichen Verzeichnis wie <strong>caipithek.php<\/strong> befinden muss. Hier ist ein Beispiel einer funktionierenden Konfigurationsdatei:\n<\/p>\n\n\n\n<p><strong>.caipithek<\/strong>\n<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">;;;;;;;;;;;;;;\n; File Paths&nbsp;;\n;;;;;;;;;;;;;;\n\nmovie_list = \/home\/public\/Video\/Filmliste.txt\nmovie_path = \/home\/public\/Video\/\nlog_file   = \/var\/lib\/wwwrun\/caipithek.log\n\n;;;;;;;;;;;;;;;;;;;;\n; System Variables&nbsp;;\n;;;;;;;;;;;;;;;;;;;;\n\nmax_streams = 1\nmax_inputs  = 2\n\nmax_width  = 1024\nmax_height = 576\n\nvlc_host   = localhost\nvlc_port   = 4212\nvlc_pwd    = geheimes_passwort\nvlc_stream = 192.168.2.2:8008\n\npublic_add = caipirinha.homelinux.org:8008<\/pre>\n\n\n\n<p>Die meisten Eintr\u00e4ge in der Konfigurationsdatei sind selbsterkl\u00e4rend. <strong>geheimes_passwort<\/strong> ist das gleiche selbstgew\u00e4hlte Passwort, welches schon beim Starten des VLC-Serverprozesses angegeben worden ist. <strong>max_streams<\/strong>\n legt die Anzahl der gleichzeitig transkodierten Streams fest. Auf dem \nCaipirinha-Server w\u00e4ren hier alleine von der Rechenleistung her maximal 2\n gleichzeitige Streams m\u00f6glich, aber bei der geringen Upload-Rate meines\n ADSL-Anschlusses habe ich <strong>max_streams<\/strong> auf 1 gesetzt.\n<strong>max_inputs<\/strong> legt die maximale Anzahl der Videos fest, welche zur direkt aufeinander folgenden Wiedergabe ausgew\u00e4hlt werden k\u00f6nnen. <strong>max_width<\/strong> und <strong>max_height<\/strong>\n definieren die maximale Gr\u00f6\u00dfe, die beim Streamen \u00fcber das Internet \nm\u00f6glich ist. Damit werden Videos in HD-Aufl\u00f6sung herunter skaliert, weil\n die volle HD-Aufl\u00f6sung beim geringen Upload der ADSL-Verbindung zu \nruckelnden Bildern f\u00fchren w\u00fcrde. Beim reinen Streamen eines Videos (ohne\n Transkodierung), was nur im LAN m\u00f6glich ist, k\u00f6nnen auch Videos in \nHD-Aufl\u00f6sung wiedergegeben werden. <strong>vlc_stream<\/strong> legt die Adresse und den Port fest, an dem der <a href=\"https:\/\/caipirinha.spdns.org\/mediawiki\/index.php\/Caipithek#VLC-Serverproze.C3.9F\">VLC-Serverproze\u00df<\/a>\n den Stream anbieten wird. Die IP-Adresse muss nat\u00fcrlich die IP-Adresse \nder Maschine sein, auf der der VLC-Serverproze\u00df selbst l\u00e4uft. Mit <strong>public_add<\/strong>\n definiert man die IP-Adresse und den Port, wie man auf den Stream vom \nInternet aus zugreift. Deshalb ist hier auch der FQDN \n(caipirinha.homelinux.org) angegeben. Der Port ist in meiner \nKonfiguration der gleiche wie in der Variable <strong>vlc_stream<\/strong>, weil ich den entsprechenden Port auf dem ADSL-Router direkt zum Caipirinha-Server durchreiche. <strong>log_file<\/strong>\n legt schlie\u00dflich fest, wohin die Log-Datei geschrieben werden soll. \nFehlt dieser Eintrag, so werden vom PHP-Skript dennoch Log-Eintr\u00e4ge \nerzeugt, aber nach <a href=\"http:\/\/de.wikipedia.org\/wiki\/\/dev\/null\">\/dev\/null<\/a> geschrieben.\n<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">PHP-Skript<\/h3>\n\n\n\n<p>Das PHP-Skript stellt die Schnittstelle der <a href=\"https:\/\/caipirinha.homelinux.org\/MM\/caipithek.php\"><strong>Caipithek<\/strong><\/a> zum Benutzer dar. Es liest die vom <a href=\"https:\/\/caipirinha.spdns.org\/mediawiki\/index.php\/Caipithek#Shell-Skript\">Shell-Skript<\/a> erzeugte Filmliste und die <a href=\"https:\/\/caipirinha.spdns.org\/mediawiki\/index.php\/Caipithek#Konfigurationsdatei\">Konfigurationsdatei<\/a> ein. Das Skript arbeitet mit Session Cookies und kann 3 verschiedene Stati annehmen:\n<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Status 1<\/strong>: Die Einstiegsseite wird angezeigt, Videos \nwerden in einem Auswahlfenster angezeigt und Optionen zum Transkodieren \noder (im LAN) zum reinen Streaming werden angeboten.<\/li><li><strong>Status 2<\/strong>: Die ausgew\u00e4hlten Videos werden transkodiert und \ngestreamt (oder im LAN nur gestreamt) und im Browser-Fenster des \nClient-Computers mittels eines Plugin wiedergegeben.<\/li><li><strong>Status 3<\/strong>: Der Wiedergabekanal wird entfernt, und das PHP-Skript geht automatisch in Status 1 \u00fcber.<\/li><\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Filmauswahl<\/h4>\n\n\n\n<p>Das PHP-Skript liest die vom <a href=\"https:\/\/caipirinha.spdns.org\/mediawiki\/index.php\/Caipithek#Shell-Skript\">Shell-Skript<\/a>\n erzeugte Filmliste ein und bereitet die darin enthaltenen Informationen\n visuell auf. Dar\u00fcber hinaus werden Wiedergabe-Optionen zur Auswahl \nangeboten:\n<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Video-Codec<\/strong>: Hier ist H.264 vorselektiert, weil bei diesem Format die beste Qualit\u00e4t erreicht wird.<\/li><li><strong>Bandwidth<\/strong>: Hier wird die Bandbreite f\u00fcr den Stream \neingestellt. Da mein ADSL-Anschlu\u00df nur etwa 630 kbps im Uplink erlaubt, \nwird hier normalerweise 544 kbps als maximale Bandbreite angeboten \n(damit mein Uplink nicht ganz &#8220;dicht&#8221; gemacht wird).<\/li><li><strong>Audio Stream<\/strong>: Die meisten der Videos haben eine deutsche und eine englische Tonspur. W\u00e4hlt man hier <strong>1<\/strong>, hat man also meist den deutschen Ton, die Auswahl von <strong>2<\/strong>\n liefert dann den englischen Ton. Die hier gesetzte Auswahl wird aber \nnur dann ber\u00fccksichtigt, wenn alle ausgew\u00e4hlten Videos auch mehrere \nTonspuren haben. Ansonsten wird nur die Tonspur <strong>1<\/strong> wiedergegeben.<\/li><\/ul>\n\n\n\n<p>Nach Bet\u00e4tigen des <strong>Start<\/strong>-Knopfen wechselt das Skript in den Status 2 zur Wiedergabe der ausgew\u00e4hlten Videos.\n<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Wiedergabe<\/h4>\n\n\n\n<p>In Abh\u00e4ngigkeit der gew\u00e4hlten Videos und Optionen werden jetzt Werte festgelegt f\u00fcr:\n<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>den MIME-Typ des zu \u00fcbertragenden Streams (<code>$mimetype<\/code>)<\/li><li>den Transport-Multiplexer (<code>$mux<\/code>)<\/li><li>die Video-Bitrate (<code>$vb<\/code>)<\/li><li>die Audio-Bitrate (<code>$ab<\/code>)<\/li><li>die maximale Aufl\u00f6sung, welche sich aus der maximalen Breite aller \nVideos und der maximalen H\u00f6he aller Videos zusammen setzt und ggf. bei \nHD-Videos noch weiter beschr\u00e4nkt wird (<code>$width<\/code> und <code>$height<\/code>)<\/li><li>die Audio-Spur, welche \u00fcbertragen wird (<code>$audio<\/code>)<\/li><\/ul>\n\n\n\n<p>Dabei werden bereits die gew\u00e4hlten Filme \u00fcber einen <a href=\"http:\/\/de.wikipedia.org\/wiki\/Telnet\">telnet<\/a>-Kanal auf Port 4212 zum im Hintergrund laufenden <a href=\"https:\/\/caipirinha.spdns.org\/mediawiki\/index.php\/Caipithek#VLC-Serverproze.C3.9F\">VLC-Serverproze\u00df<\/a>\n \u00fcbertragen und auch in der Log-Datei vermerkt. Au\u00dferdem wird eine \nzuf\u00e4llig generierte Kanalnummer erzeugt. Diese hat den Zweck, den \nZugriff auf den Video-Stream f\u00fcr Unbefugte m\u00f6glichst zu erschweren. \nSicherer w\u00e4re es nat\u00fcrlich, hier noch einmal eine Authentifizierung des \nBenutzers vorzunehmen, und VLC sieht ja auch eine entsprechende \nM\u00f6glichkeit vor <a href=\"http:\/\/www.videolan.org\/doc\/play-howto\/en\/ch04.html\">[1]<\/a>.\n Allerdings wirkt sich ein zus\u00e4tzliches Popup-Fenster zur Eingabe eines \nBanutzernamens und eines Passwortes nachteilig auf das Handling der \nWebseite aus. Eine weitere \u00dcberlegung w\u00e4re auch gewesen, den Datenstrom \nzu verschl\u00fcsseln <a href=\"http:\/\/www.videolan.org\/doc\/streaming-howto\/en\/ch03.html\">[2]<\/a>.\n Es gibt also durchaus Spielraum, den Streaming-Vorgang noch weiter \nabzusichern. Hier wurde nur der zugegebenerma\u00dfen &#8220;unsichere&#8221; Weg der \nzuf\u00e4llig erzeugten Kanalnummer gew\u00e4hlt.\n<\/p>\n\n\n\n<p>In Abh\u00e4ngigkeit vom gew\u00e4hlten Container-Format (<strong>ts<\/strong> oder <strong>asf<\/strong>)\n wird nun mit Active-X entweder ein VLC-Plugin oder ein Media \nPlayer-Plugin aktiviert. Den HTML-Code dazu habe ich aber selbst auch \nvon verschiedenen Web-Seiten <a href=\"http:\/\/wiki.videolan.org\/ActiveX\/HTML\">[3]<\/a> <a href=\"http:\/\/www.w3schools.com\/media\/media_playerref.asp\">[4]<\/a> <a href=\"http:\/\/www.streamalot.com\/wm-embed.shtml\">[5]<\/a> <a href=\"http:\/\/www.forum-hilfe.de\/showthread.php?t=25091\">[6]<\/a> \u00fcbernommen; er stammt nicht von mir selbst.\n<\/p>\n\n\n\n<p>Bei der <a href=\"https:\/\/caipirinha.homelinux.org\/MM\/caipithek.php\"><strong>Caipithek<\/strong><\/a> habe ich mich daf\u00fcr entschieden, zwei Player zu unterst\u00fctzen, den <a href=\"http:\/\/www.videolan.org\/vlc\/\">VLC Media Player<\/a> und den <a href=\"http:\/\/www.microsoft.com\/windows\/windowsmedia\/\">Windows Media Player<\/a>. Der <a href=\"http:\/\/www.microsoft.com\/windows\/windowsmedia\/\">Windows Media Player<\/a>\n kann allerdings meines Wissens Streams nur im ASF-Format wiedergeben \nund kommt au\u00dferdem in der Standard-Installations mit nur wenigen \nVideo-Codecs daher. Deswegen und wegen der in <a href=\"http:\/\/www.videolan.org\/streaming-features.html\">[7]<\/a> aufgelisteten Beschr\u00e4nkungen habe ich mich entschieden, folgende Zuordnung vorzunehmen:\n<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>asf-Container haben WMV2 als Video-Format<\/li><li>ts-Container haben H.264-, MPEG4- oder MPEG2 als Video-Format<\/li><\/ul>\n\n\n\n<p>F\u00fcr Hinweise zu anderen L\u00f6sungen bin ich aber jederzeit sehr dankbar.\n<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Wiedergabe beenden<\/h4>\n\n\n\n<p>Ein kleiner Sch\u00f6nheitsfehler ist, dass der Benutzer nicht einfach den\n Browser schlie\u00dfen darf, wenn er das Streaming abbrechen will, sondern \ndass er auf den <strong>Exit<\/strong>-Knopf dr\u00fccken muss. Erst dann wird n\u00e4mlich \nauch das Transkodieren und Streamen im Server unterbrochen. Schlie\u00dft der\n Benutzer einfach das Browser-Fenster, ohne vorher auf <strong>Exit<\/strong> zu dr\u00fccken, l\u00e4uft die Transkodierung eventuell weiter und blockiert einen der durch <strong>max_streams<\/strong> erlaubten Kan\u00e4le, bis alle Videos abgelaufen sind. Auf jeden Fall wird beim Aufruf der Startseite der <a href=\"https:\/\/caipirinha.homelinux.org\/MM\/caipithek.php\"><strong>Caipithek<\/strong><\/a>\n nach Kan\u00e4len mit bereits abgelaufenen Filmen gesucht, die dann gel\u00f6scht\n werden. Dieser Vorgang wird dann auch in den Log-Dateien vermerkt.\n<\/p>\n\n\n\n<p><strong>caipithek.php<\/strong> <code> <br> &lt;!DOCTYPE&nbsp;HTML&nbsp;PUBLIC&nbsp;\"-\/\/W3C\/\/DTD&nbsp;HTML&nbsp;4.0&nbsp;Transitional\/\/EN\"&gt;<br> <br> &lt;html&gt;<br> &lt;head&gt;<br> &nbsp;&nbsp;&lt;title&gt;Caipithek&lt;\/title&gt;<br> &nbsp;&nbsp;&lt;style&nbsp;type=\"text\/css\"&gt;<br> &nbsp;&nbsp;&nbsp;&nbsp;a:link&nbsp;{&nbsp;text-decoration:underline;&nbsp;font-weight:normal;&nbsp;color:#0000FF;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;a:visited&nbsp;{&nbsp;text-decoration:underline;&nbsp;font-weight:normal;&nbsp;color:#800080;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;a:hover&nbsp;{&nbsp;text-decoration:underline;&nbsp;font-weight:normal;&nbsp;color:#909090;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;a:active&nbsp;{&nbsp;text-decoration:blink;&nbsp;font-weight:normal;&nbsp;color:#008080;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;h1&nbsp;{&nbsp;font-family:Arial,Helvetica,sans-serif;&nbsp;font-size:small;&nbsp;color:maroon;&nbsp;text-indent:0.0cm;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;h2&nbsp;{&nbsp;font-family:Arial,Helvetica,sans-serif;&nbsp;font-size:small;&nbsp;color:green;&nbsp;text-indent:0.0cm;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;h3&nbsp;{&nbsp;font-family:Arial,Helvetica,sans-serif;&nbsp;font-size:small;&nbsp;color:black;&nbsp;text-indent:0.0cm;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;h4&nbsp;{&nbsp;font-family:Arial,Helvetica,sans-serif;&nbsp;font-size:x-small;&nbsp;color:black;&nbsp;text-indent:0.5cm;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;h5&nbsp;{&nbsp;font-family:Arial,Helvetica,sans-serif;&nbsp;font-size:x-small;&nbsp;color:black;&nbsp;text-indent:1.0cm;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;{&nbsp;text-indent:0.0cm;&nbsp;height:3px;&nbsp;width:100%;&nbsp;text-align:left;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;li&nbsp;{&nbsp;font-family:Courier&nbsp;New;&nbsp;font-size:x-small;&nbsp;color:blue;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;{&nbsp;font-family:Arial,Helvetica,sans-serif;&nbsp;font-size:x-small;&nbsp;color:&nbsp;black;&nbsp;text-indent:0.0cm;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;th&nbsp;{&nbsp;font-family:Arial,Helvetica,sans-serif;&nbsp;font-size:x-small;&nbsp;color:&nbsp;black;&nbsp;text-indent:0.0cm;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;td&nbsp;{&nbsp;font-family:Courier&nbsp;New,sans-serif;&nbsp;font-size:x-small;&nbsp;color:&nbsp;black;&nbsp;text-indent:0.0cm;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;body&nbsp;{&nbsp;background-color:#FFFFD8;&nbsp;padding:0px;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;div.mybody&nbsp;{&nbsp;margin-left:100px;&nbsp;margin-top:20px;&nbsp;margin-right:20px;&nbsp;margin-bottom:20px;&nbsp;}<br> &nbsp;&nbsp;&lt;\/style&gt;<br> &nbsp;&nbsp;&lt;link&nbsp;rel=\"shortcut&nbsp;icon\"&nbsp;href=\"http:\/\/caipirinha.homelinux.org\/favicon.ico\"&gt;<br> &nbsp;&nbsp;&lt;meta&nbsp;http-equiv=\"content-type\"&nbsp;content=\"text\/html;&nbsp;charset=utf-8\"&gt;<br> &nbsp;&nbsp;&lt;meta&nbsp;http-equiv=\"content-language\"&nbsp;content=\"de\"&gt;<br> &nbsp;&nbsp;&lt;meta&nbsp;name=\"author\"&nbsp;content=\"root\"&gt;<br> &nbsp;&nbsp;&lt;meta&nbsp;name=\"date\"&nbsp;content=\"2010-08-12T17:30:00+0200\"&gt;<br> &nbsp;&nbsp;&lt;meta&nbsp;name=\"description\"&nbsp;lang=\"de\"&nbsp;content=\"Caipirinha&nbsp;Videothek\"&gt;<br> &nbsp;&nbsp;&lt;meta&nbsp;name=\"robots\"&nbsp;content=\"noindex\"&gt;<br> &lt;\/head&gt;<br> <br> &lt;body&gt;<br> &lt;?php<br> &nbsp;&nbsp;\/*&nbsp;FUNCTIONS&nbsp;*\/<br> &nbsp;&nbsp;function&nbsp;read_until_prompt&nbsp;($fp)&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Read&nbsp;until&nbsp;a&nbsp;'&gt;'&nbsp;char&nbsp;is&nbsp;found.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(fgetc($fp)&nbsp;!=&nbsp;\"&gt;\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Read&nbsp;the&nbsp;following&nbsp;space&nbsp;char.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fgetc($fp);<br> &nbsp;&nbsp;}<br> <br> &nbsp;&nbsp;function&nbsp;chk_stream&nbsp;($fp)&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Read&nbsp;until&nbsp;a&nbsp;trimmed&nbsp;(bare&nbsp;of&nbsp;leading&nbsp;and&nbsp;trailing&nbsp;spaces)&nbsp;line&nbsp;starting&nbsp;with&nbsp;the&nbsp;word&nbsp;'output'&nbsp;is&nbsp;found.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do&nbsp;$line&nbsp;=&nbsp;trim(fgets($fp,200));<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(substr($line,0,6)&nbsp;!=&nbsp;\"output\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(substr($line,9,9)&nbsp;==&nbsp;\"#standard\");<br> &nbsp;&nbsp;}<br> <br> &nbsp;&nbsp;function&nbsp;read_until_instances&nbsp;($fp)&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Read&nbsp;until&nbsp;a&nbsp;trimmed&nbsp;(bare&nbsp;of&nbsp;leading&nbsp;and&nbsp;trailing&nbsp;spaces)&nbsp;line&nbsp;with&nbsp;the&nbsp;word&nbsp;'instances'&nbsp;is&nbsp;found.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(trim(fgets($fp,200))&nbsp;!=&nbsp;\"instances\");<br> &nbsp;&nbsp;}<br> <br> &nbsp;&nbsp;\/*&nbsp;PROGRAM&nbsp;CODE&nbsp;*\/<br> &nbsp;&nbsp;\/*&nbsp;Read&nbsp;the&nbsp;configuration&nbsp;file.&nbsp;*\/<br> &nbsp;&nbsp;$cfg_db&nbsp;=&nbsp;dba_open&nbsp;(\".caipithek\",\"r\",\"inifile\")&nbsp;or&nbsp;die&nbsp;(\"Caipithek&nbsp;config&nbsp;file&nbsp;could&nbsp;not&nbsp;be&nbsp;found.\");<br> &nbsp;&nbsp;$movie_list&nbsp;=&nbsp;dba_fetch&nbsp;(\"movie_list\",$cfg_db)&nbsp;or&nbsp;die&nbsp;(\"The&nbsp;variable&nbsp;'movie_list'&nbsp;has&nbsp;not&nbsp;been&nbsp;specified.\");<br> &nbsp;&nbsp;$movie_path&nbsp;=&nbsp;dba_fetch&nbsp;(\"movie_path\",$cfg_db)&nbsp;or&nbsp;die&nbsp;(\"The&nbsp;variable&nbsp;'movie_path'&nbsp;has&nbsp;not&nbsp;been&nbsp;specified.\");<br> &nbsp;&nbsp;$log_file&nbsp;=&nbsp;dba_fetch&nbsp;(\"log_file\",$cfg_db)&nbsp;or&nbsp;$log_file=\"\/dev\/null\";<br> &nbsp;&nbsp;$max_streams&nbsp;=&nbsp;dba_fetch&nbsp;(\"max_streams\",$cfg_db)&nbsp;or&nbsp;$max_streams=2;<br> &nbsp;&nbsp;$max_inputs&nbsp;=&nbsp;dba_fetch&nbsp;(\"max_inputs\",$cfg_db)&nbsp;or&nbsp;$max_inputs=2;<br> &nbsp;&nbsp;$max_width&nbsp;=&nbsp;&nbsp;dba_fetch&nbsp;(\"max_width\",$cfg_db)&nbsp;or&nbsp;$max_width=960;<br> &nbsp;&nbsp;$max_height&nbsp;=&nbsp;&nbsp;dba_fetch&nbsp;(\"max_height\",$cfg_db)&nbsp;or&nbsp;$max_height=540;<br> &nbsp;&nbsp;$vlc_host&nbsp;=&nbsp;dba_fetch&nbsp;(\"vlc_host\",$cfg_db)&nbsp;or&nbsp;$vlc_host=\"localhost\";<br> &nbsp;&nbsp;$vlc_port&nbsp;=&nbsp;dba_fetch&nbsp;(\"vlc_port\",$cfg_db)&nbsp;or&nbsp;$vlc_port=4212;<br> &nbsp;&nbsp;$vlc_pwd&nbsp;&nbsp;=&nbsp;dba_fetch&nbsp;(\"vlc_pwd\",$cfg_db)&nbsp;or&nbsp;$vlc_pwd=\"admin\";<br> &nbsp;&nbsp;$vlc_stream&nbsp;=&nbsp;dba_fetch&nbsp;(\"vlc_stream\",$cfg_db)&nbsp;or&nbsp;die&nbsp;(\"The&nbsp;variable&nbsp;'vlc_stream'&nbsp;has&nbsp;not&nbsp;been&nbsp;specified.\");<br> &nbsp;&nbsp;$public_add&nbsp;=&nbsp;dba_fetch&nbsp;(\"public_add\",$cfg_db)&nbsp;or&nbsp;die&nbsp;(\"The&nbsp;variable&nbsp;'public_add'&nbsp;has&nbsp;not&nbsp;been&nbsp;specified.\");<br> &nbsp;&nbsp;dba_close&nbsp;($cfg_db);<br> <br> &nbsp;&nbsp;\/*&nbsp;This&nbsp;program&nbsp;has&nbsp;different&nbsp;states&nbsp;(like&nbsp;a&nbsp;state&nbsp;machine:<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1:&nbsp;This&nbsp;is&nbsp;the&nbsp;DEFAULT&nbsp;state.&nbsp;In&nbsp;this&nbsp;mode,&nbsp;the&nbsp;list&nbsp;of&nbsp;movies&nbsp;and&nbsp;the&nbsp;coding&nbsp;options&nbsp;are&nbsp;displayed.<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2:&nbsp;This&nbsp;is&nbsp;the&nbsp;PLAY&nbsp;state.&nbsp;In&nbsp;this&nbsp;mode,&nbsp;the&nbsp;movies&nbsp;are&nbsp;being&nbsp;transcoded&nbsp;and&nbsp;displayed&nbsp;on&nbsp;the&nbsp;client&nbsp;browser.<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;user&nbsp;can&nbsp;change&nbsp;to&nbsp;state&nbsp;3&nbsp;or&nbsp;state&nbsp;4&nbsp;from&nbsp;here.<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3:&nbsp;This&nbsp;is&nbsp;the&nbsp;STOP&nbsp;state.&nbsp;The&nbsp;channel&nbsp;is&nbsp;deleted&nbsp;from&nbsp;the&nbsp;VLC&nbsp;server.<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;State&nbsp;3&nbsp;is&nbsp;automatically&nbsp;left&nbsp;for&nbsp;state&nbsp;1&nbsp;after&nbsp;some&nbsp;seconds.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/<br> <br> &nbsp;&nbsp;\/*&nbsp;Determine&nbsp;what&nbsp;the&nbsp;page&nbsp;shall&nbsp;display.&nbsp;*\/<br> &nbsp;&nbsp;if&nbsp;(!count($_POST))<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$state&nbsp;=&nbsp;1;<br> &nbsp;&nbsp;else<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(isset($_POST['state']))&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$state&nbsp;=&nbsp;$_POST['state'];<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($state&nbsp;==&nbsp;2)<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(isset($_POST['movies'])&nbsp;and&nbsp;isset($_POST['vcodec'])&nbsp;and&nbsp;isset($_POST['audio']))&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$movies&nbsp;=&nbsp;$_POST['movies'];<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$vcodec&nbsp;=&nbsp;$_POST['vcodec'];<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$audio&nbsp;&nbsp;=&nbsp;(int)&nbsp;$_POST['audio'];&nbsp;\/*&nbsp;Without&nbsp;the&nbsp;explicit&nbsp;(int)&nbsp;the&nbsp;variable&nbsp;would&nbsp;be&nbsp;read&nbsp;as&nbsp;a&nbsp;string.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isset($_POST['bw'])&nbsp;?&nbsp;$bw=$_POST['bw']&nbsp;:&nbsp;$bw=1;&nbsp;\/*&nbsp;$bw&nbsp;may&nbsp;be&nbsp;unset&nbsp;for&nbsp;local&nbsp;access&nbsp;when&nbsp;'streaming'&nbsp;is&nbsp;pre-selected.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;$state&nbsp;=&nbsp;1;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($state&nbsp;==&nbsp;3)<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(isset($_POST['channel']))<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$channel&nbsp;=&nbsp;$_POST['channel'];<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;$state&nbsp;=&nbsp;1;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$state&nbsp;=&nbsp;1;<br> <br> &nbsp;&nbsp;\/*&nbsp;Determine&nbsp;if&nbsp;the&nbsp;client&nbsp;is&nbsp;on&nbsp;the&nbsp;local&nbsp;network.&nbsp;If&nbsp;yes,&nbsp;set&nbsp;$is_local=true.&nbsp;*\/<br> &nbsp;&nbsp;$is_local&nbsp;=&nbsp;false;<br> &nbsp;&nbsp;unset($output);<br> &nbsp;&nbsp;exec('\/sbin\/ifconfig&nbsp;|&nbsp;sed&nbsp;-n&nbsp;\\'s\/.*inet&nbsp;[^0-9]*\\([0-9]\\{1,\\}.[0-9]\\{1,\\}.[0-9]\\{1,\\}.[0-9]\\{1,\\}\\).*M[^0-9]*\\([0-9]\\{1,\\}.[0-9]\\{1,\\}.[0-9]\\{1,\\}.[0-9]\\{1,\\}\\).*\/\\1.\\2\/p\\'',$output);<br> &nbsp;&nbsp;foreach&nbsp;($output&nbsp;as&nbsp;$ip_pair)&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Determine&nbsp;the&nbsp;local&nbsp;network.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$local_ip&nbsp;=&nbsp;(int)&nbsp;strtok($ip_pair,\".\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;($counter=1;&nbsp;$counter&lt;4;&nbsp;$counter++)<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$local_ip&nbsp;=&nbsp;$local_ip&lt;&lt;8&nbsp;|&nbsp;(int)&nbsp;strtok(\".\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$netmask&nbsp;=&nbsp;(int)&nbsp;strtok(\".\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;($counter=1;&nbsp;$counter&lt;4;&nbsp;$counter++)<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$netmask&nbsp;=&nbsp;$netmask&lt;&lt;8&nbsp;|&nbsp;(int)&nbsp;strtok(\".\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Determine&nbsp;the&nbsp;remote&nbsp;network.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$remote_ip&nbsp;=&nbsp;(int)&nbsp;strtok($_SERVER['REMOTE_ADDR'],\".\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;($counter=1;&nbsp;$counter&lt;4;&nbsp;$counter++)<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$remote_ip&nbsp;=&nbsp;$remote_ip&lt;&lt;8&nbsp;|&nbsp;(int)&nbsp;strtok(\".\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Check&nbsp;if&nbsp;$local_ip&nbsp;and&nbsp;$remote_ip&nbsp;belong&nbsp;to&nbsp;the&nbsp;same&nbsp;subnet.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$is_local&nbsp;|=&nbsp;($local_ip&nbsp;&amp;&nbsp;$netmask)&nbsp;==&nbsp;($remote_ip&nbsp;&amp;&nbsp;$netmask);<br> &nbsp;&nbsp;}<br> <br> &nbsp;&nbsp;\/*&nbsp;Open&nbsp;log&nbsp;file.&nbsp;*\/<br> &nbsp;&nbsp;$log_ptr&nbsp;=&nbsp;fopen&nbsp;($log_file,\"a\")&nbsp;or&nbsp;die&nbsp;(\"The&nbsp;file&nbsp;$log_file&nbsp;cannot&nbsp;be&nbsp;opened.\");<br> <br> &nbsp;&nbsp;\/*&nbsp;Open&nbsp;telnet&nbsp;session&nbsp;to&nbsp;VLC&nbsp;server&nbsp;process&nbsp;and&nbsp;log&nbsp;in&nbsp;with&nbsp;$vlc_pwd.&nbsp;*\/<br> &nbsp;&nbsp;if&nbsp;(!($vlc_ptr&nbsp;=&nbsp;fsockopen($vlc_host,$vlc_port,$errno,$errdesc,4)))&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;p&nbsp;style=\\\"color:red\\\"&gt;An&nbsp;error&nbsp;has&nbsp;occured.&nbsp;The&nbsp;VLC&nbsp;Server&nbsp;cannot&nbsp;be&nbsp;contacted:&nbsp;\".$errno.\"&nbsp;-&nbsp;\".$errdesc.\"&lt;\/p&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;p&gt;The&nbsp;error&nbsp;has&nbsp;been&nbsp;logged.&lt;\/p&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;\/body&gt;\\n&lt;\/html&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf($log_ptr,\"%s:&nbsp;The&nbsp;VLC&nbsp;Server&nbsp;is&nbsp;unavailable:&nbsp;%s,&nbsp;%s\\n\",date(\"Y-m-d&nbsp;H:i:s\"),$errno,$errdesc);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose&nbsp;($log_ptr);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit&nbsp;(1);<br> &nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;fgets($vlc_ptr,14);<br> &nbsp;&nbsp;fputs($vlc_ptr,$vlc_pwd.\"\\n\");<br> &nbsp;&nbsp;read_until_prompt($vlc_ptr);<br> <br> &nbsp;&nbsp;switch&nbsp;($state)&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;2:<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;h1&gt;Caipithek&nbsp;-&nbsp;Watch&nbsp;Movie&lt;\/h1&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$width&nbsp;=&nbsp;9999;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$height&nbsp;=&nbsp;9999;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;($vcodec)&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;\"h264\":&nbsp;$mimetype=\"video\/3gpp\";<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$mux=\"ts\";<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;\"mp4v\":&nbsp;$mimetype=\"video\/mp4\";<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$mux=\"ts\";<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;\"mp2v\":&nbsp;$mimetype=\"video\/mpeg\";<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$mux=\"ts\";<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;\"WMV2\":&nbsp;$mimetype=\"video\/x-ms-wmv\";<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$mux=\"asf\";<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$mimetype=\"video\/mp4\";<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$mux=\"ts\";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Then,&nbsp;VLC&nbsp;rather&nbsp;than&nbsp;Windows&nbsp;Media&nbsp;Player&nbsp;will&nbsp;be&nbsp;selected&nbsp;for&nbsp;pure&nbsp;streaming.*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;($bw)&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;2:&nbsp;&nbsp;$vb&nbsp;=&nbsp;&nbsp;&nbsp;320;&nbsp;\/*&nbsp;384&nbsp;kbps&nbsp;in&nbsp;total&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ab&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;64;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;3:&nbsp;&nbsp;$vb&nbsp;=&nbsp;&nbsp;&nbsp;384;&nbsp;\/*&nbsp;448&nbsp;kbps&nbsp;in&nbsp;total&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ab&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;64;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;4:&nbsp;&nbsp;$vb&nbsp;=&nbsp;&nbsp;&nbsp;448;&nbsp;\/*&nbsp;544&nbsp;kbps&nbsp;in&nbsp;total&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ab&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;96;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;5:&nbsp;&nbsp;$vb&nbsp;=&nbsp;&nbsp;1024;&nbsp;\/*&nbsp;1152&nbsp;kbps&nbsp;in&nbsp;total;&nbsp;only&nbsp;offered&nbsp;when&nbsp;acces&nbsp;happens&nbsp;from&nbsp;local&nbsp;network&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ab&nbsp;=&nbsp;&nbsp;&nbsp;128;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:&nbsp;$vb&nbsp;=&nbsp;&nbsp;208;&nbsp;\/*&nbsp;256&nbsp;kbps&nbsp;in&nbsp;total&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ab&nbsp;=&nbsp;&nbsp;&nbsp;48;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$channel&nbsp;=&nbsp;\"V\".rand(100000000,999999999);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fputs($vlc_ptr,\"new&nbsp;\".$channel.\"&nbsp;broadcast&nbsp;enabled\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read_until_prompt($vlc_ptr);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;p&gt;The&nbsp;following&nbsp;movies&nbsp;will&nbsp;now&nbsp;be&nbsp;streamed:&lt;\/p&gt;\\n&lt;ul&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;($movies&nbsp;as&nbsp;$movie)&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!$max_inputs--)&nbsp;break;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Separate&nbsp;the&nbsp;movie&nbsp;name,&nbsp;the&nbsp;movie&nbsp;width&nbsp;and&nbsp;the&nbsp;movie&nbsp;height&nbsp;from&nbsp;the&nbsp;input.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$movie_name&nbsp;=&nbsp;base64_decode(strtok($movie,\":\"));<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Determine&nbsp;the&nbsp;smallest&nbsp;image&nbsp;size&nbsp;of&nbsp;all&nbsp;selected&nbsp;movies&nbsp;as&nbsp;this&nbsp;determines&nbsp;the&nbsp;resolution&nbsp;of&nbsp;the&nbsp;stream.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$width&nbsp;=&nbsp;min(strtok(\":\"),$width);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$height&nbsp;=&nbsp;min(strtok(\":\"),$height);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$audio&nbsp;=&nbsp;min(strtok(\":\"),$audio);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fputs($vlc_ptr,\"setup&nbsp;\".$channel.\"&nbsp;input&nbsp;\\\"\".$movie_path.$movie_name.\"\\\"\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read_until_prompt($vlc_ptr);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;li&gt;\".$movie_name.\"&lt;\/li&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Store&nbsp;the&nbsp;movie&nbsp;names&nbsp;in&nbsp;the&nbsp;log&nbsp;file.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf($log_ptr,\"%s,&nbsp;%s:&nbsp;Channel&nbsp;%s&nbsp;linked&nbsp;to&nbsp;movie&nbsp;'%s'.\\n\",date(\"Y-m-d&nbsp;H:i:s\"),$_SERVER['REMOTE_ADDR'],$channel,$movie_name);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;\/ul&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(($vcodec&nbsp;==&nbsp;\"stream\")&nbsp;or&nbsp;(($width&nbsp;&lt;=&nbsp;$max_width)&nbsp;and&nbsp;($height&nbsp;&lt;=&nbsp;$max_height)))&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;p&gt;The&nbsp;smallest&nbsp;image&nbsp;size&nbsp;of&nbsp;all&nbsp;the&nbsp;selected&nbsp;movies&nbsp;determines&nbsp;the&nbsp;resolution&nbsp;of&nbsp;the&nbsp;video&nbsp;stream.&nbsp;It&nbsp;has&nbsp;been&nbsp;set&nbsp;to:&nbsp;&lt;b&gt;\".$width.\"&lt;\/b&gt;&nbsp;x&nbsp;&lt;b&gt;\".$height.\"&lt;\/b&gt;&nbsp;pixels.\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Limit&nbsp;width&nbsp;and&nbsp;height&nbsp;of&nbsp;the&nbsp;image&nbsp;for&nbsp;transcoded&nbsp;streams&nbsp;so&nbsp;that&nbsp;the&nbsp;movie&nbsp;remains&nbsp;fluent.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$width&nbsp;=&nbsp;min&nbsp;($width,$max_width);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$height&nbsp;=&nbsp;min&nbsp;($height,$max_height);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;p&gt;The&nbsp;resolution&nbsp;of&nbsp;the&nbsp;video&nbsp;stream&nbsp;has&nbsp;been&nbsp;reduced&nbsp;in&nbsp;order&nbsp;to&nbsp;cater&nbsp;for&nbsp;the&nbsp;limited&nbsp;bandwidth.&nbsp;It&nbsp;has&nbsp;been&nbsp;set&nbsp;to:&nbsp;&lt;b&gt;\".$width.\"&lt;\/b&gt;&nbsp;x&nbsp;&lt;b&gt;\".$height.\"&lt;\/b&gt;&nbsp;pixels.\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&nbsp;Audio&nbsp;channel&nbsp;&lt;b&gt;\".$audio.\"&lt;\/b&gt;&nbsp;has&nbsp;been&nbsp;selected.&lt;\/p&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Select&nbsp;Audio&nbsp;Channel.&nbsp;Usually,&nbsp;my&nbsp;movies&nbsp;are&nbsp;encoded&nbsp;with&nbsp;two&nbsp;audio&nbsp;streams.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fputs($vlc_ptr,\"setup&nbsp;\".$channel.\"&nbsp;option&nbsp;audio-track=\".($audio-1).\"\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read_until_prompt($vlc_ptr);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;p&gt;Streaming&nbsp;will&nbsp;be&nbsp;done&nbsp;using&nbsp;the&nbsp;channel:&nbsp;&lt;a&nbsp;href=\\\"http:\/\/\".$public_add.\"\/\".$channel.\"\\\"&gt;&lt;b&gt;http:\/\/\".$public_add.\"\/\".$channel.\"&lt;\/b&gt;&lt;\/a&gt;&lt;\/p&gt;&lt;hr&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($vcodec&nbsp;==&nbsp;\"stream\")&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;If&nbsp;pure&nbsp;streaming&nbsp;has&nbsp;been&nbsp;selected,&nbsp;do&nbsp;not&nbsp;transcode,&nbsp;but&nbsp;just&nbsp;stream&nbsp;the&nbsp;movie.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fputs($vlc_ptr,\"setup&nbsp;\".$channel.\"&nbsp;output&nbsp;#standard{access=http{mime=\\\"\".$mimetype.\"\\\"},mux=ts,dst=\".$vlc_stream.\"\/\".$channel.\"}\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Update&nbsp;the&nbsp;channel&nbsp;status&nbsp;in&nbsp;the&nbsp;log&nbsp;file.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf($log_ptr,\"%s,&nbsp;%s:&nbsp;Channel&nbsp;%s&nbsp;streaming&nbsp;without&nbsp;transcoding.&nbsp;Audio&nbsp;stream&nbsp;%d&nbsp;is&nbsp;selected.\\n\",date(\"Y-m-d&nbsp;H:i:s\"),$_SERVER['REMOTE_ADDR'],$channel,$audio);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;If&nbsp;a&nbsp;bandwidth&nbsp;has&nbsp;been&nbsp;selected,&nbsp;transcode&nbsp;the&nbsp;movie.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fputs($vlc_ptr,\"setup&nbsp;\".$channel.\"&nbsp;output&nbsp;#transcode{vcodec=\".$vcodec.\",vb=\".$vb.\",width=\".$width.\",height=\".$height.\",acodec=mp3,ab=\".$ab.\",channels=2}:standard{access=http{mime=\\\"\".$mimetype.\"\\\"},mux=\".$mux.\",dst=\".$vlc_stream.\"\/\".$channel.\"}\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Update&nbsp;the&nbsp;channel&nbsp;status&nbsp;in&nbsp;the&nbsp;log&nbsp;file.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf($log_ptr,\"%s,&nbsp;%s:&nbsp;Channel&nbsp;%s&nbsp;streaming&nbsp;with&nbsp;transcoding&nbsp;to&nbsp;%s.&nbsp;Audio&nbsp;stream&nbsp;%d&nbsp;is&nbsp;selected.\\n\",date(\"Y-m-d&nbsp;H:i:s\"),$_SERVER['REMOTE_ADDR'],$channel,$vcodec,$audio);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read_until_prompt($vlc_ptr);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fputs($vlc_ptr,\"control&nbsp;\".$channel.\"&nbsp;play\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read_until_prompt($vlc_ptr);<br> <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Das&nbsp;folgende&nbsp;Konstrukt&nbsp;spricht&nbsp;sowohl&nbsp;den&nbsp;Internet&nbsp;Explorer&nbsp;als&nbsp;auch&nbsp;Firefox&nbsp;an.<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;F\u00fcr&nbsp;den&nbsp;Internet-Explorer&nbsp;wird&nbsp;das&nbsp;&lt;object&gt;-Tag&nbsp;ausgef\u00fchrt,&nbsp;aber&nbsp;der&nbsp;Inhalt&nbsp;des&nbsp;&lt;comment&gt;-Tags&nbsp;\u00fcberlesen.<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;F\u00fcr&nbsp;Firefox&nbsp;wird&nbsp;im&nbsp;&lt;object&gt;-Tag&nbsp;alles&nbsp;bis&nbsp;auf&nbsp;den&nbsp;Inhalt&nbsp;des&nbsp;&lt;comment&gt;-Tags&nbsp;\u00fcberlesen.&nbsp;Letzteres&nbsp;wird&nbsp;aber&nbsp;dann&nbsp;ausgef\u00fchrt.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($mux&nbsp;==&nbsp;\"ts\")&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;object&nbsp;classid=\\\"clsid:E23FE9C6-778E-49D4-B537-38FCDE4887D8\\\"&nbsp;codebase=\\\"http:\/\/downloads.videolan.org\/pub\/videolan\/vlc\/latest\/win32\/axvlc.cab\\\"&nbsp;mimetype=\\\"\".$mimetype.\"\\\"&nbsp;width=\\\"\".$width.\"\\\"&nbsp;height=\\\"\".$height.\"\\\"&nbsp;id=\\\"vlc\\\"&nbsp;events=\\\"True\\\"&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;param&nbsp;name=\\\"Src\\\"&nbsp;value=\\\"http:\/\/\".$public_add.\"\/\".$channel.\"\\\"&nbsp;\/&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;param&nbsp;name=\\\"ShowDisplay\\\"&nbsp;value=\\\"True\\\"&nbsp;\/&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;param&nbsp;name=\\\"AutoPlay\\\"&nbsp;value=\\\"True\\\"&nbsp;\/&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;param&nbsp;name=\\\"Volume\\\"&nbsp;value=\\\"100\\\"&nbsp;\/&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;embed&nbsp;src=\\\"http:\/\/\".$public_add.\"\/\".$channel.\"\\\"&nbsp;mimetype=\\\"\".$mimetype.\"\\\"&nbsp;border=\\\"2\\\"&nbsp;width=\\\"\".$width.\"\\\"&nbsp;height=\\\"\".$height.\"\\\"&nbsp;id=\\\"vlc\\\"&gt;&lt;\/embed&gt;\\n&lt;\/object&gt;&lt;hr&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;User&nbsp;Interface&nbsp;with&nbsp;icons.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;table&nbsp;width=\\\"100%\\\"&nbsp;cellspacing=\\\"1\\\"&nbsp;cellpadding=\\\"4\\\"&nbsp;bgcolor=\\\"beige\\\"&gt;&lt;tr&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;td&nbsp;width=\\\"11%\\\"&nbsp;align=\\\"center\\\"&nbsp;valign=\\\"center\\\"&gt;&lt;input&nbsp;type=\\\"image\\\"&nbsp;src=\\\"\/gnome-icons\/actions\/media-playback-start.png\\\"&nbsp;class=\\\"submit\\\"&nbsp;alt=\\\"Play\\\"&nbsp;onClick=\\\"document.vlc.play();\\\"&gt;&lt;\/td&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;td&nbsp;width=\\\"11%\\\"&nbsp;align=\\\"center\\\"&nbsp;valign=\\\"center\\\"&gt;&lt;input&nbsp;type=\\\"image\\\"&nbsp;src=\\\"\/gnome-icons\/actions\/media-playback-pause.png\\\"&nbsp;class=\\\"submit\\\"&nbsp;alt=\\\"Pause\\\"&nbsp;onClick=\\\"document.vlc.pause();\\\"&gt;&lt;\/td&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;td&nbsp;width=\\\"11%\\\"&nbsp;align=\\\"center\\\"&nbsp;valign=\\\"center\\\"&gt;&lt;input&nbsp;type=\\\"image\\\"&nbsp;src=\\\"\/gnome-icons\/status\/audio-volume-muted.png\\\"&nbsp;class=\\\"submit\\\"&nbsp;alt=\\\"Mute\\\"&nbsp;onClick=\\\"document.vlc.toggleMute();\\\"&gt;&lt;\/td&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;td&nbsp;width=\\\"11%\\\"&nbsp;align=\\\"center\\\"&nbsp;valign=\\\"center\\\"&gt;&lt;input&nbsp;type=\\\"image\\\"&nbsp;src=\\\"\/gnome-icons\/actions\/view-fullscreen.png\\\"&nbsp;class=\\\"submit\\\"&nbsp;alt=\\\"Full&nbsp;Screen\\\"&nbsp;onClick=\\\"document.vlc.fullscreen();\\\"&gt;&lt;\/td&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;td&nbsp;width=\\\"56%\\\"&nbsp;align=\\\"center\\\"&nbsp;valign=\\\"center\\\"&gt;&lt;form&nbsp;action=\\\"\".$_SERVER['PHP_SELF'].\"\\\"&nbsp;method=\\\"post\\\"&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;input&nbsp;type=\\\"hidden\\\"&nbsp;name=\\\"state\\\"&nbsp;value=\\\"3\\\"&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;input&nbsp;type=\\\"hidden\\\"&nbsp;name=\\\"channel\\\"&nbsp;value=\\\"\".$channel.\"\\\"&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;input&nbsp;type=\\\"image\\\"&nbsp;src=\\\"\/gnome-icons\/actions\/media-playback-stop.png\\\"&nbsp;class=\\\"submit\\\"&nbsp;alt=\\\"Stop\\\"&gt;\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;\/form&gt;&lt;\/td&gt;\\n&lt;\/tr&gt;&lt;\/table&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;User&nbsp;Interface&nbsp;with&nbsp;text&nbsp;buttons.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;table&nbsp;width=\\\"100%\\\"&nbsp;cellspacing=\\\"1\\\"&nbsp;cellpadding=\\\"2\\\"&gt;&lt;tr&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;td&nbsp;width=\\\"11%\\\"&nbsp;align=\\\"center\\\"&nbsp;valign=\\\"center\\\"&gt;&lt;input&nbsp;type=\\\"button\\\"&nbsp;class=\\\"submit\\\"&nbsp;style=\\\"background-color:aquamarine;font-weight:bold\\\"&nbsp;value=\\\"Play\\\"&nbsp;onClick=\\\"document.vlc.play();\\\"&gt;&lt;\/td&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;td&nbsp;width=\\\"11%\\\"&nbsp;align=\\\"center\\\"&nbsp;valign=\\\"center\\\"&gt;&lt;input&nbsp;type=\\\"button\\\"&nbsp;class=\\\"submit\\\"&nbsp;style=\\\"background-color:aquamarine;font-weight:bold\\\"&nbsp;value=\\\"Pause\\\"&nbsp;onClick=\\\"document.vlc.pause();\\\"&gt;&lt;\/td&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;td&nbsp;width=\\\"11%\\\"&nbsp;align=\\\"center\\\"&nbsp;valign=\\\"center\\\"&gt;&lt;input&nbsp;type=\\\"button\\\"&nbsp;class=\\\"submit\\\"&nbsp;style=\\\"background-color:aquamarine;font-weight:bold\\\"&nbsp;value=\\\"Mute\\\"&nbsp;onClick=\\\"document.vlc.togglemute();\\\"&gt;&lt;\/td&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;td&nbsp;width=\\\"11%\\\"&nbsp;align=\\\"center\\\"&nbsp;valign=\\\"center\\\"&gt;&lt;input&nbsp;type=\\\"button\\\"&nbsp;class=\\\"submit\\\"&nbsp;style=\\\"background-color:aquamarine;font-weight:bold\\\"&nbsp;value=\\\"Full&nbsp;Screen\\\"&nbsp;onClick=\\\"document.vlc.fullscreen();\\\"&gt;&lt;\/td&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;td&nbsp;width=\\\"56%\\\"&nbsp;align=\\\"center\\\"&nbsp;valign=\\\"center\\\"&gt;&lt;form&nbsp;action=\\\"\".$_SERVER['PHP_SELF'].\"\\\"&nbsp;method=\\\"post\\\"&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;input&nbsp;type=\\\"hidden\\\"&nbsp;name=\\\"state\\\"&nbsp;value=\\\"3\\\"&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;input&nbsp;type=\\\"hidden\\\"&nbsp;name=\\\"channel\\\"&nbsp;value=\\\"\".$channel.\"\\\"&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;input&nbsp;type=\\\"submit\\\"&nbsp;value=\\\"Exit\\\"&nbsp;style=\\\"background-color:lightcoral;font-weight:bold\\\"&gt;\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;\/form&gt;&lt;\/td&gt;\\n&lt;\/tr&gt;&lt;\/table&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;object&nbsp;id=\\\"mediaPlayer\\\"&nbsp;classid=\\\"CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95\\\"&nbsp;codebase=\\\"http:\/\/activex.microsoft.com\/activex\/controls\/mplayer\/en\/nsmp2inf.cab#Version=5,1,52,701\\\"&nbsp;standby=\\\"Loading&nbsp;Microsoft&nbsp;Windows&nbsp;Media&nbsp;Player&nbsp;components...\\\"&nbsp;type=\\\"application\/x-oleobject\\\"&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;param&nbsp;name=\\\"fileName\\\"&nbsp;value=\\\"http:\/\/\".$public_add.\"\/\".$channel.\"\\\"&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;param&nbsp;name=\\\"animationatStart\\\"&nbsp;value=\\\"true\\\"&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;param&nbsp;name=\\\"transparentatStart\\\"&nbsp;value=\\\"true\\\"&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;param&nbsp;name=\\\"autoStart\\\"&nbsp;value=\\\"true\\\"&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;param&nbsp;name=\\\"showControls\\\"&nbsp;value=\\\"true\\\"&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;param&nbsp;name=\\\"Volume\\\"&nbsp;value=\\\"-100\\\"&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;embed&nbsp;src=\\\"http:\/\/\".$public_add.\"\/\".$channel.\"\\\"&nbsp;mimetype=\\\"\".$mimetype.\"\\\"&nbsp;border=\\\"2\\\"&nbsp;width=\\\"\".$width.\"\\\"&nbsp;height=\\\"\".$height.\"\\\"&nbsp;id=\\\"mediaPlayer\\\"&gt;&lt;\/embed&gt;\\n&lt;\/object&gt;&lt;hr&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;User&nbsp;Interface&nbsp;with&nbsp;'Exit'&nbsp;buttons.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;form&nbsp;action=\\\"\".$_SERVER['PHP_SELF'].\"\\\"&nbsp;method=\\\"post\\\"&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;input&nbsp;type=\\\"hidden\\\"&nbsp;name=\\\"state\\\"&nbsp;value=\\\"3\\\"&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;input&nbsp;type=\\\"hidden\\\"&nbsp;name=\\\"channel\\\"&nbsp;value=\\\"\".$channel.\"\\\"&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;table&nbsp;cellspacing=\\\"1\\\"&nbsp;cellpadding=\\\"4\\\"&nbsp;bgcolor=\\\"beige\\\"&gt;&lt;tr&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;td&gt;&lt;input&nbsp;type=\\\"image\\\"&nbsp;src=\\\"\/gnome-icons\/actions\/media-playback-stop.png\\\"&nbsp;class=\\\"submit\\\"&nbsp;alt=\\\"Stop\\\"&gt;&lt;\/td&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;td&gt;&lt;input&nbsp;type=\\\"submit\\\"&nbsp;value=\\\"Exit\\\"&nbsp;style=\\\"background-color:lightcoral;font-weight:bold\\\"&gt;&lt;\/td&gt;\\n&lt;\/tr&gt;&lt;\/table&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"&lt;\/form&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br> <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;3:<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Stop&nbsp;the&nbsp;transmission&nbsp;and&nbsp;delete&nbsp;the&nbsp;channel.&nbsp;After&nbsp;this,&nbsp;run&nbsp;through&nbsp;to&nbsp;the&nbsp;default&nbsp;stage.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fputs($vlc_ptr,\"control&nbsp;\".$channel.\"&nbsp;stop\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read_until_prompt($vlc_ptr);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fputs($vlc_ptr,\"del&nbsp;\".$channel.\"\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read_until_prompt($vlc_ptr);<br> <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Store&nbsp;the&nbsp;deleted&nbsp;channel&nbsp;in&nbsp;the&nbsp;log&nbsp;file.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf($log_ptr,\"%s,&nbsp;%s:&nbsp;Channel&nbsp;%s&nbsp;destroyed.\\n\",date(\"Y-m-d&nbsp;H:i:s\"),$_SERVER['REMOTE_ADDR'],$channel);<br> <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;h1&gt;Caipithek&nbsp;-&nbsp;Movie&nbsp;Selector&lt;\/h1&gt;\\n\");<br> <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Check&nbsp;the&nbsp;number&nbsp;of&nbsp;active&nbsp;channels.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fputs($vlc_ptr,\"show&nbsp;media\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fgets($vlc_ptr,10);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Get&nbsp;the&nbsp;number&nbsp;of&nbsp;broadcast&nbsp;channels&nbsp;which&nbsp;have&nbsp;already&nbsp;been&nbsp;set&nbsp;up.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;preg_match_all&nbsp;(\"\/\\b([0-9]{1,})&nbsp;broadcast\\b\/\",fgets($vlc_ptr,38),$output,PREG_SET_ORDER);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$broadcasts&nbsp;=&nbsp;$output[0][1];<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;If&nbsp;channels&nbsp;have&nbsp;been&nbsp;defined,&nbsp;examine&nbsp;them&nbsp;and&nbsp;remove&nbsp;the&nbsp;\"dead\"&nbsp;ones.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($broadcasts)&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Read&nbsp;existing&nbsp;channel.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$channel&nbsp;=&nbsp;trim(fgets($vlc_ptr,20));<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$loop&nbsp;=&nbsp;true;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset&nbsp;($dead_channels);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Check&nbsp;if&nbsp;the&nbsp;current&nbsp;channel&nbsp;is&nbsp;transcoded&nbsp;or&nbsp;only&nbsp;streamed.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$is_streamed&nbsp;=&nbsp;chk_stream($vlc_ptr);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read_until_instances($vlc_ptr);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Continue&nbsp;to&nbsp;read&nbsp;until&nbsp;a&nbsp;'&gt;',&nbsp;a&nbsp;digit&nbsp;([0-9])&nbsp;or&nbsp;a&nbsp;word&nbsp;starting&nbsp;with&nbsp;'i'&nbsp;(for&nbsp;'instances')&nbsp;is&nbsp;encountered.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do&nbsp;$char&nbsp;=&nbsp;fgetc($vlc_ptr);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(strpos(\"&gt;Vi\",$char)&nbsp;===&nbsp;false);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($char&nbsp;==&nbsp;'&gt;')&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;This&nbsp;channel&nbsp;is&nbsp;not&nbsp;active.&nbsp;Put&nbsp;the&nbsp;channel&nbsp;number&nbsp;into&nbsp;the&nbsp;list&nbsp;of&nbsp;dead&nbsp;channels.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$dead_channels[]&nbsp;=&nbsp;$channel;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Decrease&nbsp;the&nbsp;number&nbsp;of&nbsp;broadcasts.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$broadcasts--;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Read&nbsp;the&nbsp;following&nbsp;space&nbsp;char.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fgetc($vlc_ptr);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$loop&nbsp;=&nbsp;false;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;elseif&nbsp;($char&nbsp;==&nbsp;'i')&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;This&nbsp;channel&nbsp;is&nbsp;active.&nbsp;Overread&nbsp;all&nbsp;information&nbsp;until&nbsp;a&nbsp;line&nbsp;with&nbsp;the&nbsp;word&nbsp;'playlistindex'&nbsp;is&nbsp;read.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(substr(trim(fgets($vlc_ptr,40)),0,13)&nbsp;!=&nbsp;\"playlistindex\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Despite&nbsp;the&nbsp;channel&nbsp;being&nbsp;active&nbsp;-&nbsp;check&nbsp;whether&nbsp;the&nbsp;stream&nbsp;is&nbsp;transcoded&nbsp;or&nbsp;streamed&nbsp;only.<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;the&nbsp;channel&nbsp;is&nbsp;streamed&nbsp;only,&nbsp;decrease&nbsp;$broadcasts&nbsp;as&nbsp;streaming&nbsp;uses&nbsp;little&nbsp;CPU&nbsp;power&nbsp;only.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($is_streamed)<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$broadcasts--;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Read&nbsp;next&nbsp;character.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$char&nbsp;=&nbsp;fgetc($vlc_ptr);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($char&nbsp;==&nbsp;'&gt;')&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Read&nbsp;the&nbsp;following&nbsp;space&nbsp;char&nbsp;and&nbsp;abort&nbsp;the&nbsp;loop.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fgetc($vlc_ptr);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$loop&nbsp;=&nbsp;false;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Another&nbsp;channel&nbsp;declaration&nbsp;is&nbsp;following.&nbsp;Concatenate&nbsp;the&nbsp;read&nbsp;digit&nbsp;with&nbsp;the&nbsp;rest&nbsp;of&nbsp;the&nbsp;digits.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$channel&nbsp;=&nbsp;trim(fgets($vlc_ptr,20));<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;The&nbsp;current&nbsp;channel&nbsp;is&nbsp;not&nbsp;active.&nbsp;Put&nbsp;the&nbsp;channel&nbsp;number&nbsp;into&nbsp;the&nbsp;list&nbsp;of&nbsp;dead&nbsp;channels.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$dead_channels[]&nbsp;=&nbsp;$channel;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Decrease&nbsp;the&nbsp;number&nbsp;of&nbsp;broadcasts.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$broadcasts--;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Another&nbsp;channel&nbsp;declaration&nbsp;is&nbsp;following.&nbsp;Concatenate&nbsp;the&nbsp;\"V\"&nbsp;with&nbsp;the&nbsp;rest&nbsp;of&nbsp;the&nbsp;digits.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$channel&nbsp;=&nbsp;\"V\".trim(fgets($vlc_ptr,20));<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;while&nbsp;($loop);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(isset($dead_channels))<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;If&nbsp;dead&nbsp;channels&nbsp;exist,&nbsp;delete&nbsp;them&nbsp;all.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;($dead_channels&nbsp;as&nbsp;$channel)&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Delete&nbsp;the&nbsp;dead&nbsp;channel&nbsp;and&nbsp;write&nbsp;a&nbsp;log&nbsp;entry.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fputs($vlc_ptr,\"del&nbsp;\".$channel.\"\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read_until_prompt($vlc_ptr);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf($log_ptr,\"%s,&nbsp;%s:&nbsp;Channel&nbsp;%s&nbsp;purged.\\n\",date(\"Y-m-d&nbsp;H:i:s\"),$_SERVER['REMOTE_ADDR'],$channel);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(($broadcasts&nbsp;&gt;=&nbsp;$max_streams)&nbsp;and&nbsp;!$is_local)&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;If&nbsp;the&nbsp;client&nbsp;is&nbsp;not&nbsp;local&nbsp;and&nbsp;the&nbsp;maximum&nbsp;number&nbsp;of&nbsp;transcoded&nbsp;streams&nbsp;has&nbsp;been&nbsp;exceded,&nbsp;refuse&nbsp;any&nbsp;further&nbsp;streaming.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;p&gt;I&nbsp;am&nbsp;sorry&nbsp;but&nbsp;the&nbsp;maximum&nbsp;number&nbsp;of&nbsp;transcoded&nbsp;streams&nbsp;(&lt;b&gt;\".$max_streams.\"&lt;\/b&gt;)&nbsp;for&nbsp;this&nbsp;server&nbsp;has&nbsp;already&nbsp;been&nbsp;reached.&lt;\/p&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;p&gt;Please&nbsp;try&nbsp;this&nbsp;page&nbsp;again&nbsp;later.&lt;\/p&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;form&nbsp;action=\\\"\".$_SERVER['PHP_SELF'].\"\\\"&nbsp;method=\\\"post\\\"&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;input&nbsp;type=\\\"hidden\\\"&nbsp;name=\\\"state\\\"&nbsp;value=\\\"1\\\"&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;input&nbsp;type=\\\"submit\\\"&nbsp;value=\\\"Retry\\\"&nbsp;style=\\\"background-color:springgreen;font-weight:bold\\\"&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;\/form&gt;\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Store&nbsp;the&nbsp;service&nbsp;refusal&nbsp;in&nbsp;the&nbsp;log&nbsp;file.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf($log_ptr,\"%s,&nbsp;%s:&nbsp;Maximum&nbsp;number&nbsp;of&nbsp;streams&nbsp;(%d)&nbsp;reached.\\n\",date(\"Y-m-d&nbsp;H:i:s\"),$_SERVER['REMOTE_ADDR'],$max_streams);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Read&nbsp;the&nbsp;list&nbsp;of&nbsp;movies&nbsp;and&nbsp;display&nbsp;the&nbsp;selector.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$mov_ptr&nbsp;=&nbsp;fopen&nbsp;($movie_list,\"r\")&nbsp;or&nbsp;die&nbsp;(\"The&nbsp;file&nbsp;$movie_list&nbsp;could&nbsp;not&nbsp;been&nbsp;found.\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;p&gt;Select&nbsp;up&nbsp;to&nbsp;&lt;b&gt;\".$max_inputs.\"&lt;\/b&gt;&nbsp;movies&nbsp;from&nbsp;the&nbsp;list&nbsp;for&nbsp;streaming:&lt;\/p&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;form&nbsp;action=\\\"\".$_SERVER['PHP_SELF'].\"\\\"&nbsp;method=\\\"post\\\"&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;select&nbsp;name=\\\"movies[]\\\"&nbsp;multiple=\\\"multiple\\\"&nbsp;size=\\\"20\\\"&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(!feof($mov_ptr))&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$movie_name&nbsp;=&nbsp;strtok(fgets($mov_ptr),\":\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($movie_name)&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$width&nbsp;=&nbsp;strtok(\":\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$height&nbsp;=&nbsp;strtok(\":\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$video_streams&nbsp;=&nbsp;strtok(\":\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$audio_streams&nbsp;=&nbsp;strtok(\":\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$duration&nbsp;=&nbsp;strtok(\":\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$hours&nbsp;=&nbsp;(int)&nbsp;($duration&nbsp;\/&nbsp;3600);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$mins&nbsp;=&nbsp;(int)&nbsp;(($duration&nbsp;%&nbsp;3600)&nbsp;\/&nbsp;60);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$secs&nbsp;=&nbsp;$duration&nbsp;%&nbsp;60;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;The&nbsp;value&nbsp;that&nbsp;is&nbsp;transmitted&nbsp;for&nbsp;each&nbsp;selected&nbsp;movie,&nbsp;comprises&nbsp;the&nbsp;movie&nbsp;name,&nbsp;the&nbsp;image&nbsp;width&nbsp;and&nbsp;the&nbsp;image&nbsp;height,&nbsp;separated&nbsp;by&nbsp;':'.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(\"&lt;option&nbsp;value=\\\"%s:%d:%d:%d\\\"&gt;%s&nbsp;&nbsp;&nbsp;[%d&nbsp;x&nbsp;%d]&nbsp;&nbsp;[%d-%d]&nbsp;&nbsp;(Dauer:&nbsp;%d:%02d:%02d)&lt;\/option&gt;\\n\",base64_encode($movie_name),$width,$height,$audio_streams,$movie_name,$width,$height,$video_streams,$audio_streams,$hours,$mins,$secs);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;\/select&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;p&gt;Adjust&nbsp;the&nbsp;streaming&nbsp;options&nbsp;and&nbsp;click&nbsp;on&nbsp;the&nbsp;&lt;b&gt;Stream&lt;\/b&gt;&nbsp;button&nbsp;to&nbsp;proceed&nbsp;or&nbsp;on&nbsp;the&nbsp;&lt;b&gt;Clear&lt;\/b&gt;&nbsp;button&nbsp;to&nbsp;clear&nbsp;your&nbsp;selection.&lt;\/p&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($is_local)<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;p&gt;Access&nbsp;from&nbsp;a&nbsp;&lt;b&gt;local&nbsp;network&lt;\/b&gt;&nbsp;has&nbsp;been&nbsp;detected.&nbsp;Additional&nbsp;bandwidth&nbsp;options&nbsp;and&nbsp;pure&nbsp;streaming&nbsp;are&nbsp;available&nbsp;therefore.&lt;\/p&gt;\\n\");<br> <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;table&nbsp;border&nbsp;bgcolor=\\\"lavender\\\"&nbsp;cellspacing=\\\"3\\\"&nbsp;cellpadding=\\\"5\\\"&gt;\\n&lt;tr&gt;&lt;th&nbsp;bgcolor=\\\"tan\\\"&gt;Video&nbsp;Codec&lt;\/th&gt;&lt;th&nbsp;bgcolor=\\\"#E7C69A\\\"&gt;Bandwidth&lt;\/th&gt;&lt;th&nbsp;bgcolor=\\\"#FCD8A8\\\"&gt;Audio&nbsp;Stream&lt;\/th&gt;&lt;\/tr&gt;\\n\");<br> <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($broadcasts&nbsp;&lt;&nbsp;$max_streams)&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;If&nbsp;the&nbsp;number&nbsp;of&nbsp;transcoded&nbsp;streams&nbsp;has&nbsp;not&nbsp;yet&nbsp;been&nbsp;exceeded,&nbsp;show&nbsp;the&nbsp;options&nbsp;for&nbsp;the&nbsp;video&nbsp;codec&nbsp;and&nbsp;for&nbsp;the&nbsp;bandwidth.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($is_local)<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;tr&gt;&lt;td&nbsp;bgcolor=\\\"tan\\\"&gt;&lt;input&nbsp;type=\\\"radio\\\"&nbsp;name=\\\"vcodec\\\"&nbsp;value=\\\"h264\\\"&gt;&nbsp;H.264&lt;br&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Pre-select&nbsp;H.264&nbsp;for&nbsp;remote&nbsp;clients.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;tr&gt;&lt;td&nbsp;bgcolor=\\\"tan\\\"&gt;&lt;input&nbsp;type=\\\"radio\\\"&nbsp;name=\\\"vcodec\\\"&nbsp;value=\\\"h264\\\"&nbsp;checked&gt;&nbsp;H.264&lt;br&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;input&nbsp;type=\\\"radio\\\"&nbsp;name=\\\"vcodec\\\"&nbsp;value=\\\"mp4v\\\"&gt;&nbsp;MPEG&nbsp;4&lt;br&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;input&nbsp;type=\\\"radio\\\"&nbsp;name=\\\"vcodec\\\"&nbsp;value=\\\"mp2v\\\"&gt;&nbsp;MPEG&nbsp;2&lt;br&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;input&nbsp;type=\\\"radio\\\"&nbsp;name=\\\"vcodec\\\"&nbsp;value=\\\"WMV2\\\"&gt;&nbsp;WMV&nbsp;2&lt;\/td&gt;\\n\");<br> <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Show&nbsp;Bandwidth&nbsp;Options&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;td&nbsp;bgcolor=\\\"#E7C69A\\\"&gt;\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;input&nbsp;type=\\\"radio\\\"&nbsp;name=\\\"bw\\\"&nbsp;value=\\\"1\\\"&gt;&nbsp;&nbsp;256&nbsp;kbps&lt;br&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($is_local)&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;If&nbsp;the&nbsp;access&nbsp;is&nbsp;made&nbsp;from&nbsp;the&nbsp;local&nbsp;subnet,&nbsp;offer&nbsp;additional&nbsp;bandwidth&nbsp;options&nbsp;and&nbsp;do&nbsp;not&nbsp;preselect&nbsp;anything.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;input&nbsp;type=\\\"radio\\\"&nbsp;name=\\\"bw\\\"&nbsp;value=\\\"2\\\"&gt;&nbsp;&nbsp;384&nbsp;kbps&lt;br&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;input&nbsp;type=\\\"radio\\\"&nbsp;name=\\\"bw\\\"&nbsp;value=\\\"3\\\"&gt;&nbsp;&nbsp;448&nbsp;kbps&lt;br&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;input&nbsp;type=\\\"radio\\\"&nbsp;name=\\\"bw\\\"&nbsp;value=\\\"4\\\"&gt;&nbsp;&nbsp;544&nbsp;kbps&lt;br&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;input&nbsp;type=\\\"radio\\\"&nbsp;name=\\\"bw\\\"&nbsp;value=\\\"5\\\"&gt;&nbsp;1152&nbsp;kbps&lt;\/td&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;If&nbsp;the&nbsp;access&nbsp;is&nbsp;made&nbsp;from&nbsp;a&nbsp;remote&nbsp;network,&nbsp;offer&nbsp;only&nbsp;bandwidth&nbsp;options&nbsp;until&nbsp;544&nbsp;kbps.&nbsp;Pre-select&nbsp;384&nbsp;kbps.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;input&nbsp;type=\\\"radio\\\"&nbsp;name=\\\"bw\\\"&nbsp;value=\\\"2\\\"&nbsp;checked&gt;&nbsp;&nbsp;384&nbsp;kbps&lt;br&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;input&nbsp;type=\\\"radio\\\"&nbsp;name=\\\"bw\\\"&nbsp;value=\\\"3\\\"&gt;&nbsp;&nbsp;448&nbsp;kbps&lt;br&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;input&nbsp;type=\\\"radio\\\"&nbsp;name=\\\"bw\\\"&nbsp;value=\\\"4\\\"&gt;&nbsp;&nbsp;544&nbsp;kbps&lt;\/td&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Show&nbsp;Audio&nbsp;Stream&nbsp;Options&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;td&nbsp;bgcolor=\\\"#FCD8A8\\\"&gt;\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;input&nbsp;type=\\\"radio\\\"&nbsp;name=\\\"audio\\\"&nbsp;value=\\\"1\\\"&nbsp;checked&gt;&nbsp;1&lt;br&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;input&nbsp;type=\\\"radio\\\"&nbsp;name=\\\"audio\\\"&nbsp;value=\\\"2\\\"&gt;&nbsp;2&lt;br&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;input&nbsp;type=\\\"radio\\\"&nbsp;name=\\\"audio\\\"&nbsp;value=\\\"3\\\"&gt;&nbsp;3&lt;\/td&gt;&lt;\/tr&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($is_local)<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;If&nbsp;the&nbsp;client&nbsp;is&nbsp;local,&nbsp;show&nbsp;the&nbsp;pure&nbsp;streaming&nbsp;option&nbsp;and&nbsp;pre-select&nbsp;it.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;tr&gt;&lt;td&nbsp;bgcolor=\\\"moccasin\\\"&nbsp;colspan=\\\"3\\\"&gt;&lt;input&nbsp;type=\\\"radio\\\"&nbsp;name=\\\"vcodec\\\"&nbsp;value=\\\"stream\\\"&nbsp;checked&gt;&nbsp;Pure&nbsp;Streaming&lt;\/td&gt;&lt;\/tr&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;\/table&gt;&lt;br&gt;\\n\");<br> <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Show&nbsp;the&nbsp;'Start'&nbsp;and&nbsp;'Clear'&nbsp;button.&nbsp;*\/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;input&nbsp;type=\\\"hidden\\\"&nbsp;name=\\\"state\\\"&nbsp;value=\\\"2\\\"&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;input&nbsp;type=\\\"submit\\\"&nbsp;value=\\\"Start\\\"&nbsp;style=\\\"background-color:springgreen;font-weight:bold\\\"&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;input&nbsp;type=\\\"reset\\\"&nbsp;value=\\\"Clear\\\"&nbsp;style=\\\"background-color:lightcoral;font-weight:bold\\\"&gt;\\n\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;(\"&lt;\/form&gt;\");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose&nbsp;($mov_ptr);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br> &nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;\/*&nbsp;Close&nbsp;telnet&nbsp;session&nbsp;to&nbsp;VLC&nbsp;server&nbsp;process.&nbsp;*\/<br> &nbsp;&nbsp;fclose&nbsp;($log_ptr);<br> &nbsp;&nbsp;fputs($vlc_ptr,\"exit\\n\");<br> &nbsp;&nbsp;fclose&nbsp;($vlc_ptr)&nbsp;or&nbsp;die&nbsp;(\"VLC&nbsp;Socket&nbsp;cannot&nbsp;be&nbsp;closed.\");<br> ?&gt;<br> <br> &lt;\/body&gt;<br> &lt;\/html&gt;<\/code><\/p>\n\n\n\n<p>Ist alles richtig installiert, sollte man das <a href=\"https:\/\/caipirinha.spdns.org\/mediawiki\/index.php\/Caipithek#PHP-Skript\">PHP-Skript<\/a> aufrufen und Videos wiedergeben k\u00f6nnen. Viel Spa\u00df beim Schauen! <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Caipithek ist eine private Online-Videothek auf dem Caipirinha-Server. Sie basiert im Wesentlichen auf dem VLC Media Player, einem Shell-Skript und einem PHP-Skript. <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[35],"tags":[],"class_list":["post-65","post","type-post","status-publish","format-standard","hentry","category-it"],"_links":{"self":[{"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=\/wp\/v2\/posts\/65","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=65"}],"version-history":[{"count":2,"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=\/wp\/v2\/posts\/65\/revisions"}],"predecessor-version":[{"id":481,"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=\/wp\/v2\/posts\/65\/revisions\/481"}],"wp:attachment":[{"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=65"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=65"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=65"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}