Omijanie limitów MegaVideo

Wrzesień 22nd, 2010 end 4 comments

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 :P
    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.

IMGHost 2.2 opublikowany!

Wrzesień 21st, 2010 end Brak komentarzy

Skrypt do hostingu zdjęć i obrazków – używany na http://img.kuczok.net/ – został opublikowany.

Wymaga do działania PHP w wersji 5 oraz bazy danych MySQL. Posiada zintegrowany przyjemny instalator.

Pobrać można go w pobieralni, gdzie też aktualnie można znaleźć inne skrypty jak np. inferno.

Ewolucja…?

Wrzesień 1st, 2009 end 3 comments

Dawno, dawno temu…

<p><center>coś na środku<center><p>

Jeszcze nie tak całkiem dawno…

<p align="center">coś na środku<p>

Nowocześnie?

<p style="text-align: center;">coś na środku<p>

Ewolucja? Postęp? Unifikacja? Elastyczność kodu? Mhm… Semantyka?
Cóż, idziemy naprzód zgodnie ze standardami, wszystko brnie do przodu… Ktoś tam wyżej, na górze, ustala zasady, którymi podążamy… Nawet w wolnym kraju, czy wolnym „zawodzie” – informatyce. Cóż, nie pozostaje nic innego jak poddać się postępowi, który tak naprawdę jaki by nie był – jest nam odgórnie narzucony i przez wszystkich wymagany… :)

Standardy stron internetowych

Czerwiec 13th, 2009 end Brak komentarzy

Nie tylko ja się zajmuję tworzeniem stron internetowych, jak też całych portali – takich ludzi jest mnóstwo. Chcę tutaj napisać o jakości i pewnych wymaganiach, które klienci powinni przestrzegać. Więc jeżeli jesteś klientem, zamawiasz u kogokolwiek stronę internetową to poświęć chwilę, by przeczytać ten krótki artykulik. Oczywiście, jeżeli zamawiasz stronę niskobudżetową – nie spodziewaj się by wszystkie warunki dobrej strony zostały spełnione. Zanim zamówisz stronę, upewnij się w jakich standardach będzie ona wykonana! Odpowiedni poziom kodu strony jest wymagany m.in. do jej dobrego wypozycjonowania!

Standard xHTML

Aktualnie w internecie obowiązuje standard xHTML. HTML to naprawdę już trochę przestarzały standard. Po czym rozpoznać, w jakim standardzie wykonana jest strona? Zerknij w kod strony, w pierwszej linijce powinna być deklaracja DOCTYPE, która określa w jakim standardzie strona została wykonana. Przykładowa deklaracja kodu xHTML:

<!DOCTYPE html PUBLIC „-//W3C//DTD XHTML 1.0 Transitional//EN” „http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>

Można z niej wyczytać, iż strona kodowana jest w xHTML 1.0, w wersji przepisowej. Można też spotkać deklarację xHTML Strict – czyli restrykcyjną. Nie będę się tutaj rozwodził, która wersja jest lepsza, osobiście sam zawsze korzystam z transitional. Jeżeli spotkasz deklarację xHTML 1.1 – również jest dobrze. W treści tego artykułu pisząc o kodzie HTML mam na myśli oczywiście kod xHTML, jednak z przyzwyczajenia piszę bez początkowego ‘x’ ;)

Jeżeli sprawdzając stronę nie odnajdziesz na początku jej kodu deklaracji to może naprawdę źle wróżyć…

Divy, nie tabelki!

Wiele dawnych webmasterów tworzyło strony, w których treść była w tabelkach, które określały wygląd strony. Dość często można było również spotkać dodatkowo ramki. Te czasy to już przeszłość, teraz nowoczesna strona internetowa opiera się o ‘divy’. Czym właściwie są te divy? Najprościej rzecz ujmując są to pola, które można dowolnie formatować i pozycjonować na stronie internetowej, przy użyciu CSS (o którym jest mowa w dalszej części tekstu). Jeżeli nie znasz się na kodzie HTML, może być Ci ciężko określić, czy strona oparta jest o tabelki, czy o divy – jednak spróbuj zajrzeć w kod, i sprawdź, czy przypadkiem na każdej podstronie nie przeważają tabelki (tabelka to tag <table>). Jeżeli na stronie nie będzie żadnych danych tabelarycznych, a zobaczysz w kodzie tabelki, możesz śmiało pytać o to swojego webmastera ;)

