from Plugins.Plugin import PluginDescriptor
-from os import path as os_path, walk as os_walk
-from string import lower
-
-def getExtension(file):
- p = file.rfind('.')
- if p == -1:
- ext = ""
- else:
- ext = file[p+1:]
-
- return lower(ext)
-
-class Scanner:
- def __init__(self, name, extensions = [], paths_to_scan = [], description = "", openfnc = None):
- self.extensions = extensions
- self.name = name
- self.paths_to_scan = paths_to_scan
- self.description = description
- self.openfnc = openfnc
-
- def checkFile(self, filename):
- return True
-
- def handleFile(self, res, filename, ext):
- if (self.extensions is None or ext in self.extensions) and self.checkFile(filename):
- res.setdefault(self, []).append(filename)
-
- def __repr__(self):
- return "<Scanner " + self.name + ">"
-
- def open(self, list, *args, **kwargs):
- if self.openfnc is not None:
- self.openfnc(list, *args, **kwargs)
-
-class ScanPath:
- def __init__(self, path, with_subdirs = False):
- self.path = path
- self.with_subdirs = with_subdirs
-
- def __repr__(self):
- return self.path + "(" + str(self.with_subdirs) + ")"
-
- # we will use this in a set(), so we need to implement __hash__ and __cmp__
- def __hash__(self):
- return self.path.__hash__() ^ self.with_subdirs.__hash__()
-
- def __cmp__(self, other):
- if self.path < other.path:
- return -1
- elif self.path > other.path:
- return +1
- else:
- return self.with_subdirs.__cmp__(other.with_subdirs)
-
-#scanner = [
-# Scanner(extensions = ["jpg", "jpe", "jpeg"],
-# paths_to_scan =
-# [
-# ScanPath(path = "DCIM", with_subdirs = True),
-# ScanPath(path = "", with_subdirs = False),
-# ],
-# name = "Pictures",
-# description = "View Photos..."
-# ),
-#
-# Scanner(extensions = ["mpg", "vob", "ts"],
-# paths_to_scan =
-# [
-# ScanPath(path = ""),
-# ScanPath(path = "movie", with_subdirs = True),
-# ],
-# name = "Movie",
-# description = "View Movies..."
-# ),
-#
-# Scanner(extensions = ["mp3", "ogg"],
-# name = "Media",
-# paths_to_scan =
-# [
-# ScanPath(path = "", with_subdirs = False),
-# ],
-# description = "Play music..."
-# ),
-#
-# Scanner(extensions = ["ipk"],
-# name = "Packages",
-# paths_to_scan =
-# [
-# ScanPath(path = ""),
-# ],
-# description = "Install software..."
-# ),
-# ]
-
-def scanDevice(mountpoint):
- from Components.PluginComponent import plugins
-
- scanner = [ ]
-
- for p in plugins.getPlugins(PluginDescriptor.WHERE_FILESCAN):
- l = p()
- if not isinstance(l, list):
- l = [l]
- scanner += l
-
- print "scanner:", scanner
-
- res = { }
-
- # merge all to-be-scanned paths, with priority to
- # with_subdirs.
-
- paths_to_scan = set()
-
- # first merge them all...
- for s in scanner:
- paths_to_scan.update(set(s.paths_to_scan))
-
- # ...then remove with_subdir=False when same path exists
- # with with_subdirs=True
- for p in set(paths_to_scan):
- if p.with_subdirs == True and ScanPath(path=p.path) in paths_to_scan:
- paths_to_scan.remove(ScanPath(path=p.path))
-
- # convert to list
- paths_to_scan = list(paths_to_scan)
-
- # now scan the paths
- for p in paths_to_scan:
- path = os_path.join(mountpoint, p.path)
-
- for root, dirs, files in os_walk(path):
- for f in files:
- ext = getExtension(f)
- pathname = os_path.join(root, f)
- for s in scanner:
- s.handleFile(res, pathname, ext)
-
- # if we really don't want to scan subdirs, stop here.
- if not p.with_subdirs:
- del dirs[:]
-
- # res is a dict with scanner -> [files]
- return res
+from Components.Scanner import scanDevice
+from Screens.InfoBar import InfoBar
+from os import access, F_OK, R_OK
def execute(option):
print "execute", option
(_, scanner, files, session) = option
scanner.open(files, session)
-
def mountpoint_choosen(option):
if option is None:
return
from Screens.ChoiceBox import ChoiceBox
+ print "scanning", option
(description, mountpoint, session) = option
res = scanDevice(mountpoint)
list = [ (r.description, r, res[r], session) for r in res ]
- if list == [ ]:
- print "nothing found"
+ if not list:
+ from Screens.MessageBox import MessageBox
+ if access(mountpoint, F_OK|R_OK):
+ session.open(MessageBox, _("No displayable files on this medium found!"), MessageBox.TYPE_ERROR)
+ else:
+ print "ignore", mountpoint, "because its not accessible"
return
session.openWithCallback(execute, ChoiceBox,
- title = "The following files were found...",
+ title = _("The following files were found..."),
list = list)
def scan(session):
from Components.Harddisk import harddiskmanager
- parts = [ (r.description, r.mountpoint, session) for r in harddiskmanager.getMountedPartitions() ]
- session.openWithCallback(mountpoint_choosen, ChoiceBox, title = "Please Select Medium to be Scanned", list = parts)
+ parts = [ (r.description, r.mountpoint, session) for r in harddiskmanager.getMountedPartitions(onlyhotplug = False)]
+ if parts:
+ for x in parts:
+ if not access(x[1], F_OK|R_OK):
+ parts.remove(x)
+ session.openWithCallback(mountpoint_choosen, ChoiceBox, title = _("Please Select Medium to be Scanned"), list = parts)
def main(session, **kwargs):
scan(session)
+def menuEntry(*args):
+ mountpoint_choosen(args)
+
+from Components.Harddisk import harddiskmanager
+
+def menuHook(menuid):
+ if menuid != "mainmenu":
+ return [ ]
+
+ from Tools.BoundFunction import boundFunction
+ return [(("%s (files)") % r.description, boundFunction(menuEntry, r.description, r.mountpoint), "hotplug_%s" % r.mountpoint, None) for r in harddiskmanager.getMountedPartitions(onlyhotplug = True)]
+
+global_session = None
+
+def partitionListChanged(action, device):
+ if InfoBar.instance:
+ if InfoBar.instance.execing:
+ if action == 'add' and device.is_hotplug:
+ print "mountpoint", device.mountpoint
+ print "description", device.description
+ print "force_mounted", device.force_mounted
+ mountpoint_choosen((device.description, device.mountpoint, global_session))
+ else:
+ print "main infobar is not execing... so we ignore hotplug event!"
+ else:
+ print "hotplug event.. but no infobar"
+
+def sessionstart(reason, session):
+ global global_session
+ global_session = session
+
+def autostart(reason, **kwargs):
+ global global_session
+ if reason == 0:
+ harddiskmanager.on_partition_list_change.append(partitionListChanged)
+ elif reason == 1:
+ harddiskmanager.on_partition_list_change.remove(partitionListChanged)
+ global_session = None
+
def Plugins(**kwargs):
- return PluginDescriptor(name="MediaScanner", description="Scan Files...", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=main)
+ return [
+ PluginDescriptor(name="MediaScanner", description=_("Scan Files..."), where = PluginDescriptor.WHERE_PLUGINMENU, fnc=main),
+# PluginDescriptor(where = PluginDescriptor.WHERE_MENU, fnc=menuHook),
+ PluginDescriptor(where = PluginDescriptor.WHERE_SESSIONSTART, fnc = sessionstart),
+ PluginDescriptor(where = PluginDescriptor.WHERE_AUTOSTART, fnc = autostart)
+ ]