Move common libs to libs/common

This commit is contained in:
Labrys of Knossos 2018-12-16 13:30:24 -05:00
commit 1f4bd41bcc
1612 changed files with 962 additions and 10 deletions

View file

@ -0,0 +1,10 @@
# -*- coding: utf-8 -*-
from . import test_mkv, test_parsers
import unittest
suite = unittest.TestSuite([test_mkv.suite(), test_parsers.suite()])
if __name__ == '__main__':
unittest.TextTestRunner().run(suite)

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,607 @@
# -*- coding: utf-8 -*-
from datetime import timedelta, datetime
from enzyme.mkv import MKV, VIDEO_TRACK, AUDIO_TRACK, SUBTITLE_TRACK
import io
import os.path
import requests
import unittest
import zipfile
# Test directory
TEST_DIR = os.path.join(os.path.dirname(__file__), os.path.splitext(__file__)[0])
def setUpModule():
if not os.path.exists(TEST_DIR):
r = requests.get('http://downloads.sourceforge.net/project/matroska/test_files/matroska_test_w1_1.zip')
with zipfile.ZipFile(io.BytesIO(r.content), 'r') as f:
f.extractall(TEST_DIR)
class MKVTestCase(unittest.TestCase):
def test_test1(self):
stream = io.open(os.path.join(TEST_DIR, 'test1.mkv'), 'rb')
mkv = MKV(stream)
# info
self.assertTrue(mkv.info.title is None)
self.assertTrue(mkv.info.duration == timedelta(minutes=1, seconds=27, milliseconds=336))
self.assertTrue(mkv.info.date_utc == datetime(2010, 8, 21, 7, 23, 3))
self.assertTrue(mkv.info.muxing_app == 'libebml2 v0.10.0 + libmatroska2 v0.10.1')
self.assertTrue(mkv.info.writing_app == 'mkclean 0.5.5 ru from libebml v1.0.0 + libmatroska v1.0.0 + mkvmerge v4.1.1 (\'Bouncin\' Back\') built on Jul 3 2010 22:54:08')
# video track
self.assertTrue(len(mkv.video_tracks) == 1)
self.assertTrue(mkv.video_tracks[0].type == VIDEO_TRACK)
self.assertTrue(mkv.video_tracks[0].number == 1)
self.assertTrue(mkv.video_tracks[0].name is None)
self.assertTrue(mkv.video_tracks[0].language == 'und')
self.assertTrue(mkv.video_tracks[0].enabled == True)
self.assertTrue(mkv.video_tracks[0].default == True)
self.assertTrue(mkv.video_tracks[0].forced == False)
self.assertTrue(mkv.video_tracks[0].lacing == False)
self.assertTrue(mkv.video_tracks[0].codec_id == 'V_MS/VFW/FOURCC')
self.assertTrue(mkv.video_tracks[0].codec_name is None)
self.assertTrue(mkv.video_tracks[0].width == 854)
self.assertTrue(mkv.video_tracks[0].height == 480)
self.assertTrue(mkv.video_tracks[0].interlaced == False)
self.assertTrue(mkv.video_tracks[0].stereo_mode is None)
self.assertTrue(mkv.video_tracks[0].crop == {})
self.assertTrue(mkv.video_tracks[0].display_width is None)
self.assertTrue(mkv.video_tracks[0].display_height is None)
self.assertTrue(mkv.video_tracks[0].display_unit is None)
self.assertTrue(mkv.video_tracks[0].aspect_ratio_type is None)
# audio track
self.assertTrue(len(mkv.audio_tracks) == 1)
self.assertTrue(mkv.audio_tracks[0].type == AUDIO_TRACK)
self.assertTrue(mkv.audio_tracks[0].number == 2)
self.assertTrue(mkv.audio_tracks[0].name is None)
self.assertTrue(mkv.audio_tracks[0].language == 'und')
self.assertTrue(mkv.audio_tracks[0].enabled == True)
self.assertTrue(mkv.audio_tracks[0].default == True)
self.assertTrue(mkv.audio_tracks[0].forced == False)
self.assertTrue(mkv.audio_tracks[0].lacing == True)
self.assertTrue(mkv.audio_tracks[0].codec_id == 'A_MPEG/L3')
self.assertTrue(mkv.audio_tracks[0].codec_name is None)
self.assertTrue(mkv.audio_tracks[0].sampling_frequency == 48000.0)
self.assertTrue(mkv.audio_tracks[0].channels == 2)
self.assertTrue(mkv.audio_tracks[0].output_sampling_frequency is None)
self.assertTrue(mkv.audio_tracks[0].bit_depth is None)
# subtitle track
self.assertTrue(len(mkv.subtitle_tracks) == 0)
# chapters
self.assertTrue(len(mkv.chapters) == 0)
# tags
self.assertTrue(len(mkv.tags) == 1)
self.assertTrue(len(mkv.tags[0].simpletags) == 3)
self.assertTrue(mkv.tags[0].simpletags[0].name == 'TITLE')
self.assertTrue(mkv.tags[0].simpletags[0].default == True)
self.assertTrue(mkv.tags[0].simpletags[0].language == 'und')
self.assertTrue(mkv.tags[0].simpletags[0].string == 'Big Buck Bunny - test 1')
self.assertTrue(mkv.tags[0].simpletags[0].binary is None)
self.assertTrue(mkv.tags[0].simpletags[1].name == 'DATE_RELEASED')
self.assertTrue(mkv.tags[0].simpletags[1].default == True)
self.assertTrue(mkv.tags[0].simpletags[1].language == 'und')
self.assertTrue(mkv.tags[0].simpletags[1].string == '2010')
self.assertTrue(mkv.tags[0].simpletags[1].binary is None)
self.assertTrue(mkv.tags[0].simpletags[2].name == 'COMMENT')
self.assertTrue(mkv.tags[0].simpletags[2].default == True)
self.assertTrue(mkv.tags[0].simpletags[2].language == 'und')
self.assertTrue(mkv.tags[0].simpletags[2].string == 'Matroska Validation File1, basic MPEG4.2 and MP3 with only SimpleBlock')
self.assertTrue(mkv.tags[0].simpletags[2].binary is None)
def test_test2(self):
stream = io.open(os.path.join(TEST_DIR, 'test2.mkv'), 'rb')
mkv = MKV(stream)
# info
self.assertTrue(mkv.info.title is None)
self.assertTrue(mkv.info.duration == timedelta(seconds=47, milliseconds=509))
self.assertTrue(mkv.info.date_utc == datetime(2011, 6, 2, 12, 45, 20))
self.assertTrue(mkv.info.muxing_app == 'libebml2 v0.21.0 + libmatroska2 v0.22.1')
self.assertTrue(mkv.info.writing_app == 'mkclean 0.8.3 ru from libebml2 v0.10.0 + libmatroska2 v0.10.1 + mkclean 0.5.5 ru from libebml v1.0.0 + libmatroska v1.0.0 + mkvmerge v4.1.1 (\'Bouncin\' Back\') built on Jul 3 2010 22:54:08')
# video track
self.assertTrue(len(mkv.video_tracks) == 1)
self.assertTrue(mkv.video_tracks[0].type == VIDEO_TRACK)
self.assertTrue(mkv.video_tracks[0].number == 1)
self.assertTrue(mkv.video_tracks[0].name is None)
self.assertTrue(mkv.video_tracks[0].language == 'und')
self.assertTrue(mkv.video_tracks[0].enabled == True)
self.assertTrue(mkv.video_tracks[0].default == True)
self.assertTrue(mkv.video_tracks[0].forced == False)
self.assertTrue(mkv.video_tracks[0].lacing == False)
self.assertTrue(mkv.video_tracks[0].codec_id == 'V_MPEG4/ISO/AVC')
self.assertTrue(mkv.video_tracks[0].codec_name is None)
self.assertTrue(mkv.video_tracks[0].width == 1024)
self.assertTrue(mkv.video_tracks[0].height == 576)
self.assertTrue(mkv.video_tracks[0].interlaced == False)
self.assertTrue(mkv.video_tracks[0].stereo_mode is None)
self.assertTrue(mkv.video_tracks[0].crop == {})
self.assertTrue(mkv.video_tracks[0].display_width == 1354)
self.assertTrue(mkv.video_tracks[0].display_height is None)
self.assertTrue(mkv.video_tracks[0].display_unit is None)
self.assertTrue(mkv.video_tracks[0].aspect_ratio_type is None)
# audio track
self.assertTrue(len(mkv.audio_tracks) == 1)
self.assertTrue(mkv.audio_tracks[0].type == AUDIO_TRACK)
self.assertTrue(mkv.audio_tracks[0].number == 2)
self.assertTrue(mkv.audio_tracks[0].name is None)
self.assertTrue(mkv.audio_tracks[0].language == 'und')
self.assertTrue(mkv.audio_tracks[0].enabled == True)
self.assertTrue(mkv.audio_tracks[0].default == True)
self.assertTrue(mkv.audio_tracks[0].forced == False)
self.assertTrue(mkv.audio_tracks[0].lacing == True)
self.assertTrue(mkv.audio_tracks[0].codec_id == 'A_AAC')
self.assertTrue(mkv.audio_tracks[0].codec_name is None)
self.assertTrue(mkv.audio_tracks[0].sampling_frequency == 48000.0)
self.assertTrue(mkv.audio_tracks[0].channels == 2)
self.assertTrue(mkv.audio_tracks[0].output_sampling_frequency is None)
self.assertTrue(mkv.audio_tracks[0].bit_depth is None)
# subtitle track
self.assertTrue(len(mkv.subtitle_tracks) == 0)
# chapters
self.assertTrue(len(mkv.chapters) == 0)
# tags
self.assertTrue(len(mkv.tags) == 1)
self.assertTrue(len(mkv.tags[0].simpletags) == 3)
self.assertTrue(mkv.tags[0].simpletags[0].name == 'TITLE')
self.assertTrue(mkv.tags[0].simpletags[0].default == True)
self.assertTrue(mkv.tags[0].simpletags[0].language == 'und')
self.assertTrue(mkv.tags[0].simpletags[0].string == 'Elephant Dream - test 2')
self.assertTrue(mkv.tags[0].simpletags[0].binary is None)
self.assertTrue(mkv.tags[0].simpletags[1].name == 'DATE_RELEASED')
self.assertTrue(mkv.tags[0].simpletags[1].default == True)
self.assertTrue(mkv.tags[0].simpletags[1].language == 'und')
self.assertTrue(mkv.tags[0].simpletags[1].string == '2010')
self.assertTrue(mkv.tags[0].simpletags[1].binary is None)
self.assertTrue(mkv.tags[0].simpletags[2].name == 'COMMENT')
self.assertTrue(mkv.tags[0].simpletags[2].default == True)
self.assertTrue(mkv.tags[0].simpletags[2].language == 'und')
self.assertTrue(mkv.tags[0].simpletags[2].string == 'Matroska Validation File 2, 100,000 timecode scale, odd aspect ratio, and CRC-32. Codecs are AVC and AAC')
self.assertTrue(mkv.tags[0].simpletags[2].binary is None)
def test_test3(self):
stream = io.open(os.path.join(TEST_DIR, 'test3.mkv'), 'rb')
mkv = MKV(stream)
# info
self.assertTrue(mkv.info.title is None)
self.assertTrue(mkv.info.duration == timedelta(seconds=49, milliseconds=64))
self.assertTrue(mkv.info.date_utc == datetime(2010, 8, 21, 21, 43, 25))
self.assertTrue(mkv.info.muxing_app == 'libebml2 v0.11.0 + libmatroska2 v0.10.1')
self.assertTrue(mkv.info.writing_app == 'mkclean 0.5.5 ro from libebml v1.0.0 + libmatroska v1.0.0 + mkvmerge v4.1.1 (\'Bouncin\' Back\') built on Jul 3 2010 22:54:08')
# video track
self.assertTrue(len(mkv.video_tracks) == 1)
self.assertTrue(mkv.video_tracks[0].type == VIDEO_TRACK)
self.assertTrue(mkv.video_tracks[0].number == 1)
self.assertTrue(mkv.video_tracks[0].name is None)
self.assertTrue(mkv.video_tracks[0].language == 'und')
self.assertTrue(mkv.video_tracks[0].enabled == True)
self.assertTrue(mkv.video_tracks[0].default == True)
self.assertTrue(mkv.video_tracks[0].forced == False)
self.assertTrue(mkv.video_tracks[0].lacing == False)
self.assertTrue(mkv.video_tracks[0].codec_id == 'V_MPEG4/ISO/AVC')
self.assertTrue(mkv.video_tracks[0].codec_name is None)
self.assertTrue(mkv.video_tracks[0].width == 1024)
self.assertTrue(mkv.video_tracks[0].height == 576)
self.assertTrue(mkv.video_tracks[0].interlaced == False)
self.assertTrue(mkv.video_tracks[0].stereo_mode is None)
self.assertTrue(mkv.video_tracks[0].crop == {})
self.assertTrue(mkv.video_tracks[0].display_width is None)
self.assertTrue(mkv.video_tracks[0].display_height is None)
self.assertTrue(mkv.video_tracks[0].display_unit is None)
self.assertTrue(mkv.video_tracks[0].aspect_ratio_type is None)
# audio track
self.assertTrue(len(mkv.audio_tracks) == 1)
self.assertTrue(mkv.audio_tracks[0].type == AUDIO_TRACK)
self.assertTrue(mkv.audio_tracks[0].number == 2)
self.assertTrue(mkv.audio_tracks[0].name is None)
self.assertTrue(mkv.audio_tracks[0].language is None)
self.assertTrue(mkv.audio_tracks[0].enabled == True)
self.assertTrue(mkv.audio_tracks[0].default == True)
self.assertTrue(mkv.audio_tracks[0].forced == False)
self.assertTrue(mkv.audio_tracks[0].lacing == True)
self.assertTrue(mkv.audio_tracks[0].codec_id == 'A_MPEG/L3')
self.assertTrue(mkv.audio_tracks[0].codec_name is None)
self.assertTrue(mkv.audio_tracks[0].sampling_frequency == 48000.0)
self.assertTrue(mkv.audio_tracks[0].channels == 2)
self.assertTrue(mkv.audio_tracks[0].output_sampling_frequency is None)
self.assertTrue(mkv.audio_tracks[0].bit_depth is None)
# subtitle track
self.assertTrue(len(mkv.subtitle_tracks) == 0)
# chapters
self.assertTrue(len(mkv.chapters) == 0)
# tags
self.assertTrue(len(mkv.tags) == 1)
self.assertTrue(len(mkv.tags[0].simpletags) == 3)
self.assertTrue(mkv.tags[0].simpletags[0].name == 'TITLE')
self.assertTrue(mkv.tags[0].simpletags[0].default == True)
self.assertTrue(mkv.tags[0].simpletags[0].language == 'und')
self.assertTrue(mkv.tags[0].simpletags[0].string == 'Elephant Dream - test 3')
self.assertTrue(mkv.tags[0].simpletags[0].binary is None)
self.assertTrue(mkv.tags[0].simpletags[1].name == 'DATE_RELEASED')
self.assertTrue(mkv.tags[0].simpletags[1].default == True)
self.assertTrue(mkv.tags[0].simpletags[1].language == 'und')
self.assertTrue(mkv.tags[0].simpletags[1].string == '2010')
self.assertTrue(mkv.tags[0].simpletags[1].binary is None)
self.assertTrue(mkv.tags[0].simpletags[2].name == 'COMMENT')
self.assertTrue(mkv.tags[0].simpletags[2].default == True)
self.assertTrue(mkv.tags[0].simpletags[2].language == 'und')
self.assertTrue(mkv.tags[0].simpletags[2].string == 'Matroska Validation File 3, header stripping on the video track and no SimpleBlock')
self.assertTrue(mkv.tags[0].simpletags[2].binary is None)
def test_test5(self):
stream = io.open(os.path.join(TEST_DIR, 'test5.mkv'), 'rb')
mkv = MKV(stream)
# info
self.assertTrue(mkv.info.title is None)
self.assertTrue(mkv.info.duration == timedelta(seconds=46, milliseconds=665))
self.assertTrue(mkv.info.date_utc == datetime(2010, 8, 21, 18, 6, 43))
self.assertTrue(mkv.info.muxing_app == 'libebml v1.0.0 + libmatroska v1.0.0')
self.assertTrue(mkv.info.writing_app == 'mkvmerge v4.0.0 (\'The Stars were mine\') built on Jun 6 2010 16:18:42')
# video track
self.assertTrue(len(mkv.video_tracks) == 1)
self.assertTrue(mkv.video_tracks[0].type == VIDEO_TRACK)
self.assertTrue(mkv.video_tracks[0].number == 1)
self.assertTrue(mkv.video_tracks[0].name is None)
self.assertTrue(mkv.video_tracks[0].language == 'und')
self.assertTrue(mkv.video_tracks[0].enabled == True)
self.assertTrue(mkv.video_tracks[0].default == True)
self.assertTrue(mkv.video_tracks[0].forced == False)
self.assertTrue(mkv.video_tracks[0].lacing == False)
self.assertTrue(mkv.video_tracks[0].codec_id == 'V_MPEG4/ISO/AVC')
self.assertTrue(mkv.video_tracks[0].codec_name is None)
self.assertTrue(mkv.video_tracks[0].width == 1024)
self.assertTrue(mkv.video_tracks[0].height == 576)
self.assertTrue(mkv.video_tracks[0].interlaced == False)
self.assertTrue(mkv.video_tracks[0].stereo_mode is None)
self.assertTrue(mkv.video_tracks[0].crop == {})
self.assertTrue(mkv.video_tracks[0].display_width == 1024)
self.assertTrue(mkv.video_tracks[0].display_height == 576)
self.assertTrue(mkv.video_tracks[0].display_unit is None)
self.assertTrue(mkv.video_tracks[0].aspect_ratio_type is None)
# audio tracks
self.assertTrue(len(mkv.audio_tracks) == 2)
self.assertTrue(mkv.audio_tracks[0].type == AUDIO_TRACK)
self.assertTrue(mkv.audio_tracks[0].number == 2)
self.assertTrue(mkv.audio_tracks[0].name is None)
self.assertTrue(mkv.audio_tracks[0].language == 'und')
self.assertTrue(mkv.audio_tracks[0].enabled == True)
self.assertTrue(mkv.audio_tracks[0].default == True)
self.assertTrue(mkv.audio_tracks[0].forced == False)
self.assertTrue(mkv.audio_tracks[0].lacing == True)
self.assertTrue(mkv.audio_tracks[0].codec_id == 'A_AAC')
self.assertTrue(mkv.audio_tracks[0].codec_name is None)
self.assertTrue(mkv.audio_tracks[0].sampling_frequency == 48000.0)
self.assertTrue(mkv.audio_tracks[0].channels == 2)
self.assertTrue(mkv.audio_tracks[0].output_sampling_frequency is None)
self.assertTrue(mkv.audio_tracks[0].bit_depth is None)
self.assertTrue(mkv.audio_tracks[1].type == AUDIO_TRACK)
self.assertTrue(mkv.audio_tracks[1].number == 10)
self.assertTrue(mkv.audio_tracks[1].name == 'Commentary')
self.assertTrue(mkv.audio_tracks[1].language is None)
self.assertTrue(mkv.audio_tracks[1].enabled == True)
self.assertTrue(mkv.audio_tracks[1].default == False)
self.assertTrue(mkv.audio_tracks[1].forced == False)
self.assertTrue(mkv.audio_tracks[1].lacing == True)
self.assertTrue(mkv.audio_tracks[1].codec_id == 'A_AAC')
self.assertTrue(mkv.audio_tracks[1].codec_name is None)
self.assertTrue(mkv.audio_tracks[1].sampling_frequency == 22050.0)
self.assertTrue(mkv.audio_tracks[1].channels == 1)
self.assertTrue(mkv.audio_tracks[1].output_sampling_frequency == 44100.0)
self.assertTrue(mkv.audio_tracks[1].bit_depth is None)
# subtitle track
self.assertTrue(len(mkv.subtitle_tracks) == 8)
self.assertTrue(mkv.subtitle_tracks[0].type == SUBTITLE_TRACK)
self.assertTrue(mkv.subtitle_tracks[0].number == 3)
self.assertTrue(mkv.subtitle_tracks[0].name is None)
self.assertTrue(mkv.subtitle_tracks[0].language is None)
self.assertTrue(mkv.subtitle_tracks[0].enabled == True)
self.assertTrue(mkv.subtitle_tracks[0].default == True)
self.assertTrue(mkv.subtitle_tracks[0].forced == False)
self.assertTrue(mkv.subtitle_tracks[0].lacing == False)
self.assertTrue(mkv.subtitle_tracks[0].codec_id == 'S_TEXT/UTF8')
self.assertTrue(mkv.subtitle_tracks[0].codec_name is None)
self.assertTrue(mkv.subtitle_tracks[1].type == SUBTITLE_TRACK)
self.assertTrue(mkv.subtitle_tracks[1].number == 4)
self.assertTrue(mkv.subtitle_tracks[1].name is None)
self.assertTrue(mkv.subtitle_tracks[1].language == 'hun')
self.assertTrue(mkv.subtitle_tracks[1].enabled == True)
self.assertTrue(mkv.subtitle_tracks[1].default == False)
self.assertTrue(mkv.subtitle_tracks[1].forced == False)
self.assertTrue(mkv.subtitle_tracks[1].lacing == False)
self.assertTrue(mkv.subtitle_tracks[1].codec_id == 'S_TEXT/UTF8')
self.assertTrue(mkv.subtitle_tracks[1].codec_name is None)
self.assertTrue(mkv.subtitle_tracks[2].type == SUBTITLE_TRACK)
self.assertTrue(mkv.subtitle_tracks[2].number == 5)
self.assertTrue(mkv.subtitle_tracks[2].name is None)
self.assertTrue(mkv.subtitle_tracks[2].language == 'ger')
self.assertTrue(mkv.subtitle_tracks[2].enabled == True)
self.assertTrue(mkv.subtitle_tracks[2].default == False)
self.assertTrue(mkv.subtitle_tracks[2].forced == False)
self.assertTrue(mkv.subtitle_tracks[2].lacing == False)
self.assertTrue(mkv.subtitle_tracks[2].codec_id == 'S_TEXT/UTF8')
self.assertTrue(mkv.subtitle_tracks[2].codec_name is None)
self.assertTrue(mkv.subtitle_tracks[3].type == SUBTITLE_TRACK)
self.assertTrue(mkv.subtitle_tracks[3].number == 6)
self.assertTrue(mkv.subtitle_tracks[3].name is None)
self.assertTrue(mkv.subtitle_tracks[3].language == 'fre')
self.assertTrue(mkv.subtitle_tracks[3].enabled == True)
self.assertTrue(mkv.subtitle_tracks[3].default == False)
self.assertTrue(mkv.subtitle_tracks[3].forced == False)
self.assertTrue(mkv.subtitle_tracks[3].lacing == False)
self.assertTrue(mkv.subtitle_tracks[3].codec_id == 'S_TEXT/UTF8')
self.assertTrue(mkv.subtitle_tracks[3].codec_name is None)
self.assertTrue(mkv.subtitle_tracks[4].type == SUBTITLE_TRACK)
self.assertTrue(mkv.subtitle_tracks[4].number == 8)
self.assertTrue(mkv.subtitle_tracks[4].name is None)
self.assertTrue(mkv.subtitle_tracks[4].language == 'spa')
self.assertTrue(mkv.subtitle_tracks[4].enabled == True)
self.assertTrue(mkv.subtitle_tracks[4].default == False)
self.assertTrue(mkv.subtitle_tracks[4].forced == False)
self.assertTrue(mkv.subtitle_tracks[4].lacing == False)
self.assertTrue(mkv.subtitle_tracks[4].codec_id == 'S_TEXT/UTF8')
self.assertTrue(mkv.subtitle_tracks[4].codec_name is None)
self.assertTrue(mkv.subtitle_tracks[5].type == SUBTITLE_TRACK)
self.assertTrue(mkv.subtitle_tracks[5].number == 9)
self.assertTrue(mkv.subtitle_tracks[5].name is None)
self.assertTrue(mkv.subtitle_tracks[5].language == 'ita')
self.assertTrue(mkv.subtitle_tracks[5].enabled == True)
self.assertTrue(mkv.subtitle_tracks[5].default == False)
self.assertTrue(mkv.subtitle_tracks[5].forced == False)
self.assertTrue(mkv.subtitle_tracks[5].lacing == False)
self.assertTrue(mkv.subtitle_tracks[5].codec_id == 'S_TEXT/UTF8')
self.assertTrue(mkv.subtitle_tracks[5].codec_name is None)
self.assertTrue(mkv.subtitle_tracks[6].type == SUBTITLE_TRACK)
self.assertTrue(mkv.subtitle_tracks[6].number == 11)
self.assertTrue(mkv.subtitle_tracks[6].name is None)
self.assertTrue(mkv.subtitle_tracks[6].language == 'jpn')
self.assertTrue(mkv.subtitle_tracks[6].enabled == True)
self.assertTrue(mkv.subtitle_tracks[6].default == False)
self.assertTrue(mkv.subtitle_tracks[6].forced == False)
self.assertTrue(mkv.subtitle_tracks[6].lacing == False)
self.assertTrue(mkv.subtitle_tracks[6].codec_id == 'S_TEXT/UTF8')
self.assertTrue(mkv.subtitle_tracks[6].codec_name is None)
self.assertTrue(mkv.subtitle_tracks[7].type == SUBTITLE_TRACK)
self.assertTrue(mkv.subtitle_tracks[7].number == 7)
self.assertTrue(mkv.subtitle_tracks[7].name is None)
self.assertTrue(mkv.subtitle_tracks[7].language == 'und')
self.assertTrue(mkv.subtitle_tracks[7].enabled == True)
self.assertTrue(mkv.subtitle_tracks[7].default == False)
self.assertTrue(mkv.subtitle_tracks[7].forced == False)
self.assertTrue(mkv.subtitle_tracks[7].lacing == False)
self.assertTrue(mkv.subtitle_tracks[7].codec_id == 'S_TEXT/UTF8')
self.assertTrue(mkv.subtitle_tracks[7].codec_name is None)
# chapters
self.assertTrue(len(mkv.chapters) == 0)
# tags
self.assertTrue(len(mkv.tags) == 1)
self.assertTrue(len(mkv.tags[0].simpletags) == 3)
self.assertTrue(mkv.tags[0].simpletags[0].name == 'TITLE')
self.assertTrue(mkv.tags[0].simpletags[0].default == True)
self.assertTrue(mkv.tags[0].simpletags[0].language == 'und')
self.assertTrue(mkv.tags[0].simpletags[0].string == 'Big Buck Bunny - test 8')
self.assertTrue(mkv.tags[0].simpletags[0].binary is None)
self.assertTrue(mkv.tags[0].simpletags[1].name == 'DATE_RELEASED')
self.assertTrue(mkv.tags[0].simpletags[1].default == True)
self.assertTrue(mkv.tags[0].simpletags[1].language == 'und')
self.assertTrue(mkv.tags[0].simpletags[1].string == '2010')
self.assertTrue(mkv.tags[0].simpletags[1].binary is None)
self.assertTrue(mkv.tags[0].simpletags[2].name == 'COMMENT')
self.assertTrue(mkv.tags[0].simpletags[2].default == True)
self.assertTrue(mkv.tags[0].simpletags[2].language == 'und')
self.assertTrue(mkv.tags[0].simpletags[2].string == 'Matroska Validation File 8, secondary audio commentary track, misc subtitle tracks')
self.assertTrue(mkv.tags[0].simpletags[2].binary is None)
def test_test6(self):
stream = io.open(os.path.join(TEST_DIR, 'test6.mkv'), 'rb')
mkv = MKV(stream)
# info
self.assertTrue(mkv.info.title is None)
self.assertTrue(mkv.info.duration == timedelta(seconds=87, milliseconds=336))
self.assertTrue(mkv.info.date_utc == datetime(2010, 8, 21, 16, 31, 55))
self.assertTrue(mkv.info.muxing_app == 'libebml2 v0.10.1 + libmatroska2 v0.10.1')
self.assertTrue(mkv.info.writing_app == 'mkclean 0.5.5 r from libebml v1.0.0 + libmatroska v1.0.0 + mkvmerge v4.0.0 (\'The Stars were mine\') built on Jun 6 2010 16:18:42')
# video track
self.assertTrue(len(mkv.video_tracks) == 1)
self.assertTrue(mkv.video_tracks[0].type == VIDEO_TRACK)
self.assertTrue(mkv.video_tracks[0].number == 1)
self.assertTrue(mkv.video_tracks[0].name is None)
self.assertTrue(mkv.video_tracks[0].language == 'und')
self.assertTrue(mkv.video_tracks[0].enabled == True)
self.assertTrue(mkv.video_tracks[0].default == False)
self.assertTrue(mkv.video_tracks[0].forced == False)
self.assertTrue(mkv.video_tracks[0].lacing == False)
self.assertTrue(mkv.video_tracks[0].codec_id == 'V_MS/VFW/FOURCC')
self.assertTrue(mkv.video_tracks[0].codec_name is None)
self.assertTrue(mkv.video_tracks[0].width == 854)
self.assertTrue(mkv.video_tracks[0].height == 480)
self.assertTrue(mkv.video_tracks[0].interlaced == False)
self.assertTrue(mkv.video_tracks[0].stereo_mode is None)
self.assertTrue(mkv.video_tracks[0].crop == {})
self.assertTrue(mkv.video_tracks[0].display_width is None)
self.assertTrue(mkv.video_tracks[0].display_height is None)
self.assertTrue(mkv.video_tracks[0].display_unit is None)
self.assertTrue(mkv.video_tracks[0].aspect_ratio_type is None)
# audio track
self.assertTrue(len(mkv.audio_tracks) == 1)
self.assertTrue(mkv.audio_tracks[0].type == AUDIO_TRACK)
self.assertTrue(mkv.audio_tracks[0].number == 2)
self.assertTrue(mkv.audio_tracks[0].name is None)
self.assertTrue(mkv.audio_tracks[0].language == 'und')
self.assertTrue(mkv.audio_tracks[0].enabled == True)
self.assertTrue(mkv.audio_tracks[0].default == False)
self.assertTrue(mkv.audio_tracks[0].forced == False)
self.assertTrue(mkv.audio_tracks[0].lacing == True)
self.assertTrue(mkv.audio_tracks[0].codec_id == 'A_MPEG/L3')
self.assertTrue(mkv.audio_tracks[0].codec_name is None)
self.assertTrue(mkv.audio_tracks[0].sampling_frequency == 48000.0)
self.assertTrue(mkv.audio_tracks[0].channels == 2)
self.assertTrue(mkv.audio_tracks[0].output_sampling_frequency is None)
self.assertTrue(mkv.audio_tracks[0].bit_depth is None)
# subtitle track
self.assertTrue(len(mkv.subtitle_tracks) == 0)
# chapters
self.assertTrue(len(mkv.chapters) == 0)
# tags
self.assertTrue(len(mkv.tags) == 1)
self.assertTrue(len(mkv.tags[0].simpletags) == 3)
self.assertTrue(mkv.tags[0].simpletags[0].name == 'TITLE')
self.assertTrue(mkv.tags[0].simpletags[0].default == True)
self.assertTrue(mkv.tags[0].simpletags[0].language == 'und')
self.assertTrue(mkv.tags[0].simpletags[0].string == 'Big Buck Bunny - test 6')
self.assertTrue(mkv.tags[0].simpletags[0].binary is None)
self.assertTrue(mkv.tags[0].simpletags[1].name == 'DATE_RELEASED')
self.assertTrue(mkv.tags[0].simpletags[1].default == True)
self.assertTrue(mkv.tags[0].simpletags[1].language == 'und')
self.assertTrue(mkv.tags[0].simpletags[1].string == '2010')
self.assertTrue(mkv.tags[0].simpletags[1].binary is None)
self.assertTrue(mkv.tags[0].simpletags[2].name == 'COMMENT')
self.assertTrue(mkv.tags[0].simpletags[2].default == True)
self.assertTrue(mkv.tags[0].simpletags[2].language == 'und')
self.assertTrue(mkv.tags[0].simpletags[2].string == 'Matroska Validation File 6, random length to code the size of Clusters and Blocks, no Cues for seeking')
self.assertTrue(mkv.tags[0].simpletags[2].binary is None)
def test_test7(self):
stream = io.open(os.path.join(TEST_DIR, 'test7.mkv'), 'rb')
mkv = MKV(stream)
# info
self.assertTrue(mkv.info.title is None)
self.assertTrue(mkv.info.duration == timedelta(seconds=37, milliseconds=43))
self.assertTrue(mkv.info.date_utc == datetime(2010, 8, 21, 17, 0, 23))
self.assertTrue(mkv.info.muxing_app == 'libebml2 v0.10.1 + libmatroska2 v0.10.1')
self.assertTrue(mkv.info.writing_app == 'mkclean 0.5.5 r from libebml v1.0.0 + libmatroska v1.0.0 + mkvmerge v4.0.0 (\'The Stars were mine\') built on Jun 6 2010 16:18:42')
# video track
self.assertTrue(len(mkv.video_tracks) == 1)
self.assertTrue(mkv.video_tracks[0].type == VIDEO_TRACK)
self.assertTrue(mkv.video_tracks[0].number == 1)
self.assertTrue(mkv.video_tracks[0].name is None)
self.assertTrue(mkv.video_tracks[0].language == 'und')
self.assertTrue(mkv.video_tracks[0].enabled == True)
self.assertTrue(mkv.video_tracks[0].default == False)
self.assertTrue(mkv.video_tracks[0].forced == False)
self.assertTrue(mkv.video_tracks[0].lacing == False)
self.assertTrue(mkv.video_tracks[0].codec_id == 'V_MPEG4/ISO/AVC')
self.assertTrue(mkv.video_tracks[0].codec_name is None)
self.assertTrue(mkv.video_tracks[0].width == 1024)
self.assertTrue(mkv.video_tracks[0].height == 576)
self.assertTrue(mkv.video_tracks[0].interlaced == False)
self.assertTrue(mkv.video_tracks[0].stereo_mode is None)
self.assertTrue(mkv.video_tracks[0].crop == {})
self.assertTrue(mkv.video_tracks[0].display_width is None)
self.assertTrue(mkv.video_tracks[0].display_height is None)
self.assertTrue(mkv.video_tracks[0].display_unit is None)
self.assertTrue(mkv.video_tracks[0].aspect_ratio_type is None)
# audio track
self.assertTrue(len(mkv.audio_tracks) == 1)
self.assertTrue(mkv.audio_tracks[0].type == AUDIO_TRACK)
self.assertTrue(mkv.audio_tracks[0].number == 2)
self.assertTrue(mkv.audio_tracks[0].name is None)
self.assertTrue(mkv.audio_tracks[0].language == 'und')
self.assertTrue(mkv.audio_tracks[0].enabled == True)
self.assertTrue(mkv.audio_tracks[0].default == False)
self.assertTrue(mkv.audio_tracks[0].forced == False)
self.assertTrue(mkv.audio_tracks[0].lacing == True)
self.assertTrue(mkv.audio_tracks[0].codec_id == 'A_AAC')
self.assertTrue(mkv.audio_tracks[0].codec_name is None)
self.assertTrue(mkv.audio_tracks[0].sampling_frequency == 48000.0)
self.assertTrue(mkv.audio_tracks[0].channels == 2)
self.assertTrue(mkv.audio_tracks[0].output_sampling_frequency is None)
self.assertTrue(mkv.audio_tracks[0].bit_depth is None)
# subtitle track
self.assertTrue(len(mkv.subtitle_tracks) == 0)
# chapters
self.assertTrue(len(mkv.chapters) == 0)
# tags
self.assertTrue(len(mkv.tags) == 1)
self.assertTrue(len(mkv.tags[0].simpletags) == 3)
self.assertTrue(mkv.tags[0].simpletags[0].name == 'TITLE')
self.assertTrue(mkv.tags[0].simpletags[0].default == True)
self.assertTrue(mkv.tags[0].simpletags[0].language == 'und')
self.assertTrue(mkv.tags[0].simpletags[0].string == 'Big Buck Bunny - test 7')
self.assertTrue(mkv.tags[0].simpletags[0].binary is None)
self.assertTrue(mkv.tags[0].simpletags[1].name == 'DATE_RELEASED')
self.assertTrue(mkv.tags[0].simpletags[1].default == True)
self.assertTrue(mkv.tags[0].simpletags[1].language == 'und')
self.assertTrue(mkv.tags[0].simpletags[1].string == '2010')
self.assertTrue(mkv.tags[0].simpletags[1].binary is None)
self.assertTrue(mkv.tags[0].simpletags[2].name == 'COMMENT')
self.assertTrue(mkv.tags[0].simpletags[2].default == True)
self.assertTrue(mkv.tags[0].simpletags[2].language == 'und')
self.assertTrue(mkv.tags[0].simpletags[2].string == 'Matroska Validation File 7, junk elements are present at the beggining or end of clusters, the parser should skip it. There is also a damaged element at 451418')
self.assertTrue(mkv.tags[0].simpletags[2].binary is None)
def test_test8(self):
stream = io.open(os.path.join(TEST_DIR, 'test8.mkv'), 'rb')
mkv = MKV(stream)
# info
self.assertTrue(mkv.info.title is None)
self.assertTrue(mkv.info.duration == timedelta(seconds=47, milliseconds=341))
self.assertTrue(mkv.info.date_utc == datetime(2010, 8, 21, 17, 22, 14))
self.assertTrue(mkv.info.muxing_app == 'libebml2 v0.10.1 + libmatroska2 v0.10.1')
self.assertTrue(mkv.info.writing_app == 'mkclean 0.5.5 r from libebml v1.0.0 + libmatroska v1.0.0 + mkvmerge v4.0.0 (\'The Stars were mine\') built on Jun 6 2010 16:18:42')
# video track
self.assertTrue(len(mkv.video_tracks) == 1)
self.assertTrue(mkv.video_tracks[0].type == VIDEO_TRACK)
self.assertTrue(mkv.video_tracks[0].number == 1)
self.assertTrue(mkv.video_tracks[0].name is None)
self.assertTrue(mkv.video_tracks[0].language == 'und')
self.assertTrue(mkv.video_tracks[0].enabled == True)
self.assertTrue(mkv.video_tracks[0].default == False)
self.assertTrue(mkv.video_tracks[0].forced == False)
self.assertTrue(mkv.video_tracks[0].lacing == False)
self.assertTrue(mkv.video_tracks[0].codec_id == 'V_MPEG4/ISO/AVC')
self.assertTrue(mkv.video_tracks[0].codec_name is None)
self.assertTrue(mkv.video_tracks[0].width == 1024)
self.assertTrue(mkv.video_tracks[0].height == 576)
self.assertTrue(mkv.video_tracks[0].interlaced == False)
self.assertTrue(mkv.video_tracks[0].stereo_mode is None)
self.assertTrue(mkv.video_tracks[0].crop == {})
self.assertTrue(mkv.video_tracks[0].display_width is None)
self.assertTrue(mkv.video_tracks[0].display_height is None)
self.assertTrue(mkv.video_tracks[0].display_unit is None)
self.assertTrue(mkv.video_tracks[0].aspect_ratio_type is None)
# audio track
self.assertTrue(len(mkv.audio_tracks) == 1)
self.assertTrue(mkv.audio_tracks[0].type == AUDIO_TRACK)
self.assertTrue(mkv.audio_tracks[0].number == 2)
self.assertTrue(mkv.audio_tracks[0].name is None)
self.assertTrue(mkv.audio_tracks[0].language == 'und')
self.assertTrue(mkv.audio_tracks[0].enabled == True)
self.assertTrue(mkv.audio_tracks[0].default == False)
self.assertTrue(mkv.audio_tracks[0].forced == False)
self.assertTrue(mkv.audio_tracks[0].lacing == True)
self.assertTrue(mkv.audio_tracks[0].codec_id == 'A_AAC')
self.assertTrue(mkv.audio_tracks[0].codec_name is None)
self.assertTrue(mkv.audio_tracks[0].sampling_frequency == 48000.0)
self.assertTrue(mkv.audio_tracks[0].channels == 2)
self.assertTrue(mkv.audio_tracks[0].output_sampling_frequency is None)
self.assertTrue(mkv.audio_tracks[0].bit_depth is None)
# subtitle track
self.assertTrue(len(mkv.subtitle_tracks) == 0)
# chapters
self.assertTrue(len(mkv.chapters) == 0)
# tags
self.assertTrue(len(mkv.tags) == 1)
self.assertTrue(len(mkv.tags[0].simpletags) == 3)
self.assertTrue(mkv.tags[0].simpletags[0].name == 'TITLE')
self.assertTrue(mkv.tags[0].simpletags[0].default == True)
self.assertTrue(mkv.tags[0].simpletags[0].language == 'und')
self.assertTrue(mkv.tags[0].simpletags[0].string == 'Big Buck Bunny - test 8')
self.assertTrue(mkv.tags[0].simpletags[0].binary is None)
self.assertTrue(mkv.tags[0].simpletags[1].name == 'DATE_RELEASED')
self.assertTrue(mkv.tags[0].simpletags[1].default == True)
self.assertTrue(mkv.tags[0].simpletags[1].language == 'und')
self.assertTrue(mkv.tags[0].simpletags[1].string == '2010')
self.assertTrue(mkv.tags[0].simpletags[1].binary is None)
self.assertTrue(mkv.tags[0].simpletags[2].name == 'COMMENT')
self.assertTrue(mkv.tags[0].simpletags[2].default == True)
self.assertTrue(mkv.tags[0].simpletags[2].language == 'und')
self.assertTrue(mkv.tags[0].simpletags[2].string == 'Matroska Validation File 8, audio missing between timecodes 6.019s and 6.360s')
self.assertTrue(mkv.tags[0].simpletags[2].binary is None)
def suite():
suite = unittest.TestSuite()
suite.addTest(unittest.TestLoader().loadTestsFromTestCase(MKVTestCase))
return suite
if __name__ == '__main__':
unittest.TextTestRunner().run(suite())

