1# -*- coding: utf-8 -*- 2 3import os 4 5from mutagen.id3 import ID3 6from mutagen._senf import fsnative as fsn 7from mutagen._compat import text_type 8 9from tests.test_tools import _TTools 10from tests import DATA_DIR, get_temp_copy 11 12 13AMBIGUOUS = b"\xc3\xae\xc3\xa5\xc3\xb4\xc3\xb2 \xc3\xa0\xc3\xa9\xc3\xa7\xc3" \ 14 b"\xa5\xc3\xa3 \xc3\xb9\xc3\xac \xc3\xab\xc3\xa5\xc3\xa5\xc3\xb8" \ 15 b"\xc3\xba" 16CODECS = ["utf8", "latin-1", "Windows-1255", "gbk"] 17 18 19class TMid3Iconv(_TTools): 20 21 TOOL_NAME = u"mid3iconv" 22 23 def setUp(self): 24 super(TMid3Iconv, self).setUp() 25 self.filename = get_temp_copy( 26 os.path.join(DATA_DIR, fsn(u'silence-44-s.mp3'))) 27 28 def tearDown(self): 29 super(TMid3Iconv, self).tearDown() 30 os.unlink(self.filename) 31 32 def test_noop(self): 33 res, out = self.call() 34 self.failIf(res) 35 self.failUnless("Usage:" in out) 36 37 def test_debug(self): 38 res, out = self.call(fsn(u"-d"), fsn(u"-p"), self.filename) 39 self.failIf(res) 40 self.assertFalse("b'" in out) 41 self.failUnless("TCON=Silence" in out) 42 43 def test_quiet(self): 44 res, out = self.call(fsn(u"-q"), self.filename) 45 self.failIf(res) 46 self.failIf(out) 47 48 def test_test_data(self): 49 results = set() 50 for codec in CODECS: 51 results.add(AMBIGUOUS.decode(codec)) 52 self.failUnlessEqual(len(results), len(CODECS)) 53 54 def test_conv_basic(self): 55 from mutagen.id3 import TALB 56 57 for codec in CODECS: 58 f = ID3(self.filename) 59 f.add(TALB(text=[AMBIGUOUS.decode("latin-1")], encoding=0)) 60 f.save() 61 res, out = self.call( 62 fsn(u"-d"), fsn(u"-e"), fsn(text_type(codec)), self.filename) 63 f = ID3(self.filename) 64 self.failUnlessEqual(f["TALB"].encoding, 1) 65 self.failUnlessEqual(f["TALB"].text[0], AMBIGUOUS.decode(codec)) 66 67 def test_comm(self): 68 from mutagen.id3 import COMM 69 70 for codec in CODECS: 71 f = ID3(self.filename) 72 frame = COMM(desc="", lang="eng", encoding=0, 73 text=[AMBIGUOUS.decode("latin-1")]) 74 f.add(frame) 75 f.save() 76 res, out = self.call( 77 fsn(u"-d"), fsn(u"-e"), fsn(text_type(codec)), self.filename) 78 f = ID3(self.filename) 79 new_frame = f[frame.HashKey] 80 self.failUnlessEqual(new_frame.encoding, 1) 81 self.failUnlessEqual(new_frame.text[0], AMBIGUOUS.decode(codec)) 82 83 def test_remove_v1(self): 84 from mutagen.id3 import ParseID3v1 85 res, out = self.call(fsn(u"--remove-v1"), self.filename) 86 87 with open(self.filename, "rb") as h: 88 h.seek(-128, 2) 89 data = h.read() 90 self.failUnlessEqual(len(data), 128) 91 self.failIf(ParseID3v1(data)) 92