395402eea54b99cceb570cd5b8015eb83248f8fe
[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         #if len(base) > 0 and base[0] == '/':
78                 #path = ("", None)
79
80         if not fileExists(path + base):
81                 #try:
82                 if fallbackPaths.has_key(scope):
83                         for x in fallbackPaths[scope]:
84                                 if x[1] == FILE_COPY:
85                                         if fileExists(x[0] + base):
86                                                 system("cp " + x[0] + base + " " + path + base)
87                                                 break
88                                 elif x[1] == FILE_MOVE:
89                                         if fileExists(x[0] + base):
90                                                 system("mv " + x[0] + base + " " + path + base)
91                                                 break
92                                 elif x[1] == PATH_COPY:
93                                         if pathExists(x[0]):
94                                                 if not pathExists(defaultPaths[scope][0]):
95                                                         mkdir(path)
96                                                 system("cp -a " + x[0] + "* " + path)
97                                                 break
98                                 elif x[1] == PATH_MOVE:
99                                         if pathExists(x[0]):
100                                                 system("mv " + x[0] + " " + path)
101                                                 break
102         # FIXME: we also have to handle DATADIR etc. here.
103         return path + base
104
105         # this is only the BASE - an extension must be added later.
106         
107 def pathExists(path):
108         return os_path.exists(path)
109
110 def createDir(path):
111         try:
112                 mkdir(path)
113         except:
114                 ret = 0
115         else:
116                 ret = 1
117         return ret
118
119 def fileExists(f, mode='r'):
120         try:
121                 file = open(f, mode)
122         except IOError:
123                 exists = 0
124         else:
125                 exists = 1
126         return exists
127
128 def getRecordingFilename(basename, dirname = None):
129         # filter out non-allowed characters
130         non_allowed_characters = "/.\\:*?<>|\""
131         filename = ""
132         
133         basename = basename.replace('\xc2\x86', '').replace('\xc2\x87', '')
134         
135         for c in basename:
136                 if c in non_allowed_characters:
137                         c = "_"
138                 filename += c
139
140         if dirname is not None:
141                 filename = ''.join([dirname, filename])
142
143         i = 0
144         while True:
145                 path = resolveFilename(SCOPE_HDD, filename)
146                 if i > 0:
147                         path += "_%03d" % i
148                 try:
149                         open(path + ".ts")
150                         i += 1
151                 except IOError:
152                         return path
153
154 # this is clearly a hack:
155 def InitFallbackFiles():
156         resolveFilename(SCOPE_CONFIG, "userbouquet.favourites.tv")
157         resolveFilename(SCOPE_CONFIG, "bouquets.tv")
158         resolveFilename(SCOPE_CONFIG, "userbouquet.favourites.radio")
159         resolveFilename(SCOPE_CONFIG, "bouquets.radio")