gonzopi

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

gonzopi.py (297919B)


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