Support turbo2.
[vuplus_dvbapp] / lib / python / Tools / Directories.py
index 8ed2c8a..6aa5271 100755 (executable)
@@ -3,6 +3,7 @@
 from os import path as os_path, mkdir, rmdir, system, walk, stat as os_stat, listdir, readlink, makedirs, error as os_error, symlink, access, F_OK, R_OK, W_OK
 from stat import S_IMODE
 from re import compile
+from enigma import eEnv
 
 try:
        from os import chmod
@@ -16,6 +17,8 @@ try:
 except:
        have_utime = False
 
+import os
+
 SCOPE_TRANSPONDERDATA = 0
 SCOPE_SYSETC = 1
 SCOPE_FONTS = 2
@@ -39,26 +42,26 @@ PATH_CREATE = 0
 PATH_DONTCREATE = 1
 PATH_FALLBACK = 2
 defaultPaths = {
-               SCOPE_TRANSPONDERDATA: ("/etc/", PATH_DONTCREATE),
-               SCOPE_SYSETC: ("/etc/", PATH_DONTCREATE),
-               SCOPE_FONTS: ("/usr/share/fonts/", PATH_DONTCREATE),
-               SCOPE_CONFIG: ("/etc/enigma2/", PATH_CREATE),
-               SCOPE_PLUGINS: ("/usr/lib/enigma2/python/Plugins/", PATH_CREATE),
+               SCOPE_TRANSPONDERDATA: (eEnv.resolve("${sysconfdir}/"), PATH_DONTCREATE),
+               SCOPE_SYSETC: (eEnv.resolve("${sysconfdir}/"), PATH_DONTCREATE),
+               SCOPE_FONTS: (eEnv.resolve("${datadir}/fonts/"), PATH_DONTCREATE),
+               SCOPE_CONFIG: (eEnv.resolve("${sysconfdir}/enigma2/"), PATH_CREATE),
+               SCOPE_PLUGINS: (eEnv.resolve("${libdir}/enigma2/python/Plugins/"), PATH_CREATE),
 
-               SCOPE_LANGUAGE: ("/usr/share/enigma2/po/", PATH_DONTCREATE),
+               SCOPE_LANGUAGE: (eEnv.resolve("${datadir}/enigma2/po/"), PATH_DONTCREATE),
 
-               SCOPE_SKIN: ("/usr/share/enigma2/", PATH_DONTCREATE),
-               SCOPE_SKIN_IMAGE: ("/usr/share/enigma2/", PATH_DONTCREATE),
+               SCOPE_SKIN: (eEnv.resolve("${datadir}/enigma2/"), PATH_DONTCREATE),
+               SCOPE_SKIN_IMAGE: (eEnv.resolve("${datadir}/enigma2/"), PATH_DONTCREATE),
                SCOPE_HDD: ("/hdd/movie/", PATH_DONTCREATE),
                SCOPE_MEDIA: ("/media/", PATH_DONTCREATE),
-               SCOPE_PLAYLIST: ("/etc/enigma2/playlist/", PATH_CREATE),
+               SCOPE_PLAYLIST: (eEnv.resolve("${sysconfdir}/enigma2/playlist/"), PATH_CREATE),
                
                SCOPE_USERETC: ("", PATH_DONTCREATE), # user home directory
                
-               SCOPE_DEFAULTDIR: ("/usr/share/enigma2/defaults/", PATH_CREATE),
-               SCOPE_DEFAULTPARTITION: ("/dev/mtdblock/6", PATH_DONTCREATE),
-               SCOPE_DEFAULTPARTITIONMOUNTDIR: ("/usr/share/enigma2/dealer", PATH_CREATE),
-               SCOPE_METADIR: ("/usr/share/meta", PATH_CREATE),
+               SCOPE_DEFAULTDIR: (eEnv.resolve("${datadir}/enigma2/defaults/"), PATH_CREATE),
+               SCOPE_DEFAULTPARTITION: ("/dev/mtdblock6", PATH_DONTCREATE),
+               SCOPE_DEFAULTPARTITIONMOUNTDIR: (eEnv.resolve("${datadir}/enigma2/dealer"), PATH_CREATE),
+               SCOPE_METADIR: (eEnv.resolve("${datadir}/meta"), PATH_CREATE),
        }
 
 FILE_COPY = 0 # copy files from fallback dir to the basedir
