1# -*- coding: utf-8 -*-
2
3import os
4
5from mutagen import MutagenError
6from mutagen.easymp4 import EasyMP4, error as MP4Error
7
8from tests import TestCase, DATA_DIR, get_temp_copy
9
10
11class TEasyMP4(TestCase):
12
13    def setUp(self):
14        self.filename = get_temp_copy(os.path.join(DATA_DIR, 'has-tags.m4a'))
15        self.mp4 = EasyMP4(self.filename)
16        self.mp4.delete()
17
18    def tearDown(self):
19        os.unlink(self.filename)
20
21    def test_no_tags(self):
22        audio = EasyMP4(os.path.join(DATA_DIR, 'no-tags.m4a'))
23        assert audio.tags is None
24        audio.add_tags()
25        assert audio.tags is not None
26
27    def test_padding(self):
28        assert self.mp4._padding == 1634
29        self.mp4.save(padding=lambda x: 42)
30        assert EasyMP4(self.mp4.filename)._padding == 42
31
32    def test_pprint(self):
33        self.mp4["artist"] = "baz"
34        self.mp4.pprint()
35
36    def test_has_key(self):
37        self.failIf("foo" in self.mp4)
38
39    def test_empty_file(self):
40        empty = os.path.join(DATA_DIR, 'emptyfile.mp3')
41        self.assertRaises(MP4Error, EasyMP4, filename=empty)
42
43    def test_nonexistent_file(self):
44        empty = os.path.join(DATA_DIR, 'does', 'not', 'exist')
45        self.assertRaises(MutagenError, EasyMP4, filename=empty)
46
47    def test_write_single(self):
48        for key in EasyMP4.Get:
49            if key in ["tracknumber", "discnumber", "date", "bpm"]:
50                continue
51
52            # Test creation
53            self.mp4[key] = "a test value"
54            self.mp4.save(self.filename)
55            mp4 = EasyMP4(self.filename)
56            self.failUnlessEqual(mp4[key], ["a test value"])
57            self.failUnlessEqual(mp4.keys(), [key])
58
59            # And non-creation setting.
60            self.mp4[key] = "a test value"
61            self.mp4.save(self.filename)
62            mp4 = EasyMP4(self.filename)
63            self.failUnlessEqual(mp4[key], ["a test value"])
64            self.failUnlessEqual(mp4.keys(), [key])
65
66            del(self.mp4[key])
67
68    def test_write_double(self):
69        for key in EasyMP4.Get:
70            if key in ["tracknumber", "discnumber", "date", "bpm"]:
71                continue
72
73            self.mp4[key] = ["a test", "value"]
74            self.mp4.save(self.filename)
75            mp4 = EasyMP4(self.filename)
76            self.failUnlessEqual(mp4.get(key), ["a test", "value"])
77            self.failUnlessEqual(mp4.keys(), [key])
78
79            self.mp4[key] = ["a test", "value"]
80            self.mp4.save(self.filename)
81            mp4 = EasyMP4(self.filename)
82            self.failUnlessEqual(mp4.get(key), ["a test", "value"])
83            self.failUnlessEqual(mp4.keys(), [key])
84
85            del(self.mp4[key])
86
87    def test_write_date(self):
88        self.mp4["date"] = "2004"
89        self.mp4.save(self.filename)
90        mp4 = EasyMP4(self.filename)
91        self.failUnlessEqual(mp4["date"], ["2004"])
92
93        self.mp4["date"] = "2004"
94        self.mp4.save(self.filename)
95        mp4 = EasyMP4(self.filename)
96        self.failUnlessEqual(mp4["date"], ["2004"])
97
98    def test_date_delete(self):
99        self.mp4["date"] = "2004"
100        self.failUnlessEqual(self.mp4["date"], ["2004"])
101        del(self.mp4["date"])
102        self.failIf("date" in self.mp4)
103
104    def test_write_date_double(self):
105        self.mp4["date"] = ["2004", "2005"]
106        self.mp4.save(self.filename)
107        mp4 = EasyMP4(self.filename)
108        self.failUnlessEqual(mp4["date"], ["2004", "2005"])
109
110        self.mp4["date"] = ["2004", "2005"]
111        self.mp4.save(self.filename)
112        mp4 = EasyMP4(self.filename)
113        self.failUnlessEqual(mp4["date"], ["2004", "2005"])
114
115    def test_write_invalid(self):
116        self.failUnlessRaises(ValueError, self.mp4.__getitem__, "notvalid")
117        self.failUnlessRaises(ValueError, self.mp4.__delitem__, "notvalid")
118        self.failUnlessRaises(
119            ValueError, self.mp4.__setitem__, "notvalid", "tests")
120
121    def test_numeric(self):
122        for tag in ["bpm"]:
123            self.mp4[tag] = "3"
124            self.failUnlessEqual(self.mp4[tag], ["3"])
125            self.mp4.save()
126            mp4 = EasyMP4(self.filename)
127            self.failUnlessEqual(mp4[tag], ["3"])
128
129            del(mp4[tag])
130            self.failIf(tag in mp4)
131            self.failUnlessRaises(KeyError, mp4.__delitem__, tag)
132
133            self.failUnlessRaises(
134                ValueError, self.mp4.__setitem__, tag, "hello")
135
136    def test_numeric_pairs(self):
137        for tag in ["tracknumber", "discnumber"]:
138            self.mp4[tag] = "3"
139            self.failUnlessEqual(self.mp4[tag], ["3"])
140            self.mp4.save()
141            mp4 = EasyMP4(self.filename)
142            self.failUnlessEqual(mp4[tag], ["3"])
143
144            del(mp4[tag])
145            self.failIf(tag in mp4)
146            self.failUnlessRaises(KeyError, mp4.__delitem__, tag)
147
148            self.mp4[tag] = "3/10"
149            self.failUnlessEqual(self.mp4[tag], ["3/10"])
150            self.mp4.save()
151            mp4 = EasyMP4(self.filename)
152            self.failUnlessEqual(mp4[tag], ["3/10"])
153
154            del(mp4[tag])
155            self.failIf(tag in mp4)
156            self.failUnlessRaises(KeyError, mp4.__delitem__, tag)
157
158            self.failUnlessRaises(
159                ValueError, self.mp4.__setitem__, tag, "hello")
160