X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fpython%2FTools%2FDirectories.py;h=6aa527110b43bd252e18905ffd4bf54fc96f60de;hp=8ed2c8a46017951c8702db09bd1047d3a6094c99;hb=HEAD;hpb=812cf012acb92112b4f5f3bc6d2728c23448934b diff --git a/lib/python/Tools/Directories.py b/lib/python/Tools/Directories.py index 8ed2c8a..6aa5271 100755 --- a/lib/python/Tools/Directories.py +++ b/lib/python/Tools/Directories.py @@ -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):