gonzopi

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

gonzopi.py (354532B)


      1 #!/usr/bin/env python3
      2 # -*- coding: utf-8 -*-
      3 
      4 # https://gonzopi.org
      5 
      6 cameramode=True
      7 try:
      8     import picamerax as picamera
      9 except:
     10     cameramode=False
     11 import numpy as np
     12 import string
     13 import os
     14 import time
     15 import datetime
     16 import multiprocessing as mp
     17 from subprocess import call
     18 from subprocess import Popen
     19 omxplayermode=True
     20 try:
     21     from omxplayer import OMXPlayer
     22 except:
     23     omxplayermode=False
     24 from multiprocessing import Process, Queue
     25 import subprocess
     26 import sys
     27 import pickle
     28 rpimode=True
     29 try:
     30     import RPi.GPIO as GPIO
     31 except:
     32     rpimode=False
     33 from PIL import Image
     34 import socket
     35 import configparser
     36 import shortuuid
     37 if rpimode == True:
     38     import smbus
     39 import ifaddr
     40 import web
     41 # Check for slider support
     42 import serial
     43 import serial.tools.list_ports
     44 from pymediainfo import MediaInfo
     45 # Get a list of all serial ports
     46 slidecommander = ''
     47 slideports = serial.tools.list_ports.comports()
     48 # Print the available ports
     49 if not slideports:
     50     print("No serial ports found.")
     51 else:
     52     print("Available serial ports:")
     53     for p in slideports:
     54         print(f"{p.device} - {p.description}")
     55         if p.description.strip() == "FT232R USB UART":
     56             slidecommander = p.device
     57             print('Future Technology Found!')
     58 
     59 #import shlex
     60 from blessed import Terminal
     61 
     62 # bless the code!
     63 term = Terminal()
     64 
     65 #DEBIAN VERSION
     66 pipe = subprocess.check_output('lsb_release -c -s', shell=True)
     67 debianversion = pipe.decode().strip()
     68 print('running debian ' + debianversion)
     69 
     70 if rpimode:
     71     #CHECK RASPBERRY PI VERSION
     72     pipe = subprocess.check_output('cat /sys/firmware/devicetree/base/model', shell=True)
     73     raspberrypiversion = pipe.decode().strip()
     74     print('on ' + raspberrypiversion)
     75 
     76     #give permissions to GPIO
     77     os.system('sudo chown root.gpio /dev/gpiomem')
     78     os.system('sudo chmod g+rw /dev/gpiomem')
     79 
     80     #give permissions to RAM
     81     os.system('sudo chown -R pi /dev/shm')
     82 
     83     #make cpu freq performance
     84     os.system('sudo cpufreq-set -g performance')
     85 
     86     #set IO
     87     os.system('sudo echo 20 | sudo tee /proc/sys/vm/dirty_background_ratio')
     88     os.system('sudo echo 40 | sudo tee /proc/sys/vm/dirty_ratio')
     89 
     90     #I2CBUTTONS
     91     probei2c = 0
     92     while probei2c < 3:
     93         try:
     94             if debianversion == "stretch":
     95                 os.system('sudo modprobe i2c-dev')
     96                 bus = smbus.SMBus(3) # Rev 2 Pi uses 1
     97             else:
     98                 if 'Raspberry Pi 4 Model B' in raspberrypiversion:
     99                     os.system('sudo modprobe i2c-dev')
    100                     bus = smbus.SMBus(22) # Rev 2 Pi uses 1
    101                 else:
    102                     os.system('sudo modprobe i2c-dev')
    103                     bus = smbus.SMBus(11) # Rev 2 Pi uses 1
    104             DEVICE = 0x20 # Device address (A0-A2)
    105             IODIRB = 0x0d # Pin pullups B-side
    106             IODIRA = 0x00 # Pin pullups A-side 0x0c
    107             IODIRApullup = 0x0c # Pin pullups A-side 0x0c
    108             GPIOB  = 0x13 # Register B-side for inputs
    109             GPIOA  = 0x12 # Register A-side for inputs
    110             OLATA  = 0x14 # Register for outputs
    111             bus.write_byte_data(DEVICE,IODIRB,0xFF) # set all gpiob to input
    112             bus.write_byte_data(DEVICE,IODIRApullup,0xF3) # set two pullup inputs and two outputs 
    113             bus.write_byte_data(DEVICE,IODIRA,0xF3) # set two inputs and two outputs 
    114             bus.write_byte_data(DEVICE,OLATA,0x4)
    115             print("yes, found em i2c buttons!")
    116             i2cbuttons = True
    117             break
    118         except:
    119             print("could not find i2c buttons!! running in keyboard only mode")
    120             print("trying again...")
    121             i2cbuttons = False
    122             probei2c += 1
    123             time.sleep(1)
    124             bus=''
    125 else:
    126     i2cbuttons = False
    127 
    128 #MAIN
    129 def main():
    130     global headphoneslevel, miclevel, gonzopifolder, screen, loadfilmsettings, plughw, channels, filmfolder, scene, showmenu, rendermenu, quality, profilelevel, i2cbuttons, menudone, soundrate, soundformat, process, serverstate, que, port, recording, onlysound, camera_model, lens, fps_selection, fps_selected, fps, db, selected, cammode, newfilmname, camera_recording, abc, showhelp, camera, overlay, overlay2, recordwithports, crossfade, blendmodes, blendselect, udp_ip, udp_port, bitrate, pan, tilt, move, speed, slidereader,slide,smooth, muxing, film_fps, film_reso, film_fps_options, film_reso_options
    131     # Get path of the current dir, then use it as working directory:
    132     rundir = os.path.dirname(__file__)
    133     if rundir != '':
    134         os.chdir(rundir)
    135     #filmfolder = "/home/pi/Videos/"
    136     #picfolder = "/home/pi/Pictures/"
    137     gonzopifolder = os.getcwd()
    138 
    139     #MENUS
    140     if slidecommander:
    141         standardmenu = 'DSK:', 'FILM:', 'SCENE:', 'SHOT:', 'TAKE:', '', 'SHUTTER:', 'ISO:', 'RED:', 'BLUE:', 'FPS:', 'Q:', 'BRIGHT:', 'CONT:', 'SAT:', 'VFX:', 'FLIP:', 'BEEP:', 'LENGTH:', 'HW:', 'CH:', 'MIC:', 'PHONES:', 'COMP:', 'TIMELAPSE', 'BLEND:', 'MODE:', 'SHUTDOWN', 'SRV:', 'SEARCH:', 'WIFI:', 'UPDATE', 'UPLOAD', 'LOAD', 'NEW', 'TITLE', 'LIVE:', 'MUX:', 'HDMI:', 'SLIDE:'
    142     else:
    143         standardmenu = 'DSK:', 'FILM:', 'SCENE:', 'SHOT:', 'TAKE:', '', 'SHUTTER:', 'ISO:', 'RED:', 'BLUE:', 'FPS:', 'Q:', 'BRIGHT:', 'CONT:', 'SAT:', 'VFX:', 'FLIP:', 'BEEP:', 'LENGTH:', 'HW:', 'CH:', 'MIC:', 'PHONES:', 'COMP:', 'TIMELAPSE', 'BLEND:', 'MODE:', 'SHUTDOWN', 'SRV:', 'SEARCH:', 'WIFI:', 'UPDATE', 'UPLOAD', 'LOAD', 'NEW', 'TITLE', 'LIVE:', 'MUX:', 'HDMI:'
    144     gonzopictrlmenu = 'DSK:', 'FILM:', 'SCENE:', 'SHOT:', 'TAKE:', '', 'SHUTTER:', 'ISO:', 'RED:', 'BLUE:', 'FPS:', 'Q:', 'BRIGHT:', 'CONT:', 'SAT:', 'VFX:', 'FLIP:', 'BEEP:', 'LENGTH:', 'HW:', 'CH:', 'MIC:', 'PHONES:', 'COMP:', 'TIMELAPSE', 'BLEND:', 'MODE:', 'SHUTDOWN', 'SRV:', 'SEARCH:', 'WIFI:', 'CAMERA:', 'Add CAMERA', 'New FILM', 'New SCENE', 'Sync SCENE'
    145     #gonzopictrlmenu = "BACK","CAMERA:", "Add CAMERA","New FILM","","New SCENE","Sync SCENE","Snapshot"
    146     emptymenu='','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',''
    147     menu = standardmenu
    148     hide_menu_time=4
    149     showmenutime = time.time()+6
    150     oldmenu=''
    151     showgonzopictrl = False
    152     recordwithports = False
    153     pressagain = ''
    154     #STANDARD VALUES (some of these may not be needed, should do some clean up)
    155     abc = '_','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','1','2','3','4','5','6','7','8','9','0'
    156     numbers_only = ' ','1','2','3','4','5','6','7','8','9','0'
    157     keydelay = 0.0555
    158     selectedaction = 0
    159     selected = 0
    160     awb = 'auto', 'sunlight', 'cloudy', 'shade', 'tungsten', 'fluorescent', 'incandescent', 'flash', 'horizon'
    161     awbx = 0
    162     udp_ip = ''
    163     udp_port = ''
    164     awb_lock = 'no'
    165     effects = 'none', 'negative', 'solarize', 'denoise', 'colorpoint', 'colorswap', 'posterise', 'blur', 'film'
    166     effectselected = 0
    167     blendmodes = 'screen', 'average', 'darken', 'lighten', 'burn', 'multiply'
    168     blendselect=0
    169     blending=False
    170     fade='in'
    171     fadelength=3
    172     hdmi='off'
    173     cammode = 'film'
    174     camera_model=''
    175     slidemode=False
    176     fps_selected=8
    177     fps_selection=[]
    178     film_reso_options='1920x1080','1920x816'
    179     film_fps_options=[24,25,30]
    180     film_reso_selected=0
    181     film_fps_selected=1
    182     film_reso=film_reso_options[film_reso_selected]
    183     film_fps=int(film_fps_options[film_fps_selected])
    184     fps=int(film_fps)
    185     if 'Raspberry Pi 4 Model B' in raspberrypiversion:
    186         quality = 20
    187         bitrate = 8888888
    188     if 'Raspberry Pi 3 Model B' in raspberrypiversion:
    189         quality = 20
    190         bitrate = 1111111
    191     profilelevel='4.2'
    192     headphoneslevel = 40
    193     miclevel = 50
    194     soundformat = 'S16_LE'
    195     soundrate = '48000'
    196     recording = False
    197     retake = False
    198     lastmenu = ''
    199     menudone = ''
    200     rendermenu = True
    201     showmenu = 1
    202     showmenu_settings = True
    203     showhelp = False
    204     oldchecksync = 0
    205     overlay = None
    206     overlay2 = None
    207     underlay = None
    208     reclength = 0
    209     t = 0
    210     rectime = ''
    211     scene = 1
    212     shot = 1
    213     take = 1
    214     pic = 1
    215     speed = 20
    216     pan = 0
    217     tilt = 0
    218     move = 0
    219     slidereader = None
    220     smooth = 1000
    221     slide=1
    222     onlysound=False
    223     filmname = 'reel_001'
    224     newfilmname = ''
    225     beeps = 0
    226     beepcountdown = 0
    227     beeping = False
    228     backlight = True
    229     lastbeep = time.time()
    230     flip = 'yes'
    231     between = 30
    232     duration = 0.2
    233     dsk = 0
    234     lenses = os.listdir('lenses/')
    235     lens = lenses[0]
    236     buttontime = time.time()
    237     pressed = ''
    238     buttonpressed = False
    239     holdbutton = ''
    240     updatethumb = False
    241     loadfilmsettings = True
    242     oldsettings = ''
    243     comp = 0
    244     yanked = ''
    245     copying = ''
    246     shots_selected=[]
    247     scenes_selected=[]
    248     films_selected=[]
    249     moving = False
    250     stream = ''
    251     live = 'no'
    252     peakshot = ''
    253     peaktake = ''
    254     plughw = 0 #default audio device
    255     channels = 1 #default mono
    256     #SAVE SETTINGS FREQUENCY IN SECS
    257     pausetime = time.time()
    258     savesettingsevery = 5
    259     #TARINA VERSION
    260     f = open(gonzopifolder + '/VERSION')
    261     gonzopiversion = f.readline().strip()
    262     gonzopivername = f.readline().strip()
    263     print('Gonzo Pi '+gonzopiversion+ ' '+gonzopivername)
    264     db=''
    265     synclist=[]
    266     muxing=False
    267     mux='no'
    268 
    269     if rpimode:
    270         #FIRE UP CAMERA
    271         camera = startcamera(lens,fps)
    272         #START INTERFACE
    273         startinterface()
    274     else:
    275         camera=None
    276 
    277     #GET FILMFOLDER AND CAMERA VERSION
    278     camera_model, camera_revision , filmfolder = getconfig(camera)
    279     if os.path.isdir(filmfolder) == False:
    280         os.makedirs(filmfolder)
    281 
    282     #SYSTEM CONFIGS (turn off hdmi)
    283     #run_command('tvservice -o')
    284     #Kernel page cache optimization for sd card
    285     if rpimode:
    286         run_command('sudo ' + gonzopifolder + '/extras/sdcardhack.sh')
    287         #Make screen shut off work and run full brightness
    288         run_command('gpio -g mode 19 pwm ')
    289         run_command('gpio -g pwm 19 1023')
    290 
    291     #STORAGE DRIVES
    292     storagedrives=[['sd',filmfolder]]
    293 
    294     #CHECK IF FILMING TO USB STORAGE
    295     #if os.path.exists('/dev/sda1') == False:
    296     #    os.system('sudo pumount /media/usb0')
    297     #    os.system('sudo umount -l /media/usb0')
    298     #if os.path.exists('/dev/sda2') == False:
    299     #    os.system('sudo pumount /media/usb1')
    300     #    os.system('sudo umount -l /media/usb1')
    301     filmfolderusb=usbfilmfolder(dsk)
    302     if filmfolderusb:
    303         filmfolder=filmfolderusb
    304         storagedrives.append(['usb0',filmfolder])
    305         dsk=1
    306         loadfilmsettings == True
    307         if os.path.isdir(filmfolder) == False:
    308             os.makedirs(filmfolder)
    309  
    310     #COUNT DISKSPACE
    311     disk = os.statvfs(filmfolder)
    312     diskleft = str(int(disk.f_bavail * disk.f_frsize / 1024 / 1024 / 1024)) + 'Gb'
    313 
    314     #LOAD FILM AND SCENE SETTINGS
    315     try:
    316         filmname = getfilms(filmfolder)[0][0]
    317     except:
    318         filmname = filmname 
    319         if os.path.isdir(filmfolder+filmname) == False:
    320             os.makedirs(filmfolder+filmname)
    321 
    322     #THUMBNAILCHECKER
    323     oldscene = scene
    324     oldshot = shot
    325     oldtake = take
    326 
    327    #TURN ON WIFI AND TARINA SERVER
    328     serverstate = 'on'
    329     wifistate = 'on'
    330     if os.path.isdir(gonzopifolder+'/srv/sessions') == False:
    331         os.makedirs(gonzopifolder+'/srv/sessions')
    332     os.system('sudo chown -R www-data '+gonzopifolder+'/srv/sessions')
    333     os.system('sudo ln -sf /dev/shm/srv/menu.html '+gonzopifolder+'/srv/static/menu.html')
    334     os.system('sudo mkdir /dev/shm/srv')
    335     os.system('sudo chown -R www-data /dev/shm/srv')
    336     os.system('sudo chown -R www-data '+gonzopifolder+'/srv/static/')
    337     #serverstate = gonzopiserver(False)
    338     #TO_BE_OR_NOT_TO_BE 
    339     foldername = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) + '/'
    340     filename = 'take' + str(take).zfill(3)
    341     recordable = not os.path.isfile(foldername + filename + '.mp4') and not os.path.isfile(foldername + filename + '.h264')
    342 
    343     #CLEAN
    344     #clean('',filmfolder)
    345 
    346     #--------------Gonzopi Controller over socket ports --------#
    347 
    348     #TARINACTRL
    349     camerasconnected=''
    350     sleep=0.2
    351     cameras = []
    352     camerasoff =[]
    353     camselected=0
    354     newselected=0 
    355     mastersound=None
    356     camera_recording=None
    357     pingip=0
    358     searchforcameras='off'
    359     #NETWORKS
    360     networks=[]
    361     network=''
    362     adapters = ifaddr.get_adapters()
    363     for adapter in adapters:
    364         print("IPs of network adapter " + adapter.nice_name)
    365         for ip in adapter.ips:
    366             if ':' not in ip.ip[0] and '127.0.0.1' != ip.ip:
    367                 print(ip.ip)
    368                 networks=[ip.ip]
    369     if networks != []:
    370         network=networks[0]
    371         if network not in cameras and network != '':
    372             cameras=[]
    373             cameras.append(network)
    374 
    375     port = 55555
    376     que = Queue()
    377     process = Process(target=listenforclients, args=("0.0.0.0", port, que))
    378     process.start()
    379     nextstatus = ''
    380 
    381     serverstate_old='off'
    382     wifistate_old='off'
    383 
    384 
    385     if rpimode:
    386         #--------------Rpi MAIN LOOP---------------#
    387         while True:
    388             pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
    389             if pressagain != '':
    390                 pressed = pressagain
    391                 pressagain = ''
    392             #event = screen.getch()
    393             if wifistate != wifistate_old:
    394                 if wifistate == 'on':
    395                     run_command('sudo iwconfig wlan0 txpower auto')
    396                 elif wifistate == 'off':
    397                     run_command('sudo iwconfig wlan0 txpower off')
    398                 wifistate_old = wifistate
    399             if serverstate != serverstate_old:
    400                 if serverstate == 'on':
    401                     gonzopiserver(True)
    402                 elif serverstate == 'off':
    403                     gonzopiserver(False)
    404                 serverstate_old=serverstate
    405             if recording == False:
    406                 #SHUTDOWN
    407                 if pressed == 'middle' and menu[selected] == 'SHUTDOWN':
    408                     writemessage('Hold on shutting down...')
    409                     time.sleep(1)
    410                     run_command('sudo shutdown -h now')
    411                 #MODE
    412                 elif pressed == 'changemode':
    413                     if cammode == 'film':
    414                         cammode = 'picture'
    415                         vumetermessage('changing to picture mode')
    416                     elif cammode == 'picture':
    417                         cammode = 'film'
    418                         vumetermessage('changing to film mode')
    419                     camera.stop_preview()
    420                     camera.close()
    421                     camera = startcamera(lens,fps)
    422                     loadfilmsettings = True
    423                 #PICTURE
    424                 elif pressed == 'picture':
    425                     if os.path.isdir(foldername) == False:
    426                         os.makedirs(foldername)
    427                     picture = foldername +'picture' + str(take).zfill(3) + '.jpeg'
    428                     run_command('touch ' + foldername + '.placeholder')
    429                     print('taking picture')
    430                     camera.capture(picture,format="jpeg",use_video_port=True) 
    431                 #PEAKING
    432                 elif pressed == 'peak' and recordable == True:
    433                     if shot > 1:
    434                         peakshot = shot - 1
    435                         peaktake = counttakes(filmname, filmfolder, scene, peakshot)
    436                     p_imagename = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(peakshot).zfill(3) + '/take' + str(peaktake).zfill(3) + '.jpeg'
    437                     overlay = displayimage(camera, p_imagename, overlay, 3)
    438                     while holdbutton == 'peak':
    439                         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
    440                         vumetermessage('peaking ' + str(peakshot))
    441                         time.sleep(0.03)
    442                     overlay = removeimage(camera, overlay)
    443                 #SHOWHELP
    444                 elif pressed == 'showhelp':
    445                     vumetermessage('Button layout')
    446                     if showhelp == False:
    447                         overlay2 = removeimage(camera, overlay2)
    448                         overlay2 = displayimage(camera, gonzopifolder+'/extras/buttons.png', overlay, 4)
    449                         showhelp = True
    450                     elif showhelp == True:
    451                         overlay2 = removeimage(camera, overlay2)
    452                         updatethumb =  True
    453                         showhelp = False
    454                     #while holdbutton == 'showhelp' or pressed == 'H':
    455                     #    pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
    456                     #    vumetermessage('Button layout')
    457                     #    time.sleep(0.03)
    458                 #TIMELAPSE
    459                 elif pressed == 'middle' and menu[selected] == 'TIMELAPSE':
    460                     overlay = removeimage(camera, overlay)
    461                     takes = counttakes(filmname, filmfolder, scene, shot)
    462                     if takes > 0:
    463                         shot = countshots(filmname, filmfolder, scene) + 1
    464                         take = 1
    465                     foldername = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) + '/'
    466                     filename = 'take' + str(take).zfill(3)
    467                     renderedfilename, between, duration = timelapse(beeps,camera,filmname,foldername,filename,between,duration,backlight)
    468                     if renderedfilename != '':
    469                         #render thumbnail
    470                         #writemessage('creating thumbnail')
    471                         #run_command('avconv -i ' + foldername + filename  + '.mp4 -frames 1 -vf scale=800:460 ' + foldername + filename + '.jpeg')
    472                         updatethumb =  True
    473                 #VIEW SCENE
    474                 elif pressed == 'view' and menu[selected] == 'SLIDE:':
    475                     send_serial_port(slidecommander,';'+str(slide))
    476                     slide += 1
    477                 elif pressed == 'remove' and menu[selected] == 'SLIDE:':
    478                     send_serial_port(slidecommander,'<')
    479                 elif pressed == 'view' and menu[selected] == 'SCENE:':
    480                     writemessage('Loading scene...')
    481                     organize(filmfolder, filmname)
    482                     filmfiles = shotfiles(filmfolder, filmname, scene)
    483                     vumetermessage('press middlebutton to cancel')
    484                     if len(filmfiles) > 0:
    485                         #Check if rendered video exist
    486                         #renderfilename, newaudiomix = renderscene(filmfolder, filmname, scene)
    487                         renderfilename = renderfilm(filmfolder, filmname, comp, scene)
    488                         #writemessage('Render done!')
    489                         removeimage(camera, overlay)
    490                         camera.stop_preview()
    491                         if renderfilename != '':
    492                             remove_shots = playdub(filmname,renderfilename, 'film',take)
    493                             #fastedit (maybe deploy sometime)
    494                             #if remove_shots != []:
    495                             #    for i in remove_shots:
    496                             #        remove(filmfolder, filmname, scene, i, take, 'shot')
    497                             #    organize(filmfolder, filmname)
    498                             #    updatethumb = True
    499                             #    #loadfilmsettings = True
    500                             #    time.sleep(0.5)
    501                             #else:
    502                             #    print('nothing to remove')
    503                             camera.start_preview()
    504                     else:
    505                         vumetermessage("There's absolutely nothing in this scene! hit rec!")
    506                     updatethumb=True
    507                     rendermenu = True
    508                 #VIEW FILM
    509                 elif pressed == 'view' and menu[selected] == 'FILM:':
    510                     writemessage('Loading film...')
    511                     organize(filmfolder, filmname)
    512                     filmfiles = viewfilm(filmfolder, filmname)
    513                     vumetermessage('press middlebutton to cancel')
    514                     if len(filmfiles) > 0:
    515                         camera.stop_preview()
    516                         #removeimage(camera, overlay)
    517                         renderfilename = renderfilm(filmfolder, filmname, comp, 0)
    518                         removeimage(camera, overlay)
    519                         camera.stop_preview()
    520                         if renderfilename != '':
    521                             remove_shots = playdub(filmname,renderfilename, 'film',take)
    522                         #overlay = displayimage(camera, imagename, overlay, 3)
    523                         camera.start_preview()
    524                     else:
    525                         vumetermessage('wow, shoot first! there is zero, nada, zip footage to watch now... just hit rec!')
    526                     updatethumb=True
    527                     rendermenu = True
    528                 #VIEW SHOT OR TAKE
    529                 elif pressed == 'view':
    530                     takes = counttakes(filmname, filmfolder, scene, shot)
    531                     if take == takes+1:
    532                         take = takes
    533                     if takes > 0:
    534                         vumetermessage('press middlebutton to cancel')
    535                         writemessage('Loading clip...')
    536                         organize(filmfolder, filmname)
    537 
    538                         foldername = filmfolder + filmname + '/scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) + '/'
    539                         filename = 'take' + str(take).zfill(3)
    540                         #compileshot(foldername + filename,filmfolder,filmname)
    541                         renderfilename, newaudiomix = rendershot(filmfolder, filmname, foldername+filename, scene, shot)
    542                         removeimage(camera, overlay)
    543                         camera.stop_preview()
    544                         if renderfilename == foldername+filename:
    545                             trim, split_list = playdub(filmname,foldername + filename, 'shot',take)
    546                             if split_list != []:
    547                                 print(split_list)
    548                                 #time.sleep(5)
    549                                 split_list_save(foldername, split_list)
    550                                 writemessage('Splits saved! press view to see them.')
    551                             else:
    552                                 if trim[0] == 'beginning' or trim[0] == 'end':
    553                                     writemessage('Cutting clip...')
    554                                     videotrimsave(foldername, trim[0], trim[1], filename)
    555                                 elif trim[0] >= trim[1]:
    556                                     trim = [trim[0],0]
    557                                 elif trim[0] != 0 and trim[1] != 0:
    558                                     writemessage('Cutting clip...')
    559                                     videotrimsave(foldername, 'end', trim[1], filename)
    560                                     videotrimsave(foldername, 'beginning', trim[0], filename)
    561                                 elif trim[0] == 0 and trim[1] != 0:
    562                                     writemessage('Cutting clip...')
    563                                     videotrimsave(foldername, 'end', trim[1], filename)
    564                                 if trim[0] != 0 and trim[1] == 0:
    565                                     writemessage('Cutting clip...')
    566                                     videotrimsave(foldername, 'beginning', trim[0], filename)
    567                             imagename = foldername + filename + '.jpeg'
    568                             overlay = displayimage(camera, imagename, overlay, 3)
    569                             camera.start_preview()
    570                         else:
    571                             #vumetermessage('nothing here! hit rec!')
    572                             playdub(filmname, renderfilename, 'shot',take)
    573                             take = counttakes(filmname, filmfolder, scene, shot)
    574                         rendermenu = True
    575                         updatethumb=True
    576                     else:
    577                         shot = shots
    578                         takes = counttakes(filmname, filmfolder, scene, shot)
    579                         take=takes
    580                     rendermenu = True
    581                     updatethumb=True
    582                 #BLEND
    583                 elif pressed == 'middle' and menu[selected] == 'BLEND:' and recordable == False:
    584                     videolength=0
    585                     blenddir = filmfolder + filmname + '/scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) + '/blend/'
    586                     filename=yanked
    587                     #compileshot(scenedir+'blend/'+blendmodes[blendselect]+'.h264',filmfolder,filmname)
    588                     if filename[-7:-3] == 'shot':
    589                         takename = gettake(filename)
    590                         if '.h264' in takename:
    591                             filename=filename+'/'+takename[:-5]
    592                         if '.mp4' in takename:
    593                             filename=filename+'/'+takename[:-4]
    594                         compileshot(filename,filmfolder,filmname)
    595                     elif filename[-8:-3] == 'scene':
    596                         filename=filename+'/scene'
    597                     else:
    598                         filename=filename+'/'+filmname
    599                     #pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + filename + '.mp4', shell=True)
    600                     #videolength = pipe.decode().strip()
    601                     videolength=get_video_length(filename+'.mp4')
    602                     videolength=(int(videolength)/1000)
    603                     os.makedirs(blenddir,exist_ok=True)
    604                     #videotrim(blenddir,filename,'end', videolength)
    605                     os.system('cp '+filename+'.mp4 '+blenddir+blendmodes[blendselect]+'.mp4')
    606                     rendermenu = True
    607                     vumetermessage('blend done.')
    608                 #CROSSFADE
    609                 elif pressed == 'middle' and menu[selected] == 'CROSSFADE:':
    610                     folder = filmfolder + filmname + '/scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) + '/'
    611                     filename = 'take' + str(take).zfill(3)
    612                     vumetermessage('New crossfade made!')
    613                     crossfadesave(folder,crossfade,filename)     
    614                 elif pressed == 'middle' and menu[selected] == 'SHOT:':
    615                     folder = filmfolder + filmname + '/scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) + '/'
    616                     if folder in shots_selected:
    617                         shots_selected.remove(folder)
    618                         shots_sel = ''
    619                         vumetermessage(str(len(shots_selected))+' shots selected')
    620                     else:
    621                         shots_selected.append(folder)
    622                         shots_sel = '*'
    623                         vumetermessage(str(len(shots_selected))+' shots selected')
    624                     os.system('rm /dev/shm/videos_selected')
    625                     f = open('/dev/shm/videos_selected', 'w')
    626                     for i in shots_selected:
    627                         f.write(i+'\n')
    628                     f.close()
    629                 elif pressed == 'middle' and menu[selected] == 'SCENE:':
    630                     folder = filmfolder + filmname + '/scene' + str(scene).zfill(3) +'/'
    631                     if folder in scenes_selected:
    632                         scenes_selected.remove(folder)
    633                         scenes_sel = ''
    634                         vumetermessage(str(len(scenes_selected))+' scenes selected')
    635                     else:
    636                         scenes_selected.append(folder)
    637                         scenes_sel = '*'
    638                         vumetermessage(str(len(scenes_selected))+' scenes selected')
    639                 elif pressed == 'middle' and menu[selected] == 'FILM:':
    640                     folder = filmfolder + filmname + '/'
    641                     if folder in films_selected:
    642                         films_selected.remove(folder)
    643                         vumetermessage(str(len(films_selected))+' films selected')
    644                     else:
    645                         films_selected.append(folder)
    646                         vumetermessage(str(len(films_selected))+' films selected')
    647                 #DUB SHOT
    648                 elif pressed == 'dub' and menu[selected] == 'SHOT:' and recordable == False:
    649                     newdub, yanked = clipsettings(filmfolder, filmname, scene, shot, take, plughw,yanked)
    650                     take = counttakes(filmname, filmfolder, scene, shot)
    651                     if newdub:
    652                         camera.stop_preview()
    653                         #save original sound
    654                         dubfolder = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/dub/'
    655                         saveoriginal = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/take'+str(take).zfill(3)+'.wav'
    656                         dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, scene, shot)
    657                         foldername = filmfolder + filmname + '/scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) + '/'
    658                         filename = 'take' + str(take).zfill(3)
    659                         if dubfiles==[]:
    660                             print('no dubs, copying original sound to original')
    661                             #os.system('cp '+saveoriginal+' '+dubfolder+'original.wav')
    662                             #audio_origins = (os.path.realpath(saveoriginal+'.wav'))[:-5]
    663                             videos_totalt = db.query("SELECT COUNT(*) AS videos FROM videos")[0]
    664                             tot = int(videos_totalt.videos)
    665                             audio_origins=datetime.datetime.now().strftime('%Y%d%m')+'_'+os.urandom(8).hex()+'_'+str(tot).zfill(5)
    666                             os.system('cp '+saveoriginal+' '+filmfolder+'.videos/'+audio_origins+'.wav')
    667                             os.system('ln -sfr '+filmfolder+'.videos/'+audio_origins+'.wav '+dubfolder+'original.wav')
    668                             time.sleep(0.2)
    669                         renderfilename, newaudiomix = rendershot(filmfolder, filmname, foldername+filename, scene, shot)
    670                         playdub(filmname,renderfilename, 'dub',take)
    671                         #run_command('sox -V0 -G /dev/shm/dub.wav -c 2 ' + newdub)
    672                         #add audio/video start delay sync
    673                         videos_totalt = db.query("SELECT COUNT(*) AS videos FROM videos")[0]
    674                         tot = int(videos_totalt.videos)
    675                         audio_origins=datetime.datetime.now().strftime('%Y%d%m')+'_'+os.urandom(8).hex()+'_'+str(tot).zfill(5)
    676                         run_command('sox -V0 -G '+filmfolder+'.tmp/dub.wav -c 2 '+filmfolder+'.videos/'+audio_origins+'.wav trim 0.013')
    677                         os.system('ln -sfr '+filmfolder+'.videos/'+audio_origins+'.wav '+newdub)
    678                         #audiosync, videolength, audiolength = audiotrim(renderfilename, 'end', newdub)
    679                         vumetermessage('new shot dubbing made!')
    680                         #rerender audio
    681                         #run_command('rm '+filmfolder+'.tmp/dub.wav')
    682                         os.system('rm ' + filmfolder + filmname + '/.audiohash')
    683                         camera.start_preview()
    684                         time.sleep(1)
    685                     else:
    686                         vumetermessage('see ya around!')
    687                     rendermenu = True
    688                 #DUB SCENE
    689                 elif pressed == 'dub' and menu[selected] == 'SCENE:':
    690                     newdub, yanked = clipsettings(filmfolder, filmname, scene, 0, take, plughw,yanked)
    691                     if newdub:
    692                         camera.stop_preview()
    693                         renderfilename, newaudiomix = renderscene(filmfolder, filmname, scene)
    694                         playdub(filmname,renderfilename, 'dub',take)
    695                         #run_command('sox -V0 -G /dev/shm/dub.wav -c 2 ' + newdub)
    696                         #add audio/video start delay sync 
    697                         dubfolder = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/dub/'
    698                         os.makedirs(dubfolder,exist_ok=True)
    699                         videos_totalt = db.query("SELECT COUNT(*) AS videos FROM videos")[0]
    700                         tot = int(videos_totalt.videos)
    701 
    702                         audio_origins=datetime.datetime.now().strftime('%Y%d%m')+'_'+os.urandom(8).hex()+'_'+str(tot).zfill(5)
    703                         run_command('sox -V0 -G '+filmfolder+'.tmp/dub.wav -c 2 '+filmfolder+'.videos/'+audio_origins+'.wav trim 0.013')
    704                         os.system('ln -sfr '+filmfolder+'.videos/'+audio_origins+'.wav '+newdub)
    705                         run_command('rm '+filmfolder+'.tmp/dub.wav')
    706                         #audiosync, videolength, audiolength = audiotrim(renderfilename, 'end', newdub)
    707                         vumetermessage('new scene dubbing made!')
    708                         #rerender audio
    709                         os.system('rm ' + filmfolder + filmname + '/.audiohash')
    710                         camera.start_preview()
    711                         time.sleep(1)
    712                     else:
    713                         vumetermessage('see ya around!')
    714                     rendermenu = True
    715                 #DUB FILM
    716                 elif pressed == 'dub' and menu[selected] == 'FILM:':
    717                     newdub, yanked = clipsettings(filmfolder, filmname, 0, 0, take, plughw,yanked)
    718                     if newdub:
    719                         camera.stop_preview()
    720                         renderfilename = renderfilm(filmfolder, filmname, comp, 0)
    721                         playdub(filmname,renderfilename, 'dub',take)
    722                         videos_totalt = db.query("SELECT COUNT(*) AS videos FROM videos")[0]
    723                         tot = int(videos_totalt.videos)
    724                         audio_origins=datetime.datetime.now().strftime('%Y%d%m')+'_'+os.urandom(8).hex()+'_'+str(tot).zfill(5)
    725                         run_command('sox -V0 -G '+filmfolder+'.tmp/dub.wav -c 2 '+filmfolder+'.videos/'+audio_origins+'.wav trim 0.013')
    726                         os.system('ln -sfr '+filmfolder+'.videos/'+audio_origins+'.wav '+newdub)
    727                         run_command('rm '+filmfolder+'.tmp/dub.wav')
    728                         vumetermessage('new film dubbing made!')
    729                         camera.start_preview()
    730                         time.sleep(1)
    731                     else:
    732                         vumetermessage('see ya around!')
    733                     rendermenu = True
    734                 #BACKUP
    735                 elif pressed == 'middle' and menu[selected] == 'BACKUP':
    736                     copytousb(filmfolder)
    737                     rendermenu = True
    738                 #UPLOAD
    739                 elif pressed == 'middle' and menu[selected] == 'UPLOAD':
    740                     if webz_on() == True:
    741                         filmfiles = viewfilm(filmfolder, filmname)
    742                         if len(filmfiles) > 0:
    743                             renderfilename = renderfilm(filmfolder, filmname, comp, 0)
    744                             cmd = uploadfilm(renderfilename, filmname)
    745                             if cmd != None:
    746                                 stopinterface(camera)
    747                                 try:
    748                                     run_command(cmd)
    749                                 except:
    750                                     logger.warning('uploadfilm bugging')
    751                                 startinterface()
    752                                 camera = startcamera(lens,fps)
    753                                 loadfilmsettings = True
    754                             selectedaction = 0
    755                     rendermenu = True
    756                 #LOAD FILM
    757                 elif pressed == 'middle' and menu[selected] == 'LOAD':
    758                     camera, filmname = loadfilm(filmname, filmfolder, camera, overlay)
    759                     allfilm = getfilms(filmfolder)
    760                     for i in allfilm:
    761                         if i[0] == newfilmname:
    762                             filmname_exist=True
    763                     if filmname != newfilmname and filmname_exist==False:
    764                         filmname = newfilmname
    765                         os.makedirs(filmfolder + filmname)
    766                         vumetermessage('Good luck with your film ' + filmname + '!')
    767                         #make a filmhash
    768                         print('making filmhash...')
    769                         filmhash = shortuuid.uuid()
    770                         with open(filmfolder + filmname + '/.filmhash', 'w') as f:
    771                             f.write(filmhash)
    772                         updatethumb = True
    773                         rendermenu = True
    774                         scene = 1
    775                         shot = 1
    776                         take = 1
    777                         #selectedaction = 0
    778                         newfilmname = ''
    779                     else:
    780                         filmname = newfilmname
    781                         newfilmname = ''
    782                         vumetermessage('film already exist!')
    783                         logger.info('film already exist!')
    784                         print(term.clear)
    785                     updatethumb = True
    786                     loadfilmsettings = True
    787                     rendermenu = True
    788                 #UPDATE
    789                 elif pressed == 'middle' and menu[selected] == 'UPDATE':
    790                     if webz_on() == True:
    791                         stopinterface(camera)
    792                         gonzopiversion, gonzopivername = update(gonzopiversion, gonzopivername)
    793                         startinterface()
    794                         camera = startcamera(lens,fps)
    795                         loadfilmsettings = True
    796                         selectedaction = 0
    797                     rendermenu = True
    798                 #WIFI
    799                 elif pressed == 'middle' and menu[selected] == 'WIFI:':
    800                     stopinterface(camera)
    801                     run_command('wicd-curses')
    802                     startinterface()
    803                     camera = startcamera(lens,fps)
    804                     loadfilmsettings = True
    805                     rendermenu = True
    806                 #NEW FILM
    807                 elif pressed == 'middle' and menu[selected] == 'NEW' or filmname == '' or pressed == 'new_film':
    808                     filmname_exist=False
    809                     if newfilmname == '':
    810                         newfilmname = nameyourfilm(filmfolder, filmname, abc, True)
    811                     allfilm = getfilms(filmfolder)
    812                     for i in allfilm:
    813                         if i[0] == newfilmname:
    814                             filmname_exist=True
    815                     if filmname != newfilmname and filmname_exist==False:
    816                         filmname = newfilmname
    817                         os.makedirs(filmfolder + filmname)
    818                         vumetermessage('Good luck with your film ' + filmname + '!')
    819                         #make a filmhash
    820                         print('making filmhash...')
    821                         filmhash = shortuuid.uuid()
    822                         with open(filmfolder + filmname + '/.filmhash', 'w') as f:
    823                             f.write(filmhash)
    824                         updatethumb = True
    825                         rendermenu = True
    826                         scene = 1
    827                         shot = 1
    828                         take = 1
    829                         #selectedaction = 0
    830                         newfilmname = ''
    831                         #film_reso, film_fps = film_settings()
    832                         camera.stop_preview()
    833                         camera.close()
    834                         camera = startcamera(lens,fps)
    835                     else:
    836                         print(term.clear)
    837                         filmname = newfilmname
    838                         newfilmname = ''
    839                 #EDIT FILM NAME
    840                 elif pressed == 'middle' and menu[selected] == 'TITLE' or filmname == '':
    841                     newfilmname = nameyourfilm(filmfolder, filmname, abc, False)
    842                     if filmname != newfilmname:
    843                         os.system('mv ' + filmfolder + filmname + ' ' + filmfolder + newfilmname)
    844                         filmname = newfilmname
    845                         db = get_film_files(filmname,filmfolder,db)
    846                         vumetermessage('Film title changed to ' + filmname + '!')
    847                     else:
    848                         vumetermessage('')
    849                     rendermenu = True
    850 
    851                 #PASTE MANY SCENES
    852                 elif pressed == 'copy' and menu[selected] == 'SCENE:' and scenes_selected != [] or pressed == 'move' and menu[selected] == 'SCENE:' and scenes_selected != []:
    853                     landingscene=scene-1
    854                     for yanked in reversed(scenes_selected):
    855                         vumetermessage('Pasting scene, please wait...')
    856                         paste = filmfolder + filmname + '/' + 'scene' + str(scene-1).zfill(3) + '_yanked'
    857                         os.system('cp -r ' + yanked + ' ' + paste)
    858                         if pressed == 'move':
    859                             os.system('touch ' + yanked + '/.remove')
    860                         add_organize(filmfolder, filmname)
    861                         yanked = ''
    862                     scenes_selected = []
    863                     organize(filmfolder, filmname)
    864                     organize(filmfolder, filmname)
    865                     updatethumb = True
    866                     scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take)
    867                     if scene > scenes:
    868                         scene = scenes
    869                     if shot > shots:
    870                         shot = shots
    871                     vumetermessage('All scenes pasted!')
    872                     yanked = ''
    873                     scene=landingscene
    874                 #PASTE MANY SHOTS
    875                 elif pressed == 'copy' and menu[selected] == 'SHOT:' and shots_selected != []  or pressed == 'move' and menu[selected] == 'SHOT:' and shots_selected != []:
    876                     landingshot=shot-1
    877                     for yanked in reversed(shots_selected):
    878                         take = counttakes(filmname, filmfolder, scene, shot)
    879                         if shot == 0:
    880                             shot=1
    881                         vumetermessage('Pasting shot, please wait...')
    882                         paste = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot-1).zfill(3) + '_yanked' 
    883                         try:
    884                             os.makedirs(filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3))
    885                         except:
    886                             pass
    887                         os.system('cp -r ' + yanked + ' ' + paste)
    888                         if pressed == 'move':
    889                             os.system('touch ' + yanked + '/.remove')
    890                         add_organize(filmfolder, filmname)
    891                         yanked = ''
    892                     os.system('rm /dev/shm/videos_selected')
    893                     shots_selected = []
    894                     organize(filmfolder, filmname)
    895                     organize(filmfolder, filmname)
    896                     updatethumb = True
    897                     scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take)
    898                     if scene > scenes:
    899                         scene = scenes
    900                     if shot > shots:
    901                         shot = shots
    902                     vumetermessage('All shots pasted!')
    903                     yanked = ''
    904                     shot=landingshot
    905                 #(YANK) COPY FILM
    906                 elif pressed == 'copy' and menu[selected] == 'FILM:':
    907                     copying = 'film'
    908                     yanked = filmfolder + filmname
    909                     pastefilmname = filmname
    910                     vumetermessage('Film ' + filmname + ' copied! (I)nsert button to place it...')
    911                 #(YANK) COPY TAKE
    912                 elif pressed == 'copy' and menu[selected] == 'TAKE:' and recordable == False:
    913                     copying = 'take'
    914                     yanked = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3)+'/take' + str(take).zfill(3)
    915                     vumetermessage('Take ' + str(take) + ' copied! (I)nsert button to place it...')
    916                 #(YANK) COPY SHOT
    917                 elif pressed == 'copy' and menu[selected] == 'SHOT:':
    918                     copying = 'shot'
    919                     yanked = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3)
    920                     vumetermessage('Shot ' + str(shot) + ' copied! (I)nsert button to place it...')
    921                 #(YANK) COPY SCENE
    922                 elif pressed == 'copy' and menu[selected] == 'SCENE:':
    923                     copying = 'scene'
    924                     yanked = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3)
    925                     vumetermessage('Scene ' + str(scene) + ' copied! (I)nsert button to place it...')
    926                 #(CUT) MOVE TAKE
    927                 elif pressed == 'move' and menu[selected] == 'TAKE:' and recordable == False:
    928                     copying = 'take'
    929                     moving = True
    930                     yanked = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3)+'/take' + str(take).zfill(3)
    931                     vumetermessage('Moving shot ' + str(shot) + ' (I)nsert button to place it...')
    932                 #(CUT) MOVE SHOT
    933                 elif pressed == 'move' and menu[selected] == 'SHOT:':
    934                     copying='shot'
    935                     moving = True
    936                     yanked = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3)
    937                     vumetermessage('Moving shot ' + str(shot) + ' (I)nsert button to place it...')
    938                 #(CUT) MOVE SCENE
    939                 elif pressed == 'move' and menu[selected] == 'SCENE:':
    940                     copying='scene'
    941                     moving = True
    942                     yanked = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3)
    943                     vumetermessage('Moving scene ' + str(scene) + ' (I)nsert button to place it...')
    944 
    945                 #PASTE SHOT and PASTE SCENE
    946                 elif pressed == 'insert' and yanked:
    947                     if copying == 'take' and menu[selected] == 'TAKE:':
    948                         take = counttakes(filmname, filmfolder, scene, shot)
    949                         if shot == 0:
    950                             shot=1
    951                         take=take+1
    952                         vumetermessage('Pasting take, please wait...')
    953                         paste = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) + '/take' + str(take).zfill(3)
    954                         try:
    955                             os.makedirs(filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot'+ str(shot).zfill(3))
    956                         except:
    957                             pass
    958                         os.system('cp ' + yanked + '.mp4 ' + paste + '.mp4')
    959                         os.system('cp ' + yanked + '.info ' + paste + '.info')
    960                         os.system('cp ' + yanked + '.nofaststart ' + paste + '.nofaststart')
    961                         os.system('cp ' + yanked + '.jpeg ' + paste + '.jpeg')
    962                         os.system('cp ' + yanked + '.h264 ' + paste + '.h264')
    963                         os.system('cp ' + yanked + '.wav ' + paste + '.wav')
    964                         paste = ''
    965                         if moving == True:
    966                             os.system('rm -r ' + yanked + '*')
    967                     elif copying == 'shot' and menu[selected] == 'SHOT:':
    968                         take = counttakes(filmname, filmfolder, scene, shot)
    969                         if shot == 0:
    970                             shot=1
    971                         vumetermessage('Pasting shot, please wait...')
    972                         paste = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot-1).zfill(3) + '_yanked' 
    973                         try:
    974                             os.makedirs(filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3))
    975                         except:
    976                             pass
    977                         os.system('cp -r ' + yanked + ' ' + paste)
    978                         if moving == True:
    979                             os.system('rm -r ' + yanked+'/*')
    980                             #Remove hidden placeholder
    981                             #os.system('rm ' + yanked + '/.placeholder')
    982                     elif copying == 'scene' and menu[selected]=='SCENE:':
    983                         vumetermessage('Pasting scene, please wait...')
    984                         paste = filmfolder + filmname + '/' + 'scene' + str(scene-1).zfill(3) + '_yanked'
    985                         os.system('cp -r ' + yanked + ' ' + paste)
    986                         if moving == True:
    987                             os.system('rm -r ' + yanked+'/*')
    988                             #Remove hidden placeholder
    989                             os.system('rm ' + yanked + '/.placeholder')
    990                         try:
    991                             run_command('rsync -avr --update --progress --files-from='+yanked+'/.origin_videos --no-relative / ' +filmfolder+'.videos/')
    992                         except:
    993                             logger.info('no origin videos')
    994                     elif copying == 'film' and menu[selected]=='FILM:':
    995                         vumetermessage('Pasting film, please wait...')
    996                         paste = filmfolder+pastefilmname
    997                         os.system('cp -r ' + yanked + ' ' + paste)
    998                         try:
    999                             run_command('rsync -avr --update --progress --files-from='+yanked+'/.origin_videos --no-relative / ' +filmfolder+'.videos/')
   1000                         except:
   1001                             logger.info('no origin videos')
   1002                         #if moving == True:
   1003                             #os.system('rm -r ' + yanked)
   1004                             #Remove hidden placeholder
   1005                             #os.system('rm ' + yanked + '/.placeholder')
   1006                     add_organize(filmfolder, filmname)
   1007                     organize(filmfolder, filmname)
   1008                     organize(filmfolder, filmname)
   1009                     updatethumb = True
   1010                     scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take)
   1011                     if scene > scenes:
   1012                         scene = scenes
   1013                     if shot > shots:
   1014                         shot = shots
   1015                     yanked = ''
   1016                     copying = ''
   1017                     moving = False
   1018                     vumetermessage('Pasted!')
   1019                     time.sleep(1)
   1020                 #INSERT SHOT
   1021                 elif pressed == 'insert' and menu[selected] != 'SCENE:' and yanked == '':
   1022                     insertshot = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot-1).zfill(3) + '_insert'
   1023                     try:
   1024                         os.makedirs(insertshot)
   1025                         run_command('touch ' + insertshot + '/.placeholder')
   1026                     except:
   1027                         print('is there already prob')
   1028                     add_organize(filmfolder, filmname)
   1029                     scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take)
   1030                     #vumetermessage('Shot ' + str(shot) + ' inserted')
   1031                     updatethumb = True
   1032                     time.sleep(1)
   1033                 #INSERT SHOT TO LAST SHOT
   1034                 elif pressed == 'insert_shot':
   1035                     logger.info('inserting shot')
   1036                     shot = countshots(filmname, filmfolder, scene)
   1037                     shot=shot+1
   1038                     insertshot = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot-1).zfill(3) + '_insert'
   1039                     try:
   1040                         os.makedirs(insertshot)
   1041                         run_command('touch ' + insertshot + '/.placeholder')
   1042                     except:
   1043                         print('is there already prob')
   1044                     add_organize(filmfolder, filmname)
   1045                     scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take)
   1046                     #vumetermessage('Shot ' + str(shot) + ' inserted')
   1047                     updatethumb = True
   1048                 #INSERT TAKE
   1049                 elif pressed == 'insert_take':
   1050                     logger.info('inserting take')
   1051                     insertshot = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3)
   1052                     try:
   1053                         os.makedirs(insertshot)
   1054                         run_command('touch ' + insertshot + '/.placeholder')
   1055                     except:
   1056                         print('is there already prob')
   1057                     add_organize(filmfolder, filmname)
   1058                     scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take)
   1059                     #vumetermessage('Take ' + str(shot) + ' inserted')
   1060                     updatethumb = True
   1061                     #time.sleep(1)
   1062                 #INSERT SCENE
   1063                 elif pressed == 'insert' and menu[selected] == 'SCENE:':
   1064                     insertscene = filmfolder + filmname + '/' + 'scene' + str(scene-1).zfill(3) + '_insert'
   1065                     logger.info("inserting scene")
   1066                     try:
   1067                         insertplaceholder = insertscene+'/.placeholder'
   1068                         os.makedirs(insertplaceholder)
   1069                         run_command('touch ' + insertscene + '/.placeholder')
   1070                     except:
   1071                         print('something scetchy!')
   1072                     organize(filmfolder, filmname)
   1073                     add_organize(filmfolder, filmname)
   1074                     updatethumb = True
   1075                     scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take)
   1076                     vumetermessage('Scene ' + str(scene) + ' inserted')
   1077                     time.sleep(1)
   1078                 #NEW SCENE
   1079                 elif pressed == 'new_scene':
   1080                     scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take)
   1081                     vumetermessage('got new scene')
   1082                     scene=scenes+1
   1083                     shot=1
   1084                     take=1
   1085                 #DEVELOP
   1086                 elif event == 'D':
   1087                     try:
   1088                         stopinterface(camera)
   1089                         code.interact(local=locals())
   1090                         startinterface()
   1091                         camera = startcamera(lens,fps)
   1092                         loadfilmsetings = True
   1093                     except:
   1094                         writemessage('hmm.. couldnt enter developer mode')
   1095                 #TURN OFF SCREEN
   1096                 elif pressed == 'screen':
   1097                     if backlight == False:
   1098                         # requires wiringpi installed
   1099                         run_command('gpio -g pwm 19 1023')
   1100                         backlight = True
   1101                         camera.start_preview()
   1102                     elif backlight == True:
   1103                         run_command('gpio -g pwm 19 0')
   1104                         backlight = False
   1105                         camera.stop_preview()
   1106                 elif pressed == 'showmenu':
   1107                     if showmenu == 1:
   1108                         # requires wiringpi installed
   1109                         showmenu = 0
   1110                         showmenu_settings = False
   1111                     elif showmenu == 0:
   1112                         showmenu = 1
   1113                         showmenu_settings = True
   1114                 #DSK
   1115                 elif pressed == 'middle' and menu[selected] == 'DSK:':
   1116                     print("usb filmfolder")
   1117                     vumetermessage('checking usb mount...')
   1118                     filmfolderusb=usbfilmfolder(dsk)
   1119                     if filmfolderusb:
   1120                         filmfolder=filmfolderusb
   1121                         if dsk < 1:
   1122                             storagedrives.append(['usb0',filmfolder])
   1123                             dsk=1
   1124                             loadfilmsettings = True
   1125                         elif dsk > 0:
   1126                             storagedrives.append(['usb1',filmfolder])
   1127                             dsk=2
   1128                             loadfilmsettings = True
   1129                     else:
   1130                         #camera_model, camera_revision, filmfolder = getconfig(camera)
   1131                         if os.path.isdir(filmfolder) == False:
   1132                             os.makedirs(filmfolder)
   1133                     #COUNT DISKSPACE
   1134                     #sudo mkfs -t ext4 /dev/sdb1
   1135                     disk = os.statvfs(filmfolder)
   1136                     diskleft = str(int(disk.f_bavail * disk.f_frsize / 1024 / 1024 / 1024)) + 'Gb'
   1137                     #LOAD FILM AND SCENE SETTINGS
   1138                     try:
   1139                         filmname = getfilms(filmfolder)[0][0]
   1140                     except:
   1141                         filmname = 'onthefloor' 
   1142                     try:
   1143                         filmname_back = getfilms(filmfolder)[0][1]
   1144                     except:
   1145                         filmname_back = 'onthefloor' 
   1146                     if os.path.isdir(filmfolder) == False:
   1147                         os.makedirs(filmfolder)
   1148                     #loadfilmsettings = True
   1149                     updatethumb = True
   1150                     rendermenu = True
   1151                     #cleanupdisk(filmname,filmfolder)
   1152                     serverstate = gonzopiserver(False)
   1153                     serverstate = gonzopiserver(True)
   1154                 #REMOVE DELETE
   1155                 #dsk
   1156                 elif pressed == 'remove' and menu[selected] == 'DSK:':
   1157                     if dsk != 0:
   1158                         print("usb filmfolder")
   1159                         os.system('sudo pumount /media/usb'+str(dsk))
   1160                         os.system('sudo umount -l /media/usb'+str(dsk))
   1161                         try:
   1162                             del storagedrives[dsk]
   1163                         except:
   1164                             pass
   1165                         dsk=0
   1166                         time.sleep(1)
   1167                 #take
   1168                 elif pressed == 'remove' and menu[selected] == 'TAKE:':
   1169                     u = remove(filmfolder, filmname, scene, shot, take, 'take')
   1170                     if u != False:
   1171                         organize(filmfolder, filmname)
   1172                         scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take)
   1173                         take = counttakes(filmname, filmfolder, scene, shot)
   1174                         updatethumb = True
   1175                         rendermenu = True
   1176                         #loadfilmsettings = True
   1177                         time.sleep(0.2)
   1178                 #shot
   1179                 elif pressed == 'remove' and menu[selected] == 'SHOT:':
   1180                     u = remove(filmfolder, filmname, scene, shot, take, 'shot')
   1181                     if u != False:
   1182                         organize(filmfolder, filmname)
   1183                         scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take)
   1184                         take = counttakes(filmname, filmfolder, scene, shot)
   1185                         updatethumb = True
   1186                         rendermenu = True
   1187                         #loadfilmsettings = True
   1188                         time.sleep(0.2)
   1189                 #scene
   1190                 elif pressed == 'remove' and menu[selected] == 'SCENE:' or pressed=='remove_now':
   1191                     u = remove(filmfolder, filmname, scene, shot, take, 'scene')
   1192                     if u != False:
   1193                         organize(filmfolder, filmname)
   1194                         scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take)
   1195                         shot = countshots(filmname, filmfolder, scene)
   1196                         take = counttakes(filmname, filmfolder, scene, shot)
   1197                         updatethumb = True
   1198                         rendermenu = True
   1199                         #loadfilmsettings = True
   1200                         time.sleep(0.2)
   1201                 #film
   1202                 elif pressed == 'remove' and menu[selected] == 'FILM:':
   1203                     u = remove(filmfolder, filmname, scene, shot, take, 'film')
   1204                     if u != False:
   1205                         try:
   1206                             filmname = getfilms(filmfolder)[0][0]
   1207                         except:
   1208                             filmname = 'reel_001'
   1209                             if os.path.isdir(filmfolder+filmname) == False:
   1210                                 os.makedirs(filmfolder+filmname)
   1211                         else:
   1212                             scene, shot, take = countlast(filmname, filmfolder)
   1213                             loadfilmsettings = True
   1214                             updatethumb = True
   1215                             rendermenu = True
   1216                         time.sleep(0.2)
   1217                 elif pressed == 'remove' and menu[selected] == 'CAMERA:':
   1218                     if camselected != 0:
   1219                         cameras.pop(camselected)
   1220                         newselected=0
   1221                 elif pressed == 'remove' and menu[selected] == 'LIVE:':
   1222                     udp_ip = ''
   1223                     udp_port = ''
   1224                     vumetermessage("udp ip address removed")
   1225                     time.sleep(1)
   1226                 elif pressed == 'middle' and menu[selected] == 'Add CAMERA':
   1227                     if networks != []:
   1228                         newcamera = newcamera_ip(numbers_only, network)
   1229                         if newcamera != '':
   1230                             if newcamera not in cameras and newcamera not in networks:
   1231                                 sendtocamera(newcamera,port,'NEWFILM:'+filmname)
   1232                                 time.sleep(0.2)
   1233                                 sendtocamera(newcamera,port,'Q:'+str(quality))
   1234                                 time.sleep(0.2)
   1235                                 sendtocamera(newcamera,port,'SHOT:'+str(shot))
   1236                                 time.sleep(0.2)
   1237                                 sendtocamera(newcamera,port,'SCENE:'+str(scene))
   1238                                 time.sleep(0.2)
   1239                                 sendtocamera(newcamera,port,'MAKEPLACEHOLDERS:'+str(scenes)+'|'+str(shots))
   1240                                 cameras.append(newcamera)
   1241                                 rendermenu = True
   1242                                 #newselected=newselected+1
   1243                                 camera_recording=None
   1244                                 vumetermessage("New camera! "+newcamera)
   1245                     else:
   1246                         vumetermessage('No network!')
   1247                 elif 'SYNCIP:' in pressed:
   1248                     msg = pressed.split(':')[1]
   1249                     syncfolder=msg.split('|')[1]
   1250                     ip = msg.split('|')[0]
   1251                     synctime= ip.split(';')[1]
   1252                     ip = ip.split(';')[0]
   1253                     vumetermessage('SYNCING!')
   1254                     time.sleep(int(synctime))
   1255                     stopinterface(camera)
   1256                     video_files=shotfiles(filmfolder, filmname, scene)
   1257                     for i in video_files:
   1258                         compileshot(i,filmfolder,filmname)
   1259                         logger.info('SYNCING:'+i)
   1260                     organize(filmfolder, filmname)
   1261                     if not os.path.isfile('/home/pi/.ssh/id_rsa'):
   1262                         run_command('ssh-keygen')
   1263                     run_command('ssh-copy-id pi@'+ip)
   1264                     try:
   1265                         run_command('rsync -avr --update --progress --files-from='+filmfolder+filmname+'/scene'+str(scene).zfill(3)+'/.origin_videos --no-relative / pi@'+ip+':'+syncfolder+'.videos/')
   1266                     except:
   1267                         logger.info('no origin videos')
   1268                     #run_command('scp -r '+filmfolder+filmname+'/'+'scene'+str(scene).zfill(3)+' pi@'+ip+':'+filmfolder+filmname+'/')
   1269                     received=False
   1270                     while received != True:
   1271                         received = sendtocamera(ip,port,'SYNCDONE:'+cameras[0]+'|'+filmfolder)
   1272                         time.sleep(1)
   1273                         logger.info('sending syncdone again...')
   1274                     startinterface()
   1275                     camera = startcamera(lens,fps)
   1276                     loadfilmsettings = True
   1277                     rendermenu = True
   1278                 elif 'SYNCDONE:' in pressed:
   1279                     msg = pressed.split(':')[1]
   1280                     syncfolder=msg.split('|')[1]
   1281                     ip = msg.split('|')[0]
   1282                     sendtocamera(ip,port,'GOTSYNC:'+cameras[0]+'|'+filmfolder)
   1283                     synclist.append(ip)
   1284                     print(synclist)
   1285                     #time.sleep(3)
   1286                     if len(synclist) == len(cameras)-1:
   1287                         for ip in synclist:
   1288                             stopinterface(camera)
   1289                             logger.info('SYNCING from ip:'+ip)
   1290                             run_command('ssh-copy-id pi@'+ip)
   1291                             try:
   1292                                 run_command('rsync -avr --update --progress pi@'+ip+':'+syncfolder+filmname+'/scene'+str(scene).zfill(3)+'/ '+filmfolder+filmname+'/scene'+str(scene).zfill(3)+'/')
   1293                             except:
   1294                                 logger.info('no files')
   1295                             try:
   1296                                 with open(filmfolder+filmname+'/scene'+str(scene).zfill(3)+'/.origin_videos', 'r') as f:
   1297                                     if f:
   1298                                         scene_origin_files = [line.rstrip() for line in f]
   1299                             except:
   1300                                 logger.info('no files')
   1301                             #a=0
   1302                             #for i in cameras:
   1303                             #    if a != 0:
   1304                             #        run_command('rsync -avr --update --progress '+filmfolder+filmname+'/scene'+str(scene).zfill(3)+'/ pi@'+i+':'+filmfolder+filmname+'/scene'+str(scene).zfill(3)+'/')
   1305                             #        time.sleep(3)
   1306                             #    a=a+1
   1307                             startinterface()
   1308                             camera = startcamera(lens,fps)
   1309                             loadfilmsettings = True
   1310                             rendermenu = True
   1311                             vumetermessage('SYNC DONE!')
   1312                 elif 'RETAKE' in pressed:
   1313                     pressed="retake"
   1314                 elif 'RETAKE:' in pressed:
   1315                     shot=pressed.split(':')[1]
   1316                     shot=int(shot)
   1317                     retake = True
   1318                     pressed="retake_now"
   1319                 elif 'SCENE:' in pressed:
   1320                     scene=pressed.split(':')[1]
   1321                     scene=int(scene)
   1322                     shot = countshots(filmname, filmfolder, scene)
   1323                     take = counttakes(filmname, filmfolder, scene, shot)
   1324                 elif 'SHOT:' in pressed:
   1325                     shot=pressed.split(':')[1]
   1326                     shot=int(shot)
   1327                     take = counttakes(filmname, filmfolder, scene, shot)
   1328                 elif 'SHOTSCENES:' in pressed:
   1329                     sceneshot=pressed.split(':')[1]
   1330                     scene=sceneshot.split('|')[0].split('#')[0]
   1331                     scene=int(scene)
   1332                     shot=sceneshot.split('|')[1].split('#')[0]
   1333                     shot=int(shot)
   1334                     filmname = sceneshot.split('|')[1].split('#')[1]
   1335                     take = counttakes(filmname, filmfolder, scene, shot)
   1336                 elif 'REMOVE:' in pressed:
   1337                     scene=pressed.split(':')[1]
   1338                     scene=int(scene)
   1339                     shot = countshots(filmname, filmfolder, scene)
   1340                     take = counttakes(filmname, filmfolder, scene, shot)
   1341                     pressagain='remove_now'
   1342                 elif 'Q:' in pressed:
   1343                     qual=pressed.split(':')[1]
   1344                     quality=int(qual)
   1345                     vumetermessage('Quality changed to '+str(quality))
   1346                 elif 'CAMERA:' in pressed:
   1347                     newselected_maybe=int(pressed.split(':')[1])
   1348                     if len(cameras) > newselected_maybe:
   1349                         newselected=newselected_maybe
   1350                 elif 'MAKEPLACEHOLDERS:' in pressed:
   1351                     scenesshots=pressed.split(':')[1]
   1352                     pscene=int(scenesshots.split('|')[0])
   1353                     pshots=int(scenesshots.split('|')[1])
   1354                     #to not throw away empty shots, make placeholders
   1355                     for i in range(pshots):
   1356                         placeholders=filmfolder + filmname + '/scene' +  str(pscene).zfill(3) + '/shot' + str(i+1).zfill(3)
   1357                         try:
   1358                             os.makedirs(placeholders)
   1359                         except:
   1360                             logger.info('scene or shot already there!')
   1361                         run_command('touch ' + placeholders + '/.placeholder')
   1362                     scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take) 
   1363                     rendermenu = True
   1364                     vumetermessage('CONNECTED TO MASTER TARINA!')
   1365             #SHOWTARINACTRL
   1366             if recordwithports: 
   1367                 if pressed == 'middle' and menu[selected] == "New FILM":
   1368                     newfilmname = nameyourfilm(filmfolder, filmname, abc, True)
   1369                     a=0
   1370                     for i in cameras:
   1371                         if i not in camerasoff:
   1372                             sendtocamera(i,port,'NEWFILM:'+newfilmname)
   1373                         a=a+1
   1374                 elif pressed == "retake":
   1375                     a=0
   1376                     for i in cameras:
   1377                         if i not in camerasoff:
   1378                             if a == camselected:
   1379                                 if camera_recording == a:
   1380                                     if a==0:
   1381                                         if recording == True:
   1382                                             pressed="retake_now"
   1383                                             retake = True
   1384                                             camera_recording=None
   1385                                     else:
   1386                                         sendtocamera(i,port,'STOPRETAKE')
   1387                                     camera_recording=None
   1388                                 else:
   1389                                     if a==0:
   1390                                         if recording == False:
   1391                                             pressed="retake_now"
   1392                                             retake = True
   1393                                             camera_recording=0
   1394                                     else:
   1395                                         sendtocamera(i,port,'RETAKE:'+str(shot))
   1396                                         camera_recording=camselected
   1397                             else:
   1398                                 if a==0:
   1399                                     pressagain='insert_take'
   1400                                 else:
   1401                                     sendtocamera(i,port,'TAKEPLACEHOLDER')
   1402                             a=a+1
   1403                 elif pressed == "middle" and menu[selected]=="Sync SCENE":
   1404                     n=1
   1405                     for i in cameras:
   1406                         if i != cameras[0]:
   1407                             vumetermessage('Hold on syncing!')
   1408                             sendtocamera(i,port,'SYNCIP:'+cameras[0]+';'+str(n)+'|'+filmfolder)
   1409                             synclist=[]
   1410                             n=n+1
   1411                             #time.sleep(1)
   1412                 elif pressed == "middle" and menu[selected]=='New SCENE':
   1413                     a=0
   1414                     for i in cameras:
   1415                         if i not in camerasoff:
   1416                             if a==0:
   1417                                 pressagain="new_scene"
   1418                             else:
   1419                                 sendtocamera(i,port,'NEWSCENE')
   1420                         a=a+1
   1421                 elif pressed == "record" and camera_recording != None:
   1422                     if camera_recording == 0:
   1423                         if recording == True:
   1424                             pressed='record_now'
   1425                     else:
   1426                         sendtocamera(cameras[camera_recording],port,'STOP')
   1427                     camera_recording=None
   1428                 elif pressed == "record" and camera_recording == None:
   1429                     a=0
   1430                     for i in cameras:
   1431                         if i not in camerasoff:
   1432                             if a == camselected:
   1433                                 if camselected==0:
   1434                                     pressed='record_now'
   1435                                 else:
   1436                                     sendtocamera(i,port,'REC')
   1437                                 camera_recording=camselected
   1438                             else:
   1439                                 if a==0:
   1440                                     pressagain='insert_shot'
   1441                                 else:
   1442                                     sendtocamera(i,port,'PLACEHOLDER')
   1443                             a=a+1
   1444                 elif pressed == "remove" and menu[selected]=='SCENE:':
   1445                     a=0
   1446                     for i in cameras:
   1447                         if a!=0:
   1448                             sendtocamera(i,port,'REMOVE:'+str(scene))
   1449                         a=a+1
   1450                 elif pressed == "up" and menu[selected]=='SCENE:':
   1451                     a=0
   1452                     for i in cameras:
   1453                         if a!=0:
   1454                             sendtocamera(i,port,'SCENE:'+str(scene+1))
   1455                         a=a+1
   1456                 elif pressed == "down" and menu[selected]=='SCENE:':
   1457                     a=0
   1458                     for i in cameras:
   1459                         if a!=0:
   1460                             sendtocamera(i,port,'SCENE:'+str(scene-1))
   1461                         a=a+1
   1462                 elif pressed == "up" and menu[selected]=='SHOT:':
   1463                     a=0
   1464                     for i in cameras:
   1465                         if a!=0:
   1466                             sendtocamera(i,port,'SHOT:'+str(shot+1))
   1467                         a=a+1
   1468                 elif pressed == "down" and menu[selected]=='SHOT:':
   1469                     a=0
   1470                     for i in cameras:
   1471                         if a!=0:
   1472                             sendtocamera(i,port,'SHOT:'+str(shot-1))
   1473                         a=a+1
   1474                 elif pressed == "up" and menu[selected]=='Q:':
   1475                     a=0
   1476                     for i in cameras:
   1477                         if a!=0:
   1478                             sendtocamera(i,port,'Q:'+str(quality+1))
   1479                         a=a+1
   1480                 elif pressed == "down" and menu[selected]=='Q:':
   1481                     a=0
   1482                     for i in cameras:
   1483                         if a!=0:
   1484                             sendtocamera(i,port,'Q:'+str(quality-1))
   1485                         a=a+1
   1486                 elif event == "0":
   1487                     newselected = 0
   1488                 elif event == "1":
   1489                     if len(cameras) > 0:
   1490                         newselected = 0
   1491                 elif event == "2":
   1492                     if len(cameras) > 1:
   1493                         newselected = 1
   1494                 elif event == "3":
   1495                     if len(cameras) > 2:
   1496                         newselected = 2
   1497                 elif event == "4":
   1498                     if len(cameras) > 3:
   1499                         newselected = 3
   1500                 elif event == "5":
   1501                     if len(cameras) > 4:
   1502                         newselected = 4
   1503                 elif event == "6":
   1504                     if len(cameras) > 5:
   1505                         newselected = 5
   1506                 elif event == "7":
   1507                     if len(cameras) > 6:
   1508                         newselected = 6
   1509                 elif event == "8":
   1510                     if len(cameras) > 7:
   1511                         newselected = 7
   1512                 elif event == "9":
   1513                     if len(cameras) > 8:
   1514                         newselected = 8
   1515                 elif event == "-":
   1516                     if cameras[camselected] not in camerasoff:
   1517                         camerasoff.append(cameras[camselected])
   1518                 elif event == "+":
   1519                     if cameras[camselected] in camerasoff:
   1520                         camerasoff.remove(cameras[camselected])
   1521                 elif camselected != newselected:
   1522                     if camera_recording != None:
   1523                         #change camera
   1524                         a=0
   1525                         for c in cameras:
   1526                             if c not in camerasoff:
   1527                                 if a == camselected:
   1528                                     if a == 0:
   1529                                         #pressed='record_now'
   1530                                         #pressagain='insert_shot'
   1531                                         delayedstop=c
   1532                                     else:
   1533                                         #sendtocamera(c,port,'STOP')
   1534                                         #time.sleep(sleep)
   1535                                         #sendtocamera(c,port,'PLACEHOLDER')
   1536                                         delayedstop=c
   1537                                 elif a == newselected:
   1538                                     if a == 0:
   1539                                         if recording == False:
   1540                                             pressed='record_now'
   1541                                     else:
   1542                                         sendtocamera(c,port,'REC')
   1543                                     camera_recording=newselected
   1544                                 else:
   1545                                     if a == 0:
   1546                                         pressagain='insert_shot'
   1547                                     else:
   1548                                         sendtocamera(c,port,'PLACEHOLDER')
   1549                                     #time.sleep(2)
   1550                                 a=a+1
   1551                         if delayedstop:
   1552                             time.sleep(0.05)
   1553                             if delayedstop==cameras[0]:
   1554                                 if recording == True:
   1555                                     pressed='record_now'
   1556                                 pressagain='insert_shot'
   1557                             else:
   1558                                 sendtocamera(delayedstop,port,'STOP')
   1559                                 time.sleep(sleep)
   1560                                 sendtocamera(delayedstop,port,'PLACEHOLDER')
   1561                     camselected=newselected
   1562                     rendermenu = True
   1563                     #vumetermessage('filming with '+camera_model +' ip:'+ network + ' '+camerasconnected+' camselected:'+str(camselected))
   1564                     if len(cameras) > 0:
   1565                         if camera_recording:
   1566                             vumetermessage('filming with '+camera_model +' ip:'+ cameras[camselected] + ' '+camerasconnected+' camselected:'+str(camselected+1)+' rec:'+str(camera_recording+1))
   1567                         else:
   1568                             vumetermessage('filming with '+camera_model +' ip:'+ cameras[camselected] + ' '+camerasconnected+' camselected:'+str(camselected+1)+' rec:'+str(camera_recording))
   1569                     else:
   1570                         vumetermessage('filming with '+camera_model +' ip:'+ network)
   1571 
   1572             #RECORD AND PAUSE
   1573             if beepcountdown > 1:
   1574                 if time.time() - lastbeep  > 1:
   1575                     beep(bus)
   1576                     beepcountdown -= 1
   1577                     lastbeep = time.time()
   1578                     logger.info('beepcountdown: ' + str(beepcountdown))
   1579                     vumetermessage('Filming in ' + str(beepcountdown) + ' seconds, press record again to cancel       ')
   1580             elif beepcountdown > 0:
   1581                 if time.time() - float(lastbeep) > 0.1:
   1582                     beep(bus)
   1583                     vumetermessage('Get ready!!')
   1584                 if time.time() - lastbeep > 1:
   1585                     longbeep(bus)
   1586                     beepcountdown = 0
   1587                     if recordwithports == True:
   1588                         if retake == True:
   1589                             pressed = 'retake_now'
   1590                             retake = False
   1591                         else:
   1592                             pressed = 'record_now'
   1593                     else:
   1594                         pressed = 'retake_now'
   1595                     print('exhausted from all beepings')
   1596             elif 'CAMERA:' in pressed:
   1597                 newselected_maybe=int(pressed.split(':')[1])
   1598                 if len(cameras) > newselected_maybe:
   1599                     newselected=newselected_maybe
   1600             if pressed == 'record' and recordwithports==False or pressed == 'record_now' or pressed == 'retake_now' or pressed == 'retake' and recordwithports==False or reclength != 0 and t > reclength:
   1601                 overlay = removeimage(camera, overlay)
   1602                 foldername = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) + '/'
   1603                 filename = 'take' + str(take).zfill(3)
   1604                 recordable = not os.path.isfile(foldername + filename + '.mp4') and not os.path.isfile(foldername + filename + '.h264')
   1605                 if recording == False and recordable == True or recording == False and pressed == 'record_now' or recording == False and pressed == 'retake_now':
   1606                     #camera_recording=0 
   1607                     scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take) 
   1608                     if pressed == "record":
   1609                         shot = shots+1
   1610                         take = 1
   1611                         takes=1
   1612                         shots=shots+1
   1613                     elif pressed == "retake" and takes > 0:
   1614                         takes = counttakes(filmname, filmfolder, scene, shot)
   1615                         take = takes+1
   1616                         takes=take
   1617                     elif pressed == "retake" and takes == 0:
   1618                         if shot > 1:
   1619                             shot = shot - 1
   1620                         takes = counttakes(filmname, filmfolder, scene, shot)
   1621                         take = takes+1
   1622                         takes=take
   1623                         #take=1
   1624                         #takes=1
   1625                     elif pressed == 'record_now':
   1626                         shot=shots+1
   1627                         take=1
   1628                         takes=1
   1629                         shots=shots+1
   1630                     elif pressed == 'retake_now':
   1631                         takes = counttakes(filmname, filmfolder, scene, shot)
   1632                         take = takes + 1
   1633                         takes=take
   1634                     foldername = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) + '/'
   1635                     filename = 'take' + str(take).zfill(3)
   1636                     if beeps > 0 and beeping == False:
   1637                         beeping = True
   1638                         beepcountdown = beeps
   1639                     elif beepcountdown == 0:
   1640                         beeping = False
   1641                         if os.path.isdir(foldername) == False:
   1642                             os.makedirs(foldername)
   1643                         if cammode == 'film':
   1644                             #if recandslide here
   1645                             if slidecommander:
   1646                                 send_serial_port(slidecommander,';'+str(slide))
   1647                             videos_totalt = db.query("SELECT COUNT(*) AS videos FROM videos")[0]
   1648                             tot = int(videos_totalt.videos)
   1649                             video_origins=datetime.datetime.now().strftime('%Y%d%m')+'_'+os.urandom(8).hex()+'_'+str(tot).zfill(5)
   1650                             try:
   1651                                 db.insert('videos', tid=datetime.datetime.now(), filename=filmfolder+'.videos/'+video_origins+'.mp4', foldername=foldername, filmname=filmname, scene=scene, shot=shot, take=take, audiolength=0, videolength=0)
   1652                             except:
   1653                                 db=correct_database(filmname,filmfolder,db)
   1654                                 db.insert('videos', tid=datetime.datetime.now(), filename=filmfolder+'.videos/'+video_origins+'.mp4', foldername=foldername, filmname=filmname, scene=scene, shot=shot, take=take, audiolength=0, videolength=0)
   1655                             os.system(gonzopifolder + '/alsa-utils-1.1.3/aplay/arecord -D hw:' + str(plughw) + ' -f '+soundformat+' -c ' + str(channels) + ' -r '+soundrate+' -vv '+filmfolder+ '.videos/'+video_origins+'.wav &')
   1656                             sound_start = time.time()
   1657                             if onlysound != True:
   1658                                 #camera.start_recording(filmfolder+ '.videos/'+video_origins+'.h264', format='h264', bitrate = bitrate, level=profilelevel, quality=quality, intra_period=1)
   1659                                 rec_process, camera=startrecording(camera, filmfolder+ '.videos/'+video_origins+'.mp4',bitrate, quality, profilelevel, reclength)
   1660                                 starttime = time.time()
   1661                                 soundlag=sound_start-starttime
   1662                             os.system('ln -sfr '+filmfolder+'.videos/'+video_origins+'.mp4 '+foldername+filename+'.mp4')
   1663                             os.system('ln -sfr '+filmfolder+'.videos/'+video_origins+'.wav '+foldername+filename+'.wav')
   1664                             recording = True
   1665                             showmenu = 0
   1666                         if cammode == 'picture':
   1667                             #picdate=datetime.datetime.now().strftime('%Y%d%m')
   1668                             picture = foldername +'picture' + str(take).zfill(3) + '.jpeg'
   1669                             print('taking picture')
   1670                             camera.capture(picture,format="jpeg",use_video_port=True) 
   1671                             run_command('touch ' + foldername + 'take' + str(take).zfill(3) + '.mp4')
   1672                             basewidth = 800
   1673                             img = Image.open(picture)
   1674                             wpercent = (basewidth/float(img.size[0]))
   1675                             hsize = int((float(img.size[1])*float(wpercent)))
   1676                             img = img.resize((basewidth,hsize), Image.ANTIALIAS)
   1677                             img.save(foldername+'take'+str(take).zfill(3) + '.jpeg')
   1678                             basewidth = 80
   1679                             wpercent = (basewidth/float(img.size[0]))
   1680                             hsize = int((float(img.size[1])*float(wpercent)))
   1681                             img = img.resize((basewidth,hsize), Image.ANTIALIAS)
   1682                             img.save(foldername+'take'+str(take).zfill(3) + '_thumb.jpeg')
   1683                             vumetermessage('Great Pic taken!!')
   1684                             updatethumb = True
   1685                     elif beepcountdown > 0 and beeping == True:
   1686                         beeping = False
   1687                         beepcountdown = 0
   1688                         vumetermessage('Filming was canceled!!')
   1689                 elif recording == True and float(time.time() - starttime) > 0.2:
   1690                     #print(term.clear+term.home)
   1691                     disk = os.statvfs(filmfolder)
   1692                     diskleft = str(int(disk.f_bavail * disk.f_frsize / 1024 / 1024 / 1024)) + 'Gb'
   1693                     recording = False
   1694                     if showmenu_settings == True:
   1695                         showmenu = 1
   1696                     if onlysound != True:
   1697                         #camera.stop_recording()
   1698                         recprocess, camera = stoprecording(camera, rec_process)
   1699                     os.system('pkill arecord')
   1700                     try:
   1701                         db.update('videos', where='filename="'+filmfolder+'.videos/'+video_origins+'.mp4"', soundlag=soundlag, videolength=float(time.time() - starttime), faststart=False)
   1702                     except:
   1703                         db = correct_database(filmname,filmfolder,db)
   1704                         db.update('videos', where='filename="'+filmfolder+'.videos/'+video_origins+'.mp4"', soundlag=soundlag, videolength=float(time.time() - starttime), faststart=False)
   1705                     with open(foldername+filename+'.nofaststart', 'w') as f:
   1706                         f.write(str(int((time.time() - starttime)*1000)))
   1707                     #time.sleep(0.005) #get audio at least 0.1 longer
   1708                     #camera.capture(foldername + filename + '.jpeg', resize=(800,341))
   1709                     #if slidecommander:
   1710                     #send_serial_port(slidecommander,'<')
   1711                     if onlysound != True:
   1712                         try:
   1713                             #camera.capture(foldername + filename + '.jpeg', resize=(800,340), use_video_port=True)
   1714                             if film_reso == '1920x1080':
   1715                                 camera.capture(foldername + filename + '.jpeg', resize=(800,450), use_video_port=True)
   1716                             elif film_reso == '1920x816':
   1717                                 camera.capture(foldername + filename + '.jpeg', resize=(800,340), use_video_port=True)
   1718                             basewidth = 80
   1719                             img = Image.open(foldername + filename + '.jpeg')
   1720                             wpercent = (basewidth/float(img.size[0]))
   1721                             hsize = int((float(img.size[1])*float(wpercent)))
   1722                             img = img.resize((basewidth,hsize), Image.ANTIALIAS)
   1723                             img.save(foldername+filename + '_thumb.jpeg')
   1724                             updatethumb = True
   1725                         except:
   1726                             logger.warning('something wrong with camera jpeg capture')
   1727                     #delayerr = audiotrim(foldername,filename)
   1728                     onlysound = False
   1729                     if beeps > 0:
   1730                         if bus:
   1731                             buzz(300)
   1732                         else:
   1733                             run_command('aplay -D plughw:' + str(plughw) + ' '+ gonzopifolder + '/extras/beep.wav')
   1734                     if int(round(fps)) != int(film_fps):
   1735                         compileshot(foldername + filename,filmfolder,filmname)
   1736                     #os.system('cp /dev/shm/' + filename + '.wav ' + foldername + filename + '.wav')
   1737                     if beeps > 0:
   1738                         if bus:
   1739                             buzz(150)
   1740                         else:
   1741                             run_command('aplay -D plughw:' + str(plughw) + ' '+ gonzopifolder + '/extras/beep.wav')
   1742                     t = 0
   1743                     rectime = ''
   1744                     vumetermessage('Gonzo Pi v.' + gonzopiversion[:-1] + ' ' + gonzopivername[:-1])
   1745                     scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take)
   1746                     if shot == shots and pressed == 'record':
   1747                         shot=shots+1
   1748                         take=1
   1749                         takes=0
   1750                     elif pressed == 'retake':
   1751                         take=takes+1
   1752                         #updatethumb = True
   1753                         #camera_recording=0
   1754                 #if not in last shot or take then go to it
   1755                 if pressed == 'record' and recordable == False:
   1756                     scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take)
   1757                     shot=shots+1
   1758                     take=1
   1759                     takes=0
   1760                     #take = takes
   1761                     #takes = counttakes(filmname, filmfolder, scene, shot)
   1762                 if pressed == 'retake' and recordable == False:
   1763                     #scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take)
   1764                     #take = takes
   1765                     #takes = counttakes(filmname, filmfolder, scene, shot)
   1766                     scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take)
   1767                     take = takes + 1
   1768             #ENTER (auto shutter, iso, awb on/off)
   1769             elif pressed == 'middle' and menu[selected] == 'SHUTTER:':
   1770                 if camera.shutter_speed == 0:
   1771                     camera.shutter_speed = camera.exposure_speed
   1772                 else:
   1773                     camera.shutter_speed = 0
   1774             elif pressed == 'middle' and menu[selected] == 'ISO:':
   1775                 if camera.iso == 0:
   1776                     camera.iso = 100
   1777                 else:
   1778                     camera.iso = 0
   1779             elif pressed == 'middle' and menu[selected] == 'RED:':
   1780                 if camera.awb_mode == 'auto':
   1781                     camera.awb_gains = (float(camera.awb_gains[0]), float(camera.awb_gains[1]))
   1782                     camera.awb_mode = 'off'
   1783                 else:
   1784                     camera.awb_mode = 'auto'
   1785             elif pressed == 'middle' and menu[selected] == 'BLUE:':
   1786                 if camera.awb_mode == 'auto':
   1787                     camera.awb_gains = (float(camera.awb_gains[0]), float(camera.awb_gains[1]))
   1788                     camera.awb_mode = 'off'
   1789                 else:
   1790                     camera.awb_mode = 'auto'
   1791             elif pressed == 'middle' and menu[selected] == 'BEEP:':
   1792                 beeps = 0
   1793             elif pressed == 'middle' and menu[selected] == 'LENGTH:':
   1794                 reclength = 0
   1795             elif pressed == 'middle' and menu[selected] == 'LIVE:':
   1796                 if stream == '':
   1797                     if udp_ip == '':
   1798                         udp_ip, udp_port = newudp_ip(numbers_only, network)
   1799                         rendermenu = True
   1800                     stream = startstream(camera, stream, plughw, channels,network,udp_ip,udp_port)
   1801                     if stream == '':
   1802                         vumetermessage('something wrong with streaming')
   1803                     else:
   1804                         live = 'yes'
   1805                 else:
   1806                     stream = stopstream(camera, stream)
   1807                     live = 'no'
   1808             elif pressed == 'middle' and menu[selected] == 'SLIDE:':
   1809                 slide_menu(slidecommander)
   1810                 rendermenu = True
   1811             elif pressed == 'middle' and menu[selected] == 'BRIGHT:':
   1812                 camera.brightness = 50
   1813             elif pressed == 'middle' and menu[selected] == 'CONT:':
   1814                 if yanked == '':
   1815                     camera.contrast = 0
   1816                 else:
   1817                     videos_totalt = db.query("SELECT COUNT(*) AS videos FROM videos")[0]
   1818                     tot = int(videos_totalt.videos)
   1819                     video_origins=filmfolder+'.videos/'+datetime.datetime.now().strftime('%Y%d%m')+'_'+os.urandom(8).hex()+'_'+str(tot).zfill(5)
   1820                     newtake = nexttakefilename(filmname, filmfolder, scene, shot)
   1821                     #why didnt i do this earlier cuz copy paste & that works too
   1822                     vumetermessage('applying effect...')
   1823                     run_command('ffmpeg -i '+yanked+'.mp4 -vf "eq=contrast='+str(1.0+(int(camera.contrast)/100))+'" -c:v copy -c:a copy -y '+encoder()+video_origins+'.mp4')
   1824                     os.system('ln -sfr '+filmfolder+'.videos/'+video_origins+'.mp4 '+newtake+'.mp4')
   1825                     vumetermessage('done!')
   1826                     yanked=''
   1827                     scenes, shots, takes = countlast(filmname, filmfolder)
   1828                     take=takes
   1829             elif pressed == 'middle' and menu[selected] == 'SAT:':
   1830                 camera.saturation = 0
   1831             elif pressed == 'middle' and menu[selected] == 'MIC:':
   1832                 miclevel  = 70
   1833             elif pressed == 'middle' and menu[selected] == 'PHONES:':
   1834                 headphoneslevel = 70
   1835             elif pressed == 'middle' and menu[selected] == 'SRV:':
   1836                 if showgonzopictrl == False:
   1837                     menu=gonzopictrlmenu
   1838                     #selected=0
   1839                     showgonzopictrl = True
   1840                 else:
   1841                     menu=standardmenu
   1842                     showgonzopictrl=False
   1843             elif pressed == 'middle' and menu[selected] == 'Q:':
   1844                 bitrate = get_bitrate(numbers_only, bitrate)
   1845                 rendermenu = True
   1846             elif pressed == 'middle' and menu[selected] == 'VFX:':
   1847                 if effects[effectselected] == 'colorpoint':
   1848                     vfx_colorpoint()
   1849                 if effects[effectselected] == 'solarize':
   1850                     vfx_solarize()
   1851 
   1852             #UP
   1853             elif pressed == 'up':
   1854                 if menu[selected] == 'FILM:':
   1855                     camera, newfilmname = loadfilm(filmname, filmfolder, camera, overlay)
   1856                     allfilm = getfilms(filmfolder)
   1857                     filmname_exist=False
   1858                     for i in allfilm:
   1859                         if i[0] == newfilmname:
   1860                             filmname_exist=True
   1861                     if filmname != newfilmname and filmname_exist==False:
   1862                         filmname = newfilmname
   1863                         os.makedirs(filmfolder + filmname)
   1864                         vumetermessage('Good luck with your film ' + filmname + '!')
   1865                         #make a filmhash
   1866                         print('making filmhash...')
   1867                         filmhash = shortuuid.uuid()
   1868                         with open(filmfolder + filmname + '/.filmhash', 'w') as f:
   1869                             f.write(filmhash)
   1870                         updatethumb = True
   1871                         rendermenu = True
   1872                         scene = 1
   1873                         shot = 1
   1874                         take = 1
   1875                         #selectedaction = 0
   1876                         newfilmname = ''
   1877                     else:
   1878                         filmname = newfilmname
   1879                         newfilmname = ''
   1880                         vumetermessage('film already exist!')
   1881                         logger.info('film already exist!')
   1882                         print(term.clear)
   1883                         updatethumb = True
   1884                         rendermenu = True
   1885                         loadfilmsettings = True
   1886                 elif menu[selected] == 'BRIGHT:':
   1887                     camera.brightness = min(camera.brightness + 1, 99)
   1888                 elif menu[selected] == 'CONT:':
   1889                     camera.contrast = min(camera.contrast + 1, 99)
   1890                 elif menu[selected] == 'SAT:':
   1891                     camera.saturation = min(camera.saturation + 1, 99)
   1892                 elif menu[selected] == 'VFX:':
   1893                     if effectselected < len(effects) - 1:
   1894                         effectselected += 1
   1895                         camera.image_effect = effects[effectselected]
   1896                     else:
   1897                         effectselected = 0
   1898                         camera.image_effect = effects[effectselected]
   1899                 elif menu[selected] == 'BLEND:':
   1900                     if blendselect < len(blendmodes) - 1:
   1901                         blendselect += 1
   1902                     else:
   1903                         blendselect=0
   1904                 elif menu[selected] == 'SHUTTER:':
   1905                     if camera.shutter_speed == 0:
   1906                         camera.shutter_speed = camera.exposure_speed
   1907                     if camera.shutter_speed < 5000:
   1908                         camera.shutter_speed = min(camera.shutter_speed + 50, 50000)
   1909                     else:
   1910                         camera.shutter_speed = min(camera.shutter_speed + 200, 50000)
   1911                 elif menu[selected] == 'ISO:':
   1912                     camera.iso = min(camera.iso + 100, 1600)
   1913                 elif menu[selected] == 'BEEP:':
   1914                     beeps = beeps + 1
   1915                 elif menu[selected] == 'FLIP:':
   1916                     if flip == 'yes':
   1917                         camera.hflip = False
   1918                         camera.vflip = False
   1919                         flip = 'no'
   1920                         time.sleep(0.2)
   1921                     else:
   1922                         camera.hflip = True
   1923                         camera.vflip = True
   1924                         flip = 'yes'
   1925                         time.sleep(0.2)
   1926                 elif menu[selected] == 'HDMI:':
   1927                     if hdmi == 'on':
   1928                         hdmi = 'off'
   1929                         os.system("sudo sed -i '/\[edid=Ras-LCD Panel\]/c\#\[edid=Ras-LCD Panel\]' /boot/config.txt")
   1930                         os.system("sudo sed -i '/\#\[edid=HDMI-A-2\]/c\[edid=HDMI-A-2\]' /boot/config.txt")
   1931                         time.sleep(0.2)
   1932                     else:
   1933                         hdmi = 'on'
   1934                         os.system("sudo sed -i '/\#\[edid=Ras-LCD Panel\]/c\[edid=Ras-LCD Panel\]' /boot/config.txt")
   1935                         os.system("sudo sed -i '/\[edid=HDMI-A-2\]/c\#\[edid=HDMI-A-2\]' /boot/config.txt")
   1936                         time.sleep(0.2)
   1937                 elif menu[selected] == 'LENGTH:':
   1938                     if reclength < 1:
   1939                         reclength = reclength + 0.2
   1940                     else:
   1941                         reclength = int(reclength + 1)
   1942                     time.sleep(0.1)
   1943                 elif menu[selected] == 'MIC:':
   1944                     if miclevel < 100:
   1945                         miclevel = miclevel + 2
   1946                         run_command('amixer -c 0 sset Mic ' + str(miclevel) + '% unmute')
   1947                 elif menu[selected] == 'PHONES:':
   1948                     if headphoneslevel < 100:
   1949                         headphoneslevel = headphoneslevel + 2
   1950                         run_command('amixer -c 0 sset Speaker ' + str(headphoneslevel) + '%')
   1951                 elif menu[selected] == 'SCENE:' and recording == False:
   1952                     if scene <= scenes:
   1953                         scene += 1
   1954                         #shot = countshots(filmname, filmfolder, scene)
   1955                         shot = 1
   1956                     else:
   1957                         scene = 1
   1958                     take = counttakes(filmname, filmfolder, scene, shot)
   1959                     #scene, shots, takes = browse2(filmname, filmfolder, scene, shot, take, 0, 1)
   1960                     #shot = 1
   1961                 elif menu[selected] == 'SHOT:' and recording == False:
   1962                     if shot <= shots:
   1963                         shot += 1
   1964                     else:
   1965                         shot=1
   1966                     take = counttakes(filmname, filmfolder, scene, shot)
   1967                     #scene, shot, take = browse2(filmname, filmfolder, scene, shot, take, 1, 1)
   1968                     #takes = take
   1969                 elif menu[selected] == 'TAKE:' and recording == False:
   1970                     if take <= takes:
   1971                         take += 1
   1972                     else:
   1973                         take=0
   1974                     #scene, shot, take = browse2(filmname, filmfolder, scene, shot, take, 2, 1)
   1975                 elif menu[selected] == 'RED:':
   1976                     camera.awb_mode = 'off'
   1977                     if float(camera.awb_gains[0]) < 7.98:
   1978                         camera.awb_gains = (round(camera.awb_gains[0],2) + 0.02, round(camera.awb_gains[1],2))
   1979                 elif menu[selected] == 'BLUE:':
   1980                     camera.awb_mode = 'off'
   1981                     if float(camera.awb_gains[1]) < 7.98:
   1982                         camera.awb_gains = (round(camera.awb_gains[0],2), round(camera.awb_gains[1],2) + 0.02)
   1983                 elif menu[selected] == 'SRV:':
   1984                     if serverstate == 'on':
   1985                         try:
   1986                             os.makedirs(gonzopifolder+'/srv/sessions')
   1987                             os.system('chown www-data '+gonzopifolder+'/srv/sessions')
   1988                         except:
   1989                             print('srv folder exist')
   1990                         serverstate = 'false'
   1991                         serverstate = gonzopiserver(False)
   1992                     elif serverstate == 'off':
   1993                         serverstate = 'on'
   1994                         serverstate = gonzopiserver(True)
   1995                 elif menu[selected] == 'WIFI:':
   1996                     if wifistate == 'on':
   1997                         run_command('sudo iwconfig wlan0 txpower off')
   1998                         wifistate = 'off'
   1999                     elif wifistate == 'off':
   2000                         run_command('sudo iwconfig wlan0 txpower auto')
   2001                         wifistate = 'on'
   2002                 elif menu[selected] == 'SEARCH:':
   2003                     if searchforcameras == 'on':
   2004                         searchforcameras = 'off'
   2005                     elif searchforcameras == 'off':
   2006                         searchforcameras = 'on'
   2007                 elif menu[selected] == 'MODE:':
   2008                     if cammode == 'film':
   2009                         cammode = 'picture'
   2010                         vumetermessage('changing to picture mode')
   2011                     elif cammode == 'picture':
   2012                         cammode = 'film'
   2013                         vumetermessage('changing to film mode')
   2014                     camera.stop_preview()
   2015                     camera.close()
   2016                     camera = startcamera(lens,fps)
   2017                     loadfilmsettings = True
   2018                     flushbutton()
   2019                 elif menu[selected] == 'LENS:':
   2020                     s = 0
   2021                     for a in lenses:
   2022                         if a == lens:
   2023                             selectlens = s
   2024                         s += 1
   2025                     if selectlens < len(lenses) - 1:
   2026                         selectlens += 1
   2027                     lens = os.listdir('lenses/')[selectlens]
   2028                     #npzfile = np.load('lenses/' + lens)
   2029                     #lensshade = npzfile['lens_shading_table']
   2030                     table = read_table('lenses/' + lens)
   2031                     camera.lens_shading_table = table
   2032                 elif menu[selected] == 'COMP:':
   2033                     if comp < 1:
   2034                         comp += 1
   2035                 elif menu[selected] == 'HW:':
   2036                     if plughw < len(getaudiocards())-1:
   2037                         plughw += 1
   2038                     vumetermessage(getaudiocards()[plughw])
   2039                 elif menu[selected] == 'CH:':
   2040                     if channels == 1:
   2041                         channels = 2
   2042                 elif menu[selected] == 'FPS:':
   2043                     if fps_selected < len(fps_selection)-1:
   2044                         fps_selected+=1
   2045                         fps=fps_selection[fps_selected]
   2046                         camera.framerate = fps
   2047                 elif menu[selected] == 'Q:':
   2048                     if quality < 39:
   2049                         quality += 1
   2050                 elif menu[selected] == 'CAMERA:':
   2051                     if camselected < len(cameras)-1:
   2052                         newselected = camselected+1
   2053                         logger.info('camera selected:'+str(camselected))
   2054                 elif menu[selected] == 'SLIDE:':
   2055                     if slidecommander:
   2056                         #send_serial_port(slidecommander,'>')
   2057                         slide += 1
   2058                 elif menu[selected] == 'DSK:':
   2059                     if dsk+1 < len(storagedrives):
   2060                         dsk += 1
   2061                         filmfolder = storagedrives[dsk][1]
   2062                         loadfilmsettings = True
   2063                         #COUNT DISKSPACE
   2064                         disk = os.statvfs(filmfolder)
   2065                         diskleft = str(int(disk.f_bavail * disk.f_frsize / 1024 / 1024 / 1024)) + 'Gb'
   2066                         #LOAD FILM AND SCENE SETTINGS
   2067                         try:
   2068                             filmname = getfilms(filmfolder)[0][0]
   2069                         except:
   2070                             filmname = filmname 
   2071                         try:
   2072                             filmname_back = getfilms(filmfolder)[0][1]
   2073                         except:
   2074                             filmname_back = filmname
   2075                         if serverstate == 'on':
   2076                             gonzopiserver(False)
   2077                             gonzopiserver(True)
   2078                 elif menu[selected] == 'MUX:':
   2079                     if muxing == False:
   2080                         muxing=True
   2081                         mux='yes'
   2082                     else:
   2083                         muxing=False
   2084                         mux='no'
   2085 
   2086             #LEFT
   2087             elif pressed == 'left':
   2088                 if selected > 0:
   2089                     selected = selected - 1
   2090                 else:
   2091                     selected = len(menu) - 1
   2092                 if selected == 5:
   2093                     selected = 4
   2094             #DOWN
   2095             elif pressed == 'down':
   2096                 if menu[selected] == 'FILM:':
   2097                     camera, newfilmname = loadfilm(filmname, filmfolder, camera, overlay)
   2098                     allfilm = getfilms(filmfolder)
   2099                     filmname_exist=False
   2100                     for i in allfilm:
   2101                         if i[0] == newfilmname:
   2102                             filmname_exist=True
   2103                     if filmname != newfilmname and filmname_exist==False:
   2104                         filmname = newfilmname
   2105                         os.makedirs(filmfolder + filmname)
   2106                         vumetermessage('Good luck with your film ' + filmname + '!')
   2107                         #make a filmhash
   2108                         print('making filmhash...')
   2109                         filmhash = shortuuid.uuid()
   2110                         with open(filmfolder + filmname + '/.filmhash', 'w') as f:
   2111                             f.write(filmhash)
   2112                         updatethumb = True
   2113                         rendermenu = True
   2114                         scene = 1
   2115                         shot = 1
   2116                         take = 1
   2117                         #selectedaction = 0
   2118                         newfilmname = ''
   2119                     else:
   2120                         filmname = newfilmname
   2121                         newfilmname = ''
   2122                         vumetermessage('film already exist!')
   2123                         logger.info('film already exist!')
   2124                         print(term.clear)
   2125                         updatethumb = True
   2126                         rendermenu = True
   2127                         loadfilmsettings = True
   2128                 elif menu[selected] == 'BRIGHT:':
   2129                     camera.brightness = max(camera.brightness - 1, 0)
   2130                 elif menu[selected] == 'CONT:':
   2131                     camera.contrast = max(camera.contrast - 1, -100)
   2132                 elif menu[selected] == 'SAT:':
   2133                     camera.saturation = max(camera.saturation - 1, -100)
   2134                 elif menu[selected] == 'VFX:':
   2135                     if effectselected > 0:
   2136                         effectselected -= 1
   2137                         camera.image_effect = effects[effectselected]
   2138                     else:
   2139                         effectselected = len(effects)-1
   2140                         camera.image_effect = effects[effectselected]
   2141                 elif menu[selected] == 'BLEND:':
   2142                     if blendselect > 0:
   2143                         blendselect -= 1
   2144                     else:
   2145                         blendselect = len(blendmodes)-1
   2146                 elif menu[selected] == 'SHUTTER:':
   2147                     if camera.shutter_speed == 0:
   2148                         camera.shutter_speed = camera.exposure_speed
   2149                     if camera.shutter_speed < 5000:
   2150                         camera.shutter_speed = max(camera.shutter_speed - 50, 20)
   2151                     else:
   2152                         camera.shutter_speed = max(camera.shutter_speed - 200, 200)
   2153                 elif menu[selected] == 'ISO:':
   2154                     camera.iso = max(camera.iso - 100, 100)
   2155                 elif menu[selected] == 'BEEP:':
   2156                     if beeps > 0:
   2157                         beeps = beeps - 1
   2158                 elif menu[selected] == 'HDMI:':
   2159                     if hdmi == 'on':
   2160                         hdmi = 'off'
   2161                         os.system("sudo sed -i '/\[edid=Ras-LCD Panel\]/c\#\[edid=Ras-LCD Panel\]' /boot/config.txt")
   2162                         os.system("sudo sed -i '/\#\[edid=HDMI-A-2\]/c\[edid=HDMI-A-2\]' /boot/config.txt")
   2163                         time.sleep(0.2)
   2164                     else:
   2165                         hdmi = 'on'
   2166                         os.system("sudo sed -i '/\#\[edid=Ras-LCD Panel\]/c\[edid=Ras-LCD Panel\]' /boot/config.txt")
   2167                         os.system("sudo sed -i '/\[edid=HDMI-A-2\]/c\#\[edid=HDMI-A-2\]' /boot/config.txt")
   2168                         time.sleep(0.2)
   2169                 elif menu[selected] == 'FLIP:':
   2170                     if flip == 'yes':
   2171                         camera.hflip = False
   2172                         camera.vflip = False
   2173                         flip = 'no'
   2174                         time.sleep(0.2)
   2175                     else:
   2176                         camera.hflip = True
   2177                         camera.vflip = True
   2178                         flip = 'yes'
   2179                         time.sleep(0.2)
   2180                 elif menu[selected] == 'LENGTH:':
   2181                     if reclength > 1:
   2182                         reclength = int(reclength - 1)
   2183                         time.sleep(0.1)
   2184                     elif reclength > 0.3:
   2185                         reclength = reclength - 0.2
   2186                         time.sleep(0.1)
   2187                     else:
   2188                         reclength = 0
   2189                 elif menu[selected] == 'MIC:':
   2190                     if miclevel > 0:
   2191                         miclevel = miclevel - 2
   2192                         run_command('amixer -c 0 sset Mic ' + str(miclevel) + '% unmute')
   2193                 elif menu[selected] == 'PHONES:':
   2194                     if headphoneslevel > 0:
   2195                         headphoneslevel = headphoneslevel - 2
   2196                         run_command('amixer -c 0 sset Speaker ' + str(headphoneslevel) + '%')
   2197                 elif menu[selected] == 'SCENE:' and recording == False:
   2198                     if scene > 1:
   2199                         scene -= 1
   2200                         #shot = countshots(filmname, filmfolder, scene)
   2201                     else:
   2202                         scene = countscenes(filmfolder, filmname)
   2203                     shot=1
   2204                     take = counttakes(filmname, filmfolder, scene, shot)
   2205                     #scene, shots, take = browse2(filmname, filmfolder, scene, shot, take, 0, -1)
   2206                     #takes = take
   2207                     #shot = 1
   2208                 elif menu[selected] == 'SHOT:' and recording == False:
   2209                     if shot > 1:
   2210                         shot -= 1
   2211                     else:
   2212                         shot = countshots(filmname, filmfolder, scene)
   2213                     take = counttakes(filmname, filmfolder, scene, shot)
   2214                     #scene, shot, take = browse2(filmname, filmfolder, scene, shot, take, 1, -1)
   2215                     #takes = take
   2216                 elif menu[selected] == 'TAKE:' and recording == False:
   2217                     if take > 1:
   2218                         take -= 1
   2219                     else:
   2220                         take = counttakes(filmname,filmfolder,scene,shot)
   2221                     #scene, shot, take = browse2(filmname, filmfolder, scene, shot, take, 2, -1)
   2222                 elif menu[selected] == 'RED:':
   2223                     camera.awb_mode = 'off'
   2224                     if float(camera.awb_gains[0]) > 0.02:
   2225                         camera.awb_gains = (round(camera.awb_gains[0],2) - 0.02, round(camera.awb_gains[1],2))
   2226                 elif menu[selected] == 'BLUE:':
   2227                     camera.awb_mode = 'off'
   2228                     if float(camera.awb_gains[1]) > 0.02:
   2229                         camera.awb_gains = (round(camera.awb_gains[0],2), round(camera.awb_gains[1],2) - 0.02)
   2230                 elif menu[selected] == 'SRV:':
   2231                     if serverstate == 'on':
   2232                         try:
   2233                             os.makedirs(gonzopifolder+'/srv/sessions')
   2234                             os.system('chown www-data '+gonzopifolder+'/srv/sessions')
   2235                         except:
   2236                             print('srv folder exist')
   2237                         serverstate = gonzopiserver(False)
   2238                     elif serverstate == 'off':
   2239                         serverstate = gonzopiserver(True)
   2240                 elif menu[selected] == 'WIFI:':
   2241                     if wifistate == 'on':
   2242                         run_command('sudo iwconfig wlan0 txpower off')
   2243                         wifistate = 'off'
   2244                     elif wifistate == 'off':
   2245                         run_command('sudo iwconfig wlan0 txpower auto')
   2246                         wifistate = 'on'
   2247                 elif menu[selected] == 'SEARCH:':
   2248                     if searchforcameras == 'on':
   2249                         searchforcameras = 'off'
   2250                     elif searchforcameras == 'off':
   2251                         seaarchforcameras = 'on'
   2252                 elif menu[selected] == 'MODE:':
   2253                     if cammode == 'film':
   2254                         cammode = 'picture'
   2255                         vumetermessage('changing to picture mode')
   2256                     elif cammode == 'picture':
   2257                         cammode = 'film'
   2258                         vumetermessage('changing to film mode')
   2259                     camera.stop_preview()
   2260                     camera.close()
   2261                     camera = startcamera(lens,fps)
   2262                     loadfilmsettings = True
   2263                     flushbutton()
   2264                 elif menu[selected] == 'LENS:':
   2265                     s = 0
   2266                     for a in lenses:
   2267                         if a == lens:
   2268                             selectlens = s
   2269                         s += 1
   2270                     if selectlens > 0:
   2271                         selectlens -= 1
   2272                     lens = os.listdir('lenses/')[selectlens]
   2273                     #npzfile = np.load('lenses/' + lens)
   2274                     #lensshade = npzfile['lens_shading_table']
   2275                     table = read_table('lenses/' + lens)
   2276                     camera.lens_shading_table = table
   2277                 elif menu[selected] == 'DUB:':
   2278                     if round(dub[0],1) == 1.0 and round(dub[1],1) > 0.0:
   2279                         dub[1] -= 0.1
   2280                     if round(dub[1],1) == 1.0 and round(dub[0],1) < 1.0:
   2281                         dub[0] += 0.1
   2282                 elif menu[selected] == 'COMP:':
   2283                     if comp > 0:
   2284                         comp -= 1
   2285                 elif menu[selected] == 'HW:':
   2286                     if plughw > 0:
   2287                         plughw -= 1
   2288                     vumetermessage(getaudiocards()[plughw])
   2289                 elif menu[selected] == 'CH:':
   2290                     if channels == 2:
   2291                         channels = 1
   2292                 elif menu[selected] == 'FPS:':
   2293                     if fps_selected > 0:
   2294                         fps_selected-=1
   2295                         fps=fps_selection[fps_selected]
   2296                         camera.framerate = fps
   2297                 elif menu[selected] == 'Q:':
   2298                     if quality > 10:
   2299                         quality -= 1
   2300                 elif menu[selected] == 'CAMERA:':
   2301                     if camselected > 0:
   2302                         newselected = camselected-1
   2303                         logger.info('camera selected:'+str(camselected))
   2304                 elif menu[selected] == 'SLIDE:':
   2305                     if slidecommander and slide > 1:
   2306                         slide -= 1
   2307                         #send_serial_port(slidecommander,'<')
   2308                 elif menu[selected] == 'DSK:':
   2309                     if dsk > 0:
   2310                         dsk -= 1
   2311                         filmfolder = storagedrives[dsk][1]
   2312                         loadfilmsettings = True
   2313                         #COUNT DISKSPACE
   2314                         disk = os.statvfs(filmfolder)
   2315                         diskleft = str(int(disk.f_bavail * disk.f_frsize / 1024 / 1024 / 1024)) + 'Gb'
   2316                         #LOAD FILM AND SCENE SETTINGS
   2317                         try:
   2318                             filmname = getfilms(filmfolder)[0][0]
   2319                         except:
   2320                             filmname = filmname 
   2321                         try:
   2322                             filmname_back = getfilms(filmfolder)[0][1]
   2323                         except:
   2324                             filmname_back = filmname 
   2325                         if serverstate == 'on':
   2326                             gonzopiserver(False)
   2327                             gonzopiserver(True)
   2328                 elif menu[selected] == 'MUX:':
   2329                     if muxing == False:
   2330                         muxing=True
   2331                         mux='yes'
   2332                     else:
   2333                         muxing=False
   2334                         mux='no'
   2335 
   2336             #RIGHT
   2337             elif pressed == 'right':
   2338                 if selected < len(menu) - 1:
   2339                     selected = selected + 1
   2340                 else:
   2341                     selected = 0
   2342                 if selected == 5: #jump over recording time
   2343                     selected = 6
   2344             #Start Recording Time
   2345             if recording == True:
   2346                 t = time.time() - starttime
   2347                 rectime = time.strftime("%H:%M:%S", time.gmtime(t))
   2348             #Load settings
   2349             if loadfilmsettings == True:
   2350                 db = get_film_files(filmname,filmfolder,db)
   2351                 try:
   2352                     filmsettings = loadsettings(filmfolder, filmname)
   2353                     camera.brightness = filmsettings[2]
   2354                     camera.contrast = filmsettings[3]
   2355                     camera.saturation = filmsettings[4]
   2356                     camera.shutter_speed = filmsettings[5]
   2357                     camera.iso = filmsettings[6]
   2358                     camera.awb_mode = filmsettings[7]
   2359                     camera.awb_gains = filmsettings[8]
   2360                     awb_lock = filmsettings[9]
   2361                     miclevel = filmsettings[10]
   2362                     headphoneslevel = filmsettings[11]
   2363                     beeps = filmsettings[12]
   2364                     flip = filmsettings[13]
   2365                     comp = filmsettings[14]
   2366                     between = filmsettings[15]
   2367                     duration = filmsettings[16]
   2368                     showmenu_settings = filmsettings[17]
   2369                     quality = filmsettings[18]
   2370                     #wifistate = filmsettings[19]
   2371                     #serverstate=filmsettings[20]
   2372                     plughw=filmsettings[21]
   2373                     channels=filmsettings[22]
   2374                     #cammode=filmsettings[23]
   2375                     scene=filmsettings[24]
   2376                     shot=filmsettings[25]
   2377                     take=filmsettings[26]
   2378                     cameras=filmsettings[27]
   2379                     udp_ip=filmsettings[28]
   2380                     udp_port=filmsettings[29]
   2381                     bitrate=filmsettings[30]
   2382                     pan=filmsettings[31]
   2383                     tilt=filmsettings[32]
   2384                     move=filmsettings[33]
   2385                     speed=filmsettings[34]
   2386                     slide=filmsettings[35]
   2387                     film_fps=filmsettings[36]
   2388                     film_reso=filmsettings[37]
   2389                     logger.info('film settings loaded & applied')
   2390                     time.sleep(0.2)
   2391                 except:
   2392                     logger.warning('could not load film settings')
   2393                 #if rpimode:
   2394                 #    #FIRE UP CAMERA
   2395                 #    if camera != None:
   2396                 #        camera.stop_preview()
   2397                 #        camera.close()
   2398                 #    camera = startcamera(lens,fps)
   2399                 #    #START INTERFACE
   2400                 #else:
   2401                 #    camera=None
   2402                 if flip == "yes":
   2403                     camera.vflip = True
   2404                     camera.hflip = True
   2405                 run_command('amixer -c 0 sset Mic ' + str(miclevel) + '% unmute')
   2406                 run_command('amixer -c 0 sset Speaker ' + str(headphoneslevel) + '%')
   2407                 #check if audiocard there other default to 0
   2408                 if int(plughw) > len(getaudiocards()):
   2409                     plughw = 0
   2410                     channels = 1
   2411                     vumetermessage(getaudiocards()[plughw])
   2412                 print(filmfolder)
   2413                 print(filmname)
   2414                 check_film = True
   2415                 if check_film == True:
   2416                     origin_videos=organize(filmfolder, filmname)
   2417                     print('ORIGIN')
   2418                     print(origin_videos)
   2419                     print('total of videos: '+str(len(origin_videos)))
   2420                     with open(filmfolder+filmname+'/.origin_videos', 'w') as outfile:
   2421                         outfile.write('\n'.join(str(i) for i in origin_videos))
   2422                     if not os.path.isdir(filmfolder+'.videos/'):
   2423                         os.makedirs(filmfolder+'.videos/')
   2424                     allfiles = os.listdir(filmfolder+'.videos/')
   2425                     print(allfiles)
   2426                     print('alll')
   2427                     for origin in origin_videos:
   2428                         if origin in allfiles:
   2429                             try:
   2430                                 #os.remove(origin)
   2431                                 print('ORIGIN VIDEO FOLDER NOT IN SYNC' + origin)
   2432                                 time.sleep(5)
   2433                             except:
   2434                                 print('not exist')
   2435                                 time.sleep(5)
   2436                     #organize(filmfolder,'onthefloor')
   2437                     #if origin_videos != []:
   2438                     #    if origin_videos[0] != '':
   2439                     #        reso_w, reso_h = check_reso(origin_videos[0])
   2440                     #        reso_check=str(reso_w)+'x'+str(reso_h)
   2441                     #        fps_check = check_fps(origin_videos[0])
   2442                     #        if reso_check != film_reso:
   2443                     #            vumetermessage('wrong film project resolution')
   2444                     #            #waitforanykey()
   2445                     #        if str(fps_check) != str(film_fps):
   2446                     #            vumetermessage('wrong film project framerate')
   2447                     #            #waitforanykey()
   2448                     add_organize(filmfolder, filmname)
   2449                 scenes, shots, takes = countlast(filmname, filmfolder)
   2450                 loadfilmsettings = False
   2451                 rendermenu = True
   2452                 updatethumb =  True
   2453             if scene == 0:
   2454                 scene = 1
   2455             if take == 0:
   2456                 take = 1
   2457             if shot == 0:
   2458                 shot = 1
   2459             # If menu at SCENE show first shot thumbnail off that scene
   2460             if menu[selected] == 'FILM:' and lastmenu != menu[selected] and recordable == False:
   2461                 updatethumb = True
   2462             if menu[selected] == 'SCENE:' and lastmenu != menu[selected] and recordable == False:
   2463                 updatethumb = True
   2464             if menu[selected] == 'SHOT:' and lastmenu != menu[selected] and recordable == False:
   2465                 updatethumb = True
   2466             if menu[selected] == 'TAKE:' and lastmenu != menu[selected] and recordable == False:
   2467                 updatethumb = True
   2468             #Check if scene, shot, or take changed and update thumbnail
   2469             if oldscene != scene or oldshot != shot or oldtake != take or updatethumb == True:
   2470                 if recording == False:
   2471                     #logger.info('film:' + filmname + ' scene:' + str(scene) + '/' + str(scenes) + ' shot:' + str(shot) + '/' + str(shots) + ' take:' + str(take) + '/' + str(takes))
   2472                     foldername = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) + '/'
   2473                     scenename = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/'
   2474                     if foldername in shots_selected:
   2475                         shots_sel = '*'
   2476                     else:
   2477                         shots_sel = ''
   2478                     if scenename in scenes_selected:
   2479                         scenes_sel = '*'
   2480                     else:
   2481                         scenes_sel = ''
   2482                     if filmname in films_selected:
   2483                         films_sel = '*'
   2484                     else:
   2485                         films_sel = ''
   2486                     filename = 'take' + str(take).zfill(3)
   2487                     recordable = not os.path.isfile(foldername + filename + '.mp4') and not os.path.isfile(foldername + filename + '.h264')
   2488                     overlay = removeimage(camera, overlay)
   2489                     if recordable:
   2490                         vumetermessage('filming with '+camera_model+' ip:'+ network + ' '+camerasconnected)
   2491                         #vumetermessage(str(round(film_fps)) + ' '+ str(round(fps)))
   2492                     if menu[selected] == 'SCENE:' and recordable == False: # display first shot of scene if browsing scenes
   2493                         p = counttakes(filmname, filmfolder, scene, 1)
   2494                         imagename = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(1).zfill(3) + '/take' + str(p).zfill(3) + '.jpeg'
   2495                         try:
   2496                             videosize=countsize(filmfolder + filmname + '/scene' + str(scene).zfill(3)+'/scene.mp4')
   2497                             if videosize == 0:
   2498                                 vumetermessage('scene not rendered')
   2499                             else:
   2500                                 vumetermessage('videosize: '+str(round(videosize/1000,2))+' Mb')
   2501                         except:
   2502                             vumetermessage('not rendered')
   2503                     #elif menu[selected] == 'FILM:' and recordable == True:
   2504                     #    scene, shot, take = countlast(filmname,filmfolder)
   2505                     #    shot += 1
   2506                     elif menu[selected] == 'FILM:' and recordable == False: # display first shot of film
   2507                         p = counttakes(filmname, filmfolder, 1, 1)
   2508                         imagename = filmfolder + filmname + '/scene' + str(1).zfill(3) + '/shot' + str(1).zfill(3) + '/take' + str(p).zfill(3) + '.jpeg'
   2509                         try:
   2510                             videosize=countsize(filmfolder + filmname + '/' + filmname+'.mp4')
   2511                             if videosize == 0:
   2512                                 vumetermessage('film not rendered')
   2513                             else:
   2514                                 vumetermessage('videosize: '+str(round(videosize/1000,2))+' Mb')
   2515                         except:
   2516                             vumetermessage('not rendered')
   2517                     imagename = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/take' + str(take).zfill(3) + '.jpeg'
   2518                     if menu[selected]=='SHOT:' and recordable == False or menu[selected]=='TAKE:' and recordable==False:
   2519                         try:
   2520                             videosize=countsize(foldername + filename + '.mp4')
   2521                             vumetermessage('length: '+get_video_length_str(foldername+filename+'.mp4')+' size: '+str(round(videosize/1000,2))+' Mb')
   2522                         except:
   2523                             videosize=countsize(foldername + filename + '.h264')
   2524                             vumetermessage('videosize: '+str(round(videosize/1000,2))+' Mb')
   2525                     overlay = displayimage(camera, imagename, overlay, 3)
   2526                     oldscene = scene
   2527                     oldshot = shot
   2528                     oldtake = take
   2529                     updatethumb = False
   2530                     scenes = countscenes(filmfolder, filmname)
   2531                     shots = countshots(filmname, filmfolder, scene)
   2532                     takes = counttakes(filmname, filmfolder, scene, shot)
   2533             #If auto dont show value show auto (impovement here to show different colors in gui, yes!!?)
   2534             if camera.iso == 0:
   2535                 cameraiso = 'auto'
   2536             else:
   2537                 cameraiso = str(camera.iso)
   2538             if camera.shutter_speed == 0:
   2539                 camerashutter = 'auto'
   2540             else:
   2541                 camerashutter = str(camera.exposure_speed).zfill(5)
   2542             if camera.awb_mode == 'auto':
   2543                 camerared = 'auto'
   2544                 camerablue = 'auto'
   2545             else:
   2546                 camerared = str(float(camera.awb_gains[0]))[:4]
   2547                 camerablue = str(float(camera.awb_gains[1]))[:4]
   2548             if time.time() - showmenutime > hide_menu_time: 
   2549                 #showmenutime = time.time()
   2550                 showmenu=0
   2551                 showmenu_settings = False
   2552                 rendermenu=True
   2553             #Check if menu is changed and save settings / sec
   2554             if buttonpressed == True or recording == True or rendermenu == True:
   2555                 if buttonpressed == True and recording == False and not pressed == 'record' and not pressed == 'retake':
   2556                     showmenu=1
   2557                     showmenutime = time.time()
   2558                 lastmenu = menu[selected]
   2559                 if showgonzopictrl == False:
   2560                     menu = standardmenu
   2561                     settings = storagedrives[dsk][0]+' '+diskleft, filmname+films_sel, str(scene)+scenes_sel+ '/' + str(scenes), str(shot)+shots_sel+ '/' + str(shots), str(take) + '/' + str(takes), rectime, camerashutter, cameraiso, camerared, camerablue, str(round(camera.framerate)), str(quality), str(camera.brightness), str(camera.contrast), str(camera.saturation), effects[effectselected], str(flip), str(beeps), str(round(reclength,2)), str(plughw), str(channels), str(miclevel), str(headphoneslevel), str(comp), '',blendmodes[blendselect], cammode, '', serverstate, searchforcameras, wifistate, '', '', '', '', '', live, mux, hdmi, str(slide)
   2562                 else:
   2563                     #gonzopictrlmenu = 'FILM:', 'SCENE:', 'SHOT:', 'TAKE:', '', 'SHUTTER:', 'ISO:', 'RED:', 'BLUE:', 'FPS:', 'Q:', 'BRIGHT:', 'CONT:', 'SAT:', 'FLIP:', 'BEEP:', 'LENGTH:', 'HW:', 'CH:', 'MIC:', 'PHONES:', 'COMP:', 'TIMELAPSE', 'BLEND:', 'FADE:', 'L:', 'MODE:', 'DSK:', 'SHUTDOWN', 'SRV:', 'SEARCH:', 'WIFI:', 'CAMERA:', 'Add CAMERA', 'New FILM', 'Sync FILM', 'Sync SCENE'
   2564                     menu = gonzopictrlmenu
   2565                     #settings = '',str(camselected),'','',rectime,'','','','','','','','','',''
   2566                     settings = storagedrives[dsk][0]+' '+diskleft, filmname, str(scene) + scenes_sel+ '/' + str(scenes), str(shot) + shots_sel+ '/' + str(shots), str(take) + '/' + str(takes), rectime, camerashutter, cameraiso, camerared, camerablue, str(round(camera.framerate)), str(quality), str(camera.brightness), str(camera.contrast), str(camera.saturation), effects[effectselected], str(flip), str(beeps), str(reclength), str(plughw), str(channels), str(miclevel), str(headphoneslevel), str(comp), '',blendmodes[blendselect], cammode, '', serverstate, searchforcameras, wifistate, str(camselected+1), '', '', '', '', '', '', ''
   2567                 #Rerender menu if picamera settings change
   2568                 #if settings != oldsettings or selected != oldselected:
   2569                 oldmenu=writemenu(menu,settings,selected,'',showmenu,oldmenu)
   2570                 rendermenu = False
   2571                 #save settings if menu has been updated and x seconds passed
   2572                 if recording == False:
   2573                     #if time.time() - pausetime > savesettingsevery: 
   2574                     if oldsettings != settings:
   2575                         settings_to_save = [filmfolder, filmname, camera.brightness, camera.contrast, camera.saturation, camera.shutter_speed, camera.iso, camera.awb_mode, camera.awb_gains, awb_lock, miclevel, headphoneslevel, beeps, flip, comp, between, duration, showmenu_settings, quality,wifistate,serverstate,plughw,channels,cammode,scene,shot,take,cameras,udp_ip,udp_port,bitrate, pan, tilt, move, speed, slide, film_fps, film_reso]
   2576                         #print('saving settings')
   2577                         savesettings(settings_to_save, filmname, filmfolder)
   2578                     if time.time() - pausetime > savesettingsevery: 
   2579                         pausetime = time.time()
   2580                         #NETWORKS
   2581                         networks=[]
   2582                         network=''
   2583                         adapters = ifaddr.get_adapters()
   2584                         for adapter in adapters:
   2585                             print("IPs of network adapter " + adapter.nice_name)
   2586                             for ip in adapter.ips:
   2587                                 if ':' not in ip.ip[0] and '127.0.0.1' != ip.ip:
   2588                                     print(ip.ip)
   2589                                     networks=[ip.ip]
   2590                         if networks != []:
   2591                             network=networks[0]
   2592                             if network not in cameras and network != '':
   2593                                 cameras=[]
   2594                                 cameras.append(network)
   2595                         else:
   2596                             network='not connected'
   2597                         if len(cameras) > 1:
   2598                             camerasconnected='connected '+str(len(cameras)-1)
   2599                             recordwithports=True
   2600                             if camera_recording:
   2601                                 vumetermessage('filming with '+camera_model +' ip:'+ cameras[camselected] + ' '+camerasconnected+' camselected:'+str(camselected+1)+' rec:'+str(camera_recording+1))
   2602                             else:
   2603                                 vumetermessage('filming with '+camera_model +' ip:'+ cameras[camselected] + ' '+camerasconnected+' camselected:'+str(camselected+1)+' rec:'+str(camera_recording))
   2604                         else:
   2605                             camerasconnected=''
   2606                             recordwithports=False
   2607                             if searchforcameras == 'on':
   2608                                 camerasconnected='searching '+str(pingip)
   2609                             if menu[selected] != 'SHOT:' and menu[selected] != 'SCENE:' and menu[selected] != 'FILM:' and menu[selected] != 'TAKE:':
   2610                                 vumetermessage('filming with '+camera_model +' ip:'+ network + ' '+camerasconnected)
   2611                         disk = os.statvfs(filmfolder)
   2612                         diskleft = str(int(disk.f_bavail * disk.f_frsize / 1024 / 1024 / 1024)) + 'Gb'
   2613                         #checksync = int(disk.f_bavail * disk.f_frsize / 1024 / 1024 )
   2614                         #if checksync == oldchecksync:
   2615                         #    rectime = str(checksync)+'Mb/s'
   2616                         #elif checksync - oldchecksync > 1000:
   2617                         #    rectime = 'SYNCING.. '
   2618                         #oldchecksync = checksync
   2619                         #print(term.yellow+'filming with '+camera_model +' ip:'+ network
   2620                         print(camselected,camera_recording,cameras)
   2621                 #writemessage(pressed)
   2622                 oldsettings = settings
   2623                 oldselected = selected
   2624             #PING TARINAS
   2625             if searchforcameras == 'on':
   2626                 if camera_recording == None:
   2627                     if pingip < 256:
   2628                         pingip+=1
   2629                     else:
   2630                         pingip=0
   2631                         #searchforcameras='off'
   2632                     newcamera=pingtocamera(network[:-3]+str(pingip),port,'PING')
   2633                     if newcamera != '':
   2634                         if newcamera not in cameras and newcamera not in networks:
   2635                             cameras.append(newcamera)
   2636                             vumetermessage("Found camera! "+newcamera)
   2637                     print('-~-')
   2638                     print('pinging ip: '+network[:-3]+str(pingip))
   2639                 else:
   2640                     searchforcameras = 'off'
   2641             time.sleep(keydelay)
   2642 
   2643 #--------------Logger-----------------------
   2644 
   2645 class logger():
   2646     def info(info):
   2647         print(term.yellow(info))
   2648     def warning(warning):
   2649         print('Warning: ' + warning)
   2650 
   2651 #-------------get film db files---
   2652 
   2653 def get_film_files(filmname,filmfolder,db):
   2654     if not os.path.isdir(filmfolder+'.videos/'):
   2655         os.makedirs(filmfolder+'.videos/')
   2656     if not os.path.isdir(filmfolder+'.tmp/'):
   2657         os.makedirs(filmfolder+'.tmp/')
   2658     filmdb = filmfolder+'.videos/gonzopi.db'
   2659     db = web.database(dbn='sqlite', db=filmdb)
   2660     try:
   2661         videodb=db.select('videos')
   2662         return db
   2663     except:
   2664         db.query("CREATE TABLE videos (id integer PRIMARY KEY, tid DATETIME, filename TEXT, foldername TEXT, filmname TEXT, scene INT, shot INT, take INT, audiolength FLOAT, videolength FLOAT,soundlag FLOAT, audiosync FLOAT, faststart BOOL);")
   2665     videodb=db.select('videos')
   2666     return db
   2667 
   2668 #---------remove and get correct database------
   2669 
   2670 def correct_database(filmname,filmfolder,db):
   2671     if not os.path.isdir(filmfolder+'.videos/'):
   2672         os.makedirs(filmfolder+'.videos/')
   2673     filmdb = filmfolder+'.videos/gonzopi.db'
   2674     #run_command('rm '+filmdb)
   2675     db = web.database(dbn='sqlite', db=filmdb)
   2676     db.query("CREATE TABLE videos (id integer PRIMARY KEY, tid DATETIME, filename TEXT, foldername TEXT, filmname TEXT, scene INT, shot INT, take INT, audiolength FLOAT, videolength FLOAT,soundlag FLOAT, audiosync FLOAT, faststart BOOL);")
   2677     videodb=db.select('videos')
   2678     return db
   2679 
   2680 #--------------Save settings-----------------
   2681 
   2682 def savesettings(settings, filmname, filmfolder):
   2683     #db.insert('videos', tid=datetime.datetime.now())
   2684     try:
   2685         with open(filmfolder + filmname + "/settings.p", "wb") as f:
   2686             pickle.dump(settings, f)
   2687             #logger.info("settings saved")
   2688     except:
   2689         logger.warning("could not save settings")
   2690         #logger.warning(e)
   2691     return
   2692 
   2693 #--------------Load film settings--------------
   2694 
   2695 def loadsettings(filmfolder, filmname):
   2696     try:
   2697         settings = pickle.load(open(filmfolder + filmname + "/settings.p", "rb"))
   2698         logger.info("settings loaded")
   2699         return settings
   2700     except:
   2701         logger.info("couldnt load settings")
   2702         return ''
   2703 
   2704 
   2705 ##---------------Connection----------------------------------------------
   2706 def pingtocamera(host, port, data):
   2707     print("Sending to "+host+" on port "+str(port)+" DATA:"+data)
   2708     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   2709     s.settimeout(0.05)
   2710     newcamera=''
   2711     try:
   2712         while True:
   2713             s.connect((host, port))
   2714             s.send(str.encode(data))
   2715             newcamera=host
   2716             print("Sent to server..")
   2717             break
   2718     except:
   2719         print('did not connect')
   2720     s.close()
   2721     return newcamera
   2722 
   2723 ##---------------Send to server----------------------------------------------
   2724 
   2725 def sendtocamera(host, port, data):
   2726     print("Sending to "+host+" on port "+str(port)+" DATA:"+data)
   2727     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   2728     s.settimeout(5)
   2729     try:
   2730         while True:
   2731             s.connect((host, port))
   2732             s.send(str.encode(data))
   2733             print("Sent to server..")
   2734             break
   2735         return True
   2736     except:
   2737         print('did not connect')
   2738         return False
   2739     s.close()
   2740 
   2741 ##---------------Send to server----------------------------------------------
   2742 
   2743 def sendtoserver(host, port, data):
   2744     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   2745     try:
   2746         while True:
   2747             print('sending data to '+host+':'+str(port))
   2748             s.connect((host, port))
   2749             s.send(str.encode(data))
   2750             s.close()
   2751             break
   2752     except:
   2753         print('sometin rong')
   2754 
   2755 ##--------------Listen for Clients-----------------------
   2756 
   2757 def listenforclients(host, port, q):
   2758     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   2759     s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
   2760     s.bind((host,port))
   2761     #s.settimeout(0.1)
   2762     try:
   2763         print("listening on port "+str(port))
   2764         s.listen(5)
   2765         c, addr = s.accept()
   2766         while True:
   2767                 data = c.recv(1024).decode()
   2768                 if not data:
   2769                     print("no data")
   2770                     break
   2771                 else:
   2772                     if addr:
   2773                         #print(addr[0],' sending back')
   2774                         #sendtoserver(addr[0],port,'rebounce'+data)
   2775                         nextstatus = data
   2776                         print("got data:"+nextstatus)
   2777                         c.close()
   2778                         q.put(nextstatus+'*'+addr[0])
   2779                         break
   2780     except:
   2781         print("somthin wrong")
   2782         q.put('')
   2783 
   2784 #--------------Write the menu layer to dispmanx--------------
   2785 
   2786 def writemenu(menu,settings,selected,header,showmenu,oldmenu):
   2787     menudone = ''
   2788     menudoneprint = ''
   2789     menudone += str(selected) + '\n'
   2790     menudone += str(showmenu) + '\n'
   2791     menudone += header + '\n'
   2792     n = 0
   2793     for i, s in zip(menu, settings):
   2794         menudone += i + s + '\n'
   2795         if n == selected:
   2796             menudoneprint += term.black_on_darkkhaki(i+s) + ' | ' 
   2797         else:
   2798             menudoneprint += i + ' ' + s + ' | '
   2799         n += 1
   2800     spaces = len(menudone) - 500
   2801     menudone += spaces * ' '
   2802     if oldmenu != menudone and len(menudone) > 4:
   2803         print(term.clear+term.home)
   2804         if showmenu == 0:
   2805             print(term.red+menudoneprint)
   2806         else:
   2807             print(menudoneprint)
   2808         #menudone += 'EOF'
   2809         f = open('/dev/shm/interface', 'w')
   2810         f.write(menudone)
   2811         f.close()
   2812         return oldmenu
   2813 
   2814 #------------Write to screen----------------
   2815 
   2816 def writemessage(message):
   2817     menudone = ""
   2818     menudone += '420' + '\n'
   2819     menudone += message + '\n'
   2820     #menudone += 'EOF'
   2821     #clear = 500
   2822     #clear = clear - len(message)
   2823     f = open('/dev/shm/interface', 'w')
   2824     f.write(menudone)
   2825     f.close()
   2826 
   2827 #------------Write to vumeter (last line)-----
   2828 
   2829 def vumetermessage(message):
   2830     clear = 72
   2831     clear = clear - len(message)
   2832     f = open('/dev/shm/vumeter', 'w')
   2833     f.write(message + clear * ' ')
   2834     f.close()
   2835     logger.info(message)
   2836 
   2837 #------------Count file size-----
   2838 
   2839 def countvideosize(filename):
   2840     size = 0
   2841     if type(filename) is list:
   2842         size = 0
   2843         for i in filename[:]:
   2844             size = size + os.stat(i + '.mp4').st_size
   2845     if type(filename) is str:
   2846         size = os.stat(filename + '.mp4').st_size
   2847     return size/1024
   2848 
   2849 def countsize(filename):
   2850     size = 0
   2851     if type(filename) is str:
   2852         try:
   2853             size = os.stat(filename).st_size
   2854         except:
   2855             return 0
   2856     else:
   2857         return 0
   2858     return size/1024
   2859 
   2860 #------------Count scenes, takes and shots-----
   2861 
   2862 def countlast(filmname, filmfolder): 
   2863     scenes = 0
   2864     shots = 0
   2865     takes = 0
   2866     try:
   2867         allfiles = os.listdir(filmfolder + filmname)
   2868     except:
   2869         allfiles = []
   2870         scenes = 0
   2871     for a in allfiles:
   2872         if 'scene' in a:
   2873             scenes = scenes + 1
   2874     try:
   2875         allfiles = os.listdir(filmfolder + filmname + '/scene' + str(scenes).zfill(3))
   2876     except:
   2877         allfiles = []
   2878         shots = 0
   2879     for a in allfiles:
   2880         if 'shot' in a:
   2881             shots = shots + 1
   2882     try:
   2883         allfiles = os.listdir(filmfolder + filmname + '/scene' + str(scenes).zfill(3) + '/shot' + str(shots).zfill(3))
   2884     except:
   2885         allfiles = []
   2886         takes = 0
   2887     for a in allfiles:
   2888         if '.mp4' in a or '.h264' in a:
   2889             takes = takes + 1
   2890     return scenes, shots, takes
   2891 
   2892 #------------Count scenes--------
   2893 
   2894 def countscenes(filmfolder, filmname):
   2895     scenes = 0
   2896     try:
   2897         allfiles = os.listdir(filmfolder + filmname)
   2898     except:
   2899         allfiles = []
   2900         scenes = 0
   2901     for a in allfiles:
   2902         if 'scene' in a:
   2903             scenes = scenes + 1
   2904     return scenes
   2905 
   2906 #------------Count shots--------
   2907 
   2908 def countshots(filmname, filmfolder, scene):
   2909     shots = 0
   2910     try:
   2911         allfiles = os.listdir(filmfolder + filmname + '/scene' + str(scene).zfill(3))
   2912     except:
   2913         allfiles = []
   2914         shots = 0
   2915     for a in allfiles:
   2916         if 'shot' in a:
   2917             shots = shots + 1
   2918     return shots
   2919 
   2920 #------------Count takes--------
   2921 
   2922 def counttakes(filmname, filmfolder, scene, shot):
   2923     takes = 0
   2924     doubles = ''
   2925     try:
   2926         allfiles = os.listdir(filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3))
   2927     except:
   2928         allfiles = []
   2929         return takes
   2930     for a in allfiles:
   2931         if 'take' in a:
   2932             if '.mp4' in a or '.h264' in a:
   2933                 if not doubles.replace('.h264', '.mp4') == a:
   2934                     takes = takes + 1
   2935                 doubles = a
   2936     return takes
   2937 
   2938 def counttakes2(folder):
   2939     takes = 0
   2940     doubles = ''
   2941     try:
   2942         allfiles = os.listdir(folder)
   2943     except:
   2944         allfiles = []
   2945         return takes
   2946     for a in allfiles:
   2947         if 'take' in a:
   2948             if '.mp4' in a or '.h264' in a:
   2949                 if not doubles.replace('.h264', '.mp4') == a:
   2950                     takes = takes + 1
   2951                 doubles = a
   2952     return takes
   2953 
   2954 def gettake(folder):
   2955     takes = 0
   2956     doubles = ''
   2957     try:
   2958         allfiles = os.listdir(folder)
   2959     except:
   2960         allfiles = []
   2961         return takes
   2962     for a in allfiles:
   2963         if 'take' in a:
   2964             if '.mp4' in a or '.h264' in a:
   2965                 if not doubles.replace('.h264', '.mp4') == a:
   2966                     takes = takes + 1
   2967                     filename=a
   2968                 doubles = a
   2969     return filename
   2970 
   2971 #------------Count last take name --------
   2972 
   2973 def nexttakefilename(filmname, filmfolder, scene, shot):
   2974     takes = 0
   2975     doubles = ''
   2976     try:
   2977         allfiles = os.listdir(filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3))
   2978     except:
   2979         allfiles = []
   2980         return takes
   2981     for a in allfiles:
   2982         if 'take' in a:
   2983             if '.mp4' in a or '.h264' in a:
   2984                 if not doubles.replace('.h264', '.mp4') == a:
   2985                     takes = takes + 1
   2986                 doubles = a
   2987     return filmfolder+filmname+'/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3)+'/take'+str(takes+1).zfill(3)
   2988 
   2989 def counttakes2(folder):
   2990     takes = 0
   2991     doubles = ''
   2992     try:
   2993         allfiles = os.listdir(folder)
   2994     except:
   2995         allfiles = []
   2996         return takes
   2997     for a in allfiles:
   2998         if 'take' in a:
   2999             if '.mp4' in a or '.h264' in a:
   3000                 if not doubles.replace('.h264', '.mp4') == a:
   3001                     takes = takes + 1
   3002                 doubles = a
   3003     return takes
   3004 
   3005 #-----------Count videos on floor-----
   3006 
   3007 def countonfloor(filmname, filmfolder):
   3008     print('dsad')
   3009 
   3010 #----------Camera effect menus------
   3011 
   3012 def vfx_colorpoint():
   3013     global camera
   3014     oldmenu=''
   3015     pressed = ''
   3016     buttonpressed = ''
   3017     buttontime = time.time()
   3018     holdbutton = ''
   3019     selected = 0
   3020     header = 'Choose colorpoint'
   3021     menu =  'BACK','GREEN','RED/YELLOW','BLUE','PURPLE'
   3022     while True:
   3023         settings = '','','','',''
   3024         oldmenu=writemenu(menu,settings,selected,header,showmenu,oldmenu)
   3025         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   3026         if pressed == 'right':
   3027             if selected < (len(settings) - 1):
   3028                 selected = selected + 1
   3029             else:
   3030                 selected = 0
   3031             selected == 0
   3032         elif pressed == 'left':
   3033             if selected > 0:
   3034                 selected = selected - 1
   3035             else:
   3036                 selected = len(settings) - 1
   3037         elif pressed == 'middle' and menu[selected] == 'GREEN':
   3038             camera.image_effect_params = 0
   3039         elif pressed == 'middle' and menu[selected] == 'RED/YELLOW':
   3040             camera.image_effect_params = 1
   3041         elif pressed == 'middle' and menu[selected] == 'BLUE':
   3042             camera.image_effect_params = 2
   3043         elif pressed == 'middle' and menu[selected] == 'PURPLE':
   3044             camera.image_effect_params = 3
   3045         elif pressed == 'middle' and menu[selected] == 'BACK':
   3046             return
   3047         time.sleep(keydelay)
   3048 
   3049 def vfx_solarize():
   3050     global camera
   3051     oldmenu=''
   3052     pressed = ''
   3053     buttonpressed = ''
   3054     buttontime = time.time()
   3055     holdbutton = ''
   3056     selected = 0
   3057     strenght = 0
   3058     r=0
   3059     g=0
   3060     b=0
   3061     header = 'Choose solarize'
   3062     menu =  'BACK','STRENGHT:','R:','G:','B:'
   3063     while True:
   3064         settings = '',str(strenght),str(r),str(g),str(b)
   3065         oldmenu=writemenu(menu,settings,selected,header,showmenu,oldmenu)
   3066         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   3067         if pressed == 'right':
   3068             if selected < (len(settings) - 1):
   3069                 selected = selected + 1
   3070             else:
   3071                 selected = 0
   3072             selected == 0
   3073         elif pressed == 'left':
   3074             if selected > 0:
   3075                 selected = selected - 1
   3076             else:
   3077                 selected = len(settings) - 1
   3078         elif pressed == 'up' and menu[selected] =='STRENGHT:':
   3079             if strenght < 128:
   3080                 strenght += 1
   3081         elif pressed == 'down' and menu[selected] =='STRENGHT:':
   3082             if strenght > 0:
   3083                 strenght -= 1
   3084         elif pressed == 'up' and menu[selected] =='R:':
   3085             if r < 128:
   3086                 r += 1
   3087         elif pressed == 'down' and menu[selected] =='R:':
   3088             if r > 0:
   3089                 r -= 1
   3090         elif pressed == 'up' and menu[selected] =='G:':
   3091             if g < 128:
   3092                 g += 1
   3093         elif pressed == 'down' and menu[selected] =='G:':
   3094             if g > 0:
   3095                 g -= 1
   3096         elif pressed == 'up' and menu[selected] =='B:':
   3097             if b < 128:
   3098                 b += 1
   3099         elif pressed == 'down' and menu[selected] =='B:':
   3100             if b > 0:
   3101                 b -= 1
   3102         elif pressed == 'middle' and menu[selected] != 'BACK':
   3103             camera.image_effect_params = r,g,b,strenght
   3104         elif pressed == 'middle' and menu[selected] == 'BACK':
   3105             return
   3106         time.sleep(keydelay)
   3107 
   3108 def film_settings():
   3109     global film_fps_options, film_reso_options, film_fps_selected, film_fps, film_reso, fps
   3110     oldmenu=''
   3111     pressed = ''
   3112     buttonpressed = ''
   3113     buttontime = time.time()
   3114     holdbutton = ''
   3115     selected = 1
   3116     film_reso_selected=0
   3117     film_fps_selected=1
   3118     header = 'Film settings'
   3119     menu =  'OK','FPS:','RESOLUTION:'
   3120     while True:
   3121         settings = '',str(film_fps_options[film_fps_selected]),film_reso_options[film_reso_selected]
   3122         oldmenu=writemenu(menu,settings,selected,header,showmenu,oldmenu)
   3123         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   3124         if pressed == 'right':
   3125             if selected < (len(settings) - 1):
   3126                 selected = selected + 1
   3127             else:
   3128                 selected = 0
   3129             selected == 0
   3130         elif pressed == 'left':
   3131             if selected > 0:
   3132                 selected = selected - 1
   3133             else:
   3134                 selected = len(settings) - 1
   3135         elif pressed == 'up' and menu[selected] =='FPS:':
   3136             if film_fps_selected < len(film_fps_options)-1:
   3137                 film_fps_selected += 1
   3138                 film_fps=int(film_fps_options[film_fps_selected])
   3139             else:
   3140                 film_fps_selected == len(film_fps_options)-1
   3141         elif pressed == 'down' and menu[selected] =='FPS:':
   3142             if film_fps_selected > 0:
   3143                 film_fps_selected -= 1
   3144                 film_fps=int(film_fps_options[film_fps_selected])
   3145         elif pressed == 'up' and menu[selected] =='RESOLUTION:':
   3146             if film_reso_selected < len(film_reso_options)-1:
   3147                 film_reso_selected += 1
   3148                 film_reso=film_reso_options[film_reso_selected]
   3149         elif pressed == 'down' and menu[selected] =='RESOLUTION:':
   3150             if film_reso_selected > 0:
   3151                 film_reso_selected -= 1
   3152                 film_reso=film_reso_options[film_reso_selected]
   3153         elif pressed == 'middle' and menu[selected]=='OK':
   3154             return film_reso, film_fps
   3155         time.sleep(keydelay)
   3156  
   3157 
   3158 #------------Run Command-------------
   3159 
   3160 def run_command(command_line):
   3161     #command_line_args = shlex.split(command_line)
   3162     logger.info('Running: "' + command_line + '"')
   3163     try:
   3164         p = subprocess.Popen(command_line, shell=True).wait()
   3165         # process_output is now a string, not a file,
   3166         # you may want to do:
   3167     except (OSError, CalledProcessError) as exception:
   3168         logger.warning('Exception occured: ' + str(exception))
   3169         logger.warning('Process failed')
   3170         return False
   3171     else:
   3172         # no exception was raised
   3173         logger.info('Process finished')
   3174     return True
   3175 
   3176 #-------------Display bakg-------------------
   3177 
   3178 def displaybakg(camera, filename, underlay, layer):
   3179     # Load the arbitrarily sized image
   3180     img = Image.open(filename)
   3181     # Create an image padded to the required size with
   3182     # mode 'RGB'
   3183     pad = Image.new('RGB', (
   3184         ((img.size[0] + 31) // 32) * 32,
   3185         ((img.size[1] + 15) // 16) * 16,
   3186         ))
   3187     # Paste the original image into the padded one
   3188     pad.paste(img, (0, 0))
   3189 
   3190     # Add the overlay with the padded image as the source,
   3191     # but the original image's dimensions
   3192     underlay = camera.add_overlay(pad.tobytes(), size=img.size)
   3193     # By default, the overlay is in layer 0, beneath the
   3194     # preview (which defaults to layer 2). Here we make
   3195     # the new overlay semi-transparent, then move it above
   3196     # the preview
   3197     underlay.alpha = 255
   3198     underlay.layer = layer
   3199 
   3200 #-------------Display jpeg-------------------
   3201 
   3202 def displayimage(camera, filename, overlay, layer):
   3203     # Load the arbitrarily sized image
   3204     try:
   3205         img = Image.open(filename)
   3206     except:
   3207         #writemessage('Seems like an empty shot. Hit record!')
   3208         overlay = removeimage(camera, overlay)
   3209         return overlay
   3210     camera.stop_preview()
   3211     # Create an image padded to the required size with
   3212     # mode 'RGB'
   3213     pad = Image.new('RGB', (
   3214         ((img.size[0] + 31) // 32) * 32,
   3215         ((img.size[1] + 15) // 16) * 16,
   3216         ))
   3217     # Paste the original image into the padded one
   3218     pad.paste(img, (0, 0))
   3219 
   3220     # Add the overlay with the padded image as the source,
   3221     # but the original image's dimensions
   3222     overlay = camera.add_overlay(pad.tobytes(), size=img.size)
   3223     # By default, the overlay is in layer 0, beneath the
   3224     # preview (which defaults to layer 2). Here we make
   3225     # the new overlay semi-transparent, then move it above
   3226     # the preview
   3227     overlay.alpha = 255
   3228     overlay.layer = layer
   3229     return overlay
   3230 
   3231 def removeimage(camera, overlay):
   3232     if overlay:
   3233         try:
   3234             camera.remove_overlay(overlay)
   3235             overlay = None
   3236             camera.start_preview()
   3237         except:
   3238             pass
   3239         return overlay
   3240 
   3241 
   3242 #-------------Browse------------------
   3243 
   3244 def browse(filmname, filmfolder, scene, shot, take):
   3245     scenes = countscenes(filmfolder, filmname)
   3246     shots = countshots(filmname, filmfolder, scene)
   3247     takes = counttakes(filmname, filmfolder, scene, shot)
   3248     return scenes, shots, takes
   3249 
   3250 #-------------Browse2.0------------------
   3251 
   3252 def browse2(filmname, filmfolder, scene, shot, take, n, b):
   3253     scenes = countscenes(filmfolder, filmname)
   3254     shots = countshots(filmname, filmfolder, scene)
   3255     takes = counttakes(filmname, filmfolder, scene, shot)
   3256     #writemessage(str(scene) + ' < ' + str(scenes))
   3257     #time.sleep(4)
   3258     selected = n
   3259     if selected == 0 and b == 1:
   3260         if scene < scenes + 1: #remove this if u want to select any scene
   3261             scene = scene + 1
   3262             shot = countshots(filmname, filmfolder, scene)
   3263             take = counttakes(filmname, filmfolder, scene, shot)
   3264             #if take == 0:
   3265                 #shot = shot - 1
   3266                 #take = counttakes(filmname, filmfolder, scene, shot - 1)
   3267     elif selected == 1 and b == 1:
   3268         if shot < shots + 1: #remove this if u want to select any shot
   3269             shot = shot + 1 
   3270             take = counttakes(filmname, filmfolder, scene, shot)
   3271     elif selected == 2 and b == 1:
   3272         if take < takes + 1:
   3273             take = take + 1 
   3274     elif selected == 0 and b == -1:
   3275         if scene > 1:
   3276             scene = scene - 1
   3277             shot = countshots(filmname, filmfolder, scene)
   3278             take = counttakes(filmname, filmfolder, scene, shot)
   3279             #if take == 0:
   3280             #    shot = shot - 1
   3281             #    take = counttakes(filmname, filmfolder, scene, shot - 1)
   3282     elif selected == 1 and b == -1:
   3283         if shot > 1:
   3284             shot = shot - 1
   3285             take = counttakes(filmname, filmfolder, scene, shot)
   3286     elif selected == 2 and b == -1:
   3287         if take > 1:
   3288             take = take - 1 
   3289     return scene, shot, take
   3290 
   3291 #-------------Update------------------
   3292 
   3293 def update(gonzopiversion, gonzopivername):
   3294     logger.info('Current version ' + gonzopiversion[:-1] + ' ' + gonzopivername[:-1])
   3295     time.sleep(2)
   3296     logger.info('Checking for updates...')
   3297     try:
   3298         run_command('wget -N https://raw.githubusercontent.com/rbckman/gonzopi/master/VERSION -P /tmp/')
   3299     except:
   3300         logger.info('Sorry buddy, no internet connection')
   3301         time.sleep(2)
   3302         return gonzopiversion, gonzopivername
   3303     try:
   3304         f = open('/tmp/VERSION')
   3305         versionnumber = f.readline()
   3306         versionname = f.readline()
   3307     except:
   3308         logger.info('hmm.. something wrong with the update')
   3309     if round(float(gonzopiversion),3) < round(float(versionnumber),3):
   3310         logger.info('New version found ' + versionnumber[:-1] + ' ' + versionname[:-1])
   3311         time.sleep(4)
   3312         logger.info('Updating...')
   3313         run_command('git -C ' + gonzopifolder + ' pull')
   3314         #run_command('sudo ' + gonzopifolder + '/install.sh')
   3315         logger.info('Update done, will now reboot Gonzopi')
   3316         waitforanykey()
   3317         logger.info('Hold on rebooting Gonzopi...')
   3318         run_command('sudo reboot')
   3319     logger.info('Version is up-to-date!')
   3320     return gonzopiversion, gonzopivername
   3321 
   3322 #-------------Get films---------------
   3323 
   3324 def getfilms(filmfolder):
   3325     #get a list of films, in order of settings.p file last modified
   3326     films_sorted = []
   3327     films = next(os.walk(filmfolder))[1]
   3328     if films == []:
   3329         return
   3330     for i in films:
   3331         if not '.videos' in i:
   3332             if os.path.isfile(filmfolder + i + '/' + 'settings.p') == True:
   3333                 lastupdate = os.path.getmtime(filmfolder + i + '/' + 'settings.p')
   3334                 films_sorted.append((i,lastupdate))
   3335             else:
   3336                 films_sorted.append((i,0))
   3337     films_sorted = sorted(films_sorted, key=lambda tup: tup[1], reverse=True)
   3338     logger.info('*-- Films --*')
   3339     for p in films_sorted:
   3340         logger.info(p[0])
   3341     return films_sorted
   3342 
   3343 #-------------Load gonzopi config---------------
   3344 
   3345 def getconfig(camera):
   3346     oldmenu=''
   3347     filmfolder=''
   3348     if camera != None:
   3349         version = camera.revision
   3350     else:
   3351         version = 'none'
   3352     home = os.path.expanduser('~')
   3353     configfile = home + '/.gonzopi/config.ini'
   3354     configdir = os.path.dirname(configfile)
   3355     if not os.path.isdir(configdir):
   3356         os.makedirs(configdir)
   3357     config = configparser.ConfigParser()
   3358     if config.read(configfile):
   3359         try:
   3360             camera_model = config['SENSOR']['model']
   3361         except:
   3362             logger.info("couldnt read config")
   3363         try:
   3364             camera_revision = config['SENSOR']['revision']
   3365         except:
   3366             logger.info("couldnt read config")
   3367         try:
   3368             filmfolder = config['USER']['filmfolder']
   3369             return camera_model, camera_revision, filmfolder+'/'
   3370         except:
   3371             logger.info("couldnt read config")
   3372     if version == 'none':
   3373         config['SENSOR'] = {}
   3374         config['SENSOR']['model'] = version
   3375         config['SENSOR']['revision'] = 'none'
   3376         with open(configfile, 'w') as f:
   3377             config.write(f)
   3378         camera_model = version
   3379         camera_revision = 'none'
   3380     elif version == 'imx219':
   3381         config['SENSOR'] = {}
   3382         config['SENSOR']['model'] = version
   3383         config['SENSOR']['revision'] = 'standard'
   3384         with open(configfile, 'w') as f:
   3385             config.write(f)
   3386         camera_model = version
   3387         camera_revision = 'standard'
   3388     elif version == 'imx477':
   3389         config['SENSOR'] = {}
   3390         config['SENSOR']['model'] = version
   3391         config['SENSOR']['revision'] = 'hq-camera'
   3392         camera_model = version
   3393         camera_revision = 'hq-camera'
   3394         with open(configfile, 'w') as f:
   3395             config.write(f)
   3396     else:
   3397         pressed = ''
   3398         buttonpressed = ''
   3399         buttontime = time.time()
   3400         holdbutton = ''
   3401         selected = 0
   3402         header = 'What revision of ' + version + ' sensor are you using?'
   3403         menu = 'rev.C', 'rev.D', 'hq-camera'
   3404         while True:
   3405             settings = '', '', ''
   3406             oldmenu=writemenu(menu,settings,selected,header,showmenu,oldmenu)
   3407             pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   3408             if pressed == 'right':
   3409                 if selected < (len(settings) - 1):
   3410                     selected = selected + 1
   3411             elif pressed == 'left':
   3412                 if selected > 0:
   3413                     selected = selected - 1
   3414             elif pressed == 'middle':
   3415                 camera_model = version
   3416                 camera_revision = menu[selected]
   3417                 config['SENSOR'] = {}
   3418                 config['SENSOR']['model'] = camera_model
   3419                 config['SENSOR']['revision'] = camera_revision
   3420                 with open(configfile, 'w') as f:
   3421                     config.write(f)
   3422             time.sleep(0.02)
   3423 
   3424     return version, camera_revision, home+'/gonzopifilms/'
   3425     #if filmfolder != '':
   3426     #    return version, camera_revision, filmfolder+'/'
   3427     #else:
   3428     #    filmfolder = namesomething('Your film folder: ', home+'/Videos')
   3429     #    config['USER'] = {}
   3430     #    config['USER']['filmfolder'] = filmfolder
   3431     #    with open(configfile, 'w') as f:
   3432     #        config.write(f)
   3433     #    return camera_model, camera_revision, filmfolder+'/'
   3434 
   3435 #-------------Calc folder size with du-----------
   3436 
   3437 def du(path):
   3438     """disk usage in human readable format (e.g. '2,1GB')"""
   3439     return subprocess.check_output(['du','-sh', path]).split()[0].decode('utf-8')
   3440 
   3441 
   3442 #------------Clean up----------------
   3443 
   3444 def cleanupdisk(filmname, filmfolder):
   3445     alloriginfiles=[]
   3446     films = getfilms(filmfolder)
   3447     for f in films:
   3448         alloriginfiles.extend(organize(filmfolder,f[0]))
   3449     print(alloriginfiles)
   3450     filesinfolder = next(os.walk(filmfolder+'.videos/'))[2]
   3451     filesfolder=[]
   3452     for i in filesinfolder:
   3453         filesfolder.append(filmfolder+'.videos/'+i)
   3454     print(filesfolder)
   3455     for i in alloriginfiles:
   3456         if i in filesfolder:
   3457             print("YES, found link to origin")
   3458         else:
   3459             print("NOPE, no link to origin")
   3460             print(i)
   3461             time.sleep(2)
   3462             #os.system('rm ' + i)
   3463     #for i in filesfolder:
   3464     #    if i in alloriginfiles:
   3465     #        print("YES, found link to origin")
   3466     #    else:
   3467     #        print("NOPE, no link to origin")
   3468     #        print(i)
   3469     #        os.system('rm ' + i)
   3470 
   3471 #-------------Load film---------------
   3472 
   3473 def loadfilm(filmname, filmfolder, camera, overlay):
   3474     global film_fps_options, film_reso_options, film_fps_selected, film_reso_selected, film_fps, film_reso, lens, fps
   3475     writemessage('Loading films...')
   3476     oldmenu=''
   3477     pressed = ''
   3478     buttonpressed = ''
   3479     buttontime = time.time()
   3480     holdbutton = ''
   3481     films = getfilms(filmfolder)
   3482     #filmsize=[]
   3483     #for f in films:
   3484     #    filmsize.append(du(filmfolder+f[0]))
   3485     filmstotal = len(films[1:])
   3486     selectedfilm = 0
   3487     selected = 0
   3488     header = 'Up and down to select and load film'
   3489     menu = 'FILM:', 'BACK', 'NEW FILM'
   3490     while True:
   3491         settings = films[selectedfilm][0], '', ''
   3492         oldmenu=writemenu(menu,settings,selected,header,showmenu,oldmenu)
   3493         vumetermessage('date: '+time.strftime('%Y-%m-%d %H:%M:%S',time.gmtime(films[selectedfilm][1])))
   3494         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   3495         if pressed == 'down':
   3496             if selectedfilm < filmstotal:
   3497                 selectedfilm = selectedfilm + 1
   3498                 p = counttakes(films[selectedfilm][0], filmfolder, 1, 1)
   3499                 overlay = removeimage(camera, overlay)
   3500                 imagename = filmfolder + films[selectedfilm][0] + '/scene' + str(1).zfill(3) + '/shot' + str(1).zfill(3) + '/take' + str(p).zfill(3) + '.jpeg'
   3501                 overlay = displayimage(camera, imagename, overlay, 3)
   3502         elif pressed == 'up':
   3503             if selectedfilm > 0:
   3504                 selectedfilm = selectedfilm - 1
   3505                 p = counttakes(films[selectedfilm][0], filmfolder, 1, 1)
   3506                 overlay = removeimage(camera, overlay)
   3507                 imagename = filmfolder + films[selectedfilm][0] + '/scene' + str(1).zfill(3) + '/shot' + str(1).zfill(3) + '/take' + str(p).zfill(3) + '.jpeg'
   3508                 overlay = displayimage(camera, imagename, overlay, 3)
   3509         elif pressed == 'right':
   3510             if selected < (len(settings) - 1):
   3511                 selected = selected + 1
   3512         elif pressed == 'left':
   3513             if selected > 0:
   3514                 selected = selected - 1
   3515         elif pressed == 'middle' and menu[selected] == 'FILM:':
   3516             overlay = removeimage(camera, overlay)
   3517             filmname = films[selectedfilm][0]
   3518             return camera, filmname
   3519         elif pressed == 'middle' and menu[selected] == 'BACK':
   3520             overlay = removeimage(camera, overlay)
   3521             writemessage('Returning')
   3522             return camera, filmname
   3523         elif pressed == 'middle' and menu[selected] == 'NEW FILM':
   3524             overlay = removeimage(camera, overlay)
   3525             newfilm=nameyourfilm(filmfolder, filmname, abc, True)
   3526             #film_reso, film_fps = film_settings()
   3527             #camera.stop_preview()
   3528             #camera.close()
   3529             #camera = startcamera(lens,fps)
   3530             writemessage('Returning')
   3531             return camera, newfilm
   3532         time.sleep(0.02)
   3533 
   3534 def slide_menu(slidecommander):
   3535     global pan, tilt, move, speed, slidereader, smooth
   3536     if not slidereader:
   3537         slidereader = Popen(['python3', gonzopifolder+'/extras/slidereader.py'])
   3538         #slidereader = subprocess.check_output(['python3',gonzopifolder+'/extras/slidereader.py'], shell=True)
   3539         #slidereader = pipe.decode().strip()
   3540         #vumetermessage(slidereader)
   3541     pressed = ''
   3542     buttonpressed = ''
   3543     buttontime = time.time()
   3544     holdbutton = ''
   3545     selected = 0
   3546     header = 'Future Tech Slide Commander'
   3547     menu =  'BACK','SPEED:', 'SMOOTH:', 'PAN:', 'TILT:', 'MOVE:', 'ADD', '<', '>', 'SAVE', 'RESET', 'STATUS'
   3548     oldmenu=''
   3549     while True:
   3550         settings = '',str(speed), str(smooth), str(pan), str(tilt), str(move), '', '', '' , '', '', ''
   3551         oldmenu=writemenu(menu,settings,selected,header,showmenu,oldmenu)
   3552         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   3553         if pressed == 'down' and menu[selected] == 'SPEED:':
   3554             if speed > 10:
   3555                 speed -= 10
   3556         elif pressed == 'remove' and menu[selected] =='SPEED:':
   3557             speed += 1
   3558         elif pressed == 'view' and menu[selected] =='SPEED:':
   3559             speed -= 1
   3560         elif pressed == 'up' and menu[selected] =='SPEED:':
   3561             speed += 10
   3562         elif pressed == 'down' and menu[selected] =='SPEED:':
   3563             speed -= 10
   3564         elif pressed == 'record' and menu[selected] =='SPEED:':
   3565             speed += 100
   3566         elif pressed == 'retake' and menu[selected] =='SPEED:':
   3567             speed -= 100
   3568         elif pressed == 'down' and menu[selected] == 'SMOOTH:':
   3569             if smooth > 10:
   3570                 smooth -= 10
   3571         elif pressed == 'remove' and menu[selected] =='SMOOTH:':
   3572             smooth += 1
   3573         elif pressed == 'view' and menu[selected] =='SMOOTH:':
   3574             smooth -= 1
   3575         elif pressed == 'up' and menu[selected] =='SMOOTH:':
   3576             smooth += 10
   3577         elif pressed == 'down' and menu[selected] =='SMOOTH:':
   3578             smooth -= 10
   3579         elif pressed == 'record' and menu[selected] =='SMOOTH:':
   3580             smooth += 100
   3581         elif pressed == 'retake' and menu[selected] =='SMOOTH:':
   3582             smooth -= 100
   3583         elif pressed == 'up' and menu[selected] =='PAN:':
   3584             pan += 10
   3585         elif pressed == 'down' and menu[selected] =='PAN:':
   3586             pan -= 10
   3587         elif pressed == 'view' and menu[selected] =='PAN:':
   3588             pan -= 1
   3589         elif pressed == 'remove' and menu[selected] =='PAN:':
   3590             pan += 1
   3591         elif pressed == 'retake' and menu[selected] =='PAN:':
   3592             pan -= 100
   3593         elif pressed == 'record' and menu[selected] =='PAN:':
   3594             pan += 100
   3595         elif pressed == 'view' and menu[selected] =='TILT:':
   3596             tilt += 1
   3597         elif pressed == 'remove' and menu[selected] =='TILT:':
   3598             tilt -= 1
   3599         elif pressed == 'up' and menu[selected] =='TILT:':
   3600             tilt += 10
   3601         elif pressed == 'down' and menu[selected] =='TILT:':
   3602             tilt -= 10
   3603         elif pressed == 'retake' and menu[selected] =='TILT:':
   3604             tilt -= 100
   3605         elif pressed == 'record' and menu[selected] =='TILT:':
   3606             tilt += 100
   3607         elif pressed == 'remove' and menu[selected] =='MOVE:':
   3608             move += 1
   3609         elif pressed == 'view' and menu[selected] =='MOVE:':
   3610             move -= 1
   3611         elif pressed == 'up' and menu[selected] =='MOVE:':
   3612             move += 10
   3613         elif pressed == 'down' and menu[selected] =='MOVE:':
   3614             move -= 10
   3615         elif pressed == 'record' and menu[selected] =='MOVE:':
   3616             move += 100
   3617         elif pressed == 'retake' and menu[selected] =='MOVE:':
   3618             move -= 100
   3619         elif pressed == 'right':
   3620             if selected < (len(settings) - 1):
   3621                 selected = selected + 1
   3622             else:
   3623                 selected = 0
   3624             selected == 0
   3625         elif pressed == 'left':
   3626             if selected > 0:
   3627                 selected = selected - 1
   3628             else:
   3629                 selected = len(settings)-1
   3630         elif pressed == 'middle' and menu[selected] == 'PAN:':
   3631             send_serial_port(slidecommander,'p'+str(pan))
   3632         elif pressed == 'middle' and menu[selected] == 'TILT:':
   3633             send_serial_port(slidecommander,'t'+str(tilt))
   3634         elif pressed == 'middle' and menu[selected] == 'MOVE:':
   3635             send_serial_port(slidecommander,'x'+str(move))
   3636         elif pressed == 'middle' and menu[selected] == 'ADD':
   3637             send_serial_port(slidecommander,'#')
   3638         elif pressed == 'record' and menu[selected] == 'ADD':
   3639             return
   3640         elif pressed == 'middle' and menu[selected] == '<':
   3641             send_serial_port(slidecommander,'<')
   3642         elif pressed == 'middle' and menu[selected] == '>':
   3643             send_serial_port(slidecommander,'>')
   3644         elif pressed == 'middle' and menu[selected] == 'SPEED:':
   3645             send_serial_port(slidecommander,'s'+str(speed))
   3646             time.sleep(0.3)
   3647             send_serial_port(slidecommander,'S'+str(speed))
   3648             time.sleep(0.3)
   3649             send_serial_port(slidecommander,'X'+str(speed))
   3650         elif pressed == 'middle' and menu[selected] == 'SMOOTH:':
   3651             send_serial_port(slidecommander,'q'+str(smooth))
   3652             time.sleep(0.3)
   3653             send_serial_port(slidecommander,'Q'+str(smooth))
   3654             time.sleep(0.3)
   3655             send_serial_port(slidecommander,'w'+str(smooth))
   3656         elif pressed == 'middle' and menu[selected] == 'BACK':
   3657             writemessage('Returning')
   3658             return
   3659         elif pressed == 'remove' and menu[selected] == 'ADD':
   3660             send_serial_port(slidecommander,'C')
   3661         elif pressed == 'retake' and menu[selected] == 'ADD':
   3662             send_serial_port(slidecommander,'E')
   3663         elif pressed == 'view' and menu[selected] == 'ADD':
   3664             #send_serial_port(slidecommander,'d'+str(speed))
   3665             send_serial_port(slidecommander,'D'+str(speed))
   3666         elif pressed == 'middle' and menu[selected] == 'STATUS':
   3667             send_serial_port(slidecommander,'R')
   3668         elif pressed == 'middle' and menu[selected] == 'SAVE':
   3669             send_serial_port(slidecommander,'U')
   3670         elif pressed == 'middle' and menu[selected] == 'RESET':
   3671             os.system('pkill -9 slidereader.py')
   3672             if slidereader.poll():
   3673                 slidereader.kill()
   3674                 slidereader = Popen(['python3', gonzopifolder+'/extras/slidereader.py'])
   3675             time.sleep(1)
   3676             pan = 0
   3677             tilt = 0
   3678             move = 0
   3679         time.sleep(keydelay)
   3680 
   3681 
   3682 ### send to SERIAL PORT
   3683 
   3684 def send_serial_port(serial_port,msg):
   3685     baud_rate = 57600       # Set the baud rate according to your device
   3686     # Create a serial connection
   3687     try:
   3688         ser = serial.Serial(serial_port, baud_rate, timeout=1)
   3689         print(f"Connected to {serial_port} at {baud_rate} baud.")
   3690     except serial.SerialException as e:
   3691         print(f"Error: {e}")
   3692         exit()
   3693     # Write data to the serial port
   3694     data_to_send = msg  # Add a newline if needed
   3695     try:
   3696         ser.write(data_to_send.encode('utf-8'))  # Encode the string to bytes
   3697         print(f"Sent: {data_to_send.strip()}")
   3698     except Exception as e:
   3699         print(f"Error while sending data: {e}")
   3700 
   3701 #---------Name anything really-----------
   3702 
   3703 def namesomething(what, readymadeinput):
   3704     global abc
   3705     anything = readymadeinput
   3706     pressed = ''
   3707     buttonpressed = ''
   3708     buttontime = time.time()
   3709     holdbutton = ''
   3710     abcx = 0
   3711     helpmessage = 'Up, Down (select characters) Right (next). Middle (done)'
   3712     cursor = '_'
   3713     blinking = True
   3714     pausetime = time.time()
   3715     while True:
   3716         message = what + anything
   3717         print(term.clear+term.home)
   3718         print(message+cursor)
   3719         writemessage(message + cursor)
   3720         vumetermessage(helpmessage)
   3721         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   3722         if event == ' ':
   3723             event = '_'
   3724         if pressed == 'down':
   3725             pausetime = time.time()
   3726             if abcx < (len(abc) - 1):
   3727                 abcx = abcx + 1
   3728                 cursor = abc[abcx]
   3729         elif pressed == 'up':
   3730             pausetime = time.time()
   3731             if abcx > 0:
   3732                 abcx = abcx - 1
   3733                 cursor = abc[abcx]
   3734         elif pressed == 'right':
   3735             pausetime = time.time()
   3736             if len(anything) < 30:
   3737                 anything = anything + abc[abcx]
   3738                 cursor = abc[abcx]
   3739             else:
   3740                 helpmessage = 'Yo, maximum characters reached bro!'
   3741         elif pressed == 'left' or pressed == 'remove':
   3742             pausetime = time.time()
   3743             if len(anything) > 0:
   3744                 anything = anything[:-1]
   3745                 cursor = abc[abcx]
   3746         elif pressed == 'middle' or event == 10:
   3747             if len(anything) > 0:
   3748                 if abc[abcx] != '_':
   3749                     anything = anything + abc[abcx]
   3750                 return anything
   3751         elif event in abc:
   3752             pausetime = time.time()
   3753             anything = anything + event
   3754         if time.time() - pausetime > 0.5:
   3755             if blinking == True:
   3756                 cursor = abc[abcx]
   3757             if blinking == False:
   3758                 cursor = ' '
   3759             blinking = not blinking
   3760             pausetime = time.time()
   3761         time.sleep(keydelay)
   3762 
   3763 
   3764 #-------------New film----------------
   3765 
   3766 def nameyourfilm(filmfolder, filmname, abc, newfilm):
   3767     filmcount=len(getfilms(filmfolder))
   3768     oldfilmname = filmname
   3769     filmname = 'reel_'+str(filmcount+1).zfill(3)
   3770     #if newfilm == True:
   3771     #    filmname = ''
   3772     pressed = ''
   3773     buttonpressed = ''
   3774     buttontime = time.time()
   3775     holdbutton = ''
   3776     abcx = 0
   3777     helpmessage = 'Left (remove), Up, Down (select characters) Right (next). Middle (done), Retake (Cancel)'
   3778     vumetermessage('Press enter if you want to leave it untitled')
   3779     cursor = '_'
   3780     blinking = True
   3781     pausetime = time.time()
   3782     while True:
   3783         if newfilm == True:
   3784             message = 'New film name: ' + filmname
   3785         else:
   3786             message = 'Edit film name: ' + filmname
   3787         print(term.clear+term.home)
   3788         print(message+cursor)
   3789         print(helpmessage)
   3790         writemessage(message + cursor)
   3791         vumetermessage(helpmessage)
   3792         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   3793         if event == ' ':
   3794             event = '_'
   3795         if pressed == 'down':
   3796             pausetime = time.time()
   3797             if abcx < (len(abc) - 1):
   3798                 abcx = abcx + 1
   3799                 cursor = abc[abcx]
   3800         elif pressed == 'up':
   3801             pausetime = time.time()
   3802             if abcx > 0:
   3803                 abcx = abcx - 1
   3804                 cursor = abc[abcx]
   3805         elif pressed == 'right':
   3806             pausetime = time.time()
   3807             if len(filmname) < 30:
   3808                 filmname = filmname + abc[abcx]
   3809                 cursor = abc[abcx]
   3810             else:
   3811                 helpmessage = 'Yo, maximum characters reached bro!'
   3812         elif pressed == 'left' or pressed == 'remove':
   3813             pausetime = time.time()
   3814             if len(filmname) > 0:
   3815                 filmname = filmname[:-1]
   3816                 cursor = abc[abcx]
   3817         elif pressed == 'middle' or event == 10:
   3818             if filmname == '':
   3819                 filmname='untitledfilm'
   3820             if len(filmname) > 0:
   3821                 if abc[abcx] != '_':
   3822                     filmname = filmname + abc[abcx]
   3823                 try:
   3824                     if filmname == oldfilmname:
   3825                         return oldfilmname
   3826                     elif filmname in getfilms(filmfolder)[0]:
   3827                         helpmessage = 'this filmname is already taken! make a sequel!'
   3828                         filmname = filmname+'2'
   3829                     elif '_archive' in filmname:
   3830                         helpmessage = 'the filmname cant be named as an archive.'
   3831                     elif filmname not in getfilms(filmfolder)[0]:
   3832                         logger.info("New film " + filmname)
   3833                         return filmname
   3834                 except:
   3835                     logger.info("New film " + filmname)
   3836                     return filmname
   3837         elif pressed == 'retake':
   3838             return oldfilmname
   3839         elif event in abc:
   3840             pausetime = time.time()
   3841             filmname = filmname + event
   3842         if time.time() - pausetime > 0.5:
   3843             if blinking == True:
   3844                 cursor = abc[abcx]
   3845             if blinking == False:
   3846                 cursor = ' '
   3847             blinking = not blinking
   3848             pausetime = time.time()
   3849         time.sleep(keydelay)
   3850 
   3851 
   3852 #-------------set bitrate----------------
   3853 
   3854 def get_bitrate(abc, bitrate):
   3855     pressed = ''
   3856     buttonpressed = ''
   3857     buttontime = time.time()
   3858     holdbutton = ''
   3859     abcx = 0
   3860     helpmessage = 'Up, Down (select bitrate) Right (next). Middle (done), Retake (Cancel)'
   3861     cursor = '_'
   3862     blinking = True
   3863     pausetime = time.time()
   3864     menuinput=str(bitrate)
   3865     while True:
   3866         message = 'New bitrate: ' + menuinput
   3867         print(term.clear+term.home)
   3868         print(message+cursor)
   3869         writemessage(message + cursor)
   3870         vumetermessage(helpmessage)
   3871         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   3872         if event == ' ':
   3873             event = '_'
   3874         if pressed == 'down':
   3875             pausetime = time.time()
   3876             if abcx < (len(abc) - 1):
   3877                 abcx = abcx + 1
   3878                 cursor = abc[abcx]
   3879         elif pressed == 'up':
   3880             pausetime = time.time()
   3881             if abcx > 0:
   3882                 abcx = abcx - 1
   3883                 cursor = abc[abcx]
   3884         elif pressed == 'right' and abcx != 0:
   3885             pausetime = time.time()
   3886             if len(menuinput) < 7:
   3887                 menuinput = menuinput + abc[abcx]
   3888                 cursor = abc[abcx]
   3889             else:
   3890                 helpmessage = 'Yo, maximum bitrate reached bro!'
   3891         elif pressed == 'left' or pressed == 'remove':
   3892             pausetime = time.time()
   3893             if len(menuinput) > 0:
   3894                 menuinput = menuinput[:-1]
   3895                 cursor = abc[abcx]
   3896         elif pressed == 'middle' or event == 10:
   3897             if abc[abcx] != ' ' or menuinput != '':
   3898                 menuinput = menuinput + abc[abcx]
   3899                 if int(menuinput) < 25000001:
   3900                     logger.info("New bitrate " + menuinput)
   3901                     bitrate = int(menuinput)
   3902                     return bitrate
   3903                     break
   3904                 else:
   3905                     helpmessage = 'in the range of bitrate 1-25000000'
   3906         elif pressed == 'retake':
   3907             return '' 
   3908         elif event in abc:
   3909             pausetime = time.time()
   3910             menuinput = menuinput + event
   3911         if time.time() - pausetime > 0.5:
   3912             if blinking == True:
   3913                 cursor = abc[abcx]
   3914             if blinking == False:
   3915                 cursor = ' '
   3916             blinking = not blinking
   3917             pausetime = time.time()
   3918         time.sleep(keydelay)
   3919 
   3920 
   3921 #-------------New udp Stream host----------------
   3922 
   3923 def newudp_ip(abc, network):
   3924     pressed = ''
   3925     buttonpressed = ''
   3926     buttontime = time.time()
   3927     holdbutton = ''
   3928     abcx = 0
   3929     helpmessage = 'Up, Down (select characters) Right (next). Middle (done), Retake (Cancel)'
   3930     cursor = '_'
   3931     blinking = True
   3932     pausetime = time.time()
   3933     ip_network = network.split('.')[:-1]
   3934     ip_network = '.'.join(ip_network)+'.'
   3935     ip = ''
   3936     port=8000
   3937     while True:
   3938         message = 'Host ip and port: ' + ip_network + ip
   3939         print(term.clear+term.home)
   3940         print(message+cursor)
   3941         writemessage(message + cursor)
   3942         vumetermessage(helpmessage)
   3943         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   3944         if event == ' ':
   3945             event = '_'
   3946         if pressed == 'down':
   3947             pausetime = time.time()
   3948             if abcx < (len(abc) - 1):
   3949                 abcx = abcx + 1
   3950                 cursor = abc[abcx]
   3951         elif pressed == 'up':
   3952             pausetime = time.time()
   3953             if abcx > 0:
   3954                 abcx = abcx - 1
   3955                 cursor = abc[abcx]
   3956         elif pressed == 'right':
   3957             pausetime = time.time()
   3958             if len(ip) < 2:
   3959                 ip = ip + abc[abcx]
   3960                 cursor = abc[abcx]
   3961             else:
   3962                 helpmessage = 'Yo, maximum ip reached bro!'
   3963         elif pressed == 'left' or pressed == 'remove':
   3964             pausetime = time.time()
   3965             if len(ip) > 0:
   3966                 ip = ip[:-1]
   3967                 cursor = abc[abcx]
   3968         elif pressed == 'middle' or event == 10:
   3969             if abc[abcx] != ' ' or ip != '':
   3970                 ip = ip + abc[abcx]
   3971                 if int(ip) < 256:
   3972                     logger.info("New host " + ip_network+ip)
   3973                     newhost = (ip_network+ip).strip()
   3974                     break
   3975                 else:
   3976                     helpmessage = 'in the range of ips 1-256'
   3977         elif pressed == 'retake':
   3978             return '' 
   3979         elif event in abc:
   3980             pausetime = time.time()
   3981             ip = ip + event
   3982         if time.time() - pausetime > 0.5:
   3983             if blinking == True:
   3984                 cursor = abc[abcx]
   3985             if blinking == False:
   3986                 cursor = ' '
   3987             blinking = not blinking
   3988             pausetime = time.time()
   3989         time.sleep(keydelay)
   3990     ip='800'
   3991     abcx=1
   3992     while True:
   3993         message = 'Host ip and port: ' + newhost + ': ' + ip
   3994         print(term.clear+term.home)
   3995         print(message+cursor)
   3996         writemessage(message + cursor)
   3997         vumetermessage(helpmessage)
   3998         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   3999         if event == ' ':
   4000             event = '_'
   4001         if pressed == 'down':
   4002             pausetime = time.time()
   4003             if abcx < (len(abc) - 1):
   4004                 abcx = abcx + 1
   4005                 cursor = abc[abcx]
   4006         elif pressed == 'up':
   4007             pausetime = time.time()
   4008             if abcx > 0:
   4009                 abcx = abcx - 1
   4010                 cursor = abc[abcx]
   4011         elif pressed == 'right':
   4012             pausetime = time.time()
   4013             if len(ip) < 4:
   4014                 ip = ip + abc[abcx]
   4015                 cursor = abc[abcx]
   4016             else:
   4017                 helpmessage = 'Yo, maximum ip reached bro!'
   4018         elif pressed == 'left' or pressed == 'remove':
   4019             pausetime = time.time()
   4020             if len(ip) > 0:
   4021                 ip = ip[:-1]
   4022                 cursor = abc[abcx]
   4023         elif pressed == 'middle' or event == 10:
   4024             if abc[abcx] != ' ' or ip != '':
   4025                 ip = ip + abc[abcx]
   4026                 if int(ip) < 8256:
   4027                     logger.info("New port " +ip)
   4028                     return newhost, (ip).strip()
   4029                 else:
   4030                     helpmessage = 'in the range of ips 1-256'
   4031         elif pressed == 'retake':
   4032             return '' 
   4033         elif event in abc:
   4034             pausetime = time.time()
   4035             ip = ip + event
   4036         if time.time() - pausetime > 0.5:
   4037             if blinking == True:
   4038                 cursor = abc[abcx]
   4039             if blinking == False:
   4040                 cursor = ' '
   4041             blinking = not blinking
   4042             pausetime = time.time()
   4043         time.sleep(keydelay)
   4044 
   4045 #-------------New camera----------------
   4046 
   4047 def newcamera_ip(abc, network):
   4048     pressed = ''
   4049     buttonpressed = ''
   4050     buttontime = time.time()
   4051     holdbutton = ''
   4052     abcx = 0
   4053     helpmessage = 'Up, Down (select characters) Right (next). Middle (done), Retake (Cancel)'
   4054     cursor = '_'
   4055     blinking = True
   4056     pausetime = time.time()
   4057     ip_network = network.split('.')[:-1]
   4058     ip_network = '.'.join(ip_network)+'.'
   4059     ip = ''
   4060     while True:
   4061         message = 'Camera ip: ' + ip_network + ip
   4062         print(term.clear+term.home)
   4063         print(message+cursor)
   4064         writemessage(message + cursor)
   4065         vumetermessage(helpmessage)
   4066         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   4067         if event == ' ':
   4068             event = '_'
   4069         if pressed == 'down':
   4070             pausetime = time.time()
   4071             if abcx < (len(abc) - 1):
   4072                 abcx = abcx + 1
   4073                 cursor = abc[abcx]
   4074         elif pressed == 'up':
   4075             pausetime = time.time()
   4076             if abcx > 0:
   4077                 abcx = abcx - 1
   4078                 cursor = abc[abcx]
   4079         elif pressed == 'right':
   4080             pausetime = time.time()
   4081             if len(ip) < 2:
   4082                 ip = ip + abc[abcx]
   4083                 cursor = abc[abcx]
   4084             else:
   4085                 helpmessage = 'Yo, maximum ip reached bro!'
   4086         elif pressed == 'left' or pressed == 'remove':
   4087             pausetime = time.time()
   4088             if len(ip) > 0:
   4089                 ip = ip[:-1]
   4090                 cursor = abc[abcx]
   4091         elif pressed == 'middle' or event == 10:
   4092             if abc[abcx] != ' ' or ip != '':
   4093                 ip = ip + abc[abcx]
   4094                 if int(ip) < 256:
   4095                     logger.info("New camera " + ip_network+ip)
   4096                     return (ip_network+ip).strip()
   4097                 else:
   4098                     helpmessage = 'in the range of ips 1-256'
   4099         elif pressed == 'retake':
   4100             return '' 
   4101         elif event in abc:
   4102             pausetime = time.time()
   4103             ip = ip + event
   4104         if time.time() - pausetime > 0.5:
   4105             if blinking == True:
   4106                 cursor = abc[abcx]
   4107             if blinking == False:
   4108                 cursor = ' '
   4109             blinking = not blinking
   4110             pausetime = time.time()
   4111         time.sleep(keydelay)
   4112 
   4113 #------------Timelapse--------------------------
   4114 
   4115 def timelapse(beeps,camera,filmname,foldername,filename,between,duration,backlight):
   4116     global fps, soundrate, channels, bitrate, muxing, db, quality
   4117     pressed = ''
   4118     buttonpressed = ''
   4119     buttontime = time.time()
   4120     holdbutton = ''
   4121     sound = False
   4122     selected = 0
   4123     header = 'Adjust delay in seconds between videos'
   4124     menu = 'DELAY:', 'DURATION:', 'SOUND:', 'START', 'BACK'
   4125     oldmenu=''
   4126     while True:
   4127         settings = str(round(between,2)), str(round(duration,2)), str(sound), '', ''
   4128         oldmenu=writemenu(menu,settings,selected,header,showmenu,oldmenu)
   4129         seconds = (3600 / between) * duration
   4130         vumetermessage('1 h timelapse filming equals ' + str(round(seconds,2)) + ' second clip   ')
   4131         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   4132         if pressed == 'up' and menu[selected] == 'DELAY:':
   4133             between = between + 1
   4134         elif pressed == 'down' and menu[selected] == 'DELAY:':
   4135             if between > 1:
   4136                 between = between - 1
   4137         if pressed == 'up' and menu[selected] == 'SOUND:':
   4138             sound = True
   4139         elif pressed == 'down' and menu[selected] == 'SOUND:':
   4140             sound = False
   4141         elif pressed == 'up' and menu[selected] == 'DURATION:':
   4142             duration = duration + 0.1
   4143         elif pressed == 'down' and menu[selected] == 'DURATION:':
   4144             if duration > 0.3:
   4145                 duration = duration - 0.1
   4146         elif pressed == 'up' or pressed == 'down' and menu[selected] == 'SOUND:':
   4147             if sound == False:
   4148                 sound == True
   4149             if sound == True:
   4150                 sound == False
   4151         elif pressed == 'right':
   4152             if selected < (len(settings) - 1):
   4153                 selected = selected + 1
   4154         elif pressed == 'left':
   4155             if selected > 0:
   4156                 selected = selected - 1
   4157         elif pressed == 'middle':
   4158             if menu[selected] == 'START':
   4159                 if os.path.isdir(foldername+'timelapse') == False:
   4160                     os.makedirs(foldername + 'timelapse')
   4161                 time.sleep(0.02)
   4162                 writemessage('Recording timelapse, middlebutton to stop')
   4163                 n = 1
   4164                 recording = False
   4165                 starttime = time.time()
   4166                 t = 0
   4167                 files = []
   4168                 while True:
   4169                     t = time.time() - starttime
   4170                     pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   4171                     vumetermessage('Timelapse length is now ' + str(round(n * duration,2)) + ' second clip   ')
   4172                     if recording == False and t > between:
   4173                         if beeps > 0:
   4174                             if bus:
   4175                                 buzz(150)
   4176                             else:
   4177                                 run_command('aplay -D plughw:' + str(plughw) + ' '+ gonzopifolder + '/extras/beep.wav')
   4178                         #camera.start_recording(foldername + 'timelapse/' + filename + '_' + str(n).zfill(3) + '.h264', format='h264', quality=26, bitrate=5000000)
   4179                         camera.start_recording(foldername + 'timelapse/' + filename + '_' + str(n).zfill(3) + '.h264', format='h264', quality=quality, level=profilelevel, intra_period=5)
   4180                         if sound == True:
   4181                             os.system(gonzopifolder+'/alsa-utils-1.1.3/aplay/arecord -D hw:'+str(plughw)+' -f '+soundformat+' -c '+str(channels)+' -r '+soundrate+' -vv '+foldername+'timelapse/'+filename+'_'+str(n).zfill(3)+'.wav &')
   4182                         files.append(foldername + 'timelapse/' + filename + '_' + str(n).zfill(3))
   4183                         starttime = time.time()
   4184                         recording = True
   4185                         n = n + 1
   4186                         t = 0
   4187                     if recording == True:
   4188                         writemessage('Recording timelapse ' + str(n) + ' ' + 'time:' + str(round(t,2)))
   4189                     if recording == False:
   4190                         writemessage('Between timelapse ' + str(n) + ' ' + 'time:' + str(round(t,2)))
   4191                     if t > duration and recording == True:
   4192                         if sound == True:
   4193                             os.system('pkill arecord')
   4194                         camera.stop_recording()
   4195                         recording = False
   4196                         starttime = time.time()
   4197                         t = 0
   4198                     if pressed == 'screen':
   4199                         if backlight == False:
   4200                             # requires wiringpi installed
   4201                             run_command('gpio -g pwm 19 1023')
   4202                             backlight = True
   4203                         elif backlight == True:
   4204                             run_command('gpio -g pwm 19 0')
   4205                             backlight = False
   4206                     elif pressed == 'middle' and n > 1:
   4207                         if recording == True:
   4208                             os.system('pkill arecord')
   4209                             camera.stop_recording()
   4210                         #create thumbnail
   4211                         try:
   4212                             if film_reso == '1920x1080':
   4213                                 camera.capture(foldername + filename + '.jpeg', resize=(800,450), use_video_port=True)
   4214                             elif film_reso == '1920x816':
   4215                                 camera.capture(foldername + filename + '.jpeg', resize=(800,340), use_video_port=True)
   4216                         except:
   4217                             logger.warning('something wrong with camera jpeg capture')
   4218                         videos_totalt = db.query("SELECT COUNT(*) AS videos FROM videos")[0]
   4219                         tot = int(videos_totalt.videos)
   4220                         video_origins=filmfolder+'.videos/'+datetime.datetime.now().strftime('%Y%d%m')+'_'+os.urandom(8).hex()+'_'+str(tot).zfill(5)
   4221                         writemessage('Compiling timelapse')
   4222                         logger.info('Hold on, rendering ' + str(len(files)) + ' scenes')
   4223                         #RENDER VIDEO
   4224                         print('Rendering videofiles')
   4225                         writemessage('Hold on, rendering timelapse with ' + str(len(files)) + ' files')
   4226                         videosize = 0
   4227                         rendersize = 0
   4228                         scenedir=foldername
   4229                         filename = foldername + filename
   4230                         n = 1
   4231                         videomerge = ['ffmpeg']
   4232                         videomerge.append('-f')
   4233                         videomerge.append('concat')
   4234                         videomerge.append('-safe')
   4235                         videomerge.append('0')
   4236                         run_command('rm '+scenedir+'.renderlist')
   4237                         for f in files[:-1]:
   4238                             compileshot(f+'.h264',filmfolder,filmname)
   4239                             videosize = videosize + countsize(f + '.mp4')
   4240                             #videomerge.append(f + '.mp4')
   4241                             with open(scenedir + '.renderlist', 'a') as l:
   4242                                 l.write("file '"+str(f)+".mp4'\n")
   4243                         videomerge.append('-i')
   4244                         videomerge.append(scenedir+'.renderlist')
   4245                         videomerge.append('-c:v')
   4246                         videomerge.append('copy')
   4247                         videomerge.append('-movflags')
   4248                         videomerge.append('+faststart')
   4249                         videomerge.append(video_origins + '.mp4')
   4250                         videomerge.append('-y')
   4251                         #videomerge.append(filename + '.h264')
   4252                         #videomerge.append(filename + '.h264')
   4253                         #call(videomerge, shell=True) #how to insert somekind of estimated time while it does this?
   4254                         p = Popen(videomerge)
   4255                         #show progress
   4256                         while p.poll() is None:
   4257                             time.sleep(0.1)
   4258                             try:
   4259                                 rendersize = countsize(filename + '.mp4')
   4260                             except:
   4261                                 continue
   4262                             writemessage('video rendering ' + str(int(rendersize)) + ' of ' + str(int(videosize)) + ' kb done')
   4263                         run_command('rm '+scenedir+'.renderlist')
   4264                         print('Video rendered!')
   4265                         os.system('ln -sfr '+video_origins+'.mp4 '+filename+'.mp4')
   4266                         ##RENDER AUDIO
   4267                         writemessage('Rendering sound')
   4268                         audiomerge = ['sox']
   4269                         #if render > 2:
   4270                         #    audiomerge.append(filename + '.wav')
   4271                         for f in files[:-1]:
   4272                             audiomerge.append(f + '.wav')
   4273                         audiomerge.append(filename + '.wav')
   4274                         call(audiomerge, shell=False)
   4275                         ##MAKE AUDIO SILENCE
   4276                         #if sound == False:
   4277                         #    audiosilence(foldername+filename)
   4278                         #cleanup
   4279                         #os.system('rm -r ' + foldername + 'timelapse')
   4280                         vumetermessage('timelapse done! ;)')
   4281                         return filename, between, duration
   4282                     time.sleep(keydelay)
   4283             if menu[selected] == 'BACK':
   4284                 vumetermessage('ok!')
   4285                 return '', between, duration
   4286         time.sleep(keydelay)
   4287 
   4288 #------------Remove-----------------------
   4289 
   4290 def remove(filmfolder, filmname, scene, shot, take, sceneshotortake):
   4291     flushbutton()
   4292     foldername = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/'
   4293     filename = 'take' + str(take).zfill(3)
   4294     pressed = ''
   4295     buttonpressed = ''
   4296     buttontime = time.time()
   4297     holdbutton = ''
   4298     time.sleep(0.1)
   4299     header = 'Are you sure you want to remove ' + sceneshotortake + '?'
   4300     menu = '', '', ''
   4301     settings = 'NO', 'ARCHIVE', 'YES'
   4302     selected = 0
   4303     otf_scene = countscenes(filmfolder, filmname+'_archive')
   4304     otf_scene += 1
   4305     otf_shot = countshots(filmname+'_archive' , filmfolder, otf_scene)
   4306     otf_shot += 1
   4307     otf_take = counttakes(filmname+'_archive', filmfolder, otf_scene, otf_shot)
   4308     otf_take += 1
   4309     oldmenu=''
   4310     starttime=time.time()
   4311     while True:
   4312         oldmenu=writemenu(menu,settings,selected,header,showmenu,oldmenu)
   4313         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   4314         if pressed == 'right':
   4315             if selected < (len(settings) - 1):
   4316                 selected = selected + 1
   4317         elif pressed == 'left':
   4318             if selected > 0:
   4319                 selected = selected - 1
   4320         elif pressed == 'remove' and time.time()-starttime > 1:
   4321             return
   4322         elif pressed == 'middle':
   4323             if selected == 2:
   4324                 if sceneshotortake == 'take':
   4325                     os.system('rm ' + foldername + filename + '.h264')
   4326                     os.system('rm ' + foldername + filename + '.mp4')
   4327                     os.system('rm ' + foldername + filename + '.info')
   4328                     os.system('rm ' + foldername + filename + '.wav')
   4329                     os.system('rm ' + foldername + filename + '.jpeg')
   4330                     os.system('rm ' + foldername + filename + '_thumb.jpeg')
   4331                     return
   4332                 elif sceneshotortake == 'shot' and shot > 0:
   4333                     os.system('rm -r ' + foldername)
   4334                     return
   4335                 elif sceneshotortake == 'scene':
   4336                     foldername = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3)
   4337                     os.system('rm -r ' + foldername)
   4338                     scene = countscenes(filmfolder, filmname)
   4339                     shot=1
   4340                     take=1
   4341                     return
   4342                 elif sceneshotortake == 'film':
   4343                     origin_videos=[]
   4344                     v=organize(filmfolder, filmname)
   4345                     if v == '':
   4346                         return
   4347                     origin_videos.extend(v)
   4348                     for i in origin_videos:
   4349                         print('remove video: '+i)
   4350                         try:
   4351                             os.remove(i)
   4352                         except:
   4353                             pass
   4354                         #time.sleep(3)
   4355                     foldername = filmfolder + filmname
   4356                     os.system('rm -r ' + foldername)
   4357                     return
   4358             if selected == 1:
   4359                 if '_archive' in filmname:
   4360                     if sceneshotortake == 'take':
   4361                         os.system('rm ' + foldername + filename + '.h264')
   4362                         os.system('rm ' + foldername + filename + '.mp4')
   4363                         os.system('rm ' + foldername + filename + '.info')
   4364                         os.system('rm ' + foldername + filename + '.wav')
   4365                         os.system('rm ' + foldername + filename + '.jpeg')
   4366                         os.system('rm ' + foldername + filename + '_thumb.jpeg')
   4367                         return
   4368                     elif sceneshotortake == 'shot' and shot > 0:
   4369                         os.system('rm -r ' + foldername)
   4370                         return
   4371                     elif sceneshotortake == 'scene':
   4372                         foldername = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3)
   4373                         os.system('rm -r ' + foldername)
   4374                         scene = countscenes(filmfolder, filmname)
   4375                         shot=1
   4376                         take=1
   4377                         return
   4378                     elif sceneshotortake == 'film':
   4379                         origin_videos=[]
   4380                         v=organize(filmfolder, filmname)
   4381                         if v == '':
   4382                             return
   4383                         origin_videos.extend(v)
   4384                         for i in origin_videos:
   4385                             print('remove video: '+i)
   4386                             try:
   4387                                 os.remove(i)
   4388                             except:
   4389                                 pass
   4390                             #time.sleep(3)
   4391                         foldername = filmfolder + filmname
   4392                         os.system('rm -r ' + foldername)
   4393                         return
   4394                 else:
   4395                     if sceneshotortake == 'take':
   4396                         writemessage('Throwing take in archive' + str(take))
   4397                         #onthefloor = filmfolder + filmname + '_archive/' + 'scene' + str(otf_scene).zfill(3) + '/shot' + str(otf_shot).zfill(3) + '/take' + str(otf_take).zfill(3) 
   4398                         onthefloor = filmfolder + filmname + '_archive/' + 'scene' + str(otf_scene).zfill(3) + '/shot' + str(otf_shot).zfill(3) + '/'
   4399                         if os.path.isdir(onthefloor) == False:
   4400                             os.makedirs(onthefloor)
   4401                         os.system('cp ' + foldername + filename + '.h264 ' + onthefloor + '')
   4402                         os.system('cp ' + foldername + filename + '.mp4 ' + onthefloor + '')
   4403                         os.system('cp ' + foldername + filename + '.info ' + onthefloor + '')
   4404                         os.system('cp ' + foldername + filename + '.wav ' + onthefloor + '')
   4405                         os.system('cp ' + foldername + filename + '.jpeg ' + onthefloor + '')
   4406                         os.system('cp ' + foldername + filename + '_thumb.jpeg ' + onthefloor + '')
   4407                         os.system('rm ' + foldername + filename + '.h264 ')
   4408                         os.system('rm ' + foldername + filename + '.mp4 ')
   4409                         os.system('rm ' + foldername + filename + '.info ')
   4410                         os.system('rm ' + foldername + filename + '.wav ')
   4411                         os.system('rm ' + foldername + filename + '.jpeg ')
   4412                         os.system('rm ' + foldername + filename + '_thumb.jpeg ')
   4413                         os.system('cp -r '+filmfolder + filmname + "/settings.p "+filmfolder + filmname + '_archive/settings.p')
   4414                         take = take - 1
   4415                         if take == 0:
   4416                             take = 1
   4417                     elif sceneshotortake == 'shot' and shot > 0:
   4418                         writemessage('Throwing shot in archive' + str(shot))
   4419                         onthefloor = filmfolder + filmname + '_archive/' + 'scene' + str(otf_scene).zfill(3) + '/shot' + str(otf_shot).zfill(3)+'/'
   4420                         os.makedirs(onthefloor,exist_ok=True)
   4421                         os.system('cp -r '+foldername+'* '+onthefloor)
   4422                         os.system('cp -r '+filmfolder + filmname + "/settings.p "+filmfolder + filmname + '_archive/settings.p')
   4423                         os.system('rm -r '+foldername)
   4424                         take = counttakes(filmname, filmfolder, scene, shot)
   4425                     elif sceneshotortake == 'scene':
   4426                         onthefloor = filmfolder + filmname + '_archive/' + 'scene' + str(otf_scene).zfill(3)
   4427                         os.makedirs(onthefloor)
   4428                         writemessage('Throwing clips in the archive ' + str(scene))
   4429                         foldername = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3)
   4430                         os.system('cp ' + foldername + '/* ' + onthefloor+'/' )
   4431                         os.system('cp -r '+filmfolder + filmname + "/settings.p "+filmfolder + filmname + '_archive/settings.p')
   4432                         os.system('rm -r ' + foldername)
   4433                         scene = countscenes(filmfolder, filmname)
   4434                         shot = 1
   4435                         take = 1
   4436                     elif sceneshotortake == 'film':
   4437                         origin_videos=[]
   4438                         v=organize(filmfolder, filmname)
   4439                         if v == '':
   4440                             return
   4441                         origin_videos.extend(v)
   4442                         for i in origin_videos:
   4443                             print('remove video: '+i)
   4444                             try:
   4445                                 os.remove(i)
   4446                             except:
   4447                                 pass
   4448                             #time.sleep(3)
   4449                         foldername = filmfolder + filmname
   4450                         os.system('rm -r ' + foldername)
   4451                         return
   4452                     organize(filmfolder, filmname + '_archive')
   4453                 return
   4454             elif selected == 0:
   4455                 return False
   4456         time.sleep(0.02)
   4457 
   4458 #--------CLEAN---------
   4459 
   4460 def clean(filmname, filmfolder):
   4461     if filmname == '':
   4462         films = getfilms(filmfolder)
   4463     else:
   4464         films.append(filmname)
   4465     videos_to_remove=[]
   4466     origin_videos=[]
   4467     for f in films:
   4468         v=organize(filmfolder, f[0])
   4469         origin_videos.extend(v)
   4470         print(filmfolder)
   4471         print(f[0])
   4472         print(origin_videos)
   4473         #time.sleep(5)
   4474     print('ORIGIN')
   4475     print(origin_videos)
   4476     print('alll')
   4477     allfiles = os.listdir(filmfolder+'.videos/')
   4478     print(allfiles)
   4479     print('all videos: '+ str(len(allfiles)))
   4480     remove_videos=[]
   4481     for video in allfiles:
   4482         if any(filmfolder+'.videos/'+video in x for x in origin_videos):
   4483             #os.remove(origin)
   4484             print('REMOVE ORIGIN VIDEO NOT IN SYNC ' + video)
   4485         else:
   4486             #os.remove(origin)
   4487             if video != 'gonzopi.db':
   4488                 remove_videos.append(filmfolder+'.videos/'+video)
   4489             print('ORIGIN VIDEO IN SYNC' + video)
   4490     #print(remove_videos)
   4491     print('all videos: '+ str(len(allfiles)))
   4492     print('origin videos: '+ str(len(origin_videos)))
   4493     print('to be removed: '+ str(len(remove_videos)))
   4494     for i in remove_videos:
   4495         os.remove(i)
   4496     #with open(filmfolder+'.videos/.remove_videos', 'w') as outfile:
   4497     #    outfile.write('\n'.join(str(i) for i in remove_videos))
   4498     #time.sleep(10)
   4499 
   4500 #------------Remove and Organize----------------
   4501 
   4502 def organize(filmfolder, filmname):
   4503     global fps, db
   4504     origin_files=[]
   4505     #remove scenes with .remove
   4506     scenes = next(os.walk(filmfolder + filmname))[1]
   4507     for i in scenes:
   4508         scenefiles = next(os.walk(filmfolder + filmname+'/'+i))[2]
   4509         for s in scenefiles:
   4510             if '.remove' in s:
   4511                 logger.info('removing scene')
   4512                 os.system('rm -r ' + filmfolder + filmname + '/' + i)
   4513     scenes = next(os.walk(filmfolder + filmname))[1]
   4514     for i in scenes:
   4515         if 'scene' not in i:
   4516             scenes.remove(i)
   4517     # Takes
   4518     for i in sorted(scenes):
   4519         origin_scene_files=[]
   4520         shots = next(os.walk(filmfolder + filmname + '/' + i))[1]
   4521         for p in shots:
   4522             if 'shot' not in p:
   4523                 shots.remove(p)
   4524         for p in sorted(shots):
   4525             takes=[]
   4526             takefiles = next(os.walk(filmfolder + filmname + '/' + i + '/' + p))[2]
   4527             for t in takefiles:
   4528                 if '.remove' in t:
   4529                     logger.info('removing shot')
   4530                     os.system('rm -r ' + filmfolder + filmname + '/' + i + '/' + p)
   4531                 if 'take' in t:
   4532                     takes.append(t)
   4533             if len(takes) == 0:
   4534                 logger.info('no takes in this shot, removing shot if no placeholder')
   4535                 if not os.path.isfile(filmfolder + filmname + '/' + i + '/' + p + '/.placeholder'):
   4536                     os.system('rm -r ' + filmfolder + filmname + '/' + i + '/' + p)
   4537 
   4538             organized_nr = 1
   4539             print(i)
   4540             print(p)
   4541             print(sorted(takes))
   4542             #time.sleep(2)
   4543             for s in sorted(takes):
   4544                 if 'take' in s:
   4545                     if '.mp4' in s or '.h264' in s:
   4546                         unorganized_nr = int(s[4:7])
   4547                         takename = filmfolder + filmname + '/' + i + '/' + p + '/take' + str(unorganized_nr).zfill(3)
   4548                         if '.mp4' in s:
   4549                             origin=os.path.realpath(takename+'.mp4')
   4550                             if origin != os.path.abspath(takename+'.mp4'):
   4551                                 print('appending: '+origin)
   4552                                 origin_files.append(origin)
   4553                                 origin_scene_files.append(origin)
   4554                                 if os.path.isfile(takename+'.h264'):
   4555                                     print('oh no boubles found!')
   4556                             else:
   4557                                 videos_totalt = db.query("SELECT COUNT(*) AS videos FROM videos")[0]
   4558                                 tot = int(videos_totalt.videos)
   4559                                 video_origins=filmfolder+'.videos/'+datetime.datetime.now().strftime('%Y%d%m')+'_'+os.urandom(8).hex()+'_'+str(tot).zfill(5)
   4560                                 print('no sublink for video, create it here')
   4561                                 os.system('mv '+takename+'.mp4 '+video_origins+'.mp4')
   4562                                 os.system('ln -sfr '+video_origins+'.mp4 '+takename+'.mp4')
   4563                                 #time.sleep(1)
   4564                         origin_audio=os.path.realpath(takename+'.wav')
   4565                         if origin_audio != os.path.abspath(takename+'.wav'):
   4566                             print('appending: '+origin_audio)
   4567                             origin_files.append(origin_audio)
   4568                             origin_scene_files.append(origin_audio)
   4569                         else:
   4570                             print('no sublink for sound, create it here')
   4571                             #time.sleep(1)
   4572                             origin=os.path.realpath(takename+'.mp4')
   4573                             os.system('mv '+takename+'.wav '+origin[:-4]+'.wav')
   4574                             os.system('ln -sfr '+origin[:-4]+'.wav '+takename+'.wav')
   4575                         if '.h264' in s:
   4576                             origin=os.path.realpath(takename+'.h264')
   4577                             if origin != os.path.abspath(takename+'.h264'):
   4578                                 origin_files.append(origin)
   4579                                 origin_scene_files.append(origin)
   4580                         if organized_nr == unorganized_nr:
   4581                             #print('correct')
   4582                             pass
   4583                         if organized_nr != unorganized_nr:
   4584                             print('false, correcting from ' + str(unorganized_nr) + ' to ' + str(organized_nr))
   4585                             print(s)
   4586                             #time.sleep(3)
   4587                             mv = 'mv ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(unorganized_nr).zfill(3)
   4588                             run_command(mv + '.mp4 ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.mp4')
   4589                             run_command(mv + '.info ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.info')
   4590                             run_command(mv + '.nofaststart ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.nofaststart')
   4591                             run_command(mv + '.h264 ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.h264')
   4592                             run_command(mv + '.wav ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.wav')
   4593                             run_command(mv + '.jpeg ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.jpeg')
   4594                             run_command(mv + '_thumb.jpeg ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '_thumb.jpeg')
   4595                         #check if same video has both h246 and mp4 and render and remove h264
   4596                         for t in sorted(takes):
   4597                             if t.replace('.mp4','') == s.replace('.h264','') or s.replace('.mp4','') == t.replace('.h264',''):
   4598                                 logger.info('Found both mp4 and h264 of same video!')
   4599                                 logger.info(t)
   4600                                 logger.info(s)
   4601                                 #time.sleep(5)
   4602                                 compileshot(takename,filmfolder,filmname)
   4603                                 organized_nr -= 1
   4604                         organized_nr += 1
   4605         origin_files.extend(origin_scene_files)
   4606         with open(filmfolder+filmname+'/'+i+'/.origin_videos', 'w') as outfile:
   4607             outfile.write('\n'.join(str(i) for i in origin_scene_files))
   4608 
   4609     # Shots
   4610     for i in sorted(scenes):
   4611         shots = next(os.walk(filmfolder + filmname + '/' + i))[1]
   4612         if len(shots) == 0:
   4613             logger.info('no shots in this scene, removing scene..')
   4614             os.system('rm -r ' + filmfolder + filmname + '/' + i)
   4615         organized_nr = 1
   4616         for p in sorted(shots):
   4617             if 'insert' in p:
   4618                 #add_organize(filmfolder, filmname)
   4619                 pass
   4620             elif 'shot' in p:
   4621                 #print(p)
   4622                 if '_yanked' in p:
   4623                     unorganized_nr = int(p[4:-7])
   4624                 else:
   4625                     unorganized_nr = int(p[-3:])
   4626                 if organized_nr == unorganized_nr:
   4627                     #print('correct')
   4628                     pass
   4629                 if organized_nr != unorganized_nr:
   4630                     #print('false, correcting from ' + str(unorganized_nr) + ' to ' + str(organized_nr))
   4631                     os.system('mv ' + filmfolder + filmname + '/' + i + '/shot' + str(unorganized_nr).zfill(3) + ' ' + filmfolder + filmname + '/' + i + '/shot' + str(organized_nr).zfill(3))
   4632                 organized_nr += 1
   4633 
   4634     # Scenes
   4635     organized_nr = 1
   4636     for i in sorted(scenes):
   4637         if 'insert' in i:
   4638             #add_organize(filmfolder, filmname)
   4639             pass
   4640         elif 'scene' in i:
   4641             #print(i)
   4642             if '_yanked' in i:
   4643                 unorganized_nr = int(i[5:-7])
   4644             else:
   4645                 unorganized_nr = int(i[-3:])
   4646             if organized_nr == unorganized_nr:
   4647                 #print('correct')
   4648                 pass
   4649             if organized_nr != unorganized_nr:
   4650                 #print('false, correcting from ' + str(unorganized_nr) + ' to ' + str(organized_nr))
   4651                 os.system('mv ' + filmfolder + filmname + '/scene' + str(unorganized_nr).zfill(3) + ' ' + filmfolder + filmname + '/scene' + str(organized_nr).zfill(3))
   4652             organized_nr += 1
   4653 
   4654     logger.info('Organizer done! Everything is tidy')
   4655     return origin_files
   4656 
   4657 
   4658 #------------Add and Organize----------------
   4659 
   4660 def add_organize(filmfolder, filmname):
   4661     scenes = next(os.walk(filmfolder + filmname))[1]
   4662     for i in scenes:
   4663         if 'scene' not in i:
   4664             scenes.remove(i)
   4665     # Shots
   4666     for i in sorted(scenes):
   4667         shots = next(os.walk(filmfolder + filmname + '/' + i))[1]
   4668         for c in shots:
   4669             if 'shot' not in c:
   4670                 shots.remove(c)
   4671         organized_nr = len(shots)
   4672         for p in sorted(shots, reverse=True):
   4673             if '_yanked' in p:
   4674                 print(p)
   4675                 #time.sleep(5)
   4676                 os.system('mv -n ' + filmfolder + filmname + '/' + i + '/' + p + ' ' + filmfolder + filmname + '/' + i + '/shot' + str(organized_nr).zfill(3))
   4677             #if _insert in last shot
   4678             elif organized_nr==len(shots) and '_insert' in p:
   4679                 os.system('mv -n ' + filmfolder + filmname + '/' + i + '/' +p+ ' ' + filmfolder + filmname + '/' + i + '/shot' + str(organized_nr).zfill(3))
   4680             elif '_insert' in p:
   4681                 os.system('mv -n ' + filmfolder + filmname + '/' + i + '/' +p+ ' ' + filmfolder + filmname + '/' + i + '/shot' + str(organized_nr).zfill(3))
   4682                 #run_command('touch ' + filmfolder + filmname + '/' + i + '/shot' + str(organized_nr).zfill(3) + '/.placeholder')
   4683             elif 'shot' in p:
   4684                 #print(p)
   4685                 unorganized_nr = int(p[-3:])
   4686                 if organized_nr == unorganized_nr:
   4687                     #print('correct')
   4688                     pass
   4689                 if organized_nr != unorganized_nr:
   4690                     #print('false, correcting from ' + str(unorganized_nr) + ' to ' + str(organized_nr))
   4691                     os.system('mv -n ' + filmfolder + filmname + '/' + i + '/shot' + str(unorganized_nr).zfill(3) + ' ' + filmfolder + filmname + '/' + i + '/shot' + str(organized_nr).zfill(3)) 
   4692             organized_nr -= 1
   4693 
   4694     # Scenes
   4695     organized_nr = len(scenes)
   4696     for i in sorted(scenes, reverse=True):
   4697         #print(i)
   4698         if '_yanked' in i:
   4699             os.system('mv -n ' + filmfolder + filmname + '/'+i+' '+ filmfolder + filmname + '/scene' + str(organized_nr).zfill(3))
   4700         elif organized_nr==len(scenes) and '_insert' in i:
   4701             os.system('mv -n ' + filmfolder + filmname + '/'+i+' '+ filmfolder + filmname + '/scene' + str(organized_nr).zfill(3))
   4702         elif '_insert' in i:
   4703             #print(p)
   4704             os.system('mv -n ' + filmfolder + filmname + '/' +i+' '+ filmfolder + filmname + '/scene' + str(organized_nr).zfill(3))
   4705             run_command('touch ' + filmfolder + filmname + '/scene' + str(organized_nr).zfill(3) + '/.placeholder')
   4706         elif 'scene' in i:
   4707             #print(i)
   4708             unorganized_nr = int(i[-3:])
   4709             if organized_nr == unorganized_nr:
   4710                 #print('correct')
   4711                 pass
   4712             if organized_nr != unorganized_nr:
   4713                 #print('false, correcting from ' + str(unorganized_nr) + ' to ' + str(organized_nr))
   4714                 os.system('mv -n ' + filmfolder + filmname + '/scene' + str(unorganized_nr).zfill(3) + ' ' + filmfolder + filmname + '/scene' + str(organized_nr).zfill(3))
   4715         organized_nr -= 1
   4716     return
   4717 
   4718 #------------Organize and move dubs----------------
   4719 
   4720 def organizedubs(foldername):
   4721     dubs = next(os.walk(foldername))[2]
   4722     print(dubs)
   4723     time.sleep(3)
   4724     for c in dubs:
   4725         if 'dub' not in c:
   4726             dubs.remove(c)
   4727     organized_nr = len(dubs)
   4728     for p in sorted(dubs, reverse=True):
   4729         print(p)
   4730         time.sleep(3)
   4731         if '_insert' in p:
   4732             os.system('mv -n ' + foldername + 'dub' + str(organized_nr).zfill(3) + '_insert.wav ' + foldername + 'dub' + str(organized_nr).zfill(3)+'.wav')
   4733         elif 'dub' in p:
   4734             print(p)
   4735             time.sleep(3)
   4736             unorganized_nr = int(p[5:-4])
   4737             if organized_nr == unorganized_nr:
   4738                 print('correct')
   4739                 time.sleep(3)
   4740                 pass
   4741             if organized_nr != unorganized_nr:
   4742                 print('false, correcting from ' + str(unorganized_nr) + ' to ' + str(organized_nr))
   4743                 time.sleep(3)
   4744                 os.system('mv -n ' + foldername + 'dub' + str(unorganized_nr).zfill(3) + '.wav ' + foldername + 'dub' + str(organized_nr).zfill(3)+'.wav') 
   4745         organized_nr -= 1
   4746 
   4747 #-------------Stretch Audio--------------
   4748 
   4749 def stretchaudio(filename,fps):
   4750     global film_fps,filmfolder
   4751     fps_rounded=round(fps)
   4752     if int(fps_rounded) != int(film_fps):
   4753         #pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + filename + '.mp4', shell=True)
   4754         #videolength = pipe.decode().strip()
   4755         videolength=get_video_length(filename+'.mp4')
   4756         try:
   4757             #pipe = subprocess.check_output('mediainfo --Inform="Audio;%Duration%" ' + filename + '.wav', shell=True)
   4758             #audiolength = pipe.decode().strip()
   4759             audiolength = get_audio_length(filename+'.wav')
   4760         except:
   4761             audiosilence(filename)
   4762             audiolength=videolength
   4763         #if there is no audio length
   4764         logger.info('audio is:' + str(audiolength))
   4765         ratio = int(audiolength)/int(videolength)
   4766         print(str(ratio))
   4767         #run_command('cp '+filename+'.wav '+filename+'_temp.wav')
   4768         run_command('ffmpeg -y -i ' + filename + '.wav -filter:a atempo="'+str(ratio) + '" ' + filmfolder + '.tmp/'+filename+'.wav')
   4769         run_command('cp '+filmfolder+'.tmp/'+filename+'.wav '+filename+'.wav')
   4770         os.remove(filmfolder+'.tmp/'+filename+'.wav')
   4771     #time.sleep(5)
   4772     return
   4773 
   4774 #---------#ffmpeg settings------------
   4775 
   4776 def encoder():
   4777     global bitrate
   4778     return '-c:v h264_omx -profile:v high -level:v 4.2 -preset slow -bsf:v h264_metadata=level=4.2 -g 1 -b:v '+str(bitrate)+' -c:a copy '
   4779     #return '-c:v copy -c:a copy '
   4780 
   4781 def has_audio_track(file_path):
   4782     try:
   4783         # Parse the media file
   4784         media_info = MediaInfo.parse(file_path)
   4785         
   4786         # Check for audio tracks
   4787         for track in media_info.tracks:
   4788             if track.track_type == "Audio":
   4789                 return True
   4790         return False
   4791 
   4792     except Exception as e:
   4793         print(f"Error parsing {file_path}: {e}")
   4794         return None
   4795 
   4796 def check_fps(file_path):
   4797     try:
   4798         # Parse the media file
   4799         media_info = MediaInfo.parse(file_path)
   4800         
   4801         # Check for audio tracks
   4802         for track in media_info.tracks:
   4803             if track.track_type == "Video":
   4804                 return track.frame_rate
   4805         return None
   4806     except Exception as e:
   4807         print(f"Error parsing {file_path}: {e}")
   4808         return None
   4809 
   4810 def check_reso(file_path):
   4811     try:
   4812         # Parse the media file
   4813         media_info = MediaInfo.parse(file_path)
   4814         
   4815         # Check for audio tracks
   4816         for track in media_info.tracks:
   4817             if track.track_type == "Video":
   4818                 return track.width, track.height
   4819         return None
   4820     except Exception as e:
   4821         print(f"Error parsing {file_path}: {e}")
   4822         return None
   4823 
   4824 def is_audio_stereo(file_path):
   4825     try:
   4826         # Parse the media file
   4827         media_info = MediaInfo.parse(file_path)
   4828         
   4829         # Check for audio tracks
   4830         for track in media_info.tracks:
   4831             if track.track_type == "Audio":
   4832                 if track.channel_s == 1:
   4833                     return False
   4834                 if track.channel_s == 2:
   4835                     return True
   4836         return None
   4837     except Exception as e:
   4838         print(f"Error parsing {file_path}: {e}")
   4839         return None
   4840 
   4841 def get_video_length_str(filepath):
   4842     video_origins = (os.path.realpath(filepath))
   4843     try:
   4844         if os.path.isfile(filepath[:-3]+'nofaststart') == True:
   4845             with open(filepath[:-3]+'nofaststart', 'r') as f:
   4846                 duration_ms = f.readline().strip()
   4847                 print('duration in ms: ' + str(duration_ms))
   4848             return str(datetime.timedelta(seconds=round(int(duration_ms)/1000)))
   4849     except:
   4850         pass
   4851     try:
   4852         if os.path.isfile(filepath[:-3]+'info') == True:
   4853             with open(filepath[:-3]+'info', 'r') as f:
   4854                 duration_ms = f.readline().strip()
   4855                 print('duration in ms: ' + str(duration_ms))
   4856             return str(datetime.timedelta(seconds=round(int(duration_ms)/1000)))
   4857     except:
   4858         pass
   4859     #try:
   4860         #video_db=db.select('videos', where='filename="'+video_origins+'"')[0]
   4861         #return str(datetime.timedelta(seconds=round(video_db.videolength)))
   4862     #except:
   4863     #    pass
   4864     # Parse the file
   4865     try:
   4866         media_info = MediaInfo.parse(filepath)
   4867     except:
   4868         return
   4869     # Find the video track (usually the first video track)
   4870     for track in media_info.tracks:
   4871         if track.track_type == "Video":
   4872             # Duration is in milliseconds, convert to seconds
   4873             duration_ms = track.duration
   4874             if duration_ms is None:
   4875                 return None  # No duration found
   4876             db.update('videos', where='filename="'+video_origins+'"', videolength=duration_ms/1000, audiolength=duration_ms/1000)
   4877             with open(filepath[:-3] + 'info', 'w') as f:
   4878                 f.write(str(duration_ms))
   4879             return str(datetime.timedelta(seconds=round(duration_ms/1000)))
   4880             #return int(duration_ms)
   4881     return None  # No video track found
   4882 
   4883 def get_video_length(filepath):
   4884     global db
   4885     video_origins = (os.path.realpath(filepath))
   4886     try:
   4887         media_info = MediaInfo.parse(filepath)
   4888     except:
   4889         return
   4890     # Find the video track (usually the first video track)
   4891     for track in media_info.tracks:
   4892         if track.track_type == "Video":
   4893             # Duration is in milliseconds, convert to seconds
   4894             duration_ms = track.duration
   4895             if duration_ms is None:
   4896                 return None  # No duration found
   4897             db.update('videos', where='filename="'+video_origins+'"', videolength=duration_ms/1000, audiolength=duration_ms/1000)
   4898             with open(filepath[:-3] + 'info', 'w') as f:
   4899                 f.write(str(duration_ms))
   4900             return int(duration_ms)
   4901             #return int(duration_ms)
   4902     return None  # No video track found
   4903 
   4904 
   4905 def get_audio_length(filepath):
   4906     # Parse the file
   4907     media_info = MediaInfo.parse(filepath)
   4908     # Find the video track (usually the first video track)
   4909     for track in media_info.tracks:
   4910         if track.track_type == "Audio":
   4911             # Duration is in milliseconds, convert to seconds
   4912             duration_ms = track.duration
   4913             if duration_ms is None:
   4914                 return None  # No duration found
   4915             return int(duration_ms)
   4916     return None  # No video track found
   4917 
   4918 #-------------Compile Shot--------------
   4919 
   4920 def compileshot(filename,filmfolder,filmname):
   4921     global fps, soundrate, channels, bitrate, muxing, db, film_fps
   4922     videolength=0
   4923     audiolength=0 
   4924     #Check if file already converted
   4925     if '.h264' in filename:
   4926         filename=filename.replace('.h264','')
   4927     if '.mp4' in filename:
   4928         filename=filename.replace('.mp4','')
   4929     if os.path.isfile(filename + '.h264'):
   4930         logger.info('Video not converted!')
   4931         writemessage('Converting to playable video')
   4932         #remove old mp4 if corrupted like if an unpredicted shutdown in middle of converting
   4933         video_origins = (os.path.realpath(filename+'.h264'))[:-5]
   4934         os.system('rm ' + filename + '.mp4')
   4935         os.system('rm ' + video_origins + '.mp4')
   4936         print(filename+'.mp4 removed!')
   4937         #run_command('ffmpeg -fps 25 -add ' + video_origins + '.h264 ' + video_origins + '.mp4')
   4938         #run_command('ffmpeg -fps 25 -add ' + video_origins + '.h264 ' + video_origins + '.mp4')
   4939         #run_command('ffmpeg -i ' + video_origins + '.h264 -c:v h264_omx -profile:v high -level:v 4.2 -preset slower -bsf:v h264_metadata=level=4.2 -g 1 -b:v '+str(bitrate)+' '+ video_origins + '.mp4')
   4940         #run_command('ffmpeg -fflags +genpts -r 25 -i ' + video_origins + '.h264 '+encoder()+ video_origins + '.mp4')
   4941         ffmpeg_cmd = ['ffmpeg','-i', video_origins+'.h264', '-fflags', '+genpts+igndts', '-c:v', 'copy', '-movflags', 'frag_keyframe+empty_moov', '-level:v', '4.2', '-g', '1', '-r', str(film_fps), '-f', 'mp4', video_origins+'.mp4', '-loglevel','debug', '-y']
   4942         ffmpeg_process = subprocess.Popen(ffmpeg_cmd)
   4943         stdout, stderr = ffmpeg_process.communicate()
   4944         #os.system('ln -sfr '+video_origins+'.mp4 '+filename+'.mp4')
   4945         print(filename+'.h264 converted to mp4')
   4946     video_origins = (os.path.realpath(filename+'.mp4'))[:-4]
   4947     vumetermessage('checking video audio length...')
   4948     videolength = get_video_length(filename+'.mp4')
   4949     print('videolength:'+str(videolength))
   4950     if not os.path.isfile(filename + '.wav'):
   4951         vumetermessage('creating audio track...')
   4952         audiosilence(filename)
   4953         try:
   4954             db.update('videos', where='filename="'+video_origins+'.mp4"', videolength=videolength/1000, audiolength=videolength/1000)
   4955         except:
   4956             db = correct_database(filmname,filmfolder,db)
   4957             db.update('videos', where='filename="'+video_origins+'.mp4"', videolength=videolength/1000, audiolength=videolength/1000)
   4958     #add audio/video start delay sync
   4959     try:
   4960         audiolength = get_audio_length(filename+'.wav')
   4961     except:
   4962         audiolength=videolength
   4963         #if there is no audio length
   4964         vumetermessage('creating audio track...')
   4965         audiosilence(filename)
   4966     print('trimming audio')
   4967     if int(audiolength) > int(videolength+int(0.013*1000)):
   4968         vumetermessage('trimming audio...')
   4969         audio_origins = (os.path.realpath(filename+'.wav'))
   4970         run_command('sox -V0 -b 16 '+filename+'.wav -c 2 '+filmfolder+'.tmp/temp.wav trim 0.013')
   4971         run_command('mv '+filmfolder+'.tmp/temp.wav '+ audio_origins)
   4972         os.system('rm '+filmfolder+'.tmp/temp.wav')
   4973     fps_rounded=round(fps)
   4974     if int(fps) != int(film_fps):
   4975         vumetermessage('stretching audio...')
   4976         stretchaudio(filename,fps)
   4977     if int(audiolength) != int(videolength):
   4978         vumetermessage('trimming audio to video...')
   4979         audiosync, videolength, audiolength = audiotrim(filename, 'end','')
   4980         try:
   4981             db.update('videos', where='filename="'+video_origins+'.mp4"', videolength=videolength/1000, audiolength=audiolength/1000, audiosync=audiosync)
   4982         except:
   4983             db = correct_database(filmname,filmfolder,db)
   4984             db.update('videos', where='filename="'+video_origins+'.mp4"', videolength=videolength/1000, audiolength=audiolength/1000, audiosync=audiosync)
   4985     mux=False
   4986     #one more if stereo check!
   4987     stereo = is_audio_stereo(filename+'.wav')
   4988     if stereo == False:
   4989         run_command('sox -V0 -b 16 '+filename+'.wav -c 2 '+filmfolder+'.tmp/temp.wav')
   4990         run_command('mv '+filmfolder+'.tmp/temp.wav '+ filename + '.wav')
   4991         os.system('rm '+filmfolder+'.tmp/temp.wav')
   4992     logger.info('audio is:' + str(audiolength))
   4993     if mux == True:
   4994         #muxing mp3 layer to mp4 file
   4995         #count estimated audio filesize with a bitrate of 320 kb/s
   4996         audiosize = countsize(filename + '.wav') * 0.453
   4997         p = Popen(['ffmpeg', '-y', '-i', filename + '.wav', '-acodec', 'libmp3lame', '-ac', '2', '-b:a', '320k', filename + '.mp3'])
   4998         while p.poll() is None:
   4999             time.sleep(0.2)
   5000             try:
   5001                 rendersize = countsize(filename + '.mp3')
   5002             except:
   5003                 continue
   5004             writemessage('audio rendering ' + str(int(rendersize)) + ' of ' + str(int(audiosize)) + ' kb done')
   5005         ##MERGE AUDIO & VIDEO
   5006         writemessage('Merging audio & video')
   5007         #os.remove(renderfilename + '.mp4') 
   5008         call(['MP4Box', '-rem', '2',  video_origins + '.mp4'], shell=False)
   5009         call(['MP4Box', '-fps', str(film_fps), '-add', video_origins + '.mp4', '-add', filename + '.mp3', '-new', video_origins + '_tmp.mp4'], shell=False)
   5010         os.system('cp -f ' + video_origins + '_tmp.mp4 ' + video_origins + '.mp4')
   5011         os.remove(video_origins + '_tmp.mp4')
   5012         os.remove(filename + '.mp3')
   5013     #origin=os.path.realpath(filename+'.mp4')
   5014     os.system('rm ' + video_origins + '.h264')
   5015     #os.system('rm ' + filename + '.h264')
   5016     #os.system('ln -sfr '+video_origins+'.mp4 '+filename+'.mp4')
   5017     logger.info('compile done!')
   5018     #run_command('omxplayer --layer 3 ' + filmfolder + '/.rendered/' + filename + '.mp4 &')
   5019     #time.sleep(0.8)
   5020     #run_command('aplay ' + foldername + filename + '.wav')
   5021     return
   5022 
   5023 #-------------Get shot files--------------
   5024 
   5025 def shotfiles(filmfolder, filmname, scene):
   5026     files = []
   5027     shots = countshots(filmname,filmfolder,scene)
   5028     print("shots"+str(shots))
   5029     shot = 1
   5030     for i in range(shots):
   5031         takes = counttakes(filmname,filmfolder,scene,shot)
   5032         if takes > 0:
   5033             folder = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/'
   5034             filename = 'take' + str(takes).zfill(3)
   5035             files.append(folder + filename)
   5036             print(folder+filename)
   5037         shot = shot + 1
   5038     #writemessage(str(len(shotfiles)))
   5039     #time.sleep(2)
   5040     return files
   5041 
   5042 #--------Show JPEG as progress when rendering
   5043 
   5044 #---------------Render Video------------------
   5045 
   5046 def rendervideo(filmfolder, filmname, scene, filmfiles, filename, renderinfo):
   5047     videos_totalt = db.query("SELECT COUNT(*) AS videos FROM videos")[0]
   5048     rendered_video = filmfolder+'.rendered/'+filmname+'_scene' + str(scene).zfill(3)
   5049     os.makedirs(filmfolder+'.rendered',exist_ok=True)
   5050     tot = int(videos_totalt.videos)
   5051     #video_origins=filmfolder+'.videos/'+datetime.datetime.now().strftime('%Y%d%m')+'_'+os.urandom(8).hex()+'_'+str(tot).zfill(5)
   5052     scenedir = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/'
   5053     if scene == 0:
   5054         scenedir = filmfolder + filmname + '/'
   5055     if len(filmfiles) < 1:
   5056         writemessage('Nothing here!')
   5057         time.sleep(2)
   5058         return None
   5059     print('Rendering videofiles')
   5060     writemessage('Hold on, rendering ' + renderinfo + ' with ' + str(len(filmfiles)) + ' files')
   5061     videosize = 0
   5062     rendersize = 0
   5063     #videomerge = ['MP4Box']
   5064     #videomerge.append('-force-cat')
   5065     #for f in filmfiles[:]:
   5066     #    videosize = videosize + countsize(f + '.mp4')
   5067     #    videomerge.append('-cat')
   5068     #    videomerge.append(f + '.mp4#video')
   5069     #videomerge.append('-new')
   5070     #videomerge.append(filename + '.mp4')
   5071     videomerge = ['ffmpeg']
   5072     videomerge.append('-f')
   5073     videomerge.append('concat')
   5074     videomerge.append('-safe')
   5075     videomerge.append('0')
   5076     run_command('rm '+scenedir+'.renderlist')
   5077     for f in filmfiles[:]:
   5078         videosize = videosize + countsize(f + '.mp4')
   5079         #videomerge.append(f + '.mp4')
   5080         with open(scenedir + '.renderlist', 'a') as l:
   5081             l.write("file '"+str(f)+".mp4'\n")
   5082     videomerge.append('-i')
   5083     videomerge.append(scenedir+'.renderlist')
   5084     videomerge.append('-c:v')
   5085     videomerge.append('copy')
   5086     videomerge.append('-movflags')
   5087     videomerge.append('+faststart')
   5088     videomerge.append(rendered_video+'.mp4')
   5089     videomerge.append('-y')
   5090     #videomerge.append(filename + '.h264')
   5091     #videomerge.append(filename + '.h264')
   5092     #call(videomerge, shell=True) #how to insert somekind of estimated time while it does this?
   5093     p = Popen(videomerge)
   5094     #show progress
   5095     while p.poll() is None:
   5096         time.sleep(0.1)
   5097         try:
   5098             rendersize = countsize(rendered_video+'.mp4')
   5099         except:
   5100             continue
   5101         writemessage('video rendering ' + str(int(rendersize)) + ' of ' + str(int(videosize)) + ' kb done')
   5102     print('Video rendered!')
   5103     os.system('ln -sfr '+rendered_video+'.mp4 '+filename+'.mp4')
   5104     run_command('rm '+scenedir+'.renderlist')
   5105     return
   5106 
   5107 #---------------Render Audio----------------
   5108 
   5109 def renderaudio(filmfolder, filmname, scene, audiofiles, filename, dubfiles, dubmix):
   5110     #if len(audiofiles) < 1:
   5111     #    writemessage('Nothing here!')
   5112     #    time.sleep(2)
   5113     #    return None
   5114     #
   5115     #check if shot or take and put them in .rendered folder
   5116     if audiofiles == filename:
   5117         rendered_audio=filename
   5118     else:
   5119         rendered_audio = filmfolder+'.rendered/'+filmname+'_scene' + str(scene).zfill(3)
   5120         os.makedirs(filmfolder+'.rendered',exist_ok=True)
   5121     print('Rendering audiofiles')
   5122     ##PASTE AUDIO TOGETHER
   5123     writemessage('Hold on, rendering audio...')
   5124     audiomerge = ['sox']
   5125     #if render > 2:
   5126     #    audiomerge.append(filename + '.wav')
   5127     if isinstance(audiofiles, list):
   5128         for f in audiofiles:
   5129             audiomerge.append(f + '.wav')
   5130         audiomerge.append(rendered_audio + '.wav')
   5131         call(audiomerge, shell=False)
   5132     else:
   5133         #if rendering scene with one shot
   5134         if audiofiles[0] != filename:
   5135             os.system('cp '+audiofiles[0]+'.wav '+rendered_audio+'.wav')
   5136     os.system('ln -sfr '+rendered_audio+'.wav '+filename+'.wav')
   5137     #DUBBING
   5138     p = 1
   5139     #pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + filename + '.mp4', shell=True)
   5140     #videolength = pipe.decode().strip()
   5141     try:
   5142         videolength = get_video_length(filename+'.mp4')
   5143     except:
   5144         videolength = 0
   5145     try:
   5146         audiolength = get_audio_length(filename+'.wav')
   5147     except:
   5148         audiosilence(filename)
   5149         audiolength = get_audio_length(filename+'.wav')
   5150     if audiolength == None:
   5151         audiosilence(filename)
   5152         audiolength = get_audio_length(filename+'.wav')
   5153     if videolength != 0 and videolength != None:
   5154         if audiolength > videolength:
   5155             audiotrim(filename, 'end','')
   5156     if audiolength < videolength:
   5157         print('FUUUUUUUUUUUU')
   5158         #time.sleep(5)
   5159     for i, d in zip(dubmix, dubfiles):
   5160         writemessage('Dub ' + str(p) + ' audio found lets mix...')
   5161         #first trimit!
   5162         #audiotrim(filename, 'end', d)
   5163         try:
   5164             #pipe = subprocess.check_output('soxi -D ' + d, shell=True)
   5165             #dubaudiolength = pipe.decode()
   5166             dubaudiolength=get_audio_length(d)
   5167             if dubaudiolength != videolength:
   5168                 print('dub wrong length!')
   5169                 #time.sleep(5)
   5170         except:
   5171             pass
   5172         #print(d)
   5173         #print(filename)
   5174         #time.sleep(3)
   5175         os.system('cp ' + filename + '.wav ' + filename + '_tmp.wav')
   5176         #Fade and make stereo
   5177         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)))
   5178         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(videolength))
   5179         os.system('ln -sfr '+rendered_audio+'.wav '+filename+'.wav')
   5180         try:
   5181             os.remove(filename + '_tmp.wav')
   5182             os.remove(''+filmfolder+'.tmp/fade.wav')
   5183         except:
   5184             pass
   5185         print('Dub mix ' + str(p) + ' done!')
   5186         p += 1
   5187     try:
   5188         videolength = get_video_length(filename+'.mp4')
   5189     except:
   5190         videolength = 0
   5191     try:
   5192         audiolength = get_audio_length(filename+'.wav')
   5193     except:
   5194         audiosilence(filename)
   5195         audiolength = get_audio_length(filename+'.wav')
   5196     if int(audiolength) != int(videolength):
   5197         vumetermessage('trimming audio to video...')
   5198         audiosync, videolength, audiolength = audiotrim(filename, 'end','')
   5199     return
   5200 
   5201 #-------------Fast Edit-----------------
   5202 def fastedit(filmfolder, filmname, filmfiles, scene):
   5203     scenedir = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/'
   5204     totlength = 0
   5205     try:
   5206         os.remove(scenedir + '.fastedit')
   5207     except:
   5208         print('no fastedit file')
   5209     #for f in filmfiles:
   5210         #pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + f + '.mp4', shell=True)
   5211         #videolength = pipe.decode().strip()
   5212         #totlength = int(videolength) + totlength
   5213         #print('writing shot lengths for fastedit mode')
   5214         #with open(scenedir + '.fastedit', 'a') as f:
   5215         #    f.write(str(totlength)+'\n')
   5216 
   5217 
   5218 def check_faststart(file_path):
   5219     try:
   5220         # Load the media file
   5221         media_info = MediaInfo.parse(file_path)
   5222         
   5223         # Check if the file is MP4
   5224         for track in media_info.tracks:
   5225             if track.track_type == "General":
   5226                 if track.format.lower() not in ["mpeg-4", "mp4"]:
   5227                     print(f"Error: '{file_path}' is not an MP4 file.")
   5228                 # Check for IsStreamable field
   5229                 is_streamable = track.to_data().get("is_streamable", "").lower()
   5230                 if is_streamable == "yes":
   5231                     print(f"Faststart is enabled for '{file_path}' (IsStreamable: Yes).")
   5232                 elif is_streamable == "no":
   5233                     print(f"Faststart is NOT enabled for '{file_path}' (IsStreamable: No).")
   5234                 
   5235                 # Fallback: Check MOOV atom position (if IsStreamable is not explicitly set)
   5236                 # MediaInfo doesn't always provide direct MOOV position, so we infer from file structure
   5237                 if "moov" in track.to_data().get("other_file_format", "").lower():
   5238                     print(f"Faststart is likely enabled for '{file_path}' (MOOV atom detected).")
   5239                     return True
   5240                 else:
   5241                     print(f"Faststart is NOT enabled for '{file_path}' (MOOV atom not at start).")
   5242                     return False
   5243                 return
   5244         
   5245         print(f"Error: No general track found in '{file_path}'.")
   5246     
   5247     except Exception as e:
   5248         print(f"Error analyzing '{file_path}': {str(e)}")
   5249 
   5250 
   5251 #-------------Get scene files--------------
   5252 
   5253 def scenefiles(filmfolder, filmname):
   5254     files = []
   5255     scenes = countscenes(filmfolder,filmname)
   5256     scene = 1
   5257     while scene <= scenes:
   5258         folder = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) + '/'
   5259         filename = 'scene'
   5260         files.append(folder + filename)
   5261         scene = scene + 1
   5262     #writemessage(str(len(shotfiles)))
   5263     #time.sleep(2)
   5264     return files
   5265 
   5266 #-------------Render Shot-------------
   5267 
   5268 def rendershot(filmfolder, filmname, renderfilename, scene, shot):
   5269     global fps, take, rendermenu, updatethumb, bitrate, muxing, db, film_fps
   5270     #This function checks and calls rendervideo & renderaudio if something has changed in the film
   5271     #Video
   5272     vumetermessage('render shot '+renderfilename)
   5273     video_origins = (os.path.realpath(renderfilename+'.mp4'))[:-4]
   5274     def render(q, filmfolder, filmname, renderfilename, scene, shot):
   5275         global fps, take, rendermenu, updatethumb, bitrate, muxing, db
   5276         video_origins = (os.path.realpath(renderfilename+'.mp4'))[:-4]
   5277         videohash = ''
   5278         oldvideohash = ''
   5279         scenedir = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/'
   5280         #return if no file
   5281         # Video Hash
   5282         #if os.path.isfile(renderfilename + '.h264') == True:
   5283         #new logic here (check for video length if takes more than a second asume no faststart)
   5284         video_db=db.select('videos', where='filename="'+video_origins+'.mp4"')
   5285         faststart=True
   5286         try:
   5287             if video_db[0].faststart == 0:
   5288                 faststart=False
   5289                 print('faststart is not, making video faststart ready')
   5290                 time.sleep(3)
   5291         except:
   5292             faststart = True
   5293             print('video faststart ready!')
   5294             pass
   5295         #if faststart == False:
   5296         if os.path.isfile(renderfilename+'.nofaststart') == True:
   5297             faststart=False
   5298         #if check_faststart(renderfilename+'.mp4') == False:
   5299         #if os.path.isfile(renderfilename+'.nofaststart') == True:
   5300         if faststart == False:
   5301             tmp=filmfolder+'.tmp/'+filmname+'_'+str(scene).zfill(3)+'_'+str(shot).zfill(3)+'.mp4'
   5302             vumetermessage('found new clip compiling...')
   5303             #os.system('mv ' + video_origins + '.mp4 ' + video_origins + '_tmp.mp4')
   5304             call(['ffmpeg', '-i', video_origins + '.mp4', '-r', str(film_fps), '-fflags', '+genpts+igndts', '-vsync', '1', '-c:v', 'copy', '-movflags', '+faststart', tmp, '-y'], shell=False)
   5305             os.system('cp ' + tmp + ' ' + video_origins + '.mp4')
   5306             run_command('rm '+tmp)
   5307             try:
   5308                 db.update('videos', where='filename="'+video_origins+'.mp4"', faststart=True)
   5309             except:
   5310                 db = correct_database(filmname,filmfolder,db)
   5311                 db.update('videos', where='filename="'+video_origins+'.mp4"', faststart=True)
   5312             compileshot(renderfilename,filmfolder,filmname)
   5313             run_command('rm '+renderfilename+'.nofaststart')
   5314             audiohash = str(int(countsize(renderfilename + '.wav')))
   5315             videolength = get_video_length(video_origins+'.mp4')
   5316             with open(scenedir + '.audiohash', 'w') as f:
   5317                 f.write(audiohash)
   5318         if os.path.isfile(renderfilename + '.mp4') == True:
   5319             videohash = videohash + str(int(countsize(renderfilename + '.mp4')))
   5320             print('Videohash of shot is: ' + videohash)
   5321             #time.sleep(3)
   5322             #if something shutdown in middle of process
   5323             #elif os.path.isfile(renderfilename + '_tmp.mp4') == True:
   5324             #    os.system('cp ' + renderfilename + '_tmp.mp4 ' + renderfilename + '.mp4')
   5325         else:
   5326             vumetermessage('Nothing here to play hit record')
   5327             status='',''
   5328             q.put(status)
   5329         #if os.path.isfile(renderfilename + '.h264') and os.path.isfile(renderfilename + '.mp4'):
   5330         #    os.system('rm ' + renderfilename + '.h264 ')
   5331         # Check if video corrupt
   5332         renderfix = False
   5333         if not os.path.isfile(renderfilename + '.wav'):
   5334             vumetermessage('creating audio track...')
   5335             audiosilence(renderfilename)
   5336             renderfix = True
   5337         if os.path.isfile(renderfilename + '.jpeg') == False: 
   5338             run_command('ffmpeg -sseof -1 -i ' + renderfilename + '.mp4 -update 1 -q:v 1 -vf scale=800:450 ' + renderfilename + '.jpeg')
   5339             run_command('ffmpeg -sseof -1 -i ' + renderfilename + '.mp4 -update 1 -q:v 1 -vf scale=80:45 ' + renderfilename + '_thumb.jpeg')
   5340         #try:
   5341         #    pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + renderfilename + '.mp4', shell=True)
   5342         #    videolength = pipe.decode().strip()
   5343         #except:
   5344         #    videolength = ''
   5345         #print('Shot length ' + videolength)
   5346         #if videolength == '':
   5347         #    print('Okey, shot file not found or is corrupted')
   5348         #    # For backwards compatibility remove old rendered scene files
   5349         #    # run_command('rm ' + renderfilename + '*')
   5350         #    status='',''
   5351         #    q.put(status)
   5352 
   5353         #EDITS AND FX
   5354         trimfile = ''
   5355         if os.path.isfile(scenedir+'.split') == True:
   5356             settings = pickle.load(open(scenedir + ".split", "rb"))
   5357             split_list = settings
   5358             logger.info("settings loaded")
   5359             nr=1
   5360             for i in split_list:
   5361                 if nr == 1:
   5362                     #make first split as a new take in the original shot
   5363                     newshotdir = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/'
   5364                     newtakename = 'take' + str(counttakes2(newshotdir)).zfill(3)
   5365                     if i[0][0] < i[0][1]:
   5366                         videotrim(filmfolder,scenedir,i[1],'both', i[0][0],i[0][1],'take')
   5367                     #newtakename = 'take' + str(1).zfill(3)
   5368                 elif nr > 1:
   5369                     #then make new shots
   5370                     newshotdir = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot-1).zfill(3) + '_insert/'
   5371                     newtakename = 'take' + str(1).zfill(3)
   5372                     try:
   5373                         os.makedirs(newshotdir)
   5374                     except:
   5375                         print('is there already prob')
   5376                     if i[0][0] < i[0][1]:
   5377                         videotrim(filmfolder,scenedir,i[1],'both', i[0][0],i[0][1],newshotdir+newtakename)
   5378                     add_organize(filmfolder, filmname)
   5379                 organize(filmfolder, filmname)
   5380                 organize(filmfolder, filmname)
   5381                 scenes, shots, takes = browse(filmname,filmfolder,scene,shot,1)
   5382                 #vumetermessage('Shot ' + str(shot) + ' inserted')
   5383                 updatethumb = True
   5384                 time.sleep(1)
   5385                 nr=nr+1
   5386                 shot=shot+1
   5387             os.remove(scenedir+'.split')
   5388             take=counttakes2(scenedir)
   5389             updatethumb=True
   5390             rendermenu = True
   5391             newaudiomix = True
   5392             renderfilename = scenedir+'take' + str(counttakes2(scenedir)).zfill(3)
   5393         elif os.path.isfile(scenedir+'.beginning') == True and os.path.isfile(scenedir+'.end') == True:
   5394             settings = pickle.load(open(scenedir + ".beginning", "rb"))
   5395             s, trimfile = settings
   5396             logger.info("settings loaded")
   5397             trimfile = 'take' + str(counttakes2(scenedir)).zfill(3)
   5398             renderfilename=scenedir+trimfile
   5399             settings = pickle.load(open(scenedir + ".end", "rb"))
   5400             t, trimfile = settings
   5401             logger.info("settings loaded")
   5402             videotrim(filmfolder,scenedir,trimfile,'both', s,t,'take')
   5403             os.remove(scenedir+'.beginning')
   5404             os.remove(scenedir+'.end')
   5405             take=counttakes2(scenedir)
   5406             updatethumb=True
   5407             rendermenu = True
   5408             newaudiomix = True
   5409             renderfilename = scenedir+'take' + str(counttakes2(scenedir)).zfill(3)
   5410         elif os.path.isfile(scenedir+'.beginning') == True:
   5411             settings = pickle.load(open(scenedir + ".beginning", "rb"))
   5412             s, trimfile = settings
   5413             logger.info("settings loaded")
   5414             videotrim(filmfolder,scenedir,trimfile,'beginning', s, 0,'take')
   5415             os.remove(scenedir+'.beginning')
   5416             newaudiomix = True
   5417             take=counttakes2(scenedir)
   5418             updatethumb=True
   5419             rendermenu = True
   5420             trimfile = 'take' + str(counttakes2(scenedir)).zfill(3)
   5421             renderfilename=scenedir+trimfile
   5422         elif os.path.isfile(scenedir+'.end') == True:
   5423             settings = pickle.load(open(scenedir + ".end", "rb"))
   5424             if trimfile == '':
   5425                 s, trimfile = settings
   5426             else:
   5427                 p, trimfileoriginal = settings
   5428                 s=p-s
   5429             logger.info("settings loaded")
   5430             videotrim(filmfolder,scenedir,trimfile,'end', s, 0,'take')
   5431             os.remove(scenedir+'.end')
   5432             take=counttakes2(scenedir)
   5433             updatethumb=True
   5434             rendermenu = True
   5435             newaudiomix = True
   5436             renderfilename = scenedir+'take' + str(counttakes2(scenedir)).zfill(3)
   5437         ###---------TITLES----------
   5438         if os.path.isfile(scenedir+'title/title001.png') == True:
   5439             videos_totalt = db.query("SELECT COUNT(*) AS videos FROM videos")[0]
   5440             tot = int(videos_totalt.videos)
   5441             video_origins=filmfolder+'.videos/'+datetime.datetime.now().strftime('%Y%d%m')+'_'+os.urandom(8).hex()+'_'+str(tot).zfill(5)
   5442             #compileshot(scenedir+'blend/'+blendmodes[blendselect]+'.h264',filmfolder,filmname)
   5443             run_command('ffmpeg -y -i '+renderfilename+'.mp4 -i '+scenedir+'title/title001.png '+encoder()+'-filter_complex "[0:v][1:v]overlay=0:0:enable=\'between(t,2,8)\'[v]" -map "[v]" -map 0:a? '+filmfolder+'.tmp/title.mp4')
   5444             screen_filename = scenedir+'take' + str(counttakes2(scenedir)+1).zfill(3)
   5445             run_command('cp ' + renderfilename + '.wav ' + screen_filename + '.wav')
   5446             #make a new sublink
   5447             run_command('cp '+filmfolder+'.tmp/title.mp4 '+video_origins+'.mp4')
   5448             os.system('ln -sfr '+video_origins+'.mp4 '+screen_filename+'.mp4')
   5449             run_command('rm '+filmfolder+'.tmp/title.mp4')
   5450             run_command('rm -r title/title001.png')
   5451             run_command('ffmpeg -y -sseof -1 -i ' + screen_filename + '.mp4 -update 1 -q:v 1 -vf scale=800:450 ' + screen_filename + '.jpeg')
   5452             #ffmpeg -i blendtest.mp4 -i blendtest3.mp4 -filter_complex "blend=screen" output2.mp4
   5453             newaudiomix = True
   5454             take=counttakes2(scenedir)
   5455             renderfilename = scenedir+'take' + str(counttakes2(scenedir)).zfill(3)
   5456             updatethumb=True
   5457             rendermenu = True
   5458             newaudiomix = True
   5459         ###---------BLEND----------
   5460         if os.path.isfile(scenedir+'blend/'+blendmodes[blendselect]+'.mp4') == True:
   5461             videos_totalt = db.query("SELECT COUNT(*) AS videos FROM videos")[0]
   5462             tot = int(videos_totalt.videos)
   5463             video_origins=filmfolder+'.videos/'+datetime.datetime.now().strftime('%Y%d%m')+'_'+os.urandom(8).hex()+'_'+str(tot).zfill(5)
   5464             #compileshot(scenedir+'blend/'+blendmodes[blendselect]+'.h264',filmfolder,filmname)
   5465             call(['MP4Box', '-rem', '2', scenedir+'blend/'+blendmodes[blendselect] + '.mp4'], shell=False)
   5466             run_command('ffmpeg -y -i '+renderfilename+'.mp4 -i '+scenedir+'blend/'+blendmodes[blendselect]+'.mp4 '+encoder()+'-filter_complex "blend="'+blendmodes[blendselect]+' '+filmfolder+'.tmp/blend.mp4')
   5467             screen_filename = scenedir+'take' + str(counttakes2(scenedir)+1).zfill(3)
   5468             run_command('cp ' + renderfilename + '.wav ' + screen_filename + '.wav')
   5469             #make a new sublink
   5470             run_command('cp '+filmfolder+'.tmp/blend.mp4 '+video_origins+'.mp4')
   5471             os.system('ln -sfr '+video_origins+'.mp4 '+screen_filename+'.mp4')
   5472             run_command('rm '+filmfolder+'.tmp/blend.mp4')
   5473             run_command('rm '+scenedir+'blend/'+blendmodes[blendselect]+'.mp4')
   5474             run_command('ffmpeg -y -sseof -1 -i ' + screen_filename + '.mp4 -update 1 -q:v 1 -vf scale=800:450 ' + screen_filename + '.jpeg')
   5475             #ffmpeg -i blendtest.mp4 -i blendtest3.mp4 -filter_complex "blend=screen" output2.mp4
   5476             newaudiomix = True
   5477             take=counttakes2(scenedir)
   5478             renderfilename = scenedir+'take' + str(counttakes2(scenedir)).zfill(3)
   5479             updatethumb=True
   5480             rendermenu = True
   5481             newaudiomix = True
   5482         ###---------CROSSFADE--------
   5483         if os.path.isfile(scenedir+'.crossfade') == True:
   5484             settings = pickle.load(open(scenedir + ".crossfade", "rb"))
   5485             s, trimfile = settings
   5486             logger.info("settings loaded")
   5487             videolength=0
   5488             foldername = filmfolder + filmname + '/scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) + '/'
   5489             crossfade_folder = filmfolder + filmname + '/scene' + str(scene).zfill(3) +'/shot' + str(shot+1).zfill(3) + '/'
   5490             crossfade_filename = 'take' + str(counttakes2(crossfade_folder)).zfill(3)
   5491             filename = trimfile
   5492             compileshot(crossfade_folder+crossfade_filename,crossfade_folder,filmname)
   5493             pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + foldername+filename + '.mp4', shell=True)
   5494             videolength = pipe.decode().strip()
   5495             videolength=(int(videolength)/1000)-0.2
   5496             pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + crossfade_folder+ crossfade_filename + '.mp4', shell=True)
   5497             videolength2 = pipe.decode().strip()
   5498             videolength2=(int(videolength2)/1000)-0.2
   5499             if videolength > int(s)/2:
   5500                 if videolength2 > int(s)/2:           
   5501                     #crossfade(scenedir,trimfile,'end', s)
   5502                     crossfade_start = int(videolength)-crossfade
   5503                     output = scenedir+'take' + str(counttakes2(scenedir)+1).zfill(3)
   5504                     run_command('ffmpeg -y -i '+renderfilename+'.mp4 -i '+crossfade_folder+crossfade_filename+'.mp4 -filter_complex "xfade=offset='+str(crossfade_start)+':duration='+str(crossfade)+'" '+output+'.mp4')
   5505                     run_command('ffmpeg -y -i '+renderfilename+'.wav -i '+crossfade_folder+crossfade_filename+'.wav -filter_complex "acrossfade=d='+str(crossfade)+'" '+output+'.wav')
   5506                     run_command('ffmpeg -y -sseof -1 -i ' + output + '.mp4 -update 1 -q:v 1 -vf scale=800:450 ' + output + '.jpeg')
   5507                     os.remove(scenedir+'.crossfade')
   5508                     #ffmpeg -i blendtest.mp4 -i blendtest.mp4 -filter_complex "xfade=offset=4.5:duration=1" output3.mp4
   5509                     #crossfade()
   5510         try:
   5511             with open(scenedir + '.videohash', 'r') as f:
   5512                 oldvideohash = f.readline().strip()
   5513             print('oldvideohash is: ' + oldvideohash)
   5514         except:
   5515             print('no videohash found, making one...')
   5516             with open(scenedir + '.videohash', 'w') as f:
   5517                 f.write(videohash)
   5518         #Audio
   5519         lasttake = counttakes(filmname, filmfolder, scene, shot)
   5520         lasttakefilename = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/take' + str(lasttake).zfill(3) 
   5521         audiohash = ''
   5522         oldaudiohash = ''
   5523         newaudiomix = False
   5524         if lasttakefilename == renderfilename:
   5525             audiohash += str(int(countsize(renderfilename + '.wav')))
   5526             dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, scene, shot)
   5527             for p in dubfiles:
   5528                 audiohash += str(int(countsize(p)))
   5529             print('Audiohash of shot is: ' + audiohash)
   5530             try:
   5531                 with open(scenedir + '.audiohash', 'r') as f:
   5532                     oldaudiohash = f.readline().strip()
   5533                 print('oldaudiohash is: ' + oldaudiohash)
   5534             except:
   5535                 print('no audiohash found, making one...')
   5536                 with open(scenedir + '.audiohash', 'w') as f:
   5537                     f.write(audiohash)
   5538             if audiohash != oldaudiohash or newmix == True or renderfix == True:
   5539                 print('rerendering')
   5540                 #check if sound file exist
   5541                 if os.path.isfile(renderfilename+'.wav') == False:
   5542                     logger.info('no sound, creating empty audio track')
   5543                     audiosilence(renderfilename)
   5544                 #time.sleep(3)
   5545                 #make scene rerender
   5546                 os.system('touch '+filmfolder + filmname + '/scene' + str(scene).zfill(3)+'/.rerender')
   5547                 #copy original sound
   5548                 if os.path.exists(scenedir+'dub') == True:
   5549                     os.system('cp '+scenedir+'dub/original.wav '+renderfilename+'.wav')
   5550                 #os.system('cp '+dubfolder+'original.wav '+renderfilename+'.wav')
   5551                 renderaudio(filmfolder, filmname, scene, renderfilename, renderfilename, dubfiles, dubmix)
   5552                 print('updating audiohash...')
   5553                 with open(scenedir + '.audiohash', 'w') as f:
   5554                     f.write(audiohash)
   5555                 for i in range(len(dubfiles)):
   5556                     os.system('cp ' + scenedir + '/dub/.settings' + str(i + 1).zfill(3) + ' ' + scenedir + '/dub/.rendered' + str(i + 1).zfill(3))
   5557                 print('Audio rendered!')
   5558                 newaudiomix = True
   5559                 logger.info('compile done!')
   5560             else:
   5561                 print('Already rendered!')
   5562             muxings=False
   5563             if muxings == True:
   5564                 #muxing mp3 layer to mp4 file
   5565                 #count estimated audio filesize with a bitrate of 320 kb/s
   5566                 audiosize = countsize(renderfilename + '.wav') * 0.453
   5567                 p = Popen(['ffmpeg', '-y', '-i', renderfilename + '.wav', '-acodec', 'libmp3lame', '-ac', '2', '-b:a', '320k', renderfilename + '.mp3'])
   5568                 while p.poll() is None:
   5569                     time.sleep(0.2)
   5570                     try:
   5571                         rendersize = countsize(renderfilename + '.mp3')
   5572                     except:
   5573                         continue
   5574                     writemessage('audio rendering ' + str(int(rendersize)) + ' of ' + str(int(audiosize)) + ' kb done')
   5575                 ##MERGE AUDIO & VIDEO
   5576                 writemessage('Merging audio & video')
   5577                 #os.remove(renderfilename + '.mp4') 
   5578                 call(['MP4Box', '-rem', '2',  video_origins + '.mp4'], shell=False)
   5579                 call(['MP4Box', '-fps', str(film_fps), '-add', video_origins + '.mp4', '-add', renderfilename + '.mp3', '-new', video_origins + '_tmp.mp4'], shell=False)
   5580                 os.system('cp -f ' + video_origins + '_tmp.mp4 ' + video_origins + '.mp4')
   5581                 try:
   5582                     os.remove(video_origins + '_tmp.mp4')
   5583                     os.remove(renderfilename + '.mp3')
   5584                 except:
   5585                     print('nothing to remove')
   5586             #origin=os.path.realpath(renderfilename+'.mp4')
   5587             #os.system('rm ' + filename + '.h264')
   5588             #os.system('rm /dev/shm/temp.wav')
   5589             #os.system('ln -sfr '+video_origins+'.mp4 '+filename+'.mp4')
   5590         status=renderfilename,newaudiomix
   5591         q.put(status)
   5592     q = mp.Queue()
   5593     proc = mp.Process(target=render, args=(q, filmfolder, filmname, renderfilename, scene, shot))
   5594     proc.start()
   5595     procdone = False
   5596     status = ''
   5597     while True:
   5598         if proc.is_alive() == False and procdone == False:
   5599             status = q.get()
   5600             print(status)
   5601             procdone = True
   5602             proc.join()
   5603             renderfilename,newaudiomix = status
   5604             vumetermessage(renderfilename+'.mp4')
   5605             break
   5606         if middlebutton() == True:
   5607             proc.terminate()
   5608             proc.join()
   5609             procdone = True
   5610             q=''
   5611             os.system('pkill MP4Box')
   5612             vumetermessage('canceled for now, maybe u want to render later ;)')
   5613             writemessage('press any button to continue')
   5614             print('canceling videorender')
   5615             renderfilename = ''
   5616             newaudiomix=''
   5617             break
   5618         time.sleep(0.0555)
   5619     return renderfilename, newaudiomix
   5620 
   5621 #-------------Render Scene-------------
   5622 
   5623 def renderscene(filmfolder, filmname, scene):
   5624     global fps, muxing
   5625     #This function checks and calls rendervideo & renderaudio if something has changed in the film
   5626     #Video
   5627     videohash = ''
   5628     oldvideohash = ''
   5629     filmfiles = shotfiles(filmfolder, filmname, scene)
   5630     renderfilename = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/scene'
   5631     scenedir = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/'
   5632     # Check if video corrupt
   5633     renderfixscene = False
   5634     renderfix=False
   5635     #try:
   5636     #    pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + renderfilename + '.mp4', shell=True)
   5637     #    videolength = pipe.decode().strip()
   5638     #except:
   5639     #    videolength = ''
   5640     #    renderfixscene = True
   5641     #print('Scene length ' + videolength)
   5642     #if videolength == '':
   5643     #    print('Okey, hold your horses, rendering!')
   5644     #    # For backwards compatibility remove old rendered scene files
   5645     #    #run_command('rm ' + renderfilename + '.mp4')
   5646     #    #run_command('rm ' + renderfilename + '.wav')
   5647     #    #vumetermessage('corrupted scene file! removing, please render again')
   5648     #    renderfixscene = True
   5649     #    #return '', ''
   5650     # Video Hash
   5651     for p in filmfiles:
   5652         #compileshot(p,filmfolder,filmname)
   5653         #print(p)
   5654         #time.sleep(5)
   5655         scene = int(p.rsplit('scene',1)[1][:3])
   5656         shot = int(p.rsplit('shot',1)[1][:3])
   5657         rendershotname, renderfix = rendershot(filmfolder, filmname, p, scene, shot)
   5658         if renderfix == True:
   5659             renderfixscene = True
   5660         if rendershotname:
   5661             try: 
   5662                 videohash = videohash + str(int(countsize(p + '.mp4')))
   5663             except:
   5664                 print('no file? ')
   5665     filmfiles = shotfiles(filmfolder, filmname, scene)
   5666     for p in filmfiles:
   5667         scene = int(p.rsplit('scene',1)[1][:3])
   5668         shot = int(p.rsplit('shot',1)[1][:3])
   5669         rendershotname, renderfix = rendershot(filmfolder, filmname, p, scene, shot)
   5670         if renderfix == True:
   5671             renderfixscene = True
   5672         if rendershotname:
   5673             try: 
   5674                 videohash = videohash + str(int(countsize(p + '.mp4')))
   5675             except:
   5676                 print('no file? ')
   5677     print('Videohash of scene is: ' + videohash)
   5678     try:
   5679         with open(scenedir + '.videohash', 'r') as f:
   5680             oldvideohash = f.readline().strip()
   5681         print('oldvideohash is: ' + oldvideohash)
   5682     except:
   5683         print('no videohash found, making one...')
   5684         with open(scenedir + '.videohash', 'w') as f:
   5685             f.write(videohash)
   5686     print('renderfix is:'+str(renderfixscene))
   5687     # Render if needed
   5688     if videohash != oldvideohash or renderfixscene == True:
   5689         run_command('rm '+renderfilename+'.info')
   5690         rendervideo(filmfolder,filmname,scene,filmfiles, renderfilename, 'scene ' + str(scene))
   5691         #fastedit(filmfolder, filmname, filmfiles, scene)
   5692         #run_command('cp '+renderfilename+ '.mp4 '+renderfilename+'_tmp.mp4')
   5693         #call(['ffmpeg', '-i', renderfilename + '_tmp.mp4', '-r', '25', '-vsync', '1', '-c:v', 'copy', '-fflags', '+genpts+igndts', '-movflags', '+faststart', renderfilename+'.mp4', '-y'], shell=False)
   5694         #call(['ffmpeg', '-i', renderfilename + '_tmp.mp4', '-r', '25', '-c:v', 'copy', '-movflags', '+faststart', renderfilename+'.mp4', '-y'], shell=False)
   5695         try:
   5696             os.remove(renderfilename + '_tmp.mp4')
   5697         except:
   5698             pass
   5699         print('updating videohash...')
   5700         with open(scenedir + '.videohash', 'w') as f:
   5701             f.write(videohash)
   5702     #time.sleep(3)
   5703 
   5704     #Audio
   5705     audiohash = ''
   5706     oldaudiohash = ''
   5707     newaudiomix = False
   5708     for p in filmfiles:
   5709         try:
   5710             audiohash += str(int(countsize(p + '.wav')))
   5711         except:
   5712             audiohash=0
   5713             renderfix=True
   5714     dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, scene, 0)
   5715     print(dubfiles)
   5716     for p in dubfiles:
   5717         try:
   5718             audiohash += str(int(countsize(p)))
   5719         except:
   5720             audiohash=0
   5721     print('Audiohash of scene is: ' + audiohash)
   5722     try:
   5723         with open(scenedir + '.audiohash', 'r') as f:
   5724             oldaudiohash = f.readline().strip()
   5725         print('oldaudiohash is: ' + oldaudiohash)
   5726     except:
   5727         print('no audiohash found, making one...')
   5728         with open(scenedir + '.audiohash', 'w') as f:
   5729             f.write(audiohash) 
   5730         renderfixscene=True
   5731     if os.path.isfile(scenedir+'/.rerender') == True:
   5732         renderfixscene=True
   5733         os.system('rm '+scenedir+'/.rerender')
   5734     if audiohash != oldaudiohash or newmix == True or renderfix == True or renderfixscene == True:
   5735         renderaudio(filmfolder, filmname, scene, filmfiles, renderfilename, dubfiles, dubmix)
   5736         print('updating audiohash...')
   5737         with open(scenedir + '.audiohash', 'w') as f:
   5738             f.write(audiohash)
   5739         for i in range(len(dubfiles)):
   5740             os.system('cp ' + scenedir + '/dub/.settings' + str(i + 1).zfill(3) + ' ' + scenedir + '/dub/.rendered' + str(i + 1).zfill(3))
   5741         print('Audio rendered!')
   5742         newaudiomix = True
   5743         #os.system('mv ' + renderfilename + '.mp4 ' + renderfilename + '_tmp.mp4')
   5744     else:
   5745         print('Already rendered!')
   5746     #dont mux scenes for now
   5747     mux = False
   5748     if mux == True:
   5749         #muxing mp3 layer to mp4 file
   5750         #count estimated audio filesize with a bitrate of 320 kb/s
   5751         try:
   5752             audiosize = countsize(renderfilename + '.wav') * 0.453
   5753         except:
   5754             print('noothing here')
   5755         os.system('mv ' + renderfilename + '.mp4 ' + renderfilename + '_tmp.mp4')
   5756         if debianversion == 'stretch':
   5757             p = Popen(['avconv', '-y', '-i', renderfilename + '.wav', '-acodec', 'libmp3lame', '-ac', '2', '-b:a', '320k', renderfilename + '.mp3'])
   5758         else:
   5759             p = Popen(['ffmpeg', '-y', '-i', renderfilename + '.wav', '-acodec', 'libmp3lame', '-ac', '2', '-b:a', '320k', renderfilename + '.mp3'])
   5760         while p.poll() is None:
   5761             time.sleep(0.02)
   5762             try:
   5763                 rendersize = countsize(renderfilename + '.mp3')
   5764             except:
   5765                 continue
   5766             writemessage('audio rendering ' + str(int(rendersize)) + ' of ' + str(int(audiosize)) + ' kb done')
   5767         ##MERGE AUDIO & VIDEO
   5768         writemessage('Merging audio & video')
   5769         #os.remove(renderfilename + '.mp4') 
   5770         call(['MP4Box', '-rem', '2',  renderfilename + '_tmp.mp4'], shell=False)
   5771         #call(['MP4Box', '-inter', '40', '-v', renderfilename + '.mp4'], shell=False)
   5772         call(['MP4Box', '-add', renderfilename + '_tmp.mp4', '-add', renderfilename + '.mp3', '-new', renderfilename + '.mp4'], shell=False)
   5773         #call(['ffmpeg', '-i', renderfilename + '_tmp.mp4', '-r', '25', '-fflags', '+genpts+igndts', '-vsync', '1', '-c:v', 'copy', '-c:a', 'copy', '-movflags', 'faststart', renderfilename+'.mp4', '-y'], shell=False)
   5774         os.remove(renderfilename + '_tmp.mp4')
   5775         os.remove(renderfilename + '.mp3')
   5776     return renderfilename, newaudiomix
   5777 
   5778 #-------------Render film------------
   5779 
   5780 def renderfilm(filmfolder, filmname, comp, scene):
   5781     global fps, muxing
   5782     def render(q, filmfolder, filmname, comp, scene):
   5783         global fps, muxing
   5784         newaudiomix = False
   5785         #if comp == 1:
   5786         #    newaudiomix = True
   5787         #This function checks and calls renderscene first then rendervideo & renderaudio if something has changed in the film
   5788         if scene > 0:
   5789             scenefilename, audiomix = renderscene(filmfolder, filmname, scene)
   5790             q.put(scenefilename)
   5791             return
   5792         scenes = countscenes(filmfolder, filmname)
   5793         for i in range(scenes):
   5794             scenefilename, audiomix = renderscene(filmfolder, filmname, i + 1)
   5795             #Check if a scene has a new audiomix
   5796             print('audiomix of scene ' + str(i + 1) + ' is ' + str(audiomix))
   5797             if audiomix == True:
   5798                 newaudiomix = True
   5799             scenefilename, audiomix = renderscene(filmfolder, filmname, i + 1)
   5800             #Check if a scene has a new audiomix
   5801             print('audiomix of scene ' + str(i + 1) + ' is ' + str(audiomix))
   5802             if audiomix == True:
   5803                 newaudiomix = True
   5804         filmfiles = scenefiles(filmfolder, filmname)
   5805         #Video
   5806         videohash = ''
   5807         oldvideohash = ''
   5808         renderfilename = filmfolder + filmname + '/' + filmname
   5809         filmdir = filmfolder + filmname + '/'
   5810         scenedir = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/'
   5811         for p in filmfiles:
   5812             print(p)
   5813             #compileshot(p,filmfolder,filmname)
   5814             videohash += str(int(countsize(p + '.mp4')))
   5815         print('Videohash of film is: ' + videohash)
   5816         try:
   5817             with open(filmdir + '.videohash', 'r') as f:
   5818                 oldvideohash = f.readline().strip()
   5819             print('oldvideohash is: ' + oldvideohash)
   5820         except:
   5821             print('no videohash found, making one...')
   5822             with open(filmdir + '.videohash', 'w') as f:
   5823                 f.write(videohash)
   5824         if videohash != oldvideohash:
   5825             rendervideo(filmfolder,filmname,scene,filmfiles, renderfilename, filmname)
   5826             print('updating video hash')
   5827             with open(filmdir + '.videohash', 'w') as f:
   5828                 f.write(videohash)
   5829         #Audio
   5830         audiohash = ''
   5831         oldaudiohash = ''
   5832         for p in filmfiles:
   5833             print(p)
   5834             audiohash += str(int(countsize(p + '.wav')))
   5835         dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, 0, 0)
   5836         for p in dubfiles:
   5837             audiohash += str(int(countsize(p)))
   5838         print('Audiohash of film is: ' + audiohash)
   5839         try:
   5840             with open(filmdir + '.audiohash', 'r') as f:
   5841                 oldaudiohash = f.readline().strip()
   5842             print('oldaudiohash is: ' + oldaudiohash)
   5843         except:
   5844             print('no audiohash found, making one...')
   5845             with open(filmdir+ '.audiohash', 'w') as f:
   5846                 f.write(audiohash)
   5847         #This is if the scene has a new audiomix
   5848         if newaudiomix == True:
   5849             newmix = True
   5850         if audiohash != oldaudiohash or newmix == True:
   5851             renderaudio(filmfolder, filmname, scene, filmfiles, renderfilename, dubfiles, dubmix)
   5852             print('updating audiohash...')
   5853             with open(filmdir+ '.audiohash', 'w') as f:
   5854                 f.write(audiohash)
   5855             for i in range(len(dubfiles)):
   5856                 os.system('cp ' + filmdir + '/dub/.settings' + str(i + 1).zfill(3) + ' ' + filmdir + '/dub/.rendered' + str(i + 1).zfill(3))
   5857             print('Audio rendered!')
   5858             #compressing
   5859             if comp > 0:
   5860                 writemessage('compressing audio')
   5861                 os.system('mv ' + renderfilename + '.wav ' + renderfilename + '_tmp.wav')
   5862                 #run_command('sox ' + renderfilename + '_tmp.wav ' + renderfilename + '.wav compand 0.3,1 6:-70,-60,-20 -5 -90 0.2')
   5863                 run_command('sox ' + renderfilename + '_tmp.wav ' + renderfilename + '.wav compand 0.0,1 6:-70,-43,-20 -6 -90 0.1')
   5864                 os.remove(renderfilename + '_tmp.wav')
   5865         else:
   5866             print('Already rendered!')
   5867         #muxing = True
   5868         if muxing == True:
   5869             #muxing mp3 layer to mp4 file
   5870             #count estimated audio filesize with a bitrate of 320 kb/s
   5871             audiosize = countsize(renderfilename + '.wav') * 0.453
   5872             os.system('mv ' + renderfilename + '.mp4 ' + renderfilename + '_tmp.mp4')
   5873             if debianversion == 'stretch':
   5874                 p = Popen(['avconv', '-y', '-i', renderfilename + '.wav', '-acodec', 'libmp3lame', '-ac', '2', '-b:a', '320k', renderfilename + '.mp3'])
   5875             else:
   5876                 p = Popen(['ffmpeg', '-y', '-i', renderfilename + '.wav', '-acodec', 'libmp3lame', '-ac', '2', '-b:a', '320k', renderfilename + '.mp3'])
   5877             while p.poll() is None:
   5878                 time.sleep(0.02)
   5879                 try:
   5880                     rendersize = countsize(renderfilename + '.mp3')
   5881                 except:
   5882                     continue
   5883                 writemessage('audio rendering ' + str(int(rendersize)) + ' of ' + str(int(audiosize)) + ' kb done')
   5884             ##MERGE AUDIO & VIDEO
   5885             writemessage('Merging audio & video')
   5886             #os.remove(renderfilename + '.mp4') 
   5887             call(['MP4Box', '-rem', '2',  renderfilename + '_tmp.mp4'], shell=False)
   5888             #call(['MP4Box', '-inter', '40', '-v', renderfilename + '_tmp.mp4'], shell=False)
   5889             #call(['ffmpeg', '-i', renderfilename + '_tmp.mp4', '-c', 'copy', '-movflags', 'faststart', renderfilename+'.mp4', '-y'], shell=False)
   5890             p = Popen(['MP4Box', '-add', renderfilename + '_tmp.mp4', '-add', renderfilename + '.mp3', '-new', renderfilename + '.mp4'], shell=False)
   5891             while p.poll() is None:
   5892                 time.sleep(0.02)
   5893                 try:
   5894                     rendersize = countsize(renderfilename + '.mp4')
   5895                 except:
   5896                     continue
   5897                 writemessage('audio & video merging ' + str(int(rendersize)) + ' of ' + str(int(audiosize)) + ' kb done')
   5898             os.remove(renderfilename + '_tmp.mp4')
   5899             os.remove(renderfilename + '.mp3')
   5900         q.put(renderfilename)
   5901     q = mp.Queue()
   5902     proc = mp.Process(target=render, args=(q,filmfolder,filmname,comp,scene))
   5903     proc.start()
   5904     procdone = False
   5905     status = ''
   5906     while True:
   5907         if proc.is_alive() == False and procdone == False:
   5908             status = q.get()
   5909             print(status)
   5910             procdone = True
   5911             proc.join()
   5912             renderfilename = status
   5913             vumetermessage(status+'.mp4')
   5914             break
   5915         if middlebutton() == True:
   5916             proc.terminate()
   5917             proc.join()
   5918             procdone = True
   5919             q=''
   5920             os.system('pkill MP4Box')
   5921             vumetermessage('canceled for now, maybe u want to render later ;)')
   5922             writemessage('press any button to continue')
   5923             print('canceling videorender')
   5924             renderfilename = ''
   5925             break
   5926     return renderfilename
   5927 
   5928 #-------------Get dub files-----------
   5929 
   5930 def getdubs(filmfolder, filmname, scene, shot):
   5931     #search for dub files
   5932     print('getting scene dubs')
   5933     dubfiles = []
   5934     dubmix = []
   5935     rerender = False
   5936     if filmname == None and scene == None and shot == None:
   5937         filefolder = filmfolder
   5938     elif scene > 0 and shot == 0:
   5939         filefolder = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/dub/'
   5940     elif scene > 0 and shot > 0:
   5941         filefolder = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/dub/'
   5942     else:
   5943         filefolder = filmfolder + filmname + '/dub/'
   5944     try:
   5945         allfiles = os.listdir(filefolder)
   5946     except:
   5947         print('no dubs')
   5948         return dubfiles, dubmix, rerender
   5949     for a in allfiles:
   5950         if 'dub' in a:
   5951             print('Dub audio found! ' + filefolder + a)
   5952             dubfiles.append(filefolder + a)
   5953             dubfiles.sort()
   5954     #check if dub mix has changed
   5955     dubnr = 1
   5956     for i in dubfiles:
   5957         dub = []
   5958         rendered_dub = []
   5959         try:
   5960             with open(filefolder + '.settings' + str(dubnr).zfill(3), 'r') as f:
   5961                 dubstr = f.read().splitlines()
   5962             for i in dubstr:
   5963                 dub.append(float(i))
   5964             print('dub ' + str(dubnr).zfill(3) + ' loaded!')
   5965             print(dub)
   5966         except:
   5967             print('cant find settings file')
   5968             dub = [1.0, 1.0, 0.0, 0.0]
   5969             with open(filefolder + ".settings" + str(dubnr).zfill(3), "w") as f:
   5970                 for i in dub:
   5971                     f.write(str(i) + '\n')
   5972         try:
   5973             with open(filefolder + '.rendered' + str(dubnr).zfill(3), 'r') as f:
   5974                 dubstr = f.read().splitlines()
   5975             for i in dubstr:
   5976                 rendered_dub.append(float(i))
   5977             print('rendered dub loaded')
   5978             print(rendered_dub)
   5979         except:
   5980             print('no rendered dubmix found!')
   5981         if rendered_dub != dub:
   5982             rerender = True
   5983         dubmix.append(dub)
   5984         dubnr += 1
   5985     return dubfiles, dubmix, rerender
   5986 
   5987 #------------Remove Dubs----------------
   5988 
   5989 def removedub(dubfolder, dubnr):
   5990     pressed = ''
   5991     buttonpressed = ''
   5992     buttontime = time.time()
   5993     holdbutton = ''
   5994     selected = 0
   5995     header = 'Are you sure you want to remove dub ' + str(dubnr) + '?'
   5996     menu = 'NO', 'YES'
   5997     settings = '', ''
   5998     oldmenu=''
   5999     while True:
   6000         writemenu(menu,settings,selected,header,showmenu,oldmenu)
   6001         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   6002         if pressed == 'right':
   6003             if selected < (len(menu) - 1):
   6004                 selected = selected + 1
   6005         elif pressed == 'left':
   6006             if selected > 0:
   6007                 selected = selected - 1
   6008         elif pressed == 'middle' and selected == 0:
   6009             logger.info('dont remove dub')
   6010             time.sleep(0.3)
   6011             break
   6012         elif pressed == 'middle' and selected == 1: 
   6013             os.system('rm ' + dubfolder + 'dub' + str(dubnr).zfill(3) + '.wav')
   6014             os.system('rm ' + dubfolder + '.settings' + str(dubnr).zfill(3))
   6015             os.system('rm ' + dubfolder + '.rendered' + str(dubnr).zfill(3))
   6016             time.sleep(0.5)
   6017             print(dubfolder)
   6018             dubs = next(os.walk(dubfolder))[2]
   6019             print(dubs)
   6020             for i in dubs:
   6021                 if 'dub' not in i:
   6022                     dubs.remove(i)
   6023             organized_nr = 1
   6024             for s in sorted(dubs):
   6025                 if '.wav' in s and 'dub' in s:
   6026                     print(s)
   6027                     unorganized_nr = int(s[3:-4])
   6028                     if organized_nr == unorganized_nr:
   6029                         print('correct')
   6030                         pass
   6031                     if organized_nr != unorganized_nr:
   6032                         print('false, correcting from ' + str(unorganized_nr) + ' to ' + str(organized_nr))
   6033                         run_command('mv ' + dubfolder + 'dub' + str(unorganized_nr).zfill(3) + '.wav ' + dubfolder + 'dub' + str(organized_nr).zfill(3) + '.wav')
   6034                         run_command('mv ' + dubfolder + '.settings' + str(unorganized_nr).zfill(3) + ' ' + dubfolder + '.settings' + str(organized_nr).zfill(3))
   6035                         run_command('mv ' + dubfolder + '.rendered' + str(unorganized_nr).zfill(3) + ' ' + dubfolder + '.rendered' + str(organized_nr).zfill(3))
   6036                     organized_nr += 1
   6037             logger.info('removed dub file!')
   6038             vumetermessage('dub removed!')
   6039             break
   6040         time.sleep(0.05)
   6041 
   6042 #-------------Clip settings---------------
   6043 
   6044 def clipsettings(filmfolder, filmname, scene, shot, take, plughw, yanked):
   6045     vumetermessage('press record, view or retake to be dubbing')
   6046     pressed = ''
   6047     buttonpressed = ''
   6048     buttontime = time.time()
   6049     holdbutton = ''
   6050     selected = 0
   6051     dubfiles = []
   6052     dubmix = []
   6053     dubmix_old = []
   6054     if scene > 0 and shot == 0:
   6055         header = 'Scene ' + str(scene) + ' dubbing settings'
   6056         filefolder = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/dub/'
   6057         dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, scene, 0)
   6058     elif scene > 0 and shot > 0:
   6059         header = 'Scene ' + str(scene) + ' shot ' + str(shot) + ' dubbing settings'
   6060         filefolder = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/dub/'
   6061         dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, scene, shot)
   6062     else:
   6063         header = 'Film ' + filmname + ' dubbing settings'
   6064         filefolder = filmfolder + filmname + '/dub/'
   6065         dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, 0, 0)
   6066     newdub = [1.0, 1.0, 0.1, 0.1]
   6067     dubselected = len(dubfiles) - 1
   6068     dubrecord = ''
   6069     oldmenu=''
   6070     while True:
   6071         nmix = round(newdub[0],1)
   6072         ndub = round(newdub[1],1)
   6073         nfadein = round(newdub[2],1)
   6074         nfadeout = round(newdub[3],1)
   6075         if dubfiles:
   6076             mix = round(dubmix[dubselected][0],1)
   6077             dub = round(dubmix[dubselected][1],1)
   6078             fadein = round(dubmix[dubselected][2],1)
   6079             fadeout = round(dubmix[dubselected][3],1)
   6080             menu = 'BACK', 'ADD:', '', '', 'DUB' + str(dubselected + 1) + ':', '', '', ''
   6081             settings = '', 'd:' + str(nmix) + '/o:' + str(ndub), 'in:' + str(nfadein), 'out:' + str(nfadeout), '', 'd:' + str(mix) + '/o' + str(dub), 'in:' + str(fadein), 'out:' + str(fadeout), ''
   6082         else:
   6083             menu = 'BACK', 'ADD:', '', ''
   6084             settings = '', 'd:' + str(nmix) + '/o:' + str(ndub), 'in:' + str(nfadein), 'out:' + str(nfadeout), ''
   6085         oldmenu=writemenu(menu,settings,selected,header,showmenu,oldmenu)
   6086         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   6087 
   6088         #NEW DUB SETTINGS
   6089         if pressed == 'up' and selected == 1:
   6090             if newdub[0] > 0.99 and newdub[1] > 0.01:
   6091                 newdub[1] -= 0.1
   6092             if newdub[1] > 0.99 and newdub[0] < 0.99:
   6093                 newdub[0] += 0.1
   6094         elif pressed == 'down' and selected == 1:
   6095             if newdub[1] > 0.99 and newdub[0] > 0.01:
   6096                 newdub[0] -= 0.1
   6097             if newdub[0] > 0.99 and newdub[1] < 0.99:
   6098                 newdub[1] += 0.1
   6099         elif pressed == 'up' and selected == 2:
   6100             newdub[2] += 0.1
   6101         elif pressed == 'down' and selected == 2:
   6102             if newdub[2] > 0.01:
   6103                 newdub[2] -= 0.1
   6104         elif pressed == 'up' and selected == 3:
   6105             newdub[3] += 0.1
   6106         elif pressed == 'down' and selected == 3:
   6107             if newdub[3] > 0.01:
   6108                 newdub[3] -= 0.1
   6109         elif pressed == 'insert' and yanked != '':
   6110             os.makedirs(filefolder, exist_ok=True)
   6111             dubmix.append(newdub)
   6112             dubrecord = filefolder + 'dub' + str(len(dubfiles)+1).zfill(3) + '.wav'
   6113             os.system('cp '+yanked+'.wav '+dubrecord)
   6114             dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, scene, shot)
   6115             dubselected = len(dubfiles) - 1
   6116             dubrecord=''
   6117             yanked = ''
   6118         elif pressed == 'record' or pressed == 'middle' and selected == 1:
   6119             dubmix.append(newdub)
   6120             dubrecord = filefolder + 'dub' + str(len(dubfiles)+1).zfill(3) + '.wav'
   6121             break
   6122         elif pressed == 'retake' and selected == 4:
   6123             dubrecord = filefolder + 'dub' + str(dubselected + 1).zfill(3) + '.wav'
   6124             break
   6125         #DUB SETTINGS
   6126         elif pressed == 'up' and selected == 4:
   6127             if dubselected + 1 < len(dubfiles):
   6128                 dubselected = dubselected + 1
   6129         elif pressed == 'down' and selected == 4:
   6130             if dubselected > 0:
   6131                 dubselected = dubselected - 1
   6132         elif pressed == 'move' and selected == 4:
   6133             vumetermessage('press insert button to move dub')
   6134             movedub = filefolder + 'dub' + str(dubselected + 1).zfill(3) + '.wav'
   6135         elif pressed == 'insert' and selected == 4:
   6136             vumetermessage('moving dub please hold on')
   6137             pastedub = filefolder + 'dub' + str(dubselected + 1).zfill(3) + '_insert.wav'
   6138             os.system('mv -n ' + movedub + ' ' + pastedub)
   6139             organizedubs(filefolder)
   6140             pastedub=''
   6141         elif pressed == 'remove' and selected == 4:
   6142             removedub(filefolder, dubselected + 1)
   6143             dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, scene, shot)
   6144             dubselected = len(dubfiles) - 1
   6145             if len(dubfiles) == 0:
   6146                 #save original sound
   6147                 saveoriginal = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/take'+str(take).zfill(3)+'.wav'
   6148                 print('no dubs, copying original sound to original')
   6149                 os.system('cp '+filefolder+'original.wav '+saveoriginal)
   6150                 #removedub folder
   6151                 os.system('rm -r ' + filefolder)
   6152                 time.sleep(1)
   6153                 selected = 0
   6154         elif pressed == 'up' and selected == 5:
   6155             if dubmix[dubselected][0] >= 0.99 and dubmix[dubselected][1] > 0.01:
   6156                 dubmix[dubselected][1] -= 0.1
   6157             if dubmix[dubselected][1] >= 0.99 and dubmix[dubselected][0] < 0.99:
   6158                 dubmix[dubselected][0] += 0.1
   6159         elif pressed == 'down' and selected == 5:
   6160             if dubmix[dubselected][1] >= 0.99 and dubmix[dubselected][0] > 0.01:
   6161                 dubmix[dubselected][0] -= 0.1
   6162             if dubmix[dubselected][0] >= 0.99 and dubmix[dubselected][1] < 0.99:
   6163                 dubmix[dubselected][1] += 0.1
   6164         elif pressed == 'up' and selected == 6:
   6165             dubmix[dubselected][2] += 0.1
   6166         elif pressed == 'down' and selected == 6:
   6167             if dubmix[dubselected][2] > 0.01:
   6168                 dubmix[dubselected][2] -= 0.1
   6169         elif pressed == 'up' and selected == 7:
   6170             dubmix[dubselected][3] += 0.1
   6171         elif pressed == 'down' and selected == 7:
   6172             if dubmix[dubselected][3] > 0.01:
   6173                 dubmix[dubselected][3] -= 0.1
   6174         if pressed == 'right':
   6175             if selected < (len(settings)-2):
   6176                 selected = selected + 1
   6177             else:
   6178                 selected = 0
   6179             selected == 0
   6180         elif pressed == 'left':
   6181             if selected > 0:
   6182                 selected = selected - 1
   6183             else:
   6184                 selected = len(settings) - 2
   6185         elif pressed == 'middle' and menu[selected] == 'BACK':
   6186             os.system('pkill aplay')
   6187             break
   6188         elif pressed == 'views': # mix dub and listen
   6189             run_command('pkill aplay')
   6190             dubfiles, dubmix, rerender = getdubs(filmfolder, filmname, scene, shot)
   6191             if scene:
   6192                 filename = filmfolder + filmname + '/scene' + str(scene).zfill(3) +'/scene'
   6193                 renderfilename = renderfilm(filmfolder, filmname, 0, scene)
   6194                 playdub(filmname,renderfilename, 'scene',take)
   6195             elif shot and scene:
   6196                 filename = filmfolder + filmname + '/scene' + str(scene).zfill(3) +'/shot' + str(scene).zfill(3)+'/shot'
   6197                 renderfilename = renderfilm(filmfolder, filmname, 0, scene)
   6198                 playdub(filmname,renderfilename, 'shot',take)
   6199             else:
   6200                 filename = filmfolder + filmname + '/' + filmname
   6201         time.sleep(0.05)
   6202     #Save dubmix before returning
   6203     if dubmix != dubmix_old:
   6204         if os.path.isdir(filefolder) == False:
   6205             os.makedirs(filefolder)
   6206         c = 1
   6207         for i in dubmix:
   6208             with open(filefolder + ".settings" + str(c).zfill(3), "w") as f:
   6209                 for p in i:
   6210                     f.write(str(round(p,1)) + '\n')
   6211                     print(str(round(p,1)))
   6212             c += 1
   6213         dubmix_old = dubmix
   6214     return dubrecord, yanked
   6215 
   6216 #---------------Play & DUB--------------------
   6217 
   6218 def playdub(filmname, filename, player_menu, take):
   6219     global headphoneslevel, miclevel, plughw, channels, filmfolder, scene, soundrate, soundformat, showhelp, camera, overlay, overlay2, gonzopifolder, i2cbuttons, film_fps, film_reso
   6220     #camera.stop_preview()
   6221     #overlay = removeimage(camera, overlay)
   6222     reso_w=film_reso.split('x')[0]
   6223     reso_h=film_reso.split('x')[1]
   6224     if film_reso == '1920x1080':
   6225         screen_reso_w='800'
   6226         screen_reso_h='475'
   6227         topspace='15'
   6228     elif film_reso == '1920x816':
   6229         screen_reso_w='800'
   6230         screen_reso_h='415'
   6231         topspace='75'
   6232     takename = 'take' + str(take).zfill(3)
   6233     if i2cbuttons == False:
   6234         hdmi_mode=True
   6235     else:
   6236         hdmi_mode=False
   6237     if showhelp == True:
   6238         overlay2 = removeimage(camera, overlay2)
   6239         overlay2 = displayimage(camera, gonzopifolder+'/extras/view-buttons.png', overlay, 4)
   6240     #read fastedit file
   6241     if player_menu == 'scene':
   6242         scenedir = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/'
   6243         try:
   6244             with open(scenedir + '.fastedit', 'r') as f:
   6245                 fastedit = f.read().splitlines()
   6246                 print(fastedit)
   6247         except:
   6248             print('no fastedit file found')
   6249             fastedit = 9999999
   6250     #omxplayer hack
   6251     os.system('rm /tmp/omxplayer*')
   6252     video = True
   6253     if player_menu == 'dub':
   6254         dub = True
   6255     else:
   6256         dub = False
   6257     if not os.path.isfile(filename + '.mp4'):
   6258         #should probably check if its not a corrupted video file
   6259         logger.info("no file to play")
   6260         if dub == True:
   6261             video = False
   6262         else:
   6263             return
   6264     sound = has_audio_track(filename + '.mp4')
   6265     t = 0
   6266     pressed = ''
   6267     buttonpressed = ''
   6268     buttontime = time.time()
   6269     holdbutton = ''
   6270     #playing = False
   6271     pause = False
   6272     trim = False
   6273     videolag = 0
   6274     trimfromstart=0
   6275     trimfromend=0
   6276     remove_shots = []
   6277     split_list=[]
   6278     oldmenu=''
   6279     if video == True:
   6280         if player_menu == 'dubbb':
   6281             try:
   6282                 if hdmi_mode==False:
   6283                     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)
   6284                 else:
   6285                     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)
   6286             except:
   6287                 writemessage('Something wrong with omxplayer')
   6288                 time.sleep(0.1)
   6289                 return
   6290         else:
   6291             try:
   6292                 if hdmi_mode==False:
   6293                     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)
   6294                 else:
   6295                     player = OMXPlayer(filename + '.mp4', args=['--adev', 'alsa:hw:'+str(plughw), '--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)
   6296             except:
   6297                 writemessage('Something wrong with omxplayer')
   6298                 time.sleep(0.1)
   6299                 return
   6300             #player = OMXPlayer(filename + '.mp4', args=['--fps', '25', '--layer', '3', '--win', '0,70,800,410', '--no-osd', '--no-keys'], dbus_name='org.mpris.MediaPlayer2.omxplayer1', pause=True)
   6301         writemessage('Loading..')
   6302         clipduration = player.duration()
   6303         #vumetermessage('up [fast-forward], down [rewind], help button for more')
   6304     if sound == False:
   6305         try:
   6306             playerAudio = OMXPlayer(filename + '.wav', args=['--adev','alsa:hw:'+str(plughw), '--loop'], dbus_name='org.mpris.MediaPlayer2.omxplayer2', pause=True)
   6307         except:
   6308             writemessage('something wrong with audio player')
   6309             time.sleep(0.1)
   6310             return
   6311     #omxplayer hack to play really short videos.
   6312     if clipduration < 4:
   6313         logger.info("clip duration shorter than 4 sec")
   6314         player.previous()
   6315         if sound == False:
   6316             playerAudio.previous()
   6317     if dub == True:
   6318         p = 0
   6319         while p < 3:
   6320             writemessage('Dubbing in ' + str(3 - p) + 's')
   6321             time.sleep(1)
   6322             p+=1
   6323     if video == True:
   6324         player.play()
   6325         #player.pause()
   6326         player.set_position(0)
   6327         if sound == False:
   6328             playerAudio.play()
   6329             #playerAudio.pause()
   6330             playerAudio.set_position(0)
   6331         #run_command('aplay -D plughw:0 ' + filename + '.wav &')
   6332         #run_command('mplayer ' + filename + '.wav &')
   6333     if player_menu == 'dub':
   6334         run_command(gonzopifolder + '/alsa-utils-1.1.3/aplay/arecord -D hw:'+str(plughw)+' -f '+soundformat+' -c '+str(channels)+' -r '+soundrate+' -vv '+filmfolder+'.tmp/dub.wav &')
   6335     time.sleep(0.5)
   6336     #try:
   6337     #    playerAudio.play()
   6338     #except:
   6339     #    logger.info('something wrong with omxplayer audio or playing film mp4 audio')
   6340         #logger.warning(e)
   6341     starttime = time.time()
   6342     selected = 1
   6343     while True:
   6344         if player_menu == 'scene':
   6345             fastedit_shot = 1
   6346             for i in fastedit:
   6347                 if int(t) > float(int(i)/1000):
   6348                     fastedit_shot = fastedit_shot + 1
   6349             if not remove_shots:
   6350                 vumetermessage('shot ' + str(fastedit_shot))
   6351             else:
   6352                 p = ''
   6353                 for i in remove_shots:
   6354                     p = p + str(i) + ','
   6355                 vumetermessage('shot ' + str(fastedit_shot) + ' remove:' + p)
   6356         if trim == True:
   6357             menu = 'CANCEL', 'FROM BEGINNING', 'FROM END'
   6358             settings = '','',''
   6359         elif pause == True:
   6360             if player_menu == 'shot':
   6361                 menu = 'BACK', 'PLAY', 'REPLAY', 'TRIM'
   6362                 settings = '','','',''
   6363             else:
   6364                 menu = 'BACK', 'PLAY', 'REPLAY'
   6365                 settings = '','',''
   6366         elif player_menu == 'dub': 
   6367             menu = 'BACK', 'REDUB', 'PHONES:', 'MIC:'
   6368             settings = '', '', str(headphoneslevel), str(miclevel)
   6369         else:
   6370             menu = 'BACK', 'PAUSE', 'REPLAY', 'PHONES:'
   6371             settings = '', '', '', str(headphoneslevel)
   6372         if dub == True:
   6373             header = 'Dubbing ' + str(round(t,1))
   6374         else:
   6375             header = 'Playing ' + str(datetime.timedelta(seconds=round(t))) + ' of ' + str(datetime.timedelta(seconds=round(clipduration))) + ' s'
   6376         oldmenu=writemenu(menu,settings,selected,header,showmenu,oldmenu)
   6377         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   6378         if buttonpressed == True:
   6379             flushbutton()
   6380         if pressed == 'remove':
   6381             vumetermessage('video cuts removed!')
   6382             trimfromstart=0
   6383             trimfromend=0
   6384             split_list=[]
   6385         #SHOWHELP
   6386         elif pressed == 'showhelp':
   6387             vumetermessage('Button layout')
   6388             if showhelp == False:
   6389                 overlay2 = removeimage(camera, overlay2)
   6390                 overlay2 = displayimage(camera, gonzopifolder+'/extras/view-buttons.png', overlay, 4)
   6391                 showhelp = True
   6392             elif showhelp == True:
   6393                 overlay2 = removeimage(camera, overlay2)
   6394                 updatethumb =  True
   6395                 showhelp = False
   6396         elif pressed == 'right':
   6397             if selected < (len(settings) - 1):
   6398                 selected = selected + 1
   6399         elif pressed == 'left':
   6400             if selected > 0:
   6401                 selected = selected - 1
   6402         elif pressed == 'up':
   6403             if menu[selected] == 'PHONES:':
   6404                 if headphoneslevel < 100:
   6405                     headphoneslevel = headphoneslevel + 2
   6406                     run_command('amixer -c 0 sset Speaker ' + str(headphoneslevel) + '%')
   6407             elif menu[selected] == 'MIC:':
   6408                 if miclevel < 100:
   6409                     miclevel = miclevel + 2
   6410                     run_command('amixer -c 0 sset Mic ' + str(miclevel) + '% unmute')
   6411             else:
   6412                 if pause == False:
   6413                     try:
   6414                         player.set_position(t+2)
   6415                         if sound == False:
   6416                             playerAudio.set_position(t+2)
   6417                         time.sleep(0.2)
   6418                         #playerAudio.set_position(player.position())
   6419                     except:
   6420                         print('couldnt set position of player')
   6421                 else:
   6422                     try:
   6423                         player.play()
   6424                         if sound == False:
   6425                             playerAudio.play()
   6426                         time.sleep(0.3)
   6427                         t=t+0.1 
   6428                         player.set_position(t)
   6429                         player.pause()
   6430                         if sound == False:
   6431                             playerAudio.set_position(t)
   6432                             playerAudio.pause()
   6433                         #playerAudio.set_position(player.position())
   6434                     except:
   6435                         print('couldnt set position of player')
   6436         elif pressed == 'down':
   6437             if menu[selected] == 'PHONES:':
   6438                 if headphoneslevel > 0:
   6439                     headphoneslevel = headphoneslevel - 2
   6440                     run_command('amixer -c 0 sset Speaker ' + str(headphoneslevel) + '%')
   6441             elif menu[selected] == 'MIC:':
   6442                 if miclevel > 0:
   6443                     miclevel = miclevel - 2
   6444                     run_command('amixer -c 0 sset Mic ' + str(miclevel) + '% unmute')
   6445             else:
   6446                 if pause == False:
   6447                     if t > 1:
   6448                         try:
   6449                             player.set_position(t-2)
   6450                             if sound == False:
   6451                                 playerAudio.set_position(t-2)
   6452                             time.sleep(0.25)
   6453                             #playerAudio.set_position(player.position())
   6454                         except:
   6455                             print('couldnt set position of player')
   6456                 else:
   6457                     try:
   6458                         player.play()
   6459                         if sound == False:
   6460                             playerAudio.play()
   6461                         time.sleep(0.3)
   6462                         t=t-0.1
   6463                         player.set_position(t)
   6464                         player.pause()
   6465                         if sound == False:
   6466                             playerAudio.set_position(t)
   6467                             playerAudio.pause()
   6468                         #playerAudio.set_position(player.position())
   6469                     except:
   6470                         print('couldnt set position of player')
   6471         elif holdbutton == 'copy':
   6472             if t > 1:
   6473                 try:
   6474                     player.set_position(t-60)
   6475                     if sound == False:
   6476                         playerAudio.set_position(t-60)
   6477                     time.sleep(0.25)
   6478                     #playerAudio.set_position(player.position())
   6479                 except:
   6480                     print('couldnt set position of player')
   6481         elif holdbutton == 'insert':
   6482             if t > 1:
   6483                 try:
   6484                     player.set_position(t+60)
   6485                     if sound == False:
   6486                         playerAudio.set_position(t+60)
   6487                     time.sleep(0.25)
   6488                     #playerAudio.set_position(player.position())
   6489                 except:
   6490                     print('couldnt set position of player')
   6491         elif pressed == 'view':
   6492             trimfromstart = player.position()
   6493             vumetermessage('shot start position set to: '+ str(trimfromstart))
   6494             player.pause()
   6495             if sound == False:
   6496                 playerAudio.pause()
   6497             time.sleep(0.5)
   6498             player.play()
   6499             if sound == False:
   6500                 playerAudio.play()
   6501         elif pressed == 'record':
   6502             if trimfromstart != 0 and trimfromend != 0 and trimfromstart < trimfromend:
   6503                 split_list.append([[trimfromstart, trimfromend], takename])
   6504                 vumetermessage('split '+str(len(split_list))+' position set to: '+ str(player.position()))
   6505                 player.pause()
   6506                 if sound == False:
   6507                     playerAudio.pause()
   6508                 time.sleep(0.5)
   6509                 player.play()
   6510                 if sound == False:
   6511                     playerAudio.play()
   6512         elif pressed == 'retake':
   6513             if player.position() < clipduration:
   6514                 trimfromend = player.position()
   6515                 vumetermessage('shot end position set to: '+ str(trimfromend))
   6516                 player.pause()
   6517                 if sound == False:
   6518                     playerAudio.pause()
   6519                 time.sleep(0.5)
   6520                 player.play()
   6521                 if sound == False:
   6522                     playerAudio.play()
   6523         elif pressed == 'middle':
   6524             time.sleep(0.2)
   6525             if menu[selected] == 'BACK' or player.playback_status() == "Stopped" or pressed == 'record':
   6526                 try:
   6527                     if video == True:
   6528                         #player.stop()
   6529                         #playerAudio.stop()
   6530                         player.quit()
   6531                         if sound == False:
   6532                             playerAudio.quit()
   6533                     #os.system('pkill -9 aplay') 
   6534                 except:
   6535                     #kill it if it dont stop
   6536                     print('OMG! kill dbus-daemon')
   6537                 if dub == True:
   6538                     os.system('pkill arecord')
   6539                     time.sleep(0.2)
   6540                 os.system('pkill -9 omxplayer')
   6541                 #os.system('pkill -9 dbus-daemon')
   6542                 return [trimfromstart, trimfromend], split_list
   6543             elif menu[selected] == 'REPLAY' or menu[selected] == 'REDUB':
   6544                 pause = False
   6545                 try:
   6546                     os.system('pkill aplay')
   6547                     if dub == True:
   6548                         os.system('pkill arecord')
   6549                     if video == True:
   6550                         player.pause()
   6551                         player.set_position(0)
   6552                         if sound == False:
   6553                             playerAudio.pause()
   6554                             playerAudio.set_position(0)
   6555                     if dub == True:
   6556                         p = 0
   6557                         while p < 3:
   6558                             writemessage('Dubbing in ' + str(3 - p) + 's')
   6559                             time.sleep(1)
   6560                             p+=1
   6561                     player.play()
   6562                     if sound == False:
   6563                         playerAudio.play()
   6564                     #if player_menu != 'film':
   6565                     #    playerAudio.play()
   6566                     #run_command('aplay -D plughw:0 ' + filename + '.wav &')
   6567                     if dub == True:
   6568                         run_command(gonzopifolder + '/alsa-utils-1.1.3/aplay/arecord -D hw:'+str(plughw)+' -f '+soundformat+' -c '+str(channels)+' -r '+soundrate+' -vv '+filmfolder+'.tmp/dub.wav &')
   6569                 except:
   6570                     pass
   6571                 starttime = time.time()
   6572             # check if not to close to end otherwise will throw error
   6573             elif menu[selected] == 'PAUSE':
   6574                 try:
   6575                     player.pause()
   6576                     if sound == False:
   6577                         playerAudio.pause()
   6578                     pause = True
   6579                 except:
   6580                     pass
   6581                 #try:
   6582                 #    playerAudio.pause()
   6583                 #except:
   6584                 #    pass
   6585             elif menu[selected] == 'PLAY':
   6586                 try:
   6587                     player.play()
   6588                     if sound == False:
   6589                         playerAudio.play()
   6590                     pause = False
   6591                 except:
   6592                     pass
   6593                 #try:
   6594                 #    playerAudio.play()
   6595                 #except:
   6596                 #    pass
   6597             elif menu[selected] == 'TRIM':
   6598                 selected = 1
   6599                 trim = True
   6600             elif menu[selected] == 'CANCEL':
   6601                 selected = 1
   6602                 trim = False
   6603             elif menu[selected] == 'FROM BEGINNING':
   6604                 trim = ['beginning', player.position()]
   6605                 player.quit()
   6606                 #playerAudio.quit()
   6607                 return trim, split_list
   6608             elif menu[selected] == 'FROM END':
   6609                 trim = ['end', player.position()]
   6610                 player.quit()
   6611                 if sound == False:
   6612                     playerAudio.quit()
   6613                 return trim, split_list
   6614         time.sleep(0.02)
   6615         if pause == False:
   6616             try:
   6617                 t = player.position()
   6618             except:
   6619                 os.system('pkill aplay') 
   6620                 if dub == True:
   6621                     os.system('pkill arecord')
   6622                 player.quit()
   6623                 if sound == False:
   6624                     playerAudio.quit()
   6625                 return [trimfromstart, trimfromend], split_list
   6626                 #return remove_shots
   6627         if t > (clipduration - 0.3):
   6628             os.system('pkill aplay') 
   6629             if dub == True:
   6630                 os.system('pkill arecord')
   6631             player.quit()
   6632             if sound == False:
   6633                 playerAudio.quit()
   6634             return [trimfromstart, trimfromend], split_list
   6635     try:
   6636         player.quit()
   6637         if sound == False:
   6638             playerAudio.quit()
   6639     except:
   6640         pass
   6641     return [trimfromstart, trimfromend], split_list
   6642     #playerAudio.quit()
   6643     #os.system('pkill dbus-daemon')
   6644 
   6645 #---------------View Film--------------------
   6646 
   6647 def viewfilm(filmfolder, filmname):
   6648     scenes, shots, takes = countlast(filmname, filmfolder)
   6649     scene = 1
   6650     filmfiles = []
   6651     while scene <= scenes:
   6652         shots = countshots(filmname, filmfolder, scene)
   6653         if shots > 0:
   6654             filmfiles.extend(shotfiles(filmfolder, filmname, scene))
   6655         scene = scene + 1
   6656     return filmfiles
   6657 
   6658 
   6659 #--------------Save video crossfade settings-----------------
   6660 
   6661 def crossfadesave(filmfolder, s, trimfile):
   6662     #db.insert('videos', tid=datetime.datetime.now())
   6663     settings=s,trimfile
   6664     try:
   6665         with open(filmfolder + ".crossfade", "wb") as f:
   6666             pickle.dump(settings, f)
   6667             #logger.info("settings saved")
   6668     except:
   6669         logger.warning("could not save settings")
   6670         #logger.warning(e)
   6671     return
   6672 
   6673 #--------------Save video trim settings-----------------
   6674 
   6675 def videotrimsave(filmfolder, where, s, trimfile):
   6676     #db.insert('videos', tid=datetime.datetime.now())
   6677     settings=s,trimfile
   6678     try:
   6679         with open(filmfolder + "."+where, "wb") as f:
   6680             pickle.dump(settings, f)
   6681             #logger.info("settings saved")
   6682     except:
   6683         logger.warning("could not save settings")
   6684         #logger.warning(e)
   6685     return
   6686 
   6687 #--------------Save split settings-----------------
   6688 
   6689 def split_list_save(foldername, splitlist):
   6690     #db.insert('videos', tid=datetime.datetime.now())
   6691     settings=splitlist
   6692     try:
   6693         with open(foldername + ".split", "wb") as f:
   6694             pickle.dump(settings, f)
   6695             logger.info("split settings saved")
   6696     except:
   6697         logger.warning("could not save settings")
   6698         #logger.warning(e)
   6699     return
   6700 
   6701 
   6702 #---------------Video Trim--------------------
   6703 
   6704 def videotrim(filmfolder, foldername ,filename, where, s, t, make_new_take_or_shot):
   6705     global film_reso, db
   6706     #theres two different ways of non-rerendering mp4 cut techniques that i know MP4Box and ffmpeg
   6707     if make_new_take_or_shot == 'take':
   6708         trim_filename = foldername+filename[:-3] + str(counttakes2(foldername)+1).zfill(3)
   6709     else:
   6710         trim_filename = make_new_take_or_shot
   6711     filename=foldername+filename
   6712     if where == 'both':
   6713         s=round(s, 3)
   6714         t=round(t, 3)
   6715         video_edit_len=round(float(t)-float(s),3)
   6716         videos_totalt = db.query("SELECT COUNT(*) AS videos FROM videos")[0]
   6717         tot = int(videos_totalt.videos)
   6718         video_origins=filmfolder+'.videos/'+datetime.datetime.now().strftime('%Y%d%m')+'_'+os.urandom(8).hex()+'_'+str(tot).zfill(5)
   6719         run_command('ffmpeg -i '+filename+'.mp4 -ss '+str(s)+' -t '+str(video_edit_len)+' -c:v copy -c:a copy -y '+video_origins+'.mp4')
   6720         os.system('ln -sfr '+video_origins+'.mp4 '+trim_filename+'.mp4')
   6721         run_command('ffmpeg -i '+filename+'.wav -ss '+str(s)+' -t '+str(video_edit_len)+' -c:a copy -y '+video_origins+'.wav')
   6722         os.system('ln -sfr '+video_origins+'.wav '+trim_filename+'.wav')
   6723         #run_command('ecasound -i:'+filename+'.wav -o:'+trim_filename+'.wav -ss:'+str(s)+' -t:'+str(video_edit_len))
   6724         #if os.path.exists(foldername+'dub') == True:
   6725         #    dubfiles, dubmix, rerender = getdubs(foldername+'dub/', None, None, None)
   6726         #    for d in dubfiles:
   6727         #        writemessage('trimming dubs from beginning and end')
   6728         #        vumetermessage(d)
   6729         #        #audiotrim(trim_filename, 'beginning', d)
   6730         #        run_command('ecasound -i:'+d+' -o:'+d+'_temp -ss '+str(s)+' -t '+str(t))
   6731         #    writemessage('trimming original sound')
   6732     elif where == 'beginning':
   6733         logger.info('trimming clip from beginning')
   6734         #run_command('ffmpeg -ss ' + str(s) + ' -i ' + filename + '.mp4 -c copy ' + trim_filename + '.mp4')
   6735         #ffmpeg -fflags +genpts -r 25 -i take009.mp4 -c:v h264_omx -crf 20 -profile:v high -level:v 4.2 -preset slower -bsf:v h264_metadata=level=4.2 -g 1 -b:v 8888888 take010.mp4
   6736         #run_command('MP4Box ' + filename + '.mp4 -splitx ' + str(s) + ':end -out ' + trim_filename +  '.mp4')
   6737         videos_totalt = db.query("SELECT COUNT(*) AS videos FROM videos")[0]
   6738         tot = int(videos_totalt.videos)
   6739         video_origins=filmfolder+'.videos/'+datetime.datetime.now().strftime('%Y%d%m')+'_'+os.urandom(8).hex()+'_'+str(tot).zfill(5)
   6740         run_command('ffmpeg -i '+filename+'.mp4 -ss '+str(s)+' -c:v copy -c:a copy -y '+video_origins+'.mp4')
   6741         run_command('cp ' + filename + '.wav ' + video_origins + '.wav')
   6742         audiotrim(video_origins, 'beginning','')
   6743         os.system('ln -sfr '+video_origins+'.mp4 '+trim_filename+'.mp4')
   6744         os.system('ln -sfr '+video_origins+'.wav '+trim_filename+'.wav')
   6745         #if os.path.exists(foldername+'dub') == True:
   6746         #    dubfiles, dubmix, rerender = getdubs(foldername+'dub/', None, None, None)
   6747         #    for d in dubfiles:
   6748         #        writemessage('trimming dubs from beginning')
   6749         #        vumetermessage(d)
   6750         #        audiotrim(trim_filename, 'beginning', d)
   6751         #    writemessage('trimming original sound')
   6752         #    audiotrim(trim_filename, 'beginning', foldername+'dub/original.wav')
   6753     elif where == 'end':
   6754         logger.info('trimming clip from end')
   6755         #run_command('ffmpeg -to ' + str(s) + ' -i ' + filename + '.mp4 -c copy ' + trim_filename + '.mp4')
   6756         #run_command('MP4Box ' + filename + '.mp4 -splitx 0:' + str(s) + ' -out ' + trim_filename + '.mp4')
   6757         videos_totalt = db.query("SELECT COUNT(*) AS videos FROM videos")[0]
   6758         tot = int(videos_totalt.videos)
   6759         video_origins=filmfolder+'.videos/'+datetime.datetime.now().strftime('%Y%d%m')+'_'+os.urandom(8).hex()+'_'+str(tot).zfill(5)
   6760         run_command('ffmpeg -i '+filename+'.mp4 -t '+str(s)+' -c:v copy -c:a copy -y '+video_origins+'.mp4')
   6761         run_command('cp ' + filename + '.wav ' + video_origins + '.wav')
   6762         audiotrim(video_origins, 'end','')
   6763         os.system('ln -sfr '+video_origins+'.mp4 '+trim_filename+'.mp4')
   6764         os.system('ln -sfr '+video_origins+'.wav '+trim_filename+'.wav')
   6765         #if os.path.exists(foldername+'dub') == True:
   6766         #    dubfiles, dubmix, rerender = getdubs(foldername+'dub/', None, None, None)
   6767         #    for d in dubfiles:
   6768         #        writemessage('trimming dubs from end')
   6769         #        vumetermessage(d)
   6770         #        audiotrim(trim_filename, 'end', d)
   6771         #    writemessage('trimming original sound')
   6772         #    audiotrim(trim_filename, 'end', foldername+'dub/original.wav')
   6773     #take last frame 
   6774     videolength = get_video_length(video_origins+'.mp4')
   6775     db.insert('videos', tid=datetime.datetime.now(), filename=video_origins+'.mp4', foldername=foldername, audiolength=videolength/1000, videolength=videolength/1000)
   6776     if film_reso == '1920x1080':
   6777         run_command('ffmpeg -y -sseof -1 -i ' + trim_filename + '.mp4 -update 1 -q:v 1 -vf scale=800:450 ' + trim_filename + '.jpeg')
   6778         run_command('ffmpeg -y -sseof -1 -i ' + trim_filename + '.mp4 -update 1 -q:v 1 -vf scale=80:45 ' + trim_filename + '_thumb.jpeg')
   6779     elif film_reso == '1920x816':
   6780         run_command('ffmpeg -y -sseof -1 -i ' + trim_filename + '.mp4 -update 1 -q:v 1 -vf scale=800:340 ' + trim_filename + '.jpeg')
   6781     return
   6782 
   6783 #---------------Video Trim From start and end--------------------
   6784 
   6785 def fastvideotrim(filename, trim_filename, beginning, end):
   6786     #theres two different ways of non-rerendering mp4 cut techniques that i know MP4Box and ffmpeg
   6787     logger.info('trimming clip from beginning and end')
   6788     #run_command('ffmpeg -to ' + str(s) + ' -i ' + filename + '.mp4 -c copy ' + trim_filename + '.mp4')
   6789     run_command('MP4Box ' + filename + '.mp4 -splitx '+ str(beginning)+ ':' + str(end) + ' -out ' + trim_filename + '.mp4')
   6790     run_command('cp ' + filename + '.wav ' + trim_filename + '.wav')
   6791     fastaudiotrim(trim_filename, beginning, end)
   6792     #take last frame 
   6793     run_command('ffmpeg -sseof -1 -i ' + trim_filename + '.mp4 -update 1 -q:v 1 -vf scale=800:450 ' + trim_filename + '.jpeg')
   6794     return
   6795 
   6796 #--------------Get Audio cards--------------
   6797 def getaudiocards():
   6798     with open("/proc/asound/cards") as fp:
   6799         cards = fp.readlines()
   6800     audiocards = []
   6801     for i in cards:
   6802         if i[1] in ['0','1','2','3']:
   6803             print('audio card 0: ' + i[22:].rstrip('\n'))
   6804             audiocards.append(i[22:].rstrip('\n'))
   6805     return audiocards
   6806 
   6807 #--------------Fast Audio Trim--------------------
   6808 # make audio file same length as video file
   6809 def fastaudiotrim(filename, beginning, end):
   6810     run_command('sox -V0 ' + filename + '.wav ' + filename + '_temp.wav trim ' + beginning + ' ' + end)
   6811     run_command('sox -V0 -G ' + filename + '_temp.wav ' + filename + '.wav fade 0.01 0 0.01')
   6812 
   6813 #--------------Audio Trim--------------------
   6814 # make audio file same length as video file
   6815 def audiotrim(filename, where, dub):
   6816     global channels, fps, db
   6817     videofile=filename
   6818     audiosync=0
   6819     print("chaaaaaaaaaaaaaaaanel8: " +str(channels))
   6820     writemessage('Audio syncing..')
   6821     #pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + filename + '.mp4', shell=True)
   6822     #videolength = pipe.decode().strip()
   6823     videolength = get_video_length(filename+'.mp4')
   6824     print('videolength:'+str(videolength))
   6825     if dub:
   6826         #pipe = subprocess.check_output('mediainfo --Inform="Audio;%Duration%" ' + dub[:-4] + '.wav', shell=True)
   6827         #audiolength = pipe.decode().strip()
   6828         audiolength = get_audio_length(dub[:-4] + '.wav')
   6829     else:
   6830         try:
   6831             #pipe = subprocess.check_output('mediainfo --Inform="Audio;%Duration%" ' + filename + '.wav', shell=True)
   6832             #audiolength = pipe.decode().strip()
   6833             audiolength = get_audio_length(filename+'.wav')
   6834         except:
   6835             audiosilence(filename)
   6836             audiolength=videolength
   6837         #if there is no audio length
   6838     logger.info('audio is:' + str(audiolength))
   6839     #separate seconds and milliseconds
   6840     #videoms = int(videolength) % 1000
   6841     #audioms = int(audiolength) % 1000
   6842     #videos = int(videolength) / 1000
   6843     #audios = int(audiolength) / 1000
   6844     video_origins = (os.path.realpath(filename+'.mp4'))
   6845     audio_origins = (os.path.realpath(filename+'.wav'))
   6846     if int(audiolength) > int(videolength):
   6847         #calculate difference
   6848         audiosync = int(audiolength) - int(videolength)
   6849         newaudiolength = int(audiolength) - audiosync
   6850         logger.info('Audiofile is: ' + str(audiosync) + 'ms longer')
   6851         #trim from end or beginning and put a 0.01 in- and outfade
   6852         if where == 'end':
   6853             if dub:
   6854                 run_command('sox -V0 -b 16 ' + dub[:-4] + '.wav -c 2 ' + dub[:-4] + '_temp.wav trim 0 -' + str(int(audiosync)/1000))
   6855             else:
   6856                 run_command('sox -V0 -b 16 ' + filename + '.wav -c 2 ' + filename + '_temp.wav trim 0 -' + str(int(audiosync)/1000))
   6857         if where == 'beginning':
   6858             if dub:
   6859                 logger.info('trimming from beginning at: '+str(int(audiosync)/1000))
   6860                 run_command('sox -V0 -b 16 ' + dub[:-4] + '.wav -c 2 ' + dub[:-4] + '_temp.wav trim ' + str(int(audiosync)/1000))
   6861             else:
   6862                 logger.info('trimming from beginning at: '+str(int(audiosync)/1000))
   6863                 run_command('sox -V0 -b 16 ' + filename + '.wav -c 2 ' + filename + '_temp.wav trim ' + str(int(audiosync)/1000))
   6864         if dub:
   6865             run_command('sox -V0 -b 16 -G ' + dub[:-4] + '_temp.wav -c 2 ' + dub[:-4] + '.wav fade 0.01 0 0.01')
   6866             os.remove(dub[:-4] + '_temp.wav')
   6867         else:
   6868             run_command('sox -V0 -b 16 -G ' + filename + '_temp.wav -c 2 ' + audio_origins + ' fade 0.01 0 0.01')
   6869             os.remove(filename + '_temp.wav')
   6870         #if int(audiosync) > 400:
   6871         #    writemessage('WARNING!!! VIDEO FRAMES DROPPED!')
   6872         #    vumetermessage('Consider changing to a faster microsd card.')
   6873         #    time.sleep(10)
   6874         delayerr = 'A' + str(audiosync)
   6875         print(delayerr)
   6876     elif int(audiolength) < int(videolength):
   6877         audiosync = int(videolength) - int(audiolength)
   6878         #calculate difference
   6879         #audiosyncs = videos - audios
   6880         #audiosyncms = videoms - audioms
   6881         #if audiosyncms < 0:
   6882         #    if audiosyncs > 0:
   6883         #        audiosyncs = audiosyncs - 1
   6884         #    audiosyncms = 1000 + audiosyncms
   6885         logger.info('Videofile is: ' + str(audiosync) + 'ms longer')
   6886         logger.info('Videofile is: ' + str(int(audiosync)/1000) + 's longer')
   6887         #time.sleep(2)
   6888         #make fade
   6889         #make delay file
   6890         print(str(int(audiosync)/1000))
   6891         if dub:
   6892             run_command('sox -V0 -b 16 -r '+soundrate+' '+dub[:-4]+'.wav -c 2 '+dub[:-4]+'_temp.wav trim 0.0 pad 0 ' + str(int(audiosync)/1000))
   6893             run_command('sox -V0 -b 16 -G ' + dub[:-4] + '_temp.wav -c 2 ' + dub[:-4] + '.wav fade 0.01 0 0.01')
   6894         else:
   6895             run_command('sox -V0 -b 16 -r '+soundrate+' '+filename+'.wav -c 2 '+filename+'_temp.wav trim 0.0 pad 0 ' + str(int(audiosync)/1000))
   6896             run_command('sox -V0 -b 16 -G ' + filename + '_temp.wav -c 2 ' + audio_origins + ' fade 0.01 0 0.01')
   6897         #add silence to end
   6898         #run_command('sox -V0 /dev/shm/silence.wav ' + filename + '_temp.wav')
   6899         #run_command('cp '+filename+'.wav '+filename+'_temp.wav')
   6900         #run_command('sox -V0 -G ' + filename + '_temp.wav /dev/shm/silence.wav ' + filename + '.wav')
   6901         if dub:
   6902             os.remove(dub[:-4] + '_temp.wav')
   6903         else:
   6904             os.remove(filename + '_temp.wav')
   6905         #os.remove('/dev/shm/silence.wav')
   6906         delayerr = 'V' + str(audiosync)
   6907         print(delayerr)
   6908     #print('the results:')
   6909     #if dub:
   6910     #    pipe = subprocess.check_output('mediainfo --Inform="Audio;%Duration%" ' + dub[:-4] + '.wav', shell=True)
   6911     #    audiolength = pipe.decode().strip()
   6912     #else:
   6913     #    pipe = subprocess.check_output('mediainfo --Inform="Audio;%Duration%" ' + filename + '.wav', shell=True)
   6914     #    audiolength = pipe.decode().strip()
   6915     #print('aftersyncvideo: '+str(videolength) + ' audio:'+str(audiolength))
   6916     #if int(audiolength) != int(videolength):
   6917     #    vumetermessage('SYNCING FAILED!')
   6918     #    time.sleep(10)
   6919     #os.remove('/dev/shm/' + filename + '.wav')
   6920     return float(audiosync)/1000, int(videolength), int(audiolength)
   6921     #os.system('mv audiosynced.wav ' + filename + '.wav')
   6922     #os.system('rm silence.wav')
   6923 
   6924 #--------------Audiosilence--------------------
   6925 # make an empty audio file as long as a video file
   6926 
   6927 def audiosilence(renderfilename):
   6928     global channels, soundrate,filmfolder
   6929     writemessage('Creating audiosilence..')
   6930     #pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + renderfilename + '.mp4', shell=True)
   6931     #videolength = pipe.decode()
   6932     logger.info('checking video length')
   6933     videolength = get_video_length(renderfilename+'.mp4')
   6934     audio_origins = (os.path.realpath(renderfilename+'.mp4'))[:-4]
   6935     logger.info('Video length is ' + str(videolength))
   6936     #separate seconds and milliseconds
   6937     videoms = int(videolength) % 1000
   6938     videos = int(videolength) / 1000
   6939     logger.info('Videofile is: ' + str(videos) + 's ' + str(videoms))
   6940     run_command('sox -V0 -n -b 16 -r '+soundrate+' -c 2 '+filmfolder+'.tmp/silence.wav trim 0.0 ' + str(videos))
   6941     videos_totalt = db.query("SELECT COUNT(*) AS videos FROM videos")[0]
   6942     tot = int(videos_totalt.videos)
   6943     #audio_origins=datetime.datetime.now().strftime('%Y%d%m')+'_'+os.urandom(8).hex()+'_'+str(tot).zfill(5)
   6944     os.system('cp '+filmfolder+'.tmp/silence.wav '+audio_origins+'.wav')
   6945     os.system('ln -sfr '+audio_origins+'.wav '+renderfilename+'.wav')
   6946     os.system('rm '+filmfolder+'.tmp/silence.wav')
   6947 
   6948 #--------------USB filmfolder-------------------
   6949 
   6950 def usbfilmfolder(dsk):
   6951     if dsk == 1:
   6952         usbmount = 1
   6953     else:
   6954         usbmount = 0
   6955     pressed = ''
   6956     buttonpressed = ''
   6957     buttontime = time.time()
   6958     holdbutton = ''
   6959     writemessage('Searching for usb storage device, middlebutton to cancel')
   6960     if os.path.exists('/dev/sda1') == True:
   6961         os.system('sudo mount -o  noatime,nodiratime,async /dev/sda1 /media/usb0')
   6962         os.system('sudo chown pi /media/usb0')
   6963         os.system('sudo echo none | sudo tee /sys/block/sda/queue/scheduler')
   6964         #os.system('sudo umount -l /media/usb0')
   6965     if os.path.exists('/dev/sdb1') == True:
   6966         os.system('sudo mount -o  noatime,nodiratime,async /dev/sdb1 /media/usb1')
   6967         os.system('sudo chown pi /media/usb1')
   6968         os.system('sudo echo none | sudo tee /sys/block/sda/queue/scheduler')
   6969         #os.system('sudo umount -l /media/usb0')
   6970     waiting = time.time() 
   6971     while True:
   6972         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   6973         usbconnected = os.path.ismount('/media/usb'+str(usbmount))
   6974         if pressed == 'middle' or time.time() - waiting > 8:
   6975             writemessage('canceling..')
   6976             break
   6977         time.sleep(0.02)
   6978         if usbconnected == True:
   6979             try:
   6980                 os.makedirs('/media/usb'+str(usbmount)+'/gonzopifilms/')
   6981             except:
   6982                 pass
   6983             try:
   6984                 p = subprocess.check_output('stat -f -c %T /media/usb'+str(usbmount), shell=True)
   6985                 filesystem = p.decode()
   6986                 print('filesystem info: ' + filesystem)
   6987             except:
   6988                 writemessage('Oh-no! dont know your filesystem')
   6989                 waitforanykey()
   6990             filmfolder = '/media/usb'+str(usbmount)+'/gonzopifilms/'
   6991             os.system('sudo chmod 755 /media/usb'+str(usbmount))
   6992             os.system('sudo chmod 755 '+filmfolder)
   6993             #run_command('pumount /media/usb'+str(usbmount))
   6994             writemessage('Filming to USB'+str(usbmount))
   6995             #time.sleep(1)
   6996             return filmfolder
   6997         else:
   6998             return
   6999 
   7000 #--------------Copy to USB-------------------
   7001 
   7002 def copytousb(filmfolder):
   7003     pressed = ''
   7004     buttonpressed = ''
   7005     buttontime = time.time()
   7006     holdbutton = ''
   7007     writemessage('Searching for usb storage device, middlebutton to cancel')
   7008     films = getfilms(filmfolder)
   7009     if 'usb0' in filmfolder:
   7010         usbmount = 1
   7011     else:
   7012         usbmount = 0
   7013     while True:
   7014         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   7015         usbconnected = os.path.ismount('/media/usb'+str(usbmount))
   7016         if pressed == 'middle':
   7017             writemessage('canceling..')
   7018             time.sleep(2)
   7019             break
   7020         time.sleep(0.02)
   7021         if usbconnected == True:
   7022             #Copy new files to usb device
   7023             try:
   7024                 os.makedirs('/media/usb'+str(usbmount)+'/gonzopifilms/')
   7025             except:
   7026                 pass
   7027             try:
   7028                 p = subprocess.check_output('stat -f -c %T /media/usb'+str(usbmount), shell=True)
   7029                 filesystem = p.decode()
   7030                 print('filesystem info: ' + filesystem)
   7031             except:
   7032                 writemessage('Oh-no! dont know your filesystem')
   7033                 waitforanykey()
   7034                 return
   7035             for filmname in films:
   7036                 #check filmhash
   7037                 filmname = filmname[0]
   7038                 usbpath = '/media/usb'+str(usbmount)+'/gonzopifilms/'+filmname
   7039                 usbvideopath = '/media/usb0/gonzopifilms/.videos/'
   7040                 usbfilmhash = ''
   7041                 filmhash = ''
   7042                 while True:
   7043                     if os.path.exists(usbpath) == False:
   7044                         break
   7045                     try:
   7046                         with open(filmfolder + filmname + '/.filmhash', 'r') as f:
   7047                             filmhash = f.readline().strip()
   7048                         print('filmhash is: ' + filmhash)
   7049                     except:
   7050                         print('no filmhash found!')
   7051                     try:
   7052                         with open(usbpath + '/.filmhash', 'r') as f:
   7053                             usbfilmhash = f.readline().strip()
   7054                         print('usbfilmhash is: ' + usbfilmhash)
   7055                     except:
   7056                         print('no usbfilmhash found!')
   7057                     if usbfilmhash == filmhash:
   7058                         print('same moviefilm found, updating clips...')
   7059                         break
   7060                     else:
   7061                         writemessage('Found a subsequent moviefilm...')
   7062                         print('same film exist with different filmhashes, copying to subsequent film folder')
   7063                         time.sleep(2)
   7064                         usbpath += '_new'
   7065                 try:
   7066                     os.makedirs(usbpath)
   7067                     writemessage('Copying film ' + filmname + '...')
   7068                 except:
   7069                     writemessage('Found existing ' + filmname + ', copying new files... ')
   7070                 try:
   7071                     run_command('rsync -avr -P ' + filmfolder + filmname + '/ ' + usbpath)
   7072                     run_command('rsync -avr -P ' + filmfolder + '.videos/ ' + usbvideopath)
   7073                 except:
   7074                     writemessage('couldnt copy film ' + filmname)
   7075                     waitforanykey()
   7076                     return
   7077             run_command('sync')
   7078             writemessage('all files copied successfully!')
   7079             waitforanykey()
   7080             run_command('pumount /media/usb'+str(usbmount))
   7081             writemessage('You can safely unplug the usb device now')
   7082             time.sleep(2)
   7083             return
   7084         else:
   7085             usbmount = usbmount + 1
   7086 
   7087 #-----------Check for the webz---------
   7088 
   7089 def webz_on():
   7090     try:
   7091         # connect to the host -- tells us if the host is actually
   7092         # reachable
   7093         socket.create_connection(("google.com", 80))
   7094         return True
   7095     except OSError:
   7096         pass
   7097     writemessage('No internet connection!')
   7098     time.sleep(2)
   7099     return False
   7100 
   7101 #-------------Upload film------------
   7102 
   7103 def uploadfilm(filename, filmname):
   7104     pressed = ''
   7105     buttonpressed = ''
   7106     buttontime = time.time()
   7107     holdbutton = ''
   7108     mods = ['Back']
   7109     settings = ['']
   7110     writemessage('Searching for upload mods')
   7111     with open(gonzopifolder + '/mods/upload-mods-enabled') as m:
   7112         mods.extend(m.read().splitlines())
   7113     for m in mods:
   7114         settings.append('')
   7115     menu = mods
   7116     selected = 0
   7117     oldmenu=''
   7118     while True:
   7119         header = 'Where do you want to upload?'
   7120         oldmenu=writemenu(menu,settings,selected,header,showmenu,oldmenu)
   7121         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   7122         if pressed == 'right':
   7123             if selected < (len(menu) - 1):
   7124                 selected = selected + 1
   7125         elif pressed == 'left':
   7126             if selected > 0:
   7127                 selected = selected - 1
   7128         elif pressed == 'middle' and  menu[selected] == 'Back':
   7129             return None
   7130         elif pressed == 'middle' and  menu[selected] in mods:
   7131             cmd = gonzopifolder + '/mods/' + menu[selected] + '.sh ' + filmname + ' ' + filename + '.mp4'
   7132             return cmd
   7133         time.sleep(0.02)
   7134 
   7135 
   7136 #-------------Streaming---------------
   7137 
   7138 def startstream(camera, stream, plughw, channels,network, udp_ip, udp_port):
   7139     #youtube
   7140     #youtube="rtmp://a.rtmp.youtube.com/live2/"
   7141     #with open("/home/pi/.youtube-live") as fp:
   7142     #    key = fp.readlines()
   7143     #print('using key: ' + key[0])
   7144     #stream_cmd = 'ffmpeg -f h264 -r 25 -i - -itsoffset 5.5 -fflags nobuffer -f alsa -ac '+str(channels)+' -i hw:'+str(plughw)+' -ar 48000 -vcodec copy -acodec libmp3lame -b:a 128k -ar 48000 -map 0:0 -map 1:0 -strict experimental -f flv ' + youtube + key[0]
   7145     #
   7146     #stream_cmd = 'ffmpeg -f h264 -r 25 -i - -itsoffset 5.5 -fflags nobuffer -f alsa -ac '+str(channels)+' -i hw:'+str(plughw)+' -ar 44100 -vcodec copy -acodec libmp3lame -b:a 128k -ar 44100 -map 0:0 -map 1:0 -strict experimental -f mpegts tcp://0.0.0.0:3333\?listen'
   7147     #stream_cmd = 'ffmpeg -f h264 -r 25 -i - -itsoffset 5.5 -fflags nobuffer -f alsa -ac '+str(channels)+' -i hw:'+str(plughw)+' -ar '+soundrate+' -acodec mp2 -b:a 128k -ar '+soundrate+' -vcodec copy -map 0:0 -map 1:0 -g 0 -f mpegts udp://10.42.0.169:5002'
   7148     #numbers_only = ' ','1','2','3','4','5','6','7','8','9','0'
   7149     #newhost, hostport = newudp_ip(numbers_only, network)
   7150     #stream_cmd = 'ffmpeg -f h264 -r 24.989 -i - -itsoffset 5.5 -fflags nobuffer -f alsa -ac '+str(channels)+' -i hw:'+str(plughw)+' -ar '+soundrate+' -acodec mp2 -b:a 128k -ar '+soundrate+' -vcodec copy -f mpegts udp://'+udp_ip+':'+udp_port
   7151     stream_cmd = 'ffmpeg -f h264 -r 24.989 -i - -vcodec copy -f mpegts udp://'+udp_ip+':'+udp_port
   7152     try:
   7153         stream = subprocess.Popen(stream_cmd, shell=True, stdin=subprocess.PIPE) 
   7154         camera.start_recording(stream.stdin, splitter_port=2, format='h264', bitrate = bitrate, quality=quality)
   7155     except:
   7156         stream = ''
   7157     #now = time.strftime("%Y-%m-%d-%H:%M:%S") 
   7158     return stream
   7159 
   7160 def stopstream(camera, stream):
   7161     camera.stop_recording(splitter_port=2) 
   7162     os.system('pkill -9 ffmpeg') 
   7163     print("Camera safely shut down") 
   7164     print("Good bye")
   7165     stream = ''
   7166     return stream
   7167 
   7168 def startrecording(camera, takename,bitrate, quality, profilelevel, reclength):
   7169     global film_fps
   7170     # FFmpeg command to take H.264 input from stdin and output to MP4
   7171     ffmpeg_cmd = ['ffmpeg','-i', 'pipe:0', '-fflags', '+genpts+igndts', '-c:v', 'copy', '-movflags', 'frag_keyframe+empty_moov', '-level:v', '4.2', '-g', '1', '-r', '25', '-f', 'mp4', takename, '-loglevel','debug', '-y']
   7172     rec_process = subprocess.Popen(ffmpeg_cmd, stdin=subprocess.PIPE)
   7173     if reclength > 1 or reclength == 0:
   7174         camera.start_recording(rec_process.stdin, format='h264', level=profilelevel, intra_period=5, bitrate = bitrate)
   7175     else:
   7176         camera.start_recording(rec_process.stdin, format='h264', level=profilelevel, intra_period=5, quality = quality, )
   7177     return rec_process, camera
   7178 
   7179 def stoprecording(camera, rec_process):
   7180     camera.stop_recording() 
   7181     # Close the FFmpeg process
   7182     time.sleep(0.5)
   7183     rec_process.stdin.close()
   7184     #rec_process.wait()
   7185     print("Recording complete!")
   7186     return rec_process, camera
   7187 
   7188 #-------------Beeps-------------------
   7189 
   7190 def beep(bus):
   7191     global gonzopifolder, plughw
   7192     if bus:
   7193         buzzerrepetitions = 100
   7194         buzzerdelay = 0.00001
   7195         for _ in range(buzzerrepetitions):
   7196             for value in [0xC, 0x4]:
   7197                 #GPIO.output(1, value)
   7198                 bus.write_byte_data(DEVICE,OLATA,value)
   7199                 time.sleep(buzzerdelay)
   7200     else:
   7201         run_command('aplay -D plughw:' + str(plughw) + ' '+ gonzopifolder + '/extras/beep.wav')
   7202     return
   7203 
   7204 def longbeep(bus):
   7205     global gonzopifolder, plughw
   7206     if bus:
   7207         buzzerrepetitions = 100
   7208         buzzerdelay = 0.0001
   7209         for _ in range(buzzerrepetitions * 5):
   7210             for value in [0xC, 0x4]:
   7211                 #GPIO.output(1, value)
   7212                 bus.write_byte_data(DEVICE,OLATA,value)
   7213                 buzzerdelay = buzzerdelay - 0.00000004
   7214                 time.sleep(buzzerdelay)
   7215         bus.write_byte_data(DEVICE,OLATA,0x4)
   7216     else:
   7217         run_command('aplay -D plughw:' + str(plughw) + ' '+ gonzopifolder + '/extras/beep_long.wav')
   7218     return
   7219 
   7220 def buzz(buzzerlength):
   7221     buzzerdelay = 0.0001
   7222     for _ in range(buzzerlength):
   7223         for value in [0xC, 0x4]:
   7224             #GPIO.output(1, value)
   7225             bus.write_byte_data(DEVICE,OLATA,value)
   7226             time.sleep(buzzerdelay)
   7227     return
   7228 
   7229 #---------reading in a lens shading table----------
   7230 
   7231 def read_table(inFile):
   7232     # q&d-way to read in ls_table.h
   7233     ls_table = []
   7234     channel  = []
   7235     with open(inFile) as file:       
   7236         for line in file:
   7237             # we skip the unimportant stuff
   7238             if not (   line.startswith("uint") \
   7239                     or line.startswith("}")):
   7240                 # the comments separate the color planes
   7241                 if line.startswith("//"):                
   7242                     channel = []
   7243                     ls_table.append(channel)
   7244                 else:
   7245                     # scan in a single line
   7246                     line = line.replace(',','')
   7247                     lineData = [int(x) for x in line.split()]
   7248                     channel.append(lineData)
   7249     return np.array(ls_table,dtype=np.uint8)    
   7250 
   7251 #-------------Check if file empty----------
   7252 
   7253 def empty(filename):
   7254     if os.path.isfile(filename + '.mp4') == False:
   7255         return False
   7256     if os.path.isfile(filename + '.mp4') == True:
   7257         writemessage('Take already exists')
   7258         time.sleep(1)
   7259         return True
   7260 
   7261 #--------------BUTTONS-------------
   7262 
   7263 def waitforanykey():
   7264     vumetermessage("press any key to continue..")
   7265     time.sleep(1)
   7266     while True:
   7267         with term.cbreak():
   7268             val = term.inkey(timeout=0)
   7269         if not val:
   7270             event = ''
   7271         elif val.is_sequence:
   7272             event = val.name
   7273         elif val:
   7274             event = val
   7275         if i2cbuttons == True:
   7276             readbus = bus.read_byte_data(DEVICE,GPIOB)
   7277             readbus2 = bus.read_byte_data(DEVICE,GPIOA)
   7278         else:
   7279             readbus = 255
   7280             readbus2 = 247
   7281         if readbus != 255 or readbus2 != 247 or event != '':
   7282             time.sleep(0.05)
   7283             vumetermessage(' ')
   7284             return
   7285 
   7286 def middlebutton():
   7287     with term.cbreak():
   7288         val = term.inkey(timeout=0)
   7289     if val.is_sequence:
   7290         event = val.name
   7291         #print(event)
   7292     elif val:
   7293         event = val
   7294         #print(event)
   7295     else:
   7296         event = ''
   7297     if i2cbuttons == True:
   7298         readbus = bus.read_byte_data(DEVICE,GPIOB)
   7299         readbus2 = bus.read_byte_data(DEVICE,GPIOA)
   7300         if readbus != 255:
   7301             print('i2cbutton pressed: ' + str(readbus))
   7302         if readbus2 != 247:
   7303             print('i2cbutton pressed: ' + str(readbus2))
   7304     else:
   7305         readbus = 255
   7306         readbus2 = 247
   7307     pressed = ''
   7308     if event == 'KEY_ENTER' or event == 10 or event == 13 or (readbus == 247 and readbus2 == 247):
   7309         pressed = 'middle'
   7310         return True
   7311     return False
   7312 
   7313 def flushbutton():
   7314     with term.cbreak():
   7315         while True:
   7316             inp = term.inkey(timeout=0)
   7317             #print('flushing ' + repr(inp))
   7318             if inp == '':
   7319                 break
   7320 
   7321 def getbutton(lastbutton, buttonpressed, buttontime, holdbutton):
   7322     global i2cbuttons, serverstate, nextstatus, process, que, gonzopictrl_ip, recording, onlysound, filmname, filmfolder, scene, shot, take, selected, camera, loadfilmsettings, selected, newfilmname, recordwithports
   7323     #Check controller
   7324     pressed = ''
   7325     nextstatus = ''
   7326     try:
   7327         if process.is_alive() == False and serverstate == 'on':
   7328             nextstatus = que.get()
   7329             if "*" in nextstatus:
   7330                 gonzopictrl_ip = nextstatus.split('*')[1]
   7331                 nextstatus = nextstatus.split('*')[0]
   7332                 print('gonzopictrl ip:' + gonzopictrl_ip)
   7333             process = Process(target=listenforclients, args=("0.0.0.0", port, que))
   7334             process.start()
   7335             if 'SELECTED' in nextstatus:
   7336                 try:
   7337                     selected=int(nextstatus.split(':')[1])
   7338                 except:
   7339                     print('wtf?')
   7340             if nextstatus=="PICTURE":
   7341                 pressed="picture"
   7342             elif nextstatus=="UP":
   7343                 pressed="up"
   7344             elif nextstatus=="DOWN":
   7345                 pressed="down"
   7346             elif nextstatus=="LEFT":
   7347                 pressed="left"
   7348             elif nextstatus=="RIGHT":
   7349                 pressed="right"
   7350             elif nextstatus=="VIEW":
   7351                 pressed="view"
   7352             elif nextstatus=="MIDDLE":
   7353                 pressed="middle"
   7354             elif nextstatus=="DELETE":
   7355                 pressed="remove"
   7356             elif nextstatus=="RECORD":
   7357                 pressed="record"
   7358             elif nextstatus=="REC":
   7359                 pressed="record_now"
   7360             elif nextstatus=="STOP":
   7361                 if recording == True:
   7362                     pressed="record"
   7363             elif nextstatus=="STOPRETAKE":
   7364                 if recording == True:
   7365                     pressed="retake"
   7366             elif nextstatus=="RECSOUND":
   7367                 if recording==False:
   7368                     pressed="record"
   7369                     onlysound=True
   7370             elif nextstatus=="PLACEHOLDER":
   7371                 pressed="insert_shot"
   7372             elif nextstatus=="TAKEPLACEHOLDER":
   7373                 pressed="insert_take"
   7374             elif nextstatus=="NEWSCENE":
   7375                 pressed="new_scene"
   7376             elif "NEWFILM:" in nextstatus:
   7377                 newfilmname = nextstatus.split(':')[1]
   7378                 pressed="new_film"
   7379             elif "SYNCIP:" in nextstatus:
   7380                 pressed=nextstatus
   7381             elif "SYNCDONE" in nextstatus:
   7382                 pressed=nextstatus
   7383             elif "RETAKE" in nextstatus:
   7384                 if recordwithports == True:
   7385                     pressed="retake_now"
   7386                 else:
   7387                     pressed="retake"
   7388             elif "RETAKE:" in nextstatus:
   7389                 pressed=nextstatus
   7390             elif "SCENE:" in nextstatus:
   7391                 pressed=nextstatus
   7392             elif "SHOT:" in nextstatus:
   7393                 pressed=nextstatus
   7394             elif "SHOTSCENES:" in nextstatus:
   7395                 pressed=nextstatus
   7396             elif "REMOVE:" in nextstatus:
   7397                 pressed=nextstatus
   7398             elif "Q:" in nextstatus:
   7399                 pressed=nextstatus
   7400             elif "CAMERA:" in nextstatus:
   7401                 pressed=nextstatus
   7402             elif "move" in nextstatus:
   7403                 pressed=nextstatus
   7404             elif "copy" in nextstatus:
   7405                 pressed=nextstatus
   7406             elif "paste" in nextstatus:
   7407                 pressed="insert"
   7408             elif "MAKEPLACEHOLDERS:" in nextstatus:
   7409                 pressed=nextstatus
   7410             #print(nextstatus)
   7411     except:
   7412         #print('process not found')
   7413         pass
   7414 
   7415     with term.cbreak():
   7416         val = term.inkey(timeout=0)
   7417     if val.is_sequence:
   7418         event = val.name
   7419         #print(event)
   7420         flushbutton()
   7421     elif val:
   7422         event = val
   7423         #print(event)
   7424         flushbutton()
   7425     else:
   7426         event = ''
   7427     keydelay = 0.08
   7428     if i2cbuttons == True:
   7429         readbus = bus.read_byte_data(DEVICE,GPIOB)
   7430         readbus2 = bus.read_byte_data(DEVICE,GPIOA)
   7431         if readbus == 0:
   7432             readbus = 255
   7433         if readbus2 == 0:
   7434             readbus2 = 247
   7435         if readbus != 255:
   7436             print('i2cbutton readbus pressed: ' + str(readbus))
   7437         if readbus2 != 247:
   7438             print('i2cbutton readbus2 pressed: ' + str(readbus2))
   7439     else:
   7440         readbus = 255
   7441         readbus2 = 247
   7442     if buttonpressed == False:
   7443         #if event != '':
   7444         #    print(term.clear+term.home)
   7445         if event == 27:
   7446             pressed = 'quit'
   7447         elif event == 'KEY_ENTER' or event == 10 or event == 13 or (readbus == 247 and readbus2 == 247):
   7448             pressed = 'middle'
   7449         elif event == 'KEY_UP' or (readbus == 191 and readbus2 == 247):
   7450             pressed = 'up'
   7451         elif event == 'KEY_DOWN' or (readbus == 254 and readbus2 == 247):
   7452             pressed = 'down'
   7453         elif event == 'KEY_LEFT' or (readbus == 239 and readbus2 == 247):
   7454             pressed = 'left'
   7455         elif event == 'KEY_RIGHT' or (readbus == 251 and readbus2 == 247):
   7456             pressed = 'right'
   7457         elif event == 'KEY_PGUP' or event == ' ' or (readbus == 127 and readbus2 == 247):
   7458             pressed = 'record'
   7459         elif event == 'KEY_PGDOWN' or (readbus == 253 and readbus2 == 247):
   7460             pressed = 'retake'
   7461         elif event == 'KEY_TAB' or (readbus == 223 and readbus2 == 247): 
   7462             pressed = 'view'
   7463         elif event == 'KEY_DELETE' or readbus2 == 246:
   7464             pressed = 'remove'
   7465         elif event == 'KEY_BACKSPACE':
   7466             pressed = 'remove'
   7467         elif event == 'N' or (readbus2 == 245 and readbus == 254):
   7468             pressed = 'peak'
   7469         elif event == 'S' or (readbus2 == 244):
   7470             pressed = 'screen'
   7471         elif event == 'P' or (readbus2 == 245 and readbus == 127):
   7472             pressed = 'insert'
   7473         elif event == 'D' or (readbus2 == 245 and readbus == 251):
   7474             pressed = 'dub'
   7475         elif event == 'O' or (readbus2 == 245 and readbus == 239):
   7476             pressed = 'changemode'
   7477         elif event == 'H' or (readbus2 == 245 and readbus == 191):
   7478             pressed = 'showhelp'
   7479         elif event == 'A' or (readbus2 == 245 and readbus == 253):
   7480             pressed = 'showmenu'
   7481         elif event == 'C' or (readbus2 == 245 and readbus == 223):
   7482             pressed = 'copy'
   7483         elif event == 'M' or (readbus2 == 245 and readbus == 247):
   7484             pressed = 'move'
   7485         elif event == '|' or (readbus2 == 245 and readbus == 251):
   7486             pressed = 'split'
   7487         #elif readbus2 == 247:
   7488         #    pressed = 'shutdown'
   7489         #if pressed != '':
   7490             #print(pressed)
   7491         buttontime = time.time()
   7492         holdbutton = pressed
   7493         buttonpressed = True
   7494     if readbus == 255 and event == '' and nextstatus == '' :
   7495         buttonpressed = False
   7496     if float(time.time() - buttontime) > 0.2 and buttonpressed == True:
   7497         if holdbutton == 'up' or holdbutton == 'down' or holdbutton == 'right' or holdbutton == 'left' or holdbutton == 'shutdown' or holdbutton == 'remove':
   7498             pressed = holdbutton
   7499             keydelay = 0.1
   7500     if time.time() - buttontime > 2 and buttonpressed == True:
   7501         keydelay = 0.08
   7502     if time.time() - buttontime > 6 and buttonpressed == True:
   7503         keydelay = 0.05
   7504     if time.time() - buttontime > 8 and buttonpressed == True:
   7505         keydelay = 0.01
   7506     if time.time() - buttontime > 10 and buttonpressed == True:
   7507         keydelay = 0.01
   7508     return pressed, buttonpressed, buttontime, holdbutton, event, keydelay
   7509 
   7510 def startinterface():
   7511     call([gonzopifolder+'/startinterface.sh &'], shell = True)
   7512 
   7513 def stopinterface(camera):
   7514     try:
   7515         camera.stop_preview()
   7516         camera.close()
   7517     except:
   7518         print('no camera to close')
   7519     os.system('pkill arecord')
   7520     os.system('pkill startinterface')
   7521     os.system('pkill tarinagui')
   7522     os.system('sudo pkill -9 -f gonzopi_menu.py')
   7523     #run_command('sudo systemctl stop apache2')
   7524     return camera
   7525 
   7526 def startcamera(lens, fps):
   7527     global camera_model, fps_selection, fps_selected, cammode, film_fps, film_reso
   7528     camera = picamera.PiCamera()
   7529     camera.meter_mode='spot'
   7530     camera.video_stabilization=True
   7531     if cammode == 'film':
   7532         if film_reso=='1920x1080':
   7533             reso=(1920,1080)
   7534         elif film_reso=='1920x816':
   7535             reso=(1920,816)
   7536         elif film_reso=='1280x720':
   7537             reso=(1280,720)
   7538     elif cammode == 'picture':
   7539         reso=(4056,3040)
   7540     camera.resolution = reso #tested modes 1920x816, 1296x552/578, v2 1640x698, 1640x1232, hqbinned 2028x1080, full 4056x3040
   7541     #Background image
   7542     underlay = None
   7543     bakgimg = gonzopifolder + '/extras/bakg.jpg'
   7544     displaybakg(camera, bakgimg, underlay, 2)
   7545     #lensshade = ''
   7546     #npzfile = np.load('lenses/' + lens)
   7547     #lensshade = npzfile['lens_shading_table']
   7548     #
   7549     #camera frame rate sync to audio clock
   7550     #
   7551     camera_model, camera_revision , filmfolder = getconfig(camera)
   7552     if os.path.isdir(filmfolder) == False:
   7553         os.makedirs(filmfolder)
   7554     # v1 = 'ov5647'
   7555     # v2 = ? 
   7556     logger.info("picamera version is: " + camera_model + ' ' + camera_revision)
   7557     if camera_model == 'imx219':
   7558         #table = read_table('lenses/' + lens)
   7559         #camera.lens_shading_table = table
   7560         camera.framerate = 24.97
   7561     elif camera_model == 'ov5647':
   7562         #table = read_table('lenses/' + lens)
   7563         camera.lens_shading_table = table
   7564         # Different versions of ov5647 with different clock speeds, need to make a config file
   7565         # if there's more frames then the video will be longer when converting it to 25 fps,
   7566         # I try to get it as perfect as possible with trial and error.
   7567         # ov5647 Rev C
   7568         if camera_revision == 'rev.C': 
   7569             #camera.framerate = 26.03
   7570             fps_selection=[5,8,10,11,12,13,14,15,26.03,35,49]
   7571             fps=fps_selection[fps_selected]
   7572             camera.framerate = fps 
   7573         # ov5647 Rev D"
   7574         if camera_revision == 'rev.D':
   7575             #camera.framerate = 23.15
   7576             fps_selection=[5,8,10,11,12,13,14,15,23.15,35,49]
   7577             fps=fps_selection[fps_selected]
   7578             camera.framerate = fps 
   7579     elif camera_model == 'imx477':
   7580         if film_fps == 25:
   7581             #fps_selection=[5,15,24.985,35,49]
   7582             #if sound is gettin before pic add 0.001
   7583             fps_selection=[5,8,10,11,12,13,14,15,24.989,35,49]
   7584             fps=fps_selection[fps_selected]
   7585             camera.framerate = fps 
   7586         elif film_fps == 24:
   7587             fps_selection=[5,8,10,11,12,13,14,15,23.9894,35,49]
   7588             fps=fps_selection[fps_selected]
   7589             camera.framerate = fps 
   7590         elif film_fps == 30:
   7591             fps_selection=[5,8,10,11,12,13,14,15,29.9868,35,49]
   7592             fps=fps_selection[fps_selected]
   7593             camera.framerate = fps 
   7594     else:
   7595         camera.framerate = fps
   7596     camera.crop = (0, 0, 1.0, 1.0)
   7597     #stabilization does not work in firmware
   7598     #camera.video_stabilization = True
   7599     camera.led = False
   7600     #lens_shading_table = np.zeros(camera._lens_shading_table_shape(), dtype=np.uint8) + 32
   7601     #camera.lens_shading_table = lens_shading_table
   7602     camera.start_preview()
   7603     camera.awb_mode = 'auto'
   7604     time.sleep(1)
   7605     return camera
   7606 
   7607 def gonzopiserver(state):
   7608     #Gonzopi server
   7609     if state == True:
   7610         #Try to run apache
   7611         try:
   7612             run_command('sudo systemctl start apache2')
   7613             os.system("sudo ln -sf -t "+gonzopifolder+"/srv/static/ " + filmfolder)
   7614             os.system("sudo chown -h www-data "+gonzopifolder+"/srv/static/gonzopifilms")
   7615             return 'on'
   7616         except:
   7617             os.system("sudo chown -h pi "+gonzopifolder+"/srv/static/gonzopifilms")
   7618             writemessage("could not run gonzopi server")
   7619             time.sleep(2)
   7620             return 'off'
   7621     if state == False:
   7622         run_command('sudo systemctl stop apache2')
   7623         return 'off'
   7624 
   7625 if __name__ == '__main__':
   7626     import sys
   7627     try:
   7628         main()
   7629     except:
   7630         os.system('pkill arecord')
   7631         os.system('pkill startinterface')
   7632         os.system('pkill tarinagui')
   7633         os.system('sudo pkill -9 -f gonzopi_menu.py')
   7634         print('Unexpected error : ', sys.exc_info()[0], sys.exc_info()[1])