gonzopi

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

gonzopi.py (363848B)


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