INDEVELOPMENTbeta






Subskrybuj m1chu.eu – another devblog
 
  •  m1chu: Gdyby ktoś miał kiedyś problem z nieprawidłową wielkością pobieranego pliku, chociażby w moich, wyżej...
  •  m1chu: Jeżeli chodzi o szybką konwersję z Flash na HTML to szczerze nie wiem. Nigdy nie potrzebowałem żadnej...
  •  m1chu: @Michal: wrzuć linki w jakieś kontenery (listę ul -> li, dl -> dt/dd, czy chociażby w divy). Ustaw ich...
  •  Józek: Wszystko pięknie opisane, ja mam małe pytanko. Od jakiegoś czasu staram się dowiedzieć jak zmienić...
  •  Michal: a co jesli chciałbym umiescic kilka takich linkow obok siebie ?jesli zmienie wartość display na inline...
  •  mano: Co należy zrobić aby podmiane przycisku zastasowac kilka razy na stronie z różnymi grafikami ? Trzeba...
  •  michauu: Ale na twojej stronce nie ma nifty corners:) http://www.html.it/articoli/ni fty/index.html

Dołącz do fanów!

Ankieta!

  • Na blogu brakuje mi artykułów o...

    View Results

    Loading ... Loading ...




mymedia.class.php – klasa służąca do pobierania plików z wrzuta.pl, youtube.com i owned.com


Siedziałem sobie wczoraj w nocy wyrwany w połowie pisania frameworka pod pewien projekt zastanawiając się co tu można by było dla rekreacji zrobić. Skacząc od strony do strony napotkałem kilka rozwiązań obsługi ściągania plików z serwisu wrzuta.pl. Przykładem takiego skryptu może być ten umieszczony na ninfo.pl, który ostatecznie przekonał mnie do napisania małej klasy obsługi serwisów emitujących multimedia. Szybko zapoznałem się z skryptem, następnie komentarzami na powyższej stronie i imaginując sobie w głowie działanie mojej przyszłej klasy przystąpiłem do pisania…

Szczytem optymalizacji ona na pewno nie jest, nie mniej jednak starałem się szybko testować różne rozwiązania, aby chociaż po części wykorzystać te bardziej korzystne elementy PHP (pomimo, że lepiej byłoby do takich celów zastosować inne języki programowania). Wykorzystując m.in obsługę wyjątków zmuszam bezpośrednio wszystkich potencjalnych użytkowników do instalacji klasy na serwerach z PHP5. Po za tym specyfika generowania linków na serwisach Wrzuta i YouTube spowodowała, że musiałem napisać dwie typy metod pobierających te linki:

  • opierającą się na pobraniu nagłówków zgodnych z ID (aktualnie dla Wrzuty),
  • wykorzystującą cURL’a w celu pobrania zawartości strony i z jej zawartości generującą link (aktualnie dla YouTube-a).

Fakt ten powoduje, że wraz z PHP5 musi być dostępna obsługa biblioteki cURL.

Pewnie co poniektórym osobom nasunęła się przed chwilą myśl w stylu: „co za kretyn! cURLem pobiera całą stronę…”. Faktycznie pomysł jest dość zasobożerny. Przetestowałem jednak na współdzielonej maszynie użycie curl_exec();, fsockopen(); i file_get_content();. Z kilku przeprowadzonych po sobie testów wynikło, że pierwsza funkcja jest o około 0,2 sekundy szybsza niż dwie kolejne. Wyników oczywiście nie mogę potwierdzić dla każdego przypadku i każdej maszyny, ale w moim wypadku wybór był jednoznaczny. Nie mniej jednak jeśli ktoś ma jakieś konstruktywne propozycje na temat innej obsługi „wyciągania” linków z YouTube-a – zapraszam do komentowania pod wpisem.