Poprawny kod xHTML

To nie Ty masz znać kod HTML, a osoba która Ci wykonuje stronę, więc jak sprawdzić czy wszystko jest poprawnie? W3C (World Wide Web Consortium) udostępnia bezpłatnie na swojej stronie internetowej walidator kodu pod adresem http://validator.w3.org/. Dowiesz się czy strona jest wykonana w pełni poprawnie, czy są na niej błędy. Śmiało, możesz do osoby wykonującej dla Ciebie stronę napisać, że strona nie parsuje się poprawnie w walidatorze kodu na w3c i oczekiwać na poprawę kodu. Jak chcesz, możesz również sprawdzić w nim każdą podstronę, nie tylko stronę główną – bo może zdarzyć się tak, że tylko strona główna będzie wykonana w pełni poprawnie, a na podstronach pojawią się już błędy.

Kaskadowe arkusze stylów CSS

Kiedyś strony byłe formatowane w jednym pliku, przez używanie tagu FONT i pokrewnych. Aktualnie nie korzysta się już z takiego rozwiązania, za wygląd strony odpowiada CSS.

Jak to działa?
Strona HTML zawiera informacje n/t zawartości strony, oraz określa czym ma być który element strony. Natomiast CSS określa wygląd każdego z tych elementów. Edytując styl CSS w nowoczesnej stronie powinieneś być w stanie dowolnie zmieniać wygląd strony. Może trochę ciężko to brzmi, jednak jest to proste i sprowadza się do tego, że kod HTML powinien się ograniczać do treści strony, okraszonej prostymi tagami, typu h1, p, div, pomiędzy którymi zawiera się treść strony.

Dość często można spotkać kod CSS w statycznej stronie internetowej wpleciony w kod HTML, czyli tagi okraszone atrybutem style, w którym jest opisany wygląd danego elementu. To nie jest dobre rozwiązanie, to nie o to tu chodzi.

Jeżeli zobaczysz plik CSS oddzielony od kodu HTML, i tylko podpięty w nagłówku, możesz być zadowolony. Będziesz mógł dowolnie, z łatwością zmieniać wygląd strony. Zmieniając parametry wyglądu w jednym pliku CSS efekt od razu będzie widoczny na wszystkich podstronach serwisu. Prawda, że tak jest dużo łatwiej, niż modyfikować każdy plik HTML z osobna? :)

Kod CSS też ma swoje zasady, i tak samo jak w przypadku kodu HTML można sprawdzić jego poprawność, dzięki W3C i darmowemu narzędziu, udostępnionemu na ich stronie – http://jigsaw.w3.org/css-validator/. Wpisujemy tam adres naszej strony, a walidator sam pobierze z niej kod CSS, i wyświetli nam informacje na temat jego poprawności.

Różne przeglądarki internetowe

Według danych zbieranych przez serwis ranking.pl około 40% polaków korzysta z przeglądarki Firefox, drugie tyle wykorzystuje przeglądarkę Internet Explorer. W pozostałych 20% mamy jeszcze użytkowników Opery, Chroma, Safari i innych przeglądarek. Można właściwie zapytać, co to ma do rzeczy? Ano ma – prawie każda przeglądarka, ma swój silnik, który analizuje nasz bezbłędny kod xHTML i CSS i wyświetla zgodnie ze swoim ‘widzimisie’. Strona zazwyczaj wygląda dobrze i tak samo pod przeglądarkami takimi jak Opera, Firefox, czy Chrome, jednak niestety możemy spotkać się z kompletnym rozwaleniem strony gdy otworzymy ją w przeglądarce Internet Explorer, która niestety narzuca sobie swoje standardy. Cóż – życie webmastera nie jest łatwe. Strona niedość że powinna być w pełni poprawnym kodem xHTML i CSS, to jeszcze musi się wyświetlać poprawnie w każdej przeglądarce internetowej. Warto ją sprawdzić przynajmniej w ‘podstawowej trójce’, czyli przeglądarkach Opera, Firefox i Internet Explorer.

