5 from os.path import getmtime
6 from getopt import getopt, GetoptError
9 from eyeD3.frames import id3EncodingToString, \
10 LATIN1_ENCODING, UTF_16_ENCODING, UTF_16BE_ENCODING, UTF_8_ENCODING
11 from m_lib.opstring import recode
16 sys.stderr.write("%s: %s\n" % (pname, msg))
17 sys.stderr.write("Usage: %s [-f encoding|--from-encoding=encoding|-t encoding|--to-encoding=encoding] file.mp3...\n" % pname)
21 optlist, args = getopt(sys.argv[1:], "f:t:",
22 ["from-encoding=", "to-encoding="]
25 usage("invalid option")
31 for _opt, _arg in optlist:
32 if _opt in ('-f', '--from-encoding'):
34 elif _opt in ('-t', '--to-encoding'):
42 usage("too few arguments")
45 from m_lib.defenc import default_encoding
46 dst_encoding = default_encoding
49 def id3tag_set(frame, attr, src_encoding, dst_encoding):
50 value = getattr(frame, attr)
51 if frame.encoding == LATIN1_ENCODING:
52 value = value.encode('latin1').decode(src_encoding).encode(dst_encoding).decode('latin1')
53 setattr(frame, attr, value)
54 elif frame.encoding in (UTF_16_ENCODING, UTF_16BE_ENCODING, UTF_8_ENCODING):
55 #value = value.encode(dst_encoding).decode('latin1')
56 #frame.encoding = LATIN1_ENCODING
59 raise ValueError('Unknown encoding "%s"' % id3EncodingToString(frame.encoding))
62 mtime = getmtime(filename)
63 for version in eyeD3.ID3_V2, eyeD3.ID3_V1:
65 if not id3tag.link(filename, version):
69 src_encoding = id3EncodingToString(id3tag.encoding)
71 for frame in id3tag.frames:
72 if hasattr(frame, "text"):
73 id3tag_set(frame, "text", src_encoding, dst_encoding)
74 elif hasattr(frame, "comment"):
75 id3tag_set(frame, "comment", src_encoding, dst_encoding)
77 title_frame = id3tag.getTitle()
81 except UnicodeEncodeError:
82 print title_frame.encode('latin1')
86 if id3tag.getVersion() == eyeD3.ID3_V2_2:
87 version = eyeD3.ID3_DEFAULT_VERSION
89 version = eyeD3.ID3_CURRENT_VERSION
90 id3tag.update(version=version)
91 utime(filename, (mtime, mtime))