add media scanner
authorFelix Domke <tmbinc@elitedvb.net>
Mon, 18 Dec 2006 23:46:23 +0000 (23:46 +0000)
committerFelix Domke <tmbinc@elitedvb.net>
Mon, 18 Dec 2006 23:46:23 +0000 (23:46 +0000)
configure.ac
lib/python/Plugins/Extensions/Makefile.am
lib/python/Plugins/Extensions/MediaScanner/.cvsignore [new file with mode: 0644]
lib/python/Plugins/Extensions/MediaScanner/Makefile.am [new file with mode: 0644]
lib/python/Plugins/Extensions/MediaScanner/__init__.py [new file with mode: 0644]
lib/python/Plugins/Extensions/MediaScanner/plugin.py [new file with mode: 0644]

index 6c492ee9edec94a2f99de0ae576df6a140b6c305..bb275233a0c04b83d4f8c7a3639b2546605ac416 100644 (file)
@@ -85,6 +85,7 @@ lib/python/Plugins/Extensions/WebInterface/web-data/Makefile
 lib/python/Plugins/Extensions/FileManager/Makefile
 lib/python/Plugins/Extensions/FritzCall/Makefile
 lib/python/Plugins/Extensions/CutListEditor/Makefile
+lib/python/Plugins/Extensions/MediaScanner/Makefile
 lib/python/Plugins/Extensions/PicturePlayer/Makefile
 lib/python/Plugins/Extensions/PicturePlayer/data/Makefile
 lib/python/Tools/Makefile
index bacaf3eed0bf6dd9e425883687d0b241d6acd7b7..922518411e4991eaa9239422ab850c42fbed43fd 100644 (file)
@@ -1,4 +1,2 @@
-SUBDIRS = TuxboxPlugins WebInterface FileManager CutListEditor FritzCall PicturePlayer
-
-
-
+SUBDIRS = TuxboxPlugins WebInterface FileManager CutListEditor FritzCall PicturePlayer MediaScanner
+# SimpleRSS is still not finished
diff --git a/lib/python/Plugins/Extensions/MediaScanner/.cvsignore b/lib/python/Plugins/Extensions/MediaScanner/.cvsignore
new file mode 100644 (file)
index 0000000..138b9cc
--- /dev/null
@@ -0,0 +1,4 @@
+*.pyc
+*.pyo
+Makefile
+Makefile.in
diff --git a/lib/python/Plugins/Extensions/MediaScanner/Makefile.am b/lib/python/Plugins/Extensions/MediaScanner/Makefile.am
new file mode 100644 (file)
index 0000000..d304373
--- /dev/null
@@ -0,0 +1,5 @@
+installdir = $(LIBDIR)/enigma2/python/Plugins/Extensions/MediaScanner
+
+install_PYTHON =       \
+       __init__.py \
+       plugin.py
diff --git a/lib/python/Plugins/Extensions/MediaScanner/__init__.py b/lib/python/Plugins/Extensions/MediaScanner/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/lib/python/Plugins/Extensions/MediaScanner/plugin.py b/lib/python/Plugins/Extensions/MediaScanner/plugin.py
new file mode 100644 (file)
index 0000000..5fc35ee
--- /dev/null
@@ -0,0 +1,174 @@
+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
+
+def execute(option):
+       print "execute", option
+       if option is None:
+               return
+       
+       (_, scanner, files, session) = option
+       scanner.open(files, session)
+
+def scan(session):
+       from Screens.ChoiceBox import ChoiceBox
+       # HARDCODED - need to scan all mountpoints
+       res = ScanDevice("/hdd/")
+       
+       list = [ (r.description, r, res[r], session) for r in res ]
+       
+       if list == [ ]:
+               print "nothing found"
+               return
+       
+       session.openWithCallback(execute, ChoiceBox, 
+               title = "The following files were found...",
+               list = list)
+
+def main(session, **kwargs):
+       scan(session)
+
+def Plugins(**kwargs):
+       return PluginDescriptor(name="MediaScanner", description="Scan Files...", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=main)