119 lines
3.3 KiB
Python
119 lines
3.3 KiB
Python
|
"""
|
||
|
This module contains different functions to make end and opening
|
||
|
credits, even though it is difficult to fill everyone needs in this
|
||
|
matter.
|
||
|
"""
|
||
|
|
||
|
from moviepy.video.compositing.CompositeVideoClip import CompositeVideoClip
|
||
|
from moviepy.video.fx.resize import resize
|
||
|
from moviepy.video.VideoClip import ImageClip, TextClip
|
||
|
|
||
|
|
||
|
def credits1(creditfile, width, stretch=30, color='white', stroke_color='black',
|
||
|
stroke_width=2, font='Impact-Normal', fontsize=60, gap=0):
|
||
|
"""
|
||
|
|
||
|
Parameters
|
||
|
-----------
|
||
|
|
||
|
creditfile
|
||
|
A text file whose content must be as follows: ::
|
||
|
|
||
|
# This is a comment
|
||
|
# The next line says : leave 4 blank lines
|
||
|
.blank 4
|
||
|
|
||
|
..Executive Story Editor
|
||
|
MARCEL DURAND
|
||
|
|
||
|
..Associate Producers
|
||
|
MARTIN MARCEL
|
||
|
DIDIER MARTIN
|
||
|
|
||
|
..Music Supervisor
|
||
|
JEAN DIDIER
|
||
|
|
||
|
width
|
||
|
Total width of the credits text in pixels
|
||
|
|
||
|
gap
|
||
|
Horizontal gap in pixels between the jobs and the names
|
||
|
|
||
|
color
|
||
|
Color of the text. See ``TextClip.list('color')``
|
||
|
for a list of acceptable names.
|
||
|
|
||
|
font
|
||
|
Name of the font to use. See ``TextClip.list('font')`` for
|
||
|
the list of fonts you can use on your computer.
|
||
|
|
||
|
fontsize
|
||
|
Size of font to use
|
||
|
|
||
|
stroke_color
|
||
|
Color of the stroke (=contour line) of the text. If ``None``,
|
||
|
there will be no stroke.
|
||
|
|
||
|
stroke_width
|
||
|
Width of the stroke, in pixels. Can be a float, like 1.5.
|
||
|
|
||
|
|
||
|
Returns
|
||
|
---------
|
||
|
|
||
|
image
|
||
|
An ImageClip instance that looks like this and can be scrolled
|
||
|
to make some credits:
|
||
|
|
||
|
Executive Story Editor MARCEL DURAND
|
||
|
Associate Producers MARTIN MARCEL
|
||
|
DIDIER MARTIN
|
||
|
Music Supervisor JEAN DIDIER
|
||
|
|
||
|
"""
|
||
|
|
||
|
# PARSE THE TXT FILE
|
||
|
texts = []
|
||
|
oneline = True
|
||
|
|
||
|
with open(creditfile) as f:
|
||
|
for l in f:
|
||
|
if l.startswith(('\n', '#')):
|
||
|
# exclude blank lines or comments
|
||
|
continue
|
||
|
elif l.startswith('.blank'):
|
||
|
# ..blank n
|
||
|
for i in range(int(l.split(' ')[1])):
|
||
|
texts.append(['\n', '\n'])
|
||
|
elif l.startswith('..'):
|
||
|
texts.append([l[2:], ''])
|
||
|
oneline = True
|
||
|
elif oneline:
|
||
|
texts.append(['', l])
|
||
|
oneline = False
|
||
|
else:
|
||
|
texts.append(['\n', l])
|
||
|
|
||
|
left, right = ("".join(l) for l in zip(*texts))
|
||
|
|
||
|
# MAKE TWO COLUMNS FOR THE CREDITS
|
||
|
left, right = [TextClip(txt, color=color, stroke_color=stroke_color,
|
||
|
stroke_width=stroke_width, font=font,
|
||
|
fontsize=fontsize, align=al)
|
||
|
for txt, al in [(left, 'East'), (right, 'West')]]
|
||
|
|
||
|
cc = CompositeVideoClip([left, right.set_position((left.w + gap, 0))],
|
||
|
size=(left.w + right.w + gap, right.h),
|
||
|
bg_color=None)
|
||
|
|
||
|
# SCALE TO THE REQUIRED SIZE
|
||
|
|
||
|
scaled = resize(cc, width=width)
|
||
|
|
||
|
# TRANSFORM THE WHOLE CREDIT CLIP INTO AN ImageCLip
|
||
|
|
||
|
imclip = ImageClip(scaled.get_frame(0))
|
||
|
amask = ImageClip(scaled.mask.get_frame(0), ismask=True)
|
||
|
|
||
|
return imclip.set_mask(amask)
|