X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/baa6968ed152a4e78ba27e3e48364a6b62680db2..bc5c320cbcf22f8da293b8dbf3ce4582775bdaf3:/lib/python/Plugins/Extensions/MediaScanner/plugin.py diff --git a/lib/python/Plugins/Extensions/MediaScanner/plugin.py b/lib/python/Plugins/Extensions/MediaScanner/plugin.py index 55e10810..7d57ce0b 100644 --- a/lib/python/Plugins/Extensions/MediaScanner/plugin.py +++ b/lib/python/Plugins/Extensions/MediaScanner/plugin.py @@ -1,148 +1,7 @@ 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 "" - - 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 @@ -152,23 +11,84 @@ def execute(option): (_, scanner, files, session) = option scanner.open(files, session) -def scan(session): +def mountpoint_choosen(option): + if option is None: + return + from Screens.ChoiceBox import ChoiceBox - # HARDCODED - need to scan all mountpoints - res = ScanDevice("/hdd/") + + (description, mountpoint, session) = option + res = scanDevice(mountpoint) list = [ (r.description, r, res[r], session) for r in res ] if list == [ ]: - print "nothing found" + 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...", list = list) +def scan(session): + from Screens.ChoiceBox import ChoiceBox + + from Components.Harddisk import harddiskmanager + + parts = [ (r.description, r.mountpoint, session) for r in harddiskmanager.getMountedPartitions(onlyhotplug = False)] + if len(parts): + 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) + ]