Podsumowanie…

Tworzyć strony internetowe w dzisiejszych czasach może każdy. Istnieje wiele prostych w obsłudze programów do tego celu. Nawet popularne edytory tekstu oferują funkcję zapisu pliku jako stronę internetową. Jednak nie osiągniemy w ten sposób jakości kodu, jaka jest mile widziana w dzisiejszym internecie. Jeżeli masz więc swoją stronę internetową, sprawdź ją teraz pod kątem standardów opisanych w tym artykule ;)

Matrix – inna historia…

Luty 10th, 2009 end 2 comments

Neo siedział właśnie w knajpie, gdy nagle poczuł wibrację w kieszeni. Sięgnął ręką do kieszeni. Z głosu wychodzącego z jego Motoroli T722i domyślił się że to Morfeusz.
- W tej chwili wyłaź z Matrixa!
- Nie mogę, mam za słabą baterię!
- to znajdź do cholery, jakąś bud… (bateria wyładowana)
Bud, bud… Co to mogło znaczyć? Neo siedział przed kubkiem po kawie i myślał.

— pół godziny później —

- Bingo!
Wszyscy siedzący w knajpce nagle zwrócili ku niemu swój wzrok. Ten pusty kubek po kawie nie pozostawiał złudzeń – TO BUNTOWNIK – rozległ się krzyk. Momentalnie wszyscy rzucili się na Neo. Ten jednak przewidując ich zachowanie szybko uciekł z knajpki. Pobiegł prosto do parku, gdzie po długich poszukiwaniach znalazł wolną ławkę. Z plecaka wyjął najnowszy numer „buntownika”. Wyraźnie czegoś szukał… Tak, znalazł! W ciagu kilku następnych sekund pobiegł do budki telefonicznej i wykręcił numer…
- zabierz mnie stąd!

Nie zatrzymywał się nigdzie, poszedł prosto do biura Morfeusza. Byli tam wszyscy, czyli Morfeusz, Trinity i Kapsel. Patrzyli się w telewizor. Nagle przez głowę Neo przeszedł błysk zrozumienia. Był niewyobrażalnie wściekły na siebie, cały aż pulsował. Jak mógł przegapić najnowszy odcinek „Na dobre i na złe”!? Niestety, zostały mu tylko napisy końcowe. Krępującą ciszę przerwał Morfeusz, zwracając się do Neo i Trinity.
- Musicie uratować świat. Ale zanim go uratujecie kupcie puste płyty.
[Trinity] – Przecież zostało nam jeszcze kilka!
[Morfeusz] – Wiem, ale na zmieścimy na nich najnowszej serii Lostów w jakości HD
[Trinity] – No dobra…
[Neo] – A tak właściwie, przed czym mamy uratować świat?
Morfeusz błyskawicznie sięgnął po paczkę „familijnych”
- Chcesz wafelka?
- Dobra, mniejsza z tym…
- No to teraz biegiem do Matrixa i nie wracać mi bez pustych płyt!

Stali w samym centrum Katowic i myśleli co teraz. Neo znów dostał olśniewający przebłysk.
- Jak dobrze że biedronka jest tak blisko!
- To leć do biedronki, a ja poszukam sobie nowych lanserkich okularów.

