Skip to content

Commit

Permalink
bump version for release
Browse files Browse the repository at this point in the history
  • Loading branch information
dfaker committed Jul 23, 2023
1 parent 088e4cc commit b12e5f4
Show file tree
Hide file tree
Showing 9 changed files with 375 additions and 52 deletions.
19 changes: 17 additions & 2 deletions src/cutselectionController.py
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,9 @@ def fillGapsBetweenSublcips(self):
self.addNewSubclip(lastEnd,s,seekAfter=False)
lastEnd = e

def requestAutoconvert(self):
self.controller.requestAutoconvert()

def splitClipIntoSectionsOfLengthN(self):
sectionLength = self.ui.askFloat('How long should the secions be?','How long should the secions be? (Seconds)', initialvalue=30)
if sectionLength is not None and sectionLength >= 0:
Expand Down Expand Up @@ -541,7 +544,7 @@ def loadFiles(self,fileList,asktoSort=False):
if len(fileList) > 1000:
self.ui.disableFileWidgets=True
elif len(fileList) > 100:
response = self.ui.confirmWithMessage('Disable video listing?','You\'re loading {} files at once, showing these as widgets will affect performance, do you want to disable the file listing widget and just use the "Prev Clip" and "Next Clip" controls?'.format(len(fileList)),icon='warning')
response = self.ui.confirmWithMessage('Disable previews in listing?','You\'re loading {} files at once, showing these as widgets will affect performance, do you want to disable the image previews and just show a list of filenames?'.format(len(fileList)),icon='warning')
if response=='yes':
self.ui.disableFileWidgets=True

Expand All @@ -562,7 +565,6 @@ def loadFiles(self,fileList,asktoSort=False):
self.updateProgressStatistics()

def returnPreviewFrame(self,requestId,timestamp,size,responseImage):
print('returnPreviewFrame',requestId,timestamp,size)
self.ui.updateViewPreviewFrame(requestId,responseImage)

def requestPreviewFrame(self,filename,timestamp,size):
Expand All @@ -572,6 +574,16 @@ def requestPreviewFrame(self,filename,timestamp,size):
def getcurrentFilename(self):
return self.currentlyPlayingFileName

def requestRIDHoverPreviews(self,rid,size,callback, start=None, end=None):
if rid == 'V':
filename = self.getcurrentFilename()
startTime = start
Endtime = end
self.ffmpegService.requestHoverPreviewFrames(filename,startTime,Endtime,size,0,callback)
elif rid is not None:
filename,startTime,Endtime = self.videoManager.getDetailsForRangeId(rid)
self.ffmpegService.requestHoverPreviewFrames(filename,startTime,Endtime,size,0,callback)

def requestTimelinePreviewFrames(self,filename,startTime,Endtime,frameWidth,timelineWidth,callback):
if self.globalOptions.get('generateTimelineThumbnails',True):
self.ffmpegService.requestTimelinePreviewFrames(filename,startTime,Endtime,frameWidth,timelineWidth,callback)
Expand Down Expand Up @@ -683,6 +695,9 @@ def addNewSubclip(self,start,end,seekAfter=True):
self.ui.setUiDirtyFlag(specificRID=newRID)
return newRID

def getSurroundingInterestMarks(self,point):
return self.videoManager.getSurroundingInterestMarks(self.currentlyPlayingFileName,point)

def expandSublcipToInterestMarks(self,point):
self.videoManager.expandSublcipToInterestMarks(self.currentlyPlayingFileName,point)
self.updateProgressStatistics()
Expand Down
41 changes: 39 additions & 2 deletions src/cutselectionUi.py
Original file line number Diff line number Diff line change
Expand Up @@ -438,9 +438,20 @@ def __init__(self, master=None, controller=None,globalOptions={},*args, **kwargs
)
self.labelframeSourceVideos.pack(expand="true", fill="both", side="top")

self.previewsListview = tk.Listbox(self.videoPreviewContainer)
self.previewsscrollbar = tk.Scrollbar(self.videoPreviewContainer)
self.previewsscrollbarx = tk.Scrollbar(self.videoPreviewContainer,orient='horizontal')


self.previewsListview.config(yscrollcommand = self.previewsscrollbar.set,
xscrollcommand = self.previewsscrollbarx.set)

