gonzopi

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

gonzopi.py (334240B)


      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                                 soundlag=starttime-sound_start
   1613                                 starttime = time.time()
   1614                             os.system('ln -sfr '+filmfolder+'.videos/'+video_origins+'.mp4 '+foldername+filename+'.mp4')
   1615                             recording = True
   1616                             showmenu = 0
   1617                         if cammode == 'picture':
   1618                             #picdate=datetime.datetime.now().strftime('%Y%d%m')
   1619                             picture = foldername +'picture' + str(take).zfill(3) + '.jpeg'
   1620                             print('taking picture')
   1621                             camera.capture(picture,format="jpeg",use_video_port=True) 
   1622                             run_command('touch ' + foldername + 'take' + str(take).zfill(3) + '.mp4')
   1623                             basewidth = 800
   1624                             img = Image.open(picture)
   1625                             wpercent = (basewidth/float(img.size[0]))
   1626                             hsize = int((float(img.size[1])*float(wpercent)))
   1627                             img = img.resize((basewidth,hsize), Image.ANTIALIAS)
   1628                             img.save(foldername+'take'+str(take).zfill(3) + '.jpeg')
   1629                             vumetermessage('Great Pic taken!!')
   1630                             updatethumb = True
   1631                     elif beepcountdown > 0 and beeping == True:
   1632                         beeping = False
   1633                         beepcountdown = 0
   1634                         vumetermessage('Filming was canceled!!')
   1635                 elif recording == True and float(time.time() - starttime) > 0.2:
   1636                     #print(term.clear+term.home)
   1637                     disk = os.statvfs(filmfolder)
   1638                     diskleft = str(int(disk.f_bavail * disk.f_frsize / 1024 / 1024 / 1024)) + 'Gb'
   1639                     recording = False
   1640                     if showmenu_settings == True:
   1641                         showmenu = 1
   1642                     if onlysound != True:
   1643                         #camera.stop_recording()
   1644                         recprocess, camera = stoprecording(camera, rec_process)
   1645                     os.system('pkill arecord')
   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', 'ARCHIVE', '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 == 2:
   4234                 if sceneshotortake == 'take':
   4235                     os.system('rm ' + foldername + filename + '.h264')
   4236                     os.system('rm ' + foldername + filename + '.mp4')
   4237                     os.system('rm ' + foldername + filename + '.wav')
   4238                     os.system('rm ' + foldername + filename + '.jpeg')
   4239                     return
   4240                 elif sceneshotortake == 'shot' and shot > 0:
   4241                     os.system('rm -r ' + foldername)
   4242                     return
   4243                 elif sceneshotortake == 'scene':
   4244                     foldername = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3)
   4245                     os.system('rm -r ' + foldername)
   4246                     scene = countscenes(filmfolder, filmname)
   4247                     shot=1
   4248                     take=1
   4249                     return
   4250                 elif sceneshotortake == 'film':
   4251                     origin_videos=[]
   4252                     v=organize(filmfolder, filmname)
   4253                     if v == '':
   4254                         return
   4255                     origin_videos.extend(v)
   4256                     for i in origin_videos:
   4257                         print('remove video: '+i)
   4258                         try:
   4259                             os.remove(i)
   4260                         except:
   4261                             pass
   4262                         #time.sleep(3)
   4263                     foldername = filmfolder + filmname
   4264                     os.system('rm -r ' + foldername)
   4265                     return
   4266             if selected == 1:
   4267                 if '_archive' in filmname:
   4268                     if sceneshotortake == 'take':
   4269                         os.system('rm ' + foldername + filename + '.h264')
   4270                         os.system('rm ' + foldername + filename + '.mp4')
   4271                         os.system('rm ' + foldername + filename + '.wav')
   4272                         os.system('rm ' + foldername + filename + '.jpeg')
   4273                     return
   4274                     elif sceneshotortake == 'shot' and shot > 0:
   4275                         os.system('rm -r ' + foldername)
   4276                     return
   4277                     elif sceneshotortake == 'scene':
   4278                         foldername = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3)
   4279                         os.system('rm -r ' + foldername)
   4280                         scene = countscenes(filmfolder, filmname)
   4281                         shot=1
   4282                         take=1
   4283                     return
   4284                     elif sceneshotortake == 'film':
   4285                         origin_videos=[]
   4286                         v=organize(filmfolder, filmname)
   4287                         if v == '':
   4288                             return
   4289                         origin_videos.extend(v)
   4290                         for i in origin_videos:
   4291                             print('remove video: '+i)
   4292                             try:
   4293                                 os.remove(i)
   4294                             except:
   4295                                 pass
   4296                             #time.sleep(3)
   4297                         foldername = filmfolder + filmname
   4298                         os.system('rm -r ' + foldername)
   4299                         return
   4300                 else:
   4301                     if sceneshotortake == 'take':
   4302                         writemessage('Throwing take in archive' + str(take))
   4303                         #onthefloor = filmfolder + filmname + '_archive/' + 'scene' + str(otf_scene).zfill(3) + '/shot' + str(otf_shot).zfill(3) + '/take' + str(otf_take).zfill(3) 
   4304                         onthefloor = filmfolder + filmname + '_archive/' + 'scene' + str(otf_scene).zfill(3) + '/shot' + str(otf_shot).zfill(3) + '/'
   4305                         if os.path.isdir(onthefloor) == False:
   4306                             os.makedirs(onthefloor)
   4307                         os.system('cp ' + foldername + filename + '.h264 ' + onthefloor + '')
   4308                         os.system('cp ' + foldername + filename + '.mp4 ' + onthefloor + '')
   4309                         os.system('cp ' + foldername + filename + '.wav ' + onthefloor + '')
   4310                         os.system('cp ' + foldername + filename + '.jpeg ' + onthefloor + '')
   4311                         os.system('rm ' + foldername + filename + '.h264 ')
   4312                         os.system('rm ' + foldername + filename + '.mp4 ')
   4313                         os.system('rm ' + foldername + filename + '.wav ')
   4314                         os.system('rm ' + foldername + filename + '.jpeg ')
   4315                         os.system('cp -r '+filmfolder + filmname + "/settings.p "+filmfolder + filmname + '_archive/settings.p')
   4316                         take = take - 1
   4317                         if take == 0:
   4318                             take = 1
   4319                     elif sceneshotortake == 'shot' and shot > 0:
   4320                         writemessage('Throwing shot in archive' + str(shot))
   4321                         onthefloor = filmfolder + filmname + '_archive/' + 'scene' + str(otf_scene).zfill(3) + '/shot' + str(otf_shot).zfill(3)+'/'
   4322                         os.makedirs(onthefloor,exist_ok=True)
   4323                         os.system('cp -r '+foldername+'* '+onthefloor)
   4324                         os.system('cp -r '+filmfolder + filmname + "/settings.p "+filmfolder + filmname + '_archive/settings.p')
   4325                         os.system('rm -r '+foldername)
   4326                         take = counttakes(filmname, filmfolder, scene, shot)
   4327                     elif sceneshotortake == 'scene':
   4328                         onthefloor = filmfolder + filmname + '_archive/' + 'scene' + str(otf_scene).zfill(3)
   4329                         os.makedirs(onthefloor)
   4330                         writemessage('Throwing clips in the archive ' + str(scene))
   4331                         foldername = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3)
   4332                         os.system('cp ' + foldername + '/* ' + onthefloor+'/' )
   4333                         os.system('cp -r '+filmfolder + filmname + "/settings.p "+filmfolder + filmname + '_archive/settings.p')
   4334                         os.system('rm -r ' + foldername)
   4335                         scene = countscenes(filmfolder, filmname)
   4336                         shot = 1
   4337                         take = 1
   4338                     elif sceneshotortake == 'film':
   4339                         origin_videos=[]
   4340                         v=organize(filmfolder, filmname)
   4341                         if v == '':
   4342                             return
   4343                         origin_videos.extend(v)
   4344                         for i in origin_videos:
   4345                             print('remove video: '+i)
   4346                             try:
   4347                                 os.remove(i)
   4348                             except:
   4349                                 pass
   4350                             #time.sleep(3)
   4351                         foldername = filmfolder + filmname
   4352                         os.system('rm -r ' + foldername)
   4353                         return
   4354                     organize(filmfolder, filmname + '_archive')
   4355                 return
   4356             elif selected == 0:
   4357                 return
   4358         time.sleep(0.02)
   4359 
   4360 #--------CLEAN---------
   4361 
   4362 def clean(filmname, filmfolder):
   4363     if filmname == '':
   4364         films = getfilms(filmfolder)
   4365     else:
   4366         films.append(filmname)
   4367     videos_to_remove=[]
   4368     origin_videos=[]
   4369     for f in films:
   4370         v=organize(filmfolder, f[0])
   4371         origin_videos.extend(v)
   4372         print(filmfolder)
   4373         print(f[0])
   4374         print(origin_videos)
   4375         #time.sleep(5)
   4376     print('ORIGIN')
   4377     print(origin_videos)
   4378     print('alll')
   4379     allfiles = os.listdir(filmfolder+'.videos/')
   4380     print(allfiles)
   4381     print('all videos: '+ str(len(allfiles)))
   4382     remove_videos=[]
   4383     for video in allfiles:
   4384         if any(filmfolder+'.videos/'+video in x for x in origin_videos):
   4385             #os.remove(origin)
   4386             print('REMOVE ORIGIN VIDEO NOT IN SYNC ' + video)
   4387         else:
   4388             #os.remove(origin)
   4389             if video != 'gonzopi.db':
   4390                 remove_videos.append(filmfolder+'.videos/'+video)
   4391             print('ORIGIN VIDEO IN SYNC' + video)
   4392     #print(remove_videos)
   4393     print('all videos: '+ str(len(allfiles)))
   4394     print('origin videos: '+ str(len(origin_videos)))
   4395     print('to be removed: '+ str(len(remove_videos)))
   4396     for i in remove_videos:
   4397         os.remove(i)
   4398     #with open(filmfolder+'.videos/.remove_videos', 'w') as outfile:
   4399     #    outfile.write('\n'.join(str(i) for i in remove_videos))
   4400     #time.sleep(10)
   4401 
   4402 #------------Remove and Organize----------------
   4403 
   4404 def organize(filmfolder, filmname):
   4405     global fps, db
   4406     origin_files=[]
   4407     #remove scenes with .remove
   4408     scenes = next(os.walk(filmfolder + filmname))[1]
   4409     for i in scenes:
   4410         scenefiles = next(os.walk(filmfolder + filmname+'/'+i))[2]
   4411         for s in scenefiles:
   4412             if '.remove' in s:
   4413                 logger.info('removing scene')
   4414                 os.system('rm -r ' + filmfolder + filmname + '/' + i)
   4415     scenes = next(os.walk(filmfolder + filmname))[1]
   4416     for i in scenes:
   4417         if 'scene' not in i:
   4418             scenes.remove(i)
   4419     # Takes
   4420     for i in sorted(scenes):
   4421         origin_scene_files=[]
   4422         shots = next(os.walk(filmfolder + filmname + '/' + i))[1]
   4423         for p in shots:
   4424             if 'shot' not in p:
   4425                 shots.remove(p)
   4426         for p in sorted(shots):
   4427             takes=[]
   4428             takefiles = next(os.walk(filmfolder + filmname + '/' + i + '/' + p))[2]
   4429             for t in takefiles:
   4430                 if '.remove' in t:
   4431                     logger.info('removing shot')
   4432                     os.system('rm -r ' + filmfolder + filmname + '/' + i + '/' + p)
   4433                 if 'take' in t:
   4434                     takes.append(t)
   4435             if len(takes) == 0:
   4436                 logger.info('no takes in this shot, removing shot if no placeholder')
   4437                 if not os.path.isfile(filmfolder + filmname + '/' + i + '/' + p + '/.placeholder'):
   4438                     os.system('rm -r ' + filmfolder + filmname + '/' + i + '/' + p)
   4439 
   4440             organized_nr = 1
   4441             print(i)
   4442             print(p)
   4443             print(sorted(takes))
   4444             #time.sleep(2)
   4445             for s in sorted(takes):
   4446                 if 'take' in s:
   4447                     if '.mp4' in s or '.h264' in s:
   4448                         unorganized_nr = int(s[4:7])
   4449                         takename = filmfolder + filmname + '/' + i + '/' + p + '/take' + str(unorganized_nr).zfill(3)
   4450                         if '.mp4' in s:
   4451                             origin=os.path.realpath(takename+'.mp4')
   4452                             if origin != os.path.abspath(takename+'.mp4'):
   4453                                 print('appending: '+origin)
   4454                                 origin_files.append(origin)
   4455                                 origin_scene_files.append(origin)
   4456                                 if os.path.isfile(takename+'.h264'):
   4457                                     print('oh no boubles found!')
   4458                         if '.h264' in s:
   4459                             origin=os.path.realpath(takename+'.h264')
   4460                             if origin != os.path.abspath(takename+'.h264'):
   4461                                 origin_files.append(origin)
   4462                                 origin_scene_files.append(origin)
   4463                         if organized_nr == unorganized_nr:
   4464                             #print('correct')
   4465                             pass
   4466                         if organized_nr != unorganized_nr:
   4467                             print('false, correcting from ' + str(unorganized_nr) + ' to ' + str(organized_nr))
   4468                             print(s)
   4469                             #time.sleep(3)
   4470                             mv = 'mv ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(unorganized_nr).zfill(3)
   4471                             run_command(mv + '.mp4 ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.mp4')
   4472                             run_command(mv + '.h264 ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.h264')
   4473                             run_command(mv + '.wav ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.wav')
   4474                             run_command(mv + '.jpeg ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.jpeg')
   4475                         #check if same video has both h246 and mp4 and render and remove h264
   4476                         for t in sorted(takes):
   4477                             if t.replace('.mp4','') == s.replace('.h264','') or s.replace('.mp4','') == t.replace('.h264',''):
   4478                                 logger.info('Found both mp4 and h264 of same video!')
   4479                                 logger.info(t)
   4480                                 logger.info(s)
   4481                                 #time.sleep(5)
   4482                                 compileshot(takename,filmfolder,filmname)
   4483                                 organized_nr -= 1
   4484                         organized_nr += 1
   4485         origin_files.extend(origin_scene_files)
   4486         with open(filmfolder+filmname+'/'+i+'/.origin_videos', 'w') as outfile:
   4487             outfile.write('\n'.join(str(i) for i in origin_scene_files))
   4488 
   4489     # Shots
   4490     for i in sorted(scenes):
   4491         shots = next(os.walk(filmfolder + filmname + '/' + i))[1]
   4492         if len(shots) == 0:
   4493             logger.info('no shots in this scene, removing scene..')
   4494             os.system('rm -r ' + filmfolder + filmname + '/' + i)
   4495         organized_nr = 1
   4496         for p in sorted(shots):
   4497             if 'insert' in p:
   4498                 #add_organize(filmfolder, filmname)
   4499                 pass
   4500             elif 'shot' in p:
   4501                 #print(p)
   4502                 if '_yanked' in p:
   4503                     unorganized_nr = int(p[4:-7])
   4504                 else:
   4505                     unorganized_nr = int(p[-3:])
   4506                 if organized_nr == unorganized_nr:
   4507                     #print('correct')
   4508                     pass
   4509                 if organized_nr != unorganized_nr:
   4510                     #print('false, correcting from ' + str(unorganized_nr) + ' to ' + str(organized_nr))
   4511                     os.system('mv ' + filmfolder + filmname + '/' + i + '/shot' + str(unorganized_nr).zfill(3) + ' ' + filmfolder + filmname + '/' + i + '/shot' + str(organized_nr).zfill(3))
   4512                 organized_nr += 1
   4513 
   4514     # Scenes
   4515     organized_nr = 1
   4516     for i in sorted(scenes):
   4517         if 'insert' in i:
   4518             #add_organize(filmfolder, filmname)
   4519             pass
   4520         elif 'scene' in i:
   4521             #print(i)
   4522             if '_yanked' in i:
   4523                 unorganized_nr = int(i[5:-7])
   4524             else:
   4525                 unorganized_nr = int(i[-3:])
   4526             if organized_nr == unorganized_nr:
   4527                 #print('correct')
   4528                 pass
   4529             if organized_nr != unorganized_nr:
   4530                 #print('false, correcting from ' + str(unorganized_nr) + ' to ' + str(organized_nr))
   4531                 os.system('mv ' + filmfolder + filmname + '/scene' + str(unorganized_nr).zfill(3) + ' ' + filmfolder + filmname + '/scene' + str(organized_nr).zfill(3))
   4532             organized_nr += 1
   4533 
   4534     logger.info('Organizer done! Everything is tidy')
   4535     return origin_files
   4536 
   4537 
   4538 #------------Add and Organize----------------
   4539 
   4540 def add_organize(filmfolder, filmname):
   4541     scenes = next(os.walk(filmfolder + filmname))[1]
   4542     for i in scenes:
   4543         if 'scene' not in i:
   4544             scenes.remove(i)
   4545     # Shots
   4546     for i in sorted(scenes):
   4547         shots = next(os.walk(filmfolder + filmname + '/' + i))[1]
   4548         for c in shots:
   4549             if 'shot' not in c:
   4550                 shots.remove(c)
   4551         organized_nr = len(shots)
   4552         for p in sorted(shots, reverse=True):
   4553             if '_yanked' in p:
   4554                 print(p)
   4555                 #time.sleep(5)
   4556                 os.system('mv -n ' + filmfolder + filmname + '/' + i + '/' + p + ' ' + filmfolder + filmname + '/' + i + '/shot' + str(organized_nr).zfill(3))
   4557             #if _insert in last shot
   4558             elif organized_nr==len(shots) and '_insert' in p:
   4559                 os.system('mv -n ' + filmfolder + filmname + '/' + i + '/' +p+ ' ' + filmfolder + filmname + '/' + i + '/shot' + str(organized_nr).zfill(3))
   4560             elif '_insert' in p:
   4561                 os.system('mv -n ' + filmfolder + filmname + '/' + i + '/' +p+ ' ' + filmfolder + filmname + '/' + i + '/shot' + str(organized_nr).zfill(3))
   4562                 #run_command('touch ' + filmfolder + filmname + '/' + i + '/shot' + str(organized_nr).zfill(3) + '/.placeholder')
   4563             elif 'shot' in p:
   4564                 #print(p)
   4565                 unorganized_nr = int(p[-3:])
   4566                 if organized_nr == unorganized_nr:
   4567                     #print('correct')
   4568                     pass
   4569                 if organized_nr != unorganized_nr:
   4570                     #print('false, correcting from ' + str(unorganized_nr) + ' to ' + str(organized_nr))
   4571                     os.system('mv -n ' + filmfolder + filmname + '/' + i + '/shot' + str(unorganized_nr).zfill(3) + ' ' + filmfolder + filmname + '/' + i + '/shot' + str(organized_nr).zfill(3)) 
   4572             organized_nr -= 1
   4573 
   4574     # Scenes
   4575     organized_nr = len(scenes)
   4576     for i in sorted(scenes, reverse=True):
   4577         #print(i)
   4578         if '_yanked' in i:
   4579             os.system('mv -n ' + filmfolder + filmname + '/'+i+' '+ filmfolder + filmname + '/scene' + str(organized_nr).zfill(3))
   4580         elif organized_nr==len(scenes) and '_insert' in i:
   4581             os.system('mv -n ' + filmfolder + filmname + '/'+i+' '+ filmfolder + filmname + '/scene' + str(organized_nr).zfill(3))
   4582         elif '_insert' in i:
   4583             #print(p)
   4584             os.system('mv -n ' + filmfolder + filmname + '/' +i+' '+ filmfolder + filmname + '/scene' + str(organized_nr).zfill(3))
   4585             run_command('touch ' + filmfolder + filmname + '/scene' + str(organized_nr).zfill(3) + '/.placeholder')
   4586         elif 'scene' in i:
   4587             #print(i)
   4588             unorganized_nr = int(i[-3:])
   4589             if organized_nr == unorganized_nr:
   4590                 #print('correct')
   4591                 pass
   4592             if organized_nr != unorganized_nr:
   4593                 #print('false, correcting from ' + str(unorganized_nr) + ' to ' + str(organized_nr))
   4594                 os.system('mv -n ' + filmfolder + filmname + '/scene' + str(unorganized_nr).zfill(3) + ' ' + filmfolder + filmname + '/scene' + str(organized_nr).zfill(3))
   4595         organized_nr -= 1
   4596     return
   4597 
   4598 #------------Organize and move dubs----------------
   4599 
   4600 def organizedubs(foldername):
   4601     dubs = next(os.walk(foldername))[2]
   4602     print(dubs)
   4603     time.sleep(3)
   4604     for c in dubs:
   4605         if 'dub' not in c:
   4606             dubs.remove(c)
   4607     organized_nr = len(dubs)
   4608     for p in sorted(dubs, reverse=True):
   4609         print(p)
   4610         time.sleep(3)
   4611         if '_insert' in p:
   4612             os.system('mv -n ' + foldername + 'dub' + str(organized_nr).zfill(3) + '_insert.wav ' + foldername + 'dub' + str(organized_nr).zfill(3)+'.wav')
   4613         elif 'dub' in p:
   4614             print(p)
   4615             time.sleep(3)
   4616             unorganized_nr = int(p[5:-4])
   4617             if organized_nr == unorganized_nr:
   4618                 print('correct')
   4619                 time.sleep(3)
   4620                 pass
   4621             if organized_nr != unorganized_nr:
   4622                 print('false, correcting from ' + str(unorganized_nr) + ' to ' + str(organized_nr))
   4623                 time.sleep(3)
   4624                 os.system('mv -n ' + foldername + 'dub' + str(unorganized_nr).zfill(3) + '.wav ' + foldername + 'dub' + str(organized_nr).zfill(3)+'.wav') 
   4625         organized_nr -= 1
   4626 
   4627 #-------------Stretch Audio--------------
   4628 
   4629 def stretchaudio(filename,fps):
   4630     global film_fps
   4631     fps_rounded=round(fps)
   4632     if int(fps_rounded) != int(film_fps):
   4633         #pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + filename + '.mp4', shell=True)
   4634         #videolength = pipe.decode().strip()
   4635         videolength=get_video_length(filename+'.mp4')
   4636         try:
   4637             #pipe = subprocess.check_output('mediainfo --Inform="Audio;%Duration%" ' + filename + '.wav', shell=True)
   4638             #audiolength = pipe.decode().strip()
   4639             audiolength = get_audio_length(filename+'.wav')
   4640         except:
   4641             audiosilence(filename)
   4642             audiolength=videolength
   4643         #if there is no audio length
   4644         logger.info('audio is:' + str(audiolength))
   4645         ratio = int(audiolength)/int(videolength)
   4646         print(str(ratio))
   4647         run_command('cp '+filename+'.wav '+filename+'_temp.wav')
   4648         run_command('ffmpeg -y -i ' + filename + '_temp.wav -filter:a atempo="'+str(ratio) + '" ' + filename + '.wav')
   4649         os.remove(filename + '_temp.wav')
   4650     #time.sleep(5)
   4651     return
   4652 
   4653 #---------#ffmpeg settings------------
   4654 
   4655 def encoder():
   4656     global bitrate
   4657     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 '
   4658     #return '-c:v copy -c:a copy '
   4659 
   4660 def has_audio_track(file_path):
   4661     try:
   4662         # Parse the media file
   4663         media_info = MediaInfo.parse(file_path)
   4664         
   4665         # Check for audio tracks
   4666         for track in media_info.tracks:
   4667             if track.track_type == "Audio":
   4668                 return True
   4669         return False
   4670 
   4671     except Exception as e:
   4672         print(f"Error parsing {file_path}: {e}")
   4673         return None
   4674 
   4675 def check_fps(file_path):
   4676     try:
   4677         # Parse the media file
   4678         media_info = MediaInfo.parse(file_path)
   4679         
   4680         # Check for audio tracks
   4681         for track in media_info.tracks:
   4682             if track.track_type == "Video":
   4683                 return track.frame_rate
   4684         return None
   4685     except Exception as e:
   4686         print(f"Error parsing {file_path}: {e}")
   4687         return None
   4688 
   4689 def check_reso(file_path):
   4690     try:
   4691         # Parse the media file
   4692         media_info = MediaInfo.parse(file_path)
   4693         
   4694         # Check for audio tracks
   4695         for track in media_info.tracks:
   4696             if track.track_type == "Video":
   4697                 return track.width, track.height
   4698         return None
   4699     except Exception as e:
   4700         print(f"Error parsing {file_path}: {e}")
   4701         return None
   4702 
   4703 def is_audio_stereo(file_path):
   4704     try:
   4705         # Parse the media file
   4706         media_info = MediaInfo.parse(file_path)
   4707         
   4708         # Check for audio tracks
   4709         for track in media_info.tracks:
   4710             if track.track_type == "Audio":
   4711                 if track.channel_s == 1:
   4712                     return False
   4713                 if track.channel_s == 2:
   4714                     return True
   4715         return None
   4716     except Exception as e:
   4717         print(f"Error parsing {file_path}: {e}")
   4718         return None
   4719 
   4720 def get_video_length(filepath):
   4721     # Parse the file
   4722     media_info = MediaInfo.parse(filepath)
   4723     # Find the video track (usually the first video track)
   4724     for track in media_info.tracks:
   4725         if track.track_type == "Video":
   4726             # Duration is in milliseconds, convert to seconds
   4727             duration_ms = track.duration
   4728             if duration_ms is None:
   4729                 return None  # No duration found
   4730             return int(duration_ms)
   4731     return None  # No video track found
   4732 
   4733 def get_audio_length(filepath):
   4734     # Parse the file
   4735     media_info = MediaInfo.parse(filepath)
   4736     # Find the video track (usually the first video track)
   4737     for track in media_info.tracks:
   4738         if track.track_type == "Audio":
   4739             # Duration is in milliseconds, convert to seconds
   4740             duration_ms = track.duration
   4741             if duration_ms is None:
   4742                 return None  # No duration found
   4743             return int(duration_ms)
   4744     return None  # No video track found
   4745 
   4746 #-------------Compile Shot--------------
   4747 
   4748 def compileshot(filename,filmfolder,filmname):
   4749     global fps, soundrate, channels, bitrate, muxing, db, film_fps
   4750     videolength=0
   4751     audiolength=0 
   4752     #Check if file already converted
   4753     if '.h264' in filename:
   4754         filename=filename.replace('.h264','')
   4755     if '.mp4' in filename:
   4756         filename=filename.replace('.mp4','')
   4757     if os.path.isfile(filename + '.h264'):
   4758         logger.info('Video not converted!')
   4759         writemessage('Converting to playable video')
   4760         #remove old mp4 if corrupted like if an unpredicted shutdown in middle of converting
   4761         video_origins = (os.path.realpath(filename+'.h264'))[:-5]
   4762         os.system('rm ' + filename + '.mp4')
   4763         os.system('rm ' + video_origins + '.mp4')
   4764         print(filename+'.mp4 removed!')
   4765         #run_command('ffmpeg -fps 25 -add ' + video_origins + '.h264 ' + video_origins + '.mp4')
   4766         #run_command('ffmpeg -fps 25 -add ' + video_origins + '.h264 ' + video_origins + '.mp4')
   4767         #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')
   4768         #run_command('ffmpeg -fflags +genpts -r 25 -i ' + video_origins + '.h264 '+encoder()+ video_origins + '.mp4')
   4769         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']
   4770         ffmpeg_process = subprocess.Popen(ffmpeg_cmd)
   4771         stdout, stderr = ffmpeg_process.communicate()
   4772         #os.system('ln -sfr '+video_origins+'.mp4 '+filename+'.mp4')
   4773         print(filename+'.h264 converted to mp4')
   4774     video_origins = (os.path.realpath(filename+'.mp4'))[:-4]
   4775     if not os.path.isfile(filename + '.wav'):
   4776         vumetermessage('creating audio track...')
   4777         audiosilence(filename)
   4778     #add audio/video start delay sync
   4779     vumetermessage('checking video audio length...')
   4780     videolength = get_video_length(filename+'.mp4')
   4781     print('videolength:'+str(videolength))
   4782     try:
   4783         audiolength = get_audio_length(filename+'.wav')
   4784     except:
   4785         audiolength=videolength
   4786     #if there is no audio length
   4787 
   4788     print('trimming audio')
   4789     if int(audiolength) > int(videolength+int(0.013*1000)):
   4790         vumetermessage('trimming audio...')
   4791         run_command('sox -V0 -b 16 '+filename+'.wav -c 2 /dev/shm/temp.wav trim 0.013')
   4792         run_command('mv /dev/shm/temp.wav '+ filename + '.wav')
   4793         os.system('rm /dev/shm/temp.wav')
   4794     fps_rounded=round(fps)
   4795     if int(fps) != int(film_fps):
   4796         vumetermessage('stretching audio...')
   4797         stretchaudio(filename,fps)
   4798     if int(audiolength) != int(videolength):
   4799         vumetermessage('trimming audio to video...')
   4800         audiosync, videolength, audiolength = audiotrim(filename, 'end','')
   4801         try:
   4802             db.update('videos', where='filename="'+video_origins+'"', videolength=videolength/1000, audiolength=audiolength/1000, audiosync=audiosync)
   4803         except:
   4804             db = correct_database(filmname,filmfolder,db)
   4805             db.update('videos', where='filename="'+video_origins+'"', videolength=videolength/1000, audiolength=audiolength/1000, audiosync=audiosync)
   4806     mux=False
   4807     #one more if stereo check!
   4808     stereo = is_audio_stereo(filename+'.wav')
   4809     if stereo == False:
   4810         run_command('sox -V0 -b 16 '+filename+'.wav -c 2 /dev/shm/temp.wav')
   4811         run_command('mv /dev/shm/temp.wav '+ filename + '.wav')
   4812         os.system('rm /dev/shm/temp.wav')
   4813     logger.info('audio is:' + str(audiolength))
   4814     if mux == True:
   4815         #muxing mp3 layer to mp4 file
   4816         #count estimated audio filesize with a bitrate of 320 kb/s
   4817         audiosize = countsize(filename + '.wav') * 0.453
   4818         p = Popen(['ffmpeg', '-y', '-i', filename + '.wav', '-acodec', 'libmp3lame', '-ac', '2', '-b:a', '320k', filename + '.mp3'])
   4819         while p.poll() is None:
   4820             time.sleep(0.2)
   4821             try:
   4822                 rendersize = countsize(filename + '.mp3')
   4823             except:
   4824                 continue
   4825             writemessage('audio rendering ' + str(int(rendersize)) + ' of ' + str(int(audiosize)) + ' kb done')
   4826         ##MERGE AUDIO & VIDEO
   4827         writemessage('Merging audio & video')
   4828         #os.remove(renderfilename + '.mp4') 
   4829         call(['MP4Box', '-rem', '2',  video_origins + '.mp4'], shell=False)
   4830         call(['MP4Box', '-fps', str(film_fps), '-add', video_origins + '.mp4', '-add', filename + '.mp3', '-new', video_origins + '_tmp.mp4'], shell=False)
   4831         os.system('cp -f ' + video_origins + '_tmp.mp4 ' + video_origins + '.mp4')
   4832         os.remove(video_origins + '_tmp.mp4')
   4833         os.remove(filename + '.mp3')
   4834     #origin=os.path.realpath(filename+'.mp4')
   4835     os.system('rm ' + video_origins + '.h264')
   4836     #os.system('rm ' + filename + '.h264')
   4837     #os.system('ln -sfr '+video_origins+'.mp4 '+filename+'.mp4')
   4838     logger.info('compile done!')
   4839     #run_command('omxplayer --layer 3 ' + filmfolder + '/.rendered/' + filename + '.mp4 &')
   4840     #time.sleep(0.8)
   4841     #run_command('aplay ' + foldername + filename + '.wav')
   4842     return
   4843 
   4844 #-------------Get shot files--------------
   4845 
   4846 def shotfiles(filmfolder, filmname, scene):
   4847     files = []
   4848     shots = countshots(filmname,filmfolder,scene)
   4849     print("shots"+str(shots))
   4850     shot = 1
   4851     for i in range(shots):
   4852         takes = counttakes(filmname,filmfolder,scene,shot)
   4853         if takes > 0:
   4854             folder = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/'
   4855             filename = 'take' + str(takes).zfill(3)
   4856             files.append(folder + filename)
   4857             print(folder+filename)
   4858         shot = shot + 1
   4859     #writemessage(str(len(shotfiles)))
   4860     #time.sleep(2)
   4861     return files
   4862 
   4863 #--------Show JPEG as progress when rendering
   4864 
   4865 #---------------Render Video------------------
   4866 
   4867 def rendervideo(filmfolder, filmname, scene, filmfiles, filename, renderinfo):
   4868     videos_totalt = db.query("SELECT COUNT(*) AS videos FROM videos")[0]
   4869     tot = int(videos_totalt.videos)
   4870     #video_origins=filmfolder+'.videos/'+datetime.datetime.now().strftime('%Y%d%m')+'_'+os.urandom(8).hex()+'_'+str(tot).zfill(5)
   4871     scenedir = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/'
   4872     if scene == 0:
   4873         scenedir = filmfolder + filmname + '/'
   4874     if len(filmfiles) < 1:
   4875         writemessage('Nothing here!')
   4876         time.sleep(2)
   4877         return None
   4878     print('Rendering videofiles')
   4879     writemessage('Hold on, rendering ' + renderinfo + ' with ' + str(len(filmfiles)) + ' files')
   4880     videosize = 0
   4881     rendersize = 0
   4882     #videomerge = ['MP4Box']
   4883     #videomerge.append('-force-cat')
   4884     #for f in filmfiles[:]:
   4885     #    videosize = videosize + countsize(f + '.mp4')
   4886     #    videomerge.append('-cat')
   4887     #    videomerge.append(f + '.mp4#video')
   4888     #videomerge.append('-new')
   4889     #videomerge.append(filename + '.mp4')
   4890     videomerge = ['ffmpeg']
   4891     videomerge.append('-f')
   4892     videomerge.append('concat')
   4893     videomerge.append('-safe')
   4894     videomerge.append('0')
   4895     run_command('rm '+scenedir+'.renderlist')
   4896     for f in filmfiles[:]:
   4897         videosize = videosize + countsize(f + '.mp4')
   4898         #videomerge.append(f + '.mp4')
   4899         with open(scenedir + '.renderlist', 'a') as l:
   4900             l.write("file '"+str(f)+".mp4'\n")
   4901     videomerge.append('-i')
   4902     videomerge.append(scenedir+'.renderlist')
   4903     videomerge.append('-c:v')
   4904     videomerge.append('copy')
   4905     videomerge.append('-movflags')
   4906     videomerge.append('+faststart')
   4907     videomerge.append(filename+'.mp4')
   4908     videomerge.append('-y')
   4909     #videomerge.append(filename + '.h264')
   4910     #videomerge.append(filename + '.h264')
   4911     #call(videomerge, shell=True) #how to insert somekind of estimated time while it does this?
   4912     p = Popen(videomerge)
   4913     #show progress
   4914     while p.poll() is None:
   4915         time.sleep(0.1)
   4916         try:
   4917             rendersize = countsize(filename+'.mp4')
   4918         except:
   4919             continue
   4920         writemessage('video rendering ' + str(int(rendersize)) + ' of ' + str(int(videosize)) + ' kb done')
   4921     print('Video rendered!')
   4922     #os.system('ln -sfr '+video_origins+'.mp4 '+filename+'.mp4')
   4923     run_command('rm '+scenedir+'.renderlist')
   4924     return
   4925 
   4926 #---------------Render Audio----------------
   4927 
   4928 def renderaudio(audiofiles, filename, dubfiles, dubmix):
   4929     #if len(audiofiles) < 1:
   4930     #    writemessage('Nothing here!')
   4931     #    time.sleep(2)
   4932     #    return None
   4933     print('Rendering audiofiles')
   4934     ##PASTE AUDIO TOGETHER
   4935     writemessage('Hold on, rendering audio...')
   4936     audiomerge = ['sox']
   4937     #if render > 2:
   4938     #    audiomerge.append(filename + '.wav')
   4939     if isinstance(audiofiles, list):
   4940         for f in audiofiles:
   4941             audiomerge.append(f + '.wav')
   4942         audiomerge.append(filename + '.wav')
   4943         call(audiomerge, shell=False)
   4944     else:
   4945         #if rendering scene with one shot
   4946         if audiofiles[0] != filename:
   4947             os.system('cp '+audiofiles[0]+'.wav '+filename+'.wav')
   4948     #DUBBING
   4949     p = 1
   4950     #pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + filename + '.mp4', shell=True)
   4951     #videolength = pipe.decode().strip()
   4952     videolength = get_video_length(filename+'.mp4')
   4953     audiolength = get_audio_length(filename+'.wav')
   4954     if audiolength > videolength:
   4955         audiotrim(filename, 'end','')
   4956     for i, d in zip(dubmix, dubfiles):
   4957         writemessage('Dub ' + str(p) + ' audio found lets mix...')
   4958         #first trimit!
   4959         audiotrim(filename, 'end', d)
   4960         try:
   4961             #pipe = subprocess.check_output('soxi -D ' + d, shell=True)
   4962             #dubaudiolength = pipe.decode()
   4963             dubaudiolength=get_audio_lenght(d)
   4964             if dubaudiolength != videolength:
   4965                 print('dub wrong length!')
   4966                 time.sleep(5)
   4967         except:
   4968             pass
   4969         #print(d)
   4970         #print(filename)
   4971         #time.sleep(3)
   4972         os.system('cp ' + filename + '.wav ' + filename + '_tmp.wav')
   4973         #Fade and make stereo
   4974         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)))
   4975         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))
   4976         try:
   4977             os.remove(filename + '_tmp.wav')
   4978             os.remove('/dev/shm/fade.wav')
   4979         except:
   4980             pass
   4981         print('Dub mix ' + str(p) + ' done!')
   4982         p += 1
   4983     return
   4984 
   4985 #-------------Fast Edit-----------------
   4986 def fastedit(filmfolder, filmname, filmfiles, scene):
   4987     scenedir = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/'
   4988     totlength = 0
   4989     try:
   4990         os.remove(scenedir + '.fastedit')
   4991     except:
   4992         print('no fastedit file')
   4993     #for f in filmfiles:
   4994         #pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + f + '.mp4', shell=True)
   4995         #videolength = pipe.decode().strip()
   4996         #totlength = int(videolength) + totlength
   4997         #print('writing shot lengths for fastedit mode')
   4998         #with open(scenedir + '.fastedit', 'a') as f:
   4999         #    f.write(str(totlength)+'\n')
   5000     
   5001 
   5002 #-------------Get scene files--------------
   5003 
   5004 def scenefiles(filmfolder, filmname):
   5005     files = []
   5006     scenes = countscenes(filmfolder,filmname)
   5007     scene = 1
   5008     while scene <= scenes:
   5009         folder = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) + '/'
   5010         filename = 'scene'
   5011         files.append(folder + filename)
   5012         scene = scene + 1
   5013     #writemessage(str(len(shotfiles)))
   5014     #time.sleep(2)
   5015     return files
   5016 
   5017 #-------------Render Shot-------------
   5018 
   5019 def rendershot(filmfolder, filmname, renderfilename, scene, shot):
   5020     global fps, take, rendermenu, updatethumb, bitrate, muxing, db, film_fps
   5021     #This function checks and calls rendervideo & renderaudio if something has changed in the film
   5022     #Video
   5023     vumetermessage('render shot '+renderfilename)
   5024     video_origins = (os.path.realpath(renderfilename+'.mp4'))[:-4]
   5025     def render(q, filmfolder, filmname, renderfilename, scene, shot):
   5026         global fps, take, rendermenu, updatethumb, bitrate, muxing, db
   5027         video_origins = (os.path.realpath(renderfilename+'.mp4'))[:-4]
   5028         videohash = ''
   5029         oldvideohash = ''
   5030         scenedir = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/'
   5031         #return if no file
   5032         # Video Hash
   5033         #if os.path.isfile(renderfilename + '.h264') == True:
   5034         video_db=db.select('videos', where='filename="'+video_origins+'.mp4"')
   5035         faststart=True
   5036         try:
   5037             if video_db[0].faststart == 0:
   5038                 faststart=False
   5039         except:
   5040             faststart = True
   5041             pass
   5042         if faststart == False:
   5043             vumetermessage('found new clip compiling...')
   5044             os.system('mv ' + video_origins + '.mp4 ' + video_origins + '_tmp.mp4')
   5045             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)
   5046             run_command('rm '+video_origins+'_tmp.mp4')
   5047             try:
   5048                 db.update('videos', where='filename="'+video_origins+'.mp4"', faststart=True)
   5049             except:
   5050                 db = correct_database(filmname,filmfolder,db)
   5051                 db.update('videos', where='filename="'+video_origins+'.mp4"', faststart=True)
   5052             compileshot(renderfilename,filmfolder,filmname)
   5053             audiohash = str(int(countsize(renderfilename + '.wav')))
   5054             with open(scenedir + '.audiohash', 'w') as f:
   5055                 f.write(audiohash)
   5056         if os.path.isfile(renderfilename + '.mp4') == True:
   5057             videohash = videohash + str(int(countsize(renderfilename + '.mp4')))
   5058             print('Videohash of shot is: ' + videohash)
   5059             #time.sleep(3)
   5060             #if something shutdown in middle of process
   5061             #elif os.path.isfile(renderfilename + '_tmp.mp4') == True:
   5062             #    os.system('cp ' + renderfilename + '_tmp.mp4 ' + renderfilename + '.mp4')
   5063         else:
   5064             vumetermessage('Nothing here to play hit record')
   5065             status='',''
   5066             q.put(status)
   5067         #if os.path.isfile(renderfilename + '.h264') and os.path.isfile(renderfilename + '.mp4'):
   5068         #    os.system('rm ' + renderfilename + '.h264 ')
   5069         # Check if video corrupt
   5070         renderfix = False
   5071         if not os.path.isfile(renderfilename + '.wav'):
   5072             vumetermessage('creating audio track...')
   5073             audiosilence(renderfilename)
   5074             renderfix = True
   5075         if os.path.isfile(renderfilename + '.jpeg') == False: 
   5076             run_command('ffmpeg -sseof -1 -i ' + renderfilename + '.mp4 -update 1 -q:v 1 -vf scale=800:450 ' + renderfilename + '.jpeg')
   5077         #try:
   5078         #    pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + renderfilename + '.mp4', shell=True)
   5079         #    videolength = pipe.decode().strip()
   5080         #except:
   5081         #    videolength = ''
   5082         #print('Shot length ' + videolength)
   5083         #if videolength == '':
   5084         #    print('Okey, shot file not found or is corrupted')
   5085         #    # For backwards compatibility remove old rendered scene files
   5086         #    # run_command('rm ' + renderfilename + '*')
   5087         #    status='',''
   5088         #    q.put(status)
   5089 
   5090         #EDITS AND FX
   5091         trimfile = ''
   5092         if os.path.isfile(scenedir+'.split') == True:
   5093             settings = pickle.load(open(scenedir + ".split", "rb"))
   5094             split_list = settings
   5095             logger.info("settings loaded")
   5096             nr=1
   5097             for i in split_list:
   5098                 if nr == 1:
   5099                     #make first split as a new take in the original shot
   5100                     newshotdir = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/'
   5101                     newtakename = 'take' + str(counttakes2(newshotdir)).zfill(3)
   5102                     if i[0][0] < i[0][1]:
   5103                         videotrim(filmfolder,scenedir,i[1],'both', i[0][0],i[0][1],'take')
   5104                     #newtakename = 'take' + str(1).zfill(3)
   5105                 elif nr > 1:
   5106                     #then make new shots
   5107                     newshotdir = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot-1).zfill(3) + '_insert/'
   5108                     newtakename = 'take' + str(1).zfill(3)
   5109                     try:
   5110                         os.makedirs(newshotdir)
   5111                     except:
   5112                         print('is there already prob')
   5113                     if i[0][0] < i[0][1]:
   5114                         videotrim(filmfolder,scenedir,i[1],'both', i[0][0],i[0][1],newshotdir+newtakename)
   5115                     add_organize(filmfolder, filmname)
   5116                 organize(filmfolder, filmname)
   5117                 organize(filmfolder, filmname)
   5118                 scenes, shots, takes = browse(filmname,filmfolder,scene,shot,1)
   5119                 #vumetermessage('Shot ' + str(shot) + ' inserted')
   5120                 updatethumb = True
   5121                 time.sleep(1)
   5122                 nr=nr+1
   5123                 shot=shot+1
   5124             os.remove(scenedir+'.split')
   5125             take=counttakes2(scenedir)
   5126             updatethumb=True
   5127             rendermenu = True
   5128             newaudiomix = True
   5129             renderfilename = scenedir+'take' + str(counttakes2(scenedir)).zfill(3)
   5130         elif os.path.isfile(scenedir+'.beginning') == True and os.path.isfile(scenedir+'.end') == True:
   5131             settings = pickle.load(open(scenedir + ".beginning", "rb"))
   5132             s, trimfile = settings
   5133             logger.info("settings loaded")
   5134             trimfile = 'take' + str(counttakes2(scenedir)).zfill(3)
   5135             renderfilename=scenedir+trimfile
   5136             settings = pickle.load(open(scenedir + ".end", "rb"))
   5137             t, trimfile = settings
   5138             logger.info("settings loaded")
   5139             videotrim(filmfolder,scenedir,trimfile,'both', s,t,'take')
   5140             os.remove(scenedir+'.beginning')
   5141             os.remove(scenedir+'.end')
   5142             take=counttakes2(scenedir)
   5143             updatethumb=True
   5144             rendermenu = True
   5145             newaudiomix = True
   5146             renderfilename = scenedir+'take' + str(counttakes2(scenedir)).zfill(3)
   5147         elif os.path.isfile(scenedir+'.beginning') == True:
   5148             settings = pickle.load(open(scenedir + ".beginning", "rb"))
   5149             s, trimfile = settings
   5150             logger.info("settings loaded")
   5151             videotrim(filmfolder,scenedir,trimfile,'beginning', s, 0,'take')
   5152             os.remove(scenedir+'.beginning')
   5153             newaudiomix = True
   5154             take=counttakes2(scenedir)
   5155             updatethumb=True
   5156             rendermenu = True
   5157             trimfile = 'take' + str(counttakes2(scenedir)).zfill(3)
   5158             renderfilename=scenedir+trimfile
   5159         elif os.path.isfile(scenedir+'.end') == True:
   5160             settings = pickle.load(open(scenedir + ".end", "rb"))
   5161             if trimfile == '':
   5162                 s, trimfile = settings
   5163             else:
   5164                 p, trimfileoriginal = settings
   5165                 s=p-s
   5166             logger.info("settings loaded")
   5167             videotrim(filmfolder,scenedir,trimfile,'end', s, 0,'take')
   5168             os.remove(scenedir+'.end')
   5169             take=counttakes2(scenedir)
   5170             updatethumb=True
   5171             rendermenu = True
   5172             newaudiomix = True
   5173             renderfilename = scenedir+'take' + str(counttakes2(scenedir)).zfill(3)
   5174         ###---------BLEND----------
   5175         if os.path.isfile(scenedir+'blend/'+blendmodes[blendselect]+'.mp4') == True:
   5176             videos_totalt = db.query("SELECT COUNT(*) AS videos FROM videos")[0]
   5177             tot = int(videos_totalt.videos)
   5178             video_origins=filmfolder+'.videos/'+datetime.datetime.now().strftime('%Y%d%m')+'_'+os.urandom(8).hex()+'_'+str(tot).zfill(5)
   5179             #compileshot(scenedir+'blend/'+blendmodes[blendselect]+'.h264',filmfolder,filmname)
   5180             call(['MP4Box', '-rem', '2', scenedir+'blend/'+blendmodes[blendselect] + '.mp4'], shell=False)
   5181             run_command('ffmpeg -y -i '+renderfilename+'.mp4 -i '+scenedir+'blend/'+blendmodes[blendselect]+'.mp4 '+encoder()+'-filter_complex "blend="'+blendmodes[blendselect]+' /dev/shm/blend.mp4')
   5182             screen_filename = scenedir+'take' + str(counttakes2(scenedir)+1).zfill(3)
   5183             run_command('cp ' + renderfilename + '.wav ' + screen_filename + '.wav')
   5184             #make a new sublink
   5185             run_command('cp /dev/shm/blend.mp4 '+video_origins+'.mp4')
   5186             os.system('ln -sfr '+video_origins+'.mp4 '+screen_filename+'.mp4')
   5187             run_command('rm /dev/shm/blend.mp4')
   5188             run_command('rm '+scenedir+'blend/'+blendmodes[blendselect]+'.mp4')
   5189             run_command('ffmpeg -y -sseof -1 -i ' + screen_filename + '.mp4 -update 1 -q:v 1 -vf scale=800:450 ' + screen_filename + '.jpeg')
   5190             #ffmpeg -i blendtest.mp4 -i blendtest3.mp4 -filter_complex "blend=screen" output2.mp4
   5191             newaudiomix = True
   5192             take=counttakes2(scenedir)
   5193             renderfilename = scenedir+'take' + str(counttakes2(scenedir)).zfill(3)
   5194             updatethumb=True
   5195             rendermenu = True
   5196             newaudiomix = True
   5197         ###---------CROSSFADE--------
   5198         if os.path.isfile(scenedir+'.crossfade') == True:
   5199             settings = pickle.load(open(scenedir + ".crossfade", "rb"))
   5200             s, trimfile = settings
   5201             logger.info("settings loaded")
   5202             videolength=0
   5203             foldername = filmfolder + filmname + '/scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) + '/'
   5204             crossfade_folder = filmfolder + filmname + '/scene' + str(scene).zfill(3) +'/shot' + str(shot+1).zfill(3) + '/'
   5205             crossfade_filename = 'take' + str(counttakes2(crossfade_folder)).zfill(3)
   5206             filename = trimfile
   5207             compileshot(crossfade_folder+crossfade_filename,crossfade_folder,filmname)
   5208             pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + foldername+filename + '.mp4', shell=True)
   5209             videolength = pipe.decode().strip()
   5210             videolength=(int(videolength)/1000)-0.2
   5211             pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + crossfade_folder+ crossfade_filename + '.mp4', shell=True)
   5212             videolength2 = pipe.decode().strip()
   5213             videolength2=(int(videolength2)/1000)-0.2
   5214             if videolength > int(s)/2:
   5215                 if videolength2 > int(s)/2:           
   5216                     #crossfade(scenedir,trimfile,'end', s)
   5217                     crossfade_start = int(videolength)-crossfade
   5218                     output = scenedir+'take' + str(counttakes2(scenedir)+1).zfill(3)
   5219                     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')
   5220                     run_command('ffmpeg -y -i '+renderfilename+'.wav -i '+crossfade_folder+crossfade_filename+'.wav -filter_complex "acrossfade=d='+str(crossfade)+'" '+output+'.wav')
   5221                     run_command('ffmpeg -y -sseof -1 -i ' + output + '.mp4 -update 1 -q:v 1 -vf scale=800:450 ' + output + '.jpeg')
   5222                     os.remove(scenedir+'.crossfade')
   5223                     #ffmpeg -i blendtest.mp4 -i blendtest.mp4 -filter_complex "xfade=offset=4.5:duration=1" output3.mp4
   5224                     #crossfade()
   5225         try:
   5226             with open(scenedir + '.videohash', 'r') as f:
   5227                 oldvideohash = f.readline().strip()
   5228             print('oldvideohash is: ' + oldvideohash)
   5229         except:
   5230             print('no videohash found, making one...')
   5231             with open(scenedir + '.videohash', 'w') as f:
   5232                 f.write(videohash)
   5233         #Audio
   5234         lasttake = counttakes(filmname, filmfolder, scene, shot)
   5235         lasttakefilename = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/take' + str(lasttake).zfill(3) 
   5236         audiohash = ''
   5237         oldaudiohash = ''
   5238         newaudiomix = False
   5239         if lasttakefilename == renderfilename:
   5240             audiohash += str(int(countsize(renderfilename + '.wav')))
   5241             dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, scene, shot)
   5242             for p in dubfiles:
   5243                 audiohash += str(int(countsize(p)))
   5244             print('Audiohash of shot is: ' + audiohash)
   5245             try:
   5246                 with open(scenedir + '.audiohash', 'r') as f:
   5247                     oldaudiohash = f.readline().strip()
   5248                 print('oldaudiohash is: ' + oldaudiohash)
   5249             except:
   5250                 print('no audiohash found, making one...')
   5251                 with open(scenedir + '.audiohash', 'w') as f:
   5252                     f.write(audiohash)
   5253             if audiohash != oldaudiohash or newmix == True or renderfix == True:
   5254                 print('rerendering')
   5255                 #check if sound file exist
   5256                 if os.path.isfile(renderfilename+'.wav') == False:
   5257                     logger.info('no sound, creating empty audio track')
   5258                     audiosilence(renderfilename)
   5259                 #time.sleep(3)
   5260                 #make scene rerender
   5261                 os.system('touch '+filmfolder + filmname + '/scene' + str(scene).zfill(3)+'/.rerender')
   5262                 #copy original sound
   5263                 if os.path.exists(scenedir+'dub') == True:
   5264                     os.system('cp '+scenedir+'dub/original.wav '+renderfilename+'.wav')
   5265                 #os.system('cp '+dubfolder+'original.wav '+renderfilename+'.wav')
   5266                 renderaudio(renderfilename, renderfilename, dubfiles, dubmix)
   5267                 print('updating audiohash...')
   5268                 with open(scenedir + '.audiohash', 'w') as f:
   5269                     f.write(audiohash)
   5270                 for i in range(len(dubfiles)):
   5271                     os.system('cp ' + scenedir + '/dub/.settings' + str(i + 1).zfill(3) + ' ' + scenedir + '/dub/.rendered' + str(i + 1).zfill(3))
   5272                 print('Audio rendered!')
   5273                 newaudiomix = True
   5274                 logger.info('compile done!')
   5275             else:
   5276                 print('Already rendered!')
   5277             muxings=False
   5278             if muxings == True:
   5279                 #muxing mp3 layer to mp4 file
   5280                 #count estimated audio filesize with a bitrate of 320 kb/s
   5281                 audiosize = countsize(renderfilename + '.wav') * 0.453
   5282                 p = Popen(['ffmpeg', '-y', '-i', renderfilename + '.wav', '-acodec', 'libmp3lame', '-ac', '2', '-b:a', '320k', renderfilename + '.mp3'])
   5283                 while p.poll() is None:
   5284                     time.sleep(0.2)
   5285                     try:
   5286                         rendersize = countsize(renderfilename + '.mp3')
   5287                     except:
   5288                         continue
   5289                     writemessage('audio rendering ' + str(int(rendersize)) + ' of ' + str(int(audiosize)) + ' kb done')
   5290                 ##MERGE AUDIO & VIDEO
   5291                 writemessage('Merging audio & video')
   5292                 #os.remove(renderfilename + '.mp4') 
   5293                 call(['MP4Box', '-rem', '2',  video_origins + '.mp4'], shell=False)
   5294                 call(['MP4Box', '-fps', str(film_fps), '-add', video_origins + '.mp4', '-add', renderfilename + '.mp3', '-new', video_origins + '_tmp.mp4'], shell=False)
   5295                 os.system('cp -f ' + video_origins + '_tmp.mp4 ' + video_origins + '.mp4')
   5296                 try:
   5297                     os.remove(video_origins + '_tmp.mp4')
   5298                     os.remove(renderfilename + '.mp3')
   5299                 except:
   5300                     print('nothing to remove')
   5301             #origin=os.path.realpath(renderfilename+'.mp4')
   5302             #os.system('rm ' + filename + '.h264')
   5303             #os.system('rm /dev/shm/temp.wav')
   5304             #os.system('ln -sfr '+video_origins+'.mp4 '+filename+'.mp4')
   5305         status=renderfilename,newaudiomix
   5306         q.put(status)
   5307     q = mp.Queue()
   5308     proc = mp.Process(target=render, args=(q, filmfolder, filmname, renderfilename, scene, shot))
   5309     proc.start()
   5310     procdone = False
   5311     status = ''
   5312     while True:
   5313         if proc.is_alive() == False and procdone == False:
   5314             status = q.get()
   5315             print(status)
   5316             procdone = True
   5317             proc.join()
   5318             renderfilename,newaudiomix = status
   5319             vumetermessage(renderfilename+'.mp4')
   5320             break
   5321         if middlebutton() == True:
   5322             proc.terminate()
   5323             proc.join()
   5324             procdone = True
   5325             q=''
   5326             os.system('pkill MP4Box')
   5327             vumetermessage('canceled for now, maybe u want to render later ;)')
   5328             writemessage('press any button to continue')
   5329             print('canceling videorender')
   5330             renderfilename = ''
   5331             newaudiomix=''
   5332             break
   5333     return renderfilename, newaudiomix
   5334 
   5335 #-------------Render Scene-------------
   5336 
   5337 def renderscene(filmfolder, filmname, scene):
   5338     global fps, muxing
   5339     #This function checks and calls rendervideo & renderaudio if something has changed in the film
   5340     #Video
   5341     videohash = ''
   5342     oldvideohash = ''
   5343     filmfiles = shotfiles(filmfolder, filmname, scene)
   5344     renderfilename = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/scene'
   5345     scenedir = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/'
   5346     # Check if video corrupt
   5347     renderfixscene = False
   5348     renderfix=False
   5349     #try:
   5350     #    pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + renderfilename + '.mp4', shell=True)
   5351     #    videolength = pipe.decode().strip()
   5352     #except:
   5353     #    videolength = ''
   5354     #    renderfixscene = True
   5355     #print('Scene length ' + videolength)
   5356     #if videolength == '':
   5357     #    print('Okey, hold your horses, rendering!')
   5358     #    # For backwards compatibility remove old rendered scene files
   5359     #    #run_command('rm ' + renderfilename + '.mp4')
   5360     #    #run_command('rm ' + renderfilename + '.wav')
   5361     #    #vumetermessage('corrupted scene file! removing, please render again')
   5362     #    renderfixscene = True
   5363     #    #return '', ''
   5364     # Video Hash
   5365     for p in filmfiles:
   5366         #compileshot(p,filmfolder,filmname)
   5367         #print(p)
   5368         #time.sleep(5)
   5369         scene = int(p.rsplit('scene',1)[1][:3])
   5370         shot = int(p.rsplit('shot',1)[1][:3])
   5371         rendershotname, renderfix = rendershot(filmfolder, filmname, p, scene, shot)
   5372         if renderfix == True:
   5373             renderfixscene = True
   5374         if rendershotname:
   5375             try: 
   5376                 videohash = videohash + str(int(countsize(p + '.mp4')))
   5377             except:
   5378                 print('no file? ')
   5379     filmfiles = shotfiles(filmfolder, filmname, scene)
   5380     for p in filmfiles:
   5381         scene = int(p.rsplit('scene',1)[1][:3])
   5382         shot = int(p.rsplit('shot',1)[1][:3])
   5383         rendershotname, renderfix = rendershot(filmfolder, filmname, p, scene, shot)
   5384         if renderfix == True:
   5385             renderfixscene = True
   5386         if rendershotname:
   5387             try: 
   5388                 videohash = videohash + str(int(countsize(p + '.mp4')))
   5389             except:
   5390                 print('no file? ')
   5391     print('Videohash of scene is: ' + videohash)
   5392     try:
   5393         with open(scenedir + '.videohash', 'r') as f:
   5394             oldvideohash = f.readline().strip()
   5395         print('oldvideohash is: ' + oldvideohash)
   5396     except:
   5397         print('no videohash found, making one...')
   5398         with open(scenedir + '.videohash', 'w') as f:
   5399             f.write(videohash)
   5400     print('renderfix is:'+str(renderfixscene))
   5401     # Render if needed
   5402     if videohash != oldvideohash or renderfixscene == True:
   5403         rendervideo(filmfolder,filmname,scene,filmfiles, renderfilename, 'scene ' + str(scene))
   5404         #fastedit(filmfolder, filmname, filmfiles, scene)
   5405         #run_command('cp '+renderfilename+ '.mp4 '+renderfilename+'_tmp.mp4')
   5406         #call(['ffmpeg', '-i', renderfilename + '_tmp.mp4', '-r', '25', '-vsync', '1', '-c:v', 'copy', '-fflags', '+genpts+igndts', '-movflags', '+faststart', renderfilename+'.mp4', '-y'], shell=False)
   5407         #call(['ffmpeg', '-i', renderfilename + '_tmp.mp4', '-r', '25', '-c:v', 'copy', '-movflags', '+faststart', renderfilename+'.mp4', '-y'], shell=False)
   5408         try:
   5409             os.remove(renderfilename + '_tmp.mp4')
   5410         except:
   5411             pass
   5412         print('updating videohash...')
   5413         with open(scenedir + '.videohash', 'w') as f:
   5414             f.write(videohash)
   5415     #time.sleep(3)
   5416 
   5417     #Audio
   5418     audiohash = ''
   5419     oldaudiohash = ''
   5420     newaudiomix = False
   5421     for p in filmfiles:
   5422         try:
   5423             audiohash += str(int(countsize(p + '.wav')))
   5424         except:
   5425             audiohash=0
   5426             renderfix=True
   5427     dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, scene, 0)
   5428     print(dubfiles)
   5429     for p in dubfiles:
   5430         try:
   5431             audiohash += str(int(countsize(p)))
   5432         except:
   5433             audiohash=0
   5434     print('Audiohash of scene is: ' + audiohash)
   5435     try:
   5436         with open(scenedir + '.audiohash', 'r') as f:
   5437             oldaudiohash = f.readline().strip()
   5438         print('oldaudiohash is: ' + oldaudiohash)
   5439     except:
   5440         print('no audiohash found, making one...')
   5441         with open(scenedir + '.audiohash', 'w') as f:
   5442             f.write(audiohash) 
   5443         renderfixscene=True
   5444     if os.path.isfile(scenedir+'/.rerender') == True:
   5445         renderfixscene=True
   5446         os.system('rm '+scenedir+'/.rerender')
   5447     if audiohash != oldaudiohash or newmix == True or renderfix == True or renderfixscene == True:
   5448         renderaudio(filmfiles, renderfilename, dubfiles, dubmix)
   5449         print('updating audiohash...')
   5450         with open(scenedir + '.audiohash', 'w') as f:
   5451             f.write(audiohash)
   5452         for i in range(len(dubfiles)):
   5453             os.system('cp ' + scenedir + '/dub/.settings' + str(i + 1).zfill(3) + ' ' + scenedir + '/dub/.rendered' + str(i + 1).zfill(3))
   5454         print('Audio rendered!')
   5455         newaudiomix = True
   5456         #os.system('mv ' + renderfilename + '.mp4 ' + renderfilename + '_tmp.mp4')
   5457     else:
   5458         print('Already rendered!')
   5459     #dont mux scenes for now
   5460     mux = False
   5461     if mux == True:
   5462         #muxing mp3 layer to mp4 file
   5463         #count estimated audio filesize with a bitrate of 320 kb/s
   5464         try:
   5465             audiosize = countsize(renderfilename + '.wav') * 0.453
   5466         except:
   5467             print('noothing here')
   5468         os.system('mv ' + renderfilename + '.mp4 ' + renderfilename + '_tmp.mp4')
   5469         if debianversion == 'stretch':
   5470             p = Popen(['avconv', '-y', '-i', renderfilename + '.wav', '-acodec', 'libmp3lame', '-ac', '2', '-b:a', '320k', renderfilename + '.mp3'])
   5471         else:
   5472             p = Popen(['ffmpeg', '-y', '-i', renderfilename + '.wav', '-acodec', 'libmp3lame', '-ac', '2', '-b:a', '320k', renderfilename + '.mp3'])
   5473         while p.poll() is None:
   5474             time.sleep(0.02)
   5475             try:
   5476                 rendersize = countsize(renderfilename + '.mp3')
   5477             except:
   5478                 continue
   5479             writemessage('audio rendering ' + str(int(rendersize)) + ' of ' + str(int(audiosize)) + ' kb done')
   5480         ##MERGE AUDIO & VIDEO
   5481         writemessage('Merging audio & video')
   5482         #os.remove(renderfilename + '.mp4') 
   5483         call(['MP4Box', '-rem', '2',  renderfilename + '_tmp.mp4'], shell=False)
   5484         #call(['MP4Box', '-inter', '40', '-v', renderfilename + '.mp4'], shell=False)
   5485         call(['MP4Box', '-add', renderfilename + '_tmp.mp4', '-add', renderfilename + '.mp3', '-new', renderfilename + '.mp4'], shell=False)
   5486         #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)
   5487         os.remove(renderfilename + '_tmp.mp4')
   5488         os.remove(renderfilename + '.mp3')
   5489     return renderfilename, newaudiomix
   5490 
   5491 #-------------Render film------------
   5492 
   5493 def renderfilm(filmfolder, filmname, comp, scene):
   5494     global fps, muxing
   5495     def render(q, filmfolder, filmname, comp, scene):
   5496         global fps, muxing
   5497         newaudiomix = False
   5498         #if comp == 1:
   5499         #    newaudiomix = True
   5500         #This function checks and calls renderscene first then rendervideo & renderaudio if something has changed in the film
   5501         if scene > 0:
   5502             scenefilename, audiomix = renderscene(filmfolder, filmname, scene)
   5503             q.put(scenefilename)
   5504             return
   5505         scenes = countscenes(filmfolder, filmname)
   5506         for i in range(scenes):
   5507             scenefilename, audiomix = renderscene(filmfolder, filmname, i + 1)
   5508             #Check if a scene has a new audiomix
   5509             print('audiomix of scene ' + str(i + 1) + ' is ' + str(audiomix))
   5510             if audiomix == True:
   5511                 newaudiomix = True
   5512             scenefilename, audiomix = renderscene(filmfolder, filmname, i + 1)
   5513             #Check if a scene has a new audiomix
   5514             print('audiomix of scene ' + str(i + 1) + ' is ' + str(audiomix))
   5515             if audiomix == True:
   5516                 newaudiomix = True
   5517         filmfiles = scenefiles(filmfolder, filmname)
   5518         #Video
   5519         videohash = ''
   5520         oldvideohash = ''
   5521         renderfilename = filmfolder + filmname + '/' + filmname
   5522         filmdir = filmfolder + filmname + '/'
   5523         scenedir = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/'
   5524         for p in filmfiles:
   5525             print(p)
   5526             #compileshot(p,filmfolder,filmname)
   5527             videohash += str(int(countsize(p + '.mp4')))
   5528         print('Videohash of film is: ' + videohash)
   5529         try:
   5530             with open(filmdir + '.videohash', 'r') as f:
   5531                 oldvideohash = f.readline().strip()
   5532             print('oldvideohash is: ' + oldvideohash)
   5533         except:
   5534             print('no videohash found, making one...')
   5535             with open(filmdir + '.videohash', 'w') as f:
   5536                 f.write(videohash)
   5537         if videohash != oldvideohash:
   5538             rendervideo(filmfolder,filmname,scene,filmfiles, renderfilename, filmname)
   5539             print('updating video hash')
   5540             with open(filmdir + '.videohash', 'w') as f:
   5541                 f.write(videohash)
   5542         #Audio
   5543         audiohash = ''
   5544         oldaudiohash = ''
   5545         for p in filmfiles:
   5546             print(p)
   5547             audiohash += str(int(countsize(p + '.wav')))
   5548         dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, 0, 0)
   5549         for p in dubfiles:
   5550             audiohash += str(int(countsize(p)))
   5551         print('Audiohash of film is: ' + audiohash)
   5552         try:
   5553             with open(filmdir + '.audiohash', 'r') as f:
   5554                 oldaudiohash = f.readline().strip()
   5555             print('oldaudiohash is: ' + oldaudiohash)
   5556         except:
   5557             print('no audiohash found, making one...')
   5558             with open(filmdir+ '.audiohash', 'w') as f:
   5559                 f.write(audiohash)
   5560         #This is if the scene has a new audiomix
   5561         if newaudiomix == True:
   5562             newmix = True
   5563         if audiohash != oldaudiohash or newmix == True:
   5564             renderaudio(filmfiles, renderfilename, dubfiles, dubmix)
   5565             print('updating audiohash...')
   5566             with open(filmdir+ '.audiohash', 'w') as f:
   5567                 f.write(audiohash)
   5568             for i in range(len(dubfiles)):
   5569                 os.system('cp ' + filmdir + '/dub/.settings' + str(i + 1).zfill(3) + ' ' + filmdir + '/dub/.rendered' + str(i + 1).zfill(3))
   5570             print('Audio rendered!')
   5571             #compressing
   5572             if comp > 0:
   5573                 writemessage('compressing audio')
   5574                 os.system('mv ' + renderfilename + '.wav ' + renderfilename + '_tmp.wav')
   5575                 #run_command('sox ' + renderfilename + '_tmp.wav ' + renderfilename + '.wav compand 0.3,1 6:-70,-60,-20 -5 -90 0.2')
   5576                 run_command('sox ' + renderfilename + '_tmp.wav ' + renderfilename + '.wav compand 0.0,1 6:-70,-43,-20 -6 -90 0.1')
   5577                 os.remove(renderfilename + '_tmp.wav')
   5578         else:
   5579             print('Already rendered!')
   5580         #muxing = True
   5581         if muxing == True:
   5582             #muxing mp3 layer to mp4 file
   5583             #count estimated audio filesize with a bitrate of 320 kb/s
   5584             audiosize = countsize(renderfilename + '.wav') * 0.453
   5585             os.system('mv ' + renderfilename + '.mp4 ' + renderfilename + '_tmp.mp4')
   5586             if debianversion == 'stretch':
   5587                 p = Popen(['avconv', '-y', '-i', renderfilename + '.wav', '-acodec', 'libmp3lame', '-ac', '2', '-b:a', '320k', renderfilename + '.mp3'])
   5588             else:
   5589                 p = Popen(['ffmpeg', '-y', '-i', renderfilename + '.wav', '-acodec', 'libmp3lame', '-ac', '2', '-b:a', '320k', renderfilename + '.mp3'])
   5590             while p.poll() is None:
   5591                 time.sleep(0.02)
   5592                 try:
   5593                     rendersize = countsize(renderfilename + '.mp3')
   5594                 except:
   5595                     continue
   5596                 writemessage('audio rendering ' + str(int(rendersize)) + ' of ' + str(int(audiosize)) + ' kb done')
   5597             ##MERGE AUDIO & VIDEO
   5598             writemessage('Merging audio & video')
   5599             #os.remove(renderfilename + '.mp4') 
   5600             call(['MP4Box', '-rem', '2',  renderfilename + '_tmp.mp4'], shell=False)
   5601             #call(['MP4Box', '-inter', '40', '-v', renderfilename + '_tmp.mp4'], shell=False)
   5602             #call(['ffmpeg', '-i', renderfilename + '_tmp.mp4', '-c', 'copy', '-movflags', 'faststart', renderfilename+'.mp4', '-y'], shell=False)
   5603             call(['MP4Box', '-add', renderfilename + '_tmp.mp4', '-add', renderfilename + '.mp3', '-new', renderfilename + '.mp4'], shell=False)
   5604             os.remove(renderfilename + '_tmp.mp4')
   5605             os.remove(renderfilename + '.mp3')
   5606         q.put(renderfilename)
   5607     q = mp.Queue()
   5608     proc = mp.Process(target=render, args=(q,filmfolder,filmname,comp,scene))
   5609     proc.start()
   5610     procdone = False
   5611     status = ''
   5612     while True:
   5613         if proc.is_alive() == False and procdone == False:
   5614             status = q.get()
   5615             print(status)
   5616             procdone = True
   5617             proc.join()
   5618             renderfilename = status
   5619             vumetermessage(status+'.mp4')
   5620             break
   5621         if middlebutton() == True:
   5622             proc.terminate()
   5623             proc.join()
   5624             procdone = True
   5625             q=''
   5626             os.system('pkill MP4Box')
   5627             vumetermessage('canceled for now, maybe u want to render later ;)')
   5628             writemessage('press any button to continue')
   5629             print('canceling videorender')
   5630             renderfilename = ''
   5631             break
   5632     return renderfilename
   5633 
   5634 #-------------Get dub files-----------
   5635 
   5636 def getdubs(filmfolder, filmname, scene, shot):
   5637     #search for dub files
   5638     print('getting scene dubs')
   5639     dubfiles = []
   5640     dubmix = []
   5641     rerender = False
   5642     if filmname == None and scene == None and shot == None:
   5643         filefolder = filmfolder
   5644     elif scene > 0 and shot == 0:
   5645         filefolder = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/dub/'
   5646     elif scene > 0 and shot > 0:
   5647         filefolder = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/dub/'
   5648     else:
   5649         filefolder = filmfolder + filmname + '/dub/'
   5650     try:
   5651         allfiles = os.listdir(filefolder)
   5652     except:
   5653         print('no dubs')
   5654         return dubfiles, dubmix, rerender
   5655     for a in allfiles:
   5656         if 'dub' in a:
   5657             print('Dub audio found! ' + filefolder + a)
   5658             dubfiles.append(filefolder + a)
   5659             dubfiles.sort()
   5660     #check if dub mix has changed
   5661     dubnr = 1
   5662     for i in dubfiles:
   5663         dub = []
   5664         rendered_dub = []
   5665         try:
   5666             with open(filefolder + '.settings' + str(dubnr).zfill(3), 'r') as f:
   5667                 dubstr = f.read().splitlines()
   5668             for i in dubstr:
   5669                 dub.append(float(i))
   5670             print('dub ' + str(dubnr).zfill(3) + ' loaded!')
   5671             print(dub)
   5672         except:
   5673             print('cant find settings file')
   5674             dub = [1.0, 1.0, 0.0, 0.0]
   5675             with open(filefolder + ".settings" + str(dubnr).zfill(3), "w") as f:
   5676                 for i in dub:
   5677                     f.write(str(i) + '\n')
   5678         try:
   5679             with open(filefolder + '.rendered' + str(dubnr).zfill(3), 'r') as f:
   5680                 dubstr = f.read().splitlines()
   5681             for i in dubstr:
   5682                 rendered_dub.append(float(i))
   5683             print('rendered dub loaded')
   5684             print(rendered_dub)
   5685         except:
   5686             print('no rendered dubmix found!')
   5687         if rendered_dub != dub:
   5688             rerender = True
   5689         dubmix.append(dub)
   5690         dubnr += 1
   5691     return dubfiles, dubmix, rerender
   5692 
   5693 #------------Remove Dubs----------------
   5694 
   5695 def removedub(dubfolder, dubnr):
   5696     pressed = ''
   5697     buttonpressed = ''
   5698     buttontime = time.time()
   5699     holdbutton = ''
   5700     selected = 0
   5701     header = 'Are you sure you want to remove dub ' + str(dubnr) + '?'
   5702     menu = 'NO', 'YES'
   5703     settings = '', ''
   5704     oldmenu=''
   5705     while True:
   5706         writemenu(menu,settings,selected,header,showmenu,oldmenu)
   5707         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   5708         if pressed == 'right':
   5709             if selected < (len(menu) - 1):
   5710                 selected = selected + 1
   5711         elif pressed == 'left':
   5712             if selected > 0:
   5713                 selected = selected - 1
   5714         elif pressed == 'middle' and selected == 0:
   5715             logger.info('dont remove dub')
   5716             time.sleep(0.3)
   5717             break
   5718         elif pressed == 'middle' and selected == 1: 
   5719             os.system('rm ' + dubfolder + 'dub' + str(dubnr).zfill(3) + '.wav')
   5720             os.system('rm ' + dubfolder + '.settings' + str(dubnr).zfill(3))
   5721             os.system('rm ' + dubfolder + '.rendered' + str(dubnr).zfill(3))
   5722             time.sleep(0.5)
   5723             print(dubfolder)
   5724             dubs = next(os.walk(dubfolder))[2]
   5725             print(dubs)
   5726             for i in dubs:
   5727                 if 'dub' not in i:
   5728                     dubs.remove(i)
   5729             organized_nr = 1
   5730             for s in sorted(dubs):
   5731                 if '.wav' in s and 'dub' in s:
   5732                     print(s)
   5733                     unorganized_nr = int(s[3:-4])
   5734                     if organized_nr == unorganized_nr:
   5735                         print('correct')
   5736                         pass
   5737                     if organized_nr != unorganized_nr:
   5738                         print('false, correcting from ' + str(unorganized_nr) + ' to ' + str(organized_nr))
   5739                         run_command('mv ' + dubfolder + 'dub' + str(unorganized_nr).zfill(3) + '.wav ' + dubfolder + 'dub' + str(organized_nr).zfill(3) + '.wav')
   5740                         run_command('mv ' + dubfolder + '.settings' + str(unorganized_nr).zfill(3) + ' ' + dubfolder + '.settings' + str(organized_nr).zfill(3))
   5741                         run_command('mv ' + dubfolder + '.rendered' + str(unorganized_nr).zfill(3) + ' ' + dubfolder + '.rendered' + str(organized_nr).zfill(3))
   5742                     organized_nr += 1
   5743             logger.info('removed dub file!')
   5744             vumetermessage('dub removed!')
   5745             break
   5746         time.sleep(0.05)
   5747 
   5748 #-------------Clip settings---------------
   5749 
   5750 def clipsettings(filmfolder, filmname, scene, shot, take, plughw, yanked):
   5751     vumetermessage('press record, view or retake to be dubbing')
   5752     pressed = ''
   5753     buttonpressed = ''
   5754     buttontime = time.time()
   5755     holdbutton = ''
   5756     selected = 0
   5757     dubfiles = []
   5758     dubmix = []
   5759     dubmix_old = []
   5760     if scene > 0 and shot == 0:
   5761         header = 'Scene ' + str(scene) + ' dubbing settings'
   5762         filefolder = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/dub/'
   5763         dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, scene, 0)
   5764     elif scene > 0 and shot > 0:
   5765         header = 'Scene ' + str(scene) + ' shot ' + str(shot) + ' dubbing settings'
   5766         filefolder = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/dub/'
   5767         dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, scene, shot)
   5768     else:
   5769         header = 'Film ' + filmname + ' dubbing settings'
   5770         filefolder = filmfolder + filmname + '/dub/'
   5771         dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, 0, 0)
   5772     newdub = [1.0, 1.0, 0.1, 0.1]
   5773     dubselected = len(dubfiles) - 1
   5774     dubrecord = ''
   5775     oldmenu=''
   5776     while True:
   5777         nmix = round(newdub[0],1)
   5778         ndub = round(newdub[1],1)
   5779         nfadein = round(newdub[2],1)
   5780         nfadeout = round(newdub[3],1)
   5781         if dubfiles:
   5782             mix = round(dubmix[dubselected][0],1)
   5783             dub = round(dubmix[dubselected][1],1)
   5784             fadein = round(dubmix[dubselected][2],1)
   5785             fadeout = round(dubmix[dubselected][3],1)
   5786             menu = 'BACK', 'ADD:', '', '', 'DUB' + str(dubselected + 1) + ':', '', '', ''
   5787             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), ''
   5788         else:
   5789             menu = 'BACK', 'ADD:', '', ''
   5790             settings = '', 'd:' + str(nmix) + '/o:' + str(ndub), 'in:' + str(nfadein), 'out:' + str(nfadeout), ''
   5791         oldmenu=writemenu(menu,settings,selected,header,showmenu,oldmenu)
   5792         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   5793 
   5794         #NEW DUB SETTINGS
   5795         if pressed == 'up' and selected == 1:
   5796             if newdub[0] > 0.99 and newdub[1] > 0.01:
   5797                 newdub[1] -= 0.1
   5798             if newdub[1] > 0.99 and newdub[0] < 0.99:
   5799                 newdub[0] += 0.1
   5800         elif pressed == 'down' and selected == 1:
   5801             if newdub[1] > 0.99 and newdub[0] > 0.01:
   5802                 newdub[0] -= 0.1
   5803             if newdub[0] > 0.99 and newdub[1] < 0.99:
   5804                 newdub[1] += 0.1
   5805         elif pressed == 'up' and selected == 2:
   5806             newdub[2] += 0.1
   5807         elif pressed == 'down' and selected == 2:
   5808             if newdub[2] > 0.01:
   5809                 newdub[2] -= 0.1
   5810         elif pressed == 'up' and selected == 3:
   5811             newdub[3] += 0.1
   5812         elif pressed == 'down' and selected == 3:
   5813             if newdub[3] > 0.01:
   5814                 newdub[3] -= 0.1
   5815         elif pressed == 'insert' and yanked != '':
   5816             os.makedirs(filefolder, exist_ok=True)
   5817             dubmix.append(newdub)
   5818             dubrecord = filefolder + 'dub' + str(len(dubfiles)+1).zfill(3) + '.wav'
   5819             os.system('cp '+yanked+'.wav '+dubrecord)
   5820             dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, scene, shot)
   5821             dubselected = len(dubfiles) - 1
   5822             dubrecord=''
   5823             yanked = ''
   5824         elif pressed == 'record' or pressed == 'middle' and selected == 1:
   5825             dubmix.append(newdub)
   5826             dubrecord = filefolder + 'dub' + str(len(dubfiles)+1).zfill(3) + '.wav'
   5827             break
   5828         elif pressed == 'retake' and selected == 4:
   5829             dubrecord = filefolder + 'dub' + str(dubselected + 1).zfill(3) + '.wav'
   5830             break
   5831         #DUB SETTINGS
   5832         elif pressed == 'up' and selected == 4:
   5833             if dubselected + 1 < len(dubfiles):
   5834                 dubselected = dubselected + 1
   5835         elif pressed == 'down' and selected == 4:
   5836             if dubselected > 0:
   5837                 dubselected = dubselected - 1
   5838         elif pressed == 'move' and selected == 4:
   5839             vumetermessage('press insert button to move dub')
   5840             movedub = filefolder + 'dub' + str(dubselected + 1).zfill(3) + '.wav'
   5841         elif pressed == 'insert' and selected == 4:
   5842             vumetermessage('moving dub please hold on')
   5843             pastedub = filefolder + 'dub' + str(dubselected + 1).zfill(3) + '_insert.wav'
   5844             os.system('mv -n ' + movedub + ' ' + pastedub)
   5845             organizedubs(filefolder)
   5846             pastedub=''
   5847         elif pressed == 'remove' and selected == 4:
   5848             removedub(filefolder, dubselected + 1)
   5849             dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, scene, shot)
   5850             dubselected = len(dubfiles) - 1
   5851             if len(dubfiles) == 0:
   5852                 #save original sound
   5853                 saveoriginal = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/take'+str(take).zfill(3)+'.wav'
   5854                 print('no dubs, copying original sound to original')
   5855                 os.system('cp '+filefolder+'original.wav '+saveoriginal)
   5856                 #removedub folder
   5857                 os.system('rm -r ' + filefolder)
   5858                 time.sleep(1)
   5859                 selected = 0
   5860         elif pressed == 'up' and selected == 5:
   5861             if dubmix[dubselected][0] >= 0.99 and dubmix[dubselected][1] > 0.01:
   5862                 dubmix[dubselected][1] -= 0.1
   5863             if dubmix[dubselected][1] >= 0.99 and dubmix[dubselected][0] < 0.99:
   5864                 dubmix[dubselected][0] += 0.1
   5865         elif pressed == 'down' and selected == 5:
   5866             if dubmix[dubselected][1] >= 0.99 and dubmix[dubselected][0] > 0.01:
   5867                 dubmix[dubselected][0] -= 0.1
   5868             if dubmix[dubselected][0] >= 0.99 and dubmix[dubselected][1] < 0.99:
   5869                 dubmix[dubselected][1] += 0.1
   5870         elif pressed == 'up' and selected == 6:
   5871             dubmix[dubselected][2] += 0.1
   5872         elif pressed == 'down' and selected == 6:
   5873             if dubmix[dubselected][2] > 0.01:
   5874                 dubmix[dubselected][2] -= 0.1
   5875         elif pressed == 'up' and selected == 7:
   5876             dubmix[dubselected][3] += 0.1
   5877         elif pressed == 'down' and selected == 7:
   5878             if dubmix[dubselected][3] > 0.01:
   5879                 dubmix[dubselected][3] -= 0.1
   5880         if pressed == 'right':
   5881             if selected < (len(settings)-2):
   5882                 selected = selected + 1
   5883             else:
   5884                 selected = 0
   5885             selected == 0
   5886         elif pressed == 'left':
   5887             if selected > 0:
   5888                 selected = selected - 1
   5889             else:
   5890                 selected = len(settings) - 2
   5891         elif pressed == 'middle' and menu[selected] == 'BACK':
   5892             os.system('pkill aplay')
   5893             break
   5894         elif pressed == 'views': # mix dub and listen
   5895             run_command('pkill aplay')
   5896             dubfiles, dubmix, rerender = getdubs(filmfolder, filmname, scene, shot)
   5897             if scene:
   5898                 filename = filmfolder + filmname + '/scene' + str(scene).zfill(3) +'/scene'
   5899                 renderfilename = renderfilm(filmfolder, filmname, 0, scene)
   5900                 playdub(filmname,renderfilename, 'scene',take)
   5901             elif shot and scene:
   5902                 filename = filmfolder + filmname + '/scene' + str(scene).zfill(3) +'/shot' + str(scene).zfill(3)+'/shot'
   5903                 renderfilename = renderfilm(filmfolder, filmname, 0, scene)
   5904                 playdub(filmname,renderfilename, 'shot',take)
   5905             else:
   5906                 filename = filmfolder + filmname + '/' + filmname
   5907         time.sleep(0.05)
   5908     #Save dubmix before returning
   5909     if dubmix != dubmix_old:
   5910         if os.path.isdir(filefolder) == False:
   5911             os.makedirs(filefolder)
   5912         c = 1
   5913         for i in dubmix:
   5914             with open(filefolder + ".settings" + str(c).zfill(3), "w") as f:
   5915                 for p in i:
   5916                     f.write(str(round(p,1)) + '\n')
   5917                     print(str(round(p,1)))
   5918             c += 1
   5919         dubmix_old = dubmix
   5920     return dubrecord, yanked
   5921 
   5922 #---------------Play & DUB--------------------
   5923 
   5924 def playdub(filmname, filename, player_menu, take):
   5925     global headphoneslevel, miclevel, plughw, channels, filmfolder, scene, soundrate, soundformat, showhelp, camera, overlay, overlay2, gonzopifolder, i2cbuttons, film_fps, film_reso
   5926     reso_w=film_reso.split('x')[0]
   5927     reso_h=film_reso.split('x')[1]
   5928     if film_reso == '1920x1080':
   5929         screen_reso_w='800'
   5930         screen_reso_h='475'
   5931         topspace='15'
   5932     elif film_reso == '1920x816':
   5933         screen_reso_w='800'
   5934         screen_reso_h='415'
   5935         topspace='75'
   5936     takename = 'take' + str(take).zfill(3)
   5937     if i2cbuttons == False:
   5938         hdmi_mode=True
   5939     else:
   5940         hdmi_mode=False
   5941     if showhelp == True:
   5942         overlay2 = removeimage(camera, overlay2)
   5943         overlay2 = displayimage(camera, gonzopifolder+'/extras/view-buttons.png', overlay, 4)
   5944     #read fastedit file
   5945     if player_menu == 'scene':
   5946         scenedir = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/'
   5947         try:
   5948             with open(scenedir + '.fastedit', 'r') as f:
   5949                 fastedit = f.read().splitlines()
   5950                 print(fastedit)
   5951         except:
   5952             print('no fastedit file found')
   5953             fastedit = 9999999
   5954     #omxplayer hack
   5955     os.system('rm /tmp/omxplayer*')
   5956     video = True
   5957     if player_menu == 'dub':
   5958         dub = True
   5959     else:
   5960         dub = False
   5961     if not os.path.isfile(filename + '.mp4'):
   5962         #should probably check if its not a corrupted video file
   5963         logger.info("no file to play")
   5964         if dub == True:
   5965             video = False
   5966         else:
   5967             return
   5968     sound = has_audio_track(filename + '.mp4')
   5969     t = 0
   5970     pressed = ''
   5971     buttonpressed = ''
   5972     buttontime = time.time()
   5973     holdbutton = ''
   5974     #playing = False
   5975     pause = False
   5976     trim = False
   5977     videolag = 0
   5978     trimfromstart=0
   5979     trimfromend=0
   5980     remove_shots = []
   5981     split_list=[]
   5982     oldmenu=''
   5983     if video == True:
   5984         if player_menu == 'dubbb':
   5985             try:
   5986                 if hdmi_mode==False:
   5987                     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)
   5988                 else:
   5989                     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)
   5990             except:
   5991                 writemessage('Something wrong with omxplayer')
   5992                 time.sleep(0.1)
   5993                 return
   5994         else:
   5995             try:
   5996                 if hdmi_mode==False:
   5997                     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)
   5998                 else:
   5999                     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)
   6000             except:
   6001                 writemessage('Something wrong with omxplayer')
   6002                 time.sleep(0.1)
   6003                 return
   6004             #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)
   6005         writemessage('Loading..')
   6006         clipduration = player.duration()
   6007         #vumetermessage('up [fast-forward], down [rewind], help button for more')
   6008     if sound == False:
   6009         try:
   6010             playerAudio = OMXPlayer(filename + '.wav', args=['--adev','alsa:hw:'+str(plughw), '--loop'], dbus_name='org.mpris.MediaPlayer2.omxplayer2', pause=True)
   6011         except:
   6012             writemessage('something wrong with audio player')
   6013             time.sleep(0.1)
   6014             return
   6015     #omxplayer hack to play really short videos.
   6016     if clipduration < 4:
   6017         logger.info("clip duration shorter than 4 sec")
   6018         player.previous()
   6019         if sound == False:
   6020             playerAudio.previous()
   6021     if dub == True:
   6022         p = 0
   6023         while p < 3:
   6024             writemessage('Dubbing in ' + str(3 - p) + 's')
   6025             time.sleep(1)
   6026             p+=1
   6027     if video == True:
   6028         player.play()
   6029         #player.pause()
   6030         player.set_position(0)
   6031         if sound == False:
   6032             playerAudio.play()
   6033             #playerAudio.pause()
   6034             playerAudio.set_position(0)
   6035         #run_command('aplay -D plughw:0 ' + filename + '.wav &')
   6036         #run_command('mplayer ' + filename + '.wav &')
   6037     if player_menu == 'dub':
   6038         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 &')
   6039     time.sleep(0.5)
   6040     #try:
   6041     #    playerAudio.play()
   6042     #except:
   6043     #    logger.info('something wrong with omxplayer audio or playing film mp4 audio')
   6044         #logger.warning(e)
   6045     starttime = time.time()
   6046     selected = 1
   6047     while True:
   6048         if player_menu == 'scene':
   6049             fastedit_shot = 1
   6050             for i in fastedit:
   6051                 if int(t) > float(int(i)/1000):
   6052                     fastedit_shot = fastedit_shot + 1
   6053             if not remove_shots:
   6054                 vumetermessage('shot ' + str(fastedit_shot))
   6055             else:
   6056                 p = ''
   6057                 for i in remove_shots:
   6058                     p = p + str(i) + ','
   6059                 vumetermessage('shot ' + str(fastedit_shot) + ' remove:' + p)
   6060         if trim == True:
   6061             menu = 'CANCEL', 'FROM BEGINNING', 'FROM END'
   6062             settings = '','',''
   6063         elif pause == True:
   6064             if player_menu == 'shot':
   6065                 menu = 'BACK', 'PLAY', 'REPLAY', 'TRIM'
   6066                 settings = '','','',''
   6067             else:
   6068                 menu = 'BACK', 'PLAY', 'REPLAY'
   6069                 settings = '','',''
   6070         elif player_menu == 'dub': 
   6071             menu = 'BACK', 'REDUB', 'PHONES:', 'MIC:'
   6072             settings = '', '', str(headphoneslevel), str(miclevel)
   6073         else:
   6074             menu = 'BACK', 'PAUSE', 'REPLAY', 'PHONES:'
   6075             settings = '', '', '', str(headphoneslevel)
   6076         if dub == True:
   6077             header = 'Dubbing ' + str(round(t,1))
   6078         else:
   6079             header = 'Playing ' + str(datetime.timedelta(seconds=round(t))) + ' of ' + str(datetime.timedelta(seconds=round(clipduration))) + ' s'
   6080         oldmenu=writemenu(menu,settings,selected,header,showmenu,oldmenu)
   6081         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   6082         if buttonpressed == True:
   6083             flushbutton()
   6084         if pressed == 'remove':
   6085             vumetermessage('video cuts removed!')
   6086             trimfromstart=0
   6087             trimfromend=0
   6088             split_list=[]
   6089         #SHOWHELP
   6090         elif pressed == 'showhelp':
   6091             vumetermessage('Button layout')
   6092             if showhelp == False:
   6093                 overlay2 = removeimage(camera, overlay2)
   6094                 overlay2 = displayimage(camera, gonzopifolder+'/extras/view-buttons.png', overlay, 4)
   6095                 showhelp = True
   6096             elif showhelp == True:
   6097                 overlay2 = removeimage(camera, overlay2)
   6098                 updatethumb =  True
   6099                 showhelp = False
   6100         elif pressed == 'right':
   6101             if selected < (len(settings) - 1):
   6102                 selected = selected + 1
   6103         elif pressed == 'left':
   6104             if selected > 0:
   6105                 selected = selected - 1
   6106         elif pressed == 'up':
   6107             if menu[selected] == 'PHONES:':
   6108                 if headphoneslevel < 100:
   6109                     headphoneslevel = headphoneslevel + 2
   6110                     run_command('amixer -c 0 sset Speaker ' + str(headphoneslevel) + '%')
   6111             elif menu[selected] == 'MIC:':
   6112                 if miclevel < 100:
   6113                     miclevel = miclevel + 2
   6114                     run_command('amixer -c 0 sset Mic ' + str(miclevel) + '% unmute')
   6115             else:
   6116                 if pause == False:
   6117                     try:
   6118                         player.set_position(t+2)
   6119                         if sound == False:
   6120                             playerAudio.set_position(t+2)
   6121                         time.sleep(0.2)
   6122                         #playerAudio.set_position(player.position())
   6123                     except:
   6124                         print('couldnt set position of player')
   6125                 else:
   6126                     try:
   6127                         player.play()
   6128                         if sound == False:
   6129                             playerAudio.play()
   6130                         time.sleep(0.3)
   6131                         t=t+0.1 
   6132                         player.set_position(t)
   6133                         player.pause()
   6134                         if sound == False:
   6135                             playerAudio.set_position(t)
   6136                             playerAudio.pause()
   6137                         #playerAudio.set_position(player.position())
   6138                     except:
   6139                         print('couldnt set position of player')
   6140         elif pressed == 'down':
   6141             if menu[selected] == 'PHONES:':
   6142                 if headphoneslevel > 0:
   6143                     headphoneslevel = headphoneslevel - 2
   6144                     run_command('amixer -c 0 sset Speaker ' + str(headphoneslevel) + '%')
   6145             elif menu[selected] == 'MIC:':
   6146                 if miclevel > 0:
   6147                     miclevel = miclevel - 2
   6148                     run_command('amixer -c 0 sset Mic ' + str(miclevel) + '% unmute')
   6149             else:
   6150                 if pause == False:
   6151                     if t > 1:
   6152                         try:
   6153                             player.set_position(t-2)
   6154                             if sound == False:
   6155                                 playerAudio.set_position(t-2)
   6156                             time.sleep(0.25)
   6157                             #playerAudio.set_position(player.position())
   6158                         except:
   6159                             print('couldnt set position of player')
   6160                 else:
   6161                     try:
   6162                         player.play()
   6163                         if sound == False:
   6164                             playerAudio.play()
   6165                         time.sleep(0.3)
   6166                         t=t-0.1
   6167                         player.set_position(t)
   6168                         player.pause()
   6169                         if sound == False:
   6170                             playerAudio.set_position(t)
   6171                             playerAudio.pause()
   6172                         #playerAudio.set_position(player.position())
   6173                     except:
   6174                         print('couldnt set position of player')
   6175         elif holdbutton == 'copy':
   6176             if t > 1:
   6177                 try:
   6178                     player.set_position(t-60)
   6179                     if sound == False:
   6180                         playerAudio.set_position(t-60)
   6181                     time.sleep(0.25)
   6182                     #playerAudio.set_position(player.position())
   6183                 except:
   6184                     print('couldnt set position of player')
   6185         elif holdbutton == 'insert':
   6186             if t > 1:
   6187                 try:
   6188                     player.set_position(t+60)
   6189                     if sound == False:
   6190                         playerAudio.set_position(t+60)
   6191                     time.sleep(0.25)
   6192                     #playerAudio.set_position(player.position())
   6193                 except:
   6194                     print('couldnt set position of player')
   6195         elif pressed == 'view':
   6196             trimfromstart = player.position()
   6197             vumetermessage('shot start position set to: '+ str(trimfromstart))
   6198             player.pause()
   6199             if sound == False:
   6200                 playerAudio.pause()
   6201             time.sleep(0.5)
   6202             player.play()
   6203             if sound == False:
   6204                 playerAudio.play()
   6205         elif pressed == 'record':
   6206             if trimfromstart != 0 and trimfromend != 0 and trimfromstart < trimfromend:
   6207                 split_list.append([[trimfromstart, trimfromend], takename])
   6208                 vumetermessage('split '+str(len(split_list))+' position set to: '+ str(player.position()))
   6209                 player.pause()
   6210                 if sound == False:
   6211                     playerAudio.pause()
   6212                 time.sleep(0.5)
   6213                 player.play()
   6214                 if sound == False:
   6215                     playerAudio.play()
   6216         elif pressed == 'retake':
   6217             if player.position() < clipduration:
   6218                 trimfromend = player.position()
   6219                 vumetermessage('shot end position set to: '+ str(trimfromend))
   6220                 player.pause()
   6221                 if sound == False:
   6222                     playerAudio.pause()
   6223                 time.sleep(0.5)
   6224                 player.play()
   6225                 if sound == False:
   6226                     playerAudio.play()
   6227         elif pressed == 'middle':
   6228             time.sleep(0.2)
   6229             if menu[selected] == 'BACK' or player.playback_status() == "Stopped" or pressed == 'record':
   6230                 try:
   6231                     if video == True:
   6232                         #player.stop()
   6233                         #playerAudio.stop()
   6234                         player.quit()
   6235                         if sound == False:
   6236                             playerAudio.quit()
   6237                     #os.system('pkill -9 aplay') 
   6238                 except:
   6239                     #kill it if it dont stop
   6240                     print('OMG! kill dbus-daemon')
   6241                 if dub == True:
   6242                     os.system('pkill arecord')
   6243                     time.sleep(0.2)
   6244                 os.system('pkill -9 omxplayer')
   6245                 #os.system('pkill -9 dbus-daemon')
   6246                 return [trimfromstart, trimfromend], split_list
   6247             elif menu[selected] == 'REPLAY' or menu[selected] == 'REDUB':
   6248                 pause = False
   6249                 try:
   6250                     os.system('pkill aplay')
   6251                     if dub == True:
   6252                         os.system('pkill arecord')
   6253                     if video == True:
   6254                         player.pause()
   6255                         player.set_position(0)
   6256                         if sound == False:
   6257                             playerAudio.pause()
   6258                             playerAudio.set_position(0)
   6259                     if dub == True:
   6260                         p = 0
   6261                         while p < 3:
   6262                             writemessage('Dubbing in ' + str(3 - p) + 's')
   6263                             time.sleep(1)
   6264                             p+=1
   6265                     player.play()
   6266                     if sound == False:
   6267                         playerAudio.play()
   6268                     #if player_menu != 'film':
   6269                     #    playerAudio.play()
   6270                     #run_command('aplay -D plughw:0 ' + filename + '.wav &')
   6271                     if dub == True:
   6272                         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 &')
   6273                 except:
   6274                     pass
   6275                 starttime = time.time()
   6276             # check if not to close to end otherwise will throw error
   6277             elif menu[selected] == 'PAUSE':
   6278                 try:
   6279                     player.pause()
   6280                     if sound == False:
   6281                         playerAudio.pause()
   6282                     pause = True
   6283                 except:
   6284                     pass
   6285                 #try:
   6286                 #    playerAudio.pause()
   6287                 #except:
   6288                 #    pass
   6289             elif menu[selected] == 'PLAY':
   6290                 try:
   6291                     player.play()
   6292                     if sound == False:
   6293                         playerAudio.play()
   6294                     pause = False
   6295                 except:
   6296                     pass
   6297                 #try:
   6298                 #    playerAudio.play()
   6299                 #except:
   6300                 #    pass
   6301             elif menu[selected] == 'TRIM':
   6302                 selected = 1
   6303                 trim = True
   6304             elif menu[selected] == 'CANCEL':
   6305                 selected = 1
   6306                 trim = False
   6307             elif menu[selected] == 'FROM BEGINNING':
   6308                 trim = ['beginning', player.position()]
   6309                 player.quit()
   6310                 #playerAudio.quit()
   6311                 return trim, split_list
   6312             elif menu[selected] == 'FROM END':
   6313                 trim = ['end', player.position()]
   6314                 player.quit()
   6315                 if sound == False:
   6316                     playerAudio.quit()
   6317                 return trim, split_list
   6318         time.sleep(0.02)
   6319         if pause == False:
   6320             try:
   6321                 t = player.position()
   6322             except:
   6323                 os.system('pkill aplay') 
   6324                 if dub == True:
   6325                     os.system('pkill arecord')
   6326                 player.quit()
   6327                 if sound == False:
   6328                     playerAudio.quit()
   6329                 return [trimfromstart, trimfromend], split_list
   6330                 #return remove_shots
   6331         if t > (clipduration - 0.3):
   6332             os.system('pkill aplay') 
   6333             if dub == True:
   6334                 os.system('pkill arecord')
   6335             player.quit()
   6336             if sound == False:
   6337                 playerAudio.quit()
   6338             return [trimfromstart, trimfromend], split_list
   6339     try:
   6340         player.quit()
   6341         if sound == False:
   6342             playerAudio.quit()
   6343     except:
   6344         pass
   6345     return [trimfromstart, trimfromend], split_list
   6346     #playerAudio.quit()
   6347     #os.system('pkill dbus-daemon')
   6348 
   6349 #---------------View Film--------------------
   6350 
   6351 def viewfilm(filmfolder, filmname):
   6352     scenes, shots, takes = countlast(filmname, filmfolder)
   6353     scene = 1
   6354     filmfiles = []
   6355     while scene <= scenes:
   6356         shots = countshots(filmname, filmfolder, scene)
   6357         if shots > 0:
   6358             filmfiles.extend(shotfiles(filmfolder, filmname, scene))
   6359         scene = scene + 1
   6360     return filmfiles
   6361 
   6362 
   6363 #--------------Save video crossfade settings-----------------
   6364 
   6365 def crossfadesave(filmfolder, s, trimfile):
   6366     #db.insert('videos', tid=datetime.datetime.now())
   6367     settings=s,trimfile
   6368     try:
   6369         with open(filmfolder + ".crossfade", "wb") as f:
   6370             pickle.dump(settings, f)
   6371             #logger.info("settings saved")
   6372     except:
   6373         logger.warning("could not save settings")
   6374         #logger.warning(e)
   6375     return
   6376 
   6377 #--------------Save video trim settings-----------------
   6378 
   6379 def videotrimsave(filmfolder, where, s, trimfile):
   6380     #db.insert('videos', tid=datetime.datetime.now())
   6381     settings=s,trimfile
   6382     try:
   6383         with open(filmfolder + "."+where, "wb") as f:
   6384             pickle.dump(settings, f)
   6385             #logger.info("settings saved")
   6386     except:
   6387         logger.warning("could not save settings")
   6388         #logger.warning(e)
   6389     return
   6390 
   6391 #--------------Save split settings-----------------
   6392 
   6393 def split_list_save(foldername, splitlist):
   6394     #db.insert('videos', tid=datetime.datetime.now())
   6395     settings=splitlist
   6396     try:
   6397         with open(foldername + ".split", "wb") as f:
   6398             pickle.dump(settings, f)
   6399             logger.info("split settings saved")
   6400     except:
   6401         logger.warning("could not save settings")
   6402         #logger.warning(e)
   6403     return
   6404 
   6405 
   6406 #---------------Video Trim--------------------
   6407 
   6408 def videotrim(filmfolder, foldername ,filename, where, s, t, make_new_take_or_shot):
   6409     global film_reso
   6410     #theres two different ways of non-rerendering mp4 cut techniques that i know MP4Box and ffmpeg
   6411     if make_new_take_or_shot == 'take':
   6412         trim_filename = foldername+filename[:-3] + str(counttakes2(foldername)+1).zfill(3)
   6413     else:
   6414         trim_filename = make_new_take_or_shot
   6415     filename=foldername+filename
   6416     if where == 'both':
   6417         s=round(s, 3)
   6418         t=round(t, 3)
   6419         video_edit_len=round(float(t)-float(s),3)
   6420         videos_totalt = db.query("SELECT COUNT(*) AS videos FROM videos")[0]
   6421         tot = int(videos_totalt.videos)
   6422         video_origins=filmfolder+'.videos/'+datetime.datetime.now().strftime('%Y%d%m')+'_'+os.urandom(8).hex()+'_'+str(tot).zfill(5)
   6423         run_command('ffmpeg -i '+filename+'.mp4 -ss '+str(s)+' -t '+str(video_edit_len)+' -c:v copy -c:a copy -y '+video_origins+'.mp4')
   6424         os.system('ln -sfr '+video_origins+'.mp4 '+trim_filename+'.mp4')
   6425         run_command('ffmpeg -i '+filename+'.wav -ss '+str(s)+' -t '+str(video_edit_len)+' -c:a copy -y '+trim_filename+'.wav')
   6426         #run_command('ecasound -i:'+filename+'.wav -o:'+trim_filename+'.wav -ss:'+str(s)+' -t:'+str(video_edit_len))
   6427         #if os.path.exists(foldername+'dub') == True:
   6428         #    dubfiles, dubmix, rerender = getdubs(foldername+'dub/', None, None, None)
   6429         #    for d in dubfiles:
   6430         #        writemessage('trimming dubs from beginning and end')
   6431         #        vumetermessage(d)
   6432         #        #audiotrim(trim_filename, 'beginning', d)
   6433         #        run_command('ecasound -i:'+d+' -o:'+d+'_temp -ss '+str(s)+' -t '+str(t))
   6434         #    writemessage('trimming original sound')
   6435     elif where == 'beginning':
   6436         logger.info('trimming clip from beginning')
   6437         #run_command('ffmpeg -ss ' + str(s) + ' -i ' + filename + '.mp4 -c copy ' + trim_filename + '.mp4')
   6438         #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
   6439         #run_command('MP4Box ' + filename + '.mp4 -splitx ' + str(s) + ':end -out ' + trim_filename +  '.mp4')
   6440         run_command('ffmpeg -i '+filename+'.mp4 -ss '+str(s)+' -c:v copy -c:a copy -y '+trim_filename+'.mp4')
   6441         run_command('cp ' + filename + '.wav ' + trim_filename + '.wav')
   6442         audiotrim(trim_filename, 'beginning','')
   6443         if os.path.exists(foldername+'dub') == True:
   6444             dubfiles, dubmix, rerender = getdubs(foldername+'dub/', None, None, None)
   6445             for d in dubfiles:
   6446                 writemessage('trimming dubs from beginning')
   6447                 vumetermessage(d)
   6448                 audiotrim(trim_filename, 'beginning', d)
   6449             writemessage('trimming original sound')
   6450             audiotrim(trim_filename, 'beginning', foldername+'dub/original.wav')
   6451     elif where == 'end':
   6452         logger.info('trimming clip from end')
   6453         #run_command('ffmpeg -to ' + str(s) + ' -i ' + filename + '.mp4 -c copy ' + trim_filename + '.mp4')
   6454         #run_command('MP4Box ' + filename + '.mp4 -splitx 0:' + str(s) + ' -out ' + trim_filename + '.mp4')
   6455         run_command('ffmpeg -i '+filename+'.mp4 -t '+str(s)+' -c:v copy -c:a copy -y '+trim_filename+'.mp4')
   6456         run_command('cp ' + filename + '.wav ' + trim_filename + '.wav')
   6457         audiotrim(trim_filename, 'end','')
   6458         if os.path.exists(foldername+'dub') == True:
   6459             dubfiles, dubmix, rerender = getdubs(foldername+'dub/', None, None, None)
   6460             for d in dubfiles:
   6461                 writemessage('trimming dubs from end')
   6462                 vumetermessage(d)
   6463                 audiotrim(trim_filename, 'end', d)
   6464             writemessage('trimming original sound')
   6465             audiotrim(trim_filename, 'end', foldername+'dub/original.wav')
   6466     #take last frame 
   6467     if film_reso == '1920x1080':
   6468         run_command('ffmpeg -y -sseof -1 -i ' + trim_filename + '.mp4 -update 1 -q:v 1 -vf scale=800:450 ' + trim_filename + '.jpeg')
   6469     elif film_reso == '1920x816':
   6470         run_command('ffmpeg -y -sseof -1 -i ' + trim_filename + '.mp4 -update 1 -q:v 1 -vf scale=800:340 ' + trim_filename + '.jpeg')
   6471     return
   6472 
   6473 #---------------Video Trim From start and end--------------------
   6474 
   6475 def fastvideotrim(filename, trim_filename, beginning, end):
   6476     #theres two different ways of non-rerendering mp4 cut techniques that i know MP4Box and ffmpeg
   6477     logger.info('trimming clip from beginning and end')
   6478     #run_command('ffmpeg -to ' + str(s) + ' -i ' + filename + '.mp4 -c copy ' + trim_filename + '.mp4')
   6479     run_command('MP4Box ' + filename + '.mp4 -splitx '+ str(beginning)+ ':' + str(end) + ' -out ' + trim_filename + '.mp4')
   6480     run_command('cp ' + filename + '.wav ' + trim_filename + '.wav')
   6481     fastaudiotrim(trim_filename, beginning, end)
   6482     #take last frame 
   6483     run_command('ffmpeg -sseof -1 -i ' + trim_filename + '.mp4 -update 1 -q:v 1 -vf scale=800:450 ' + trim_filename + '.jpeg')
   6484     return
   6485 
   6486 #--------------Get Audio cards--------------
   6487 def getaudiocards():
   6488     with open("/proc/asound/cards") as fp:
   6489         cards = fp.readlines()
   6490     audiocards = []
   6491     for i in cards:
   6492         if i[1] in ['0','1','2','3']:
   6493             print('audio card 0: ' + i[22:].rstrip('\n'))
   6494             audiocards.append(i[22:].rstrip('\n'))
   6495     return audiocards
   6496 
   6497 #--------------Fast Audio Trim--------------------
   6498 # make audio file same length as video file
   6499 def fastaudiotrim(filename, beginning, end):
   6500     run_command('sox -V0 ' + filename + '.wav ' + filename + '_temp.wav trim ' + beginning + ' ' + end)
   6501     run_command('sox -V0 -G ' + filename + '_temp.wav ' + filename + '.wav fade 0.01 0 0.01')
   6502 
   6503 #--------------Audio Trim--------------------
   6504 # make audio file same length as video file
   6505 def audiotrim(filename, where, dub):
   6506     global channels, fps
   6507     videofile=filename
   6508     audiosync=0
   6509     print("chaaaaaaaaaaaaaaaanel8: " +str(channels))
   6510     writemessage('Audio syncing..')
   6511     #pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + filename + '.mp4', shell=True)
   6512     #videolength = pipe.decode().strip()
   6513     videolength = get_video_length(filename+'.mp4')
   6514     print('videolength:'+str(videolength))
   6515     if dub:
   6516         #pipe = subprocess.check_output('mediainfo --Inform="Audio;%Duration%" ' + dub[:-4] + '.wav', shell=True)
   6517         #audiolength = pipe.decode().strip()
   6518         audiolength = get_audio_length(dub[:-4] + '.wav')
   6519     else:
   6520         try:
   6521             #pipe = subprocess.check_output('mediainfo --Inform="Audio;%Duration%" ' + filename + '.wav', shell=True)
   6522             #audiolength = pipe.decode().strip()
   6523             audiolength = get_audio_length(filename+'.wav')
   6524         except:
   6525             audiosilence(filename)
   6526             audiolength=videolength
   6527         #if there is no audio length
   6528     logger.info('audio is:' + str(audiolength))
   6529     #separate seconds and milliseconds
   6530     #videoms = int(videolength) % 1000
   6531     #audioms = int(audiolength) % 1000
   6532     #videos = int(videolength) / 1000
   6533     #audios = int(audiolength) / 1000
   6534     if int(audiolength) > int(videolength):
   6535         #calculate difference
   6536         audiosync = int(audiolength) - int(videolength)
   6537         newaudiolength = int(audiolength) - audiosync
   6538         logger.info('Audiofile is: ' + str(audiosync) + 'ms longer')
   6539         #trim from end or beginning and put a 0.01 in- and outfade
   6540         if where == 'end':
   6541             if dub:
   6542                 run_command('sox -V0 -b 16 ' + dub[:-4] + '.wav -c 2 ' + dub[:-4] + '_temp.wav trim 0 -' + str(int(audiosync)/1000))
   6543             else:
   6544                 run_command('sox -V0 -b 16 ' + filename + '.wav -c 2 ' + filename + '_temp.wav trim 0 -' + str(int(audiosync)/1000))
   6545         if where == 'beginning':
   6546             if dub:
   6547                 logger.info('trimming from beginning at: '+str(int(audiosync)/1000))
   6548                 run_command('sox -V0 -b 16 ' + dub[:-4] + '.wav -c 2 ' + dub[:-4] + '_temp.wav trim ' + str(int(audiosync)/1000))
   6549             else:
   6550                 logger.info('trimming from beginning at: '+str(int(audiosync)/1000))
   6551                 run_command('sox -V0 -b 16 ' + filename + '.wav -c 2 ' + filename + '_temp.wav trim ' + str(int(audiosync)/1000))
   6552         if dub:
   6553             run_command('sox -V0 -b 16 -G ' + dub[:-4] + '_temp.wav -c 2 ' + dub[:-4] + '.wav fade 0.01 0 0.01')
   6554             os.remove(dub[:-4] + '_temp.wav')
   6555         else:
   6556             run_command('sox -V0 -b 16 -G ' + filename + '_temp.wav -c 2 ' + filename + '.wav fade 0.01 0 0.01')
   6557             os.remove(filename + '_temp.wav')
   6558         #if int(audiosync) > 400:
   6559         #    writemessage('WARNING!!! VIDEO FRAMES DROPPED!')
   6560         #    vumetermessage('Consider changing to a faster microsd card.')
   6561         #    time.sleep(10)
   6562         delayerr = 'A' + str(audiosync)
   6563         print(delayerr)
   6564     elif int(audiolength) < int(videolength):
   6565         audiosync = int(videolength) - int(audiolength)
   6566         #calculate difference
   6567         #audiosyncs = videos - audios
   6568         #audiosyncms = videoms - audioms
   6569         #if audiosyncms < 0:
   6570         #    if audiosyncs > 0:
   6571         #        audiosyncs = audiosyncs - 1
   6572         #    audiosyncms = 1000 + audiosyncms
   6573         logger.info('Videofile is: ' + str(audiosync) + 'ms longer')
   6574         logger.info('Videofile is: ' + str(int(audiosync)/1000) + 's longer')
   6575         #time.sleep(2)
   6576         #make fade
   6577         #make delay file
   6578         print(str(int(audiosync)/1000))
   6579         if dub:
   6580             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))
   6581             run_command('sox -V0 -b 16 -G ' + dub[:-4] + '_temp.wav -c 2 ' + dub[:-4] + '.wav fade 0.01 0 0.01')
   6582         else:
   6583             run_command('sox -V0 -b 16 -r '+soundrate+' '+filename+'.wav -c 2 '+filename+'_temp.wav trim 0.0 pad 0 ' + str(int(audiosync)/1000))
   6584             run_command('sox -V0 -b 16 -G ' + filename + '_temp.wav -c 2 ' + filename + '.wav fade 0.01 0 0.01')
   6585         #add silence to end
   6586         #run_command('sox -V0 /dev/shm/silence.wav ' + filename + '_temp.wav')
   6587         #run_command('cp '+filename+'.wav '+filename+'_temp.wav')
   6588         #run_command('sox -V0 -G ' + filename + '_temp.wav /dev/shm/silence.wav ' + filename + '.wav')
   6589         if dub:
   6590             os.remove(dub[:-4] + '_temp.wav')
   6591         else:
   6592             os.remove(filename + '_temp.wav')
   6593         #os.remove('/dev/shm/silence.wav')
   6594         delayerr = 'V' + str(audiosync)
   6595         print(delayerr)
   6596     #print('the results:')
   6597     #if dub:
   6598     #    pipe = subprocess.check_output('mediainfo --Inform="Audio;%Duration%" ' + dub[:-4] + '.wav', shell=True)
   6599     #    audiolength = pipe.decode().strip()
   6600     #else:
   6601     #    pipe = subprocess.check_output('mediainfo --Inform="Audio;%Duration%" ' + filename + '.wav', shell=True)
   6602     #    audiolength = pipe.decode().strip()
   6603     #print('aftersyncvideo: '+str(videolength) + ' audio:'+str(audiolength))
   6604     #if int(audiolength) != int(videolength):
   6605     #    vumetermessage('SYNCING FAILED!')
   6606     #    time.sleep(10)
   6607     #os.remove('/dev/shm/' + filename + '.wav')
   6608     return float(audiosync)/1000, int(videolength), int(audiolength)
   6609     #os.system('mv audiosynced.wav ' + filename + '.wav')
   6610     #os.system('rm silence.wav')
   6611 
   6612 #--------------Audiosilence--------------------
   6613 # make an empty audio file as long as a video file
   6614 
   6615 def audiosilence(renderfilename):
   6616     global channels, soundrate
   6617     writemessage('Creating audiosilence..')
   6618     #pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + renderfilename + '.mp4', shell=True)
   6619     #videolength = pipe.decode()
   6620     logger.info('checking video length')
   6621     videolength = get_video_length(renderfilename+'.mp4')
   6622     logger.info('Video length is ' + str(videolength))
   6623     #separate seconds and milliseconds
   6624     videoms = int(videolength) % 1000
   6625     videos = int(videolength) / 1000
   6626     logger.info('Videofile is: ' + str(videos) + 's ' + str(videoms))
   6627     run_command('sox -V0 -n -b 16 -r '+soundrate+' -c 2 /dev/shm/silence.wav trim 0.0 ' + str(videos))
   6628     os.system('cp /dev/shm/silence.wav ' + renderfilename + '.wav')
   6629     os.system('rm /dev/shm/silence.wav')
   6630 
   6631 #--------------USB filmfolder-------------------
   6632 
   6633 def usbfilmfolder(dsk):
   6634     if dsk == 1:
   6635         usbmount = 1
   6636     else:
   6637         usbmount = 0
   6638     pressed = ''
   6639     buttonpressed = ''
   6640     buttontime = time.time()
   6641     holdbutton = ''
   6642     writemessage('Searching for usb storage device, middlebutton to cancel')
   6643     if os.path.exists('/dev/sda1') == True:
   6644         os.system('sudo mount -o  noatime,nodiratime,async /dev/sda1 /media/usb0')
   6645         os.system('sudo chown pi /media/usb0')
   6646         os.system('sudo echo none | sudo tee /sys/block/sda/queue/scheduler')
   6647         #os.system('sudo umount -l /media/usb0')
   6648     waiting = time.time() 
   6649     while True:
   6650         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   6651         usbconnected = os.path.ismount('/media/usb'+str(usbmount))
   6652         if pressed == 'middle' or time.time() - waiting > 8:
   6653             writemessage('canceling..')
   6654             break
   6655         time.sleep(0.02)
   6656         if usbconnected == True:
   6657             try:
   6658                 os.makedirs('/media/usb'+str(usbmount)+'/gonzopifilms/')
   6659             except:
   6660                 pass
   6661             try:
   6662                 p = subprocess.check_output('stat -f -c %T /media/usb'+str(usbmount), shell=True)
   6663                 filesystem = p.decode()
   6664                 print('filesystem info: ' + filesystem)
   6665             except:
   6666                 writemessage('Oh-no! dont know your filesystem')
   6667                 waitforanykey()
   6668             filmfolder = '/media/usb'+str(usbmount)+'/gonzopifilms/'
   6669             os.system('sudo chmod 755 /media/usb'+str(usbmount))
   6670             os.system('sudo chmod 755 '+filmfolder)
   6671             #run_command('pumount /media/usb'+str(usbmount))
   6672             writemessage('Filming to USB'+str(usbmount))
   6673             #time.sleep(1)
   6674             return filmfolder
   6675         else:
   6676             return
   6677 
   6678 #--------------Copy to USB-------------------
   6679 
   6680 def copytousb(filmfolder):
   6681     pressed = ''
   6682     buttonpressed = ''
   6683     buttontime = time.time()
   6684     holdbutton = ''
   6685     writemessage('Searching for usb storage device, middlebutton to cancel')
   6686     films = getfilms(filmfolder)
   6687     if 'usb0' in filmfolder:
   6688         usbmount = 1
   6689     else:
   6690         usbmount = 0
   6691     while True:
   6692         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   6693         usbconnected = os.path.ismount('/media/usb'+str(usbmount))
   6694         if pressed == 'middle':
   6695             writemessage('canceling..')
   6696             time.sleep(2)
   6697             break
   6698         time.sleep(0.02)
   6699         if usbconnected == True:
   6700             #Copy new files to usb device
   6701             try:
   6702                 os.makedirs('/media/usb'+str(usbmount)+'/gonzopifilms/')
   6703             except:
   6704                 pass
   6705             try:
   6706                 p = subprocess.check_output('stat -f -c %T /media/usb'+str(usbmount), shell=True)
   6707                 filesystem = p.decode()
   6708                 print('filesystem info: ' + filesystem)
   6709             except:
   6710                 writemessage('Oh-no! dont know your filesystem')
   6711                 waitforanykey()
   6712                 return
   6713             for filmname in films:
   6714                 #check filmhash
   6715                 filmname = filmname[0]
   6716                 usbpath = '/media/usb'+str(usbmount)+'/gonzopifilms/'+filmname
   6717                 usbvideopath = '/media/usb0/gonzopifilms/.videos/'
   6718                 usbfilmhash = ''
   6719                 filmhash = ''
   6720                 while True:
   6721                     if os.path.exists(usbpath) == False:
   6722                         break
   6723                     try:
   6724                         with open(filmfolder + filmname + '/.filmhash', 'r') as f:
   6725                             filmhash = f.readline().strip()
   6726                         print('filmhash is: ' + filmhash)
   6727                     except:
   6728                         print('no filmhash found!')
   6729                     try:
   6730                         with open(usbpath + '/.filmhash', 'r') as f:
   6731                             usbfilmhash = f.readline().strip()
   6732                         print('usbfilmhash is: ' + usbfilmhash)
   6733                     except:
   6734                         print('no usbfilmhash found!')
   6735                     if usbfilmhash == filmhash:
   6736                         print('same moviefilm found, updating clips...')
   6737                         break
   6738                     else:
   6739                         writemessage('Found a subsequent moviefilm...')
   6740                         print('same film exist with different filmhashes, copying to subsequent film folder')
   6741                         time.sleep(2)
   6742                         usbpath += '_new'
   6743                 try:
   6744                     os.makedirs(usbpath)
   6745                     writemessage('Copying film ' + filmname + '...')
   6746                 except:
   6747                     writemessage('Found existing ' + filmname + ', copying new files... ')
   6748                 try:
   6749                     run_command('rsync -avr -P ' + filmfolder + filmname + '/ ' + usbpath)
   6750                     run_command('rsync -avr -P ' + filmfolder + '.videos/ ' + usbvideopath)
   6751                 except:
   6752                     writemessage('couldnt copy film ' + filmname)
   6753                     waitforanykey()
   6754                     return
   6755             run_command('sync')
   6756             writemessage('all files copied successfully!')
   6757             waitforanykey()
   6758             run_command('pumount /media/usb'+str(usbmount))
   6759             writemessage('You can safely unplug the usb device now')
   6760             time.sleep(2)
   6761             return
   6762         else:
   6763             usbmount = usbmount + 1
   6764 
   6765 #-----------Check for the webz---------
   6766 
   6767 def webz_on():
   6768     try:
   6769         # connect to the host -- tells us if the host is actually
   6770         # reachable
   6771         socket.create_connection(("google.com", 80))
   6772         return True
   6773     except OSError:
   6774         pass
   6775     writemessage('No internet connection!')
   6776     time.sleep(2)
   6777     return False
   6778 
   6779 #-------------Upload film------------
   6780 
   6781 def uploadfilm(filename, filmname):
   6782     pressed = ''
   6783     buttonpressed = ''
   6784     buttontime = time.time()
   6785     holdbutton = ''
   6786     mods = ['Back']
   6787     settings = ['']
   6788     writemessage('Searching for upload mods')
   6789     with open(gonzopifolder + '/mods/upload-mods-enabled') as m:
   6790         mods.extend(m.read().splitlines())
   6791     for m in mods:
   6792         settings.append('')
   6793     menu = mods
   6794     selected = 0
   6795     oldmenu=''
   6796     while True:
   6797         header = 'Where do you want to upload?'
   6798         oldmenu=writemenu(menu,settings,selected,header,showmenu,oldmenu)
   6799         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   6800         if pressed == 'right':
   6801             if selected < (len(menu) - 1):
   6802                 selected = selected + 1
   6803         elif pressed == 'left':
   6804             if selected > 0:
   6805                 selected = selected - 1
   6806         elif pressed == 'middle' and  menu[selected] == 'Back':
   6807             return None
   6808         elif pressed == 'middle' and  menu[selected] in mods:
   6809             cmd = gonzopifolder + '/mods/' + menu[selected] + '.sh ' + filmname + ' ' + filename + '.mp4'
   6810             return cmd
   6811         time.sleep(0.02)
   6812 
   6813 
   6814 #-------------Streaming---------------
   6815 
   6816 def startstream(camera, stream, plughw, channels,network, udp_ip, udp_port):
   6817     #youtube
   6818     #youtube="rtmp://a.rtmp.youtube.com/live2/"
   6819     #with open("/home/pi/.youtube-live") as fp:
   6820     #    key = fp.readlines()
   6821     #print('using key: ' + key[0])
   6822     #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]
   6823     #
   6824     #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'
   6825     #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'
   6826     #numbers_only = ' ','1','2','3','4','5','6','7','8','9','0'
   6827     #newhost, hostport = newudp_ip(numbers_only, network)
   6828     #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
   6829     stream_cmd = 'ffmpeg -f h264 -r 24.989 -i - -vcodec copy -f mpegts udp://'+udp_ip+':'+udp_port
   6830     try:
   6831         stream = subprocess.Popen(stream_cmd, shell=True, stdin=subprocess.PIPE) 
   6832         camera.start_recording(stream.stdin, splitter_port=2, format='h264', bitrate = bitrate, quality=quality)
   6833     except:
   6834         stream = ''
   6835     #now = time.strftime("%Y-%m-%d-%H:%M:%S") 
   6836     return stream
   6837 
   6838 def stopstream(camera, stream):
   6839     camera.stop_recording(splitter_port=2) 
   6840     os.system('pkill -9 ffmpeg') 
   6841     print("Camera safely shut down") 
   6842     print("Good bye")
   6843     stream = ''
   6844     return stream
   6845 
   6846 def startrecording(camera, takename,bitrate, quality, profilelevel, reclength):
   6847     global film_fps
   6848     # FFmpeg command to take H.264 input from stdin and output to MP4
   6849     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']
   6850     rec_process = subprocess.Popen(ffmpeg_cmd, stdin=subprocess.PIPE)
   6851     if reclength > 1 or reclength == 0:
   6852         camera.start_recording(rec_process.stdin, format='h264', level=profilelevel, intra_period=5, bitrate = bitrate)
   6853     else:
   6854         camera.start_recording(rec_process.stdin, format='h264', level=profilelevel, intra_period=5, quality = quality, )
   6855     return rec_process, camera
   6856 
   6857 def stoprecording(camera, rec_process):
   6858     camera.stop_recording() 
   6859     # Close the FFmpeg process
   6860     time.sleep(0.5)
   6861     rec_process.stdin.close()
   6862     #rec_process.wait()
   6863     print("Recording complete!")
   6864     return rec_process, camera
   6865 
   6866 #-------------Beeps-------------------
   6867 
   6868 def beep(bus):
   6869     global gonzopifolder, plughw
   6870     if bus:
   6871         buzzerrepetitions = 100
   6872         buzzerdelay = 0.00001
   6873         for _ in range(buzzerrepetitions):
   6874             for value in [0xC, 0x4]:
   6875                 #GPIO.output(1, value)
   6876                 bus.write_byte_data(DEVICE,OLATA,value)
   6877                 time.sleep(buzzerdelay)
   6878     else:
   6879         run_command('aplay -D plughw:' + str(plughw) + ' '+ gonzopifolder + '/extras/beep.wav')
   6880     return
   6881 
   6882 def longbeep(bus):
   6883     global gonzopifolder, plughw
   6884     if bus:
   6885         buzzerrepetitions = 100
   6886         buzzerdelay = 0.0001
   6887         for _ in range(buzzerrepetitions * 5):
   6888             for value in [0xC, 0x4]:
   6889                 #GPIO.output(1, value)
   6890                 bus.write_byte_data(DEVICE,OLATA,value)
   6891                 buzzerdelay = buzzerdelay - 0.00000004
   6892                 time.sleep(buzzerdelay)
   6893         bus.write_byte_data(DEVICE,OLATA,0x4)
   6894     else:
   6895         run_command('aplay -D plughw:' + str(plughw) + ' '+ gonzopifolder + '/extras/beep_long.wav')
   6896     return
   6897 
   6898 def buzz(buzzerlength):
   6899     buzzerdelay = 0.0001
   6900     for _ in range(buzzerlength):
   6901         for value in [0xC, 0x4]:
   6902             #GPIO.output(1, value)
   6903             bus.write_byte_data(DEVICE,OLATA,value)
   6904             time.sleep(buzzerdelay)
   6905     return
   6906 
   6907 #---------reading in a lens shading table----------
   6908 
   6909 def read_table(inFile):
   6910     # q&d-way to read in ls_table.h
   6911     ls_table = []
   6912     channel  = []
   6913     with open(inFile) as file:       
   6914         for line in file:
   6915             # we skip the unimportant stuff
   6916             if not (   line.startswith("uint") \
   6917                     or line.startswith("}")):
   6918                 # the comments separate the color planes
   6919                 if line.startswith("//"):                
   6920                     channel = []
   6921                     ls_table.append(channel)
   6922                 else:
   6923                     # scan in a single line
   6924                     line = line.replace(',','')
   6925                     lineData = [int(x) for x in line.split()]
   6926                     channel.append(lineData)
   6927     return np.array(ls_table,dtype=np.uint8)    
   6928 
   6929 #-------------Check if file empty----------
   6930 
   6931 def empty(filename):
   6932     if os.path.isfile(filename + '.mp4') == False:
   6933         return False
   6934     if os.path.isfile(filename + '.mp4') == True:
   6935         writemessage('Take already exists')
   6936         time.sleep(1)
   6937         return True
   6938 
   6939 #--------------BUTTONS-------------
   6940 
   6941 def waitforanykey():
   6942     vumetermessage("press any key to continue..")
   6943     time.sleep(1)
   6944     while True:
   6945         with term.cbreak():
   6946             val = term.inkey(timeout=0)
   6947         if not val:
   6948             event = ''
   6949         elif val.is_sequence:
   6950             event = val.name
   6951         elif val:
   6952             event = val
   6953         if i2cbuttons == True:
   6954             readbus = bus.read_byte_data(DEVICE,GPIOB)
   6955             readbus2 = bus.read_byte_data(DEVICE,GPIOA)
   6956         else:
   6957             readbus = 255
   6958             readbus2 = 247
   6959         if readbus != 255 or readbus2 != 247 or event != '':
   6960             time.sleep(0.05)
   6961             vumetermessage(' ')
   6962             return
   6963 
   6964 def middlebutton():
   6965     with term.cbreak():
   6966         val = term.inkey(timeout=0)
   6967     if val.is_sequence:
   6968         event = val.name
   6969         #print(event)
   6970     elif val:
   6971         event = val
   6972         #print(event)
   6973     else:
   6974         event = ''
   6975     if i2cbuttons == True:
   6976         readbus = bus.read_byte_data(DEVICE,GPIOB)
   6977         readbus2 = bus.read_byte_data(DEVICE,GPIOA)
   6978         if readbus != 255:
   6979             print('i2cbutton pressed: ' + str(readbus))
   6980         if readbus2 != 247:
   6981             print('i2cbutton pressed: ' + str(readbus2))
   6982     else:
   6983         readbus = 255
   6984         readbus2 = 247
   6985     pressed = ''
   6986     if event == 'KEY_ENTER' or event == 10 or event == 13 or (readbus == 247 and readbus2 == 247):
   6987         pressed = 'middle'
   6988         return True
   6989     return False
   6990 
   6991 def flushbutton():
   6992     with term.cbreak():
   6993         while True:
   6994             inp = term.inkey(timeout=0)
   6995             #print('flushing ' + repr(inp))
   6996             if inp == '':
   6997                 break
   6998 
   6999 def getbutton(lastbutton, buttonpressed, buttontime, holdbutton):
   7000     global i2cbuttons, serverstate, nextstatus, process, que, gonzopictrl_ip, recording, onlysound, filmname, filmfolder, scene, shot, take, selected, camera, loadfilmsettings, selected, newfilmname, recordwithports
   7001     #Check controller
   7002     pressed = ''
   7003     nextstatus = ''
   7004     try:
   7005         if process.is_alive() == False and serverstate == 'on':
   7006             nextstatus = que.get()
   7007             if "*" in nextstatus:
   7008                 gonzopictrl_ip = nextstatus.split('*')[1]
   7009                 nextstatus = nextstatus.split('*')[0]
   7010                 print('gonzopictrl ip:' + gonzopictrl_ip)
   7011             process = Process(target=listenforclients, args=("0.0.0.0", port, que))
   7012             process.start()
   7013             if 'SELECTED' in nextstatus:
   7014                 try:
   7015                     selected=int(nextstatus.split(':')[1])
   7016                 except:
   7017                     print('wtf?')
   7018             if nextstatus=="PICTURE":
   7019                 pressed="picture"
   7020             elif nextstatus=="UP":
   7021                 pressed="up"
   7022             elif nextstatus=="DOWN":
   7023                 pressed="down"
   7024             elif nextstatus=="LEFT":
   7025                 pressed="left"
   7026             elif nextstatus=="RIGHT":
   7027                 pressed="right"
   7028             elif nextstatus=="VIEW":
   7029                 pressed="view"
   7030             elif nextstatus=="MIDDLE":
   7031                 pressed="middle"
   7032             elif nextstatus=="DELETE":
   7033                 pressed="remove"
   7034             elif nextstatus=="RECORD":
   7035                 pressed="record"
   7036             elif nextstatus=="REC":
   7037                 pressed="record_now"
   7038             elif nextstatus=="STOP":
   7039                 if recording == True:
   7040                     pressed="record"
   7041             elif nextstatus=="STOPRETAKE":
   7042                 if recording == True:
   7043                     pressed="retake"
   7044             elif nextstatus=="RECSOUND":
   7045                 if recording==False:
   7046                     pressed="record"
   7047                     onlysound=True
   7048             elif nextstatus=="PLACEHOLDER":
   7049                 pressed="insert_shot"
   7050             elif nextstatus=="TAKEPLACEHOLDER":
   7051                 pressed="insert_take"
   7052             elif nextstatus=="NEWSCENE":
   7053                 pressed="new_scene"
   7054             elif "NEWFILM:" in nextstatus:
   7055                 newfilmname = nextstatus.split(':')[1]
   7056                 pressed="new_film"
   7057             elif "SYNCIP:" in nextstatus:
   7058                 pressed=nextstatus
   7059             elif "SYNCDONE" in nextstatus:
   7060                 pressed=nextstatus
   7061             elif "RETAKE" in nextstatus:
   7062                 if recordwithports == True:
   7063                     pressed="retake_now"
   7064                 else:
   7065                     pressed="retake"
   7066             elif "RETAKE:" in nextstatus:
   7067                 pressed=nextstatus
   7068             elif "SCENE:" in nextstatus:
   7069                 pressed=nextstatus
   7070             elif "SHOT:" in nextstatus:
   7071                 pressed=nextstatus
   7072             elif "REMOVE:" in nextstatus:
   7073                 pressed=nextstatus
   7074             elif "Q:" in nextstatus:
   7075                 pressed=nextstatus
   7076             elif "CAMERA:" in nextstatus:
   7077                 pressed=nextstatus
   7078             elif "move" in nextstatus:
   7079                 pressed=nextstatus
   7080             elif "copy" in nextstatus:
   7081                 pressed=nextstatus
   7082             elif "paste" in nextstatus:
   7083                 pressed="insert"
   7084             elif "MAKEPLACEHOLDERS:" in nextstatus:
   7085                 pressed=nextstatus
   7086             #print(nextstatus)
   7087     except:
   7088         #print('process not found')
   7089         pass
   7090 
   7091     with term.cbreak():
   7092         val = term.inkey(timeout=0)
   7093     if val.is_sequence:
   7094         event = val.name
   7095         #print(event)
   7096         flushbutton()
   7097     elif val:
   7098         event = val
   7099         #print(event)
   7100         flushbutton()
   7101     else:
   7102         event = ''
   7103     keydelay = 0.08
   7104     if i2cbuttons == True:
   7105         readbus = bus.read_byte_data(DEVICE,GPIOB)
   7106         readbus2 = bus.read_byte_data(DEVICE,GPIOA)
   7107         if readbus == 0:
   7108             readbus = 255
   7109         if readbus2 == 0:
   7110             readbus2 = 247
   7111         if readbus != 255:
   7112             print('i2cbutton readbus pressed: ' + str(readbus))
   7113         if readbus2 != 247:
   7114             print('i2cbutton readbus2 pressed: ' + str(readbus2))
   7115     else:
   7116         readbus = 255
   7117         readbus2 = 247
   7118     if buttonpressed == False:
   7119         #if event != '':
   7120         #    print(term.clear+term.home)
   7121         if event == 27:
   7122             pressed = 'quit'
   7123         elif event == 'KEY_ENTER' or event == 10 or event == 13 or (readbus == 247 and readbus2 == 247):
   7124             pressed = 'middle'
   7125         elif event == 'KEY_UP' or (readbus == 191 and readbus2 == 247):
   7126             pressed = 'up'
   7127         elif event == 'KEY_DOWN' or (readbus == 254 and readbus2 == 247):
   7128             pressed = 'down'
   7129         elif event == 'KEY_LEFT' or (readbus == 239 and readbus2 == 247):
   7130             pressed = 'left'
   7131         elif event == 'KEY_RIGHT' or (readbus == 251 and readbus2 == 247):
   7132             pressed = 'right'
   7133         elif event == 'KEY_PGUP' or event == ' ' or (readbus == 127 and readbus2 == 247):
   7134             pressed = 'record'
   7135         elif event == 'KEY_PGDOWN' or (readbus == 253 and readbus2 == 247):
   7136             pressed = 'retake'
   7137         elif event == 'KEY_TAB' or (readbus == 223 and readbus2 == 247): 
   7138             pressed = 'view'
   7139         elif event == 'KEY_DELETE' or readbus2 == 246:
   7140             pressed = 'remove'
   7141         elif event == 'KEY_BACKSPACE':
   7142             pressed = 'remove'
   7143         elif event == 'N' or (readbus2 == 245 and readbus == 254):
   7144             pressed = 'peak'
   7145         elif event == 'S' or (readbus2 == 244):
   7146             pressed = 'screen'
   7147         elif event == 'P' or (readbus2 == 245 and readbus == 127):
   7148             pressed = 'insert'
   7149         elif event == 'D' or (readbus2 == 245 and readbus == 251):
   7150             pressed = 'dub'
   7151         elif event == 'O' or (readbus2 == 245 and readbus == 239):
   7152             pressed = 'changemode'
   7153         elif event == 'H' or (readbus2 == 245 and readbus == 191):
   7154             pressed = 'showhelp'
   7155         elif event == 'A' or (readbus2 == 245 and readbus == 253):
   7156             pressed = 'showmenu'
   7157         elif event == 'C' or (readbus2 == 245 and readbus == 223):
   7158             pressed = 'copy'
   7159         elif event == 'M' or (readbus2 == 245 and readbus == 247):
   7160             pressed = 'move'
   7161         elif event == '|' or (readbus2 == 245 and readbus == 251):
   7162             pressed = 'split'
   7163         #elif readbus2 == 247:
   7164         #    pressed = 'shutdown'
   7165         #if pressed != '':
   7166             #print(pressed)
   7167         buttontime = time.time()
   7168         holdbutton = pressed
   7169         buttonpressed = True
   7170     if readbus == 255 and event == '' and nextstatus == '' :
   7171         buttonpressed = False
   7172     if float(time.time() - buttontime) > 0.2 and buttonpressed == True:
   7173         if holdbutton == 'up' or holdbutton == 'down' or holdbutton == 'right' or holdbutton == 'left' or holdbutton == 'shutdown' or holdbutton == 'remove':
   7174             pressed = holdbutton
   7175             keydelay = 0.1
   7176     if time.time() - buttontime > 2 and buttonpressed == True:
   7177         keydelay = 0.08
   7178     if time.time() - buttontime > 6 and buttonpressed == True:
   7179         keydelay = 0.05
   7180     if time.time() - buttontime > 8 and buttonpressed == True:
   7181         keydelay = 0.01
   7182     if time.time() - buttontime > 10 and buttonpressed == True:
   7183         keydelay = 0.01
   7184     return pressed, buttonpressed, buttontime, holdbutton, event, keydelay
   7185 
   7186 def startinterface():
   7187     call([gonzopifolder+'/startinterface.sh &'], shell = True)
   7188 
   7189 def stopinterface(camera):
   7190     try:
   7191         camera.stop_preview()
   7192         camera.close()
   7193     except:
   7194         print('no camera to close')
   7195     os.system('pkill arecord')
   7196     os.system('pkill startinterface')
   7197     os.system('pkill tarinagui')
   7198     os.system('sudo pkill -9 -f gonzopi_menu.py')
   7199     #run_command('sudo systemctl stop apache2')
   7200     return camera
   7201 
   7202 def startcamera(lens, fps):
   7203     global camera_model, fps_selection, fps_selected, cammode, film_fps, film_reso
   7204     camera = picamera.PiCamera()
   7205     camera.video_stabilization=True
   7206     if cammode == 'film':
   7207         if film_reso=='1920x1080':
   7208             reso=(1920,1080)
   7209         elif film_reso=='1920x816':
   7210             reso=(1920,816)
   7211         elif film_reso=='1280x720':
   7212             reso=(1280,720)
   7213     elif cammode == 'picture':
   7214         reso=(4056,3040)
   7215     camera.resolution = reso #tested modes 1920x816, 1296x552/578, v2 1640x698, 1640x1232, hqbinned 2028x1080, full 4056x3040
   7216     #Background image
   7217     underlay = None
   7218     bakgimg = gonzopifolder + '/extras/bakg.jpg'
   7219     displaybakg(camera, bakgimg, underlay, 2)
   7220     #lensshade = ''
   7221     #npzfile = np.load('lenses/' + lens)
   7222     #lensshade = npzfile['lens_shading_table']
   7223     #
   7224     #camera frame rate sync to audio clock
   7225     #
   7226     camera_model, camera_revision , filmfolder = getconfig(camera)
   7227     if os.path.isdir(filmfolder) == False:
   7228         os.makedirs(filmfolder)
   7229     # v1 = 'ov5647'
   7230     # v2 = ? 
   7231     logger.info("picamera version is: " + camera_model + ' ' + camera_revision)
   7232     if camera_model == 'imx219':
   7233         #table = read_table('lenses/' + lens)
   7234         #camera.lens_shading_table = table
   7235         camera.framerate = 24.97
   7236     elif camera_model == 'ov5647':
   7237         #table = read_table('lenses/' + lens)
   7238         camera.lens_shading_table = table
   7239         # Different versions of ov5647 with different clock speeds, need to make a config file
   7240         # if there's more frames then the video will be longer when converting it to 25 fps,
   7241         # I try to get it as perfect as possible with trial and error.
   7242         # ov5647 Rev C
   7243         if camera_revision == 'rev.C': 
   7244             #camera.framerate = 26.03
   7245             fps_selection=[5,8,10,11,12,13,14,15,26.03,35,49]
   7246             fps=fps_selection[fps_selected]
   7247             camera.framerate = fps 
   7248         # ov5647 Rev D"
   7249         if camera_revision == 'rev.D':
   7250             #camera.framerate = 23.15
   7251             fps_selection=[5,8,10,11,12,13,14,15,23.15,35,49]
   7252             fps=fps_selection[fps_selected]
   7253             camera.framerate = fps 
   7254     elif camera_model == 'imx477':
   7255         if film_fps == 25:
   7256             #fps_selection=[5,15,24.985,35,49]
   7257             #if sound is gettin before pic add 0.001
   7258             fps_selection=[5,8,10,11,12,13,14,15,24.989,35,49]
   7259             fps=fps_selection[fps_selected]
   7260             camera.framerate = fps 
   7261         elif film_fps == 24:
   7262             fps_selection=[5,8,10,11,12,13,14,15,23.9894,35,49]
   7263             fps=fps_selection[fps_selected]
   7264             camera.framerate = fps 
   7265         elif film_fps == 30:
   7266             fps_selection=[5,8,10,11,12,13,14,15,29.9868,35,49]
   7267             fps=fps_selection[fps_selected]
   7268             camera.framerate = fps 
   7269     else:
   7270         camera.framerate = fps
   7271     camera.crop = (0, 0, 1.0, 1.0)
   7272     #stabilization does not work in firmware
   7273     #camera.video_stabilization = True
   7274     camera.led = False
   7275     #lens_shading_table = np.zeros(camera._lens_shading_table_shape(), dtype=np.uint8) + 32
   7276     #camera.lens_shading_table = lens_shading_table
   7277     camera.start_preview()
   7278     camera.awb_mode = 'auto'
   7279     time.sleep(1)
   7280     return camera
   7281 
   7282 def gonzopiserver(state):
   7283     #Gonzopi server
   7284     if state == True:
   7285         #Try to run apache
   7286         try:
   7287             run_command('sudo systemctl start apache2')
   7288             os.system("sudo ln -sf -t "+gonzopifolder+"/srv/static/ " + filmfolder)
   7289             os.system("sudo chown -h www-data "+gonzopifolder+"/srv/static/gonzopifilms")
   7290             return 'on'
   7291         except:
   7292             os.system("sudo chown -h pi "+gonzopifolder+"/srv/static/gonzopifilms")
   7293             writemessage("could not run gonzopi server")
   7294             time.sleep(2)
   7295             return 'off'
   7296     if state == False:
   7297         run_command('sudo systemctl stop apache2')
   7298         return 'off'
   7299 
   7300 if __name__ == '__main__':
   7301     import sys
   7302     try:
   7303         main()
   7304     except:
   7305         os.system('pkill arecord')
   7306         os.system('pkill startinterface')
   7307         os.system('pkill tarinagui')
   7308         os.system('sudo pkill -9 -f gonzopi_menu.py')
   7309         print('Unexpected error : ', sys.exc_info()[0], sys.exc_info()[1])