gonzopi

git clone https://git.tarina.org/gonzopi
Log | Files | Refs | README | LICENSE

commit 989ab615130756f2ad8e2f075e92afc818d97a71
parent fe4660ff6a1eacda7ceb72bafbdb2dcd01562ac2
Author: rbckman <rob@tarina.org>
Date:   Tue, 30 Sep 2025 14:20:35 +0100

edit view selected

Diffstat:
Mgonzopi.py | 60++++++++++++++++++++++++++++++++++++++----------------------
Msrv/gonzopiserver.py | 91+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrv/templates/edit.html | 41+++++++++++++++++++++++++++++++++++++++++
3 files changed, 170 insertions(+), 22 deletions(-)

diff --git a/gonzopi.py b/gonzopi.py @@ -650,13 +650,19 @@ def main(): if dubfiles==[]: print('no dubs, copying original sound to original') #os.system('cp '+saveoriginal+' '+dubfolder+'original.wav') - audio_origins = (os.path.realpath(saveoriginal+'.wav'))[:-5] - os.system('ln -sfr '+filmfolder+'.videos/'+audio_origins+'.wav '+saveoriginal) + #audio_origins = (os.path.realpath(saveoriginal+'.wav'))[:-5] + videos_totalt = db.query("SELECT COUNT(*) AS videos FROM videos")[0] + tot = int(videos_totalt.videos) + audio_origins=datetime.datetime.now().strftime('%Y%d%m')+'_'+os.urandom(8).hex()+'_'+str(tot).zfill(5) + os.system('cp '+saveoriginal+' '+filmfolder+'.videos/'+audio_origins+'.wav') + os.system('ln -sfr '+filmfolder+'.videos/'+audio_origins+'.wav '+dubfolder+'original.wav') time.sleep(0.2) renderfilename, newaudiomix = rendershot(filmfolder, filmname, foldername+filename, scene, shot) playdub(filmname,renderfilename, 'dub',take) #run_command('sox -V0 -G /dev/shm/dub.wav -c 2 ' + newdub) #add audio/video start delay sync + videos_totalt = db.query("SELECT COUNT(*) AS videos FROM videos")[0] + tot = int(videos_totalt.videos) audio_origins=datetime.datetime.now().strftime('%Y%d%m')+'_'+os.urandom(8).hex()+'_'+str(tot).zfill(5) run_command('sox -V0 -G '+filmfolder+'.tmp/dub.wav -c 2 '+filmfolder+'.videos/'+audio_origins+'.wav trim 0.013') os.system('ln -sfr '+filmfolder+'.videos/'+audio_origins+'.wav '+newdub) @@ -681,6 +687,8 @@ def main(): #add audio/video start delay sync dubfolder = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/dub/' os.makedirs(dubfolder,exist_ok=True) + videos_totalt = db.query("SELECT COUNT(*) AS videos FROM videos")[0] + tot = int(videos_totalt.videos) audio_origins=datetime.datetime.now().strftime('%Y%d%m')+'_'+os.urandom(8).hex()+'_'+str(tot).zfill(5) run_command('sox -V0 -G '+filmfolder+'.tmp/dub.wav -c 2 '+filmfolder+'.videos/'+audio_origins+'.wav trim 0.013') @@ -702,6 +710,8 @@ def main(): camera.stop_preview() renderfilename = renderfilm(filmfolder, filmname, comp, 0) playdub(filmname,renderfilename, 'dub',take) + videos_totalt = db.query("SELECT COUNT(*) AS videos FROM videos")[0] + tot = int(videos_totalt.videos) audio_origins=datetime.datetime.now().strftime('%Y%d%m')+'_'+os.urandom(8).hex()+'_'+str(tot).zfill(5) run_command('sox -V0 -G '+filmfolder+'.tmp/dub.wav -c 2 '+filmfolder+'.videos/'+audio_origins+'.wav trim 0.013') os.system('ln -sfr '+filmfolder+'.videos/'+audio_origins+'.wav '+newdub) @@ -4502,7 +4512,6 @@ def organize(filmfolder, filmname): #time.sleep(2) for s in sorted(takes): if 'take' in s: - make_audio_sublink=False if '.wav' in s: origin=os.path.realpath(takename+'.wav') if origin != os.path.abspath(takename+'.wav'): @@ -4511,8 +4520,10 @@ def organize(filmfolder, filmname): origin_scene_files.append(origin) else: print('no sublink for sound, create it here') - time.sleep(1) - make_audio_sublink=True + #time.sleep(1) + origin=os.path.realpath(takename+'.mp4') + os.system('mv '+takename+'.wav '+origin[:-4]+'.wav') + os.system('ln -sfr '+origin[:-4]+'.wav '+takename+'.wav') if '.mp4' in s or '.h264' in s: unorganized_nr = int(s[4:7]) takename = filmfolder + filmname + '/' + i + '/' + p + '/take' + str(unorganized_nr).zfill(3) @@ -4524,10 +4535,6 @@ def organize(filmfolder, filmname): origin_scene_files.append(origin) if os.path.isfile(takename+'.h264'): print('oh no boubles found!') - if make_audio_sublink == True: - os.system('mv '+takename+'.wav '+origin[:-4]+'.wav') - os.system('ln -sfr '+origin[:-4]+'.wav '+takename+'.wav') - make_audio_sublink=False else: print('no sublink for video, create it here') time.sleep(1) @@ -4867,8 +4874,9 @@ def compileshot(filename,filmfolder,filmname): print('trimming audio') if int(audiolength) > int(videolength+int(0.013*1000)): vumetermessage('trimming audio...') + audio_origins = (os.path.realpath(filename+'.wav')) run_command('sox -V0 -b 16 '+filename+'.wav -c 2 '+filmfolder+'.tmp/temp.wav trim 0.013') - run_command('mv '+filmfolder+'.tmp/temp.wav '+ filename + '.wav') + run_command('mv '+filmfolder+'.tmp/temp.wav '+ audio_origins) os.system('rm '+filmfolder+'.tmp/temp.wav') fps_rounded=round(fps) if int(fps) != int(film_fps): @@ -4945,6 +4953,7 @@ def shotfiles(filmfolder, filmname, scene): def rendervideo(filmfolder, filmname, scene, filmfiles, filename, renderinfo): videos_totalt = db.query("SELECT COUNT(*) AS videos FROM videos")[0] + rendered_video = filmfolder+'.rendered/'+filmname+'_scene' + str(scene).zfill(3) tot = int(videos_totalt.videos) #video_origins=filmfolder+'.videos/'+datetime.datetime.now().strftime('%Y%d%m')+'_'+os.urandom(8).hex()+'_'+str(tot).zfill(5) scenedir = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/' @@ -4983,7 +4992,7 @@ def rendervideo(filmfolder, filmname, scene, filmfiles, filename, renderinfo): videomerge.append('copy') videomerge.append('-movflags') videomerge.append('+faststart') - videomerge.append(filename+'.mp4') + videomerge.append(rendered_video+'.mp4') videomerge.append('-y') #videomerge.append(filename + '.h264') #videomerge.append(filename + '.h264') @@ -4998,17 +5007,18 @@ def rendervideo(filmfolder, filmname, scene, filmfiles, filename, renderinfo): continue writemessage('video rendering ' + str(int(rendersize)) + ' of ' + str(int(videosize)) + ' kb done') print('Video rendered!') - #os.system('ln -sfr '+video_origins+'.mp4 '+filename+'.mp4') + os.system('ln -sfr '+rendered_video+'.mp4 '+filename+'.mp4') run_command('rm '+scenedir+'.renderlist') return #---------------Render Audio---------------- -def renderaudio(audiofiles, filename, dubfiles, dubmix): +def renderaudio(filmfolder, filmname, scene, audiofiles, filename, dubfiles, dubmix): #if len(audiofiles) < 1: # writemessage('Nothing here!') # time.sleep(2) # return None + rendered_audio = filmfolder+'.rendered/'+filmname+'_scene' + str(scene).zfill(3) print('Rendering audiofiles') ##PASTE AUDIO TOGETHER writemessage('Hold on, rendering audio...') @@ -5018,12 +5028,13 @@ def renderaudio(audiofiles, filename, dubfiles, dubmix): if isinstance(audiofiles, list): for f in audiofiles: audiomerge.append(f + '.wav') - audiomerge.append(filename + '.wav') + audiomerge.append(rendered_audio + '.wav') call(audiomerge, shell=False) else: #if rendering scene with one shot if audiofiles[0] != filename: - os.system('cp '+audiofiles[0]+'.wav '+filename+'.wav') + os.system('cp '+audiofiles[0]+'.wav '+rendered_audio+'.wav') + os.system('ln -sfr '+rendered_audio+'.wav '+filename+'.wav') #DUBBING p = 1 #pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + filename + '.mp4', shell=True) @@ -5055,7 +5066,7 @@ def renderaudio(audiofiles, filename, dubfiles, dubmix): os.system('cp ' + filename + '.wav ' + filename + '_tmp.wav') #Fade and make stereo run_command('sox -V0 -b 16 -G ' + d + ' -c 2 '+filmfolder+'.tmp/fade.wav fade ' + str(round(i[2],1)) + ' 0 ' + str(round(i[3],1))) - run_command('sox -V0 -b 16 -G -m -v ' + str(round(i[0],1)) + ' '+filmfolder+'.tmp/fade.wav -v ' + str(round(i[1],1)) + ' ' + filename + '_tmp.wav -c 2 ' + filename + '.wav trim 0 ' + str(audiolength)) + run_command('sox -V0 -b 16 -G -m -v ' + str(round(i[0],1)) + ' '+filmfolder+'.tmp/fade.wav -v ' + str(round(i[1],1)) + ' ' + filename + '_tmp.wav -c 2 ' + rendered_audio + '.wav trim 0 ' + str(audiolength)) try: os.remove(filename + '_tmp.wav') os.remove(''+filmfolder+'.tmp/fade.wav') @@ -5347,7 +5358,7 @@ def rendershot(filmfolder, filmname, renderfilename, scene, shot): if os.path.exists(scenedir+'dub') == True: os.system('cp '+scenedir+'dub/original.wav '+renderfilename+'.wav') #os.system('cp '+dubfolder+'original.wav '+renderfilename+'.wav') - renderaudio(renderfilename, renderfilename, dubfiles, dubmix) + renderaudio(filmfolder, filmname, scene, renderfilename, renderfilename, dubfiles, dubmix) print('updating audiohash...') with open(scenedir + '.audiohash', 'w') as f: f.write(audiohash) @@ -5529,7 +5540,7 @@ def renderscene(filmfolder, filmname, scene): renderfixscene=True os.system('rm '+scenedir+'/.rerender') if audiohash != oldaudiohash or newmix == True or renderfix == True or renderfixscene == True: - renderaudio(filmfiles, renderfilename, dubfiles, dubmix) + renderaudio(filmfolder, filmname, scene, filmfiles, renderfilename, dubfiles, dubmix) print('updating audiohash...') with open(scenedir + '.audiohash', 'w') as f: f.write(audiohash) @@ -5645,7 +5656,7 @@ def renderfilm(filmfolder, filmname, comp, scene): if newaudiomix == True: newmix = True if audiohash != oldaudiohash or newmix == True: - renderaudio(filmfiles, renderfilename, dubfiles, dubmix) + renderaudio(filmfolder, filmname, scene, filmfiles, renderfilename, dubfiles, dubmix) print('updating audiohash...') with open(filmdir+ '.audiohash', 'w') as f: f.write(audiohash) @@ -6615,6 +6626,7 @@ def audiotrim(filename, where, dub): #audioms = int(audiolength) % 1000 #videos = int(videolength) / 1000 #audios = int(audiolength) / 1000 + audio_origins = (os.path.realpath(filename+'.wav')) if int(audiolength) > int(videolength): #calculate difference audiosync = int(audiolength) - int(videolength) @@ -6637,7 +6649,7 @@ def audiotrim(filename, where, dub): run_command('sox -V0 -b 16 -G ' + dub[:-4] + '_temp.wav -c 2 ' + dub[:-4] + '.wav fade 0.01 0 0.01') os.remove(dub[:-4] + '_temp.wav') else: - run_command('sox -V0 -b 16 -G ' + filename + '_temp.wav -c 2 ' + filename + '.wav fade 0.01 0 0.01') + run_command('sox -V0 -b 16 -G ' + filename + '_temp.wav -c 2 ' + audio_origins + ' fade 0.01 0 0.01') os.remove(filename + '_temp.wav') #if int(audiosync) > 400: # writemessage('WARNING!!! VIDEO FRAMES DROPPED!') @@ -6665,7 +6677,7 @@ def audiotrim(filename, where, dub): run_command('sox -V0 -b 16 -G ' + dub[:-4] + '_temp.wav -c 2 ' + dub[:-4] + '.wav fade 0.01 0 0.01') else: run_command('sox -V0 -b 16 -r '+soundrate+' '+filename+'.wav -c 2 '+filename+'_temp.wav trim 0.0 pad 0 ' + str(int(audiosync)/1000)) - run_command('sox -V0 -b 16 -G ' + filename + '_temp.wav -c 2 ' + filename + '.wav fade 0.01 0 0.01') + run_command('sox -V0 -b 16 -G ' + filename + '_temp.wav -c 2 ' + audio_origins + ' fade 0.01 0 0.01') #add silence to end #run_command('sox -V0 /dev/shm/silence.wav ' + filename + '_temp.wav') #run_command('cp '+filename+'.wav '+filename+'_temp.wav') @@ -6709,7 +6721,11 @@ def audiosilence(renderfilename): videos = int(videolength) / 1000 logger.info('Videofile is: ' + str(videos) + 's ' + str(videoms)) run_command('sox -V0 -n -b 16 -r '+soundrate+' -c 2 '+filmfolder+'.tmp/silence.wav trim 0.0 ' + str(videos)) - os.system('cp '+filmfolder+'.tmp/silence.wav ' + renderfilename + '.wav') + videos_totalt = db.query("SELECT COUNT(*) AS videos FROM videos")[0] + tot = int(videos_totalt.videos) + audio_origins=datetime.datetime.now().strftime('%Y%d%m')+'_'+os.urandom(8).hex()+'_'+str(tot).zfill(5) + os.system('cp '+filmfolder+'.tmp/silence.wav ' +filmfolder+'.videos/'+audio_origins+'.wav') + os.system('ln -sfr '+filmfolder+'.videos/'+audio_origins+'.wav '+renderfilename+'.wav') os.system('rm '+filmfolder+'.tmp/silence.wav') #--------------USB filmfolder------------------- diff --git a/srv/gonzopiserver.py b/srv/gonzopiserver.py @@ -506,6 +506,97 @@ class player: return render.player(real_filmfolder,filmfolder,film,i.scene,i.shot,i.take,str,randhash,has_audio_track) class api: + def GET(self): + i=web.input(func=None,selected=None, scene=None, shot=None, film=None) + interface=open('/dev/shm/interface','r') + menu=interface.readlines() + vumeter=open('/dev/shm/vumeter','r') + vumetermessage=vumeter.readlines()[0].rstrip('\n') + #print(menu) + menudone='' + p=0 + film=None + selectfilm=False + if menu != '': + scene=1 + shot=1 + take=1 + for i in menu: + if p == 0: + selected=int(i)+3 + if p > 1: + if selected == p: + #menudone=menudone+'<b> '+i.rstrip('\n')+' </b> | ' + menudone=menudone+'<ka style="text-decoration:none; font-size:20px;" color:fff;" href="">'+i+'</ka>' + else: + #menudone=menudone+i.rstrip('\n')+' | ' + menudone=menudone+'<a style="text-decoration:none; font-size:20px;" href="?selected='+str(p-3)+'"> '+i+' </a>' + #if p == 7: + # menudone=menudone+'<br>' + #if p == 13: + # menudone=menudone+'<br>' + #if p == 21: + # menudone=menudone+'<br>' + #if p == 30: + # menudone=menudone+'<br>' + if p == 2 and i.rstrip('\n') == 'Up and down to select and load film': + selectfilm=True + if p == 3 and selectfilm==True: + try: + film=i.split(':')[1].rstrip('\n') + except: + film=None + if p == 4 and selectfilm == False: + try: + film=i.split(':')[1].rstrip('\n') + except: + film=None + if p == 5 and film != None: + try: + scene=int(i.split(':')[1].split('/')[0]) + except: + scene=1 + if p == 6 and film != None: + try: + shot=int(i.split(':')[1].split('/')[0]) + except: + shot=1 + if p == 7 and film != None: + try: + take=int(i.split(':')[1].split('/')[0]) + except: + take=1 + if p > 0 and selected == 423: + menudone=menudone+'<ka style="text-decoration:none; font-size:20px;" color:fff;" href="">'+i+'</ka>' + #if p > 2 and film == None: + #menudone=menudone+'<ka style="text-decoration:none; font-size:20px;" color:fff;" href="">'+i+'</ka>' + p = p + 1 + thumb = '' + video = '' + if film != None: + if selected == 0: + video = '/p/'+film + menudone+=menudone+'video' + if selected == 4: + video = '/p/'+film + elif selected == 5: + video = '/p/'+film+'?scene=' + str(scene) + elif selected == 6: + video = '/p/'+film+'?scene='+str(scene)+'&shot='+str(shot)+'&take='+str(take) + elif selected == 7: + video = '/p/'+film+'?scene='+str(scene)+'&shot='+str(shot)+'&take='+str(take) + else: + video = '/p/'+film+'?scene='+str(scene)+'&shot='+str(shot)+'&take='+str(take) + thumb = '/'+filmfolder + film + "/scene" + str(scene).zfill(3) + "/shot" + str(shot).zfill(3) + "/take" + str(take).zfill(3) + ".jpeg" + if os.path.isfile(basedir+thumb) == True: + randhashimg = '?'+hashlib.md5(str(random.getrandbits(256)).encode('utf-8')).hexdigest() + writemenu=menudone+'<br><br>'+vumetermessage+'<br><a href="'+video+'"><img src="'+thumb+randhashimg+'"></a>' + #writemenu=menudone+render.player(filmfolder,film,scene,shot,take,str) + else: + writemenu=menudone+'<br><br>'+vumetermessage+'<br>' + isActive=True + return json.dumps({"film": film, "scene":scene,"shot":shot,"isActive":isActive}) + def POST(self): global menuold, vumeterold i=web.input(func=None,selected=None, scene=None, shot=None, film=None) diff --git a/srv/templates/edit.html b/srv/templates/edit.html @@ -338,7 +338,48 @@ $$('#PASTE').on('click', function () { } }) }); + + // Function to fetch data and update div + function updateShotData() { + // Get the div and its data attributes + const $$shotDivs = $$('.shotdata'); + + // AJAX request + $$.ajax({ + url: '/api', // Replace with your actual API endpoint + method: 'GET', + dataType: 'json', // Explicitly expect JSON response + success: function(response) { + // Assuming JSON response like: { "scene": "1", "shot": "2" } + const currentScene = response.scene; + const currentShot = response.shot; + + // Reset all divs to transparent border + $$shotDivs.css('border', '1px solid transparent'); + + // Find and update matching div + $$shotDivs.each(function() { + const $$div = $$(this); + if ($$div.data('scene') == currentScene && $$div.data('shot') == currentShot) { + $$div.css('border', '1px solid white'); // Draw border on matching div + } + }); + }, + error: function(xhr, status, error) { + console.error('API request failed:', error); + $$shotDivs.css('border', '1px solid transparent'); // Reset all borders on error + } + }); + } + + + // Initial call + updateShotData(); + + // Set interval to call every second (1000ms) + setInterval(updateShotData, 1000); }); + </script>