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
except:
have_utime = False
+import os
+
SCOPE_TRANSPONDERDATA = 0
SCOPE_SYSETC = 1
SCOPE_FONTS = 2
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
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)]
}
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)
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:
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 = ""
# 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):