1 from Plugins.Plugin import PluginDescriptor
2 from Components.PluginComponent import plugins
4 from os import path as os_path, walk as os_walk
5 from string import lower
6 from mimetypes import guess_type
8 def getExtension(file):
18 (type, _) = guess_type(file)
20 # Detect some mimetypes unknown to dm7025
21 # TODO: do mimetypes.add_type once should be better
22 ext = getExtension(file)
24 return "application/x-debian-package"
26 return "application/ogg"
30 return "application/x-dream-package"
32 return "application/x-dream-image"
36 return "video/x-dvd-iso"
37 elif file[-12:].lower() == "video_ts.ifo":
39 elif ext == "dat" and file[-11:-6].lower() == "avseq":
44 def __init__(self, name, mimetypes= [], paths_to_scan = [], description = "", openfnc = None):
45 self.mimetypes = mimetypes
47 self.paths_to_scan = paths_to_scan
48 self.description = description
49 self.openfnc = openfnc
51 def checkFile(self, file):
54 def handleFile(self, res, file):
55 if (self.mimetypes is None or file.mimetype in self.mimetypes) and self.checkFile(file):
56 res.setdefault(self, []).append(file)
59 return "<Scanner " + self.name + ">"
61 def open(self, list, *args, **kwargs):
62 if self.openfnc is not None:
63 self.openfnc(list, *args, **kwargs)
66 def __init__(self, path, with_subdirs = False):
68 self.with_subdirs = with_subdirs
71 return self.path + "(" + str(self.with_subdirs) + ")"
73 # we will use this in a set(), so we need to implement __hash__ and __cmp__
75 return self.path.__hash__() ^ self.with_subdirs.__hash__()
77 def __cmp__(self, other):
78 if self.path < other.path:
80 elif self.path > other.path:
83 return self.with_subdirs.__cmp__(other.with_subdirs)
86 def __init__(self, path, mimetype = None, size = None, autodetect = True):
88 if mimetype is None and autodetect:
89 self.mimetype = getType(path)
91 self.mimetype = mimetype
95 return "<ScanFile " + self.path + " (" + str(self.mimetype) + ", " + str(self.size) + " MB)>"
98 print "execute", option
102 (_, scanner, files, session) = option
103 scanner.open(files, session)
105 def scanDevice(mountpoint):
108 for p in plugins.getPlugins(PluginDescriptor.WHERE_FILESCAN):
110 if not isinstance(l, list):
114 print "scanner:", scanner
118 # merge all to-be-scanned paths, with priority to
121 paths_to_scan = set()
123 # first merge them all...
125 paths_to_scan.update(set(s.paths_to_scan))
127 # ...then remove with_subdir=False when same path exists
128 # with with_subdirs=True
129 for p in set(paths_to_scan):
130 if p.with_subdirs == True and ScanPath(path=p.path) in paths_to_scan:
131 paths_to_scan.remove(ScanPath(path=p.path))
134 paths_to_scan = list(paths_to_scan)
136 from Components.Harddisk import harddiskmanager
137 blockdev = mountpoint.rsplit('/',1)[-1]
138 error, blacklisted, removable, is_cdrom, partitions = harddiskmanager.getBlockDevInfo(blockdev)
141 for p in paths_to_scan:
142 path = os_path.join(mountpoint, p.path)
144 for root, dirs, files in os_walk(path):
146 path = os_path.join(root, f)
147 if is_cdrom and path.endswith(".wav") and path[-13:-6] == ("/track-"):
148 sfile = ScanFile(path,"audio/x-cda")
150 sfile = ScanFile(path)
152 s.handleFile(res, sfile)
154 # if we really don't want to scan subdirs, stop here.
155 if not p.with_subdirs:
158 # res is a dict with scanner -> [ScanFiles]
161 def openList(session, files):
162 if not isinstance(files, list):
167 for p in plugins.getPlugins(PluginDescriptor.WHERE_FILESCAN):
169 if not isinstance(l, list):
173 print "scanner:", scanner
179 s.handleFile(res, file)
181 choices = [ (r.description, r, res[r], session) for r in res ]
184 from Screens.ChoiceBox import ChoiceBox
186 session.openWithCallback(
189 title = "The following viewers were found...",
199 def openFile(session, mimetype, file):
200 return openList(session, [ScanFile(file, mimetype)])