-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathEDL.py
123 lines (110 loc) · 4.96 KB
/
EDL.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
Class EDL(Base):
def __init__(self, project_name = "", video_files = [], audio_files = [], timecode = "00:00:00:00", edits = [], play_times = [], clip_names = [], fps = 29.97, codec = "uncompressed", resolution = "HD", aspect_ratio = "16:9", total_clips = 0, total_runtime = 0, subtitles_srt = "", metadata = ""):
self.project_name = project_name
self.video_files = video_files
self.audio_files = audio_files
self.timecode = timecode
self.edits = edits
self.play_times = play_times
self.clip_names = clip_names
self.fps = fps
self.codec = codec
self.resolution = resolution
self.aspect_ratio = aspect_ratio
self.total_clips = total_clips
self.total_runtime = total_runtime
self.edlfile = edlfile
if (os.path.exists(self.edlfile) == False):
open(self.edlfile, 'a').close()
else:
with open(self.edlfile) as f:
for line in f.readlines():
if len(line.split()) == 3:
video_files = relationship("VideoFile", back_populates="edl")
audio_files = relationship("AudioFile", back_populates="edl")
__tablename__ = 'edl'
id = Column(Integer, primary_key=True)
project_name = Column(String)
timecode = Column(String)
fps = Column(String)
codec = Column(String)
resolution = Column(String)
aspect_ratio = Column(String)
total_clips = Column(Integer)
total_runtime = Column(Integer)
subtitles_srt = Column(String)
metadata = Column(String)
def parse_timecode(self, timecode_str):
timecode_parts = timecode_str.split(":")
frames = int(timecode_parts[3]) * self.fps
seconds = int(timecode_parts[2])
minutes = int(timecode_parts[1])
hours = int(timecode_parts[0])
total_frames = int(frames + (seconds * self.fps) + (minutes * self.fps * 60) + (hours * self.fps * 60 * 60))
return total_frames
def add_edit_from_srt(self, start_time, end_time, filename):
start_frames = self.parse_timecode(start_time)
end_frames = self.parse_timecode(end_time)
self.add_edit(start_frames, end_frames, filename)
def add_edit(self, start_frames, end_frames, filename):
self.edits.append((start_frames, end_frames, filename))
self.total_clips += 1
def to_edl_string(self):
edl_string = ""
edl_string += "TITLE: " + self.project_name + "\n"
edl_string += "FCM: NON-DROP FRAME\n"
for edit in self.edits:
start_frames = edit[0]
end_frames = edit[1]
filename = edit[2]
start_timecode = self.frames_to_timecode(start_frames)
end_timecode = self.frames_to_timecode(end_frames)
edl_string += "00:00:00:00 " + start_timecode + " " + filename + " " + start_timecode + " " + end_timecode + " " + filename + "\n"
return edl_string
def frames_to_timecode(self, frames):
total_seconds = frames / self.fps
hours = int(total_seconds / 3600)
minutes = int((total_seconds - hours * 3600) / 60)
seconds = int(total_seconds - hours * 3600 - minutes * 60)
milliseconds = int((total_seconds - int(total_seconds)) * 1000)
return f"{hours:02}:{minutes:02}:{seconds:02},{milliseconds:03}"
def parse_srt(srt_file):
__tablename__ = 'video_files'
id = Column(Integer, primary_key=True)
video_file = Column(String)
edl_id = Column(Integer, ForeignKey('edl.id'))
if not isinstance(srt_file, str):
raise TypeError("Invalid input type for srt_file, expected string, got {}".format(type(srt_file)))
srt_lines = srt_file.split('\n')
if len(srt_lines) == 0:
raise ValueError("Invalid input for srt_file, no lines found")
timecodes = []
current_line = 1
while current_line < len(srt_lines):
if srt_lines[current_line].strip() == '':
current_line += 1
continue
try:
start, end = srt_lines[current_line].split(' --> ')
except ValueError as e:
raise ValueError("Invalid format for timecode in line {} of srt_file, expected 'start --> end' format".format(current_line)) from e
start = start.strip()
end = end.strip()
timecodes.append((start, end))
current_line += 3
return timecodes
class VideoFile(Base):
__tablename__ = 'video_files'
id = Column(Integer, primary_key=True)
video_file = Column(String)
edl_id = Column(Integer, ForeignKey('edl.id'))
class AudioFile(Base):
__tablename__ = 'audio_files'
id = Column(Integer, primary_key=True)
audio_file = Column(String)
edl_id = Column(Integer, ForeignKey('edl.id'))
Base.metadata.create_all(engine)