move media scanner components into core, patch by Moritz Venn (002_enigma2_move_media...
authorFelix Domke <tmbinc@elitedvb.net>
Sun, 7 Oct 2007 10:24:05 +0000 (10:24 +0000)
committerFelix Domke <tmbinc@elitedvb.net>
Sun, 7 Oct 2007 10:24:05 +0000 (10:24 +0000)
lib/python/Components/Makefile.am
lib/python/Components/Scanner.py [new file with mode: 0644]
lib/python/Plugins/Extensions/IpkgInstaller/plugin.py
lib/python/Plugins/Extensions/MediaPlayer/plugin.py
lib/python/Plugins/Extensions/MediaScanner/plugin.py
lib/python/Plugins/Extensions/PicturePlayer/plugin.py

index 98dc938a91e28906a59b4ec70e7a9f1f5ededcd8..03c5d1c2db6f9286a52e772923e9e21953828aea 100644 (file)
@@ -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 (file)
index 0000000..860918c
--- /dev/null
@@ -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 "<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)
+
+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 "<ScanFile " + self.path + " (" + str(self.mimetype) + ", " + str(self.size) + " MB)>"
+
+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)])
index d9a3d4908d428157ea6e1523bd82bdc7d8d75ec9..4893dc473e041bbfc97085df30004575047332f8 100644 (file)
@@ -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), 
index 06b6bfabfe2538205116d192bf6f7ff2b70a0da4..0de820c84189591246b7ea1cf2ef7fe2337cb222 100644 (file)
@@ -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 =
index 3c4b977921944ba90e60fdae082b58b7b0c5c91c..ed1140085697e62ad1d0ebcea7728930a664a7e1 100644 (file)
@@ -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 "<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
+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
index 4462df139b9fc7008cd8b1c5844536a837540540..b6699bab00ab63e3346f199274449bdb029217da 100644 (file)
@@ -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),