gonzopi

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

gonzopi.py (373358B)


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