gonzopi

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

gonzopi.py (355346B)


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