|
from pathlib import Path |
|
|
|
import stable_whisper as whisper |
|
|
|
|
|
from .subtitle_creator import srt_create |
|
from .text_to_speech import tts |
|
from .tiktok import upload_tiktok |
|
from .video_prepare import prepare_background |
|
from .video_downloader import download_video as youtube_download |
|
from utils import * |
|
|
|
HOME = Path.cwd() |
|
media_folder = HOME / 'media' |
|
|
|
|
|
class ClipMaker: |
|
def __init__(self, clip: dict, args): |
|
self.clip = clip |
|
self.args = args |
|
|
|
|
|
self.series = clip.get('series', 'Crazy facts that you did not know') |
|
self.part = clip.get('part', '1') |
|
self.text = clip.get('text', 'The first person to survive going over Niagara Falls in a barrel was a 63-year-old school teacher') |
|
self.tags = clip.get('tags', ['survive', 'Niagara Falls', 'facts']) |
|
self.outro = clip.get('outro', 'I hope you enjoyed this video. If you did, please give it a thumbs up and subscribe to my channel. I will see you in the next video.') |
|
|
|
|
|
self.path = Path(media_folder).absolute() |
|
|
|
def download_background_video(self, folder='background') -> None: |
|
|
|
youtube_download(url=self.args.url, folder=folder) |
|
|
|
console.log(f"{msg.OK}Video downloaded from {self.args.url} to {folder}") |
|
return None |
|
|
|
def load_model(self): |
|
|
|
model = self.args.model |
|
|
|
if self.args.model != "large" and not self.args.non_english: |
|
model = self.args.model + ".en" |
|
|
|
whisper_model = whisper.load_model(model) |
|
|
|
|
|
self.model = whisper_model |
|
return whisper_model |
|
|
|
def merge_clip_text(self) -> tuple: |
|
|
|
req_text = f"{self.series} - Part {self.part}.\n{self.text}\n{self.outro}" |
|
|
|
|
|
series = self.series.replace(' ', '_') |
|
filename = f"{self.path}{os.sep}{series}{os.sep}{series}_{self.part}.mp3" |
|
|
|
|
|
Path(f"{self.path}{os.sep}{series}").mkdir(parents=True, exist_ok=True) |
|
|
|
|
|
self.req_text = req_text |
|
self.mp3_file = filename |
|
return req_text, filename |
|
|
|
async def text_to_speech(self) -> None: |
|
|
|
await tts(self.req_text, outfile=self.mp3_file, voice=self.args.tts, args=self.args) |
|
return None |
|
|
|
def generate_transcription(self) -> Path: |
|
|
|
ass_filename = srt_create(self.model, |
|
self.path, self.series, self.part, self.mp3_file, **vars(self.args)) |
|
|
|
|
|
ass_filename = Path(ass_filename).absolute() |
|
|
|
|
|
self.ass_file = ass_filename |
|
return ass_filename |
|
|
|
def select_background(self, random: bool = True) -> Path: |
|
|
|
try: |
|
|
|
|
|
background_file = self.args.mp4_background |
|
background_mp4 = Path(HOME / 'background' / background_file) |
|
background_mp4 = background_mp4.absolute() |
|
|
|
except AttributeError: |
|
if random: |
|
background_mp4 = random_background() |
|
|
|
else: |
|
pass |
|
|
|
|
|
self.mp4_background = background_mp4 |
|
return background_mp4 |
|
|
|
def integrate_subtitles(self) -> Path: |
|
|
|
final_video = prepare_background(str(self.mp4_background), filename_mp3=self.mp3_file, filename_srt=str(self.ass_file), verbose=self.args.verbose) |
|
final_video = Path(final_video).absolute() |
|
|
|
|
|
self.mp4_final_video = final_video |
|
return final_video |
|
|
|
def upload_to_tiktok(self) -> bool: |
|
|
|
uploaded = upload_tiktok(str(self.mp4_final_video), title=f"{self.series} - {self.part}", tags=self.tags, headless=not self.args.verbose) |
|
return uploaded |
|
|