Esempio n. 1
0
    def from_edl(self, path):
        """Parses EDL file and returns a Sequence instance which reflects the
        whole time line hierarchy.

        :param path: The path of the XML file
        :return: :class:`.Sequence`
        """
        if not isinstance(path, str):
            raise TypeError(
                'path argument in %s.from_edl should be a string, not %s' %
                (self.__class__.__name__, path.__class__.__name__)
            )

        from anima.env.mayaEnv import Maya
        m = Maya()
        fps = m.get_fps()

        import edl
        p = edl.Parser(str(fps))
        with open(path) as f:
            l = p.parse(f)

        seq = Sequence()
        seq.from_edl(l)

        self.from_seq(seq)
Esempio n. 2
0
    def from_xml(self, path):
        """Parses XML file and returns a Sequence instance which reflects the
        whole time line hierarchy.

        :param path: The path of the XML file
        :return: :class:`.Sequence`
        """
        if not isinstance(path, str):
            raise TypeError(
                'path argument in %s.from_xml should be a string, not %s' %
                (self.__class__.__name__, path.__class__.__name__)
            )

        from xml.etree import ElementTree

        try:
            tree = ElementTree.parse(path)
        except IOError:
            raise IOError('Please supply a valid path to an XML file!')

        root = tree.getroot()
        seq = Sequence()
        xml_seq = root.getchildren()[0]

        seq.from_xml(xml_seq)

        self.from_seq(seq)
Esempio n. 3
0
 def to_xml(self):
     """return an eml version of this edl
     """
     from anima.edit import Sequence
     s = Sequence(timebase='24')
     s.from_edl(self.events)
     xml_data = s.to_xml()
     return xml_data
Esempio n. 4
0
    def test_to_edl_method_will_return_a_List_instance(self):
        """testing if to_edl method will return an edl.List instance
        """
        s = Sequence()
        m = Media()
        s.media = m

        result = s.to_edl()
        self.assertTrue(isinstance(result, List))
Esempio n. 5
0
    def test_to_edl_will_raise_RuntimeError_if_no_Media_instance_presents(self):
        """testing if a RuntimeError will be raised when there is no Media
        instance present in Sequence
        """
        s = Sequence()
        with self.assertRaises(RuntimeError) as cm:
            s.to_edl()

        self.assertEqual(
            'Can not run Sequence.to_edl() without a Media instance, please '
            'add a Media instance to this Sequence instance.',
            cm.exception.message
        )
Esempio n. 6
0
    def to_xml(self):
        """return an eml version of this edl
        """
        from anima.edit import Sequence, Rate
        s = Sequence(rate=Rate(timebase='24'))
        s.from_edl(self.events)

        # optimize clips
        for track in s.media.video.tracks:
            track.optimize_clips()

        xml_data = s.to_xml()
        return xml_data
