diff --git a/Python Version/Datamosher Pro v1.3.py b/Python Version/Datamosher Pro v1.3.py new file mode 100644 index 0000000..f5b55fd --- /dev/null +++ b/Python Version/Datamosher Pro v1.3.py @@ -0,0 +1,812 @@ +import os +from tkinter import * +from tkinter import ttk, messagebox, filedialog +import tkinter +import sys +import random +import re +import struct +import time +import webbrowser +from itertools import chain, repeat, islice +import subprocess +import pkg_resources +#Note that this program is optimised for only windows, for other systems you have to change the ffmpeg path(line 48). +required = {'imageio', 'imageio-ffmpeg'} +installed = {pkg.key for pkg in pkg_resources.working_set} +missing = required - installed +missingset=[*missing,] +if missing: + res=messagebox.askquestion("Module Error","Some modules are not installed \n do you want to download and install them?") + if res=="yes": + for x in range(len(missingset)): + y=missingset[x] + subprocess.Popen('python -m pip install '+y) + messagebox.showinfo("Module Installed","Please restart the program!") + sys.exit() + elif res=="no": + messagebox.showerror("Error","Required modules not available!\nWithout the modules you can't use this program. Please install them first!") + sys.exit() +else: + import imageio + if os.path.isdir("pymosh"): + from pymosh import Index + from pymosh.codec.mpeg4 import is_iframe + else: + messagebox.showerror("Missing Folder!","Pymosh folder is not available! Please download it from our github page.") + sys.exit() +def resource_path0(relative_path): + base_path = getattr( + sys, + '_MEIPASS', + os.path.dirname(os.path.abspath(__file__))) + return os.path.join(base_path, relative_path) +#ffmpeg path: +python_folder=os.path.dirname(sys.executable) +path=python_folder.replace(os.sep, '/') +global resource +resource=resource_path0(path+"/Lib/site-packages/imageio_ffmpeg/binaries/ffmpeg-win64-v4.2.2.exe") +def openfile(): + global file + file=tkinter.filedialog.askopenfilename(filetypes =[('Video', ['*.mp4','*.avi','*.mov','*.mkv','*wmv']),('All Files', '*.*')]) + if(len(file)>1): + LocationError.config(text=file, fg="green") + OpeningFile['text']='Open Again' + OpeningFile['bg']='#D0CECE' + else: + LocationError.config(text="Choose Video To Datamosh", fg="red") + OpeningFile['text']='OPEN' + OpeningFile['bg']='#82CC6C' +def convertffmpeg(inputpath): + Wait.config(text="Converting the Video...", fg="#6D76CD",bg='#FFFFFF', font=("Aharoni",15)) + root.update() + fps=30 + targetformat='.avi' + outputpath=os.path.splitext(inputpath)[0]+'_datamoshed'+targetformat + subprocess.call(f'"{resource}" -loglevel error -y -i "{inputpath}" -crf 0 -bf 0 -r {fps} "{outputpath}"', shell=True) + try: + Wait.config(text="Applying Effect: Classic", fg="#6D76CD",bg='#FFFFFF', font=("Aharoni",15)) + root.update() + Datamoshclassic(outputpath,inputpath) + except: + messagebox.showerror("FAILED","The video file or the input data have \n some issues!") + Wait.place_forget() + os.remove(outputpath) + datamoshbtn['state']=NORMAL + modechoices['state']=NORMAL + exportbox['state']=NORMAL + OpeningFile['state']=NORMAL + root.config(cursor="") +def convert(inputpath,targetformat): + global outputpath + try: + Wait.config(text="Converting the Video...", fg="#6D76CD",bg='#FFFFFF', font=("Aharoni",15)) + root.update() + outputpath=os.path.splitext(inputpath)[0]+'_datamoshed'+targetformat + reader=imageio.get_reader(inputpath) + fps=reader.get_meta_data()['fps'] + writer= imageio.get_writer(outputpath, fps=fps) + for frames in reader: + writer.append_data(frames) + #to get detailed logs of conversions, remove the comment in the next 2 lines + #print(f'Frame {frames}') + #print("Converted") + writer.close() + try: + Datamosh(outputpath) + except: + pass + except: + messagebox.showerror("FAILED","The video file or the input data have \n some issues!") + Wait.place_forget() + os.remove(outputpath) + datamoshbtn['state']=NORMAL + modechoices['state']=NORMAL + exportbox['state']=NORMAL + OpeningFile['state']=NORMAL + root.config(cursor="") +def validate(): + try: + float(Countframe.get()) + float(Positframe.get()) + float(firstframes.get()) + float(killframe.get()) + x=float(killframe.get()) + if x>1: + var4.set(1) + except ValueError: + messagebox.showerror("Invalid Input","Please enter some valid data") + sys.exit() +def checkexist(file): + mode = modechoices.get() + tformat=exportbox.get() + f=os.path.splitext(file)[0] + exfile=f+"_datamoshed"+"-"+mode+"_datamoshed."+tformat + if os.path.exists(exfile): + warn=messagebox.askquestion("Warning","Do you want to replace the old file?") + if warn=='yes': + os.remove(exfile) + elif warn=='no': + os.kill(checkesist()) + pass +def Step1(): + try: + if (len(file)>=1): + Wait.place(relx=0.5,rely=0.85,anchor='center') + root.update() + datamoshbtn['state']=DISABLED + extension=os.path.splitext(file)[1] + modechoices['state']=DISABLED + exportbox['state']=DISABLED + OpeningFile['state']=DISABLED + validate() + checkexist(file) + root.config(cursor="") + choice = modechoices.get() + if(choice==modes[7]): + if extension==".mp4": + convertffmpeg(file) + else: + targetformat=".mp4" + convert(file,targetformat) + convertffmpeg(file) + elif(choice==modes[8]) or (choice==modes[9]) or (choice==modes[11]): + pymosh_library(file) + else: + targetformat=".avi" + convert(file,targetformat) + else: + messagebox.showerror("","Please choose the video again!") + except: + datamoshbtn['state']=NORMAL + modechoices['state']=NORMAL + exportbox['state']=NORMAL + OpeningFile['state']=NORMAL + root.config(cursor="") + Wait.place_forget() + messagebox.showerror("","Please choose the video file again!") +def pymosh_library(file): + global final + outpath=os.path.dirname(file) + outx=os.path.basename(file).split('.')[0] + infile=os.path.dirname(file)+"/"+outx+"_datamoshed.avi" + if os.path.exists(infile): + os.remove(infile) + fps=30 + subprocess.call(f'"{resource}" -loglevel error -y -i "{file}" -crf 0 -bf 0 -r {fps} "{infile}"', shell=True) + def glide(interval, filename, outfile): + f = Index.from_file(filename) + buf = [None] + def process_frame(frame): + if buf[0] == None or not is_iframe(frame): + buf[0] = frame + else: + frame = buf[0] + return frame + for stream in f.video: + newstream = [] + newstream.append(stream[0]) + ix = 0 + jx = 0 + for i in stream[1:]: + ix += 1 + jx += 1 + if ix < interval: + newstream.append(process_frame(stream[jx])) + else: + newstream.append(newstream[-1]) + if ix > interval * 2: + ix = 0 + stream.replace(newstream) + f.rebuild() + with open(outfile, 'wb') as out: + f.write(out) + def avi_sort(filename, outfile): + f = Index.from_file(filename) + for stream in f.video: + sorted_stream = sorted(stream, key=len, reverse=True) + stream.replace(sorted_stream) + f.rebuild() + with open(outfile, 'wb') as out: + f.write(out) + def process_streams(in_filename, out_filename, func, *args, **kwargs): + f = Index.from_file(in_filename) + for stream in f.video: + midpoint=float(firstframes.get()) + if midpoint>1: + midpoint=1 + drifted = list(func(stream, midpoint,*args, **kwargs)) + stream.replace(drifted) + f.rebuild() + with open(out_filename, 'wb') as out: + f.write(out) + def echo(stream, midpoint): + all_frames = list(stream) + pframes = [f for f in all_frames if not is_iframe(f)] + midpoint_idx = int(len(all_frames)*midpoint) + frames = all_frames[:midpoint_idx] + while len(frames) < len(all_frames): + frames += pframes[:(len(all_frames) - len(frames))] + return frames + choice = modechoices.get() + if(choice==modes[8]): + Wait.config(text="Applying Effect: Glide", fg="#6D76CD",bg='#FFFFFF', font=("Aharoni",15)) + root.update() + time.sleep(2) + interval=int(Positframe.get()) + if (interval==1): + interval=2 + outfile=outpath+"/"+os.path.basename(infile).split('.')[0]+"-glide.avi" + if os.path.exists(outfile): + os.remove(outfile) + glide(interval, infile, outfile) + elif (choice==modes[9]): + Wait.config(text="Applying Effect: Sort", fg="#6D76CD",bg='#FFFFFF', font=("Aharoni",15)) + root.update() + time.sleep(2) + outfile=outpath+"/"+os.path.basename(infile).split('.')[0]+"-sort.avi" + if os.path.exists(outfile): + os.remove(outfile) + avi_sort(infile, outfile) + elif (choice==modes[11]): + Wait.config(text="Applying Effect: Echo", fg="#6D76CD",bg='#FFFFFF', font=("Aharoni",15)) + root.update() + time.sleep(2) + outfile=outpath+"/"+os.path.basename(infile).split('.')[0]+"-echo.avi" + if os.path.exists(outfile): + os.remove(outfile) + process_streams(infile, outfile, echo) + final=outpath+"/"+os.path.basename(outfile).split('.')[0]+".mp4" + if os.path.exists(final): + os.remove(final) + subprocess.call(f'"{resource}" -loglevel error -y -i "{outfile}" "{final}"', shell=True) + export2=exportbox.get() + os.remove(infile) + export(final) + os.remove(outfile) +def Datamoshclassic(filename,mainfile): + global outf + END_FRAME_HEX = b'00dc' + I_FRAME_HEX = b'\x00\x01\xb0' + fps=30 + outx=os.path.basename(filename).split('.')[0] + outpath=os.path.dirname(mainfile) + outf=outpath+"/"+outx+"-classic_datamoshed.avi" + def main2(filename, effect_sec_list, p_frames_mult): + magic(effect_sec_list, p_frames_mult) + out=outpath+"/"+outx+"-classic.mp4" + subprocess.call(f'"{resource}" -loglevel error -y -i "{outf}" "{out}"', shell=True) + os.remove(filename) + export(out) + export2=exportbox.get() + if(export2==exportchoices[0]): + pass + else: + os.remove(outf) + def magic(effect_sec_list, p_frames_mult): + with open(filename, 'rb') as in_file, open(outf, 'wb') as out_file: + frames = split_file(in_file, END_FRAME_HEX) + for index, frame in enumerate(frames): + if not is_need_effect_here(index / fps, effect_sec_list): + out_file.write(frame + END_FRAME_HEX) + continue + if not is_iframe(frame): + out_file.write((frame + END_FRAME_HEX) * p_frames_mult) + def split_file(fp, marker, blocksize=4096): + buffer = b'' + for block in iter(lambda: fp.read(blocksize), b''): + buffer += block + while True: + markerpos = buffer.find(marker) + if markerpos == -1: + break + yield buffer[:markerpos] + buffer = buffer[markerpos + len(marker):] + yield buffer + def is_need_effect_here(curr_sec, effect_sec_list): + return any(start < curr_sec < end for start, end in effect_sec_list) + def is_iframe(frame): + return frame[5:8] == I_FRAME_HEX + start=float(firstframes.get()) + make=float(Countframe.get()) + timer=int(Positframe.get()) + main2(filename,[(start,make)],timer) +def Datamosh(Inputfile): + global fileout + checkinput=os.path.splitext(file)[0]+"_datamoshed.avi" + if os.path.exists(checkinput): + filein = Inputfile + countframes = int(Countframe.get()) + positframes = int(Positframe.get()) + firstframe = int(firstframes.get()) + choice = modechoices.get() + kill = float(killframe.get()) + if(choice==modes[0]): + mode="bloom" + elif(choice==modes[1]): + mode="invert" + elif(choice==modes[2]): + mode="jiggle" + elif(choice==modes[3]): + mode="overlap" + elif(choice==modes[4]): + mode="pulse" + elif(choice==modes[5]): + mode="reverse" + elif(choice==modes[6]): + mode="random" + elif(choice==modes[10]): + mode="shake" + elif(choice==modes[12]): + mode="void" + else: + messagebox.showerror("Error!","Please select a valid mode!") + os.remove(outputpath) + Wait.place_forget() + datamoshbtn['state']=NORMAL + root.config(cursor="") + modechoices['state']=NORMAL + exportbox['state']=NORMAL + OpeningFile['state']=NORMAL + os.kill(Datamosh()) + temp_nb = random.randint(10000, 99999) + temp_dir = "temp-" + str(temp_nb) + temp_hdrl = temp_dir +"/hdrl.bin" + temp_movi = temp_dir +"/movi.bin" + temp_idx1 = temp_dir +"/idx1.bin" + os.mkdir(temp_dir) + def constrain(val, min_val, max_val): + return min(max_val, max(min_val, val)) + def bstream_until_marker(bfilein, bfileout, marker=0, startpos=0): + chunk = 1024 + filesize = os.path.getsize(bfilein) + if marker : + marker = str.encode(marker) + + with open(bfilein,'rb') as rd: + with open(bfileout,'ab') as wr: + for pos in range(startpos, filesize, chunk): + rd.seek(pos) + buffer = rd.read(chunk) + + if marker: + if buffer.find(marker) > 0 : + marker_pos = re.search(marker, buffer).start() + marker_pos = marker_pos + pos + split = buffer.split(marker, 1) + wr.write(split[0]) + return marker_pos + else: + wr.write(buffer) + else: + wr.write(buffer) + movi_marker_pos = bstream_until_marker(filein, temp_hdrl, "movi") + idx1_marker_pos = bstream_until_marker(filein, temp_movi, "idx1", movi_marker_pos) + bstream_until_marker(filein, temp_idx1, 0, idx1_marker_pos) + with open(temp_movi,'rb') as rd: + chunk = 1024 + filesize = os.path.getsize(temp_movi) + frame_table = [] + + for pos in range(0, filesize, chunk): + rd.seek(pos) + buffer = rd.read(chunk) + for m in (re.finditer(b'\x30\x31\x77\x62', buffer)): + if audio : frame_table.append([m.start() + pos, 'sound']) + for m in (re.finditer(b'\x30\x30\x64\x63', buffer)): + frame_table.append([m.start() + pos, 'video']) + frame_table.sort(key=lambda tup: tup[0]) + l = [] + l.append([0,0, 'void']) + max_frame_size = 0 + for n in range(len(frame_table)): + if n + 1 < len(frame_table): + frame_size = frame_table[n + 1][0] - frame_table[n][0] + else: + frame_size = filesize - frame_table[n][0] + max_frame_size = max(max_frame_size, frame_size) + l.append([frame_table[n][0],frame_size, frame_table[n][1]]) + clean = [] + final = [] + if firstframe : + for x in l : + if x[2] == 'video': + clean.append(x) + break + for x in l: + if x[1] <= (max_frame_size * kill) : + clean.append(x) + if mode == "void": + final = clean + if mode == "random": + Wait.config(text="Applying Effect: Random", fg="#6D76CD",bg='#FFFFFF', font=("Aharoni",15)) + root.update() + final = random.sample(clean,len(clean)) + if mode == "reverse": + Wait.config(text="Applying Effect: Reverse", fg="#6D76CD",bg='#FFFFFF', font=("Aharoni",15)) + root.update() + final = sum(zip(clean[::-1], clean[:-1]), ()) + if mode == "invert": + Wait.config(text="Applying Effect: Invert", fg="#6D76CD",bg='#FFFFFF', font=("Aharoni",15)) + root.update() + final = sum(zip(clean[1::2], clean[::2]), ()) + if mode == 'bloom': + Wait.config(text="Applying Effect: Bloom", fg="#6D76CD",bg='#FFFFFF', font=("Aharoni",15)) + root.update() + repeat = int(countframes) + frame = int(positframes) + lista = clean[:frame] + listb = clean[frame:] + final = lista + ([clean[frame]]*repeat) + listb + if mode == 'pulse': + Wait.config(text="Applying Effect: Pulse", fg="#6D76CD",bg='#FFFFFF', font=("Aharoni",15)) + root.update() + pulselen = int(countframes) + pulseryt = int(positframes) + j = 0 + for x in clean: + i = 0 + if(j % pulselen == 0): + while i < pulselen : + final.append(x) + i = i + 1 + else: + final.append(x) + j = j + 1 + if mode == "jiggle": + Wait.config(text="Applying Effect: Jiggle", fg="#6D76CD",bg='#FFFFFF', font=("Aharoni",15)) + root.update() + amount = int(positframes) + final = [clean[constrain(x+int(random.gauss(0,amount)),0,len(clean)-1)] for x in range(0,len(clean))] + if mode == "overlap": + Wait.config(text="Applying Effect: Overlap", fg="#6D76CD",bg='#FFFFFF', font=("Aharoni",15)) + root.update() + pulselen = int(countframes) + pulseryt = int(positframes) + clean = [clean[i:i+pulselen] for i in range(0,len(clean),pulseryt)] + final = [item for sublist in clean for item in sublist] + if mode == "shake": + Wait.config(text="Applying Effect: Shake", fg="#6D76CD",bg='#FFFFFF', font=("Aharoni",15)) + root.update() + def process_streams(in_filename, out_filename, func, *args, **kwargs): + f = Index.from_file(in_filename) + for stream in f.video: + drifted = list(func(stream, *args, **kwargs)) + stream.replace(drifted) + f.rebuild() + with open(out_filename, 'wb') as out: + f.write(out) + def shake(stream): + def glitch(stream): + all_frames = iter(stream) + yield next(all_frames) + while True: + frame = next(all_frames) + if not is_iframe(frame): + yield frame + yield frame + return islice(glitch(stream), len(stream)) + fileout= filein[:-4] + '-' + mode + '.avi' + process_streams(filein, fileout, shake) + fps=30 + output= fileout[:-9]+"shake.mp4" + subprocess.call(f'"{resource}" -loglevel error -y -i "{fileout}" -crf 0 -bf 0 -r {fps} "{output}"', shell=True) + time.sleep(2) + os.remove(fileout) + os.remove(filein) + os.remove(temp_hdrl) + os.remove(temp_movi) + os.remove(temp_idx1) + os.rmdir(temp_dir) + export(output) + os.kill(datamosh) + time.sleep(2) + fileout= filein[:-4] + '-' + mode + '.avi' + if os.path.exists(fileout): + os.remove(fileout) + bstream_until_marker(temp_hdrl, fileout) + with open(temp_movi,'rb') as rd: + filesize = os.path.getsize(temp_movi) + with open(fileout,'ab') as wr: + wr.write(struct.pack('<4s', b'movi')) + for x in final: + if x[0] != 0 and x[1] != 0: + rd.seek(x[0]) + wr.write(rd.read(x[1])) + bstream_until_marker(temp_idx1, fileout) + if os.path.exists(outputpath): + os.remove(outputpath) + else: + pass + os.remove(temp_hdrl) + os.remove(temp_movi) + os.remove(temp_idx1) + os.rmdir(temp_dir) + export(fileout) + else: + Wait.config(text="Moshed Video is Ready!", fg="#6D76CD",bg='#FFFFFF', font=("Aharoni",15)) + root.update() +def export(fileout): + def removefileout(): + if os.path.exists(fileout): + os.remove(fileout) + Wait.place_forget() + datamoshbtn['state']=NORMAL + modechoices['state']=NORMAL + exportbox['state']=NORMAL + OpeningFile['state']=NORMAL + root.config(cursor="") + messagebox.showinfo("DONE","Datamoshed video is ready!") + Wait.config(text="", fg="#6D76CD",bg='#FFFFFF', font=("Aharoni",15)) + root.update() + else: + pass + export=exportbox.get() + if(export==exportchoices[0]): + ask=messagebox.askquestion("?","Do you want the Raw moshed version?") + if ask=='yes': + choice = modechoices.get() + if(choice==modes[7]): + Wait.config(text="Moshed Video is Ready!", fg="#6D76CD",bg='#FFFFFF', font=("Aharoni",15)) + root.update() + os.remove(fileout) + messagebox.showinfo("DONE","Datamoshed video is ready!") + Wait.place_forget() + datamoshbtn['state']=NORMAL + modechoices['state']=NORMAL + exportbox['state']=NORMAL + OpeningFile['state']=NORMAL + root.config(cursor="") + else: + file2=os.path.splitext(fileout)[0] + os.rename(fileout,file2+"_datamoshed.avi") + Wait.config(text="Moshed Video is Ready!", fg="#6D76CD",bg='#FFFFFF', font=("Aharoni",15)) + root.update() + messagebox.showinfo("DONE","Datamoshed video is ready!") + root.config(cursor="") + Wait.place_forget() + datamoshbtn['state']=NORMAL + modechoices['state']=NORMAL + exportbox['state']=NORMAL + OpeningFile['state']=NORMAL + elif ask=='no': + targetformat=".avi" + convert(fileout,targetformat) + removefileout() + elif(export==exportchoices[1]): + choice = modechoices.get() + if(choice==modes[7]) or (choice==modes[8]) or (choice==modes[9]): + nfile=os.path.splitext(fileout)[0] + os.rename(fileout,nfile+"_datamoshed.mp4") + Wait.config(text="Moshed Video is Ready!", fg="#6D76CD",bg='#FFFFFF', font=("Aharoni",15)) + root.update() + messagebox.showinfo("DONE","Datamoshed video is ready!") + Wait.place_forget() + root.config(cursor="") + datamoshbtn['state']=NORMAL + modechoices['state']=NORMAL + exportbox['state']=NORMAL + OpeningFile['state']=NORMAL + else: + targetformat=".mp4" + convert(fileout,targetformat) + removefileout() + elif(export==exportchoices[2]): + targetformat=".gif" + convert(fileout,targetformat) + removefileout() + elif(export==exportchoices[3]): + targetformat=".mov" + convert(fileout,targetformat) + removefileout() + elif(export==exportchoices[4]): + targetformat=".mkv" + convert(fileout,targetformat) + removefileout() + elif(export==exportchoices[5]): + targetformat=".wmv" + convert(fileout,targetformat) + removefileout() + else: + messagebox.showerror("Error!","Please select a valid video format!") + os.remove(fileout) + Wait.place_forget() + datamoshbtn['state']=NORMAL + modechoices['state']=NORMAL + exportbox['state']=NORMAL + OpeningFile['state']=NORMAL + root.config(cursor="") + os.kill(Datamosh()) +def toggle(): + if var.get()==0: + Disableadvanced() + else: + Enableadvanced() +def Enableadvanced(): + choice = modechoices.get() + if(choice==modes[8]): + var2.set(6) + var4.set(0.7) + countlabel['fg']="grey" + positlabel['fg']="green" + firstflabel['fg']="grey" + killlabel['fg']="grey" + Countframe['state']=DISABLED + Positframe['state']=NORMAL + firstframes['state']=DISABLED + killframe['state']=DISABLED + if(choice==modes[7]): + var2.set(1) + var1.set(100) + countlabel['fg']="green" + positlabel['fg']="green" + firstflabel['fg']="green" + killlabel['fg']="grey" + Countframe['state']=NORMAL + Positframe['state']=NORMAL + firstframes['state']=NORMAL + killframe['state']=DISABLED + elif(choice==modes[6]) or (choice==modes[10]) or (choice==modes[12]): + var2.set(1) + if (choice==modes[12]): + var4.set(0.2) + else: + var4.set(0.7) + var3.set(1) + countlabel['fg']="grey" + positlabel['fg']="grey" + firstflabel['fg']="green" + killlabel['fg']="green" + Countframe['state']=DISABLED + Positframe['state']=DISABLED + firstframes['state']=NORMAL + killframe['state']=NORMAL + elif(choice==modes[5]): + var2.set(1) + var4.set(0.7) + countlabel['fg']="grey" + positlabel['fg']="grey" + firstflabel['fg']="green" + killlabel['fg']="grey" + Countframe['state']=DISABLED + Positframe['state']=DISABLED + firstframes['state']=NORMAL + killframe['state']=DISABLED + elif(choice==modes[1]) or (choice==modes[11]): + var2.set(1) + if (choice==modes[11]): + var3.set(0.5) + else: + var3.set(1) + countlabel['fg']="grey" + positlabel['fg']="grey" + firstflabel['fg']="green" + killlabel['fg']="grey" + Countframe['state']=DISABLED + Positframe['state']=DISABLED + firstframes['state']=NORMAL + killframe['state']=DISABLED + elif(choice==modes[2]): + var2.set(1) + var4.set(0.7) + countlabel['fg']="grey" + positlabel['fg']="green" + firstflabel['fg']="green" + killlabel['fg']="green" + Countframe['state']=DISABLED + Positframe['state']=NORMAL + firstframes['state']=NORMAL + killframe['state']=NORMAL + elif(choice==modes[0]) or (choice==modes[3]) or (choice==modes[4]): + var2.set(1) + var4.set(0.7) + countlabel['fg']="green" + positlabel['fg']="green" + firstflabel['fg']="green" + killlabel['fg']="green" + Countframe['state']=NORMAL + Positframe['state']=NORMAL + firstframes['state']=NORMAL + killframe['state']=NORMAL +def Disableadvanced(): + var1.set("1") + countlabel['fg']="grey" + positlabel['fg']="grey" + firstflabel['fg']="grey" + killlabel['fg']="grey" + Countframe['state']=DISABLED + Positframe['state']=DISABLED + firstframes['state']=DISABLED + killframe['state']=DISABLED +def refresh(event): + if var=="0": + pass + else: + modechoices['values']=toggle() +def info(): + messagebox.showinfo("Help", + "Datamosher Pro is a tool that can mosh and corrupt video files and returns an awesome glitched video" + "\nHow To Use:\n➤First open the video you want to datamosh." + "\n➤Choose the desired datamosh mode, then select the export format." + "\n➤Use advance options for different modes (For more details about the advanced options, visit our Github page)." + "\n➤Click on the datamosh button, then wait for a few seconds." + "\n➤After conversion, your video will be ready and you can view the datamoshed video inside its directory." + "\n\nDeveloper: Akash Bora (a.k.a. Akascape)\nIf you are facing any issue then contact me on Github." + "\nVersion-1.3") +def callback(url): + webbrowser.open_new_tab("https://github.com/Akascape/Datamosher-Pro-GUI-.git") +root=Tk() +root.title("Datamosher Pro") +root.resizable(width=False, height=False) +root.geometry("500x450") +root.configure(bg='#FFFFFF') +root.columnconfigure(0,weight=1) +icopath=resource_path0("icon.ico") +root.wm_iconbitmap(icopath) +path=resource_path0("label.png") +LabelIMG=PhotoImage(file=path) +headlabel=Label(root,image=LabelIMG,borderwidth=0, highlightthickness=0, padx=0,pady=0) +headlabel.grid() +LocationError=Label(root,text="Choose Video To Datamosh",fg="red",bg='#FFFFFF') +LocationError.grid() +OpeningFile= Button(root, width=61,bg="#82CC6C",fg="white", text="OPEN",highlightthickness=1,borderwidth=0.2,relief="groove",command=openfile) +OpeningFile.grid() +chooselabel=Label(root,text="Select Mode:",font="Aharoni",bg='#FFFFFF') +chooselabel.place(x=80,y=115,anchor='center') +modes=["Bloom", "Invert", "Jiggle", "Overlap", "Pulse", "Reverse", "Random", "Classic", "Glide", "Sort", "Shake", "Echo", "Void"] +modechoices=ttk.Combobox(root,values=modes, font="Verdana 12", width=7, height=13) +modechoices.current(0) +modechoices.bind('', lambda event: refresh(event)) +modechoices.place(x=130,y=104) +exportchoices=["AVI","MP4","GIF","MOV","MKV","WMV"] +exportlabel=Label(root,text="Export Format:",font="Aharoni",bg='#FFFFFF') +exportlabel.place(x=270,y=105) +exportbox=ttk.Combobox(root,values=exportchoices, font="Verdana 10", width=8) +exportbox.current(1) +exportbox.place(x=380,y=106) +global var +var = IntVar() +var.set(0) +advancedbox=Checkbutton(root, text="Advanced",bg="#FFFFFF", command=toggle,variable=var,onvalue=1, offvalue=0) +advancedbox.place(x=70,y=150, anchor='center') +var1=DoubleVar() +var1.set(1) +countlabel=Label(root,text="Glitch Size",fg="grey",bg='#FFFFFF') +countlabel.place(x=50,y=165) +Countframe=Entry(root,bg="#00D2FF",width=10,borderwidth=3, textvariable=var1,state=DISABLED) +Countframe.place(x=140,y=165) +var2=DoubleVar() +var2.set(1) +positlabel=Label(root,text="Frames Frequency",fg="grey",bg='#FFFFFF') +positlabel.place(x=270,y=165) +Positframe=Entry(root,bg="#00D2FF",width=10,borderwidth=3, textvariable=var2, state=DISABLED) +Positframe.place(x=380,y=165) +var3=IntVar() +var3.set(1) +firstflabel=Label(root,text="First Frame",fg="grey",bg='#FFFFFF') +firstflabel.place(x=50,y=200) +firstframes=Entry(root,bg="#00D2FF",width=10,borderwidth=3, textvariable=var3, state=DISABLED) +firstframes.place(x=140,y=200) +var4=DoubleVar() +var4.set(0.7) +killlabel=Label(root,text="Kill Frames",fg="grey",bg='#FFFFFF') +killlabel.place(x=270,y=200) +killframe=Entry(root,bg="#00D2FF",width=10,borderwidth=3, textvariable=var4, state=DISABLED) +killframe.place(x=380,y=200) +global Wait +Wait=Label(root,text="",fg="#6D76CD",bg='#FFFFFF', font=("Aharoni",15)) +infobtn=Button(root, width=2,bg="#FFFFFF",fg="black", text="ⓘ",font=(10),relief="sunken",cursor='hand2', highlightthickness=0,borderwidth=0,padx=0,pady=0,command=info) +infobtn.place(x=475,y=425) +dev=Label(root, text='Developed by Akascape | For more info, visit:',bg='#FFFFFF',fg="#6D76CD", font=("Impact",10)) +dev.place(x=5,y=430) +link=Label(root, text="Datamosher Pro Github",font=('Impact',10),bg='#FFFFFF',fg="#6D76CD", cursor="hand2") +link.place(x=245,y=430) +link.bind("", lambda e: +callback("https://github.com/Akascape/Datamosher-Pro-GUI-.git")) +path0=resource_path0("button.png") +buttonIMG=PhotoImage(file=path0) +datamoshbtn=Button(root,image=buttonIMG,borderwidth=0, highlightthickness=0, padx=0,pady=0,command=Step1) +datamoshbtn.place(x=100,y=270) +root.mainloop() +#DEVELOPER: AKASH BORA (a.k.a Akascape) +#Version=1.3