commit
1e64625f7a
@ -0,0 +1,45 @@
|
|||||||
|
# Supported Background. Can add/remove background video here....
|
||||||
|
# <key>-<value> : key -> used as keyword for TOML file. value -> background configuration
|
||||||
|
# Format (value):
|
||||||
|
# 1. Youtube URI
|
||||||
|
# 2. filename
|
||||||
|
# 3. Citation (owner of the video)
|
||||||
|
# 4. Position of image clips in the background. See moviepy reference for more information. (https://zulko.github.io/moviepy/ref/VideoClip/VideoClip.html#moviepy.video.VideoClip.VideoClip.set_position)
|
||||||
|
background_options = {
|
||||||
|
"motor-gta": ( # Motor-GTA Racing
|
||||||
|
"https://www.youtube.com/watch?v=vw5L4xCPy9Q",
|
||||||
|
"bike-parkour-gta.mp4",
|
||||||
|
"Achy Gaming",
|
||||||
|
lambda t: ("center", 480 + t),
|
||||||
|
),
|
||||||
|
"rocket-league": ( # Rocket League
|
||||||
|
"https://www.youtube.com/watch?v=2X9QGY__0II",
|
||||||
|
"rocket_league.mp4",
|
||||||
|
"Orbital Gameplay",
|
||||||
|
lambda t: ("center", 200 + t),
|
||||||
|
),
|
||||||
|
"minecraft": ( # Minecraft parkour
|
||||||
|
"https://www.youtube.com/watch?v=n_Dv4JMiwK8",
|
||||||
|
"parkour.mp4",
|
||||||
|
"bbswitzer",
|
||||||
|
"center",
|
||||||
|
),
|
||||||
|
"gta": ( # GTA Stunt Race
|
||||||
|
"https://www.youtube.com/watch?v=qGa9kWREOnE",
|
||||||
|
"gta-stunt-race.mp4",
|
||||||
|
"Achy Gaming",
|
||||||
|
lambda t: ("center", 480 + t),
|
||||||
|
),
|
||||||
|
"csgo-surf": ( # CSGO Surf
|
||||||
|
"https://www.youtube.com/watch?v=E-8JlyO59Io",
|
||||||
|
"csgo-surf.mp4",
|
||||||
|
"Aki",
|
||||||
|
"center",
|
||||||
|
),
|
||||||
|
"cluster-truck": ( # Cluster Truck Gameplay
|
||||||
|
"https://www.youtube.com/watch?v=uVKxtdMgJVU",
|
||||||
|
"cluster_truck.mp4",
|
||||||
|
"No Copyright Gameplay",
|
||||||
|
lambda t: ("center", 480 + t),
|
||||||
|
),
|
||||||
|
}
|
@ -0,0 +1,51 @@
|
|||||||
|
from typing import Tuple
|
||||||
|
|
||||||
|
from PIL import ImageFont, Image, ImageDraw, ImageEnhance
|
||||||
|
from moviepy.video.VideoClip import VideoClip, ImageClip
|
||||||
|
from moviepy.video.compositing.CompositeVideoClip import CompositeVideoClip
|
||||||
|
|
||||||
|
|
||||||
|
class Video:
|
||||||
|
def __init__(self, video: VideoClip, *args, **kwargs):
|
||||||
|
self.video: VideoClip = video
|
||||||
|
self.fps = self.video.fps
|
||||||
|
self.duration = self.video.duration
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _create_watermark(text, fontsize, opacity=0.5):
|
||||||
|
path = "./assets/temp/png/watermark.png"
|
||||||
|
width = int(fontsize * len(text))
|
||||||
|
height = int(fontsize * len(text) / 2)
|
||||||
|
white = (255, 255, 255)
|
||||||
|
transparent = (0, 0, 0, 0)
|
||||||
|
|
||||||
|
font = ImageFont.load_default()
|
||||||
|
wm = Image.new("RGBA", (width, height), transparent)
|
||||||
|
im = Image.new("RGBA", (width, height), transparent) # Change this line too.
|
||||||
|
|
||||||
|
draw = ImageDraw.Draw(wm)
|
||||||
|
w, h = draw.textsize(text, font)
|
||||||
|
draw.text(((width - w) / 2, (height - h) / 2), text, white, font)
|
||||||
|
en = ImageEnhance.Brightness(wm) # TODO allow it to use the fontsize
|
||||||
|
mask = en.enhance(1 - opacity)
|
||||||
|
im.paste(wm, (25, 25), mask)
|
||||||
|
im.save(path)
|
||||||
|
return ImageClip(path)
|
||||||
|
|
||||||
|
def add_watermark(
|
||||||
|
self, text, opacity=0.5, duration: int | float = 5, position: Tuple = (0.7, 0.9), fontsize=15
|
||||||
|
):
|
||||||
|
compensation = round(
|
||||||
|
(position[0] / ((len(text) * (fontsize / 5) / 1.5) / 100 + position[0] * position[0])),
|
||||||
|
ndigits=2,
|
||||||
|
)
|
||||||
|
position = (compensation, position[1])
|
||||||
|
img_clip = self._create_watermark(text, opacity=opacity, fontsize=fontsize)
|
||||||
|
img_clip = img_clip.set_opacity(opacity).set_duration(duration)
|
||||||
|
img_clip = img_clip.set_position(
|
||||||
|
position, relative=True
|
||||||
|
) # TODO get data from utils/CONSTANTS.py and adapt position accordingly
|
||||||
|
|
||||||
|
# Overlay the img clip on the first video clip
|
||||||
|
self.video = CompositeVideoClip([self.video, img_clip])
|
||||||
|
return self.video
|
Loading…
Reference in new issue