""" Project: pyGTKtalog Description: Tests for Video class. Type: test Author: Roman 'gryf' Dobosz, gryf73@gmail.com Created: 2008-12-15 """ import os import unittest import PIL from pygtktalog.video import Video DATA = {"m1.avi": """ID_VIDEO_ID=0 ID_AUDIO_ID=1 ID_FILENAME=m1.avi ID_DEMUXER=avi ID_VIDEO_FORMAT=H264 ID_VIDEO_BITRATE=46184 ID_VIDEO_WIDTH=128 ID_VIDEO_HEIGHT=96 ID_VIDEO_FPS=30.000 ID_VIDEO_ASPECT=0.0000 ID_AUDIO_FORMAT=85 ID_AUDIO_BITRATE=128000 ID_AUDIO_RATE=0 ID_AUDIO_NCH=0 ID_START_TIME=0.00 ID_LENGTH=4.03 ID_SEEKABLE=1 ID_CHAPTERS=0 ID_VIDEO_CODEC=ffh264 ID_AUDIO_BITRATE=128000 ID_AUDIO_RATE=22050 ID_AUDIO_NCH=2 ID_AUDIO_CODEC=mpg123 ID_EXIT=EOF """, "m.avi": """ID_VIDEO_ID=0 ID_AUDIO_ID=1 ID_FILENAME=m.avi ID_DEMUXER=avi ID_VIDEO_FORMAT=XVID ID_VIDEO_BITRATE=313536 ID_VIDEO_WIDTH=128 ID_VIDEO_HEIGHT=96 ID_VIDEO_FPS=30.000 ID_VIDEO_ASPECT=0.0000 ID_AUDIO_FORMAT=85 ID_AUDIO_BITRATE=128000 ID_AUDIO_RATE=0 ID_AUDIO_NCH=0 ID_START_TIME=0.00 ID_LENGTH=4.03 ID_SEEKABLE=1 ID_CHAPTERS=0 ID_VIDEO_CODEC=ffodivx ID_AUDIO_BITRATE=128000 ID_AUDIO_RATE=22050 ID_AUDIO_NCH=2 ID_AUDIO_CODEC=mpg123 ID_EXIT=EOF""", "m.mkv": """ID_VIDEO_ID=0 ID_AUDIO_ID=0 ID_CLIP_INFO_NAME0=title ID_CLIP_INFO_VALUE0=Avidemux ID_CLIP_INFO_NAME1=encoder ID_CLIP_INFO_VALUE1=Lavf51.12.1 ID_CLIP_INFO_N=2 ID_FILENAME=m.mkv ID_DEMUXER=lavfpref ID_VIDEO_FORMAT=MP4V ID_VIDEO_BITRATE=0 ID_VIDEO_WIDTH=128 ID_VIDEO_HEIGHT=96 ID_VIDEO_FPS=30.000 ID_VIDEO_ASPECT=0.0000 ID_AUDIO_FORMAT=8192 ID_AUDIO_BITRATE=128000 ID_AUDIO_RATE=22050 ID_AUDIO_NCH=1 ID_START_TIME=0.00 ID_LENGTH=4.07 ID_SEEKABLE=1 ID_CHAPTERS=0 ID_VIDEO_CODEC=ffodivx ID_AUDIO_BITRATE=128000 ID_AUDIO_RATE=22050 ID_AUDIO_NCH=1 ID_AUDIO_CODEC=ffac3 ID_EXIT=EOF""", "m.mpg": """ID_VIDEO_ID=0 ID_FILENAME=m.mpg ID_DEMUXER=mpeges ID_VIDEO_FORMAT=0x10000001 ID_VIDEO_BITRATE=2200000 ID_VIDEO_WIDTH=128 ID_VIDEO_HEIGHT=96 ID_VIDEO_FPS=30.000 ID_VIDEO_ASPECT=0.0000 ID_START_TIME=0.00 ID_LENGTH=0.97 ID_SEEKABLE=1 ID_CHAPTERS=0 ID_VIDEO_CODEC=ffmpeg1 ID_EXIT=EOF""", "m.ogm": """ID_VIDEO_ID=0 ID_AUDIO_ID=0 ID_FILENAME=m.ogm ID_DEMUXER=lavfpref ID_VIDEO_FORMAT=H264 ID_VIDEO_BITRATE=0 ID_VIDEO_WIDTH=160 ID_VIDEO_HEIGHT=120 ID_VIDEO_FPS=30.000 ID_VIDEO_ASPECT=0.0000 ID_AUDIO_FORMAT=8192 ID_AUDIO_BITRATE=128000 ID_AUDIO_RATE=22050 ID_AUDIO_NCH=1 ID_START_TIME=0.00 ID_LENGTH=4.00 ID_SEEKABLE=1 ID_CHAPTERS=0 ID_VIDEO_CODEC=ffh264 ID_AUDIO_BITRATE=128000 ID_AUDIO_RATE=22050 ID_AUDIO_NCH=1 ID_AUDIO_CODEC=ffac3 ID_EXIT=EOF""", "m.wmv":"""ID_AUDIO_ID=1 ID_VIDEO_ID=2 ID_FILENAME=m.wmv ID_DEMUXER=asf ID_VIDEO_FORMAT=WMV3 ID_VIDEO_BITRATE=1177000 ID_VIDEO_WIDTH=852 ID_VIDEO_HEIGHT=480 ID_VIDEO_FPS=1000.000 ID_VIDEO_ASPECT=0.0000 ID_AUDIO_FORMAT=353 ID_AUDIO_BITRATE=0 ID_AUDIO_RATE=0 ID_AUDIO_NCH=0 ID_START_TIME=4.00 ID_LENGTH=4656.93 ID_SEEKABLE=1 ID_CHAPTERS=0 ID_VIDEO_CODEC=ffwmv3 ID_AUDIO_BITRATE=64028 ID_AUDIO_RATE=48000 ID_AUDIO_NCH=2 ID_AUDIO_CODEC=ffwmav2 ID_EXIT=EOF""", "m.mp4": """ID_VIDEO_ID=0 ID_AUDIO_ID=0 ID_AID_0_LANG=unk ID_CLIP_INFO_NAME0=major_brand ID_CLIP_INFO_VALUE0=isom ID_CLIP_INFO_NAME1=minor_version ID_CLIP_INFO_VALUE1=512 ID_CLIP_INFO_NAME2=compatible_brands ID_CLIP_INFO_VALUE2=isomiso2avc1mp41 ID_CLIP_INFO_NAME3=encoder ID_CLIP_INFO_VALUE3=Lavf56.25.101 ID_CLIP_INFO_N=4 ID_FILENAME=m.mp4 ID_DEMUXER=lavfpref ID_VIDEO_FORMAT=H264 ID_VIDEO_BITRATE=1263573 ID_VIDEO_WIDTH=720 ID_VIDEO_HEIGHT=404 ID_VIDEO_FPS=25.000 ID_VIDEO_ASPECT=0.0000 ID_AUDIO_FORMAT=MP4A ID_AUDIO_BITRATE=155088 ID_AUDIO_RATE=44100 ID_AUDIO_NCH=2 ID_START_TIME=0.00 ID_LENGTH=69.18 ID_SEEKABLE=1 ID_CHAPTERS=0 ID_VIDEO_CODEC=ffh264 ID_AUDIO_BITRATE=155082 ID_AUDIO_RATE=44100 ID_AUDIO_NCH=2 ID_AUDIO_CODEC=ffaac ID_EXIT=EOF"""} # TODO: exchange this with mock class Readlines(object): def __init__(self, key=None): self.data = DATA.get(key, "") def readlines(self): return self.data.split('\n') def mock_popen(command): key = None if 'midentify' in command: key = command.split('"')[1] elif 'jpeg:outdir' in command: # simulate capture for mplayer img_dir = command.split('"')[-2] img = PIL.Image.new('RGBA', (320, 200)) with open(os.path.join(img_dir, "00000001.jpg"), "wb") as fobj: img.save(fobj) return Readlines(key) os.popen = mock_popen class TestVideo(unittest.TestCase): """test class for retrive midentify script output""" def test_avi(self): """test mock avi file, should return dict with expected values""" avi = Video("m.avi") self.assertTrue(len(avi.tags) != 0, "result should have lenght > 0") self.assertEqual(avi.tags['audio_format'], '85') self.assertEqual(avi.tags['width'], 128) self.assertEqual(avi.tags['audio_no_channels'], 2) self.assertEqual(avi.tags['height'], 96) self.assertEqual(avi.tags['video_format'], 'xvid') self.assertEqual(avi.tags['length'], 4) self.assertEqual(avi.tags['audio_codec'], 'mpg123') self.assertEqual(avi.tags['video_codec'], 'ffodivx') self.assertEqual(avi.tags['duration'], '00:00:04') self.assertEqual(avi.tags['container'], 'avi') def test_avi2(self): """test another mock avi file, should return dict with expected values""" avi = Video("m1.avi") self.assertTrue(len(avi.tags) != 0, "result should have lenght > 0") self.assertEqual(avi.tags['audio_format'], '85') self.assertEqual(avi.tags['width'], 128) self.assertEqual(avi.tags['audio_no_channels'], 2) self.assertEqual(avi.tags['height'], 96) self.assertEqual(avi.tags['video_format'], 'h264') self.assertEqual(avi.tags['length'], 4) self.assertEqual(avi.tags['audio_codec'], 'mpg123') self.assertEqual(avi.tags['video_codec'], 'ffh264') self.assertEqual(avi.tags['duration'], '00:00:04') self.assertEqual(avi.tags['container'], 'avi') def test_mkv(self): """test mock mkv file, should return dict with expected values""" mkv = Video("m.mkv") self.assertTrue(len(mkv.tags) != 0, "result should have lenght > 0") self.assertEqual(mkv.tags['audio_format'], '8192') self.assertEqual(mkv.tags['width'], 128) self.assertTrue(mkv.tags['audio_no_channels'] in (1, 2)) self.assertEqual(mkv.tags['height'], 96) self.assertEqual(mkv.tags['video_format'], 'mp4v') self.assertEqual(mkv.tags['length'], 4) self.assertTrue(mkv.tags['audio_codec'] in ('a52', 'ffac3')) self.assertEqual(mkv.tags['video_codec'], 'ffodivx') self.assertEqual(mkv.tags['duration'], '00:00:04') self.assertTrue(mkv.tags['container'] in ('mkv', 'lavfpref')) def test_mpg(self): """test mock mpg file, should return dict with expected values""" mpg = Video("m.mpg") self.assertTrue(len(mpg.tags) != 0, "result should have lenght > 0") self.assertFalse(mpg.tags.has_key('audio_format')) self.assertEqual(mpg.tags['width'], 128) self.assertFalse(mpg.tags.has_key('audio_no_channels')) self.assertEqual(mpg.tags['height'], 96) self.assertEqual(mpg.tags['video_format'], '0x10000001') self.assertFalse(mpg.tags.has_key('lenght')) self.assertFalse(mpg.tags.has_key('audio_codec')) self.assertEqual(mpg.tags['video_codec'], 'ffmpeg1') self.assertFalse(mpg.tags.has_key('duration')) self.assertEqual(mpg.tags['container'], 'mpeges') def test_ogm(self): """test mock ogm file, should return dict with expected values""" ogm = Video("m.ogm") self.assertTrue(len(ogm.tags) != 0, "result should have lenght > 0") self.assertEqual(ogm.tags['audio_format'], '8192') self.assertEqual(ogm.tags['width'], 160) self.assertTrue(ogm.tags['audio_no_channels'] in (1, 2)) self.assertEqual(ogm.tags['height'], 120) self.assertEqual(ogm.tags['video_format'], 'h264') self.assertEqual(ogm.tags['length'], 4) self.assertTrue(ogm.tags['audio_codec'] in ('a52', 'ffac3')) self.assertEqual(ogm.tags['video_codec'], 'ffh264') self.assertEqual(ogm.tags['duration'], '00:00:04') self.assertTrue(ogm.tags['container'] in ('ogg', 'lavfpref')) def test_wmv(self): """test mock wmv file, should return dict with expected values""" wmv = Video("m.wmv") self.assertTrue(len(wmv.tags) != 0, "result should have lenght > 0") self.assertEqual(wmv.tags['audio_format'], '353') self.assertEqual(wmv.tags['width'], 852) self.assertEqual(wmv.tags['audio_no_channels'], 2) self.assertEqual(wmv.tags['height'], 480) self.assertEqual(wmv.tags['video_format'], 'wmv3') self.assertEqual(wmv.tags['length'], 4656) self.assertEqual(wmv.tags['audio_codec'], 'ffwmav2') self.assertEqual(wmv.tags['video_codec'], 'ffwmv3') self.assertEqual(wmv.tags['duration'], '01:17:32') self.assertEqual(wmv.tags['container'], 'asf') def test_mp4(self): """test mock mp4 file, should return dict with expected values""" mp4 = Video("m.mp4") self.assertTrue(len(mp4.tags) != 0, "result should have lenght > 0") self.assertEqual(mp4.tags['audio_format'], 'mp4a') self.assertEqual(mp4.tags['width'], 720) self.assertEqual(mp4.tags['audio_no_channels'], 2) self.assertEqual(mp4.tags['height'], 404) self.assertEqual(mp4.tags['video_format'], 'h264') self.assertEqual(mp4.tags['length'], 69) self.assertEqual(mp4.tags['audio_codec'], 'ffaac') self.assertEqual(mp4.tags['video_codec'], 'ffh264') self.assertEqual(mp4.tags['duration'], '00:01:09') self.assertEqual(mp4.tags['container'], 'lavfpref') def test_capture(self): """test capture with some small movie and play a little with tags""" avi = Video("m.avi") filename = avi.capture() self.assertTrue(filename != None) self.assertTrue(os.path.exists(filename)) file_size = os.stat(filename)[6] self.assertAlmostEqual(file_size/10000.0, 0.151, 0) os.unlink(filename) for length in (480, 380, 4): avi.tags['length'] = length filename = avi.capture() self.assertTrue(filename is not None) os.unlink(filename) avi.tags['length'] = 3 self.assertTrue(avi.capture() is None) avi.tags['length'] = 4 avi.tags['width'] = 0 self.assertTrue(avi.capture() is None) avi.tags['width'] = 1025 filename = avi.capture() self.assertTrue(filename is not None) os.unlink(filename) del(avi.tags['length']) self.assertTrue(avi.capture() is None) self.assertTrue(len(str(avi)) > 0) if __name__ == "__main__": os.chdir(os.path.join(os.path.abspath(os.path.dirname(__file__)), "../")) unittest.main()