Na koniec tego teoretycznego wstępu warto chyba odpowiedzieć, dlaczego wybrałem akurat te i tylko te dwa serwisy? Odpowiedź jest prosta. Po pierwsze dlatego, że wszędzie napotykałem jak już tylko na rozwiązania dotyczące serwisu Wrzuta (i to dla plików audio). Podobnych dla YT nie znalazłem (możliwe, że źle szukałem ;]). Dlaczego tylko te dwa broadcastery? Domniemam, że sporą część przynajmniej tych najbardziej nam, Polakom znanych da się obsłużyć poprzez działanie na nagłówkach, bądź zawartości strony. Dlatego dwie służące do tego metody mogą w przyszłości posłużyć do obsługi innych tego typu stron. Możliwe, że pod OWS-em wraz z resztą załogi poprawimy, zoptymalizujemy i rozwiniemy klasę… kiedyś ;]

Ze strony praktycznej pierwsze co powinno się zrobić, to ściągnąć kod klasy z mojego małego repozytorium. Jak widać zawarłem tam kilka zdań i przykładów, skrupulatniej omówionych niż tutaj.

Po ściągnięciu należy zainkludować plik klasy po czym utworzyć jej nową instancję.

// wywołanie obsługi wyjątków w celu ewentualnego wyłapania błędu
try {
$instance			= &mymedia::getInstance(); // wywołanie metody wzorca singletona
$instance->downloadFile('763DcD2d6w', 'wrzuta', 'audio', true, ''); // metoda wywoływana w celu ściągnięcia pliku
}
catch ( Exception $exception )
{
print 'Exception: <strong>' . $exception->getMessage() . '</strong> on line ' . $exception->getLine();
}

Tworzenie instancji, jak i wywoływanie metody odbywa się w bloku obsługi wyjątków, ponieważ w przeciwnym wypadku na nic zdałoby się samo ich rzutowanie wewnątrz klasy. Dzięki temu w wypadku popełnienia błędu w podanych parametrach, bądź nie istnienia pliku na serwerze skrypt nas o tym powiadomi.

Cała zabawa dla programisty ogranicza się do użycia metody $instance->downloadFile(args); przyjmującej od jednego do pięciu argumentów.

$instance->downloadFile(id_pliku, nazwa_serwisu[aktualnie: wrzuta|youtube], typ_pliku[aktualnie: audio|video|image], ściągnąć_plik[aktualnie: true|false], nazwa_pliku_przy_sciagnieciu[aktualnie: wrzuta]);

Przykład obrazujący wywołanie:

print $instance->downloadFile('4kv29vXZqpk', 'youtube', 'video', false); // zostanie wyświetlony tylko bezpośredni link do pliku na ekranie

Sugestie, czy zauważone błędy proszę kierować w komentarzach.

Edycja 09.08.08:
Zapraszam do ściągania wersji 1.1. Zawarłem w niej trzy poprawki i dodałem obsługę serwisu owned.com. Jedna z poprawek wymaga teraz, aby w wypadku ponownego użycia klasy w czasie jednego przeładowania strony i występowania nieprawidłowych wyników użyć samemu po każdym wywołaniu metody ściągającej funkcję czyszczącą zmienne klasy (wg. przykładu $instance->flush();). Więcej informacji zawarłem tutaj.

Uruchomiłem także specjalną testową stronę na której można obejrzeć działanie klasy w praktyce.


