commit 0ccad66e0895e75f3e333fa2b020e64b3053da57
parent 85c54148f1eb48b2c75e2114bfb086e3ccdd3fea
Author: rbckman <rob@tarina.org>
Date: Mon, 22 Sep 2025 11:55:05 +0100
editmode
Diffstat:
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>