import subprocess import sys from pathlib import Path import os from time import sleep from threading import Thread import threading import re import xml.etree.ElementTree as ET file="test.txt" max_threads=int(input("max threads: ")) print(type(max_threads)) i=0 output_folder_name ="/bulk_convert_out/" target_bps_per_channel=96000 #audio_stringmap = "" #droppedFile= ['test.mkv0out.mkv', "test.mkv1out.mkv","test.mkv2out.mkv","test.mkv3out.mkv","test.mkv4out.mkv","test.mkv5out.mkv"] #get path of script location and remove the tail #get path of script location and remove the tail head_tail = os.path.split(sys.argv[0]) output_path = head_tail[0] #skip first part of sys.argv since it points to script location #arguments = sys.argv[1:] #arguments = droppedFile #check if output folder exists, otherwise create it isExist = os.path.exists(output_path+output_folder_name) if not isExist: os.makedirs(output_path+output_folder_name) def read_file(path=""): with open(file,'r+') as f: path = f.readlines(1) all = f.readlines() f.seek(0) f.truncate() f.writelines(all) return path class CustomThread(Thread): # constructor def __init__(self, input_file=""): # execute the base constructor Thread.__init__(self) # set a default value self.input_file = input_file def run(self): #sleep(1) global i audio_stringmap="" stream_index_modify = [] channels_index_modify = [] stream_index = [] channels_index = [] file = str(input_file[0]) file = file.rstrip("\n") os.rename(file, file+"i") mkvmerge_input = file+"i" mkv_args = 'mkvmerge.exe --output "{file}" "{mkvmerge_input}"'.format(file=file, output_path=output_path, output_folder_name=output_folder_name, mkvmerge_input=mkvmerge_input) mkv_run = subprocess.run(mkv_args) #wait = mkv_run.wait() print("before remove file") os.remove(file+"i") basename = os.path.basename(file) print(file) sleep(1) #find audio channels to encode ffprobe_args = '.\\ffprobe.exe -i "{file}" -show_entries format:streams -of xml'.format(file=file) print(ffprobe_args) ffprobe = subprocess.Popen(["powershell.exe", ffprobe_args], stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='UTF-8') ffprobe_out = ffprobe.communicate()[0] print("printing out", ffprobe_out) root = ET.fromstring(ffprobe_out) streams = root[1].findall("stream") m_index=0 for index in streams: if index.get("codec_type") == "audio": stream_channels = int(index.get("channels")) for tag in index.findall("tag"): if tag.get("key") == "BPS": BPS_Value = int(tag.get("value")) print("printing index: ", index.get("index")) print("printing BPS: ", BPS_Value) #to fix: specifying a codec specifies it for _output stream_ not input:https://superuser.com/questions/1669264/how-is-this-ffmpeg-map-documentation-okay if BPS_Value >= target_bps_per_channel*stream_channels*1.2: #stream_index_modify.append(int(index.get("index"))-1) #channels_index_modify.append(int(index.get("channels"))) #m_index = int(index.get("index")) #m_index -= 1 c_index = int(index.get("channels")) print(m_index) bitrate = int(stream_channels*target_bps_per_channel/1000) test_map = "-map 0:a:{m_index} -c:a:{m_index} libopus -ac:a:{m_index} {c_index} -b:a:{m_index} {bitrate}k ".format(m_index=m_index,c_index=c_index, bitrate=bitrate,stream_channels=stream_channels) audio_stringmap += test_map m_index+=1 else: #stream_index.append(int(index.get("index"))-1) #channels_index.append(int(index.get("channels"))) m_index = int(index.get("index")) m_index -= 1 c_index = int(index.get("channels")) bitrate = int(stream_channels*target_bps_per_channel/1000) test_map = "-map 0:a:{m_index} -c:a:{m_index} copy ".format(m_index=m_index,c_index=c_index, bitrate=bitrate,stream_channels=stream_channels) audio_stringmap += test_map m_index+=1 x=0 print("streams to transcode: ", stream_index_modify) print("channels to modify", channels_index_modify) print("streams to copy: ", stream_index) print("channels to copy: ", channels_index) #for each in stream_index_modify: # #to fix: specifying a codec specifies it for _output stream_ not input. # channel_layout = channels_index_modify[x] # bitrate = int(channel_layout*target_bps_per_channel/1000) # audio_stringmap += "-map 0:a:{each} -c:a:{each} libopus -ac:a:{each} {channel_layout} -b:a:{each} {bitrate}k ".format(each=each,bitrate=bitrate,channel_layout=channel_layout) # x+=1 # #print(audio_stringmap) #x=0 #for each in stream_index: # # channel_layout = channels_index[x] # bitrate = int(channel_layout*target_bps_per_channel/1000) # audio_stringmap += "-map 0:a:{each} -c:a:{each} copy ".format(each=each,bitrate=bitrate,channel_layout=channel_layout) # x+=1 #print(audio_stringmap) args = 'ffmpeg.exe -analyzeduration 20000000 -probesize 200M -i "{file}" -fps_mode passthrough -map 0:t? -map 0:v:0? -c:v libx265 -preset slow -crf 15.4 -x265-params "no-sao=1:bframes=8:psy-rd=2:psy-rdoq=1.5:aq-mode=3:ref=6:deblock=-1,-1" -pix_fmt yuv420p10le {audio_stringmap} -map 0:s? -c:s copy -f matroska "{output_path}{output_folder_name}{basename}"'.format(file=file, output_path=output_path, output_folder_name=output_folder_name, basename=basename, audio_stringmap=audio_stringmap) print(args) results = subprocess.Popen(args, creationflags=0x00004000, stdout=subprocess.PIPE) #streeamdata = results.communicate()[0] data = results.wait() arg_list = 'mkvmerge.exe --output "{output_path}{output_folder_name}/mvkmergedupdated/{basename}" "{output_path}{output_folder_name}{basename}"'.format(file=file, output_path=output_path, output_folder_name=output_folder_name, basename=basename) print(arg_list) merg_results = subprocess.Popen(arg_list) if data == 0: i=i-1 filesize = os.path.getsize(file) while filesize != 0: if i < max_threads: global self filesize = os.path.getsize(file) if filesize != 0: input_file = read_file() print(input_file) t1 = CustomThread(input_file) t1.start() if filesize == 0: while bool(threading.active_count() > 1): print("Finished","out of", ) sleep(1) filesize = os.path.getsize(file) if filesize != 0: print("breaking while") break filesize = os.path.getsize(file) if filesize != 0: print("breaking if") continue t1.join() print("Completed","out of", "inputs Successfully") input("waiting") exit() print("incrementing i in loop") i=i+1 else: print("Finished ","out of ") sleep(1) print("continuing ")