From 2e5202e33d5b247b6530900e8a3ccd9c60ba9b58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaros=C5=82aw=20Wieczorek?= Date: Sun, 10 Jan 2021 11:09:45 +0100 Subject: [PATCH] Removing the TypeScript from the podcast generation process. Pylama fixes. Add icons. --- Pipfile | 1 + Pipfile.lock | 17 ++- bash_commands/connect_sound.sh | 5 + bash_commands/create_raw_files.sh | 8 ++ bash_commands/generate_video_by_demuxer.sh | 5 + bash_commands/split_channels_to_two_ways.sh | 5 + demuxer.txt | 33 ++++++ find_loudness.py | 52 +++++++++ generate_demuxer.py | 91 ++++++++++++++++ src/gui/images/icons/32x32.png | Bin 0 -> 1346 bytes src/gui/images/icons/45x45.png | Bin 0 -> 1530 bytes src/gui/images/icons/60x60.png | Bin 0 -> 1775 bytes src/gui/images/icons/generowanie.png | Bin 0 -> 840 bytes src/gui/images/icons/info.png | Bin 0 -> 950 bytes src/gui/images/icons/otworz.png | Bin 0 -> 1203 bytes src/gui/images/icons/podglad.png | Bin 0 -> 2310 bytes src/gui/images/icons/ustawienia.png | Bin 0 -> 1393 bytes src/gui/images/icons/zapis-n.png | Bin 0 -> 1419 bytes src/gui/images/icons/zapis.png | Bin 0 -> 780 bytes src/python/classes/mainwindow.py | 112 +++++++++++++++----- 20 files changed, 304 insertions(+), 25 deletions(-) create mode 100644 bash_commands/connect_sound.sh create mode 100644 bash_commands/create_raw_files.sh create mode 100644 bash_commands/generate_video_by_demuxer.sh create mode 100644 bash_commands/split_channels_to_two_ways.sh create mode 100644 demuxer.txt create mode 100644 find_loudness.py create mode 100644 generate_demuxer.py create mode 100644 src/gui/images/icons/32x32.png create mode 100644 src/gui/images/icons/45x45.png create mode 100644 src/gui/images/icons/60x60.png create mode 100644 src/gui/images/icons/generowanie.png create mode 100644 src/gui/images/icons/info.png create mode 100644 src/gui/images/icons/otworz.png create mode 100644 src/gui/images/icons/podglad.png create mode 100644 src/gui/images/icons/ustawienia.png create mode 100644 src/gui/images/icons/zapis-n.png create mode 100644 src/gui/images/icons/zapis.png diff --git a/Pipfile b/Pipfile index cff5b2b..6e4d2ed 100644 --- a/Pipfile +++ b/Pipfile @@ -10,6 +10,7 @@ pipfile-requirements = "*" pylama = "*" ffmpeg = "*" pip = "*" +ffmpeg-python = "*" [dev-packages] diff --git a/Pipfile.lock b/Pipfile.lock index 7d1d3d3..7d192f9 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "a59428c79a266fc1237cdd4e74b0803bb5f39803495f1fc6c134df7333cdc2bc" + "sha256": "6c12b28b456a859b8139dd5175876beeec58f47abcfbcb6d98dbfdc3a955320d" }, "pipfile-spec": 6, "requires": { @@ -31,6 +31,14 @@ "index": "pypi", "version": "==1.4" }, + "ffmpeg-python": { + "hashes": [ + "sha256:65225db34627c578ef0e11c8b1eb528bb35e024752f6f10b78c011f6f64c4127", + "sha256:ac441a0404e053f8b6a1113a77c0f452f1cfc62f6344a769475ffdc0f56c23c5" + ], + "index": "pypi", + "version": "==0.2.0" + }, "flask": { "hashes": [ "sha256:4efa1ae2d7c9865af48986de8aeb8504bf32c7f3d6fdc9353d34b21f4b127060", @@ -39,6 +47,13 @@ "index": "pypi", "version": "==1.1.2" }, + "future": { + "hashes": [ + "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d" + ], + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==0.18.2" + }, "itsdangerous": { "hashes": [ "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19", diff --git a/bash_commands/connect_sound.sh b/bash_commands/connect_sound.sh new file mode 100644 index 0000000..98cc6e7 --- /dev/null +++ b/bash_commands/connect_sound.sh @@ -0,0 +1,5 @@ +#!/bin/bash +tmp_dir=$1 +audio=$2 + +ffmpeg -i $tmp_dir/video/video.mp4 -i $audio -ac 1 -tune stillimage ./out/video-and-audio.mp4 -y diff --git a/bash_commands/create_raw_files.sh b/bash_commands/create_raw_files.sh new file mode 100644 index 0000000..5df355d --- /dev/null +++ b/bash_commands/create_raw_files.sh @@ -0,0 +1,8 @@ +#!/bin/bash +tmp_dir=$1 +aresample=$2 + +ffmpeg -i $tmp_dir/left.wav -ac 1 -filter:a aresample=$aresample -map 0:a -c:a pcm_u8 -f data - > $tmp_dir/leftraw & +ffmpeg -i $tmp_dir/right.wav -ac 1 -filter:a aresample=$aresample -map 0:a -c:a pcm_u8 -f data - > $tmp_dir/rightraw & + +wait; diff --git a/bash_commands/generate_video_by_demuxer.sh b/bash_commands/generate_video_by_demuxer.sh new file mode 100644 index 0000000..44dea13 --- /dev/null +++ b/bash_commands/generate_video_by_demuxer.sh @@ -0,0 +1,5 @@ +#!/bin/bash +tmp_dir=$1 +tmp_video_dir=$2 + +ffmpeg -y -f concat -safe 0 -i demuxer.txt -r 30 -tune stillimage -vsync vfr -pix_fmt yuv420p $tmp_video_dir/video.mp4 \ No newline at end of file diff --git a/bash_commands/split_channels_to_two_ways.sh b/bash_commands/split_channels_to_two_ways.sh new file mode 100644 index 0000000..38e3d30 --- /dev/null +++ b/bash_commands/split_channels_to_two_ways.sh @@ -0,0 +1,5 @@ +#!/bin/bash +tmp_dir=$1 +both_channels=$2 + +ffmpeg -i $both_channels -map_channel 0.0.0 $tmp_dir/left.wav -map_channel 0.0.1 $tmp_dir/right.wav \ No newline at end of file diff --git a/demuxer.txt b/demuxer.txt new file mode 100644 index 0000000..bfc4f62 --- /dev/null +++ b/demuxer.txt @@ -0,0 +1,33 @@ +file /tmp/tmpz9izgjti/pics/none.png +duration 0.286 +file /tmp/tmpz9izgjti/pics/right.png +duration 3.47975 +file /tmp/tmpz9izgjti/pics/none.png +duration 0.427375 +file /tmp/tmpz9izgjti/pics/right.png +duration 0.300375 +file /tmp/tmpz9izgjti/pics/none.png +duration 0.24225 +file /tmp/tmpz9izgjti/pics/right.png +duration 1.837375 +file /tmp/tmpz9izgjti/pics/both.png +duration 1.1325 +file /tmp/tmpz9izgjti/pics/left.png +duration 0.199 +file /tmp/tmpz9izgjti/pics/both.png +duration 3.920625 +file /tmp/tmpz9izgjti/pics/right.png +duration 0.7935 +file /tmp/tmpz9izgjti/pics/both.png +duration 2.446375 +file /tmp/tmpz9izgjti/pics/right.png +duration 0.331875 +file /tmp/tmpz9izgjti/pics/both.png +duration 0.58725 +file /tmp/tmpz9izgjti/pics/right.png +duration 0.082 +file /tmp/tmpz9izgjti/pics/both.png +duration 3.36025 +file /tmp/tmpz9izgjti/pics/right.png +duration 0.1615 +file /tmp/tmpz9izgjti/pics/right.png diff --git a/find_loudness.py b/find_loudness.py new file mode 100644 index 0000000..a27e32d --- /dev/null +++ b/find_loudness.py @@ -0,0 +1,52 @@ + +def createReadStream(file): + """Create Bytes Stream""" + data = open(file, 'rb') + return data + + +def process_find_loudness(file_path: str, threshold_at_point: int, inertia_samples: float, label: str): + + print("Start process to find loudness in:") + print( + F"\tfile_path: {file_path}\n" + F"\tthreshold_at_point: {threshold_at_point}\n" + F"\tinertia_samples: {inertia_samples}\n" + F"\tlabel: {label}\n" + ) + stream = createReadStream(file_path) + position = 0 + results = [] + last_swap_position = 0 + keep_loud_until = -1 + was_loud_last_time = False + print("Read chunks") + chunks = stream.read() + print(F"Length: {len(chunks)}") + + try: + for i, byte in enumerate(chunks): + position += 1 + volume = abs(byte - 128) + + if position >= keep_loud_until: + is_loud = volume > threshold_at_point + + if is_loud != was_loud_last_time: + swap_point = { + 'position_start': last_swap_position, + 'duration': position - last_swap_position, + 'loud': was_loud_last_time, + 'label': label + } + results.append(swap_point) + last_swap_position = position + was_loud_last_time = is_loud + + if volume > threshold_at_point: + keep_loud_until = position + inertia_samples + + return results + + except Exception as err: + print(err) diff --git a/generate_demuxer.py b/generate_demuxer.py new file mode 100644 index 0000000..54a3b86 --- /dev/null +++ b/generate_demuxer.py @@ -0,0 +1,91 @@ +import math + +from find_loudness import process_find_loudness + +graph_density = 8000 +threshold_at_point = 7 +inertia_s = 0.3 +inertia_samples = inertia_s * graph_density + + +def s(n: int): + global graph_density + return n / graph_density + + +def seconds(units: int): + return math.floor(s(units) % 60) + + +def minutes(units: int): + return math.floor(s(units) / 60) + + +def hours(units: int): + return math.floor(s(units) / 60 / 60) + + +def formatTime(units: int): + return f"{hours(units)}:{minutes(units)}:{seconds(units)}" + + +def new_mode(m, s): + data = m + data[s['label']] = s['loud'] + return data + + +def mode_to_string(mode): + if mode['left'] and mode['right']: + return 'both' + elif mode['left']: + return 'left' + elif mode['right']: + return 'right' + else: + return "none" + + +def run(tmp_dir): + global inertia_samples + out_demuxer = 'demuxer.txt' + + with open(out_demuxer, 'w') as demuxer: + # Execute process_find_loudness for left and right side + left_loudness = process_find_loudness( + tmp_dir + "/audio/leftraw", + threshold_at_point=threshold_at_point, + inertia_samples=inertia_samples, + label="left") + + right_loudness = process_find_loudness( + tmp_dir + "/audio/rightraw", + threshold_at_point=threshold_at_point, + inertia_samples=inertia_samples, + label="right") + + merged = [*left_loudness, *right_loudness] + sorted_list = sorted(merged, key=lambda x: x['position_start']) + + demuxer.write(F"file {tmp_dir}/pics/none.png\n") + + last_point = 0 + mode = {'left': False, 'right': False} + last_file = '' + total = 0 + + for i in range(2, len(sorted_list)): + point = sorted_list[i] + mode = new_mode(m=mode, s=point) + + file = F"{tmp_dir}/pics/{mode_to_string(mode)}.png" + duration = (point['position_start'] - last_point) / graph_density + demuxer.write(F"duration {duration}\n") + demuxer.write(F"file {file}\n") + last_point = point['position_start'] + last_file = file + total += duration * graph_density + + demuxer.write(F"duration {sorted_list[len(sorted_list) - 1]['duration'] / graph_density}\n") + demuxer.write(F"file {last_file}\n") + print(F"{total} {formatTime(total)}\n") diff --git a/src/gui/images/icons/32x32.png b/src/gui/images/icons/32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..3a4f46977175c8b09cf7e5799da903abe32496e6 GIT binary patch literal 1346 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 literal 0 HcmV?d00001 diff --git a/src/gui/images/icons/60x60.png b/src/gui/images/icons/60x60.png new file mode 100644 index 0000000000000000000000000000000000000000..c69cb135fad9f7c1a2908d3f09494a984a022347 GIT binary patch literal 1775 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 Y0uJ_AqlBnY^#A|>07*qoM6N<$f)DMc?f?J) literal 0 HcmV?d00001 diff --git a/src/gui/images/icons/otworz.png b/src/gui/images/icons/otworz.png new file mode 100644 index 0000000000000000000000000000000000000000..9a480540afa085f18a73216186f64268f49df44f GIT binary patch literal 1203 zcmV;k1WfyhP)EX>4Tx04R}tkv&MmP!xqvQ^g`xhjtKg$WWauii$W&6^me@v=v%)FnQ@8G-*gu zTpR`0f`dPcRRopOQBj;1h}Gm~L3a8^kl4 zmd<&fILu0tLVQj?i5< zwiY=82DX8V>$WEE0hc?#;FB&Hk|X(P355dien#Jv146ez@0vTe);UfefDFxQ`35*R z1V)RLz3%buK4>~Cx&LHLh00OT`L_t(&-tF4YOWR-^$MJV# zYg(LbVWk&iK(tW9n4q4={(udcu!D^GH*EJDJCED`0}uNX+^NSM%fy34VHAX-Fw^2_ z*3~AZafc-mTV>PQY4hX*&mq4^UU|NKo~IB96DEvESpc?xU%=T7TM2kM3fLzDLVMf0 zyFf&)aqb>450Fl$O+``Ki9{k5jYj3aUD)Y#+NYvz!$Ly6-!Y;0^afRsC>K9B%x+fD#XPfrI1>-+gs+|7wA zr=@ngjpH~YkB!IU%*@QB4-O9c79M8+*=!cevS>6Kf#~5>Dupb|{_!Gm0W3fweI>0Z z3R6>4fzTZt9dUSgc=bvvlgY5QwuUUrfdE^U#pdQF^?Lon^6NagTrMzJZ{3i~<@(l} zLPhGCsJlVN>bm|y>Y2O70^Y${(MtNEXy853z?Nv>lxX1ZqJfu11OF5atcnKyAsW~g z4crzD{7p1)Of+y=H1I??Xazjou%v??(ZG*I1D}L{4}+XSp|BkeS|KeE|+OGn}NYLn@x6icT;|&_l?H~;0^rw5Jc0ok;isAoz~9IPORJQ#@t;Wfw$iA zNubK@eG7fxTGcgP$RzL{I1Ui>*fpJFBcoWZx~?w)%kJjaLZPrtm@r|4$Zxf)KEfO( RTFd|d002ovPDHLkV1mX$E|mZP literal 0 HcmV?d00001 diff --git a/src/gui/images/icons/podglad.png b/src/gui/images/icons/podglad.png new file mode 100644 index 0000000000000000000000000000000000000000..d59f882cbc7a7ef57868f3ea0168746d6d6e1ff7 GIT binary patch literal 2310 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 literal 0 HcmV?d00001 diff --git a/src/gui/images/icons/zapis-n.png b/src/gui/images/icons/zapis-n.png new file mode 100644 index 0000000000000000000000000000000000000000..9e187d8b0afab56c4a3f80a17c9469f7b04269d9 GIT binary patch literal 1419 zcmV;61$6p}P)EX>4Tx04R}tkv&MmP!xqvQ^g`xhjtKg$WWauii$W&6^me@v=v%)FnQ@8G-*gu zTpR`0f`dPcRRopOQBj;1h}Gm~L3a8^kl4 zmd<&fILu0tLVQj?i5< zwiY=82DX8V>$WEE0hc?#;FB&Hk|X(P355dien#Jv146ez@0vTe);UfefDFxQ`35*R z1V)RLz3%buK4=y<^*XP#&00W0fL_t(&-tC%CXk0}Yz<+Nt z`?7D}CX-2;g1r zc!&l6UBrrrdeADUXfa_4*`1`DHy%1RTkZ@>xnnfei~ZSnqE5B*F$ z(t>=*Uf{DN(0Kt)44o(7M9_Hy?h2hp;4Pu^3fvAoG{6ko2s2D`xBxDI3*Z7cAF|W+ z@E+iy4sCw{eJ!o0r-gBq>27D$(gSAk&bOGFZE}e(4ROHgB7NyO!(&oI<=3El{a^+Kk z@H(ED&1P6?wSIm|%6(5jbX%6*l&#yZ{@W=miIF)*{UhK>tewL&u5|SOB-a{hZ2x-1 zw$<|WwY0Lxk0Dt@>S}vb;Td^-HZLHGfAEnK-dse+W$H%_!%8<14h!_ww3^_U%>SYC0i zy|NL8jwYIxGEM#(gkL1IT&+W?0#xpVt|sNmTd|hDfAGE30{i~Kq^9>AzzH#l?@xBJ zeKEDwlG5fvLes-e@5bI%>(>r{;-PmlT^=gktbljZt<(*mVr`S<`YhI7&trM$opP`i zI0-a8FQ6RE4`ffPmL}8@d0Ig<2ZC1Xm#p~o%=-HIzA~*; zX{GwjMl~d6U6?u=S50L<(~@$YQfdE2H56TO)zs&h=CzG#s`N%*nO16KZ2Wh`$Zn!& zk>&cH&F$(BgqVtJ-?V6XX;-Dq3u0vV|1tM?d^I(7qOF>GsjV$rqO=K>Hn&_VdAW=2 zC1-a_X`{2c0dNY~EX>4Tx04R}tkv&MmP!xqvQ^g`xhjtKg$WWauii$W&6^me@v=v%)FnQ@8G-*gu zTpR`0f`dPcRRopOQBj;1h}Gm~L3a8^kl4 zmd<&fILu0tLVQj?i5< zwiY=82DX8V>$WEE0hc?#;FB&Hk|X(P355dien#Jv146ez@0vTe);UfefDFxQ`35*R z1V)RLz3%buK4=ygQ1Y!^X009U|L_t(&-tC!94uUWcg&)RC z=*B~M0J)hQ4R4|wJqB)AV8TyJ5$MeKl7>Y?nJ?4f^+%GLnQd)#zx|YSSz@4EfRmte z1)c?6Bm`e908zHBPj%b6zUXSf;}zlw-6IMWB&&_&WC1lkI4FtjD$AZTmA zlh77{N1?3(ccI+?%Ug!!sfGat7+`>HXzTs(S<-2s?<46Qupf?!b8Fz(6OZIL-A(CZ z!n;>*HJlS8wgfQ1PX5wGCL9eJ1~`7Q{y?6Q>@O?+gs+rON$FHR=*b-}L zYzbS!mZ)KD30q=HV@uc)wnPnMOV|>&G|^vqt6?jQ)G$H_WuY$*!hA>)G(A`V0000< KMNUMnLSTZ+wM&Zt literal 0 HcmV?d00001 diff --git a/src/python/classes/mainwindow.py b/src/python/classes/mainwindow.py index f2b1dca..23366ed 100644 --- a/src/python/classes/mainwindow.py +++ b/src/python/classes/mainwindow.py @@ -2,14 +2,18 @@ import os import shutil import subprocess import tempfile -import resources_rc + +# import resources_rc from PyQt5.QtCore import Qt from PyQt5.QtGui import QPixmap from PyQt5.QtWidgets import QMainWindow, QLabel, QFileDialog, QDialog, QDialogButtonBox, QVBoxLayout, QApplication + from src.python.classes.settings_dialog import SettingsDialog from src.python.ui.mainwindow_ui import Ui_MainWindow from src.python.classes.translate import Translator +import generate_demuxer + class MainWindow(QMainWindow, QApplication, Ui_MainWindow): def __init__(self, parent=None): @@ -22,7 +26,7 @@ class MainWindow(QMainWindow, QApplication, Ui_MainWindow): self.setup_logic() self.setup_detail() self.retranslateUi(self.window()) - self.aresample = 8000 + self.aresample = "8000" self.test_data() def setup_logic(self): @@ -176,36 +180,96 @@ class MainWindow(QMainWindow, QApplication, Ui_MainWindow): def generate_video_podcast(self): # TODO: Change to pure python """Generate podcast based on values from UI.""" - audio_1 = self.line_edit_audio_1.text() - audio_2 = self.line_edit_audio_2.text() + connected_channels = self.check_box_connected_channels.isChecked() + # Setup images + image_files = { + 'both': self.preview_label_avatar_1.property('path'), + 'none': self.preview_label_avatar_2.property('path'), + 'left': self.preview_label_avatar_3.property('path'), + 'right': self.preview_label_avatar_4.property('path') + } + audio_files = [] - both_image = self.preview_label_avatar_1.property('path') - none_image = self.preview_label_avatar_2.property('path') - left_image = self.preview_label_avatar_3.property('path') - right_image = self.preview_label_avatar_4.property('path') + if not connected_channels: + audio_files.append({'file': self.line_edit_audio_1.text()}) + audio_files.append({'file': self.line_edit_audio_2.text()}) + + else: + audio_files.append({'file': self.line_edit_audio_1.text()}) + + # Split name and extension of the file + for dictionary in audio_files: + dictionary['ext'] = dictionary['file'].rsplit('.')[-1] with tempfile.TemporaryDirectory() as tmp_dir_name: - print('[*] Created temporary directory', tmp_dir_name) - pics_dir = tmp_dir_name + "/pics/" + print(tmp_dir_name) + print(f'[*] Create temporary directory: {tmp_dir_name}') + tmp_out_dir = tmp_dir_name + "/out" + pics_dir = tmp_dir_name + "/pics" + audio_dir = tmp_dir_name + "/audio" + video_dir = tmp_dir_name + "/video" - print(f'[*] Created pics directory in {tmp_dir_name}') + print(F"[!] Create tmp out dir: {tmp_out_dir}") + os.mkdir(tmp_out_dir) + + print(f'[*] Create pics dir: {pics_dir}') os.mkdir(pics_dir) + + print(f'[*] Create audio dir: {audio_dir}') + os.mkdir(audio_dir) + + print(f'[*] Create video dir: {video_dir}\n') + os.mkdir(video_dir) + print(f'[*] Copy images to {pics_dir}') - shutil.copy(both_image, pics_dir + "both.png") - shutil.copy(none_image, pics_dir + "none.png") - shutil.copy(left_image, pics_dir + "left.png") - shutil.copy(right_image, pics_dir + "right.png") + shutil.copy(image_files['both'], pics_dir + "/both.png") + shutil.copy(image_files['none'], pics_dir + "/none.png") + shutil.copy(image_files['left'], pics_dir + "/left.png") + shutil.copy(image_files['right'], pics_dir + "/right.png") + + print(f'[*] Copy audio to {audio_dir}\n') + if not self.check_box_connected_channels.isChecked(): + audio_files[0]['tmp'] = audio_dir + "/left_channel" + "." + audio_files[0]['ext'] + audio_files[1]['tmp'] = audio_dir + "/right_channel" + "." + audio_files[1]['ext'] + + shutil.copy(audio_files[0]['file'], audio_files[0]['tmp']) + shutil.copy(audio_files[1]['file'], audio_files[1]['tmp']) + + else: + audio_files[0]['tmp'] = audio_dir + "/both_channel" + "." + audio_files[0]['ext'] + shutil.copy(audio_files[0]['file'], audio_files[0]['tmp']) print(f'[*] Images in {pics_dir}: {os.listdir(pics_dir)}') - echo_temp_dir_name = subprocess.check_output(["echo", tmp_dir_name]).decode('utf-8') + print(f'[*] Audo files in {audio_dir}: {os.listdir(audio_dir)}') - ech = subprocess.check_output(["bash", "./generate.sh", - tmp_dir_name, - audio_1, audio_2, - both_image, none_image, - left_image, right_image, - str(self.aresample)]).decode('utf-8') + subprocess.check_output(["echo", tmp_dir_name]).decode('utf-8') - print(echo_temp_dir_name) - print(ech) + if connected_channels: + # Split channels + print("[-] Split channels - start:") + subprocess.check_output(["bash", + "bash_commands/split_channels_to_two_ways.sh", + audio_dir, + audio_files[0]['tmp']]) + print("[+] Split channels - done") + print("[-] Create raw files - start:") + subprocess.check_output(['bash', + 'bash_commands/create_raw_files.sh', + audio_dir, self.aresample]) + print("[+] Create raw files - done") + + print("[-] Create demuxer - start:") + generate_demuxer.run(tmp_dir=tmp_dir_name) + print("[+] Create demuxer - done") + + print('[-] Create video - start:') + subprocess.check_output( + ['bash', 'bash_commands/generate_video_by_demuxer.sh', tmp_dir_name, video_dir]) + print('[+] Create video - done') + + # while True: pass + print('[-] Create final podcast - start:') + subprocess.check_output( + ['bash', 'bash_commands/connect_sound.sh', tmp_dir_name, audio_files[0]['file']]) + print('[+] Create final podcast - done')