sobota 30. března 2013

Jak si zkopírovat flash videa z cache dnes

Kdysi jsem tu psal, jak zkopírovat flash videa z cache flashplayeru a nedlouho potom se to změnilo a přestalo to fungovat. Zdálo se mi, že je to komplikovanější a byl jsem líný hledat co s tím, nutně jsem to nepotřeboval a z youtube se dá stahovat pohodlně pomocí pluginů, když už je třeba. Nicméně to stále mnoho lidí zajímá a tak jsem se na to dnes při snídani podíval...




A bylo to jednoduché. Díky nástroji fatrace jsem vystopoval procesy, které flash video přehrávají a zjistil, že se vlastně nic moc nezměnilo. Dřív stačilo najít v procesech plugin libflashplayer.so a bylo vymalováno, dnes to stačí jen na Chromium, ostatní to již řeší jinak. Chrome situaci komplikuje ještě tím, že má zamknutý adresář /proc/$pid/fd. Jinak tedy vše při starém, videa se ukládají do /tmp, ale do smazaných souborů, tak tam nejsou vidět. Dostat se k nim dá přes proces, který s nimi pracuje.

Výsledky jsem tedy opět shrnul do skriptu, který umí dohledat všechna flash videa momentálně otevřená v prohlížečích Opera, Firefox, Chromium a Chrome a zkopírovat je do adresáře, který si ve skriptu definujete, ve výchozím stavu je to na uživatelovu Plochu do adresáře flv. Videa přehrávaná Chrome je třeba obsloužit s právy nejvyššího a tak jsem přidal možnost skript spustit s přepínačem -g, který zajistí, že se potřebné úkony uskuteční pod rootem a budete dotázáni na heslo. Pod rootem zkopírovaným souborům jsou automaticky změněna práva i vlastník/skupina na výchozí hodnoty, aby s nimi uživatel mohl nakládat normálním způsobem. Ve skriptu řeším možná duplicitní jména výsledných souborů jen do té míry, že nemohou kolidovat jména z různých procesů. Skript jsem si nazval flv, umístil do ~/bin, takže ho můžu spouštět odkudkoli jako příkaz a pokud bych chtěl vytáhnout něco z Chrome, napíšu a spustím flv -g.



flv
#!/bin/bash

# Skript kopíruje všechna flash videa, kerá nalezne v cache prohížečů
# Opera, Firefox, Chromium a Chrome do zvoleného adresáře

dir="`xdg-user-dir DESKTOP`/flv" # adresář do kterého se videa zkopírují
mkdir -p "$dir"

pgrep -f '([o]perapluginwrapper|[p]lugin-container|[c]hrome.*ppapi|[l]ibflashplayer\.so)'|
 while read pid; do
  if [ -z $1 ]; then
    ls -go /proc/$pid/fd/|
    awk '/Flash/{print $7}'|
    while read file; do
      tfile="$dir/$pid$file.flv"
      cp "/proc/$pid/fd/$file" "$tfile"
      [ -e "$tfile" ] && echo "Vytvořen soubor $tfile"
    done
  elif [ $1 = "-g" ]; then
    sudo ls -go /proc/$pid/fd/|
    awk '/Flash/{print $7}'|
    while read file; do
      tfile="$dir/$pid$file.flv"
      sudo cp "/proc/$pid/fd/$file" "$tfile"
      [ -e "$tfile" ] && echo "Vytvořen soubor $tfile"
      sudo chown $USER:$USER "$tfile"
      sudo chmod 664 "$tfile"
    done
  fi
 done


Vyzkoušejte a případně mi napšte, jak to dopadlo. Psal jsem to na U12.10 s aktuálními browsery, s Firefoxem na U13.04 to také fungovalo. Také nezapomeňte, že ne všechna flash videa na webu jdou takto vydolovat, ne vždy probíhá kešování celého souboru.


4 komentáře:

  1. Jak je mým zvykem, vyhodil jsem první verzi skriptu zmrzačenou, nyní by již měl fungovat a vypsat i vytvořené soubory.

    OdpovědětVymazat
  2. Rádo se stalo, doufám, že nebudeš zklamán :)

    OdpovědětVymazat
  3. dir=~/pavel
    nebo
    dir="$HOME/pavel"

    Tildu bash v uvozovkách neexpanduje a uvozovky jsou třeba jen tehdy, když je v expandovaném výrazu nějaká mezera, takže je tam z principu mám, protože plochu můžeš mít teoreticky kdekoliv a koneckonců zrovna tak home ;)

    OdpovědětVymazat
  4. Nehledej v tom nic zákeřnýho, je to normální cesta ;)

    dir="/home/pavel/nejaky_adresar/flv"

    dir="$HOME/nejaky_adresar/flv"
    pokud
    $ echo $HOME
    /home/pavel
    $ echo ~
    /home/pavel

    OdpovědětVymazat

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.