gonzopi

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

gonzopi.py (375920B)


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