O PyInotify é um módulo que permite acesso ao sub-sistema "inotify" do Linux - isso permite a monitoração em tempo real de mudanças em quaisquer arquivos gravados.
O exemplo aqui é quase idêntico ao que está na documentação do módulo em http://pyinotify.sourceforge.net/ - mas com uma daptação mais prática: As ersões mais novas do plug-in de Flash da Adobe usam um truque para evitar que o usuário tenha acesso a um vídeo assistido na Web: o plugin flash cria um arquivo, e o apaga em seguida -- e continua a execução do programa com uma referência ao arquivo deletado - desta forma o própro processo tem acesso pleno ao arquivo, e mais ninguém pode te-lo.
Neste uso do pyinotify, o eento de criação do arquivo é interceptado, e nesse momento se cria um hard-link para o mesmo. Quando o Flash remove o arquivo logo em seguida, o arquivo permanece disponível com o nome criado no hard-link.
Esse script demonstra algumas das possibilidades do inotify, e assegura que o usuário tenha controle do seu computador, podendo assistir videos que já viu da internet semt er que baixa-los de novo toda vez que quiser ve-los.
# coding: utf-8
"""
Saves a file of every flash plugin video played on a Linux system
while it is running. Saved files are kept on /tmp/video*flv
"""
# Authors: from the documentation of pyinotify - http://pyinotify.sourceforge.net/
# modified to save copies of videos displayed on Flash Plugins for browsers
# This script is freely distributable and modifiable.
import os
from pyinotify import WatchManager, Notifier, ProcessEvent
import pyinotify
import time, random
import os
mask = pyinotify.IN_DELETE | pyinotify.IN_CREATE # watched events
wm = WatchManager()
class PTmp(ProcessEvent):
def process_IN_CREATE(self, event):
path = os.path.join(event.path, event.name)
print "Create: %s" % os.path.join(event.path, event.name)
if event.name.startswith("Flash"):
tt = time.localtime()
new_name = "video-%02d:%02d:%02d-%02d-%02d-%04d-%d.flv" %(tt.tm_hour, tt.tm_min, tt.tm_sec,
tt.tm_mday, tt.tm_mon, tt.tm_year, random.randint(0,1000))
new_path = os.path.join(event.path, new_name)
os.link(path, new_path)
def process_IN_DELETE(self, event):
print "Remove: %s" % os.path.join(event.path, event.name)
notifier = Notifier(wm, PTmp())
wdd = wm.add_watch('/tmp', mask, rec=False)
while True: # loop forever
try:
# process the queue of events as explained above
notifier.process_events()
if notifier.check_events():
# read notified events and enqeue them
notifier.read_events()
# you can do some tasks here...
except KeyboardInterrupt:
# destroy the inotify's instance on this interrupt (stop monitoring)
notifier.stop()
print "Flash video logger stopped"
break


