From b4f6fe41ca4fd792fece6ce5e70a6bfb13c74c63 Mon Sep 17 00:00:00 2001 From: Drugsosos <44712637+Drugsosos@users.noreply.github.com> Date: Mon, 11 Jul 2022 04:37:21 +0300 Subject: [PATCH] fixes in async code & other fixes --- video_creation/final_video.py | 57 ++++++++++++------------- video_creation/screenshot_downloader.py | 31 ++++++++------ video_creation/voices.py | 15 +++++-- 3 files changed, 56 insertions(+), 47 deletions(-) diff --git a/video_creation/final_video.py b/video_creation/final_video.py index 7d07b9f..f566711 100755 --- a/video_creation/final_video.py +++ b/video_creation/final_video.py @@ -73,7 +73,7 @@ def make_final_video( clip_start: float, ) -> 'AudioFileClip': return ( - AudioFileClip(f'assets/audio/{clip_title}.mp3') + AudioFileClip(f'assets/temp/mp3/{clip_title}.mp3') .set_start(clip_start) ) @@ -90,32 +90,27 @@ def make_final_video( audio_clips.append(audio_title) indexes_for_videos = list() - for audio in track( - indexes_of_clips, + for idx, audio in track( + enumerate(indexes_of_clips), description='Gathering audio clips...', ): temp_audio_clip = create_audio_clip( audio, video_duration, ) - if video_duration + temp_audio_clip.duration > max_length: - continue - video_duration += temp_audio_clip.duration - audio_clips.append(temp_audio_clip) - indexes_for_videos.append(audio) - - for idx in indexes_of_clips: - audio_clips.append(AudioFileClip(f'assets/temp/mp3/{idx}.mp3')) + if video_duration + temp_audio_clip.duration <= max_length: + video_duration += temp_audio_clip.duration + audio_clips.append(temp_audio_clip) + indexes_for_videos.append(idx) + audio_composite = concatenate_audioclips(audio_clips) - console.log(f'[bold green] Video Will Be: {audio_composite.length} Seconds Long') - # add title to video - image_clips = list() + console.log(f'[bold green] Video Will Be: {video_duration} Seconds Long') + # Gather all images new_opacity = 1 if opacity is None or float(opacity) >= 1 else float(opacity) # TODO move to pydentic and percents def create_image_clip( - self, image_title: str | int, audio_start: float, audio_end: float, @@ -123,30 +118,32 @@ def make_final_video( ) -> 'ImageClip': return ( ImageClip(f'assets/temp/png/{image_title}.png') - .set_start(audio_start - self.time_before_tts) - .set_end(audio_end + self.time_before_tts) - .set_duration(self.time_before_tts * 2 + audio_duration, change_end=False) + .set_start(audio_start) + .set_end(audio_end) + .set_duration(audio_duration, change_end=False) .set_opacity(new_opacity) .resize(width=W - 100) ) - index_offset = 1 + # add title to video + image_clips = list() - image_clips.insert( - 0, - ImageClip('assets/temp/png/title.png') - .set_duration(audio_clips[0].duration) - .resize(width=W - 100) - .set_opacity(new_opacity), + image_clips.append( + create_image_clip( + 'title', + audio_clips[0].start, + audio_clips[0].end, + audio_clips[0].duration + ) ) - for photo_idx in indexes_of_clips: + for photo_idx in indexes_for_videos: image_clips.append( create_image_clip( f'comment_{photo_idx}', - audio_clips[photo_idx + index_offset].start, - audio_clips[photo_idx + index_offset].end, - audio_clips[photo_idx + index_offset].duration + audio_clips[photo_idx].start, + audio_clips[photo_idx].end, + audio_clips[photo_idx].duration ) ) @@ -218,7 +215,7 @@ def make_final_video( 'assets/temp/temp_audio.mp4', 0, video_duration, - targetname=f"results/{subreddit}/{filename}", + targetname=f'results/{subreddit}/{filename}', ) else: print('debug duck') diff --git a/video_creation/screenshot_downloader.py b/video_creation/screenshot_downloader.py index 95109a6..81c7850 100644 --- a/video_creation/screenshot_downloader.py +++ b/video_creation/screenshot_downloader.py @@ -18,7 +18,6 @@ from attr import attrs, attrib from attr.validators import instance_of, optional from typing import TypeVar, Optional, Callable, Union - _function = TypeVar('_function', bound=Callable[..., object]) _exceptions = TypeVar('_exceptions', bound=Optional[Union[type, tuple, list]]) @@ -212,12 +211,7 @@ class RedditScreenshot(Browser, Wait): screenshot_idx (int): List with indexes of voiced comments """ reddit_object: dict - screenshot_idx: list = attrib() - - @screenshot_idx.validator - def validate_screenshot_idx(self, attribute, value): - if value <= 0: - raise ValueError('Check screenshot_num in config') + screenshot_idx: list async def __dark_theme( self, @@ -352,12 +346,21 @@ class RedditScreenshot(Browser, Wait): self.screenshot_idx ] - for task in track( - as_completed(async_tasks_primary), - description='Downloading screenshots...', - total=async_tasks_primary.__len__(), - ): - await task + def chunks(lst, n): + """Yield successive n-sized chunks from lst.""" + for i in range(0, len(lst), n): + yield lst[i:i + n] - print_substep('Screenshots downloaded Successfully.', style='bold green') + for idx, tasks in enumerate( + [chunk for chunk in chunks(async_tasks_primary, 15)], + start=1, + ): + for task in track( + as_completed(tasks), + description=f'Downloading comments: Chunk {idx}', + total=tasks.__len__() + ): + await task + + print_substep('Comments downloaded Successfully.', style='bold green') await self.close_browser() diff --git a/video_creation/voices.py b/video_creation/voices.py index b4eaf1f..e792ec3 100644 --- a/video_creation/voices.py +++ b/video_creation/voices.py @@ -37,13 +37,22 @@ async def save_text_to_mp3( if voice.casefold() in map(lambda _: _.casefold(), TTSProviders): break print('Unknown Choice') - engine_instance = TTSEngine(get_case_insensitive_key_value(TTSProviders, voice), reddit_obj) - return await engine_instance.run() + TTS_instance = get_case_insensitive_key_value(TTSProviders, voice) + if TTS_instance == StreamlabsPolly or TTS_instance == TikTok: + from aiohttp import ClientSession + + async with ClientSession() as client: + engine_instance = TTSEngine(TTS_instance(client), reddit_obj) + results = await engine_instance.run() + else: + engine_instance = TTSEngine(TTS_instance, reddit_obj) + results = await engine_instance.run() + return results def get_case_insensitive_key_value( input_dict, - key + key, ) -> object: return next( (value for dict_key, value in input_dict.items() if dict_key.lower() == key.lower()),