Here’s how far I am atm. Correct the export path in the last line of the script to test it. I haven’t found out how to pull information on crossfades and fades. Any help much appreciated.
import bpy
import os
"""
export_edl.py -- Export of Edit Description List ("EDL") files.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
# TimeCode class by Campbell Barton
class TimeCode:
"""
Simple timecode class
also supports conversion from other time strings used by EDL
"""
__slots__ = (
"fps",
"hours",
"minutes",
"seconds",
"frame",
)
def __init__(self, data, fps):
self.fps = fps
if type(data) == str:
self.from_string(data)
frame = self.as_frame()
self.from_frame(frame)
else:
self.from_frame(data)
def from_string(self, text):
# hh:mm:ss:ff
# No dropframe support yet
if text.lower().endswith("mps"): # 5.2mps
return self.from_frame(int(float(text[:-3]) * self.fps))
elif text.lower().endswith("s"): # 5.2s
return self.from_frame(int(float(text[:-1]) * self.fps))
elif text.isdigit(): # 1234
return self.from_frame(int(text))
elif ":" in text: # hh:mm:ss:ff
text = text.replace(";", ":").replace(",", ":").replace(".", ":")
text = text.split(":")
self.hours = int(text[0])
self.minutes = int(text[1])
self.seconds = int(text[2])
self.frame = int(text[3])
return self
else:
print("ERROR: could not convert this into timecode %r" % text)
return self
def from_frame(self, frame):
if frame < 0:
frame = -frame
neg = True
else:
neg = False
fpm = 60 * self.fps
fph = 60 * fpm
if frame < fph:
self.hours = 0
else:
self.hours = int(frame / fph)
frame = frame % fph
if frame < fpm:
self.minutes = 0
else:
self.minutes = int(frame / fpm)
frame = frame % fpm
if frame < self.fps:
self.seconds = 0
else:
self.seconds = int(frame / self.fps)
frame = frame % self.fps
self.frame = frame
if neg:
self.frame = -self.frame
self.seconds = -self.seconds
self.minutes = -self.minutes
self.hours = -self.hours
return self
def as_frame(self):
abs_frame = self.frame
abs_frame += self.seconds * self.fps
abs_frame += self.minutes * 60 * self.fps
abs_frame += self.hours * 60 * 60 * self.fps
return abs_frame
def as_string(self):
self.from_frame(int(self))
return "%.2d:%.2d:%.2d:%.2d" % (self.hours, self.minutes, self.seconds, self.frame)
def __repr__(self):
return self.as_string()
# Numeric stuff, may as well have this
def __neg__(self):
return TimeCode(-int(self), self.fps)
def __int__(self):
return self.as_frame()
def __sub__(self, other):
return TimeCode(int(self) - int(other), self.fps)
def __add__(self, other):
return TimeCode(int(self) + int(other), self.fps)
def __mul__(self, other):
return TimeCode(int(self) * int(other), self.fps)
def __div__(self, other):
return TimeCode(int(self) // int(other), self.fps)
def __abs__(self):
return TimeCode(abs(int(self)), self.fps)
def __iadd__(self, other):
return self.from_frame(int(self) + int(other))
def __imul__(self, other):
return self.from_frame(int(self) * int(other))
def __idiv__(self, other):
return self.from_frame(int(self) // int(other))
# end timecode
#EDLBlock Copyright (C) 2015 William R. Zwicky <[email protected]>
class EDLBlock:
def __init__(self):
self.id = 0
"""Num, 3 digits, officially 001-999. Non-num makes row a comment."""
self.reel = None
"""Reference to media file or tape.
Officially: 4-digit num, optional B; or BL for black,
or AX for aux source.
Unofficially: any string."""
self.channels = None
"""A=audio1,V=video1,B=A+V,A2=audio2,A2/V=A2+V,AA=A1+A2,AA/V=A1+A2+V"""
self.transition = None
"""C=cut,
D=dissolve,
Wxxx=wipe type xxx,
KB=key background,
K=key foreground,
KO=key foreground mask"""
self.transDur = None
"""3-digit duration, in frames, or lone F"""
self.srcIn = None
"""timecode (hh:mm:ss:ff)"""
self.srcOut = None
"""timecode (hh:mm:ss:ff)"""
self.recIn = None
"""timecode (hh:mm:ss:ff)"""
self.recOut = None
"""timecode (hh:mm:ss:ff). Either out-time or duration.
Ignored on read; clip length is srcOut-srcIn."""
self.file = None
"""filename and extention, but no path"""
class EDL(list):
def __init__(self):
self.title = None
self.dropframe = False
self.reels = {}
#self.edits = []
def load(filename):
pass
def savePremiere(self):
# CMX 3600:
# 111^^222^^3333^^4444^555^666666666666^777777777777^888888888888^999999999999^
# Old Lightworks converter:
# 003 E00706EU V D 030 00:00:26:29 00:00:32:10 00:00:01:02 00:00:07:13
# 111^^22222222^3333^4444^555^^66666666666^77777777777^88888888888^99999999999
# Export from Premiere:
# 003 AX AA C 00:00:00:10 00:02:03:24 00:00:53:25 00:02:57:09
# * FROM CLIP NAME: Ep6_Sc2 - Elliot tries again with Tiff.mp4
s=""
if not not self.title:
s="TITLE: " + self.title+"
"
if self.dropframe:
s += "FCM: DROP FRAME"+"
"
else:
s += "FCM: NON DROP FRAME"+"
"
for block in self:
s += "%03d %-8s %-4s %-4s %03s %-11s %-11s %-11s %-11s" \
% (block.id, block.reel, block.channels,
block.transition, block.transDur,
block.srcIn, block.srcOut, block.recIn, block.recOut)+"
* FROM CLIP NAME: " + block.file + "
"
print(s)
return(s)
context = bpy.context
scene = context.scene
vse = scene.sequence_editor
edl_fps=scene.render.fps
id_count=1
e = EDL()
e.title = "Test script"
e.dropframe=False
for strip in vse.sequences_all:
# # Edit Strip Panel
# #print("-" * 72)
# print(strip.name)
# print(strip.type)
# # extend for other strip types.
# if strip.type in ['MOVIE']:
# print(strip.filepath)
# elif strip.type in ['SOUND']:
# print(strip.sound.filepath)
# print(strip.channel)
# print(strip.frame_start)
# print(strip.frame_final_duration)
# # Trim Duration (soft)
# print(strip.frame_offset_start)
# print(strip.frame_offset_end)
b = EDLBlock()
b.id = id_count
id_count=id_count+1
if strip.type in ['MOVIE']:
reelname = bpy.path.basename(strip.filepath)
b.file=reelname
reelname = os.path.splitext(reelname)[0]
b.reel = ((reelname+" ")[0:8])
b.channels = "V "
elif strip.type in ['SOUND']:
reelname = bpy.path.basename(strip.sound.filepath)
b.file=reelname
reelname = os.path.splitext(reelname)[0]
b.reel = ((reelname+" ")[0:8])
b.channels = "A "
#elif strip.type in ['CROSS']:
b.transition = "C "
b.transDur = " "
b.srcIn = TimeCode(strip.frame_offset_start,edl_fps)
b.srcOut = TimeCode(strip.frame_offset_start+strip.frame_final_duration,edl_fps)
b.recIn = TimeCode(strip.frame_final_start,edl_fps)
b.recOut = TimeCode(strip.frame_final_end,edl_fps)
e.append(b)
#write to a file
file_handle = open("C:/Users/User/Desktop/mytest.edl","w")
file_handle.write(e.savePremiere())
file_handle.close()