add logging module, use logging in cli.rename, cli uses decorator to parse options...
[audiomangler.git] / audiomangler / util.py
blob3309b4700216a7ea1defbc3dbfc5884f30311258
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, stat
10 from audiomangler import Config, msg, err, fatal, WARNING, ERROR
12 def copy(src,dst):
13 fsrc = None
14 fdst = None
15 try:
16 fsrc = open(src,'rb')
17 fdst = open(dst,'wb')
18 while 1:
19 buf = fsrc.read(16384)
20 if not buf:
21 break
22 fdst.write(buf)
23 finally:
24 if fsrc:
25 fsrc.close()
26 if fdst:
27 fdst.close()
28 st = os.stat(src)
29 mode = stat.S_IMODE(st.st_mode)
30 if hasattr(os, 'utime'):
31 try:
32 os.utime(dst, (st.st_atime, st.st_mtime))
33 except OSError:
34 pass
36 def move(src,dst):
37 try:
38 os.rename(src,dst)
39 except OSError:
40 copy(src,dst)
41 os.unlink(src)
43 def test_splits(dir_list,transcode=False):
44 from audiomangler import get_codec
45 if transcode and Config['type']:
46 targetcodec = Config['type']
47 if ',' in targetcodec:
48 allowedcodecs = targetcodec.split(',')
49 targetcodec = allowedcodecs[0]
50 allowedcodecs = frozenset(allowedcodecs)
51 else:
52 allowedcodecs = frozenset((targetcodec,))
53 targetcodec = get_codec(targetcodec)
54 postadd = lambda type_: {} if type_ in allowedcodecs else {'type':targetcodec.type_,'ext':targetcodec.ext}
55 else:
56 postadd = lambda type_: {}
57 for (dir_, files) in dir_list.items():
58 dstdirs = set()
59 for file_ in files:
60 src = file_.filename
61 dst = fsencode(file_.format(postadd=postadd(file_.type_)))
62 dstdir = os.path.split(dst)[0]
63 dstdirs.add(dstdir)
64 if len(dstdirs) > 1:
65 onsplit = Config['onsplit']
66 if onsplit == 'abort':
67 fatal(consoleformat=u"tracks in %(dir_p)s would be placed in different target directories, aborting\nset onsplit to 'warn' or 'ignore' to proceed anyway",
68 format="split: %(dir_)r", dir_=dir_, dir_p=fsdecode(dir_),nologerror=1)
70 def fsencode(string):
71 return string.encode(Config['fs_encoding'],Config.get('fs_encoding_err','underscorereplace'))
73 def fsdecode(string):
74 return string.decode(Config['fs_encoding'],Config.get('fs_encoding_err','replace'))
76 __all__ = ['copy','move','fsencode','fsdecode','test_splits']