add logging module, use logging in cli.rename, cli uses decorator to parse options...
[audiomangler.git] / audiomangler / config.py
blobf04cb05551fa55242dd69ed2b3435449550efe52
1 # -*- coding: utf-8 -*-
2 ###########################################################################
3 # Copyright (C) 2008 by Andrew Mahone
4 # <andrew.mahone@gmail.com>
6 # Copyright: See COPYING file that comes with this distribution
8 ###########################################################################
9 import os, os.path
10 import sys
11 from ConfigParser import RawConfigParser, NoOptionError, NoSectionError
13 def clear_cache(func):
14 def proxy(self, *args, **kw):
15 self._cache.clear()
16 return func(self, *args, **kw)
17 val = getattr(func,'__doc__')
18 if hasattr(func,'im_func'):
19 func = func.im_func
20 for key in ('__doc__','__name__','func_doc'):
21 val = getattr(func,key)
22 if val is not None:
23 setattr(proxy,key, val)
24 return proxy
26 class AMConfig(RawConfigParser):
27 def __init__(self, defaults):
28 self._current_values = {}
29 self._cache = {}
30 RawConfigParser.__init__(self)
31 for section in defaults:
32 items = section[1:]
33 section = section[0]
34 self.add_section(section)
35 for key, value in items:
36 self.set(section,key,value)
38 @clear_cache
39 def __setitem__(self, key, value):
40 self._current_values[key] = value
42 def __getitem__(self, key):
43 if key in self._cache:
44 return self._cache[key]
45 if key in self._current_values:
46 self._cache[key] = self._current_values[key]
47 return self._current_values[key]
48 trysources = {
49 'preset':('profile','type','defaults'),
50 'type':('profile','defaults'),
51 'profile':('defaults',)
52 }.get(key, ('profile','type','preset','defaults'))
53 for source in trysources:
54 if source == 'preset':
55 source = [self['type']]
56 if not source[0]:
57 continue
58 source.extend(('_',self['preset']))
59 if not source[2]:
60 continue
61 source = ''.join(source)
62 elif source != 'defaults':
63 source = self[source]
64 if not source:
65 continue
66 try:
67 ret = RawConfigParser.get(self,source,key)
68 except (NoOptionError, NoSectionError):
69 continue
70 else:
71 self._cache[key] = ret
72 return ret
73 self._cache[key] = None
75 def get(self, key, default=None):
76 ret = self[key]
77 return ret if ret is not None else default
80 for n in ('read','readfp','remove_option','remove_section','set'):
81 locals()[n] = clear_cache(getattr(RawConfigParser,n))
83 Config = AMConfig(
85 ('defaults',
86 ('onsplit', 'abort'),
87 ('groupby',
88 "first("
89 "('album',musicbrainz_albumid),"
90 "('meta',first(albumartist,artist),album,first(catalognumber,asin,isrc)),"
91 "('dir',dir)"
92 ")"
94 ('loglevel','INFO'),
95 ('consolelevel','INFO'),
96 ('trackid',
97 "first("
98 "('mbid',musicip_puid,musicbrainz_albumid,first(tracknumber)),"
99 "('meta',title,artist,album,first(year),first(catalognumber,asin,isrc),first(tracknumber))"
102 ('sortby', "(first(discnumber),first(tracknumber),first(filename))"),
103 ('base', '.'),
104 ('filename',
105 "$/first('$type/','')"
106 "$first(releasetype == 'soundtrack' and 'Soundtrack', albumartist, artist)/$album/"
107 "$first('%02d.' % discnumber if discnumber > 0 else '','')"
108 "$first('%02d ' % tracknumber, '')"
109 "$title$first('.%s' % ext, '')"
111 ('fs_encoding', 'utf8'),
112 ('fs_encoding_error', 'replace'),
114 ('mp3',
115 ('preset', 'standard')
117 ('mp3_medium',
118 ('encopts', '--preset medium')
120 ('mp3_standard',
121 ('encopts', '--preset standard')
123 ('mp3_extreme',
124 ('encopts', '--preset extreme')
126 ('mp3_insane',
127 ('encopts', '--preset insane')
129 ('wavpack',
130 ('preset', 'standard')
132 ('wavpack_fast',
133 ('encopts', '-f')
135 ('wavpack_standard',
136 ('encopts', '')
138 ('wavpack_high',
139 ('encopts', '-h')
141 ('wavpack_higher',
142 ('encopts', '-hh')
144 ('oggvorbis',
145 ('preset', 'q3')
147 ('oggvorbis_q1',
148 ('encopts', '-q1')
150 ('oggvorbis_q3',
151 ('encopts', '-q3')
153 ('oggvorbis_q5',
154 ('encopts', '-q5')
156 ('oggvorbis_q7',
157 ('encopts', '-q7')
159 ('oggvorbis_q9',
160 ('encopts', '-q9')
162 ('flac',
163 ('preset', 'standard')
165 ('flac_standard',
166 ('encopts', '')
168 ('flac_fast',
169 ('encopts', '--fast')
171 ('flac_best',
172 ('encopts', '--best')
177 homedir = os.getenv('HOME')
178 if homedir is not None:
179 configfile = os.path.join(homedir, '.audiomangler', 'config')
180 else:
181 configfile = 'audiomangler.cfg'
182 Config.read(configfile)
184 def from_config(*names):
185 locals_ = getattr(getattr(sys._getframe(),'f_back',None),'f_locals',None)
186 if locals_ is None:
187 return
188 ret = []
189 for key in names:
190 val = locals_.get(key)
191 if val is None:
192 val = Config[key]
193 ret.append(val)
194 return(ret)
195 __all__ = ['Config', 'from_config']