HowTo: Gestreamte Flash Videos einfach wiederherstellen [2. UPDATE]

18. Februar 2011 um 20:11 | Veröffentlicht in Bash, Free Software/Open Source, GNU/Linux, Multimedia, Programmieren, Ubuntuusers | 38 Kommentare

Ein Satz dessen Bedeutung mir nahezu jeden Tag meines Lebens aufs neue bewusst wird lautet:

Ich verwende Linux, ich kenne keine Einschränkungen.

Dank der UNIX-Philosophie (die im speziellen auch das KISS-Prinzip beinhaltet) existieren unter Linux viele von UNIX übernommene oder neu erdachte kleine Helferlein die, richtig kombiniert, nahezu jede noch so komplexe Aufgabe zu lösen vermögen.

Hinweis: Jeder in diesem Artikel genannte Befehl muss in einem Terminal eingegeben werden (z.B. Konsole, gnome-terminal, …).

Hintergrund

Seit längerer Zeit, wie vielen sicherlich aufgefallen ist, können Flash Videos, einmal gestreamt, nicht mehr einfach aus /tmp herausgepflückt werden. Da sie von Flash als gelöscht markiert werden, werden sie von einem Dateibrowser (und auch vom Befehl ls) nicht mehr angezeigt. Es gibt einen Workaround, der jedoch recht umständlich ist und unnötig Zeit verschwendet, da an sich jeder Schritt durch ein Skript ersetzt werden kann.

Der Workaround im Detail

Zuerst muss man die Prozess-ID (PID) des Flash-Prozesses herausfinden der das Video abspielt. Das passiert mit folgendem Befehl:
ps -e | grep gtk-gnash
gtk-gnash kann durch den Prozessnamen des eigenen Flash-Players ersetzt werden.

Da Flash nicht nur dazu dienen kann Videos abzuspielen, sondern z.B. auch Werbung auf einer Webseite anzeigt, kann es hier sein, dass mehrere solcher Prozesse angezeigt werden:
8766 ? 00:41:48 gtk-gnash
9951 ? 00:00:03 gtk-gnash
9965 ? 00:00:01 gtk-gnash
9979 ? 00:00:00 gtk-gnash

