File size: 3,316 Bytes
cf72e88
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import json
from pathlib import Path

import stable_whisper as whisper
from .logger import setup_logger
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()
logger = setup_logger()
media_folder = HOME / 'media'


class VideoCreator:
    def __init__(self, video, args):
        self.args = args
        self.video = video

        self.series = video.get('series', '')
        self.part = video.get('part', '')
        self.text = video.get('text', '')
        self.tags = video.get('tags', list())
        self.outro = video.get('outro', '')
        self.path = Path(media_folder).absolute()

    def download_video(self, folder='background'):
        youtube_download(url=self.args.url, folder=folder)
        console.log(
            f"{msg.OK}Video downloaded from {self.args.url} to {folder}")
        logger.info(f"Video downloaded from {self.args.url} to {folder}")

    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 create_text(self):
        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):
        await tts(self.req_text, outfile=self.mp3_file, voice=self.args.tts, args=self.args)

    def generate_transcription(self):
        ass_filename = srt_create(self.model,
                                  self.path, self.series, self.part, self.text, self.mp3_file, **vars(self.args))
        ass_filename = Path(ass_filename).absolute()

        self.ass_file = ass_filename
        return ass_filename

    def select_background(self):
        try:
            # Background video selected with WebUI
            background_mp4 = self.args.mp4_background

            with KeepDir() as keep_dir:
                keep_dir.chdir("background")
                background_mp4 = Path(background_mp4).absolute()
        except AttributeError:
            # CLI execution
            background_mp4 = random_background()

        background_mp4 = str(Path(background_mp4).absolute())

        self.mp4_background = background_mp4
        return background_mp4

    def integrate_subtitles(self):
        final_video = prepare_background(
            self.mp4_background, filename_mp3=self.mp3_file, filename_srt=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):
        uploaded = upload_tiktok(str(
            self.mp4_final_video), title=f"{self.series} - {self.part}", tags=self.tags, headless=not self.args.verbose)
        return uploaded