gonzopi

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

gonzopi.py (373987B)


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