úterý 10. května 2011

Jak si zkopírovat flash videa z cache, když už nejsou v /tmp

Update: Klidně si to přečtěte, teorie tu je a princip se nezměnil, jen se změnil způsob chování prohlížečů a ten jsem zohlednil zde.

To není horká novinka, ale protože jsem se k tomuto tématu zrovna náhodou připletl, připomělo mi to zapsat si poznámku, která se může příležitostně hodit. Tedy postup, jak si videa přehraná ve webovém prohlížeči aktuálním desítkovým Flash Playerem zkopírovat z cache k dalšímu použití, bez použití pluginu v prohlížeči. A aby to nebylo tak jednoduché, trochu to laicky rozvedu :)

Když si ve webovém prohlížeči necháte přehrát nějaké to flash video, třeba na youtube, použije prohlížeč plugin Flash Playeru, většinou přes tzv. plugin wrapper, krerý zajišťuje rozhraní. Flash Player sosá z netu video a přehrává ho. Přehrávaný soubor musí někam ukládat a ve chvíli, kdy přehrávané video dokoukáte (většinou ještě dřív),  je už celé uložené ve vašem systému jako dočasný soubor, který se zahodí hned, jak stránku s videem zavřete. Dřív se daly tyto dočasné soubory nalézt v adresáři /tmp, ať už jste video přehrávali jakýmkoli webovým prohlížečem, s novými Flash Playery verze 10 se situace změnila a musíme se pro soubor ponořit trochu hlouběji do systému a ještě rozlišovat podle použitého prohlížeče, resp. jeho plugin wrapperu.

Zjednodušeně - musíme identifikovat wrapper, podívat se na soubory, které má otevřené, z nich vybrat ty s videem a zkopírovat je kam potřebujeme.
Zmínil potřebu rozlišovat jednotlivé prohlížeče, ovšem to jsem trochu přehnal, protože ve skutečnosti nám stačí v systému najít mezi spuštěnými procesy  ten který byl spuštěn s parametrem v podobě cesty k pluginu libflashplayer.so.

pgrep -f libflashplayer.so

Pokud  byste měli spuštěných více prohlížečů najednou, a ty by zobrazovaly nějaký flashový obsah, dostali byste na výstupu předchozího příkazu pro každý z nich příslušný proces. Opera používá operapluginwrapper, Firefox plugin-container, na 64bit systému se balí ještě do npviewer.bin, Chromium externí wrapper nepoužívá takže vás to zavede k procesu chromium-browser. Nás ale vůbec nazajímá, jak se ten proces jmenuje, důležité je jeho identifikační číslo PID, které je klíčem k adresáři s obsahem, který hledáme.
Pro jednotlivé spuštěné procesy se v systému, konkrétně v adresáři /proc, vytváří adresářové struktury, ve kterých se během života procesu uchovávají informace o jeho působení a je tu i adresář který obsahuje linky na aktuálně otevřené soubory a jiné datové struktury (jmenuje se fd). Cesta, odkud budem kopírovat přehraná flash videa je tedy /proc/$PID/fd. Tento adresář obsahuje zmíněné linky, ale jejich názvy nám nic neřeknou (jsou to jen čísla), je potřeba se podívat kam vedou (ls -l) a podle toho si vybrat ty správné. Situaci ulehčuje to, že odkazované soubory s flash videem vždy začínají řetězcem 'Flash'. Můžete si všimnout, že tyto soubory jsou vlastně v /tmp, stejně jako dřív, jen jsou označené jako smazané a tudíž se k nim standardní cestou nedostanete.

Teď už máme dost informací, abychom sestavili potřebný příkaz, který přenese videa z paměti třeba na Plochu. Budu předpokládat, že máte spuštěnou pouze jednu aplikaci využívající libflashplayer.

pushd `pwd`; cd /proc/`pgrep -f libflashplayer.so`/fd; cp `ls -l|awk '/Flash/{print $8}'` `xdg-user-dir DESKTOP`; popd

xdg-user-dir DESKTOP je příkaz, který vypíše aktuální adresář, který se zobrazuje jako "Plocha".

Pokud je spuštěno více procesů využívajících libflashplayer.so, nebude předchozí příkaz fungovat. Ten následující vytahá videa ze všech instancí ať jich je kolik chce. Bez prvního řádku se dá použít jako jednořádkový skript - klidně ho můžete takto zkopírovat přímo do terminálu:

#!/bin/bash

mkdir -p `xdg-user-dir DESKTOP`/flv
pgrep -f libflashplayer.so|
  while read pid;do ls -l /proc/$pid/fd/|
  awk '/Flash/{print $8}'|
   while read file;do cp /proc/$pid/fd/$file "`xdg-user-dir DESKTOP`/flv/$pid$file.flv"
   done
 done 

Tato varianta přesune videa do adresáře flv na vaší Ploše (když není, vytvoří ho). Pokud si vyrobíte skript s tímto obsahem nazvaný třeba flash, nebo ještě úsporněji flv, uložíte ho do adresáře ~/bin, který se po zalogování do systému automaticky přidá do systémové proměnné $PATH (to zajistí obsah souboru ~/.profile) a nezapomenete mu nastavit spustitelný příznak, budete ho moci používat jako běžný příkaz. A třeba si na něj i udělat spouštěč pro použití na jeden klik. A nebo přímo klávesovou zkratku. A nebo ....
Ještě poznámka: název zkopírovaného videa bude číselný (číslo procesu+číselný název původního symlinku) s koncovkou .flv, není nijak ošetřena situace, kdy by se již v adresáři nacházel úplně stejně pojmenovaný soubor.

22.6.12 - Pozor, s posledními verzemi flashplayeru se již takto ke kešovaným videím nedostanete.


Žádné komentáře:

Okomentovat

Zkuste prosím při komentováni používat místo volby Anonymní volbu Název/adresa URL, kde vyplníte nějakou přezdívku, adresu zadávat nemusíte. Vědět, které příspěvky jsou od jednoho člověka, je fajn. Díky.

Pokud by se vám náhodou odeslaný komentář na stránce nezobrazil, vytáhnu ho z koše hned jak si toho všimnu. I Google spam filter se občas sekne.