speedup resolveFilename a bit
[enigma2.git] / lib / python / Tools / Directories.py
1 # -*- coding: utf-8 -*-
2 from os import path as os_path, mkdir, system
3
4 SCOPE_TRANSPONDERDATA = 0
5 SCOPE_SYSETC = 1
6 SCOPE_FONTS = 2
7 SCOPE_SKIN = 3
8 SCOPE_SKIN_IMAGE = 4
9 SCOPE_USERETC = 5
10 SCOPE_CONFIG = 6
11 SCOPE_LANGUAGE = 7
12 SCOPE_HDD = 8
13 SCOPE_PLUGINS = 9
14 SCOPE_MEDIA = 10
15 SCOPE_PLAYLIST = 11
16 SCOPE_CURRENT_SKIN = 12
17
18 PATH_CREATE = 0
19 PATH_DONTCREATE = 1
20 PATH_FALLBACK = 2
21 defaultPaths = {
22                 SCOPE_TRANSPONDERDATA: ("/etc/", PATH_DONTCREATE),
23                 SCOPE_SYSETC: ("/etc/", PATH_DONTCREATE),
24                 SCOPE_FONTS: ("/usr/share/fonts/", PATH_DONTCREATE),
25                 SCOPE_CONFIG: ("/etc/enigma2/", PATH_CREATE),
26                 SCOPE_PLUGINS: ("/usr/lib/enigma2/python/Plugins/", PATH_CREATE),
27     
28                 SCOPE_LANGUAGE: ("/usr/share/enigma2/po/", PATH_DONTCREATE),
29
30                 SCOPE_SKIN: ("/usr/share/enigma2/", PATH_DONTCREATE),
31                 SCOPE_SKIN_IMAGE: ("/usr/share/enigma2/", PATH_DONTCREATE),
32                 SCOPE_HDD: ("/hdd/movie/", PATH_DONTCREATE),
33                 SCOPE_MEDIA: ("/media/", PATH_DONTCREATE),
34                 SCOPE_PLAYLIST: ("/etc/enigma2/playlist/", PATH_CREATE),
35                 
36                 SCOPE_USERETC: ("", PATH_DONTCREATE) # user home directory
37         }
38
39 FILE_COPY = 0 # copy files from fallback dir to the basedir
40 FILE_MOVE = 1 # move files
41 PATH_COPY = 2 # copy the complete fallback dir to the basedir
42 PATH_MOVE = 3 # move the fallback dir to the basedir (can be used for changes in paths)
43 fallbackPaths = {
44                 SCOPE_CONFIG: [("/home/root/", FILE_MOVE),
45                                            ("/usr/share/enigma2/defaults/", FILE_COPY)],
46                 SCOPE_HDD: [("/hdd/movies", PATH_MOVE)]
47         }
48
49 def resolveFilename(scope, base = "", path_prefix = None):
50         if base[0:2] == "~/":
51                 # you can only use the ~/ if we have a prefix directory
52                 assert path_prefix is not None
53                 base = os_path.join(path_prefix, base[2:])
54
55         # don't resolve absolute paths
56         if base[0:1] == '/':
57                 return base
58
59         if scope == SCOPE_CURRENT_SKIN:
60                 from Components.config import config
61                 tmp = defaultPaths[SCOPE_SKIN]
62                 pos = config.skin.primary_skin.value.rfind('/')
63                 if pos != -1:
64                         path = tmp[0]+config.skin.primary_skin.value[:pos+1]
65                 else:
66                         path = tmp[0]
67         else:
68                 tmp = defaultPaths[scope]
69                 path = tmp[0]
70
71         flags = tmp[1]
72
73         if flags == PATH_CREATE:
74                 if not pathExists(path):
75                         mkdir(path)
76
77         fallbackPath = fallbackPaths.get(scope)
78
79         if fallbackPath and not fileExists(path + base):
80                 for x in fallbackPath:
81                         if x[1] == FILE_COPY:
82                                 if fileExists(x[0] + base):
83                                         system("cp " + x[0] + base + " " + path + base)
84                                         break
85                         elif x[1] == FILE_MOVE:
86                                 if fileExists(x[0] + base):
87                                         system("mv " + x[0] + base + " " + path + base)
88                                         break
89                         elif x[1] == PATH_COPY:
90                                 if pathExists(x[0]):
91                                         if not pathExists(defaultPaths[scope][0]):
92                                                 mkdir(path)
93                                         system("cp -a " + x[0] + "* " + path)
94                                         break
95                         elif x[1] == PATH_MOVE:
96                                 if pathExists(x[0]):
97                                         system("mv " + x[0] + " " + path)
98                                         break
99
100         # FIXME: we also have to handle DATADIR etc. here.
101         return path + base
102         # this is only the BASE - an extension must be added later.
103
104 def pathExists(path):
105         return os_path.exists(path)
106
107 def createDir(path):
108         try:
109                 mkdir(path)
110         except:
111                 ret = 0
112         else:
113                 ret = 1
114         return ret
115
116 def fileExists(f, mode='r'):
117         try:
118                 file = open(f, mode)
119         except IOError:
120                 exists = 0
121         else:
122                 exists = 1
123         return exists
124
125 def getRecordingFilename(basename, dirname = None):
126         # filter out non-allowed characters
127         non_allowed_characters = "/.\\:*?<>|\""
128         filename = ""
129         
130         basename = basename.replace('\xc2\x86', '').replace('\xc2\x87', '')
131         
132         for c in basename:
133                 if c in non_allowed_characters:
134                         c = "_"
135                 filename += c
136
137         if dirname is not None:
138                 filename = ''.join([dirname, filename])
139
140         i = 0
141         while True:
142                 path = resolveFilename(SCOPE_HDD, filename)
143                 if i > 0:
144                         path += "_%03d" % i
145                 try:
146                         open(path + ".ts")
147                         i += 1
148                 except IOError:
149                         return path
150
151 # this is clearly a hack:
152 def InitFallbackFiles():
153         resolveFilename(SCOPE_CONFIG, "userbouquet.favourites.tv")
154         resolveFilename(SCOPE_CONFIG, "bouquets.tv")
155         resolveFilename(SCOPE_CONFIG, "userbouquet.favourites.radio")
156         resolveFilename(SCOPE_CONFIG, "bouquets.radio")