gonzopi

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

gonzopi.py (331424B)


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