gonzopi

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

gonzopi.py (368982B)


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