View file

@ -0,0 +1,122 @@
# -*- coding: utf-8 -*-
from enzyme.parsers import ebml
import io
import os.path
import requests
import unittest
import yaml
import zipfile
# Test directory
TEST_DIR = os.path.join(os.path.dirname(__file__), os.path.splitext(__file__)[0])
# EBML validation directory
EBML_VALIDATION_DIR = os.path.join(os.path.dirname(__file__), 'parsers', 'ebml')
def setUpModule():
if not os.path.exists(TEST_DIR):
r = requests.get('http://downloads.sourceforge.net/project/matroska/test_files/matroska_test_w1_1.zip')
with zipfile.ZipFile(io.BytesIO(r.content), 'r') as f:
f.extractall(TEST_DIR)
class EBMLTestCase(unittest.TestCase):
def setUp(self):
self.stream = io.open(os.path.join(TEST_DIR, 'test1.mkv'), 'rb')
with io.open(os.path.join(EBML_VALIDATION_DIR, 'test1.mkv.yml'), 'r') as yml:
self.validation = yaml.safe_load(yml)
self.specs = ebml.get_matroska_specs()
def tearDown(self):
self.stream.close()
def check_element(self, element_id, element_type, element_name, element_level, element_position, element_size, element_data, element,
ignore_element_types=None, ignore_element_names=None, max_level=None):
"""Recursively check an element"""
# base
self.assertTrue(element.id == element_id)
self.assertTrue(element.type == element_type)
self.assertTrue(element.name == element_name)
self.assertTrue(element.level == element_level)
self.assertTrue(element.position == element_position)
self.assertTrue(element.size == element_size)
# Element
if not isinstance(element_data, list):
self.assertTrue(type(element) == ebml.Element)
if element_type != ebml.BINARY:
self.assertTrue(element.data == element_data)
return
# MasterElement
if ignore_element_types is not None: # filter validation on element types
element_data = [e for e in element_data if e[1] not in ignore_element_types]
if ignore_element_names is not None: # filter validation on element names
element_data = [e for e in element_data if e[2] not in ignore_element_names]
if element.level == max_level: # special check when maximum level is reached
self.assertTrue(element.data is None)
return
self.assertTrue(len(element.data) == len(element_data))
for i in range(len(element.data)):
self.check_element(element_data[i][0], element_data[i][1], element_data[i][2], element_data[i][3],
element_data[i][4], element_data[i][5], element_data[i][6], element.data[i], ignore_element_types,
ignore_element_names, max_level)
def test_parse_full(self):
result = ebml.parse(self.stream, self.specs)
self.assertTrue(len(result) == len(self.validation))
for i in range(len(self.validation)):
self.check_element(self.validation[i][0], self.validation[i][1], self.validation[i][2], self.validation[i][3],
self.validation[i][4], self.validation[i][5], self.validation[i][6], result[i])
def test_parse_ignore_element_types(self):
ignore_element_types = [ebml.INTEGER, ebml.BINARY]
result = ebml.parse(self.stream, self.specs, ignore_element_types=ignore_element_types)
self.validation = [e for e in self.validation if e[1] not in ignore_element_types]
self.assertTrue(len(result) == len(self.validation))
for i in range(len(self.validation)):
self.check_element(self.validation[i][0], self.validation[i][1], self.validation[i][2], self.validation[i][3],
self.validation[i][4], self.validation[i][5], self.validation[i][6], result[i], ignore_element_types=ignore_element_types)
def test_parse_ignore_element_names(self):
ignore_element_names = ['EBML', 'SimpleBlock']
result = ebml.parse(self.stream, self.specs, ignore_element_names=ignore_element_names)
self.validation = [e for e in self.validation if e[2] not in ignore_element_names]
self.assertTrue(len(result) == len(self.validation))
for i in range(len(self.validation)):
self.check_element(self.validation[i][0], self.validation[i][1], self.validation[i][2], self.validation[i][3],
self.validation[i][4], self.validation[i][5], self.validation[i][6], result[i], ignore_element_names=ignore_element_names)
def test_parse_max_level(self):
max_level = 3
result = ebml.parse(self.stream, self.specs, max_level=max_level)
self.validation = [e for e in self.validation if e[3] <= max_level]
self.assertTrue(len(result) == len(self.validation))
for i in range(len(self.validation)):
self.check_element(self.validation[i][0], self.validation[i][1], self.validation[i][2], self.validation[i][3],
self.validation[i][4], self.validation[i][5], self.validation[i][6], result[i], max_level=max_level)
def generate_yml(filename, specs):
"""Generate a validation file for the test video"""
def _to_builtin(elements):
"""Recursively convert elements to built-in types"""
result = []
for e in elements:
if isinstance(e, ebml.MasterElement):
result.append((e.id, e.type, e.name, e.level, e.position, e.size, _to_builtin(e.data)))
else:
result.append((e.id, e.type, e.name, e.level, e.position, e.size, None if isinstance(e.data, io.BytesIO) else e.data))
return result
video = io.open(os.path.join(TEST_DIR, filename), 'rb')
yml = io.open(os.path.join(EBML_VALIDATION_DIR, filename + '.yml'), 'w')
yaml.safe_dump(_to_builtin(ebml.parse(video, specs)), yml)
def suite():
suite = unittest.TestSuite()
suite.addTest(unittest.TestLoader().loadTestsFromTestCase(EBMLTestCase))
return suite
if __name__ == '__main__':
unittest.TextTestRunner().run(suite())