gonzopi

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

gonzopi.py (331579B)


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