Esempio n. 7
0
    def test_to_metafuze_xml_is_working_properly(self):
        """testing if to_metafuze_xml method is working properly
        """
        s = Sequence()
        s.duration = 109
        s.name = 'SEQ001_HSNI_003'
        s.timecode = '00:00:00:00'

        r = Rate()
        s.rate = r
        r.ntsc = False
        r.timebase = '24'

        m = Media()
        s.media = m

        v = Video()
        v.width = 1024
        v.height = 778
        m.video = v

        t = Track()
        t.enabled = True
        t.locked = False

        v.tracks.append(t)

        # clip 1
        f = File()
        f.duration = 34
        f.name = 'SEQ001_HSNI_003_0010_v001'
        f.pathurl = 'file://localhost/tmp/SEQ001_HSNI_003_0010_v001.mov'

        c = Clip()
        c.id = '0010'
        c.start = 1
        c.end = 35
        c.name = 'SEQ001_HSNI_003_0010_v001'
        c.enabled = True
        c.duration = 34
        c.in_ = 0
        c.out = 34
        c.file = f

        t.clips.append(c)

        # clip 2
        f = File()
        f.duration = 30
        f.name = 'SEQ001_HSNI_003_0020_v001'
        f.pathurl = 'file://localhost/tmp/SEQ001_HSNI_003_0020_v001.mov'

        c = Clip()
        c.id = '0020'
        c.start = 35
        c.end = 65
        c.name = 'SEQ001_HSNI_003_0020_v001'
        c.enabled = True
        c.duration = 30
        c.in_ = 0
        c.out = 30
        c.file = f

        t.clips.append(c)

        # clip 3
        f = File()
        f.duration = 45
        f.name = 'SEQ001_HSNI_003_0030_v001'
        f.pathurl = 'file://localhost/tmp/SEQ001_HSNI_003_0030_v001.mov'

        c = Clip()
        c.id = '0030'
        c.start = 65
        c.end = 110
        c.name = 'SEQ001_HSNI_003_0030_v001'
        c.enabled = True
        c.duration = 45
        c.in_ = 0
        c.out = 45
        c.file = f

        t.clips.append(c)

        expected_xmls = [
            """<?xml version='1.0' encoding='UTF-8'?>
<MetaFuze_BatchTranscode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="MetaFuzeBatchTranscode.xsd">
   <Configuration>
      <Local>8</Local>
      <Remote>8</Remote>
   </Configuration>
   <Group>
      <FileList>
         <File>\\tmp\\SEQ001_HSNI_003_0010_v001.mov</File>
      </FileList>
      <Transcode>
         <Version>1.0</Version>
         <File>\\tmp\\SEQ001_HSNI_003_0010_v001.mxf</File>
         <ClipName>SEQ001_HSNI_003_0010_v001</ClipName>
         <ProjectName>SEQ001_HSNI_003</ProjectName>
         <TapeName>SEQ001_HSNI_003_0010_v001</TapeName>
         <TC_Start>00:00:00:00</TC_Start>
         <DropFrame>false</DropFrame>
         <EdgeTC>** TimeCode N/A **</EdgeTC>
         <FilmType>35.4</FilmType>
         <KN_Start>AAAAAAAA-0000+00</KN_Start>
         <Frames>33</Frames>
         <Width>1024</Width>
         <Height>778</Height>
         <PixelRatio>1.0000</PixelRatio>
         <UseFilmInfo>false</UseFilmInfo>
         <UseTapeInfo>true</UseTapeInfo>
         <AudioChannelCount>0</AudioChannelCount>
         <UseMXFAudio>false</UseMXFAudio>
         <UseWAVAudio>false</UseWAVAudio>
         <SrcBitsPerChannel>8</SrcBitsPerChannel>
         <OutputPreset>DNxHD 36</OutputPreset>
         <OutputPreset>
            <Version>2.0</Version>
            <Name>DNxHD 36</Name>
            <ColorModel>YCC 709</ColorModel>
            <BitDepth>8</BitDepth>
            <Format>1080 24p</Format>
            <Compression>DNxHD 36</Compression>
            <Conversion>Letterbox (center)</Conversion>
            <VideoFileType>.mxf</VideoFileType>
            <IsDefault>false</IsDefault>
         </OutputPreset>
         <Eye></Eye>
         <Scene></Scene>
         <Comment></Comment>
      </Transcode>
   </Group>
</MetaFuze_BatchTranscode>""",
            """<?xml version='1.0' encoding='UTF-8'?>
<MetaFuze_BatchTranscode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="MetaFuzeBatchTranscode.xsd">
   <Configuration>
      <Local>8</Local>
      <Remote>8</Remote>
   </Configuration>
   <Group>
      <FileList>
         <File>\\tmp\\SEQ001_HSNI_003_0020_v001.mov</File>
      </FileList>
      <Transcode>
         <Version>1.0</Version>
         <File>\\tmp\\SEQ001_HSNI_003_0020_v001.mxf</File>
         <ClipName>SEQ001_HSNI_003_0020_v001</ClipName>
         <ProjectName>SEQ001_HSNI_003</ProjectName>
         <TapeName>SEQ001_HSNI_003_0020_v001</TapeName>
         <TC_Start>00:00:00:00</TC_Start>
         <DropFrame>false</DropFrame>
         <EdgeTC>** TimeCode N/A **</EdgeTC>
         <FilmType>35.4</FilmType>
         <KN_Start>AAAAAAAA-0000+00</KN_Start>
         <Frames>29</Frames>
         <Width>1024</Width>
         <Height>778</Height>
         <PixelRatio>1.0000</PixelRatio>
         <UseFilmInfo>false</UseFilmInfo>
         <UseTapeInfo>true</UseTapeInfo>
         <AudioChannelCount>0</AudioChannelCount>
         <UseMXFAudio>false</UseMXFAudio>
         <UseWAVAudio>false</UseWAVAudio>
         <SrcBitsPerChannel>8</SrcBitsPerChannel>
         <OutputPreset>DNxHD 36</OutputPreset>
         <OutputPreset>
            <Version>2.0</Version>
            <Name>DNxHD 36</Name>
            <ColorModel>YCC 709</ColorModel>
            <BitDepth>8</BitDepth>
            <Format>1080 24p</Format>
            <Compression>DNxHD 36</Compression>
            <Conversion>Letterbox (center)</Conversion>
            <VideoFileType>.mxf</VideoFileType>
            <IsDefault>false</IsDefault>
         </OutputPreset>
         <Eye></Eye>
         <Scene></Scene>
         <Comment></Comment>
      </Transcode>
   </Group>
</MetaFuze_BatchTranscode>""",
            """<?xml version='1.0' encoding='UTF-8'?>
<MetaFuze_BatchTranscode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="MetaFuzeBatchTranscode.xsd">
   <Configuration>
      <Local>8</Local>
      <Remote>8</Remote>
   </Configuration>
   <Group>
      <FileList>
         <File>\\tmp\\SEQ001_HSNI_003_0030_v001.mov</File>
      </FileList>
      <Transcode>
         <Version>1.0</Version>
         <File>\\tmp\\SEQ001_HSNI_003_0030_v001.mxf</File>
         <ClipName>SEQ001_HSNI_003_0030_v001</ClipName>
         <ProjectName>SEQ001_HSNI_003</ProjectName>
         <TapeName>SEQ001_HSNI_003_0030_v001</TapeName>
         <TC_Start>00:00:00:00</TC_Start>
         <DropFrame>false</DropFrame>
         <EdgeTC>** TimeCode N/A **</EdgeTC>
         <FilmType>35.4</FilmType>
         <KN_Start>AAAAAAAA-0000+00</KN_Start>
         <Frames>44</Frames>
         <Width>1024</Width>
         <Height>778</Height>
         <PixelRatio>1.0000</PixelRatio>
         <UseFilmInfo>false</UseFilmInfo>
         <UseTapeInfo>true</UseTapeInfo>
         <AudioChannelCount>0</AudioChannelCount>
         <UseMXFAudio>false</UseMXFAudio>
         <UseWAVAudio>false</UseWAVAudio>
         <SrcBitsPerChannel>8</SrcBitsPerChannel>
         <OutputPreset>DNxHD 36</OutputPreset>
         <OutputPreset>
            <Version>2.0</Version>
            <Name>DNxHD 36</Name>
            <ColorModel>YCC 709</ColorModel>
            <BitDepth>8</BitDepth>
            <Format>1080 24p</Format>
            <Compression>DNxHD 36</Compression>
            <Conversion>Letterbox (center)</Conversion>
            <VideoFileType>.mxf</VideoFileType>
            <IsDefault>false</IsDefault>
         </OutputPreset>
         <Eye></Eye>
         <Scene></Scene>
         <Comment></Comment>
      </Transcode>
   </Group>
</MetaFuze_BatchTranscode>""",
        ]

        result = s.to_metafuze_xml()

        self.maxDiff = None
        self.assertEqual(
            expected_xmls[0],
            result[0]
        )
        self.assertEqual(
            expected_xmls[1],
            result[1]
        )
        self.assertEqual(
            expected_xmls[2],
            result[2]
        )