Da es keinerlei Anhaltspunkte dafür gibt hinter welchem Prozess genau denn nun der Flash-Player steckt, muss jeder Prozess einzeln durchgesehen werden. Dazu begibt man sich in das virtuelle Verzeichnis
/proc
In diesem Verzeichnis findet man für jeden laufenden Prozess einen Ordner mit dessen PID als Namen. Wir begeben uns nun in den ersten Ordner der zu einem Flash-Prozess gehört:
/proc/8766
In diesem Ordner finden wir unter anderem ein weiteres Verzeichnis mit dem Namen fd. Und darin befinden sich Links auf alle Dateien die von diesem Prozess verwendet werden. Egal ob es sich hierbei um Gerätedateien handelt (/dev/*), Pipes, Sockets … oder eben gelöschte Dateien.

An diesem Punkt sollte ich wohl anmerken: die Verlinkungen existieren nur solange der Prozess selbst läuft. Ist der Prozess beendet (z.B. der Tab im Browser wird geschlossen), dann ist auch die Verlinkung auf die Dateien weg.

Mit dem einfachen Befehl
ls -l
bekommen wir eine übersichtliche Auflistung der Dateien und ein paar nützliche Hinweise zu ihnen. So werden z.B. ein oder mehrere davon als "(deleted)" markiert. Die Namen der Dateien selbst sind einfache Nummern. Wir müssen nun alle diese Dateien an einen sicheren Ort kopieren (z.B. $HOME/Videos) und hier weiter durchforsten. Unter den als gelöscht markierten Dateien befinden sich auch durchaus Dateien, die keine Videos beinhalten. Faustregel: bei einem Flash Video, selbst mit geringer Qualität, ist im Allgemeinen mit einer Größe von mehreren MegaByte zu rechnen. Dies trennt meist die Video-Dateien vom Rest. Nicht-Video-Dateien haben meist eine Größe von 100-200 KiB. Wenn du dir nicht sicher bist, dann öffne die Datei einfach mit einem Video-Player deiner Wahl (z.B. VLC) und schau, ob dich das gesuchte Video anlächelt oder nicht.

Gratuliere, du hast viel Aufwand betrieben und (hoffentlich) das gesuchte Video gefunden. Aber: der Artikel wäre etwas überflüssig wenn das alles wäre.

Das Skript zum Film

WIe zuvor schon erwähnt lassen sich diese Vorgänge ohne Weiteres automatisieren. Dazu habe ich ein kleines Skript erstellt, welches dem Nutzer alle Vorgänge, bis auf das Durchfiltern der resultierenden Dateien alles abnehmen soll. Das Skript erkennt nun FLV-Dateien an ihrem Header. Das Skript stelle ich unter die GPLv3 und werde es im Sinne der besseren Verständlichkeit hier erklären.

Zuerst wird obligatorisch die Shell bestimmt in der der Code ausgeführt werden soll:
#!/bin/bash

Dann folgen ein paar Variableninitialisierungen. Bei der ersten kann der Nutzer angeben wie sein Flash-Player heißt. Dies ist nicht der eigentliche Name des Programmes, sondern nur der Befehl mit dem es in einem Terminal aufgerufen werden kann. Meistens sind diese Bezeichnungen identisch, aber nicht immer
FLASH=gtk-gnash

Nutzer des offiziellen Flash-Players wollen $FLASH vielleicht so:
FLASH=npviewer.bin
anpassen.

Dann wird die Dateiendung gewählt die die Dateien am Schluss bekommen sollen. Da es sich in unserem Beispiel um Flash Videos handelt, wird die Endung wohl *.flv lauten.
SUFFIX=flv

Zuletzt müssen wir noch angeben wohin die Dateien am Schluss gespeichert werden sollen:
DESTINATION=$HOME/Videos
TEMP_DESTINATION=$DESTINATION/.tmp
Der Ordner /tmp wird angelegt um nicht aus versehen Dateien zu überschreiben oder zu löschen die im Zielordner liegen und nicht den Kriterien entsprechen. Hier werden die Dateien während des Ablaufes des Skriptes zwischengelagert. Dieses temporäre Arbeitsverzeichnis ist in diesem Fall ein Unterordner des Zielverzeichnisses.

Um Fehlermeldungen zu vermeiden versuchen wir das gewünschte Verzeichnis anzulegen. Das if fragt nach, ob ein Verzeichnis (-d = Directory) bereits existiert. Durch das Rufzeichen wird die Antwort ins Gegenteil umgekehrt. Der Code der if-Abfrage wird nur ausgeführt, wenn die Antwort "ja" lautet. Daraus folgt: Wenn das Verzeichnis bereits existiert verkehrt das Rufzeichen nach "nein" und der Code wird nicht ausgeführt, das Verzeichnis also nicht erstellt und umgekehrt. Der Parameter -p weist den Befehl mkdir an das gewünschte Verzeichnis zu erstellen, auch wenn es dazu erst ein oder mehrere Überverzeichnisse erstellen muss. Wir erzeugen also das Zielverzeichnis und das temporäre Arbeitsverzeichnis:
if [ ! -d $DESTINATION ]
then
mkdir -p $DESTINATION
fi
if [ ! -d $TEMP_DESTINATION ]
then
mkdir -p $TEMP_DESTINATION
fi

Jetzt beginnen die ersten Berechnungen. Wir gehen vor, wie oben im Workaround beschrieben. Zuerst muss die PID eines Prozesses herausgefunden werden. Dabei hilft uns das Programm ps:
TEMP=$(ps -C $FLASH -o pid=)
Der Parameter -C übernimmt den Namen des Prozesses (den wir in der Variable $FLASH hinterlegt haben). Der Parameter -o sagt dem Programm, dass wir eine bestimmte Ausgabe erwarten. Gefolgt wird der Parameter von den Feldern die ausgegeben werden sollen, in unserem Fall wollen wir die Prozess-ID, also geben wir an: pid. Das Gleichheitszeichen beendet die Liste. Da wir die PIDs mehrmals benötigen weisen wir sie einer Variable zu.

PID_ARRAY=(${TEMP})
macht aus der vorher verwendeten Variable ein Array mit dem Namen
$PID_ARRAY. Die Verwendung eines Arrays macht es bei mehreren Prozessen einfacher diese geordnet durchzugehen.

Nun da wir die Prozess-IDs bekommen haben wird es Zeit jeden einzelnen Prozess durchzugehen. Dazu verwenden wir eine Schleife die durch das gerade erstellte Array iteriert.

Kleiner Exkurs: eine for-Schleife schaut in Shell-Skript zum Beispiel so aus:
for Zählervariable in Liste von Werten
do
... Code ...
done

Für die Zählervariable kann man jeden beliebigen Text (auch einzelne Buchstaben) verwenden. Die Liste von Werten definiert sich dann aus dem Inhalt einer Datei, einem Array oder einem Regulären Ausdruck (z.B. *.mp3). Im letzteren Fall werden alle Dateien im Verzeichnis mit der Endung .mp3 in die Liste aufgenommen und der Inhalt der Zählervariable ist dann bei jedem Schleifendurchlauf je ein Dateiname aus dieser Liste.

for PID in `seq 0 $[${#PID_ARRAY[@]}-1]`
do

tut also folgendes: In der Zählervariable
$PID ist immer die jeweilige Stelle im Array gespeichert auf die im aktuellen Durchlauf gerade zugegriffen werden soll. Die Liste der PIDs wird vom Array $PID_ARRAY zur Verfügung gestellt.

for PID in $(pgrep -f $FLASH)
do
liefert uns alle PIDs der in $FLASH angegebenen Prozesse und durchläuft mit jedem davon einmal die Schleife.

Nun können wir den Pfad zu den Dateien des jeweiligen Prozesses erzeugen. Diesen legen wir in der Variable $PATH2FILE ab, da wir diesen Pfad später noch einmal brauchen werden. In $PID ist die Prozess-ID gespeichert.
PATH2FILE=/proc/$PID/fd

Jetzt wird es Zeit die Verlinkungen im gerade gefundenen Pfad herauszuholen welche als gelöscht markiert sind. Der Befehl ls -l zeigt uns zum Glück, welche Dateien davon betroffen sind (z.B.):
lrwx------ 1 user user 64 2011-02-18 20:58 0 -> socket:[256465]
l-wx------ 1 user user 64 2011-02-18 20:58 1 -> /home/user/.xsession-errors
...
lrwx------ 1 user user 64 2011-02-18 20:58 6 -> /tmp/tmpfJsOdcv (deleted)
lr-x------ 1 user user 64 2011-02-18 20:58 7 -> /dev/urandom
lrwx------ 1 user user 64 2011-02-18 20:58 8 -> /tmp/tmpfvTLn7o (deleted)

So wenden wir dies nun an:
LOOT=$(ls -l $PATH2FILE | grep deleted | cut -f8 -d\ )
Nachdem ls uns alle Verlinkungen im Pfad geliefert hat, jagen wir das Ergebnis durch eine Pipe "|". Das bewirkt, dass das Ergebnis des Befehls, der links von der Pipe steht an den Befehl übergeben wird der rechts davon steht. Mit dem Befehl grep suchen wir nach dem Begriff "deleted" um alle Zeilen wegzuschneiden welche diesen Begriff nicht beinhalten. Damit bekommen wir eine Liste von Dateinamen welche von Flash als gelöscht markiert wurden. Von dieser Liste benötigen wir aber nur die Namen der Verlinkungen die auf diese Dateien zeigen. Also schicken wir diese Liste über eine weitere Pipe an den Befehl cut. Diesem geben wir über den Parameter -d an, dass wir in den vorliegenden Zeilen die Leerzeichen ('\ ' ist die Escape-Sequenz um Leerzeichen darzustellen) als Trennzeichen verwenden wollen. Der Parameter -f bekommt dann die Nummer des Abschnitts welcher den Namen der Verlinkung beinhält. Da die Ausgabe des Befehls ls -l immer auf dieselbe Art und Weise formatiert ist können wir hier einfach mal an einem Beispiel abzählen und die Ziffer ‚8‘ hinschreiben. (Der Name der Verlinkung ist die Ziffer nach der Uhrzeit. Der Pfeil zeigt, dass es sich um eine Verlinkung auf die rechts daneben stehende Datei handelt.) Das Ergebnis all dieser Berechnungen wird in der Variable $LOOT untergebracht.

Nun wird auch diese Liste zur leichteren Verarbeitung in ein Array umgewandelt.
ARRAY=(${LOOT})

Genauso wie zuvor wird nun auch dieses Array mittels einer for-Schleife durchlaufen. Beachte, dass wir uns immernoch in der ersten Schleife befinden. Diese zweite Schleife wird also jedesmal ausgeführt, wenn die erste Schleife in einen neuen Durchgang geht.
for FILE in `seq 0 $[${#ARRAY[@]}-1]`
do

Nun kopieren wir die gefundenen Dateien an den temporären Zielort und benennen sie durch gehend nach diesem Muster: PID_AufsteigendeZahl.flv
cp $PATH2FILE/${ARRAY[$FILE]} $TEMP_DESTINATION/${PID}_$FILE.$SUFFIX
Die geschweiften Klammern um $PID sind notwendig, da das Skript sonst den folgenden Unterstrich als Teil des Variablennamens interpretieren würde. Da es die Variable $PID_ aber nicht gibt würde das Skript an dieser Stelle auch nichts einfügen. Das Ergebnis würde dann nur aus einer fortlaufenden Nummer und der Dateiendung bestehen.

done
done

Jede Schleife muss separat durch ein done beendet werden.

Um nun die Spreu vom Weizen zu trennen müssen wir uns jede Datei einzeln ansehen. Zum Glück folgen Flash Videos der Tradition der Magic Numbers. Das sind Zahlen oder Buchstaben die ganz am Anfang der Datei stehen (so wie in diesem Skript z.B. das #!/bin/bash). Bei Flash Videos sind dies die Buchstaben "FLV". Diese Kombination haben wir ganz oben in der Variable $HEADER_INFO gespeichert.

for FILE in $TEMP_DESTINATION/*.$SUFFIX
do

Die Headerdaten bekommen wir mit dem Befehl head. Diese vergleichen wir mit der Variable $HEADER_INFO
if [ $(head -c 3 $FILE) == $HEADER_INFO ]
then

Wenn die Datei diese Kombination im Header aufweist wird sie in das Zielverzeichnis verschoben.
mv $FILE $DESTINATION

Wenn Sie die Kombination nicht hat, wird sie als unbrauchbar gelöscht.
elif
rm $FILE

fi
done
Das if wird mit einem fi abgeschlossen und die Schleife wieder mit eine done.

Jetzt haben wir alle gefundenen Video-Dateien im Zielverzeichnis und das temporäre Arbeitsverzeichnis sollte wieder leer sein.

Abschluss

Den vollständigen Code zusammen mit einer Kopie der GPLv3 gibt es hier herunterzuladen. Wenn du Verbesserungen für das Programm hast, oder einen Weg kennst die Nicht-Video-Dateien von den Video-Dateien zu trennen, dann gib dies bitte in den Kommentaren bekannt. Ich möchte das Projekt gerne auf Sourceforge laden, zur Zeit hat der Server jedoch eine zickige Phase.

Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

=-=-=-=-=
Powered by Blogilo

38 Kommentare »

RSS feed for comments on this post. TrackBack URI

  1. Ich verwende Linux, ich kenne keine Einschränkungen.

    Haha, sehr geil 🙂

    Noch eine Anmerkung: Oft kann man Videos ganz ohne Flash runterladen.
    * z.b mit youtube-dl (kann nicht nur youtube)
    * oft steht der link zu einer flash-datei direkt im quelltext der seite (einfach mal nach mp4 oder flv suchen)
    * wenn da ein rtmp://…-link steht, hilft rtmpdump (generell `-r URL`, aber manchmal muss man mit den Optionen spielen, in der ARD-Videothek zb -r rtmp://vod.daserste.de/ardfs/ -y ‚mp4:…‘)
    *

    • Ja, denn youtube-dl verwende ich selbst auch gerne, da es eine einfache Möglichkeit ist von z.B. YouTube Videos herunterzuladen. Ich habe dazu sogar schon mal einen Artikel verfasst.

      Das Problem bei diesem Skript, welches sich zum Glück in den Quellen von Ubuntu befindet ist, dass wenn Google bei der YouTube-API was ändert das Skript unbrauchbar wird, bzw. muss man dann die neueste Version des Skriptes herunterladen. Das mit dem rtmpdump auf der ARD-Videothek ist interessant. Das kannte ich noch nicht.

  2. Bevor ich es morgen vergesse, nachdem ich jetzt ins Bett gehe: Mit Chrome und Adobe Flash geht das leider nicht direkt so, denn das läuft ja in einer Sandbox und ps -C wäre dafür nicht der richtige Befehl.

    Danke jedenfalls für diesen Beitrag. 🙂

    • Hmm, da bei mir Gnash läuft, kann ich das gerade nicht testen. So oder so sollten aber die Filehandler in /proc anschlagen, da die Daten ja irgendwohin gespeichert werden müssen um abgespielt zu werden. Oder legt Flash hier wie bei einer virtuellen Maschine ein virtuelles Dateisystem an?

  3. Hallo,
    schöne Idee. Das händeln der PID finde ich ein wenig umständlich, hast Du Dir mal pgrep angesehen? Das liefert Dir u.a. nur die PID(s) die Du dann in einer Schleife abarbeiten kannst. Z.B. Abfrage auf …gnash…
    for i in $(pgrep -f gnash);do echo $i ;done
    liefert Dir alle PID bei denen gnash im Namen und der Commandline enthalten ist.

    Willie

    • pgrep kannte ich noch nicht. Habe es gerade ausprobiert, funktioniert super. Dann werde ich mal das Skript umschreiben gehen.

  4. Hm, warum sollte man dieses Script nutzen und nicht einfach flashgot Video DownloadHelper und co?

    • Du kannst gerne verwenden was du willst. Mein Gedanke war: ich möchte zuerst sehen welches Video ich mir da überhaupt runterlade, also lasse ich es im Browser ausspielen. Wenn es mir gefällt habe ich es dann eh schon auf der Festplatte und kann es mir einfach kopieren. Das geht schneller.

      Flashgot und Video Downloadhelper sind Browser-AddOns. Flashgot gibt es, soweit ich gelesen habe z.B. nur für Firefox. Mit diesem Skript ist es egal welchen Browser du verwendest. Im Grunde genommen ist es aber nur eine Automatisierung des oben beschriebenen Workarounds.

      • Klar, ich wollte die Arbeit nicht irgendwie schlecht machen, ich hatte nur den Sinn nicht gesehen. Aber du hast ja gut die Vorteile dargestellt, jetzt weiß ich, das ich es nicht brauche aber das es seine Existenzberechtigung hat. 🙂

  5. Du könntest direkt den Header von flv’s anschauen, zumindest bei den youtube sachen, die ich da habe, fängt Header mit FLV an, na ja, und die nachfolgenden 11 Bytes sind auch gleich. Ich kann aber keine sichere Rückschlüße machen, da ich ca. 10 Videos da habe.

    Hey, aber du hast ein schönes Script gebastelt. Ich verwende den Adobe Flash-Player, und so musste ich nur die Variable anpassen(FLASH=npviewer.bin), und alles lief prima!

    Darf ich dein Script und den Artikel reposten, also ich würde einen sinngemäßen Artikel in Russisch schreiben, bzw. deins kürzen und in groben Zügen übersetzten, danach auf welinux.ru veröffentlichen? (also nicht so ganz im Guttenberg Style) 😉

    • Jetzt muss ich mir erstmal ansehen wie ich den Header der Dateien bekomme (habe ich noch nie gemacht).

      Du darfst den Artikel gerne übersetzen und veröffentlichen. Alle Artikel stehen unter der CC-BY-SA 3.0. Das bedeutet, dass du den Inhalt übernehmen und bearbeiten darfst, solange du sagst wo du das Material ursprünglich her hast und das Ergebnis wieder unter denselben Bedingungen veröffentlichst. Alle anderweitig lizensierten Inhalte (z.B. Public Domain) bleiben unter deren ursprünglicher Lizenz.

      • den Anfang des Headers, also die ersten drei Bytes, kannst du ja mit head -c 3 auslesen. wie gesagt, bei youtube sachen ist es dann FLV

      • Super, damit kann ich das Skript soweit erweitern, dass es die Videos behält und den Rest löscht.

      • Vorsicht, gibt auch mp4-Videos auf youtube, evtl auch noch mehr. Am besten mit file --mime (oder --mime-type) auf video/* prüfen. Manseite lesen, -b könnte auch hilfreich sein.

      • In der Manpage von head findet sich kein Parameter für –mime oder –mimetype. Welchen Befehl meinst du?

  6. […] den Originalbeitrag weiterlesen: HowTo: Gestreamte Flash Videos einfach wiederherstellen « Taach … Medien zum Thema   Medien by […]

  7. Hallo,

    tolle Sache mit dem Skript. Wirklich!

    Bisher musste ich (seit der Umstellung vom /tmp zum Cache-Verzeichnis) umständlich per find den gerade verwendeten Cache-Ordner raussuchen. Anschliessend mit Nautlius nach Datei-Typ sortiert und die Flash-Videodatei auch MEIST schon an Ihrer Größe erkannt.
    Und manchmal muss man schnell sein und die Datei kopieren/umbennnen bevor der Flashplayer sie löscht.
    (Ich verwende den Flash Player 64Bit) und der scheint zum Glück noch etwas verbuggt zu sein, weil sehr oft, lässt er sich mit dem löschen VIEL zeit oder er macht es garnicht. (Dafür reite ich sicherlich auch leider noch mit einigen Sicherheitslücken rum, die im normalen 10.2.x.x.x schon beseitigt wurden.

    Danke 🙂
    Jetzt seh ich zukünftigen Versionen vom Flashpkayer nicht mehr so sketpisch entgegen wenn es ums Downloaden von Videos geht…

    • Das Skript kopiert nur Dateien die als gelöscht markiert sind. Wenn Flash sie dann wirklich löscht sind sie auch für das Skript verloren.

    • Das Löschen kannst du durch einen zusätzlichen filehandler verhindern. (Stichwort ln) Ist prinzipiell egal zu welchem Zeitpunkt du das machst.

      • Interessante Anmerkung. Jetzt fehlt noch ein Weg das zu automatisieren …

  8. Guten Tag!
    Kennt jemand den Prozessnamen vom flashplugin-prerelease aus dem Arch User Repository?

    Grüße

    • Ich schlage vor, finde ihn einfach heraus:
      * Browser mit einer Seite öffnen auf der Flash verwendet wird (z.B. YouTube)
      * ps -e in einem Terminal eingeben.
      * Da du die Seite mit Flash gerade erst geöffnet hast sollte der Flash-Player mitsamt Namen einer der untersten Einträge der erschienen Liste sein.

      Ich schlage dir auch vor, dich in den Foren von Arch durchzufragen. Dort wirst du eher eine zufriedenstellende Antwort bekommen als in einem Blog der sich hauptsächlich mit Ubuntu beschäftigt.

  9. Du benutzt Gnash als Flashplayer. Ich nehme an, dein script funktioniert nicht mit dem Adobe-Flash-plugin, das wahrscheinlich 95% oder mehr verwenden.
    Das solltest du vermerken.

    Übrigens: Wie schlägt sich Gnash so? Keine probleme?

    • Daria hat in einem Kommentar weiter oben die FLASH-Variable einfach so angepasst: FLASH=npviewer.bin. Damit hat es dann mit dem offiziellen Flash-Player funktioniert.

      Gnash funktioniert wunderbar. Manchmal kommt es bei bestimmten Videos jedoch dazu, dass das Video auf YouTube nicht geladen werden kann. Das ist nur bei manchen Videos der Fall, jedoch dann sowohl in Firefox als auch in Chromium.

  10. Das Programm file bestimmt den Dateityp, das sollte dir helfen, Videos zu erkennen.

    Anstatt so seltsame Arrays zu bauen:
    for PID in $(ps -C $FLASH -o pid=)
    und
    for FILE in $(ls -l $PATH2FILE | grep deleted | cut -f8 -d\)
    das finde ich viel einleuchtender.

    Wer hat sich ausgedacht, dass die Dateien als gelöscht markiert werden? Das ist ja mehr oder weniger total bekloppt.

    P.S.: Warum ist es immer so kompliziert, einen Kommentar unter einen Blogartikel zu bekommen?

    • Ok, muss mir file mal ansehen.

      Ich nehme mal an, dass entweder die „Rechteinhaber“ Adobe dazu gedrängt haben etwas zu unternehmen, damit Nutzer den Inhalt nicht einfach so bekommen können oder Adobe arbeitet in vorauseilendem Gehorsam weil sie um ihre Marktstellung fürchten.

      Wieso kompliziert? Einfach in der Box unten reinschreiben und absenden. Wenn du das erste Mal auf einem Blog einen Kommentar schreibst, dann muss dieser erst durch den Blogger freigegeben werden. Danach werden deine Kommentare in diesem Blog automatisch veröffentlicht. Da ich den Artikel gestern Nacht geschrieben habe (und heute Samstag ist 🙂 ) habe ich deinen Kommentar erst jetzt freigeschalten, da ich wieder wach bin.

      Du hast zweimal denselben Inhalt gepostet, ich habe den erste Kommentar gelöscht, da er eh dasselbe beinhält wie dieser.

      • Kompliziert, weil bei dem Formular nicht dazu steht, warum ich eine Emailadresse angeben muss und, dass mein Beitrag erst freigeschaltet werden muss. Teilweise muss man auch Javascript und Cookies erlauben um kommentieren zu können, das steht aber auch nie irgendwo.
        Wenn man dann einen Kommentar abschickt und nichts passiert, dann wundert man sich (und schickt eventuell alles nochmal ab). Das ist doch alles Mist.

      • JavaScript (genauso wie Flash) ist auch aus meiner Sicht umständlich und teilweise sehr schlecht gebaut, sodass die komplette Seite nur dann funktioniert wenn JavaScript erlaubt ist. WordPress-Blogs sollten auch ohne Javascript verwendbar sein.

  11. […] HowTo: Gestreamte Flash Videos einfach wiederherstellen [2. UPDATE] […]

  12. Ich hatte gerade Probleme, die angeblich gelöschten Flash Dateien (manuell) zu kopieren. Direkt kopieren geht nicht, da gelöscht, Verknüpfung kopieren geht auch nicht.
    Die Lösung war: Die Verknüpfung mit cp -L kopieren. -L folgt der Verknüpfung.

    • Hm. Ich hatte das Problem bis jetzt nicht, deswegen habe ich es auch nicht berücksichtigt. Gute Ergänzung.

  13. So du hast damit angefangen und es hat mich nicht losgelassen 😉

    Ich hab das Ganze mal mit file probiert (wurde auch schon hier angesprochen) und das Ergebins ist folgendes:
    – Das Skript kopiert nur die audio & viodeo-file nach /tmo/flash/- kannst Du das mal bei Dir prüfen ob das funktioniert, bitte?:
    #!/bin/bash
    # FlashFinder:
    # Simple Collector of flash-files – Einfaches einsammeln von flash-Dateien
    # 1. Scan running process for pluginname – System nach Player-plugins durchsuchen
    # 2. Search directory /proc//fd f then process – Verzeichnis /proc//fd/ nach den Mime-Typen „audio|video“ absuchen
    # 3. Extract ectension of the Mime-T – Extension aus Mime-Typ ermitteln (siehe Mime-Typen bei Tante Wiki)
    # 4. Copy file to TARGE with new name – Kopieren dieser Dateien nach $TARGET.YYYY-MM-DD_hhmm_PID.$EXT (Zeitstempel + ProzessID + Mime-Type)
    # 5. Licens: Do what you want to do – Lizenz: Mach domit wat de wills
    #
    ################################################################################################
    ## Conditions – Voraussetzungen: ##
    ## – Vid has to be downloaded at all – Video muss komplett gestreamt sein ##
    ## – Don’t close the browser – Browserfenster ist noch geöffnet ##
    ## – No check for existing files – generelles überschreiben vorhandener Dateien ##
    ## timestamp with hours+min+PID – Zeitstempel nur auf Min. abgestellt ##
    ################################################################################################

    # the folder into which the found files should be copied
    TARGET=“/tmp/flash/“ # Wohin mit den Dateien

    # the Flashplayer’s here
    VIEWER=(nspluginviewer gnash) # Player-Plugins z.Zt.: nspluginviewer + gnash

    # search for Player
    for LOOK in ${VIEWER[@]}; do # Alle Plugins abgrasen
    # Look for PID‘ s
    for PID in $(pgrep -f $LOOK);do # Je Plugin Prozesse suchen
    mkdir -p $TARGET # erzeuge immer Verzeichnis
    while read -a FILE; do
    # strip Mime-type
    EXT=${FILE[1]##audio/x-} # nur den letzten Teil (z.B. flv/mp3 …)
    EXT=${EXT##audio/}
    EXT=${EXT##video/x-}
    EXT=${EXT##video/}
    # copy each file to TARGET, assigning a unique name with: date/time/PID/Extension found in Mime-Type
    cp -L ${FILE[0]%%:*} /tmp/flash/$(date ‚+%Y-%m-%d_%H%M‘)_$PID.$EXT
    # search files for Mime-Type and select audio/video
    done < <(file -L –mime-type /proc/$PID/fd/* |egrep "audio|video") # Mime-Type ermitteln und selektieren
    done
    done

    Grüsse aus dem Erbeben-verdorbenen Chile

    • Wow….
      da muss ich jetzt mal ne Nacht drüber schlafen und mir den Code zu Gemüte führen. Ich werde es aber auf jeden Fall testen.

  14. Guter Artikel!
    Leider funktioniert dieser „Trick“ nicht mit http://www.voxnow.de und http://rtl-now.rtl.de 😦
    Gibt es hierfür auch einen Weg?

    Grüße,
    Patrick

    • Der allererste Kommentar ganz oben von Marian zeigt einen Befehl mit dem man Videos aus der ARD-Mediathek bekommen kann. Vielleicht hilft das auch bei VOX und RTL? Ich selbst kenne die Seiten bisher nicht, kann es also nicht sagen.

  15. Hi,

    praktischer Beitrag! Vorallem das mit dem Skript ist eine gute Idee. Ich mache das zur Zeit manuell und das geht noch ein klein wenig unkomplizierter:

    (Allerdings habe ich im Firefox die sandbox für plugins deaktiviert, alle, dom.ipc.plugins.* > false)

    1. Warten bis das Video vollständig geladen wurde in YouTube (roter Balken unten)
    2. pgrep firefox-bin (zeigt jetzt bei mir z.B. die Process-ID 797)
    3. ls -l1 /proc/797/fd/ | grep Flash
    Ergebnis z.B.:
    kringel@natty:~$ ls -l1 /proc/797/fd/ | grep Flash
    lrwx—— 1 kringel kringel 64 Feb 22 17:31 92 -> /tmp/FlashXXTUMfMc (deleted)

    Also hat das Flashvideo die file description (fd, heißt das glaube ich) Nr. 92

    4. cp /proc/797/fd/92 /home/kringel/Videos/coolesYoutubevideo

    Fertig. 🙂

    Überprüfen:
    5. file /home/kringel/Videos/coolesYoutubevideo

    coolesYoutubevideo: Macromedia Flash Video

    Das ist dann direkt das .mp4

  16. noch eine kurze idee, du könntest die Nicht-Videodateien von den Videodateien vielleicht einfach mit

    file /proc//fd/* | grep Video

    trennen. Aber ich weiß nicht ob das so gut in ein Skript zu bringen ist.

    Und sonst eben wie oben

    ls -l1 /proc//fd | grep Flash (ls – kleines l und 1 (eins))

    • Du kannst auch generell in den /proc/*/fd/ nach Mime audio/video suchen, läuft allerdings etwas länger (siehe mein Skript: Kommentar von Februar 21, 2011). Dabei brauchst Du überhaupt keine PID. Benutze einfach nur die read-Schleife und als Eingabe nimmts Du:
      find /proc/*/fd/ -type l -exec file -L –mime-type {} \; 2>/dev/null | egrep „audio|video“
      Saludos


Hinterlasse einen Kommentar

Diese Seite verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden..

Bloggen auf WordPress.com.
Entries und Kommentare feeds.