Hej, nie umarłem, żyję nadal, prace nad Joggerem 3 chwilowo wstrzymane (przepraszam, praca + matura :( wrócę do niego jak mi się ustatkuje sytuacja materialna), ale ja dziś nie o tym.
Przez długi-długi okres czasu odtwarzając filmy we Flashu, można było równocześnie skorzystać z dobrodziejstw ich wygodnego cache'owania. Gdy odpalaliśmy coś w YouTube, Vimeo czy Pornhubie (już ja wiem co ludzie robią z szerokopasmowym internetem ;)), plik flv z filmem był zapisywany jako /tmp/Flash[id] gdzie [id] to były znaki z serii A-Z, a-z i 0-9.
Od jakiegoś czasu jednak, Flash zapisuje takie dane w nieco inny sposób, częściowo niejawnie. Wejście do katalogu /tmp udowodni nam, że plików tam nie ma, a jednak jakimś sposobem na dysku zapisywane są. Jak?
Otóż jakiś cwany developer postanowił wykorzystać linuksowe uchwyty do pliku. Polega to na tym, że Flash tworzy jakiś plik, a następnie go kasuje nie usuwając uchwytu. Miejsce jest dalej zaalokowane jak trzeba, dane nadal można tam zapisać i czytać, ale plik nie istnieje w formie pliku, a po zamknięciu uchwytu staje się po prostu wolną przestrzenią dyskową.
Ale zaraz, to w takim razie w jaki sposób można dobrać się do tych danych? Otóż bardzo prosto. Sposób wykorzystany przez sprytnego developera jest mieczem obosiecznym - uchwyty do plików muszą istnieć, więc są gdzieś zapisywane ;) Co ciekawe, żeby się do nich dobrać nie trzeba używać skomplikowanych procedur, strace czy zewnętrznych programów - lista uchwytów do plików danego procesu jest tworzona w /proc/ID/fd/ .
Czyli mamy prostą metodę. Zakładając, że korzystamy z Google Chrome, robimy:
$ ps -eo pid,command | grep flashplayer
I szukamy naszego flashplugina, który w Chrome jest - jak wszystko co tylko się dało - osobnym procesem. U mnie wyglądało to następująco:
12449 /opt/google/chrome/chrome --type=plugin --plugin-path=/opt/google/chrome/libgcflashplayer.so --lang=pl --plugin-data-dir=/home/d4rky/.config/google-chrome/Default --channel=5017.0x11a036c0.344273884
W przypadku przeglądarek nie rozbijających wszystko na części pierwsze, interesuje nas proces samej przeglądarki, czyli np:
$ ps -eo pid,command | grep firefox 26698 /usr/lib/iceweasel/firefox-bin
Mając już do dyspozycji ID procesu, wchodzimy do - w moim przypadku - /proc/12449/fd i zobaczmy co mamy tam za cuda:
$ ls -ltr | grep Flash lrwx------ 1 d4rky d4rky 64 02-26 18:32 23 -> /tmp/FlashXXQyI8lK (deleted)
A tuś mi bratku! Okazuje się, że pliki są nazywane po staremu, tylko stosowana jest sztuczka z uchwytami ;)
Co teraz zrobić, skoro mamy już uchwyt? Proste, wystarczy traktować go jak każdy inny plik. Wskazuje nadal na poprawne dane, więc nic nie stoi na przeszkodzie, żeby zrobić tak:
cp /proc/12449/fd/23 "/home/d4rky/Elvis Prestley - Love me tender.flv"
albo
mplayer /proc/12449/fd/23
I voila! Magicznie odzyskujemy zdolność warezo... tzn "tworzenia kopii zapasowych" filmików z sieci. Prawda, że łatwe? ;)
Sposób odnaleziony na jakimś klonie StackOverflow.
Ja tego używam do oglądania filmów / filmików z MegaVideo i innych serwisów w mplayerze zamiast gównianym flashowym tnącym się playerku. Czekam, aż się zbuforuje, a potem oglądam kulturalnie :P
BTM - jakoś wolę mój sposób, nie wiem dlaczego. Mniej pieprzenia się chyba ;) trójkąt - ciężko powiedzieć, jakoś w aktualizacji pod koniec 2010 bodajże
Mniej pieprzenia się jest rzeczą subiektywną, imo w moim jest mnie ;)
Ale tak - Twój działa tylko pod *nix
Mój jest crossplatform ale za to pobiera na nowo film (zakładając, że nie masz squida czy innego dobrodziejstwa w sieci)
BTM, twój wymaga pobierania całego filmu, ja mogę zacząć oglądać od środka ;) Ale jak sam stwierdziłeś - subiektywne odczucie. Ja sobie to w shellowy skrypt kiedyś opakuję.
Hmmm, jeśli chodzi o Firefoksa, to moje potrzeby spełnia wtyczka DownloadHelper...
Widzę że swoim skryptem nie chwaliłem się na blogu, tylko w komentarzach tu i ówdzie, więc tutaj też wkleję:
#!/bin/bash
lsof / |grep -i 'flash.*deleted' | while read process; do
PID=$(echo $process |awk '{print $2}')
FD=$(echo $process| awk '{print substr( $4, 0, length($4)-1 ) }')
cp /proc/$PID/fd/$FD $(echo $process |awk '{print $9}').flv
echo "Skopiowano $_"
done
Aha - to oczywiście kopiuje filmy do /tmp/, gdzie jest do nich dostęp jak za starych dobrych czasów.
Działa pod Linuksem dla Opery i Firefoksa, myślę że dla Chrome też powinno, ale nie testowałem.
@Scytale: Dam Ci standardową odpowiedź geeka. Dlaczego to robię? Bo mogę. ;)
Najbardziej mnie z tej całej notki poruszyło, że prace nad J3 są wstrzymane. :(
Ja jak potrzebuję ściągnąć jakiś filmik flashowy, to zwyczajnie odpalał firebuga, panel siec i sprawdzam skąd jest ściągany materiał. Potem tylko copy-plaste w przeglądarkę i się pobiera :)
Greasemonkey, Download Helper, Firebug i kto tu robi na około :D Skoro Flash pobiera już film to po co mi dodatkowe narzędzia, które pobiorą mi go jeszcze raz. Jest to mądre? Dla mnie główną zaletą tego rozwiązania jest to, że jak mi się film spodoba to jednym klikiem odpalam go w Mplayerze i oglądam na pełnym ekranie bez męczenia procesora ani poklatkowego obrazu.
Mam Download Helper, ale do tej pory korzystałem z metody kopiowania plików z katalogu /tmp/. Tak jak Trójkąt pisze, bo co mam pobierać film drugi raz?
Oprócz tego u mnie filmy oglądane w Firefoksie we Flashu się przycinają, w mplayerze chodzą płynnie.
Po zmianie w Firefoksie, gdy pliki nie były już dostępne w katalogu /tmp/ używałem przez pewien czas rozszerzenia Cache Viewer. Jednak używanie tej metody było o wiele mniej efektywne, musiałem otworzyć nową kartę, sfiltrować wyniki, a następnie przejść do konsoli.
Póki co robię tak, że jak tylko otworzę film w Firefoksie, klikam w Download Helper 'Quick Download' lub podobnie nazwaną opcję, a następnie odświeżam kartę, by film w karcie mi się nie ładował.
Dzięki za wpis, też używam mplayera do oglądania filmów/seriali online i aktualizacja po której przestało działać mplayer /tmp/Flash* mnie trochę zmartwiła.
Napisałem taki mały skrypt https://gist.github.com/847795 może nie jest to jakieś cudo ale działa tak samo jak mplayer /tmp/Flash* przed aktualizacją ;)
Mała uwaga: pierwszy grep musi szukać frazy libflashplayer zamiast plugin bo inaczej wyłapuje mi pluginy z XFCE.
@mdoff: dzięki za skrypt, po tej modyfikacji działa jak poprzednio.
@trojkąt: ciebie jest libflashplayer, u mnie libgcflashplayer.so , chyba najlepiej będzie to zamienić po prostu na 'flashplayer' ;)
pecet
Nie rozumiem sensu tworzenia kopii filmików z serwisów typu YT, przecież ich nie wywalą, a jak wywalą to i tak były to jakieś nie warte uwagi filmy ;)