From: Felix Domke Date: Sun, 7 Oct 2007 10:24:05 +0000 (+0000) Subject: move media scanner components into core, patch by Moritz Venn (002_enigma2_move_media... X-Git-Tag: 2.6.0~1831 X-Git-Url: https://git.cweiske.de/enigma2.git/commitdiff_plain/fdb15fdd11d88b73900badf092cf2db0e8d3aabf move media scanner components into core, patch by Moritz Venn (002_enigma2_move_mediascanner_components_into_core.patch) --- diff --git a/lib/python/Components/Makefile.am b/lib/python/Components/Makefile.am index 98dc938a..03c5d1c2 100644 --- a/lib/python/Components/Makefile.am +++ b/lib/python/Components/Makefile.am @@ -17,4 +17,4 @@ install_PYTHON = \ FIFOList.py ServiceEventTracker.py Input.py TimerSanityCheck.py FileList.py \ MultiContent.py MediaPlayer.py TunerInfo.py VideoWindow.py ChoiceList.py \ Element.py Playlist.py ParentalControl.py ParentalControlList.py \ - Ipkg.py SelectionList.py + Ipkg.py SelectionList.py Scanner.py diff --git a/lib/python/Components/Scanner.py b/lib/python/Components/Scanner.py new file mode 100644 index 00000000..860918c0 --- /dev/null +++ b/lib/python/Components/Scanner.py @@ -0,0 +1,178 @@ +from Plugins.Plugin import PluginDescriptor +from Components.PluginComponent import plugins + +from os import path as os_path, walk as os_walk +from string import lower +from mimetypes import guess_type + +def getExtension(file): + p = file.rfind('.') + if p == -1: + ext = "" + else: + ext = file[p+1:] + + return lower(ext) + +def getType(file): + (type, _) = guess_type(file) + if type is None: + # Detect some mimetypes unknown to dm7025 + # TODO: do mimetypes.add_type once should be better + ext = getExtension(file) + if ext == "ipk": + return "application/x-debian-package" + elif ext == "ogg": + return "application/ogg" + return type + +class Scanner: + def __init__(self, name, mimetypes= [], paths_to_scan = [], description = "", openfnc = None): + self.mimetypes = mimetypes + self.name = name + self.paths_to_scan = paths_to_scan + self.description = description + self.openfnc = openfnc + + def checkFile(self, file): + return True + + def handleFile(self, res, file): + if (self.mimetypes is None or file.mimetype in self.mimetypes) and self.checkFile(file): + res.setdefault(self, []).append(file) + + 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) + +class ScanFile: + def __init__(self, path, mimetype = None, size = None, autodetect = True): + self.path = path + if mimetype is None and autodetect: + (self.mimetype, _) = guess_type(path) + else: + self.mimetype = mimetype + self.size = size + + def __repr__(self): + return "" + +def execute(option): + print "execute", option + if option is None: + return + + (_, scanner, files, session) = option + scanner.open(files, session) + +def scanDevice(mountpoint): + 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: + sfile = ScanFile(os_path.join(root, f)) + for s in scanner: + s.handleFile(res, sfile) + + # if we really don't want to scan subdirs, stop here. + if not p.with_subdirs: + del dirs[:] + + # res is a dict with scanner -> [ScanFiles] + return res + +def openList(session, files): + if not isinstance(files, list): + files = [ files ] + + scanner = [ ] + + for p in plugins.getPlugins(PluginDescriptor.WHERE_FILESCAN): + l = p() + if not isinstance(l, list): + l = [l] + scanner += l + + print "scanner:", scanner + + res = { } + + for file in files: + for s in scanner: + s.handleFile(res, file) + + choices = [ (r.description, r, res[r], session) for r in res ] + Len = len(choices) + if Len > 1: + from Screens.ChoiceBox import ChoiceBox + + session.openWithCallback( + execute, + ChoiceBox, + title = "The following viewers were found...", + list = choices + ) + return True + elif Len: + execute(choices[0]) + return True + + return False + +def openFile(session, mimetype, file): + return openList(session, [ScanFile(file, mimetype)]) diff --git a/lib/python/Plugins/Extensions/IpkgInstaller/plugin.py b/lib/python/Plugins/Extensions/IpkgInstaller/plugin.py index d9a3d490..4893dc47 100644 --- a/lib/python/Plugins/Extensions/IpkgInstaller/plugin.py +++ b/lib/python/Plugins/Extensions/IpkgInstaller/plugin.py @@ -20,7 +20,7 @@ class IpkgInstaller(Screen): def __init__(self, session, list): self.skin = IpkgInstaller.skin Screen.__init__(self, session) - + self.list = SelectionList() self["list"] = self.list for listindex in range(len(list)): @@ -47,14 +47,13 @@ class IpkgInstaller(Screen): self.session.open(Ipkg, cmdList = cmdList) def filescan_open(list, session, **kwargs): - session.open(IpkgInstaller, list) # list + filelist = [x.path for x in list] + session.open(IpkgInstaller, filelist) # list def filescan(**kwargs): - # we expect not to be called if the MediaScanner plugin is not available, - # thus we don't catch an ImportError exception here - from Plugins.Extensions.MediaScanner.plugin import Scanner, ScanPath + from Components.Scanner import Scanner, ScanPath return \ - Scanner(extensions = ["ipk"], + Scanner(mimetypes = ["application/x-debian-package"], paths_to_scan = [ ScanPath(path = "ipk", with_subdirs = True), diff --git a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py index 06b6bfab..0de820c8 100644 --- a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py +++ b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py @@ -717,7 +717,7 @@ def filescan_open(list, session, **kwargs): mp.switchToPlayList() for file in list: - ref = eServiceReference(4097, 0, file) + ref = eServiceReference(4097, 0, file.path) mp.playlist.addFile(ref) # TODO: rather play first than last file? @@ -725,9 +725,7 @@ def filescan_open(list, session, **kwargs): mp.playlist.updateList() def filescan(**kwargs): - # we expect not to be called if the MediaScanner plugin is not available, - # thus we don't catch an ImportError exception here - from Plugins.Extensions.MediaScanner.plugin import Scanner, ScanPath + from Components.Scanner import Scanner, ScanPath return [ Scanner(mimetypes = ["video/mpeg"], paths_to_scan = diff --git a/lib/python/Plugins/Extensions/MediaScanner/plugin.py b/lib/python/Plugins/Extensions/MediaScanner/plugin.py index 3c4b9779..ed114008 100644 --- a/lib/python/Plugins/Extensions/MediaScanner/plugin.py +++ b/lib/python/Plugins/Extensions/MediaScanner/plugin.py @@ -1,148 +1,5 @@ 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 def execute(option): print "execute", option @@ -152,7 +9,6 @@ def execute(option): (_, scanner, files, session) = option scanner.open(files, session) - def mountpoint_choosen(option): if option is None: return diff --git a/lib/python/Plugins/Extensions/PicturePlayer/plugin.py b/lib/python/Plugins/Extensions/PicturePlayer/plugin.py index 4462df13..b6699bab 100644 --- a/lib/python/Plugins/Extensions/PicturePlayer/plugin.py +++ b/lib/python/Plugins/Extensions/PicturePlayer/plugin.py @@ -531,14 +531,14 @@ def main(session, **kwargs): session.open(picmain) def filescan_open(list, session, **kwargs): - session.open(picmain) # list + # Recreate List as expected by PicView + filelist = [((file.path, False), None) for file in list] + session.open(PicView, filelist, "", "") def filescan(**kwargs): - # we expect not to be called if the MediaScanner plugin is not available, - # thus we don't catch an ImportError exception here - from Plugins.Extensions.MediaScanner.plugin import Scanner, ScanPath + from Components.Scanner import Scanner, ScanPath return \ - Scanner(extensions = ["jpg", "jpe", "jpeg"], + Scanner(mimetypes = ["image/jpeg", "image/png", "image/gif", "image/bmp"], paths_to_scan = [ ScanPath(path = "DCIM", with_subdirs = True),