Esempio n. 8
0
    def test_from_edl_method_is_working_properly_with_negative_timecodes(self):
        """testing if the from_edl method will return an anima.previs.Sequence
        instance with proper hierarchy event with clips that has negative
        timecode values (timecodes with in point is bigger than out point and
        around 23:59:59:XX as a result)
        """
        # first supply an edl
        from edl import Parser
        p = Parser('24')
        edl_path = os.path.abspath('./test_data/test_v003.edl')

        with open(edl_path) as f:
            edl_list = p.parse(f)

        r = Rate(timebase='24')

        s = Sequence(rate=r)
        s.from_edl(edl_list)

        self.assertEqual('SEQ001_HSNI_003', s.name)

        self.assertEqual(247, s.duration)
        self.assertEqual('24', s.rate.timebase)
        self.assertEqual('00:00:00:00', s.timecode)

        m = s.media
        self.assertTrue(isinstance(m, Media))

        v = m.video
        self.assertTrue(isinstance(v, Video))

        t = v.tracks[0]
        self.assertEqual(False, t.locked)
        self.assertEqual(True, t.enabled)

        clips = t.clips
        self.assertEqual(3, len(clips))

        clip1 = clips[0]
        clip2 = clips[1]
        clip3 = clips[2]

        self.assertTrue(isinstance(clip1, Clip))
        self.assertTrue(isinstance(clip2, Clip))
        self.assertTrue(isinstance(clip3, Clip))

        # clip1
        self.assertEqual(176, clip1.duration)
        self.assertEqual(True, clip1.enabled)
        self.assertEqual(153, clip1.end)
        self.assertEqual('SEQ001_HSNI_003_0010_v001', clip1.id)
        self.assertEqual(15, clip1.in_)
        self.assertEqual('SEQ001_HSNI_003_0010_v001', clip1.name)
        self.assertEqual(191, clip1.out)
        self.assertEqual(-23, clip1.start)
        self.assertEqual('Video', clip1.type)

        f = clip1.file
        self.assertTrue(isinstance(f, File))
        self.assertEqual(191, f.duration)
        self.assertEqual('SEQ001_HSNI_003_0010_v001', f.name)
        self.assertEqual(
            'file://localhost/tmp/SEQ001_HSNI_003_0010_v001.mov',
            f.pathurl
        )

        # clip2
        self.assertEqual(55, clip2.duration)
        self.assertEqual(True, clip2.enabled)
        self.assertEqual(208, clip2.end)
        self.assertEqual('SEQ001_HSNI_003_0020_v001', clip2.id)
        self.assertEqual(45, clip2.in_)
        self.assertEqual('SEQ001_HSNI_003_0020_v001', clip2.name)
        self.assertEqual(100, clip2.out)
        self.assertEqual(153, clip2.start)
        self.assertEqual('Video', clip2.type)

        f = clip2.file
        self.assertTrue(isinstance(f, File))
        self.assertEqual(100, f.duration)
        self.assertEqual('SEQ001_HSNI_003_0020_v001', f.name)
        self.assertEqual(
            'file://localhost/tmp/SEQ001_HSNI_003_0020_v001.mov',
            f.pathurl
        )

        # clip3
        self.assertEqual(1, clip3.duration)
        self.assertEqual(True, clip3.enabled)
        self.assertEqual(224, clip3.end)
        self.assertEqual('SEQ001_HSNI_003_0030_v001', clip3.id)
        self.assertEqual(0, clip3.in_)
        self.assertEqual('SEQ001_HSNI_003_0030_v001', clip3.name)
        self.assertEqual(1, clip3.out)
        self.assertEqual(208, clip3.start)
        self.assertEqual('Video', clip3.type)

        f = clip3.file
        self.assertTrue(isinstance(f, File))
        self.assertEqual(1, f.duration)
        self.assertEqual('SEQ001_HSNI_003_0030_v001', f.name)
        self.assertEqual(
            'file://localhost/tmp/SEQ001_HSNI_003_0030_v001.mov',
            f.pathurl
        )