9 komentarzy

  • gravatar
    1. Tajemniczy ()

    Klasa fajna, ściągnąłem, przetestowałem, przeanalizowałem :)
    Tylko jedno pytanie – jaki jest sens pisania tego typu klas, skoro ściąganie plików z wrzuty opiera się na zmianie linka w pasku adresu w przeglądarce? Albo lepiej – wyciągnięciu plików z temp przeglądarki?

  • gravatar
    2. m1chu ()

    Dobre pytanie :] Osobiście pisałem ją dla relaksu. Co zresztą ująłem w wpisie.

    Po co można takie rzeczy używać? Może dla jakiegoś serwisu ściągającego tego typu sprawy? Szczerze – nie potrafię jednoznacznie tego określić. Dzisiaj jednak powstaje tyle różnorodnych stron, że na pewno by się przydało… komuś tam, gdzieś tam. Z drugiej strony co do tego co napisałeś o sposobie wyciągania. Podobnie można z zawartości kodu strony wyciągnąć link bezpośredni do YT. Ale ludzie jednak używają downloaderów. Chodzi tu chyba o maksymalizację prostoty. Po co stukać ręcznie, skoro można zrobić szybkie CTRL+C i CTRL+V, wcisnąć ENTER i ściągać plik na swój dysk?

  • gravatar
    3. Tajemniczy ()

    Fajniejszy byłby wg. mnie jakiś program ( c++/delphi/etc :) ) który ściąga takie pliki. Do klas potrzeba serwera z obsługą php5 albo postawienia własnego serwera na localu :D

  • gravatar
    4. m1chu ()

    Serwer to chyba nie problem w XXI wieku :D Szczególnie dla osób tworzących lub opiekujących się serwisami internetowymi. Ale fakt, dla użytkownika samego w sobie łatwiejszy w obsłudze byłby program, albo już zaimplementowana klasa. Może kiedyś, ale nic nie obiecuje bo będzie jak z programem obsługującym gry emulowane pod Pegasusa ;]

    http://m1chu.eu/programowanie/czy-pamietacie-pegasusa

  • gravatar
    5. Tajemniczy ()

    W sumie taki program do napisania trudny nie jest :)
    Jak znajdę czas to może nawet sam się pobawię, ale leń jestem :D

  • gravatar
    6. m1chu ()

    Nastąpiła mała aktualizacja skryptu do kolejnej wersji. Poprawiłem trzy zauważone przeze mnie błędy i dodałem obsługę pobierania grafik i filmów z serwisu owned.com. Wraz z poprawką jednego błędu zmieniło się czyszczenie zmiennych klasy. Teraz trzeba to robić samemu, jeśli występowałaby taka potrzeba poprzez wywołanie $instance->flush();.

    Repozytorium klasy:
    http://dev.m1chu.eu/index.php?title=MyMedia

    Możliwość prostego przetestowania:
    http://m1chu.eu/use/examples/-php/my-media-class/index.php

    Pozdrawiam :]

  • gravatar
    7. Karol ()

    Jestem zielony :P… No dobra, załóżmy, że mam konto na unl.pl (co też jest prawdą), więc co muszę zrobić, żeby mieć ten skrypt na swojej stronie ^_^?

  • gravatar
    8. m1chu ()

    Nie wiem jakie parametry serwera udostępnia unl.pl, ale musi być to minimum PHP5 z obsługą biblioteki cURL.

    Po tym w swoim skrypcie np. wyszukiwarki podłączasz klasę mymedia.class.php i wywołujesz metodę downloadFile z obiektu klasy mymedia. Przykład:

    <?php
    require_once '/mymedia.class.php';
    
    try {
    	$instance			= &mymedia::getInstance(); // wywołanie metody wzorca singletona
    	$instance->downloadFile(filterData($_GET['id']), filterData($_GET['server']), filterData($_GET['type']), true, ''); /* metoda wywoływana w celu ściągnięcia pliku, filterData() to wyimaginowana funkcja filtrująca dane wejściowe - do napisania we własnym zakresie (co nieco o bezpieczeństwie znajdziesz na moim blogu) */
    }
    catch ( Exception $exception )
    {
    	print 'Exception: strong>' . $exception->getMessage() . '</strong> on line ' .
    $exception->getLine();
    }
    ?>

    Więcej informacji, tłumaczeń oraz przykładów znajdziesz w repozytorium i działającej implementacji skryptu. Linki w powyższych komentarzach i w tekście ;]

  • gravatar
    9. SpeX ()

    A ja mam inne pytanie. Jak pod ten skrypt podpiąć jakiś konwerter plików (online lub po stronie serwerowej, choć preferował bym to pierwsze).
    Bo na chwilę obecną wykorzystuję JW Playera do puszczania filmów na blogu, ale kilka osób skarżyło się iż technologia flash jest strasznie mało wydajna. I nie da się oglądać filmów np na Iphonach. Niestety na tej platformie nie da się nawet oglądać w normalny sposób Youtoba, dopiero pod tą platformę YT uruchomiło dodatkowy strumień jako MP4 z którym sobie już razi Iphone.
    I właśnie potrzebuję zrobić coś podobne, czyli będzie player a pod spodem ściągnij flv, mp4 i np avi.

    Ma ktoś pomysł jak coś takiego zrobić?
    Ew widział do tego plugin pod WordPressa?

Dodaj własny komentarz

Możesz użyć następujących tagów XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>