]> git.phdru.name Git - audio-cdr-video.git/blob - audio/mp3/recode-id3.py
Initail import
[audio-cdr-video.git] / audio / mp3 / recode-id3.py
1 #! /usr/bin/env python
2
3 import sys
4 from os import utime
5 from os.path import getmtime
6 from getopt import getopt, GetoptError
7
8 import eyeD3
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
12
13
14 def usage(msg):
15     pname = sys.argv[0]
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)
18     sys.exit(1)
19
20 try:
21     optlist, args = getopt(sys.argv[1:], "f:t:",
22         ["from-encoding=", "to-encoding="]
23     )
24 except GetoptError:
25     usage("invalid option")
26
27
28 src_encoding = None
29 dst_encoding = None
30
31 for _opt, _arg in optlist:
32     if _opt in ('-f', '--from-encoding'):
33         src_encoding = _arg
34     elif _opt in ('-t', '--to-encoding'):
35         dst_encoding = _arg
36 try:
37     del _opt, _arg
38 except NameError:
39     pass
40
41 if not args:
42     usage("too few arguments")
43
44 if not dst_encoding:
45     from m_lib.defenc import default_encoding
46     dst_encoding = default_encoding
47
48
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
57         pass
58     else:
59         raise ValueError('Unknown encoding "%s"' % id3EncodingToString(frame.encoding))
60
61 for filename in args:
62     mtime = getmtime(filename)
63     for version in eyeD3.ID3_V2, eyeD3.ID3_V1:
64         id3tag = eyeD3.Tag()
65         if not id3tag.link(filename, version):
66             continue
67
68         if not src_encoding:
69             src_encoding = id3EncodingToString(id3tag.encoding)
70
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)
76
77         title_frame = id3tag.getTitle()
78         if title_frame:
79             try:
80                 print title_frame
81             except UnicodeEncodeError:
82                 print title_frame.encode('latin1')
83         else:
84             print filename
85
86         if id3tag.getVersion() == eyeD3.ID3_V2_2:
87             version = eyeD3.ID3_DEFAULT_VERSION
88         else:
89             version = eyeD3.ID3_CURRENT_VERSION
90         id3tag.update(version=version)
91     utime(filename, (mtime, mtime))