Esempio n. 9
0
    def test_from_edl_method_is_working_properly(self):
        """testing if the from_edl method will return an anima.previs.Sequence
        instance with proper hierarchy
        """
        # first supply an edl
        from edl import Parser
        p = Parser('24')
        edl_path = os.path.abspath('./test_data/test_v001.edl')

        with open(edl_path) as f:
            edl_list = p.parse(f)

        r = Rate(timebase='24')

        s = Sequence(rate=r)
        s.from_edl(edl_list)

        self.assertEqual('SEQ001_HSNI_003', s.name)

        self.assertEqual(111, s.duration)

        r = s.rate
        self.assertEqual('24', r.timebase)
        self.assertEqual('00:00:00:00', s.timecode)

        m = s.media
        self.assertTrue(isinstance(m, Media))

        v = m.video
        self.assertTrue(isinstance(v, Video))

        t = v.tracks[0]
        self.assertEqual(False, t.locked)
        self.assertEqual(True, t.enabled)

        clips = t.clips
        self.assertEqual(3, len(clips))

        clip1 = clips[0]
        clip2 = clips[1]
        clip3 = clips[2]

        self.assertTrue(isinstance(clip1, Clip))
        self.assertTrue(isinstance(clip2, Clip))
        self.assertTrue(isinstance(clip3, Clip))

        # clip1
        self.assertEqual(34, clip1.duration)
        self.assertEqual(True, clip1.enabled)
        self.assertEqual(35, clip1.end)
        self.assertEqual('SEQ001_HSNI_003_0010_v001', clip1.id)
        self.assertEqual(10, clip1.in_)
        self.assertEqual('SEQ001_HSNI_003_0010_v001', clip1.name)
        self.assertEqual(44, clip1.out)
        self.assertEqual(1, clip1.start)
        self.assertEqual('Video', clip1.type)

        f = clip1.file
        self.assertTrue(isinstance(f, File))
        self.assertEqual(44, f.duration)
        self.assertEqual('SEQ001_HSNI_003_0010_v001', f.name)
        self.assertEqual(
            'file://localhost/tmp/SEQ001_HSNI_003_0010_v001.mov',
            f.pathurl
        )

        # clip2
        self.assertEqual(31, clip2.duration)
        self.assertEqual(True, clip2.enabled)
        self.assertEqual(66, clip2.end)
        self.assertEqual('SEQ001_HSNI_003_0020_v001', clip2.id)
        self.assertEqual(10, clip2.in_)
        self.assertEqual('SEQ001_HSNI_003_0020_v001', clip2.name)
        self.assertEqual(41, clip2.out)
        self.assertEqual(35, clip2.start)
        self.assertEqual('Video', clip2.type)

        f = clip2.file
        self.assertTrue(isinstance(f, File))
        self.assertEqual(41, f.duration)
        self.assertEqual('SEQ001_HSNI_003_0020_v001', f.name)
        self.assertEqual(
            'file://localhost/tmp/SEQ001_HSNI_003_0020_v001.mov',
            f.pathurl
        )

        # clip3
        self.assertEqual(46, clip3.duration)
        self.assertEqual(True, clip3.enabled)
        self.assertEqual(112, clip3.end)
        self.assertEqual('SEQ001_HSNI_003_0030_v001', clip3.id)
        self.assertEqual(10, clip3.in_)
        self.assertEqual('SEQ001_HSNI_003_0030_v001', clip3.name)
        self.assertEqual(56, clip3.out)
        self.assertEqual(66, clip3.start)
        self.assertEqual('Video', clip3.type)

        f = clip3.file
        self.assertTrue(isinstance(f, File))
        self.assertEqual(56, f.duration)
        self.assertEqual('SEQ001_HSNI_003_0030_v001', f.name)
        self.assertEqual(
            'file://localhost/tmp/SEQ001_HSNI_003_0030_v001.mov',
            f.pathurl
        )
