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