@@ -67,7 +70,7 @@ PATH_COPY = 2 # copy the complete fallback dir to the basedir
 PATH_MOVE = 3 # move the fallback dir to the basedir (can be used for changes in paths)
 fallbackPaths = {
                SCOPE_CONFIG: [("/home/root/", FILE_MOVE),
-                                          ("/usr/share/enigma2/defaults/", FILE_COPY)],
+                                          (eEnv.resolve("${datadir}/enigma2/defaults/"), FILE_COPY)],
                SCOPE_HDD: [("/hdd/movies", PATH_MOVE)]
        }
 
@@ -117,7 +120,11 @@ def resolveFilename(scope, base = "", path_prefix = None):
 
        if flags == PATH_CREATE:
                if not pathExists(path):
-                       mkdir(path)
+                       try:
+                               mkdir(path)
+                       except OSError:
+                               print "resolveFilename: Couldn't create %s" % path
+                               return None
 
        fallbackPath = fallbackPaths.get(scope)
 
@@ -146,11 +153,64 @@ def resolveFilename(scope, base = "", path_prefix = None):
        return path + base
        # this is only the BASE - an extension must be added later.
 
-def pathExists(path):
-       return os_path.exists(path)
+pathExists = os.path.exists
+isMount = os.path.ismount
+
+def bestRecordingLocation(candidates):
+       path = ''
+
+       from Components import Harddisk
+       ata_devices = [candidate for candidate in candidates if Harddisk.getDeviceInterface(candidate[1]) == "ata"]
 
-def isMount(path):
-       return os_path.ismount(path)
+       if len(ata_devices) == 1:
+               path = ata_devices[0][1]
+
+       elif len(ata_devices):
+               best = ""
+               for device in ata_devices:
+                       dev = os.path.basename(device[0])
+                       if not best or (best > dev):
+                               best = dev
+                               path = device[1]
+       else: # Find the largest usb disk
+               biggest = 0
+               for candidate in candidates:
+                       try:
+                               stat = os.statvfs(candidate[1])
+                               # must have some free space (i.e. not read-only)
+                               if stat.f_bavail:
+                                       # Free space counts double
+                                       size = (stat.f_blocks + stat.f_bavail) * stat.f_bsize
+                                       if size > biggest:
+                                               path = candidate[1]
+                                               biggest = size
+                       except Exception, e:
+                               print "[DRL]", e
+
+       return path
+
+def defaultRecordingLocation(candidate=None):
+       if candidate and os.path.exists(candidate):
+               return candidate
+       # First, try whatever /hdd points to, or /media/hdd
+       try:
+               path = os.path.realpath('/hdd')
+       except:
+               path = '/media/hdd'
+       if not os.path.exists(path) or not os.path.ismount(path):
+               path = ''
+               from Components import Harddisk
+               mounts = [m for m in Harddisk.getProcMounts() if m[1].startswith('/media/')]
+               path = bestRecordingLocation([m for m in mounts if m[0].startswith('/dev/')])
+       if path:
+               # If there's a movie subdir, we'd probably want to use that.
+               movie = os.path.join(path, 'movie')
+               if os.path.isdir(movie):
+                       path = movie
+               if not path.endswith('/'):
+                       path += '/' # Bad habits die hard, old code relies on this
+
+       return path
 
 def createDir(path, makeParents = False):
        try:
@@ -182,7 +242,13 @@ def fileExists(f, mode='r'):
                acc_mode = F_OK
        return access(f, acc_mode)
 
+def fileCheck(f, mode='r'):
+       return fileExists(f, mode) and f
+
 def getRecordingFilename(basename, dirname = None):
+       if not dirname.endswith('/'):
+               dirname += '/'
+
        # filter out non-allowed characters
        non_allowed_characters = "/.\\:*?<>|\""
        filename = ""
@@ -223,12 +289,13 @@ def InitFallbackFiles():
 # returns a list of tuples containing pathname and filename matching the given pattern
 # example-pattern: match all txt-files: ".*\.txt$"
 def crawlDirectory(directory, pattern):
-       expression = compile(pattern)
        list = []
-       for root, dirs, files in walk(directory):
-               for file in files:
-                       if expression.match(file) is not None:
-                               list.append((root, file))
+       if directory:
+               expression = compile(pattern)
+               for root, dirs, files in walk(directory):
+                       for file in files:
+                               if expression.match(file) is not None:
+                                       list.append((root, file))
        return list
 
 def copyfile(src, dst):