Esempio n. 10
0
    def test_to_xml_method_is_working_properly(self):
        """testing if the to xml method is working properly
        """
        s = Sequence()
        s.duration = 109
        s.name = 'previs_edit_v001'

        s.rate = Rate(timebase='24', ntsc=False)

        s.timecode = '00:00:00:00'

        m = Media()
        s.media = m

        v = Video()
        v.width = 1024
        v.height = 778
        m.video = v

        t = Track()
        t.enabled = True
        t.locked = False

        v.tracks.append(t)

        # clip 1
        f = File()
        f.duration = 34
        f.name = 'shot2'
        f.pathurl = 'file:///home/eoyilmaz/maya/projects/default/data/shot2.mov'

        c = Clip()
        c.id = 'shot2'
        c.start = 1
        c.end = 35
        c.name = 'shot2'
        c.enabled = True
        c.duration = 34
        c.in_ = 0
        c.out = 34
        c.file = f

        t.clips.append(c)

        # clip 2
        f = File()
        f.duration = 30
        f.name = 'shot'
        f.pathurl = 'file:///home/eoyilmaz/maya/projects/default/data/shot.mov'

        c = Clip()
        c.id = 'shot'
        c.start = 35
        c.end = 65
        c.name = 'shot'
        c.enabled = True
        c.duration = 30
        c.in_ = 0
        c.out = 30
        c.file = f

        t.clips.append(c)

        # clip 3
        f = File()
        f.duration = 45
        f.name = 'shot1'
        f.pathurl = 'file:///home/eoyilmaz/maya/projects/default/data/shot1.mov'

        c = Clip()
        c.id = 'shot1'
        c.start = 65
        c.end = 110
        c.name = 'shot1'
        c.enabled = True
        c.duration = 45
        c.in_ = 0
        c.out = 45
        c.file = f

        t.clips.append(c)

        expected_xml = \
            """<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xmeml>
<xmeml version="5">
<sequence>
  <duration>109</duration>
  <name>previs_edit_v001</name>
  <rate>
    <timebase>24</timebase>
    <ntsc>FALSE</ntsc>
  </rate>
  <timecode>
    <string>00:00:00:00</string>
  </timecode>
  <media>
    <video>
      <format>
        <samplecharacteristics>
          <width>1024</width>
          <height>778</height>
        </samplecharacteristics>
      </format>
      <track>
        <locked>FALSE</locked>
        <enabled>TRUE</enabled>
        <clipitem id="shot2">
          <end>35</end>
          <name>shot2</name>
          <enabled>True</enabled>
          <start>1</start>
          <in>0</in>
          <duration>34</duration>
          <out>34</out>
          <file id="shot2.mov">
            <duration>34</duration>
            <name>shot2</name>
            <pathurl>file://localhost/home/eoyilmaz/maya/projects/default/data/shot2.mov</pathurl>
          </file>
        </clipitem>
        <clipitem id="shot">
          <end>65</end>
          <name>shot</name>
          <enabled>True</enabled>
          <start>35</start>
          <in>0</in>
          <duration>30</duration>
          <out>30</out>
          <file id="shot.mov">
            <duration>30</duration>
            <name>shot</name>
            <pathurl>file://localhost/home/eoyilmaz/maya/projects/default/data/shot.mov</pathurl>
          </file>
        </clipitem>
        <clipitem id="shot1">
          <end>110</end>
          <name>shot1</name>
          <enabled>True</enabled>
          <start>65</start>
          <in>0</in>
          <duration>45</duration>
          <out>45</out>
          <file id="shot1.mov">
            <duration>45</duration>
            <name>shot1</name>
            <pathurl>file://localhost/home/eoyilmaz/maya/projects/default/data/shot1.mov</pathurl>
          </file>
        </clipitem>
      </track>
    </video>
  </media>
</sequence>
</xmeml>"""

        self.assertEqual(
            expected_xml,
            s.to_xml()
        )
