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 KommentareEin 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 Befehlls -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 immerFLASH=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
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.
TEMP_DESTINATION=$DESTINATION/.tmp
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 $TEMP_DESTINATION ]
if [ ! -d $DESTINATION ]
then
mkdir -p $DESTINATION
fi
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)
liefert uns alle PIDs der in
do$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.flvcp $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_INFOif [ $(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.
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
Hinterlasse einen Kommentar
Bloggen auf WordPress.com.
Entries und Kommentare feeds.
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:…‘)
*
Comment by Marian— 19. Februar 2011 #
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.
Comment by tok1hama1san— 19. Februar 2011 #
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. 🙂
Comment by anonym— 19. Februar 2011 #
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?
Comment by tok1hama1san— 19. Februar 2011 #
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
Comment by Willie— 19. Februar 2011 #
pgrep kannte ich noch nicht. Habe es gerade ausprobiert, funktioniert super. Dann werde ich mal das Skript umschreiben gehen.
Comment by tok1hama1san— 19. Februar 2011 #
Hm, warum sollte man dieses Script nutzen und nicht einfach flashgot Video DownloadHelper und co?
Comment by stfischr— 19. Februar 2011 #
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.
Comment by tok1hama1san— 19. Februar 2011 #
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. 🙂
Comment by stfischr— 19. Februar 2011 #
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) 😉
Comment by Daria— 19. Februar 2011 #
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.
Comment by tok1hama1san— 19. Februar 2011 #
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
Comment by Daria— 19. Februar 2011 #
Super, damit kann ich das Skript soweit erweitern, dass es die Videos behält und den Rest löscht.
Comment by tok1hama1san— 19. Februar 2011 #
Vorsicht, gibt auch mp4-Videos auf youtube, evtl auch noch mehr. Am besten mit
file --mime
(oder--mime-type
) aufvideo/*
prüfen. Manseite lesen,-b
könnte auch hilfreich sein.Comment by Marian— 20. Februar 2011 #
In der Manpage von head findet sich kein Parameter für –mime oder –mimetype. Welchen Befehl meinst du?
Comment by tok1hama1san— 21. Februar 2011 #
[…] den Originalbeitrag weiterlesen: HowTo: Gestreamte Flash Videos einfach wiederherstellen « Taach … Medien zum Thema Medien by […]
Pingback by App-Flash » HowTo: Gestreamte Flash Videos einfach wiederherstellen « Taach …— 19. Februar 2011 #
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…
Comment by Marc— 19. Februar 2011 #
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.
Comment by tok1hama1san— 19. Februar 2011 #
Das Löschen kannst du durch einen zusätzlichen filehandler verhindern. (Stichwort ln) Ist prinzipiell egal zu welchem Zeitpunkt du das machst.
Comment by adun— 19. Februar 2011 #
Interessante Anmerkung. Jetzt fehlt noch ein Weg das zu automatisieren …
Comment by tok1hama1san— 19. Februar 2011 #
Guten Tag!
Kennt jemand den Prozessnamen vom flashplugin-prerelease aus dem Arch User Repository?
Grüße
Comment by mo— 19. Februar 2011 #
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.
Comment by tok1hama1san— 19. Februar 2011 #
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?
Comment by phiphi— 19. Februar 2011 #
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.
Comment by tok1hama1san— 19. Februar 2011 #
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?
Comment by Felix— 19. Februar 2011 #
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.
Comment by tok1hama1san— 19. Februar 2011 #
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.
Comment by Felix— 19. Februar 2011 #
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.
Comment by tok1hama1san— 19. Februar 2011 #
[…] HowTo: Gestreamte Flash Videos einfach wiederherstellen [2. UPDATE] […]
Pingback by Leonardo Server » Blog Archive » Today’s Links— 20. Februar 2011 #
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.
Comment by Phylu— 20. Februar 2011 #
Hm. Ich hatte das Problem bis jetzt nicht, deswegen habe ich es auch nicht berücksichtigt. Gute Ergänzung.
Comment by tok1hama1san— 20. Februar 2011 #
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
Comment by Willie— 21. Februar 2011 #
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.
Comment by tok1hama1san— 21. Februar 2011 #
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
Comment by Patrick— 21. Februar 2011 #
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.
Comment by tok1hama1san— 21. Februar 2011 #
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
Comment by kringel— 22. Februar 2011 #
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))
Comment by kringel— 22. Februar 2011 #
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
Comment by Willie— 22. Februar 2011 #