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