Hala biedronki, bramka wejściowa. Strażnik zagaduje klienta, którym jest Neo.
- proszę położyć wszelkie metalowe przedmioty na taśmie.
Nasz bohater położył więc na taśmie zegarek, pierścionek, klucz „dwunastkę”, pierścien od Gandalfa, zapinkę od krawata, zasilacz do instrumentów muzycznych „ya-ma-ha!”, MP-5…
- secundo, ma pan na to zezwolenie?
- nie
- no to musimy walczyć
Neo z rezygnacją ziewnął. Błyskawicznym kopem z półobrotu nie pozostawił strażnikowi żadnych złudzeń. Wyciągnał dwie spluwy którymi zabił całą resztę ochrony w sklepie.
Nagle do biedronki wjechał na PCG600 tajemniczy nieznajomy w niebieskiej koszuli w granatowe palmy. Za nim przez halę pomknęły dwa czołgi, wściekle go ostrzeliwując. Bohater dla bezpieczeństwa schował się za ladą. Gdy ta dziwna defilada opuściła sklep, neo bezpiecznie kupił puste płyty.

- Co tak długo?
- Nieważne. Masz te okulary?
- Nie, nie zabrałam portfela.

Jechali właście najbardziej ruchliwą autostradą w mieście. Policja siedziała im na ogonie. Po chwili zorientowali się, że jadą w złym kierunku. Neo więc zawrócił. Jechali teraz pod prąd. Wszystkie auta zjeżdzały im z drogi, po czym rozbijały się za nimi. Jednak tego nie mógł przewidzieć. Przez ogromne dziury w drodze zarzuciło ich i wpadli na pędzącego z ogromną prędkością TIR-a. Ich Fiat 126p rozsypał się w drobny mak. Nagle zaskoczył ich, podchodząc od tyłu Morfeusz.
- mówiłem, żeby nie spędzać tyle czasu przed komputerem!
- dobra, już znikam, i tak nie umiemy przejść tej misji.

Morfeusz i Kapsel oglądali właście listy od fanów.
- Patrz ten list. „Jak neo mógł kupić puste płyty, jak cały sklep był zniszczony?” – Morfeusz, jak to wyjaśnisz?
- Chcesz wafelka?
- Ten też jest ciekawy „W związku z brakiem opłat za gaz jesteśmy zmuszeni odciąć Państwu dostęp niego. Życzymy miłego dnia, z poważaniem, gazprom”
- Kto miał opłacać gaz… Chwilunia…

Trinity wracając po portfel usłyszała muzykę. Wyciągnęła swoją Nokie N-Gage, i odebrała telefon, przykładając go dziwnie do ucha.
- Nie wiesz może, kto miał opłacić gaz?
Trinity załamała się. Schowała telefon i stała w miejscu nie bardzo wiedząc, co zrobić. Nagle zaskoczył ją Agent. Po wnikliwej analizie przyznał się, że jest ich wiernym fanem i że list o kupnie płyt w rozwalonym sklepie był jego autorstwa.
- No to musimy walczyć.
Trinity z wściekłości, [przed chwilą ktoś kupił te okulary, które jej sie podobały] używając swoich nadprzyrodzonych mocy zdobyła łopatę, którą perfidnie zabiła agenta. Ten czyn uspokoił ją i wyszła z matrixa.

[Morfeusz] – I co, zapłaciłaś za gaz?
[Trinity] – Nie, ale zabiłam agenta.
[Morfeusz] – Ale już jest ciemno!
[Trinity] – Zapomniałam portfela…

Wzięła więc swój portfel i wróciła do matrixa zapłacić za gaz. Neo, korzystając z okazji podszedł do Morfeusza.
- Proszę, oto płyty
- Świetnie! Teraz tylko to nagram i… nie wiesz może komu pożyczyłem komputer?
- Jeszcze go nie kupiłeś.
- Trzeba było przypomnieć!
- Nie mam tego w umowie! Powiedz mi lepiej, przed czym mam uratować świat?
- Chcesz wafelka?

Nagle, przerywając im emocjonującą rozmowę, wbiegła zdyszana Trinity.
- Opłaciłam gaz. Ale po drodze przytrafił mi się straszliwy wypadek!
[Morfeusz i Neo z przerażeniem] – Jaki!?
- Nadepnęłam chomika oklejonego taśmą!
[Neo] – Straszne!
[Morfeusz] – Bierzcie więc wafelki i idźcie ratować świat!