From: Felix Domke Date: Mon, 18 Dec 2006 23:46:23 +0000 (+0000) Subject: add media scanner X-Git-Tag: 2.6.0~2577 X-Git-Url: https://git.cweiske.de/enigma2.git/commitdiff_plain/28d07a51cfd1df07ec14c60a18992ffc55e3f217 add media scanner --- diff --git a/configure.ac b/configure.ac index 6c492ee9..bb275233 100644 --- a/configure.ac +++ b/configure.ac @@ -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 diff --git a/lib/python/Plugins/Extensions/Makefile.am b/lib/python/Plugins/Extensions/Makefile.am index bacaf3ee..92251841 100644 --- a/lib/python/Plugins/Extensions/Makefile.am +++ b/lib/python/Plugins/Extensions/Makefile.am @@ -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 index 00000000..138b9cc2 --- /dev/null +++ b/lib/python/Plugins/Extensions/MediaScanner/.cvsignore @@ -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 index 00000000..d304373b --- /dev/null +++ b/lib/python/Plugins/Extensions/MediaScanner/Makefile.am @@ -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 index 00000000..e69de29b diff --git a/lib/python/Plugins/Extensions/MediaScanner/plugin.py b/lib/python/Plugins/Extensions/MediaScanner/plugin.py new file mode 100644 index 00000000..5fc35ee1 --- /dev/null +++ b/lib/python/Plugins/Extensions/MediaScanner/plugin.py @@ -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 "" + + 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)