1# -*- coding: utf-8 -*-
2
3import os
4
5from mutagen._compat import cBytesIO
6from mutagen.oggtheora import OggTheora, OggTheoraInfo, delete, error
7from mutagen.ogg import OggPage
8
9from tests import TestCase, DATA_DIR, get_temp_copy
10from tests.test_ogg import TOggFileTypeMixin
11
12
13class TOggTheora(TestCase, TOggFileTypeMixin):
14    Kind = OggTheora
15
16    def setUp(self):
17        self.filename = get_temp_copy(
18            os.path.join(DATA_DIR, "sample.oggtheora"))
19
20        self.audio = OggTheora(self.filename)
21        self.audio2 = OggTheora(
22            os.path.join(DATA_DIR, "sample_length.oggtheora"))
23        self.audio3 = OggTheora(
24            os.path.join(DATA_DIR, "sample_bitrate.oggtheora"))
25
26    def tearDown(self):
27        os.unlink(self.filename)
28
29    def test_theora_bad_version(self):
30        with open(self.filename, "rb") as h:
31            page = OggPage(h)
32        packet = page.packets[0]
33        packet = packet[:7] + b"\x03\x00" + packet[9:]
34        page.packets = [packet]
35        fileobj = cBytesIO(page.write())
36        self.failUnlessRaises(error, OggTheoraInfo, fileobj)
37
38    def test_theora_not_first_page(self):
39        with open(self.filename, "rb") as h:
40            page = OggPage(h)
41        page.first = False
42        fileobj = cBytesIO(page.write())
43        self.failUnlessRaises(error, OggTheoraInfo, fileobj)
44
45    def test_vendor(self):
46        self.failUnless(
47            self.audio.tags.vendor.startswith("Xiph.Org libTheora"))
48        self.failUnlessRaises(KeyError, self.audio.tags.__getitem__, "vendor")
49
50    def test_not_my_ogg(self):
51        fn = os.path.join(DATA_DIR, 'empty.ogg')
52        self.failUnlessRaises(error, type(self.audio), fn)
53        self.failUnlessRaises(error, self.audio.save, fn)
54        self.failUnlessRaises(error, self.audio.delete, fn)
55
56    def test_length(self):
57        self.failUnlessAlmostEqual(5.5, self.audio.info.length, 1)
58        self.failUnlessAlmostEqual(0.75, self.audio2.info.length, 2)
59
60    def test_bitrate(self):
61        self.failUnlessEqual(16777215, self.audio3.info.bitrate)
62
63    def test_module_delete(self):
64        delete(self.filename)
65        self.scan_file()
66        self.failIf(OggTheora(self.filename).tags)
67
68    def test_mime(self):
69        self.failUnless("video/x-theora" in self.audio.mime)
70
71    def test_init_padding(self):
72        self.assertEqual(self.audio.tags._padding, 0)
73