ignore not accessible devices
[enigma2.git] / lib / python / Plugins / Extensions / MediaScanner / plugin.py
index 5fc35ee..7d57ce0 100644 (file)
 from Plugins.Plugin import PluginDescriptor
-import os
-import string
-
-def getExtension(file):
-       p = file.rfind('.')
-       if p == -1:
-               ext = ""
-       else:
-               ext = file[p+1:]
-
-       return string.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
        if option is None:
                return
-       
+
        (_, 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)
+               ]