Omijanie limitów MegaVideo
Ostatnio coraz popularniejsze stają się filmy online. Największy serwis, który oferuje hosting oraz odtwarzanie filmów online to megavideo.com. Właśnie na nim skupimy swoją uwagę, a ten artykuł poprowadzi nas (prawie) za rączkę jak stworzyć narzędzie do oglądania filmów bez limitów dla wszystkich tylko przy użyciu jednego konta Premium.
Do wykonania serwisu identycznego jak w opisywanym tutaj artykule potrzebny będzie serwer dedykowany, oparty na apache2 oraz php5. Oczywiście bardzo prawdopodobny jest fakt, że będzie to wszystko działało poprawnie na hostingu wirtualnym, lecz sądzę że to nie jest dobre.
Na początek zaczniemy od konfiguracji apache. Z racji tego, iż mamy streamować filmy online przydatne będzie limitowanie łącza. Przydzielenie dla każdego użytkownika maksymalnego dostępnego pasma nie jest zbyt dobrym rozwiązaniem – nie chcemy by użytkownicy pobierali filmy dzięki naszemu serwisowi, tylko by je oglądali. Myślę że ograniczenie do 2mbit (256kB/s) jest rozsądne – zostawia odpowiedni zapas do oglądania online, a nie jest zachęcające do wykorzystywania serwisu do pobierania filmów, chociaż tacy na pewno też się znajdą
Do ograniczenia łącza skorzystamy z rodzimego modułu CBand. Link do pobrania, skrócona konfiguracja jest tutaj oraz tutaj. Ja przejdę od razu do konfiguracji którą wprowadziłem w swoim „interesie”
Plik /etc/apache2/vhosts.d/00_default_vhost.conf [akurat ten host był w moim przypadku]
W sekcji VirtualHost
CBandRemoteSpeed 2048 10 20
CBandDefaultExceededCode 509
Teraz przejdźmy do kodu strony. Na początek strona index.php z prostym formularzem i jak na razie bez skryptu (w przykładzie uproszczony kod)
<html> <head><title>Filmy megavideo bez limitu!</title></head> <body> <form action="index.php" method="post"> <p>Podaj URL filmu megavideo: <input type="text" name="url" /></p> <p><input type="submit" name="submit" value="Odtwarzaj!" /></p> </form> </body> </html>
Super, mamy formularz
Teraz musimy się zastanowić nad identyfikacją. Każdy film na megavideo identyfikowany jest po bodajże 8 znakach, które trzeba wyciągnąć z url filmu. Niestety, url bywają różne, jednak skupię się tutaj tylko nad tym, które możemy zobaczyć po kliknięciu w „show url of video” w playerze megavideo. Można to wyciągać wyrażeniami regularnymi, jednak tutaj posłużymy się substr i strpos. No i od razu przejdźmy do kodu, który takie coś wyciąga:
$url_filmu = $_POST['url']; //to ad tego naszego formularza nieco wyżej if (strpos($url_filmu,'&v=')!==FALSE) $kod_filmu = substr($url_filmu,(strpos($url_filmu,'&v=')+3),8); if (strpos($url_filmu,'/v/')!==FALSE) $kod_filmu = substr($url_filmu,(strpos($url_filmu,'/v/')+3), 8);
Jak widać są tutaj dwa „podejścia” – wynika to z racji tego, że url może być zapisany różnymi metodami.
Teraz następny krok. O ile to co robiliśmy dotychczas to były czynności przygotowujące, to teraz najważniejsze, i najtrudniejsze. Musimy obsłużyć logowanie do megavideo (czyli nasze konto premium), zapisanie plików cookies, oraz stream filmu. Zaczniemy od logowania. Wszystko działać będzie poprawnie również na zwykłym koncie, jednak po 60 (czy 90 – nie pamiętam) minutach stracimy możliwość oglądania filmu – odezwie się limit
Korzystamy w tym momencie z klasy i streamera, który dostępny jest w dziale download – może swego czasu rozpiszę całą klasę do obsługi megavideo, ale jak na razie tylko z niej skorzystamy. Do pliku config.php ładujemy nasze dane do megavideo, no i logowanie mamy za pomocą pliku login.php, oto jego zawartość.
require_once('config.php');
require_once('megavideo.php');
$obj = new MegaVideo;
$obj->get_cookies();
Zapisze nam to plik cookie.txt z ciasteczkiem z logowania – od teraz skrypt przy streamingu będzie używał podanych danych. Skrypt do logowania używamy jedynie jednorazowo, na początku użycia skryptu, jak też przy każdej zmianie danych do megavideo.
Stream filmu już jest prawie ostatnim etapem. Tutaj też ze skryptu do streamingu wykorzystujemy stream.php, któremu jako parametr url podany getem dajemy id filmu, które wybraliśmy nieco wyżej, do zmiennej $kod_filmu.
set_time_limit(0); //tak żeby nas nie wywaliło w trakcie streamingu
//sprawdzamy czy mamy id filmu czy nie warto nawet wczytywać naszych bibliotek
if (isset($_GET['url'])) $id = $_GET['url'];
else exit();
require_once('config.php'); //ładujemy konfig - tzn login i hasło
require_once('megavideo.php'); //klasa do obsługi megavideo
$mv = new MegaVideo; //nowa instancja klasy mv
if (isset($_GET['start'])) $position = intval($_GET['start']);
else $position = 0;
$filesize = $mv->get_remote_filesize($_GET['url']);
if ($position <= 0) $file = $mv->get_remote_video('http://www.megavideo.com/?v=' . $_GET['url']);
else $file = $mv->get_remote_video('http://www.megavideo.com/?v=' . $_GET['url']) . $position . '/';
$fp = fopen($file, 'rb');
if ($position != 0) header("HTTP/1.1 206 Partial Content"); //nie odtwarzamy od początku - tylko mamy przewinięty film
header('Content-Type: video/x-flv');
header('Content-Disposition: attachment; filename="file.flv"');
if ($position != 0) { //tak samo jak wyżej, film już jest przewinięty
header('Accept-Ranges: bytes');
header('Content-Range: bytes '. $position .'-'. ($filesize + $position) .'/'. ($filesize + $position));
}
header('Content-Length: '. $filesize);
while (!feof($fp)) print fread($fp, 8192); //czytamy flv od megavideo i przesyłamy go do klienta, aż film się nie skończy.
Teraz połączmy to wszystko w jedną całość. Skorzystamy z JWPlayera. Można użyć również np. Flowplayera czy też jakiegokolwiek innego odtwarzacza flv online, jednak z darmowych przekonuje mnie najbardziej JWPlayer, z racji braku reklamy w trybie pełnoekranowym, natomiast Flowplayer szczyci nas przez cały okres oglądania swym logiem. Przykładowy sposób wstawienia odtwarzacza JWPlayer:
<div id='mediaspace'>Ładowanie odtwarzacza...</div>
<script type='text/javascript'>
var so = new SWFObject('/jwplayer/player.swf','mpl','480','385','9');
so.addParam('allowfullscreen','true');
so.addParam('allowscriptaccess','always');
so.addParam('wmode','opaque');
so.addVariable('file','http://nasz-serwer-do-streamu.pl/stream.php?url=<?php echo $kod_filmu; ?>');
so.addVariable('type','lighttpd');
so.addVariable('stretching','excatfit');
so.addVariable('bufferlength','10');
so.addVariable('autostart','true');
so.write('mediaspace');
</script>
Może dzięki temu artykułowi ludzie przestaną tak zdzierać pieniądze na allegro za oglądanie filmów bez limitów przez megavideo. Myślę również że nie zepsuję nikomu pomysłu na biznes
W razie problemów, lub chęci bardziej specyficznego rozjaśnienia i/lub dopasowania kodu – zapraszam do kontaktu.