-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