gonzopi

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

gonzopi.py (277229B)


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