Esempio n. 11
0
    def test_from_xml_method_is_working_properly(self):
        """testing if the from_xml method will fill object attributes from the
        given xml node
        """
        from xml.etree import ElementTree
        sequence_node = ElementTree.Element('sequence')
        duration_node = ElementTree.SubElement(sequence_node, 'duration')
        duration_node.text = '109'
        name_node = ElementTree.SubElement(sequence_node, 'name')
        name_node.text = 'previs_edit_v001'
        rate_node = ElementTree.SubElement(sequence_node, 'rate')
        ntsc_node = ElementTree.SubElement(rate_node, 'ntsc')
        ntsc_node.text = 'FALSE'
        timebase_node = ElementTree.SubElement(rate_node, 'timebase')
        timebase_node.text = '24'
        timecode_node = ElementTree.SubElement(sequence_node, 'timecode')
        string_node = ElementTree.SubElement(timecode_node, 'string')
        string_node.text = '00:00:00:00'

        media_node = ElementTree.SubElement(sequence_node, 'media')

        video_node = ElementTree.SubElement(media_node, 'video')
        format_node = ElementTree.SubElement(video_node, 'format')
        sc_node = ElementTree.SubElement(format_node, 'samplecharacteristics')
        width_node = ElementTree.SubElement(sc_node, 'width')
        width_node.text = 1024
        height_node = ElementTree.SubElement(sc_node, 'height')
        height_node.text = 778

        track_node = ElementTree.SubElement(video_node, 'track')
        locked_node = ElementTree.SubElement(track_node, 'locked')
        locked_node.text = 'FALSE'
        enabled_node = ElementTree.SubElement(track_node, 'enabled')
        enabled_node.text = 'TRUE'

        # clip1
        clip_node = ElementTree.SubElement(track_node, 'clipitem',
                                           attrib={'id': 'shot2'})
        end_node = ElementTree.SubElement(clip_node, 'end')
        end_node.text = '35'
        name_node = ElementTree.SubElement(clip_node, 'name')
        name_node.text = 'shot2'
        enabled_node = ElementTree.SubElement(clip_node, 'enabled')
        enabled_node.text = 'True'
        start_node = ElementTree.SubElement(clip_node, 'start')
        start_node.text = '1'
        in_node = ElementTree.SubElement(clip_node, 'in')
        in_node.text = '0'
        duration_node = ElementTree.SubElement(clip_node, 'duration')
        duration_node.text = '34'
        out_node = ElementTree.SubElement(clip_node, 'out')
        out_node.text = '34'

        file_node = ElementTree.SubElement(clip_node, 'file')
        duration_node = ElementTree.SubElement(file_node, 'duration')
        duration_node.text = '34'
        name_node = ElementTree.SubElement(file_node, 'name')
        name_node.text = 'shot2'
        pathurl_node = ElementTree.SubElement(file_node, 'pathurl')

        pathurl = 'file://localhost/home/eoyilmaz/maya/projects/default/data/shot2.mov'
        pathurl_node.text = pathurl

        # clip2
        clip_node = ElementTree.SubElement(track_node, 'clipitem',
                                           attrib={'id': 'shot'})
        end_node = ElementTree.SubElement(clip_node, 'end')
        end_node.text = '65'
        name_node = ElementTree.SubElement(clip_node, 'name')
        name_node.text = 'shot'
        enabled_node = ElementTree.SubElement(clip_node, 'enabled')
        enabled_node.text = 'True'
        start_node = ElementTree.SubElement(clip_node, 'start')
        start_node.text = '35'
        in_node = ElementTree.SubElement(clip_node, 'in')
        in_node.text = '0'
        duration_node = ElementTree.SubElement(clip_node, 'duration')
        duration_node.text = '30'
        out_node = ElementTree.SubElement(clip_node, 'out')
        out_node.text = '30'

        file_node = ElementTree.SubElement(clip_node, 'file')
        duration_node = ElementTree.SubElement(file_node, 'duration')
        duration_node.text = '30'
        name_node = ElementTree.SubElement(file_node, 'name')
        name_node.text = 'shot'
        pathurl_node = ElementTree.SubElement(file_node, 'pathurl')

        pathurl = 'file://localhost/home/eoyilmaz/maya/projects/default/data/shot.mov'
        pathurl_node.text = pathurl

        # clip3
        clip_node = ElementTree.SubElement(
            track_node, 'clipitem', attrib={'id': 'shot1'}
        )
        end_node = ElementTree.SubElement(clip_node, 'end')
        end_node.text = '110'
        name_node = ElementTree.SubElement(clip_node, 'name')
        name_node.text = 'shot1'
        enabled_node = ElementTree.SubElement(clip_node, 'enabled')
        enabled_node.text = 'True'
        start_node = ElementTree.SubElement(clip_node, 'start')
        start_node.text = '65'
        in_node = ElementTree.SubElement(clip_node, 'in')
        in_node.text = '0'
        duration_node = ElementTree.SubElement(clip_node, 'duration')
        duration_node.text = '45'

        rate_node = ElementTree.SubElement(clip_node, 'rate')
        ntsc_node = ElementTree.SubElement(rate_node, 'ntsc')
        ntsc_node.text = 'FALSE'
        timebase_node = ElementTree.SubElement(rate_node, 'timebase')
        timebase_node.text = '24'

        out_node = ElementTree.SubElement(clip_node, 'out')
        out_node.text = '45'

        file_node = ElementTree.SubElement(clip_node, 'file')
        duration_node = ElementTree.SubElement(file_node, 'duration')
        duration_node.text = '45'
        name_node = ElementTree.SubElement(file_node, 'name')
        name_node.text = 'shot1'
        pathurl_node = ElementTree.SubElement(file_node, 'pathurl')

        pathurl = 'file://localhost/home/eoyilmaz/maya/projects/default/data/shot1.mov'
        pathurl_node.text = pathurl

        s = Sequence()
        s.from_xml(sequence_node)
        self.assertEqual(109, s.duration)
        self.assertEqual('previs_edit_v001', s.name)

        r = s.rate
        self.assertEqual(False, r.ntsc)
        self.assertEqual('24', r.timebase)

        self.assertEqual('00:00:00:00', s.timecode)

        m = s.media

        v = m.video
        self.assertEqual(1024, v.width)
        self.assertEqual(778, v.height)

        t = v.tracks[0]
        self.assertEqual(False, t.locked)
        self.assertEqual(True, t.enabled)

        # clip1
        c = t.clips[0]
        self.assertEqual(35, c.end)
        self.assertEqual('shot2', c.name)
        self.assertEqual(True, c.enabled)
        self.assertEqual(1, c.start)
        self.assertEqual(0, c.in_)
        self.assertEqual(34, c.duration)
        self.assertEqual(34, c.out)

        f = c.file
        self.assertEqual(34, f.duration)
        self.assertEqual('shot2', f.name)
        self.assertEqual(
            'file://localhost/home/eoyilmaz/maya/projects/default/data/shot2.mov',
            f.pathurl
        )

        # clip2
        c = t.clips[1]
        self.assertEqual(65, c.end)
        self.assertEqual('shot', c.name)
        self.assertEqual(True, c.enabled)
        self.assertEqual(35, c.start)
        self.assertEqual(0, c.in_)
        self.assertEqual(30, c.duration)
        self.assertEqual(30, c.out)

        f = c.file
        self.assertEqual(30, f.duration)
        self.assertEqual('shot', f.name)
        self.assertEqual(
            'file://localhost/home/eoyilmaz/maya/projects/default/data/shot.mov',
            f.pathurl
        )

        # clip3
        c = t.clips[2]
        self.assertEqual(110, c.end)
        self.assertEqual('shot1', c.name)
        self.assertEqual(True, c.enabled)
        self.assertEqual(65, c.start)
        self.assertEqual(0, c.in_)
        self.assertEqual(45, c.duration)
        self.assertEqual(45, c.out)

        f = c.file
        self.assertEqual(45, f.duration)
        self.assertEqual('shot1', f.name)
        self.assertEqual(
            'file://localhost/home/eoyilmaz/maya/projects/default/data/shot1.mov',
            f.pathurl
        )
