gonzopi

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

gonzopi.py (355189B)


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