martes, julio 18, 2006

Buscando entre nuestros ficheros .... pero rapidito

Si si, ya se que todos conoceis Beagle.
Pero no se, quiza sois de esos que lo de que use mono no os acaba de hacer mucho tilin. Quiza que chupe 60 megas de memoria o mas, tampoco acaba de haceros demasiada gracia.
Pues si quereis todas sus ventajas, pero sin esos "probelmas", os animo a que probeis tracker.
Si teneis Ubuntu (supongo que debian sirva igual), nada mas facil que instalar el paquete deb que existe.

Echarle un vistazo porque es muy rapido, y consume muy pocos recursos. Mucho me da que va a avanzar a grandes pasos. Pinta muy pero que muy bien.

Para probar, simplemente instalar lo siguiente:

  • El Tracker, que es este fichero.
  • Nautilus, el navegador de ficheros. Para poder hacer busquedas desde el a velocidad de vertigo (parcheado para usar tracker), que bajais aqui.
  • Y como guinda, si usais el gnome deskbar applet, que os recomiendo muchisimo, pues para que podais hacer busquedas desde el. Copiais el contenido que os pego a continuacion en ~/.gnome2/deskbar-applet/handlers/tracker-deskbar.py

import gnome
import deskbar
from deskbar.Handler import SignallingHandler
from deskbar.Match import Match
import gobject
from gettext import gettext as _

from os.path import expanduser
HOME = expanduser ("~/")

def _check_requirements ():
try:
import dbus
try :
if getattr(dbus, 'version', (0,0,0)) >= (0,41,0):
import dbus.glib
except:
return (deskbar.Handler.HANDLER_IS_NOT_APPLICABLE, "Python dbus.glib bindings not found.", None)
return (deskbar.Handler.HANDLER_IS_HAPPY, None, None)
except:
return (deskbar.Handler.HANDLER_IS_NOT_APPLICABLE, "Python dbus bindings not found.", None)

HANDLERS = {
"TrackerFileSearchHandler" : {
"name": "Search for files using Tracker",
"description": _("Search all of your documents (using Tracker), as you type"),
"requirements" : _check_requirements,
}
}

class TrackerFileMatch (Match):
def __init__(self, handler, **args):
Match.__init__ (self, handler, **args)

try:
self._icon = deskbar.Utils.load_icon_for_file(self.name)
except Exception:
pass

self.tracker_id = self.name
self.name = self.calc_display_string ()

def get_verb(self):
return "%(name)s"

def action(self, text=None):
print "Opening Tracker hit:", self.name
gnome.url_show ("file://" + self.tracker_id)
#args = ["gnome-open", str(self.name)] # FIXME for some odd reason we need the str() cast
#gobject.spawn_async(args, flags=gobject.SPAWN_SEARCH_PATH)

def get_category (self):
return "files"

def calc_display_string (self):
dirname = self.name
filename = ""

# Don't include the /home/myuser part of the path
if dirname.startswith (HOME):
dirname = dirname [len(HOME):]
filename = dirname

last_dir_idx = filename.rfind("/")

if last_dir_idx == -1:
# There are no "/"s left in the path string,
# this must be a file directly in the home folder
return "" + filename +"\nin home folder"

filename = filename[last_dir_idx+1:]
dirname = dirname[:last_dir_idx]

return "%s\nin folder %s" % (filename,dirname)


class TrackerFileSearchHandler(SignallingHandler):
def __init__(self):
SignallingHandler.__init__(self, "stock_file")

import dbus
# We have to do this or it won't work
if getattr(dbus, 'version', (0,0,0)) >= (0,41,0):
import dbus.glib

# Set up dbus conenction to trackerd
self.bus = dbus.SessionBus()
self.proxy_obj = self.bus.get_object('org.freedesktop.Tracker', '/org/freedesktop/tracker')
self.tracker_iface = dbus.Interface(self.proxy_obj, 'org.freedesktop.Tracker')

self.set_delay (500)

def query (self, qstring, max):
self.tracker_iface.SearchMetadataText ("Files", qstring, 100, False, reply_handler=lambda hits : self.__recieve_hits(qstring, hits, max), error_handler=self.__recieve_error)
print "Tracker query:", qstring

def __recieve_hits (self, qstring, hits, max):
matches = []
for filename in hits:
matches.append( TrackerFileMatch(self, name=filename) )
#if len (matches) > max:
# break
self.emit_query_ready(qstring, matches)
print "Tracker response for %s, - %s hits returned, %s shown" % (qstring, len(hits), len(matches))

def __recieve_error (self, error):
print "*** Tracker dbus error:", error
Y para funcionar con ello, solo teneis que activarlo en el applet del deskbar. Ya sabeis: vais a las preferencias del deskbar (boton derecho sobre el applet) y marcais el "Search for files using Tracker"

Para comenzar a funcionar con Tracker, simplemente teneis que ejecutar el comando trackerd.
Si os gusta como funciona la cosa, añadirlo en Gnome al inicio [Sistema->Preferencias->Sesiones->Programas al inicio->Añadir->trackerd].
En Kde, sera algo parecido.
Y ya podeis realizar busquedas desde el nautilus (pulsando en buscar, o con Control-F) y desde el applet de deskbar.

Por defecto indexara todos los ficheros que tengais en vuestro Home. Si quereis que no lo haga con todas vuestras carpetas, o quereis añadir mas directorios, solo teneis que modificar el fichero ~/.Tracker/tracker.cfg que se creara la primera vez que ejecuteis trackerd.

Espero que os guste y os resulte util.