gonzopi

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

gonzopi.py (374156B)


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