gonzopi

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

gonzopi.py (325054B)


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