Esempio n. 12
0
    def generate_sequence_structure(self):
        """Generates a Sequence structure suitable for XML<->EDL conversion

        :return: Sequence
        """
        import timecode
        from anima.env.mayaEnv import Maya

        m = Maya()
        fps = m.get_fps()

        # export only the first sequence, ignore others
        sequencers = self.sequences.get()
        if len(sequencers) == 0:
            return None

        sequencer = sequencers[0]
        time = pm.PyNode('time1')

        seq = Sequence()
        seq.name = str(sequencer.get_sequence_name())

        seq.rate = Rate(timebase=str(fps), ntsc=False)
        seq.timecode = str(timecode.Timecode(
            framerate=seq.rate.timebase,
            frames=time.timecodeProductionStart.get() + 1
        ))
        seq.duration = sequencer.duration

        media = Media()
        video = Video()
        media.video = video

        for shot in sequencer.shots.get():
            clip = Clip()
            clip.id = str(shot.full_shot_name)
            clip.name = str(shot.full_shot_name)
            clip.duration = shot.duration + 2 * shot.handle.get()
            clip.enabled = True
            clip.start = shot.sequenceStartFrame.get()
            clip.end = shot.sequenceEndFrame.get() + 1
            # clips always start from 0 and includes the shot handle
            clip.in_ = shot.handle.get()  # handle at start
            clip.out = shot.handle.get() + shot.duration  # handle at end
            clip.type = 'Video'  # always video for now

            f = File()
            f.name = os.path.splitext(
                os.path.basename(str(shot.output.get()))
            )[0]

            f.duration = shot.duration + 2 * shot.handle.get()

            f.pathurl = str('file://localhost/%s' % shot.output.get())

            clip.file = f

            track_number = shot.track.get() - 1  # tracks should start from 0
            try:
                track = video.tracks[track_number]
            except IndexError:
                track = Track()
                video.tracks.append(track)

            track.clips.append(clip)
            # set video resolution
            video.width = shot.wResolution.get()
            video.height = shot.hResolution.get()

        seq.media = media
        return seq