gonzopi

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

commit 0ccad66e0895e75f3e333fa2b020e64b3053da57
parent 85c54148f1eb48b2c75e2114bfb086e3ccdd3fea
Author: rbckman <rob@tarina.org>
Date:   Mon, 22 Sep 2025 11:55:05 +0100

editmode

Diffstat:
Mgonzopi.py | 197+++++++++++++++++++++++++++++++++++++++++++++----------------------------------
Msrv/gonzopiserver.py | 77+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------
Msrv/templates/base2.html | 2+-
3 files changed, 185 insertions(+), 91 deletions(-)

diff --git a/gonzopi.py b/gonzopi.py @@ -1133,50 +1133,54 @@ def main(): time.sleep(1) #take elif pressed == 'remove' and menu[selected] == 'TAKE:': - remove(filmfolder, filmname, scene, shot, take, 'take') - organize(filmfolder, filmname) - scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take) - take = counttakes(filmname, filmfolder, scene, shot) - updatethumb = True - rendermenu = True - #loadfilmsettings = True - time.sleep(0.2) + u = remove(filmfolder, filmname, scene, shot, take, 'take') + if u != False: + organize(filmfolder, filmname) + scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take) + take = counttakes(filmname, filmfolder, scene, shot) + updatethumb = True + rendermenu = True + #loadfilmsettings = True + time.sleep(0.2) #shot elif pressed == 'remove' and menu[selected] == 'SHOT:': - remove(filmfolder, filmname, scene, shot, take, 'shot') - organize(filmfolder, filmname) - scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take) - take = counttakes(filmname, filmfolder, scene, shot) - updatethumb = True - rendermenu = True - #loadfilmsettings = True - time.sleep(0.2) + u = remove(filmfolder, filmname, scene, shot, take, 'shot') + if u != False: + organize(filmfolder, filmname) + scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take) + take = counttakes(filmname, filmfolder, scene, shot) + updatethumb = True + rendermenu = True + #loadfilmsettings = True + time.sleep(0.2) #scene elif pressed == 'remove' and menu[selected] == 'SCENE:' or pressed=='remove_now': - remove(filmfolder, filmname, scene, shot, take, 'scene') - organize(filmfolder, filmname) - scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take) - shot = countshots(filmname, filmfolder, scene) - take = counttakes(filmname, filmfolder, scene, shot) - updatethumb = True - rendermenu = True - #loadfilmsettings = True - time.sleep(0.2) - #film - elif pressed == 'remove' and menu[selected] == 'FILM:': - remove(filmfolder, filmname, scene, shot, take, 'film') - try: - filmname = getfilms(filmfolder)[0][0] - except: - filmname = 'reel_001' - if os.path.isdir(filmfolder+filmname) == False: - os.makedirs(filmfolder+filmname) - else: - scene, shot, take = countlast(filmname, filmfolder) - loadfilmsettings = True + u = remove(filmfolder, filmname, scene, shot, take, 'scene') + if u != False: + organize(filmfolder, filmname) + scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take) + shot = countshots(filmname, filmfolder, scene) + take = counttakes(filmname, filmfolder, scene, shot) updatethumb = True rendermenu = True - time.sleep(0.2) + #loadfilmsettings = True + time.sleep(0.2) + #film + elif pressed == 'remove' and menu[selected] == 'FILM:': + u = remove(filmfolder, filmname, scene, shot, take, 'film') + if u != False: + try: + filmname = getfilms(filmfolder)[0][0] + except: + filmname = 'reel_001' + if os.path.isdir(filmfolder+filmname) == False: + os.makedirs(filmfolder+filmname) + else: + scene, shot, take = countlast(filmname, filmfolder) + loadfilmsettings = True + updatethumb = True + rendermenu = True + time.sleep(0.2) elif pressed == 'remove' and menu[selected] == 'CAMERA:': if camselected != 0: cameras.pop(camselected) @@ -1609,8 +1613,8 @@ def main(): if onlysound != True: #camera.start_recording(filmfolder+ '.videos/'+video_origins+'.h264', format='h264', bitrate = bitrate, level=profilelevel, quality=quality, intra_period=1) rec_process, camera=startrecording(camera, filmfolder+ '.videos/'+video_origins+'.mp4',bitrate, quality, profilelevel, reclength) - soundlag=starttime-sound_start starttime = time.time() + soundlag=sound_start-starttime os.system('ln -sfr '+filmfolder+'.videos/'+video_origins+'.mp4 '+foldername+filename+'.mp4') recording = True showmenu = 0 @@ -1626,6 +1630,11 @@ def main(): hsize = int((float(img.size[1])*float(wpercent))) img = img.resize((basewidth,hsize), Image.ANTIALIAS) img.save(foldername+'take'+str(take).zfill(3) + '.jpeg') + basewidth = 80 + wpercent = (basewidth/float(img.size[0])) + hsize = int((float(img.size[1])*float(wpercent))) + img = img.resize((basewidth,hsize), Image.ANTIALIAS) + img.save(foldername+'take'+str(take).zfill(3) + '_thumb.jpeg') vumetermessage('Great Pic taken!!') updatethumb = True elif beepcountdown > 0 and beeping == True: @@ -1659,6 +1668,13 @@ def main(): camera.capture(foldername + filename + '.jpeg', resize=(800,450), use_video_port=True) elif film_reso == '1920x816': camera.capture(foldername + filename + '.jpeg', resize=(800,340), use_video_port=True) + basewidth = 80 + img = Image.open(foldername + filename + '.jpeg') + wpercent = (basewidth/float(img.size[0])) + hsize = int((float(img.size[1])*float(wpercent))) + img = img.resize((basewidth,hsize), Image.ANTIALIAS) + img.save(foldername+filename + '_thumb.jpeg') + updatethumb = True except: logger.warning('something wrong with camera jpeg capture') #delayerr = audiotrim(foldername,filename) @@ -2326,38 +2342,40 @@ def main(): vumetermessage(getaudiocards()[plughw]) print(filmfolder) print(filmname) - origin_videos=organize(filmfolder, filmname) - print('ORIGIN') - print(origin_videos) - print('total of videos: '+str(len(origin_videos))) - with open(filmfolder+filmname+'/.origin_videos', 'w') as outfile: - outfile.write('\n'.join(str(i) for i in origin_videos)) - if not os.path.isdir(filmfolder+'.videos/'): - os.makedirs(filmfolder+'.videos/') - allfiles = os.listdir(filmfolder+'.videos/') - print(allfiles) - print('alll') - for origin in origin_videos: - if origin in allfiles: - try: - #os.remove(origin) - print('ORIGIN VIDEO FOLDER NOT IN SYNC' + origin) - time.sleep(5) - except: - print('not exist') - #organize(filmfolder,'onthefloor') - if origin_videos != []: - if origin_videos[0] != '': - reso_w, reso_h = check_reso(origin_videos[0]) - reso_check=str(reso_w)+'x'+str(reso_h) - fps_check = check_fps(origin_videos[0]) - if reso_check != film_reso: - vumetermessage('wrong film project resolution') - #waitforanykey() - if str(fps_check) != str(film_fps): - vumetermessage('wrong film project framerate') - #waitforanykey() - add_organize(filmfolder, filmname) + check_film = False + if check_film == True: + origin_videos=organize(filmfolder, filmname) + print('ORIGIN') + print(origin_videos) + print('total of videos: '+str(len(origin_videos))) + with open(filmfolder+filmname+'/.origin_videos', 'w') as outfile: + outfile.write('\n'.join(str(i) for i in origin_videos)) + if not os.path.isdir(filmfolder+'.videos/'): + os.makedirs(filmfolder+'.videos/') + allfiles = os.listdir(filmfolder+'.videos/') + print(allfiles) + print('alll') + for origin in origin_videos: + if origin in allfiles: + try: + #os.remove(origin) + print('ORIGIN VIDEO FOLDER NOT IN SYNC' + origin) + time.sleep(5) + except: + print('not exist') + #organize(filmfolder,'onthefloor') + if origin_videos != []: + if origin_videos[0] != '': + reso_w, reso_h = check_reso(origin_videos[0]) + reso_check=str(reso_w)+'x'+str(reso_h) + fps_check = check_fps(origin_videos[0]) + if reso_check != film_reso: + vumetermessage('wrong film project resolution') + #waitforanykey() + if str(fps_check) != str(film_fps): + vumetermessage('wrong film project framerate') + #waitforanykey() + add_organize(filmfolder, filmname) scenes, shots, takes = countlast(filmname, filmfolder) loadfilmsettings = False rendermenu = True @@ -3389,9 +3407,9 @@ def loadfilm(filmname, filmfolder, camera, overlay): buttontime = time.time() holdbutton = '' films = getfilms(filmfolder) - filmsize=[] - for f in films: - filmsize.append(du(filmfolder+f[0])) + #filmsize=[] + #for f in films: + # filmsize.append(du(filmfolder+f[0])) filmstotal = len(films[1:]) selectedfilm = 0 selected = 0 @@ -3400,7 +3418,7 @@ def loadfilm(filmname, filmfolder, camera, overlay): while True: settings = films[selectedfilm][0], '', '' oldmenu=writemenu(menu,settings,selected,header,showmenu,oldmenu) - vumetermessage('filmsize: '+filmsize[selectedfilm]+' date: '+time.strftime('%Y-%m-%d %H:%M:%S',time.gmtime(films[selectedfilm][1]))) + vumetermessage('date: '+time.strftime('%Y-%m-%d %H:%M:%S',time.gmtime(films[selectedfilm][1]))) pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton) if pressed == 'down': if selectedfilm < filmstotal: @@ -4236,6 +4254,7 @@ def remove(filmfolder, filmname, scene, shot, take, sceneshotortake): os.system('rm ' + foldername + filename + '.mp4') os.system('rm ' + foldername + filename + '.wav') os.system('rm ' + foldername + filename + '.jpeg') + os.system('rm ' + foldername + filename + '_thumb.jpeg') return elif sceneshotortake == 'shot' and shot > 0: os.system('rm -r ' + foldername) @@ -4270,17 +4289,18 @@ def remove(filmfolder, filmname, scene, shot, take, sceneshotortake): os.system('rm ' + foldername + filename + '.mp4') os.system('rm ' + foldername + filename + '.wav') os.system('rm ' + foldername + filename + '.jpeg') - return + os.system('rm ' + foldername + filename + '_thumb.jpeg') + return elif sceneshotortake == 'shot' and shot > 0: os.system('rm -r ' + foldername) - return + return elif sceneshotortake == 'scene': foldername = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) os.system('rm -r ' + foldername) scene = countscenes(filmfolder, filmname) shot=1 take=1 - return + return elif sceneshotortake == 'film': origin_videos=[] v=organize(filmfolder, filmname) @@ -4308,10 +4328,12 @@ def remove(filmfolder, filmname, scene, shot, take, sceneshotortake): os.system('cp ' + foldername + filename + '.mp4 ' + onthefloor + '') os.system('cp ' + foldername + filename + '.wav ' + onthefloor + '') os.system('cp ' + foldername + filename + '.jpeg ' + onthefloor + '') + os.system('cp ' + foldername + filename + '_thumb.jpeg ' + onthefloor + '') os.system('rm ' + foldername + filename + '.h264 ') os.system('rm ' + foldername + filename + '.mp4 ') os.system('rm ' + foldername + filename + '.wav ') os.system('rm ' + foldername + filename + '.jpeg ') + os.system('rm ' + foldername + filename + '_thumb.jpeg ') os.system('cp -r '+filmfolder + filmname + "/settings.p "+filmfolder + filmname + '_archive/settings.p') take = take - 1 if take == 0: @@ -4354,7 +4376,7 @@ def remove(filmfolder, filmname, scene, shot, take, sceneshotortake): organize(filmfolder, filmname + '_archive') return elif selected == 0: - return + return False time.sleep(0.02) #--------CLEAN--------- @@ -4472,6 +4494,7 @@ def organize(filmfolder, filmname): run_command(mv + '.h264 ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.h264') run_command(mv + '.wav ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.wav') run_command(mv + '.jpeg ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.jpeg') + run_command(mv + '_thumb.jpeg ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '_thumb.jpeg') #check if same video has both h246 and mp4 and render and remove h264 for t in sorted(takes): if t.replace('.mp4','') == s.replace('.h264','') or s.replace('.mp4','') == t.replace('.h264',''): @@ -4783,8 +4806,9 @@ def compileshot(filename,filmfolder,filmname): audiolength = get_audio_length(filename+'.wav') except: audiolength=videolength - #if there is no audio length - + #if there is no audio length + vumetermessage('creating audio track...') + audiosilence(filename) print('trimming audio') if int(audiolength) > int(videolength+int(0.013*1000)): vumetermessage('trimming audio...') @@ -4950,7 +4974,11 @@ def renderaudio(audiofiles, filename, dubfiles, dubmix): #pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + filename + '.mp4', shell=True) #videolength = pipe.decode().strip() videolength = get_video_length(filename+'.mp4') - audiolength = get_audio_length(filename+'.wav') + try: + audiolength = get_audio_length(filename+'.wav') + except: + audiosilence(filename) + audiolength = get_audio_length(filename+'.wav') if audiolength > videolength: audiotrim(filename, 'end','') for i, d in zip(dubmix, dubfiles): @@ -5074,6 +5102,7 @@ def rendershot(filmfolder, filmname, renderfilename, scene, shot): renderfix = True if os.path.isfile(renderfilename + '.jpeg') == False: run_command('ffmpeg -sseof -1 -i ' + renderfilename + '.mp4 -update 1 -q:v 1 -vf scale=800:450 ' + renderfilename + '.jpeg') + run_command('ffmpeg -sseof -1 -i ' + renderfilename + '.mp4 -update 1 -q:v 1 -vf scale=80:45 ' + renderfilename + '_thumb.jpeg') #try: # pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + renderfilename + '.mp4', shell=True) # videolength = pipe.decode().strip() @@ -5986,7 +6015,7 @@ def playdub(filmname, filename, player_menu, take): if hdmi_mode==False: player = OMXPlayer(filename + '.mp4', args=['-n', '-1', '--fps', str(film_fps), '--layer', '3', '--no-osd', '--win', '0,'+topspace+','+screen_reso_w+','+screen_reso_h,' --no-keys', '--loop'], dbus_name='org.mpris.MediaPlayer2.omxplayer1', pause=True) else: - player = OMXPlayer(filename + '.mp4', args=['-n', '-1', '--fps', str(film_fps), '--layer', '3', '--no-osd','--win', '0,15,'+reso_h+','+reso_w, '--no-keys', '--loop'], dbus_name='org.mpris.MediaPlayer2.omxplayer1', pause=True) + player = OMXPlayer(filename + '.mp4', args=['-n', '-1', '--fps', str(film_fps), '--layer', '3', '--no-osd','--win', '0,15,'+reso_w+','+reso_h, '--no-keys', '--loop'], dbus_name='org.mpris.MediaPlayer2.omxplayer1', pause=True) except: writemessage('Something wrong with omxplayer') time.sleep(0.1) @@ -5996,7 +6025,7 @@ def playdub(filmname, filename, player_menu, take): if hdmi_mode==False: player = OMXPlayer(filename + '.mp4', args=['--adev', 'alsa:hw:'+str(plughw), '--fps', str(film_fps), '--layer', '3', '--no-osd', '--win', '0,'+topspace+','+screen_reso_w+','+screen_reso_h, '--no-keys', '--loop'], dbus_name='org.mpris.MediaPlayer2.omxplayer1', pause=True) else: - player = OMXPlayer(filename + '.mp4', args=['-n', '-1', '--fps', str(film_fps), '--layer', '3', '--no-osd','--no-keys','--win', '0,15,'+reso_h+','+reso_w, '--no-keys', '--loop'], dbus_name='org.mpris.MediaPlayer2.omxplayer1', pause=True) + player = OMXPlayer(filename + '.mp4', args=['-n', '-1', '--fps', str(film_fps), '--layer', '3', '--no-osd','--no-keys','--win', '0,15,'+reso_w+','+reso_h, '--no-keys', '--loop'], dbus_name='org.mpris.MediaPlayer2.omxplayer1', pause=True) except: writemessage('Something wrong with omxplayer') time.sleep(0.1) diff --git a/srv/gonzopiserver.py b/srv/gonzopiserver.py @@ -9,6 +9,8 @@ import time import random import hashlib import configparser +import json +from PIL import Image from pymediainfo import MediaInfo # Get path of the current dir, then use it as working directory: @@ -21,6 +23,8 @@ urls = ( '/c/?', 'index', '/f/(.*)?', 'films', '/t/(.*)?', 'tree', + '/e/(.*)?', 'edit', + '/save-order/(.*)?', 'logorder', '/p/(.*)?', 'player', '/api','api' ) @@ -336,20 +340,20 @@ class index: except: selected=0 try: - name=menu[3].split(':')[1] + name=menu[4].split(':')[1] name=name.rstrip('\n') except: name='' try: - scene=menu[4].split(':')[1].split('/')[0] + scene=menu[5].split(':')[1].split('/')[0] except: scene=1 try: - shot=menu[5].split(':')[1].split('/')[0] + shot=menu[6].split(':')[1].split('/')[0] except: shot=1 try: - take=menu[6].split(':')[1].split('/')[0] + take=menu[7].split(':')[1].split('/')[0] except: take=1 session.reload = 0 @@ -425,6 +429,61 @@ class tree: scenes = countscenes(filmfolder, film) return render2.tree(allfilms, film, scenes, str, filmfolder, counttakes, countshots, countscenes, shots, i.scene, takes, i.shot, i.take, checkvideo, randhash, if_exist) +def createthumb(picture, thumbnail): + sendtocamera(ip,port,'THUMB|'+picture+':'+thumbnail) + +class edit: + def GET(self, film): + shots = 0 + takes = 0 + gonzopifilms = getfilms(filmfolder) + renderedfilms = [] + unrenderedfilms = [] + allfilms = [] + for f in gonzopifilms: + if os.path.isfile(filmfolder + f[0] + '/' + f[0] + '.mp4') == True: + renderedfilms.append(f[0]) + allfilms.append(f[0]) + else: + unrenderedfilms.append(f[0]) + allfilms.append(f[0]) + i = web.input(page=None, scene=None, shot=None, take=None, film=None, randhash=None) + if i.scene != None: + shots = countshots(film, filmfolder, i.scene) + takes = counttakes(film, filmfolder, i.scene, i.shot) + if i.scene != None and i.shot != None: + shots = countshots(film, filmfolder, i.scene) + if i.randhash == None: + randhash = hashlib.md5(str(random.getrandbits(256)).encode('utf-8')).hexdigest() + scenes = countscenes(filmfolder, film) + return render2.edit(allfilms, film, scenes, str, filmfolder, counttakes, countshots, countscenes, shots, i.scene, takes, i.shot, i.take, checkvideo, randhash, if_exist, createthumb,basedir,time) + +class logorder: + def POST(self, film): + try: + data = web.data() + order = json.loads(data) + + if not order: + web.header('Content-Type', 'application/json') + return json.dumps({"error": "No data provided"}) + + # Write alt values to file without index + with open(basedir+'/static/order.edit', 'w') as f: + for alt in order: + f.write(f"{alt}\n") + print(alt) + + web.header('Content-Type', 'application/json') + return json.dumps({"message": "Order saved successfully"}) + except json.JSONDecodeError: + web.header('Content-Type', 'application/json') + return json.dumps({"error": "Invalid JSON data"}) + except Exception as e: + web.header('Content-Type', 'application/json') + return json.dumps({"error": f"Server error: {str(e)}"}) + + class player: def GET(self, film): i=web.input(scene=None,shot=None,take=None) @@ -432,9 +491,9 @@ 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): + def POST(self): global menuold, vumeterold - i=web.input(func=None,selected=None) + i=web.input(func=None,selected=None, scene=None, shot=None, film=None) if i.func == 'record': sendtocamera(ip,port,'RECORD') elif i.func == 'retake': @@ -479,6 +538,12 @@ class api: sendtocamera(ip,port,'copy') elif i.func == 'paste': sendtocamera(ip,port,'paste') + elif i.scene!=None and i.shot!=None and i.film != None: + sendtocamera(ip,port,'SCENE:'+str(i.scene)) + time.sleep(0.2) + sendtocamera(ip,port,'SHOT:'+str(i.shot)) + time.sleep(0.2) + sendtocamera(ip,port,'SELECTED:3') interface=open('/dev/shm/interface','r') menu=interface.readlines() vumeter=open('/dev/shm/vumeter','r') diff --git a/srv/templates/base2.html b/srv/templates/base2.html @@ -3,7 +3,7 @@ $def with (content) <HEAD> <meta charset="utf-8"> <title>Gonzo Pi | a reboot of filmmaking </title> - <link rel="stylesheet" href="/static/style2.css?v=3955" type="text/css" rel="stylesheet"/> + <link rel="stylesheet" href="/static/style2.css?v=4955" type="text/css" rel="stylesheet"/> <meta name="viewport" content="width=device-width, initial-scale=1"> <script src="/static/jquery-3.7.1.min.js" type="text/javascript"></script> <script src="/static/jquery-ui.min.js" type="text/javascript"></script>