self.previewsscrollbar.config(command = self.previewsListview.yview)
self.previewsscrollbarx.config(command = self.previewsListview.xview)



self.previewsListview.bind('<Double-1>', self.switchvideoFromListview)

self.progresspreviewLabel = ttk.Label(self.frameSliceSettings)
self.progresspreviewLabel.config(text="")
Expand Down Expand Up @@ -599,7 +610,13 @@ def __init__(self, master=None, controller=None,globalOptions={},*args, **kwargs
g = binseq(0,1000)
self.seekpoints = [next(g)/1000 for i in range(1000)]


def switchvideoFromListview(self,e):
cs = self.previewsListview.curselection()
sel = self.previewsListview.get(cs[0])
self.playVideoFile(sel)

def requestAutoconvert(self):
self.controller.requestAutoconvert()

def searchrandom(self,e):
searchStr = self.searchStringVar.get()
Expand Down Expand Up @@ -698,6 +715,9 @@ def generateSoundWaveBackgrounds(self,style='GENERAL'):
self.frameTimeLineFrame.generateWaveImages = not self.frameTimeLineFrame.generateWaveImages
self.frameTimeLineFrame.uiDirty = True

def requestRIDHoverPreviews(self,rid,size,callback,start=None,end=None):
self.controller.requestRIDHoverPreviews(rid,size,callback,start=start,end=end)

def requestTimelinePreviewFrames(self,filename,startTime,Endtime,frameWidth,timelineWidth,callback):
return self.controller.requestTimelinePreviewFrames(filename,startTime,Endtime,frameWidth,timelineWidth,callback)

Expand Down Expand Up @@ -925,7 +945,22 @@ def updateFileListing(self, files):
if self.disableFileWidgets:
for preview in self.previews:
preview.destroy()

try:
self.previewsListview.delete(0,'end')
except Exception as e:
print(e)

for filename in files:
self.previewsListview.insert('end', filename)
self.previewsscrollbar.pack(side = 'right', fill = 'both')
self.previewsscrollbarx.pack(side = 'bottom', fill = 'both')
self.previewsListview.pack(expand=True, side='left', fill='both')

else:
self.previewsListview.pack_forget()
self.previewsscrollbar.pack_forget()
self.previewsscrollbarx.pack_forget()
currentFiles = set([x.filename for x in self.previews])

for filename in files:
Expand Down Expand Up @@ -1112,7 +1147,6 @@ def restartForNewFile(self, filename=None):
except:
pass


def getIsPlaybackStarted(self):
return self.controller.getIsPlaybackStarted()

Expand Down Expand Up @@ -1163,6 +1197,9 @@ def setAB(self, start, end,seekAfter=True):
def addNewSubclip(self, start, end,seekAfter=True):
return self.controller.addNewSubclip(start, end, seekAfter=seekAfter)

def getSurroundingInterestMarks(self,point):
return self.controller.getSurroundingInterestMarks(point)

def expandSublcipToInterestMarks(self, point):
self.controller.expandSublcipToInterestMarks(point)

Expand Down
21 changes: 21 additions & 0 deletions src/ffmpegService.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,8 @@ def lucas_kanade_np(im1, im2, win=2):
except Exception as e:
print('Custom Encode Spec Exception',fn,e)



class FFmpegService():

def convertFactorToAtempoSequence(self,target_change):
Expand All @@ -137,6 +139,7 @@ def __init__(self,globalStatusCallback=print,imageWorkerCount=2,encodeWorkerCoun

self.globalOptions=globalOptions
self.cache={}
self.frameCacheQueue = deque([],100)
self.imageRequestQueue = Queue()
self.responseRouting = {}
self.globalStatusCallback=globalStatusCallback
Expand Down Expand Up @@ -2166,6 +2169,17 @@ def timelinePreviewFrameWorker():
def encode(self,requestId,mode,seq,options,filenamePrefix,statusCallback):
self.encodeRequestQueue.put((requestId,mode,seq,options,filenamePrefix,statusCallback))

def requestHoverPreviewFrames(self,filename,startTime,Endtime,frameWidth,timelineWidth,callback):

for timestamp in [startTime,Endtime]:
requestKey = (filename+str(timestamp),filename,timestamp,'',frameWidth)
self.responseRouting[requestKey]=callback
if requestKey in self.cache:
callback(filename+str(timestamp),timestamp,frameWidth,self.cache[requestKey])
self.imageRequestQueue.put( requestKey )



def requestTimelinePreviewFrames(self,filename,startTime,Endtime,frameWidth,timelineWidth,callback):
self.lastTimelinePreviewFilenameRequested = filename
self.timelinePreviewFrameWorkerRequestQueue.put( (filename,startTime,Endtime,frameWidth,timelineWidth,callback) )
Expand All @@ -2178,7 +2192,14 @@ def requestPreviewFrame(self,requestId,filename,timestamp,filters,size,callback)
self.imageRequestQueue.put( requestKey )

def postCompletedImageFrame(self,requestKey,responseImage):

self.cache[requestKey] = responseImage
self.frameCacheQueue.append(requestKey)
while len(self.frameCacheQueue)>= self.frameCacheQueue.maxlen:
kp = self.frameCacheQueue.popleft()
if k in self.cache:
del self.cache[k]

requestId,filename,timestamp,filters,size = requestKey
self.responseRouting[requestKey](requestId,timestamp,size,responseImage)

Expand Down
59 changes: 47 additions & 12 deletions src/mergeSelectionUi.py
Original file line number Diff line number Diff line change
Expand Up @@ -175,10 +175,14 @@ def __init__(self, master=None, *args, encodeRequestId=None,controller=None, tar



self.canvasInputCutPreview = ttk.Label(self.frameEncodeProgressWidget)
self.canvasInputCutPreview.config(text='No Preview loaded')
self.canvasInputCutPreview = ttk.Label(self.frameEncodeProgressWidget, style="previewImg.TLabel")

self.canvasInputCutPreview.config(text=' ')
self.previewImage= self.clip.previewImage.subsample(2, 2)
self.canvasInputCutPreview.config(image=self.previewImage)

self.canvasInputCutPreview['padding']=( (90-self.previewImage.width())//2 ,5)

self.canvasInputCutPreview.grid(row=0,column=11,rowspan=3,sticky='nes')

try:
Expand Down Expand Up @@ -212,7 +216,10 @@ def __init__(self, master=None, *args, encodeRequestId=None,controller=None, tar
def setPreviewImage(self,photoImage):
print('setPreviewImage',self.clip.rid)
self.previewImage=photoImage.subsample(2, 2)
print(self.previewImage)
self.canvasInputCutPreview.config(image=self.previewImage)
self.canvasInputCutPreview['padding']=( (90-self.previewImage.width())//2 ,5)


def openFolder(self):
if self.finalFilename is not None:
Expand Down Expand Up @@ -242,20 +249,29 @@ def playFinal(self):

self.player = mpv.MPV(loop='inf',
mute=True,
volume=0,
volume=100,
autofit_larger='1280')

self.player.play(self.finalFilename)

def mutetoggle(key_state, key_name, key_char):
if 'd-' in key_state:
self.player.mute = not self.player.mute

self.mutetoggle = mutetoggle
self.player.register_key_binding("m", mutetoggle)
#self.player.register_key_binding("M", mutetoggle)

def quitFunc(key_state, key_name, key_char):
def playerReaper():
print('ReaperKill')
player=self.player
self.player=None
player.terminate()
player.wait_for_shutdown()
self.playerReaper = threading.Thread(target=playerReaper,daemon=True)
self.playerReaper.start()
if 'd-' in key_state or 'p-' in key_state:
self.playerReaper = threading.Thread(target=playerReaper,daemon=True)
self.playerReaper.start()

self.quitFunc = quitFunc

Expand Down Expand Up @@ -561,7 +577,7 @@ def preview(self):

self.player = mpv.MPV(loop='inf',
mute=True,
volume=0,
volume=100,
autofit_larger='1280')

self.player.play(self.filename)
Expand All @@ -572,15 +588,24 @@ def preview(self):
self.player.start = self.s
self.player.time_pos = self.s

def mutetoggle(key_state, key_name, key_char):
if 'd-' in key_state:
self.player.mute = not self.player.mute

self.mutetoggle = mutetoggle
self.player.register_key_binding("m", mutetoggle)
#self.player.register_key_binding("M", mutetoggle)

def quitFunc(key_state, key_name, key_char):
def playerReaper():
print('ReaperKill')
player=self.player
self.player=None
player.terminate()
player.wait_for_shutdown()
self.playerReaper = threading.Thread(target=playerReaper,daemon=True)
self.playerReaper.start()
if 'd-' in key_state or 'p-' in key_state:
self.playerReaper = threading.Thread(target=playerReaper,daemon=True)
self.playerReaper.start()

self.quitFunc = quitFunc

Expand Down Expand Up @@ -714,7 +739,7 @@ def __init__(self, master,controller,filename,rid,s,e,filterexp,filteraudioexp,f
logging.error("cutPreview PhotoImage Exception",exc_info=e)

self.canvasInputCutPreview = ttk.Label(self.frameInputCutWidget)
self.canvasInputCutPreview.config(text='No Preview loaded')
self.canvasInputCutPreview.config(text='')
self.canvasInputCutPreview.config(image=self.previewImage)
self.canvasInputCutPreview.pack(side='top')

Expand Down Expand Up @@ -772,7 +797,7 @@ def preview(self):

self.player = mpv.MPV(loop='inf',
mute=True,
volume=0,
volume=100,
autofit_larger='1280')

self.player.play(self.filename)
Expand All @@ -782,15 +807,25 @@ def preview(self):
self.player.start = self.s
self.player.time_pos = self.s

def mutetoggle(key_state, key_name, key_char):
if 'd-' in key_state:
self.player.mute = not self.player.mute

self.mutetoggle = mutetoggle
self.player.register_key_binding("m", mutetoggle)
#self.player.register_key_binding("M", mutetoggle)

def quitFunc(key_state, key_name, key_char):
def playerReaper():
print('ReaperKill')
player=self.player
self.player=None
player.terminate()
player.wait_for_shutdown()
self.playerReaper = threading.Thread(target=playerReaper,daemon=True)
self.playerReaper.start()

if 'd-' in key_state or 'p-' in key_state:
self.playerReaper = threading.Thread(target=playerReaper,daemon=True)
self.playerReaper.start()

self.quitFunc = quitFunc

Expand Down
20 changes: 16 additions & 4 deletions src/modalWindows.py
Original file line number Diff line number Diff line change
Expand Up @@ -441,7 +441,6 @@ def __init__(self, master=None, controller=None, rid=None, *args):
self.anchorLabel.grid(row=3,column=0,sticky='new',padx=5,pady=5)
self.anchorOptions = ['Start','Middle','End']
self.anchorVar = tk.StringVar(self,'Middle')
self.entryanchor = ttk.Spinbox(self,text='',textvariable=self.endtTsVar,from_=float('-1'),to=float('inf'))
self.entryanchor = ttk.Combobox(self,textvariable=self.anchorVar,values=self.anchorOptions,state='readonly')
self.entryanchor.grid(row=3,column=1,sticky='new',padx=5,pady=5)

Expand All @@ -459,6 +458,16 @@ def __init__(self, master=None, controller=None, rid=None, *args):
self.nameVar.trace('w',self.nameChange)
self.blockUpdate = False

self.entryname.bind('<Return>',self.close)
self.entrystartTs.bind('<Return>',self.close)
self.entryendTs.bind('<Return>',self.close)
self.entrydurTs.bind('<Return>',self.close)

self.entryname.focus()

def close(self,*args):
self.destroy()

def nameChange(self,*args):
self.controller.updateLabelForRid(self.rid, self.nameVar.get())

Expand Down Expand Up @@ -1604,9 +1613,12 @@ def recalculateEDLTimings(self,rid=None,pos=None,seekAfter=None):
pass



self.timeline_canvas.delete('ticks')
self.timeline_canvas.delete('upperticks')
try:
self.timeline_canvas.delete('ticks')
self.timeline_canvas.delete('upperticks')
except Exception as e:
print(e)
return

self.ticktimestamps=[]
self.tickXpos=[]
Expand Down
Loading

0 comments on commit b12e5f4

Please sign in to comment.