tarina

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

tarina.py (186195B)


      1 #!/usr/bin/env python3
      2 # -*- coding: utf-8 -*-
      3 
      4 
      5 #   ````````  ``````  ```````  ```  ```` ```  ``````  
      6 #   `  ``` `  `` ```  ```  ``` ```  ````  ``  `` ```  
      7 #      ```   ```````  ``` ```` ```  ````````  ``````  
      8 #      ```   ``   ``  ``````   ```  `` ````` ```  ``  
      9 #      ```  ```   ``` ```  ``` ``` ```  ```` ```  ``` 
     10 #     ````   ``` ```` ```  ``` ``` ````  ``` ```  ````
     11 
     12 # a Muse of Filmmaking
     13 # https://tarina.org
     14 
     15 import picamerax as picamera
     16 import numpy as np
     17 import string
     18 import os
     19 import time
     20 import datetime
     21 import multiprocessing as mp
     22 from subprocess import call
     23 from subprocess import Popen
     24 from omxplayer import OMXPlayer
     25 from multiprocessing import Process, Queue
     26 import subprocess
     27 import sys
     28 import pickle
     29 import RPi.GPIO as GPIO
     30 from PIL import Image
     31 import socket
     32 import configparser
     33 import shortuuid
     34 import smbus
     35 import ifaddr
     36 import web
     37 
     38 #import shlex
     39 from blessed import Terminal
     40 
     41 # bless the code!
     42 term = Terminal()
     43 
     44 #DEBIAN VERSION
     45 pipe = subprocess.check_output('lsb_release -c -s', shell=True)
     46 debianversion = pipe.decode().strip()
     47 print('running debian ' + debianversion)
     48 
     49 #I2CBUTTONS
     50 probei2c = 0
     51 while probei2c < 10:
     52     try:
     53         if debianversion == "stretch":
     54             os.system('sudo modprobe i2c-dev')
     55             bus = smbus.SMBus(3) # Rev 2 Pi uses 1
     56         else:
     57             os.system('sudo modprobe i2c-dev')
     58             bus = smbus.SMBus(11) # Rev 2 Pi uses 1
     59         DEVICE = 0x20 # Device address (A0-A2)
     60         IODIRB = 0x0d # Pin pullups B-side
     61         IODIRA = 0x00 # Pin pullups A-side 0x0c
     62         IODIRApullup = 0x0c # Pin pullups A-side 0x0c
     63         GPIOB  = 0x13 # Register B-side for inputs
     64         GPIOA  = 0x12 # Register A-side for inputs
     65         OLATA  = 0x14 # Register for outputs
     66         bus.write_byte_data(DEVICE,IODIRB,0xFF) # set all gpiob to input
     67         bus.write_byte_data(DEVICE,IODIRApullup,0xF3) # set two pullup inputs and two outputs 
     68         bus.write_byte_data(DEVICE,IODIRA,0xF3) # set two inputs and two outputs 
     69         bus.write_byte_data(DEVICE,OLATA,0x4)
     70         print("yes, found em i2c buttons!")
     71         i2cbuttons = True
     72         break
     73     except:
     74         print("could not find i2c buttons!! running in keyboard only mode")
     75         print("trying again...")
     76         i2cbuttons = False
     77         probei2c += 1
     78         time.sleep(1)
     79 
     80 #MAIN
     81 def main():
     82     global headphoneslevel, miclevel, tarinafolder, screen, loadfilmsettings, plughw, channels, filmfolder, scene, showmenu, rendermenu, quality, profilelevel, i2cbuttons, menudone, soundrate, soundformat, process, serverstate, que, port, recording, onlysound, camera_model, fps_selection, fps_selected, fps, db, selected, cammode, newfilmname, camera_recording
     83     # Get path of the current dir, then use it as working directory:
     84     rundir = os.path.dirname(__file__)
     85     if rundir != '':
     86         os.chdir(rundir)
     87     filmfolder = "/home/pi/Videos/"
     88     picfolder = "/home/pi/Pictures/"
     89     if os.path.isdir(filmfolder) == False:
     90         os.makedirs(filmfolder)
     91     tarinafolder = os.getcwd()
     92 
     93     #MENUS
     94     standardmenu = 'FILM:', 'SCENE:', 'SHOT:', 'TAKE:', '', 'SHUTTER:', 'ISO:', 'RED:', 'BLUE:', 'FPS:', 'Q:', 'BRIGHT:', 'CONT:', 'SAT:', 'FLIP:', 'BEEP:', 'LENGTH:', 'HW:', 'CH:', 'MIC:', 'PHONES:', 'COMP:', 'TIMELAPSE', 'MODE:', 'DSK:', 'SHUTDOWN', 'SRV:', 'SEARCH:', 'WIFI:', 'UPDATE', 'UPLOAD', 'BACKUP', 'LOAD', 'NEW', 'TITLE', 'LIVE:'
     95     tarinactrlmenu = "BACK","Add CAMERA","New FILM","Sync FILM","New SCENE","TARINACTRL","Sync SCENE","Stop","Retake","Search","Snapshot"
     96     emptymenu='','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',''
     97     menu = standardmenu
     98     showtarinactrl = False
     99     recordwithports = False
    100     pressagain = ''
    101     #STANDARD VALUES (some of these may not be needed, should do some clean up)
    102     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'
    103     numbers_only = '1','2','3','4','5','6','7','8','9','0'
    104     keydelay = 0.0555
    105     selectedaction = 0
    106     selected = 0
    107     awb = 'auto', 'sunlight', 'cloudy', 'shade', 'tungsten', 'fluorescent', 'incandescent', 'flash', 'horizon'
    108     awbx = 0
    109     awb_lock = 'no'
    110     cammode = 'film'
    111     camera_model=''
    112     fps = 25
    113     fps_selected=2
    114     quality = 27
    115     profilelevel='4.2'
    116     headphoneslevel = 40
    117     miclevel = 50
    118     soundformat = 'S16_LE'
    119     soundrate = '48000'
    120     recording = False
    121     retake = False
    122     lastmenu = ''
    123     menudone = ''
    124     rendermenu = True
    125     showmenu = 1
    126     showmenu_settings = True
    127     overlay = None
    128     underlay = None
    129     reclenght = 0
    130     t = 0
    131     rectime = ''
    132     scene = 1
    133     shot = 1
    134     take = 1
    135     pic = 1
    136     onlysound=False
    137     filmname = 'onthefloor'
    138     newfilmname = ''
    139     beeps = 0
    140     beepcountdown = 0
    141     beeping = False
    142     backlight = True
    143     lastbeep = time.time()
    144     flip = 'no'
    145     between = 30
    146     duration = 0.2
    147     lenses = os.listdir('lenses/')
    148     lens = lenses[0]
    149     buttontime = time.time()
    150     pressed = ''
    151     buttonpressed = False
    152     holdbutton = ''
    153     updatethumb = False
    154     loadfilmsettings = True
    155     oldsettings = ''
    156     comp = 0
    157     yankedscene = ''
    158     cuttedscene = ''
    159     cuttedshot = ''
    160     yankedshot = ''
    161     stream = ''
    162     live = 'no'
    163     plughw = 0 #default audio device
    164     channels = 1 #default mono
    165     #SAVE SETTINGS FREQUENCY IN SECS
    166     pausetime = time.time()
    167     savesettingsevery = 5
    168     #TARINA VERSION
    169     f = open(tarinafolder + '/VERSION')
    170     tarinaversion = f.readline()
    171     tarinavername = f.readline()
    172 
    173     db=''
    174 
    175     #SYSTEM CONFIGS (turn off hdmi)
    176     run_command('tvservice -o')
    177     #Kernel page cache optimization for sd card
    178     run_command('sudo ' + tarinafolder + '/extras/sdcardhack.sh')
    179     #Make screen shut off work and run full brightness
    180     run_command('gpio -g mode 19 pwm ')
    181     run_command('gpio -g pwm 19 1023')
    182     #COUNT DISKSPACE
    183     disk = os.statvfs(filmfolder)
    184     diskleft = str(int(disk.f_bavail * disk.f_frsize / 1024 / 1024 / 1024)) + 'Gb'
    185     #START INTERFACE
    186     startinterface()
    187     camera = startcamera(lens,fps)
    188 
    189     #LOAD FILM AND SCENE SETTINGS
    190     try:
    191         filmname = getfilms(filmfolder)[0][0]
    192     except:
    193         filmname = filmname 
    194     try:
    195         filmname_back = getfilms(filmfolder)[0][1]
    196     except:
    197         filmname_back = filmname 
    198 
    199     #THUMBNAILCHECKER
    200     oldscene = scene
    201     oldshot = shot
    202     oldtake = take
    203     #TURN ON WIFI AND TARINA SERVER
    204     serverstate = 'on'
    205     wifistate = 'on'
    206     #serverstate = tarinaserver(False)
    207     #TO_BE_OR_NOT_TO_BE 
    208     foldername = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) + '/'
    209     filename = 'take' + str(take).zfill(3)
    210     recordable = not os.path.isfile(foldername + filename + '.mp4') and not os.path.isfile(foldername + filename + '.h264')
    211     onthefloor_folder=filmfolder+'onthefloor'
    212     if os.path.isdir(onthefloor_folder) == False:
    213         os.makedirs(onthefloor_folder)
    214 
    215     #--------------Tarina Controller over socket ports --------#
    216 
    217     #TARINACTRL
    218     camerasconnected=''
    219     sleep=0.2
    220     cameras = []
    221     camerasoff =[]
    222     camselected=0
    223     newselected=0 
    224     mastersound=None
    225     camera_recording=None
    226     pingip=0
    227     searchforcameras='off'
    228     #NETWORKS
    229     networks=[]
    230     adapters = ifaddr.get_adapters()
    231     for adapter in adapters:
    232         print("IPs of network adapter " + adapter.nice_name)
    233         for ip in adapter.ips:
    234             if '::' not in ip.ip[0] and '127.0.0.1' != ip.ip:
    235                 print(ip.ip)
    236                 networks.append(ip.ip)
    237     if networks != []:
    238         network=networks[0]
    239         if network not in cameras:
    240             cameras.append(network)
    241 
    242     port = 55555
    243     que = Queue()
    244     process = Process(target=listenforclients, args=("0.0.0.0", port, que))
    245     process.start()
    246     nextstatus = ''
    247 
    248     serverstate_old='off'
    249     wifistate_old='off'
    250 
    251     camera_model, camera_revision = getconfig(camera)
    252 
    253     #--------------MAIN LOOP---------------#
    254     while True:
    255         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
    256         if pressagain != '':
    257             pressed = pressagain
    258             pressagain = ''
    259         if buttonpressed == True:
    260             flushbutton()
    261         #event = screen.getch()
    262         if wifistate != wifistate_old:
    263             if wifistate == 'on':
    264                 run_command('sudo iwconfig wlan0 txpower auto')
    265             elif wifistate == 'off':
    266                 run_command('sudo iwconfig wlan0 txpower off')
    267             wifistate_old = wifistate
    268         if serverstate != serverstate_old:
    269             if serverstate == 'on':
    270                 tarinaserver(True)
    271             elif serverstate == 'off':
    272                 tarinaserver(False)
    273             serverstate_old=serverstate
    274         if recording == False:
    275             #SHUTDOWN
    276             if pressed == 'middle' and menu[selected] == 'SHUTDOWN':
    277                 writemessage('Hold on shutting down...')
    278                 time.sleep(1)
    279                 run_command('sudo shutdown -h now')
    280             #MODE
    281             elif pressed == 'changemode':
    282                 if cammode == 'film':
    283                     cammode = 'picture'
    284                     vumetermessage('changing to picture mode')
    285                 elif cammode == 'picture':
    286                     cammode = 'film'
    287                     vumetermessage('changing to film mode')
    288                 camera.stop_preview()
    289                 camera.close()
    290                 camera = startcamera(lens,fps)
    291                 loadfilmsettings = True
    292             #PICTURE
    293             elif pressed == 'picture':
    294                 if os.path.isdir(foldername) == False:
    295                     os.makedirs(foldername)
    296                 picture = foldername +'picture' + str(take).zfill(3) + '.jpeg'
    297                 run_command('touch ' + foldername + '.placeholder')
    298                 print('taking picture')
    299                 camera.capture(picture,format="jpeg",use_video_port=True) 
    300             #PEAKING
    301             elif pressed == 'peak' and recordable == True:
    302                 if shot > 1:
    303                     peakshot = shot - 1
    304                     peaktake = counttakes(filmname, filmfolder, scene, peakshot)
    305                 p_imagename = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(peakshot).zfill(3) + '/take' + str(peaktake).zfill(3) + '.jpeg'
    306                 overlay = displayimage(camera, p_imagename, overlay, 3)
    307                 while holdbutton == 'peak':
    308                     pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
    309                     #writemessage('peaking ' + str(peakshot))
    310                 overlay = removeimage(camera, overlay)
    311             #SHOWHELP
    312             elif pressed == 'showhelp':
    313                 vumetermessage('Button layout')
    314                 overlay = removeimage(camera, overlay)
    315                 overlay = displayimage(camera, tarinafolder+'/extras/buttons.png', overlay, 4)
    316                 while holdbutton == 'showhelp':
    317                     pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
    318                     vumetermessage('Button layout')
    319                 overlay = removeimage(camera, overlay)
    320                 updatethumb =  True
    321             #TIMELAPSE
    322             elif pressed == 'middle' and menu[selected] == 'TIMELAPSE':
    323                 overlay = removeimage(camera, overlay)
    324                 takes = counttakes(filmname, filmfolder, scene, shot)
    325                 if takes > 0:
    326                     shot = countshots(filmname, filmfolder, scene) + 1
    327                     take = 1
    328                 foldername = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) + '/'
    329                 filename = 'take' + str(take).zfill(3)
    330                 renderedfilename, between, duration = timelapse(beeps,camera,filmname,foldername,filename,between,duration,backlight)
    331                 if renderedfilename != '':
    332                     #render thumbnail
    333                     #writemessage('creating thumbnail')
    334                     #run_command('avconv -i ' + foldername + filename  + '.mp4 -frames 1 -vf scale=800:460 ' + foldername + filename + '.jpeg')
    335                     updatethumb =  True
    336             #VIEW SCENE
    337             elif pressed == 'view' and menu[selected] == 'SCENE:':
    338                 writemessage('Loading scene...')
    339                 organize(filmfolder, filmname)
    340                 filmfiles = shotfiles(filmfolder, filmname, scene)
    341                 if len(filmfiles) > 0:
    342                     #Check if rendered video exist
    343                     camera.stop_preview()
    344                     #renderfilename, newaudiomix = renderscene(filmfolder, filmname, scene)
    345                     renderfilename = renderfilm(filmfolder, filmname, comp, scene, True)
    346                     remove_shots = playdub(filmname,renderfilename, 'film')
    347                     if remove_shots != []:
    348                         for i in remove_shots:
    349                             remove(filmfolder, filmname, scene, i, take, 'shot')
    350                         organize(filmfolder, filmname)
    351                         updatethumb = True
    352                         #loadfilmsettings = True
    353                         time.sleep(0.5)
    354                     else:
    355                         print('nothing to remove')
    356                     camera.start_preview()
    357                 else:
    358                     vumetermessage("There's absolutely nothing in this scene! hit rec!")
    359             #VIEW FILM
    360             elif pressed == 'view' and menu[selected] == 'FILM:':
    361                 writemessage('Loading film...')
    362                 organize(filmfolder, filmname)
    363                 filmfiles = viewfilm(filmfolder, filmname)
    364                 if len(filmfiles) > 0:
    365                     camera.stop_preview()
    366                     #removeimage(camera, overlay)
    367                     renderfilename = renderfilm(filmfolder, filmname, comp, 0, True)
    368                     if renderfilename != '':
    369                         remove_shots = playdub(filmname,renderfilename, 'film')
    370                     #overlay = displayimage(camera, imagename, overlay, 3)
    371                     camera.start_preview()
    372                 else:
    373                     vumetermessage('wow, shoot first! there is zero, nada, zip footage to watch now... just hit rec!')
    374                 rendermenu = True
    375             #VIEW SHOT OR TAKE
    376             elif pressed == 'view':
    377                 writemessage('Loading clip...')
    378                 organize(filmfolder, filmname)
    379                 takes = counttakes(filmname, filmfolder, scene, shot)
    380                 if takes > 0:
    381                     removeimage(camera, overlay)
    382                     camera.stop_preview()
    383                     foldername = filmfolder + filmname + '/scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) + '/'
    384                     filename = 'take' + str(take).zfill(3)
    385                     compileshot(foldername + filename,filmfolder,filmname)
    386                     trim = playdub(filmname,foldername + filename, 'shot')
    387                     if trim:
    388                         take = counttakes(filmname, filmfolder, scene, shot)+1
    389                         trim_filename = foldername + 'take' + str(take).zfill(3)
    390                         videotrim(foldername + filename, trim_filename, trim[0], trim[1])
    391                     imagename = foldername + filename + '.jpeg'
    392                     overlay = displayimage(camera, imagename, overlay, 3)
    393                     camera.start_preview()
    394                 else:
    395                     vumetermessage('nothing here! hit rec!')
    396             #DUB SHOT
    397             elif pressed == 'middle' and menu[selected] == 'SHOT, not so fast:':
    398                 newdub = clipsettings(filmfolder, filmname, scene, shot, plughw)
    399                 if newdub:
    400                     camera.stop_preview()
    401                     renderfilename, newaudiomix = rendershot(filmfolder, filmname, scene, shot)
    402                     playdub(filmname,renderfilename, 'dub')
    403                     run_command('sox -V0 -G /dev/shm/dub.wav ' + newdub)
    404                     vumetermessage('new scene dubbing made!')
    405                     camera.start_preview()
    406                     time.sleep(1)
    407                 else:
    408                     vumetermessage('see ya around!')
    409             #DUB SCENE
    410             elif pressed == 'middle' and menu[selected] == 'SCENE:':
    411                 newdub = clipsettings(filmfolder, filmname, scene, 0, plughw)
    412                 if newdub:
    413                     camera.stop_preview()
    414                     renderfilename, newaudiomix = renderscene(filmfolder, filmname, scene)
    415                     playdub(filmname,renderfilename, 'dub')
    416                     run_command('sox -V0 -G /dev/shm/dub.wav ' + newdub)
    417                     vumetermessage('new scene dubbing made!')
    418                     camera.start_preview()
    419                     time.sleep(1)
    420                 else:
    421                     vumetermessage('see ya around!')
    422             #DUB FILM
    423             elif pressed == 'middle' and menu[selected] == 'FILM:':
    424                 newdub = clipsettings(filmfolder, filmname, 0, 0, plughw)
    425                 if newdub:
    426                     camera.stop_preview()
    427                     renderfilename = renderfilm(filmfolder, filmname, comp, 0, False)
    428                     playdub(filmname,renderfilename, 'dub')
    429                     run_command('sox -V0 -G /dev/shm/dub.wav ' + newdub)
    430                     vumetermessage('new film dubbing made!')
    431                     camera.start_preview()
    432                     time.sleep(1)
    433                 else:
    434                     vumetermessage('see ya around!')
    435             #BACKUP
    436             elif pressed == 'middle' and menu[selected] == 'BACKUP':
    437                 copytousb(filmfolder)
    438             #UPLOAD
    439             elif pressed == 'middle' and menu[selected] == 'UPLOAD':
    440                 if webz_on() == True:
    441                     filmfiles = viewfilm(filmfolder, filmname)
    442                     if len(filmfiles) > 0:
    443                         renderfilename = renderfilm(filmfolder, filmname, comp, 0, True)
    444                         cmd = uploadfilm(renderfilename, filmname)
    445                         if cmd != None:
    446                             stopinterface(camera)
    447                             try:
    448                                 run_command(cmd)
    449                             except:
    450                                 logger.warning('uploadfilm bugging')
    451                             startinterface()
    452                             camera = startcamera(lens,fps)
    453                             loadfilmsettings = True
    454                         selectedaction = 0
    455             #LOAD FILM
    456             elif pressed == 'middle' and menu[selected] == 'LOAD':
    457                 filmname = loadfilm(filmname, filmfolder)
    458                 loadfilmsettings = True
    459             #UPDATE
    460             elif pressed == 'middle' and menu[selected] == 'UPDATE':
    461                 if webz_on() == True:
    462                     stopinterface(camera)
    463                     tarinaversion, tarinavername = update(tarinaversion, tarinavername)
    464                     startinterface()
    465                     camera = startcamera(lens,fps)
    466                     loadfilmsettings = True
    467                     selectedaction = 0
    468             #WIFI
    469             elif pressed == 'middle' and menu[selected] == 'WIFI:':
    470                 stopinterface(camera)
    471                 run_command('wicd-curses')
    472                 startinterface()
    473                 camera = startcamera(lens,fps)
    474                 loadfilmsettings = True
    475             #NEW FILM
    476             elif pressed == 'middle' and menu[selected] == 'NEW' or filmname == '' or pressed == 'new_film':
    477                 filmname_exist=False
    478                 if newfilmname == '':
    479                     newfilmname = nameyourfilm(filmfolder, filmname, abc, True)
    480                 allfilm = getfilms(filmfolder)
    481                 for i in allfilm:
    482                     if i[0] == newfilmname:
    483                         filmname_exist=True
    484                 if filmname != newfilmname and filmname_exist==False:
    485                     filmname = newfilmname
    486                     os.makedirs(filmfolder + filmname)
    487                     vumetermessage('Good luck with your film ' + filmname + '!')
    488                     #make a filmhash
    489                     print('making filmhash...')
    490                     filmhash = shortuuid.uuid()
    491                     with open(filmfolder + filmname + '/.filmhash', 'w') as f:
    492                         f.write(filmhash)
    493                     updatethumb = True
    494                     rendermenu = True
    495                     scene = 1
    496                     shot = 1
    497                     take = 1
    498                     #selectedaction = 0
    499                     newfilmname = ''
    500                 else:
    501                     print(term.clear)
    502                     filmname = newfilmname
    503                     newfilmname = ''
    504                     vumetermessage('film already exist!')
    505                     logger.info('film already exist!')
    506             #EDIT FILM NAME
    507             elif pressed == 'middle' and menu[selected] == 'TITLE' or filmname == '':
    508                 newfilmname = nameyourfilm(filmfolder, filmname, abc, False)
    509                 if filmname != newfilmname:
    510                     os.system('mv ' + filmfolder + filmname + ' ' + filmfolder + newfilmname)
    511                     filmname = newfilmname
    512                     db = get_film_files(filmname,filmfolder,db)
    513                     vumetermessage('Film title changed to ' + filmname + '!')
    514                 else:
    515                     vumetermessage('')
    516             #(YANK) COPY SHOT
    517             elif pressed == 'copy' and menu[selected] == 'SHOT:' and recordable == False:
    518                 cuttedshot = ''
    519                 yankedshot = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3)
    520                 vumetermessage('Shot ' + str(shot) + ' copied! (I)nsert button to place it...')
    521                 time.sleep(1)
    522             #(YANK) COPY SCENE
    523             elif pressed == 'copy' and menu[selected] == 'SCENE:' and recordable == False:
    524                 cuttedscene = ''
    525                 yankedscene = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3)
    526                 vumetermessage('Scene ' + str(scene) + ' copied! (I)nsert button to place it...')
    527                 time.sleep(1)
    528             #(CUT) MOVE SHOT
    529             elif pressed == 'move' and menu[selected] == 'SHOT:' and recordable == False:
    530                 yankedshot = ''
    531                 cuttedshot = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3)
    532                 vumetermessage('Moving shot ' + str(shot) + ' (I)nsert button to place it...')
    533                 time.sleep(1)
    534             #(CUT) MOVE SCENE
    535             elif pressed == 'move' and menu[selected] == 'SCENE:' and recordable == False:
    536                 yankedscene = ''
    537                 cuttedscene = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3)
    538                 vumetermessage('Moving scene ' + str(scene) + ' (I)nsert button to place it...')
    539                 time.sleep(1)
    540             #PASTE SHOT and PASTE SCENE
    541             elif pressed == 'insert' and menu[selected] == 'SHOT:' and yankedshot:
    542                 vumetermessage('Pasting shot, please wait...')
    543                 pasteshot = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot-1).zfill(3) + '_yanked' 
    544                 try:
    545                     os.makedirs(filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3))
    546                 except:
    547                     pass
    548                 os.system('cp -r ' + yankedshot + ' ' + pasteshot)
    549                 add_organize(filmfolder, filmname)
    550                 updatethumb = True
    551                 scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take)
    552                 yankedshot = ''
    553                 vumetermessage('Shot pasted!')
    554                 time.sleep(1)
    555             elif pressed == 'insert' and menu[selected] == 'SCENE:' and yankedscene:
    556                 vumetermessage('Pasting scene, please wait...')
    557                 pastescene = filmfolder + filmname + '/' + 'scene' + str(scene-1).zfill(3) + '_yanked'
    558                 os.system('cp -r ' + yankedscene + ' ' + pastescene)
    559                 add_organize(filmfolder, filmname)
    560                 shot = countshots(filmname, filmfolder, scene)
    561                 updatethumb = True
    562                 scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take)
    563                 yankedscene = ''
    564                 vumetermessage('Scene pasted!')
    565                 time.sleep(1)
    566             #MOVE SHOT and MOVE SCENE
    567             elif pressed == 'insert' and menu[selected] == 'SHOT:' and cuttedshot:
    568                     vumetermessage('Moving shot, please wait...')
    569                     pasteshot = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot-1).zfill(3) + '_yanked'
    570                     try:
    571                         os.makedirs(filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3))
    572                     except:
    573                        pass
    574                     os.system('cp -r ' + cuttedshot + ' ' + pasteshot)
    575                     os.system('rm -r ' + cuttedshot + '/*')
    576                     #Remove hidden placeholder
    577                     os.system('rm ' + cuttedshot + '/.placeholder')
    578                     add_organize(filmfolder, filmname)
    579                     organize(filmfolder, filmname)
    580                     cuttedshot = ''
    581                     updatethumb = True
    582                     scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take)
    583                     vumetermessage('Shot moved!')
    584                     time.sleep(1)
    585             elif pressed == 'insert' and menu[selected] == 'SCENE:' and cuttedscene:
    586                     vumetermessage('Moving scene, please wait...')
    587                     pastescene = filmfolder + filmname + '/' + 'scene' + str(scene-1).zfill(3) + '_yanked'
    588                     os.system('cp -r ' + cuttedscene + ' ' + pastescene)
    589                     os.system('rm -r ' + cuttedscene + '/*')
    590                     os.system('rm ' + cuttedscene + '/.placeholder')
    591                     add_organize(filmfolder, filmname)
    592                     organize(filmfolder, filmname)
    593                     scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take)
    594                     shot = countshots(filmname, filmfolder, scene)
    595                     cuttedscene = ''
    596                     updatethumb = True
    597                     vumetermessage('Scene moved!')
    598                     time.sleep(1)
    599             #INSERT SHOT
    600             elif pressed == 'insert' and menu[selected] != 'SCENE:':
    601                 insertshot = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot-1).zfill(3) + '_insert'
    602                 try:
    603                     os.makedirs(insertshot)
    604                 except:
    605                     print('is there already prob')
    606                 add_organize(filmfolder, filmname)
    607                 scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take)
    608                 vumetermessage('Shot ' + str(shot) + ' inserted')
    609                 updatethumb = True
    610                 time.sleep(1)
    611             #INSERT SHOT TO LAST SHOT
    612             elif pressed == 'insert_shot':
    613                 shot = countshots(filmname, filmfolder, scene)
    614                 shot=shot+1
    615                 insertshot = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot-1).zfill(3) + '_insert'
    616                 try:
    617                     os.makedirs(insertshot)
    618                 except:
    619                     print('is there already prob')
    620                 add_organize(filmfolder, filmname)
    621                 scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take)
    622                 vumetermessage('Shot ' + str(shot) + ' inserted')
    623                 updatethumb = True
    624                 #time.sleep(1)
    625             #INSERT SCENE
    626             elif pressed == 'insert' and menu[selected] == 'SCENE:' and recordable == False:
    627                 insertscene = filmfolder + filmname + '/' + 'scene' + str(scene-1).zfill(3) + '_insert'
    628                 logger.info("inserting scene")
    629                 os.makedirs(insertscene)
    630                 add_organize(filmfolder, filmname)
    631                 take = 1
    632                 shot = 1
    633                 updatethumb = True
    634                 scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take)
    635                 vumetermessage('Scene ' + str(scene) + ' inserted')
    636                 time.sleep(1)
    637             #NEW SCENE
    638             elif pressed == 'new_scene':
    639                 scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take)
    640                 vumetermessage('got new scene')
    641                 scene=scenes+1
    642                 shot=1
    643                 take=1
    644             #HELPME
    645             elif event == 'H':
    646                 if webz_on() == True:
    647                     writemessage('Rob resolving the error now...')
    648                     try:
    649                         stopinterface(camera)
    650                         run_command('reset')
    651                         run_command('ssh -R 18888:localhost:22 tarina@tarina.org -p 13337')
    652                         startinterface()
    653                         camera = startcamera(lens,fps)
    654                         loadfilmsettings = True
    655                     except:
    656                         writemessage('sry! no rob help installed')
    657             #DEVELOP
    658             elif event == 'D':
    659                 try:
    660                     stopinterface(camera)
    661                     code.interact(local=locals())
    662                     startinterface()
    663                     camera = startcamera(lens,fps)
    664                     loadfilmsetings = True
    665                 except:
    666                     writemessage('hmm.. couldnt enter developer mode')
    667             #PICTURE
    668             elif event == 'J':
    669                 try:
    670                     stopinterface(camera)
    671                     run_command('raspistill -ISO 800 -ss 6000000 -o '+picfolder+'test'+str(pic).zfill(3)+'.jpeg')
    672                     pic = pic + 1
    673                     #os.system('scp '+picfolder/+'test.jpeg user@10.42.0.1:~/pic.jpeg')
    674                     startinterface()
    675                     camera = startcamera(lens,fps)
    676                     loadfilmsetings = True
    677                 except:
    678                     writemessage('hmm.. couldnt enter developer mode')
    679             elif pressed == 'screen':
    680                 if backlight == False:
    681                     # requires wiringpi installed
    682                     run_command('gpio -g pwm 19 1023')
    683                     backlight = True
    684                     camera.start_preview()
    685                 elif backlight == True:
    686                     run_command('gpio -g pwm 19 0')
    687                     backlight = False
    688                     camera.stop_preview()
    689             elif pressed == 'showmenu':
    690                 if showmenu == 1:
    691                     # requires wiringpi installed
    692                     showmenu = 0
    693                     showmenu_settings = False
    694                 elif showmenu == 0:
    695                     showmenu = 1
    696                     showmenu_settings = True
    697             #REMOVE
    698             #take
    699             elif pressed == 'remove' and menu[selected] == 'TAKE:':
    700                 remove(filmfolder, filmname, scene, shot, take, 'take')
    701                 organize(filmfolder, filmname)
    702                 scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take)
    703                 take = counttakes(filmname, filmfolder, scene, shot)
    704                 updatethumb = True
    705                 rendermenu = True
    706                 #loadfilmsettings = True
    707                 time.sleep(0.5)
    708             #shot
    709             elif pressed == 'remove' and menu[selected] == 'SHOT:':
    710                 remove(filmfolder, filmname, scene, shot, take, 'shot')
    711                 organize(filmfolder, filmname)
    712                 scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take)
    713                 take = counttakes(filmname, filmfolder, scene, shot)
    714                 updatethumb = True
    715                 rendermenu = True
    716                 #loadfilmsettings = True
    717                 time.sleep(0.5)
    718             #scene
    719             elif pressed == 'remove' and menu[selected] == 'SCENE:':
    720                 remove(filmfolder, filmname, scene, shot, take, 'scene')
    721                 organize(filmfolder, filmname)
    722                 scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take)
    723                 shot = countshots(filmname, filmfolder, scene)
    724                 take = counttakes(filmname, filmfolder, scene, shot)
    725                 updatethumb = True
    726                 rendermenu = True
    727                 #loadfilmsettings = True
    728                 time.sleep(0.5)
    729             #film
    730             elif pressed == 'remove' and menu[selected] == 'FILM:':
    731                 remove(filmfolder, filmname, scene, shot, take, 'film')
    732                 filmname = getfilms(filmfolder)[0][0]
    733                 if filmname == '':
    734                     filmname = nameyourfilm(filmfolder,filmname,abc, True)
    735                 else:
    736                     scene, shot, take = countlast(filmname, filmfolder)
    737                     loadfilmsettings = True
    738                     updatethumb = True
    739                     rendermenu = True
    740                     time.sleep(0.5)
    741             elif pressed == 'middle' and menu[selected] == 'BACK':
    742                 if showtarinactrl == True:
    743                     showtarinactrl = False
    744                     menu=emptymenu
    745                     selected=26
    746             elif pressed == 'middle' and menu[selected] == 'Add CAMERA':
    747                 newcamera = newcamera_ip(numbers_only, network)
    748                 if newcamera not in cameras and newcamera not in networks:
    749                     cameras.append(newcamera)
    750                     vumetermessage("New camera! "+newcamera)
    751         #SHOWTARINACTRL
    752         if recordwithports: 
    753             if pressed == 'middle' and menu[selected] == "New FILM":
    754                 newfilmname = nameyourfilm(filmfolder, filmname, abc, True)
    755                 a=0
    756                 for i in cameras:
    757                     if i not in camerasoff:
    758                         sendtocamera(i,port,'NEWFILM:'+newfilmname)
    759                     a=a+1
    760             elif pressed == "retake" or pressed == "middle" and menu[selected] == "Retake":
    761                 a=0
    762                 for i in cameras:
    763                     if i not in camerasoff:
    764                         if a == camselected:
    765                             if camera_recording == camselected:
    766                                 sendtocamera(i,port,'STOPRETAKE')
    767                                 camera_recording=None
    768                             else:
    769                                 sendtocamera(i,port,'RETAKE')
    770                                 camera_recording=camselected
    771                         else:
    772                             if camera_recording != None:
    773                                 sendtocamera(i,port,'PLACEHOLDER')
    774                     a=a+1        
    775             elif pressed == "middle" and menu[selected]=="Sync SCENE":
    776                 #for p in cameras[1:]:
    777                 #    if p not in camerasoff:
    778                 #        if camera_recording == None:
    779                 #            sendtocamera(cameras[0],port,'SYNCIP:'+p)
    780                 if camselected > 0:
    781                     #sendtocamera(cameras[0],port,'SYNCIP:'+cameras[camselected])
    782                     ip = cameras[camselected]
    783                     stopinterface(camera)
    784                     run_command('rsync -avr --update -L --progress pi@'+ip+':'+filmfolder+filmname+'/'+'scene'+str(scene).zfill(3)+' '+filmfolder+filmname+'/')
    785                     #sendtocamera(tarinactrl_ip,port,'SYNCDONE')
    786                     #run_command('scp -r '+filmfolder+filmname+'/'+'scene'+str(scene).zfill(3)+' pi@'+ip+':'+filmfolder+filmname+'/')
    787                     startinterface()
    788                     camera = startcamera(lens,fps)
    789                     loadfilmsettings = True
    790             elif pressed == "middle" and menu[selected]=='New SCENE':
    791                 a=0
    792                 for i in cameras:
    793                     if i not in camerasoff:
    794                         sendtocamera(i,port,'NEWSCENE')
    795                     a=a+1
    796             elif pressed == "record" and camera_recording != None:
    797                 if camera_recording == 0:
    798                     pressed='record_now'
    799                 else:
    800                     sendtocamera(cameras[camera_recording],port,'STOP')
    801                 camera_recording=None
    802             elif pressed == "record" and camera_recording == None:
    803                 a=0
    804                 for i in cameras:
    805                     if i not in camerasoff:
    806                         if a == camselected:
    807                             if camselected==0:
    808                                 pressed='record_now'
    809                             else:
    810                                 sendtocamera(i,port,'REC')
    811                             camera_recording=camselected
    812                         else:
    813                             if a==0:
    814                                 pressed='insert_shot'
    815                             else:
    816                                 sendtocamera(i,port,'PLACEHOLDER')
    817                         a=a+1
    818             if event == "0":
    819                 newselected = 0
    820             elif event == "1":
    821                 if len(cameras) > 1:
    822                     newselected = 1
    823             elif event == "2":
    824                 if len(cameras) > 2:
    825                     newselected = 2
    826             elif event == "3":
    827                 if len(cameras) > 3:
    828                     newselected = 3
    829             elif event == "4":
    830                 if len(cameras) > 4:
    831                     newselected = 4
    832             elif event == "-":
    833                 if cameras[camselected] not in camerasoff:
    834                     camerasoff.append(cameras[camselected])
    835             elif event == "+":
    836                 if cameras[camselected] in camerasoff:
    837                     camerasoff.remove(cameras[camselected])
    838             if camselected != newselected:
    839                 if camera_recording != None:
    840                     #change camera
    841                     a=0
    842                     for c in cameras:
    843                         if c not in camerasoff:
    844                             print(c)
    845                             if a == camselected:
    846                                 if camselected == 0:
    847                                     pressed='record_now'
    848                                     pressagain='insert_shot'
    849                                 else:
    850                                     sendtocamera(c,port,'STOP')
    851                                     time.sleep(sleep)
    852                                     sendtocamera(c,port,'PLACEHOLDER')
    853                             elif a == newselected:
    854                                 if newselected == 0:
    855                                     pressed='record_now'
    856                                 else:
    857                                     sendtocamera(c,port,'REC')
    858                                 camera_recording=newselected
    859                             else:
    860                                 if a == 0:
    861                                     pressed='insert_shot'
    862                                 else:
    863                                     sendtocamera(c,port,'PLACEHOLDER')
    864                                 #time.sleep(2)
    865                             a=a+1
    866                 camselected=newselected
    867                 vumetermessage('filming with '+camera_model +' ip:'+ network + ' '+camerasconnected+' camselected:'+str(camselected))
    868 
    869 
    870         #RECORD AND PAUSE
    871         if beepcountdown > 1:
    872             if time.time() - lastbeep  > 1:
    873                 beep()
    874                 beepcountdown -= 1
    875                 lastbeep = time.time()
    876                 logger.info('beepcountdown: ' + str(beepcountdown))
    877                 vumetermessage('Filming in ' + str(beepcountdown) + ' seconds, press record again to cancel       ')
    878         elif beepcountdown > 0:
    879             if time.time() - float(lastbeep) > 0.1:
    880                 beep()
    881                 vumetermessage('Get ready!!')
    882             if time.time() - lastbeep > 1:
    883                 longbeep()
    884                 beepcountdown = 0
    885                 pressed = 'record'
    886                 print('exhausted from all beepings')
    887         if pressed == 'record' and recordwithports==False or pressed == 'record_now' or pressed == 'retake_now' or pressed == 'retake' or reclenght != 0 and t > reclenght:
    888             overlay = removeimage(camera, overlay)
    889             if recording == False and recordable == True or recording == False and pressed == 'record_now' or recording == False and pressed == 'retake_now':
    890                 scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take) 
    891                 if pressed == "record":
    892                     #shot = shots+1
    893                     take = takes+1
    894                 elif pressed == "retake":
    895                     take = takes+1
    896                 elif pressed == 'record_now':
    897                     shot=shots+1
    898                     take=1
    899                 elif pressed == 'retake_now':
    900                     takes = counttakes(filmname, filmfolder, scene, shot)
    901                     take = takes + 1
    902                 foldername = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) + '/'
    903                 filename = 'take' + str(take).zfill(3)
    904                 if beeps > 0 and beeping == False:
    905                     beeping = True
    906                     beepcountdown = beeps
    907                 elif beepcountdown == 0:
    908                     beeping = False
    909                     if os.path.isdir(foldername) == False:
    910                         os.makedirs(foldername)
    911                     if cammode == 'film':
    912                         videos_totalt = db.query("SELECT COUNT(*) AS videos FROM videos")[0]
    913                         tot = int(videos_totalt.videos)
    914                         video_origins=datetime.datetime.now().strftime('%Y%d%m')+str(tot).zfill(5)
    915                         db.insert('videos', tid=datetime.datetime.now(), filename=filmfolder+'.videos/'+video_origins+'.mp4', foldername=foldername, filmname=filmname, scene=scene, shot=shot, take=take, audiolenght=0, videolenght=0)
    916                         os.system(tarinafolder + '/alsa-utils-1.1.3/aplay/arecord -D plughw:' + str(plughw) + ' -f '+soundformat+' -c ' + str(channels) + ' -r '+soundrate+' -vv '+ foldername + filename + '.wav &')
    917                         sound_start = time.time()
    918                         if onlysound != True:
    919                             camera.start_recording(filmfolder+ '.videos/'+video_origins+'.h264', format='h264', quality=quality, level=profilelevel)
    920                             starttime = time.time()
    921                         os.system('ln -s '+filmfolder+'.videos/'+video_origins+'.h264 '+foldername+filename+'.h264')
    922                         recording = True
    923                         showmenu = 0
    924                     if cammode == 'picture':
    925                         #picdate=datetime.datetime.now().strftime('%Y%d%m')
    926                         picture = foldername +'picture' + str(take).zfill(3) + '.jpeg'
    927                         print('taking picture')
    928                         camera.capture(picture,format="jpeg",use_video_port=True) 
    929                         run_command('touch ' + foldername + 'take' + str(take).zfill(3) + '.mp4')
    930                         basewidth = 800
    931                         img = Image.open(picture)
    932                         wpercent = (basewidth/float(img.size[0]))
    933                         hsize = int((float(img.size[1])*float(wpercent)))
    934                         img = img.resize((basewidth,hsize), Image.ANTIALIAS)
    935                         img.save(foldername+'take'+str(take).zfill(3) + '.jpeg')
    936                         vumetermessage('Great Pic taken!!')
    937                         updatethumb = True
    938                 elif beepcountdown > 0 and beeping == True:
    939                     beeping = False
    940                     beepcountdown = 0
    941                     vumetermessage('Filming was canceled!!')
    942             elif recording == True and float(time.time() - starttime) > 0.2:
    943                 #print(term.clear+term.home)
    944                 disk = os.statvfs(tarinafolder + '/')
    945                 diskleft = str(int(disk.f_bavail * disk.f_frsize / 1024 / 1024 / 1024)) + 'Gb'
    946                 recording = False
    947                 if showmenu_settings == True:
    948                     showmenu = 1
    949                 if onlysound != True:
    950                     camera.stop_recording()
    951                 os.system('pkill arecord')
    952                 soundlag=starttime-sound_start
    953                 db.update('videos', where='filename="'+filmfolder+'.videos/'+video_origins+'.mp4"', soundlag=soundlag)
    954                 #time.sleep(0.005) #get audio at least 0.1 longer
    955                 #camera.capture(foldername + filename + '.jpeg', resize=(800,341))
    956                 if onlysound != True:
    957                     try:
    958                         #camera.capture(foldername + filename + '.jpeg', resize=(800,340), use_video_port=True)
    959                         camera.capture(foldername + filename + '.jpeg', resize=(800,450), use_video_port=True)
    960                     except:
    961                         logger.warning('something wrong with camera jpeg capture')
    962                 #delayerr = audiotrim(foldername,filename)
    963                 onlysound = False
    964                 scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take)
    965                 if beeps > 0:
    966                     buzz(300)
    967                 if round(fps) != 25:
    968                     compileshot(foldername + filename,filmfolder,filmname)
    969                 #os.system('cp /dev/shm/' + filename + '.wav ' + foldername + filename + '.wav')
    970                 if beeps > 0:
    971                     buzz(150)
    972                 t = 0
    973                 rectime = ''
    974                 vumetermessage('Tarina ' + tarinaversion[:-1] + ' ' + tarinavername[:-1])
    975                 updatethumb = True
    976             #if not in last shot or take then go to it
    977             if pressed == 'record' and recordable == False:
    978                 scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take)
    979                 shot=shots+1
    980                 take=1
    981                 #take = takes
    982                 #takes = counttakes(filmname, filmfolder, scene, shot)
    983             if pressed == 'retake' and recordable == False:
    984                 #scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take)
    985                 takes = counttakes(filmname, filmfolder, scene, shot)
    986                 #take = takes
    987                 #takes = counttakes(filmname, filmfolder, scene, shot)
    988                 take = takes + 1
    989         #ENTER (auto shutter, iso, awb on/off)
    990         elif pressed == 'middle' and menu[selected] == 'SHUTTER:':
    991             if camera.shutter_speed == 0:
    992                 camera.shutter_speed = camera.exposure_speed
    993             else:
    994                 camera.shutter_speed = 0
    995         elif pressed == 'middle' and menu[selected] == 'ISO:':
    996             if camera.iso == 0:
    997                 camera.iso = 100
    998             else:
    999                 camera.iso = 0
   1000         elif pressed == 'middle' and menu[selected] == 'RED:':
   1001             if camera.awb_mode == 'auto':
   1002                 camera.awb_gains = (float(camera.awb_gains[0]), float(camera.awb_gains[1]))
   1003                 camera.awb_mode = 'off'
   1004             else:
   1005                 camera.awb_mode = 'auto'
   1006         elif pressed == 'middle' and menu[selected] == 'BLUE:':
   1007             if camera.awb_mode == 'auto':
   1008                 camera.awb_gains = (float(camera.awb_gains[0]), float(camera.awb_gains[1]))
   1009                 camera.awb_mode = 'off'
   1010             else:
   1011                 camera.awb_mode = 'auto'
   1012         elif pressed == 'middle' and menu[selected] == 'BEEP:':
   1013             beeps = 0
   1014         elif pressed == 'middle' and menu[selected] == 'LENGTH:':
   1015             reclenght = 0
   1016         elif pressed == 'middle' and menu[selected] == 'LIVE:':
   1017             if stream == '':
   1018                 stream = startstream(camera, stream, plughw, channels)
   1019                 if stream == '':
   1020                     vumetermessage('something wrong with streaming')
   1021                 else:
   1022                     live = 'yes'
   1023             else:
   1024                 stream = stopstream(camera, stream)
   1025                 live = 'no'
   1026         elif pressed == 'middle' and menu[selected] == 'BRIGHT:':
   1027             camera.brightness = 50
   1028         elif pressed == 'middle' and menu[selected] == 'CONT:':
   1029             camera.contrast = 0
   1030         elif pressed == 'middle' and menu[selected] == 'SAT:':
   1031             camera.saturation = 0
   1032         elif pressed == 'middle' and menu[selected] == 'MIC:':
   1033             miclevel  = 70
   1034         elif pressed == 'middle' and menu[selected] == 'PHONES:':
   1035             headphoneslevel = 70
   1036         elif pressed == 'middle' and menu[selected] == 'SRV:':
   1037             if showtarinactrl == False:
   1038                 menu=tarinactrlmenu
   1039                 selected=0
   1040                 showtarinactrl = True
   1041 
   1042         #UP
   1043         elif pressed == 'up':
   1044             if menu[selected] == 'FILM:':
   1045                 filmname = 'onthefloor'
   1046                 filmname_back = filmname
   1047                 filmname = loadfilm(filmname, filmfolder)
   1048                 loadfilmsettings = True
   1049             if menu[selected] == 'BRIGHT:':
   1050                 camera.brightness = min(camera.brightness + 1, 99)
   1051             elif menu[selected] == 'CONT:':
   1052                 camera.contrast = min(camera.contrast + 1, 99)
   1053             elif menu[selected] == 'SAT:':
   1054                 camera.saturation = min(camera.saturation + 1, 99)
   1055             elif menu[selected] == 'SHUTTER:':
   1056                 if camera.shutter_speed == 0:
   1057                     camera.shutter_speed = camera.exposure_speed
   1058                 if camera.shutter_speed < 5000:
   1059                     camera.shutter_speed = min(camera.shutter_speed + 50, 50000)
   1060                 else:
   1061                     camera.shutter_speed = min(camera.shutter_speed + 200, 50000)
   1062             elif menu[selected] == 'ISO:':
   1063                 camera.iso = min(camera.iso + 100, 1600)
   1064             elif menu[selected] == 'BEEP:':
   1065                 beeps = beeps + 1
   1066             elif menu[selected] == 'FLIP:':
   1067                 if flip == 'yes':
   1068                     camera.hflip = False
   1069                     camera.vflip = False
   1070                     flip = 'no'
   1071                     time.sleep(0.2)
   1072                 else:
   1073                     camera.hflip = True
   1074                     camera.vflip = True
   1075                     flip = 'yes'
   1076                     time.sleep(0.2)
   1077             elif menu[selected] == 'LENGTH:':
   1078                 reclenght = reclenght + 1
   1079                 time.sleep(0.1)
   1080             elif menu[selected] == 'MIC:':
   1081                 if miclevel < 100:
   1082                     miclevel = miclevel + 2
   1083                     run_command('amixer -c 0 sset Mic ' + str(miclevel) + '% unmute')
   1084             elif menu[selected] == 'PHONES:':
   1085                 if headphoneslevel < 100:
   1086                     headphoneslevel = headphoneslevel + 2
   1087                     run_command('amixer -c 0 sset Speaker ' + str(headphoneslevel) + '%')
   1088             elif menu[selected] == 'SCENE:' and recording == False:
   1089                 if scene <= scenes:
   1090                     scene += 1
   1091                     shot = countshots(filmname, filmfolder, scene)
   1092                     take = counttakes(filmname, filmfolder, scene, shot)
   1093                 #scene, shots, takes = browse2(filmname, filmfolder, scene, shot, take, 0, 1)
   1094                 #shot = 1
   1095             elif menu[selected] == 'SHOT:' and recording == False:
   1096                 if shot <= shots:
   1097                     shot += 1
   1098                     take = counttakes(filmname, filmfolder, scene, shot)
   1099                 #scene, shot, take = browse2(filmname, filmfolder, scene, shot, take, 1, 1)
   1100                 #takes = take
   1101             elif menu[selected] == 'TAKE:' and recording == False:
   1102                 if take <= takes:
   1103                     take += 1
   1104                 #scene, shot, take = browse2(filmname, filmfolder, scene, shot, take, 2, 1)
   1105             elif menu[selected] == 'RED:':
   1106                 camera.awb_mode = 'off'
   1107                 if float(camera.awb_gains[0]) < 7.98:
   1108                     camera.awb_gains = (round(camera.awb_gains[0],2) + 0.02, round(camera.awb_gains[1],2))
   1109             elif menu[selected] == 'BLUE:':
   1110                 camera.awb_mode = 'off'
   1111                 if float(camera.awb_gains[1]) < 7.98:
   1112                     camera.awb_gains = (round(camera.awb_gains[0],2), round(camera.awb_gains[1],2) + 0.02)
   1113             elif menu[selected] == 'SRV:':
   1114                 if serverstate == 'on':
   1115                     try:
   1116                         os.makedirs(tarinafolder+'/srv/sessions')
   1117                         os.system('chown www-data '+tarinafolder+'/srv/sessions')
   1118                     except:
   1119                         print('srv folder exist')
   1120                     serverstate = 'false'
   1121                     serverstate = tarinaserver(False)
   1122                 elif serverstate == 'off':
   1123                     serverstate = 'on'
   1124                     serverstate = tarinaserver(True)
   1125             elif menu[selected] == 'WIFI:':
   1126                 if wifistate == 'on':
   1127                     run_command('sudo iwconfig wlan0 txpower off')
   1128                     wifistate = 'off'
   1129                 elif wifistate == 'off':
   1130                     run_command('sudo iwconfig wlan0 txpower auto')
   1131                     wifistate = 'on'
   1132             elif menu[selected] == 'SEARCH:':
   1133                 if searchforcameras == 'on':
   1134                     searchforcameras = 'off'
   1135                 elif searchforcameras == 'off':
   1136                     searchforcameras = 'on'
   1137             elif menu[selected] == 'MODE:':
   1138                 if cammode == 'film':
   1139                     cammode = 'picture'
   1140                     vumetermessage('changing to picture mode')
   1141                 elif cammode == 'picture':
   1142                     cammode = 'film'
   1143                     vumetermessage('changing to film mode')
   1144                 camera.stop_preview()
   1145                 camera.close()
   1146                 camera = startcamera(lens,fps)
   1147                 loadfilmsettings = True
   1148             elif menu[selected] == 'LENS:':
   1149                 s = 0
   1150                 for a in lenses:
   1151                     if a == lens:
   1152                         selectlens = s
   1153                     s += 1
   1154                 if selectlens < len(lenses) - 1:
   1155                     selectlens += 1
   1156                 lens = os.listdir('lenses/')[selectlens]
   1157                 #npzfile = np.load('lenses/' + lens)
   1158                 #lensshade = npzfile['lens_shading_table']
   1159                 table = read_table('lenses/' + lens)
   1160                 camera.lens_shading_table = table
   1161             elif menu[selected] == 'COMP:':
   1162                 if comp < 1:
   1163                     comp += 1
   1164             elif menu[selected] == 'HW:':
   1165                 if plughw < len(getaudiocards())-1:
   1166                     plughw += 1
   1167                 vumetermessage(getaudiocards()[plughw])
   1168             elif menu[selected] == 'CH:':
   1169                 if channels == 1:
   1170                     channels = 2
   1171             elif menu[selected] == 'FPS:':
   1172                 if camera_model == 'imx477':
   1173                     if fps_selected < len(fps_selection)-1:
   1174                         fps_selected+=1
   1175                         fps_selection=[5,8,10,11,12,13,14,15,24.985,35,49]
   1176                         fps=fps_selection[fps_selected]
   1177                         camera.framerate = fps
   1178             elif menu[selected] == 'Q:':
   1179                 if quality < 39:
   1180                     quality += 1
   1181 
   1182         #LEFT
   1183         elif pressed == 'left':
   1184             if selected > 0:
   1185                 selected = selected - 1
   1186             else:
   1187                 selected = len(menu) - 1
   1188             if selected == 4:
   1189                 selected = 3
   1190         #DOWN
   1191         elif pressed == 'down':
   1192             if menu[selected] == 'FILM:':
   1193                 if filmname == 'onthefloor':
   1194                     try:
   1195                         filmname = getfilms(filmfolder)[1][0]
   1196                     except:
   1197                         filmname='onthefloor'
   1198                     filename_back = 'onthefloor'
   1199                     loadfilmsettings = True
   1200                 else:
   1201                     filmname = 'onthefloor'
   1202                     loadfilmsettings = True
   1203             elif menu[selected] == 'BRIGHT:':
   1204                 camera.brightness = max(camera.brightness - 1, 0)
   1205             elif menu[selected] == 'CONT:':
   1206                 camera.contrast = max(camera.contrast - 1, -100)
   1207             elif menu[selected] == 'SAT:':
   1208                 camera.saturation = max(camera.saturation - 1, -100)
   1209             elif menu[selected] == 'SHUTTER:':
   1210                 if camera.shutter_speed == 0:
   1211                     camera.shutter_speed = camera.exposure_speed
   1212                 if camera.shutter_speed < 5000:
   1213                     camera.shutter_speed = max(camera.shutter_speed - 50, 20)
   1214                 else:
   1215                     camera.shutter_speed = max(camera.shutter_speed - 200, 200)
   1216             elif menu[selected] == 'ISO:':
   1217                 camera.iso = max(camera.iso - 100, 100)
   1218             elif menu[selected] == 'BEEP:':
   1219                 if beeps > 0:
   1220                     beeps = beeps - 1
   1221             elif menu[selected] == 'FLIP:':
   1222                 if flip == 'yes':
   1223                     camera.hflip = False
   1224                     camera.vflip = False
   1225                     flip = 'no'
   1226                     time.sleep(0.2)
   1227                 else:
   1228                     camera.hflip = True
   1229                     camera.vflip = True
   1230                     flip = 'yes'
   1231                     time.sleep(0.2)
   1232             elif menu[selected] == 'LENGTH:':
   1233                 if reclenght > 0:
   1234                     reclenght = reclenght - 1
   1235                     time.sleep(0.1)
   1236             elif menu[selected] == 'MIC:':
   1237                 if miclevel > 0:
   1238                     miclevel = miclevel - 2
   1239                     run_command('amixer -c 0 sset Mic ' + str(miclevel) + '% unmute')
   1240             elif menu[selected] == 'PHONES:':
   1241                 if headphoneslevel > 0:
   1242                     headphoneslevel = headphoneslevel - 2
   1243                     run_command('amixer -c 0 sset Speaker ' + str(headphoneslevel) + '%')
   1244             elif menu[selected] == 'SCENE:' and recording == False:
   1245                 if scene > 1:
   1246                     scene -= 1
   1247                     shot = countshots(filmname, filmfolder, scene)
   1248                     take = counttakes(filmname, filmfolder, scene, shot)
   1249                 #scene, shots, take = browse2(filmname, filmfolder, scene, shot, take, 0, -1)
   1250                 #takes = take
   1251                 #shot = 1
   1252             elif menu[selected] == 'SHOT:' and recording == False:
   1253                 if shot > 1:
   1254                     shot -= 1
   1255                     take = counttakes(filmname, filmfolder, scene, shot)
   1256                 #scene, shot, take = browse2(filmname, filmfolder, scene, shot, take, 1, -1)
   1257                 #takes = take
   1258             elif menu[selected] == 'TAKE:' and recording == False:
   1259                 if take > 1:
   1260                     take -= 1
   1261                 #scene, shot, take = browse2(filmname, filmfolder, scene, shot, take, 2, -1)
   1262             elif menu[selected] == 'RED:':
   1263                 camera.awb_mode = 'off'
   1264                 if float(camera.awb_gains[0]) > 0.02:
   1265                     camera.awb_gains = (round(camera.awb_gains[0],2) - 0.02, round(camera.awb_gains[1],2))
   1266             elif menu[selected] == 'BLUE:':
   1267                 camera.awb_mode = 'off'
   1268                 if float(camera.awb_gains[1]) > 0.02:
   1269                     camera.awb_gains = (round(camera.awb_gains[0],2), round(camera.awb_gains[1],2) - 0.02)
   1270             elif menu[selected] == 'SRV:':
   1271                 if serverstate == 'on':
   1272                     try:
   1273                         os.makedirs(tarinafolder+'/srv/sessions')
   1274                         os.system('chown www-data '+tarinafolder+'/srv/sessions')
   1275                     except:
   1276                         print('srv folder exist')
   1277                     serverstate = tarinaserver(False)
   1278                 elif serverstate == 'off':
   1279                     serverstate = tarinaserver(True)
   1280             elif menu[selected] == 'WIFI:':
   1281                 if wifistate == 'on':
   1282                     run_command('sudo iwconfig wlan0 txpower off')
   1283                     wifistate = 'off'
   1284                 elif wifistate == 'off':
   1285                     run_command('sudo iwconfig wlan0 txpower auto')
   1286                     wifistate = 'on'
   1287             elif menu[selected] == 'SEARCH:':
   1288                 if searchforcameras == 'on':
   1289                     searchforcameras = 'off'
   1290                 elif searchforcameras == 'off':
   1291                     seaarchforcameras = 'on'
   1292             elif menu[selected] == 'MODE:':
   1293                 if cammode == 'film':
   1294                     cammode = 'picture'
   1295                     vumetermessage('changing to picture mode')
   1296                 elif cammode == 'picture':
   1297                     cammode = 'film'
   1298                     vumetermessage('changing to film mode')
   1299                 camera.stop_preview()
   1300                 camera.close()
   1301                 camera = startcamera(lens,fps)
   1302                 loadfilmsettings = True
   1303             elif menu[selected] == 'LENS:':
   1304                 s = 0
   1305                 for a in lenses:
   1306                     if a == lens:
   1307                         selectlens = s
   1308                     s += 1
   1309                 if selectlens > 0:
   1310                     selectlens -= 1
   1311                 lens = os.listdir('lenses/')[selectlens]
   1312                 #npzfile = np.load('lenses/' + lens)
   1313                 #lensshade = npzfile['lens_shading_table']
   1314                 table = read_table('lenses/' + lens)
   1315                 camera.lens_shading_table = table
   1316             elif menu[selected] == 'DUB:':
   1317                 if round(dub[0],1) == 1.0 and round(dub[1],1) > 0.0:
   1318                     dub[1] -= 0.1
   1319                 if round(dub[1],1) == 1.0 and round(dub[0],1) < 1.0:
   1320                     dub[0] += 0.1
   1321             elif menu[selected] == 'COMP:':
   1322                 if comp > 0:
   1323                     comp -= 1
   1324             elif menu[selected] == 'HW:':
   1325                 if plughw > 0:
   1326                     plughw -= 1
   1327                 vumetermessage(getaudiocards()[plughw])
   1328             elif menu[selected] == 'CH:':
   1329                 if channels == 2:
   1330                     channels = 1
   1331             elif menu[selected] == 'FPS:':
   1332                 if camera_model == 'imx477':
   1333                     if fps_selected > 0:
   1334                         fps_selected-=1
   1335                         fps_selection=[5,8,10,11,12,13,14,15,24.985,35,49]
   1336                         fps=fps_selection[fps_selected]
   1337                         camera.framerate = fps
   1338             elif menu[selected] == 'Q:':
   1339                 if quality > 10:
   1340                     quality -= 1
   1341 
   1342         #RIGHT
   1343         elif pressed == 'right':
   1344             if selected < len(menu) - 1:
   1345                 selected = selected + 1
   1346             else:
   1347                 selected = 0
   1348             if selected == 4: #jump over recording time
   1349                 selected = 5
   1350         #Start Recording Time
   1351         if recording == True:
   1352             t = time.time() - starttime
   1353             rectime = time.strftime("%H:%M:%S", time.gmtime(t))
   1354         #Load settings
   1355         if loadfilmsettings == True:
   1356             db = get_film_files(filmname,filmfolder,db)
   1357             try:
   1358                 filmsettings = loadsettings(filmfolder, filmname)
   1359                 camera.brightness = filmsettings[2]
   1360                 camera.contrast = filmsettings[3]
   1361                 camera.saturation = filmsettings[4]
   1362                 camera.shutter_speed = filmsettings[5]
   1363                 camera.iso = filmsettings[6]
   1364                 camera.awb_mode = filmsettings[7]
   1365                 camera.awb_gains = filmsettings[8]
   1366                 awb_lock = filmsettings[9]
   1367                 miclevel = filmsettings[10]
   1368                 headphoneslevel = filmsettings[11]
   1369                 beeps = filmsettings[12]
   1370                 flip = filmsettings[13]
   1371                 comp = filmsettings[14]
   1372                 between = filmsettings[15]
   1373                 duration = filmsettings[16]
   1374                 showmenu_settings = filmsettings[17]
   1375                 quality = filmsettings[18]
   1376                 #wifistate = filmsettings[19]
   1377                 #serverstate=filmsettings[20]
   1378                 plughw=filmsettings[21]
   1379                 channels=filmsettings[22]
   1380                 cammode=filmsettings[23]
   1381                 logger.info('film settings loaded & applied')
   1382                 time.sleep(0.2)
   1383             except:
   1384                 logger.warning('could not load film settings')
   1385             if flip == "yes":
   1386                 camera.vflip = True
   1387                 camera.hflip = True
   1388             run_command('amixer -c 0 sset Mic ' + str(miclevel) + '% unmute')
   1389             run_command('amixer -c 0 sset Speaker ' + str(headphoneslevel) + '%')
   1390             origin_videos=organize(filmfolder, filmname)
   1391             print('ORIGIN')
   1392             print(origin_videos)
   1393             print('total of videos: '+str(len(origin_videos)))
   1394             if not os.path.isdir(filmfolder+'.videos/'):
   1395                 os.makedirs(filmfolder+'.videos/')
   1396             allfiles = os.listdir(filmfolder+'.videos/')
   1397             print(allfiles)
   1398             print('alll')
   1399             for origin in origin_videos:
   1400                 if origin in allfiles:
   1401                     try:
   1402                         #os.remove(origin)
   1403                         print('ORIGIN VIDEO FOLDER NOT IN SYNC' + origin)
   1404                         time.sleep(5)
   1405                     except:
   1406                         print('not exist')
   1407             #organize(filmfolder,'onthefloor')
   1408             scene, shot, take = countlast(filmname, filmfolder)
   1409             loadfilmsettings = False
   1410             rendermenu = True
   1411             updatethumb =  True
   1412         if scene == 0:
   1413             scene = 1
   1414         if take == 0:
   1415             take = 1
   1416         if shot == 0:
   1417             shot = 1
   1418         # If menu at SCENE show first shot thumbnail off that scene
   1419         if menu[selected] == 'FILM:' and lastmenu != menu[selected] and recordable == False:
   1420             updatethumb = True
   1421         if menu[selected] == 'SCENE:' and lastmenu != menu[selected] and recordable == False:
   1422             updatethumb = True
   1423         if menu[selected] == 'SHOT:' and lastmenu != menu[selected] and recordable == False:
   1424             updatethumb = True
   1425         if menu[selected] == 'TAKE:' and lastmenu != menu[selected] and recordable == False:
   1426             updatethumb = True
   1427         #Check if scene, shot, or take changed and update thumbnail
   1428         if oldscene != scene or oldshot != shot or oldtake != take or updatethumb == True:
   1429             if recording == False:
   1430                 #logger.info('film:' + filmname + ' scene:' + str(scene) + '/' + str(scenes) + ' shot:' + str(shot) + '/' + str(shots) + ' take:' + str(take) + '/' + str(takes))
   1431                 foldername = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) + '/'
   1432                 filename = 'take' + str(take).zfill(3)
   1433                 recordable = not os.path.isfile(foldername + filename + '.mp4') and not os.path.isfile(foldername + filename + '.h264')
   1434                 overlay = removeimage(camera, overlay)
   1435                 if menu[selected] == 'SCENE:' and recordable == False: # display first shot of scene if browsing scenes
   1436                     p = counttakes(filmname, filmfolder, scene, 1)
   1437                     imagename = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(1).zfill(3) + '/take' + str(p).zfill(3) + '.jpeg'
   1438                 #elif menu[selected] == 'FILM:' and recordable == True:
   1439                 #    scene, shot, take = countlast(filmname,filmfolder)
   1440                 #    shot += 1
   1441                 elif menu[selected] == 'FILM:' and recordable == False: # display first shot of film
   1442                     p = counttakes(filmname, filmfolder, 1, 1)
   1443                     imagename = filmfolder + filmname + '/scene' + str(1).zfill(3) + '/shot' + str(1).zfill(3) + '/take' + str(p).zfill(3) + '.jpeg'
   1444                 imagename = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/take' + str(take).zfill(3) + '.jpeg'
   1445                 overlay = displayimage(camera, imagename, overlay, 3)
   1446                 oldscene = scene
   1447                 oldshot = shot
   1448                 oldtake = take
   1449                 updatethumb = False
   1450                 scenes = countscenes(filmfolder, filmname)
   1451                 shots = countshots(filmname, filmfolder, scene)
   1452                 takes = counttakes(filmname, filmfolder, scene, shot)
   1453         #If auto dont show value show auto (impovement here to show different colors in gui, yes!!?)
   1454         if camera.iso == 0:
   1455             cameraiso = 'auto'
   1456         else:
   1457             cameraiso = str(camera.iso)
   1458         if camera.shutter_speed == 0:
   1459             camerashutter = 'auto'
   1460         else:
   1461             camerashutter = str(camera.exposure_speed).zfill(5)
   1462         if camera.awb_mode == 'auto':
   1463             camerared = 'auto'
   1464             camerablue = 'auto'
   1465         else:
   1466             camerared = str(float(camera.awb_gains[0]))[:4]
   1467             camerablue = str(float(camera.awb_gains[1]))[:4]
   1468 
   1469         #Check if menu is changed and save settings / sec
   1470         if buttonpressed == True or recording == True or rendermenu == True:
   1471             lastmenu = menu[selected]
   1472             if showtarinactrl == False:
   1473                 menu = standardmenu
   1474                 settings = filmname, str(scene) + '/' + str(scenes), str(shot) + '/' + str(shots), str(take) + '/' + str(takes), rectime, camerashutter, cameraiso, camerared, camerablue, str(round(camera.framerate)), str(quality), str(camera.brightness), str(camera.contrast), str(camera.saturation), str(flip), str(beeps), str(reclenght), str(plughw), str(channels), str(miclevel), str(headphoneslevel), str(comp), '', cammode, diskleft, '', serverstate, searchforcameras, wifistate, '', '', '', '', '', '', live
   1475             else:
   1476                 menu = tarinactrlmenu
   1477                 settings = '','','','','','','','','','','','','','',''
   1478             #Rerender menu if picamera settings change
   1479             #if settings != oldsettings or selected != oldselected:
   1480             writemenu(menu,settings,selected,'',showmenu)
   1481             rendermenu = False
   1482             #save settings if menu has been updated and x seconds passed
   1483             if recording == False:
   1484                 if time.time() - pausetime > savesettingsevery: 
   1485                     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]
   1486                     #print('saving settings')
   1487                     savesettings(settings_to_save, filmname, filmfolder)
   1488                     pausetime = time.time()
   1489                     #NETWORKS
   1490                     networks=[]
   1491                     adapters = ifaddr.get_adapters()
   1492                     for adapter in adapters:
   1493                         print("IPs of network adapter " + adapter.nice_name)
   1494                         for ip in adapter.ips:
   1495                             if '::' not in ip.ip[0] and '127.0.0.1' != ip.ip:
   1496                                 print(ip.ip)
   1497                                 networks.append(ip.ip)
   1498                     if networks != []:
   1499                         network=networks[0]
   1500                         if network not in cameras:
   1501                             cameras.append(network)
   1502                     else:
   1503                         network='not connected'
   1504                     if len(cameras) > 1:
   1505                         camerasconnected='connected '+str(len(cameras)-1)
   1506                         recordwithports=True
   1507                         vumetermessage('filming with '+camera_model +' ip:'+ network + ' '+camerasconnected+' camselected:'+str(camselected)+' rec:'+str(camera_recording))
   1508                     else:
   1509                         camerasconnected=''
   1510                         recordwithports=False
   1511                         if searchforcameras == 'on':
   1512                             camerasconnected='searching '+str(pingip)
   1513                         vumetermessage('filming with '+camera_model +' ip:'+ network + ' '+camerasconnected)
   1514                     print(term.yellow+'filming with '+camera_model +' ip:'+ network + ' '+camerasconnected)
   1515                     print(camselected,camera_recording,cameras)
   1516             #writemessage(pressed)
   1517             oldsettings = settings
   1518             oldselected = selected
   1519         #PING TARINAS
   1520         if searchforcameras == 'on':
   1521             if camera_recording == None:
   1522                 if pingip < 256:
   1523                     pingip+=1
   1524                 else:
   1525                     pingip=0
   1526                     #searchforcameras='off'
   1527                 newcamera=pingtocamera(network[:-3]+str(pingip),port,'PING')
   1528                 if newcamera != '':
   1529                     if newcamera not in cameras and newcamera not in networks:
   1530                         cameras.append(newcamera)
   1531                         vumetermessage("Found camera! "+newcamera)
   1532                 print('-~-')
   1533                 print('pinging ip: '+network[:-3]+str(pingip))
   1534             else:
   1535                 searchforcameras = 'off'
   1536         time.sleep(keydelay)
   1537 
   1538 #--------------Logger-----------------------
   1539 
   1540 class logger():
   1541     def info(info):
   1542         print(term.yellow(info))
   1543     def warning(warning):
   1544         print('Warning: ' + warning)
   1545 
   1546 #-------------get film db files---
   1547 
   1548 def get_film_files(filmname,filmfolder,db):
   1549     if not os.path.isdir(filmfolder+'.videos/'):
   1550         os.makedirs(filmfolder+'.videos/')
   1551     filmdb = filmfolder+'.videos/tarina.db'
   1552     db = web.database(dbn='sqlite', db=filmdb)
   1553     try:
   1554         videodb=db.select('videos')
   1555         return db
   1556     except:
   1557         db.query("CREATE TABLE videos (id integer PRIMARY KEY, tid DATETIME, filename TEXT, foldername TEXT, filmname TEXT, scene INT, shot INT, take INT, audiolenght FLOAT, videolenght FLOAT,soundlag FLOAT, audiosync FLOAT);")
   1558     videodb=db.select('videos')
   1559     return db
   1560 
   1561 #--------------Save settings-----------------
   1562 
   1563 def savesettings(settings, filmname, filmfolder):
   1564     #db.insert('videos', tid=datetime.datetime.now())
   1565     try:
   1566         with open(filmfolder + filmname + "/settings.p", "wb") as f:
   1567             pickle.dump(settings, f)
   1568             #logger.info("settings saved")
   1569     except:
   1570         logger.warning("could not save settings")
   1571         #logger.warning(e)
   1572     return
   1573 
   1574 #--------------Load film settings--------------
   1575 
   1576 def loadsettings(filmfolder, filmname):
   1577     try:
   1578         settings = pickle.load(open(filmfolder + filmname + "/settings.p", "rb"))
   1579         logger.info("settings loaded")
   1580         return settings
   1581     except:
   1582         logger.info("couldnt load settings")
   1583         return ''
   1584 
   1585 
   1586 ##---------------Connection----------------------------------------------
   1587 def pingtocamera(host, port, data):
   1588     print("Sending to "+host+" on port "+str(port)+" DATA:"+data)
   1589     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   1590     s.settimeout(0.05)
   1591     newcamera=''
   1592     try:
   1593         while True:
   1594             s.connect((host, port))
   1595             s.send(str.encode(data))
   1596             newcamera=host
   1597             print("Sent to server..")
   1598             break
   1599     except:
   1600         print('did not connect')
   1601     s.close()
   1602     return newcamera
   1603 
   1604 ##---------------Send to server----------------------------------------------
   1605 
   1606 def sendtocamera(host, port, data):
   1607     print("Sending to "+host+" on port "+str(port)+" DATA:"+data)
   1608     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   1609     s.settimeout(5)
   1610     try:
   1611         while True:
   1612             s.connect((host, port))
   1613             s.send(str.encode(data))
   1614             print("Sent to server..")
   1615             break
   1616     except:
   1617         print('did not connect')
   1618     s.close()
   1619 
   1620 ##---------------Send to server----------------------------------------------
   1621 
   1622 def sendtoserver(host, port, data):
   1623     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   1624     try:
   1625         while True:
   1626             print('sending data to '+host+':'+str(port))
   1627             s.connect((host, port))
   1628             s.send(str.encode(data))
   1629             s.close()
   1630             break
   1631     except:
   1632         print('sometin rong')
   1633 
   1634 ##--------------Listen for Clients-----------------------
   1635 
   1636 def listenforclients(host, port, q):
   1637     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   1638     s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
   1639     s.bind((host,port))
   1640     #s.settimeout(0.1)
   1641     try:
   1642         print("listening on port "+str(port))
   1643         s.listen(5)
   1644         c, addr = s.accept()
   1645         while True:
   1646                 data = c.recv(1024).decode()
   1647                 if not data:
   1648                     print("no data")
   1649                     break
   1650                 else:
   1651                     if addr:
   1652                         #print(addr[0],' sending back')
   1653                         #sendtoserver(addr[0],port,'rebounce'+data)
   1654                         nextstatus = data
   1655                         print("got data:"+nextstatus)
   1656                         c.close()
   1657                         q.put(nextstatus+'*'+addr[0])
   1658                         break
   1659     except:
   1660         print("somthin wrong")
   1661         q.put('')
   1662 
   1663 #--------------Write the menu layer to dispmanx--------------
   1664 
   1665 def writemenu(menu,settings,selected,header,showmenu):
   1666     global menudone, rendermenu
   1667     oldmenu=menudone
   1668     menudone = ''
   1669     menudoneprint = ''
   1670     menudone += str(selected) + '\n'
   1671     menudone += str(showmenu) + '\n'
   1672     menudone += header + '\n'
   1673     n = 0
   1674     for i, s in zip(menu, settings):
   1675         menudone += i + s + '\n'
   1676         if n == selected:
   1677             menudoneprint += i + ' : ' + s + ' <<<<<<<<< ' 
   1678         else:
   1679             menudoneprint += i + ' : ' + s + ' | '
   1680         n += 1
   1681     spaces = len(menudone) - 500
   1682     menudone += spaces * ' '
   1683     if oldmenu != menudone or rendermenu == True:
   1684         print(term.clear+term.home)
   1685         if showmenu == 0:
   1686             print(term.red+menudoneprint)
   1687         else:
   1688             print(menudoneprint)
   1689         #menudone += 'EOF'
   1690         f = open('/dev/shm/interface', 'w')
   1691         f.write(menudone)
   1692         f.close()
   1693         return menudone
   1694 
   1695 #------------Write to screen----------------
   1696 
   1697 def writemessage(message):
   1698     menudone = ""
   1699     menudone += '420' + '\n'
   1700     menudone += message + '\n'
   1701     #menudone += 'EOF'
   1702     #clear = 500
   1703     #clear = clear - len(message)
   1704     f = open('/dev/shm/interface', 'w')
   1705     f.write(menudone)
   1706     f.close()
   1707 
   1708 #------------Write to vumeter (last line)-----
   1709 
   1710 def vumetermessage(message):
   1711     clear = 72
   1712     clear = clear - len(message)
   1713     f = open('/dev/shm/vumeter', 'w')
   1714     f.write(message + clear * ' ')
   1715     f.close()
   1716 
   1717 #------------Count file size-----
   1718 
   1719 def countvideosize(filename):
   1720     size = 0
   1721     if type(filename) is list:
   1722         size = 0
   1723         for i in filename[:]:
   1724             size = size + os.stat(i + '.mp4').st_size
   1725     if type(filename) is str:
   1726         size = os.stat(filename + '.mp4').st_size
   1727     return size/1024
   1728 
   1729 def countsize(filename):
   1730     size = 0
   1731     if type(filename) is str:
   1732         size = os.stat(filename).st_size
   1733     return size/1024
   1734 
   1735 #------------Count scenes, takes and shots-----
   1736 
   1737 def countlast(filmname, filmfolder): 
   1738     scenes = 0
   1739     shots = 0
   1740     takes = 0
   1741     try:
   1742         allfiles = os.listdir(filmfolder + filmname)
   1743     except:
   1744         allfiles = []
   1745         scenes = 0
   1746     for a in allfiles:
   1747         if 'scene' in a:
   1748             scenes = scenes + 1
   1749     try:
   1750         allfiles = os.listdir(filmfolder + filmname + '/scene' + str(scenes).zfill(3))
   1751     except:
   1752         allfiles = []
   1753         shots = 0
   1754     for a in allfiles:
   1755         if 'shot' in a:
   1756             shots = shots + 1
   1757     try:
   1758         allfiles = os.listdir(filmfolder + filmname + '/scene' + str(scenes).zfill(3) + '/shot' + str(shots).zfill(3))
   1759     except:
   1760         allfiles = []
   1761         takes = 0
   1762     for a in allfiles:
   1763         if '.mp4' in a or '.h264' in a:
   1764             takes = takes + 1
   1765     return scenes, shots, takes
   1766 
   1767 #------------Count scenes--------
   1768 
   1769 def countscenes(filmfolder, filmname):
   1770     scenes = 0
   1771     try:
   1772         allfiles = os.listdir(filmfolder + filmname)
   1773     except:
   1774         allfiles = []
   1775         scenes = 0
   1776     for a in allfiles:
   1777         if 'scene' in a:
   1778             scenes = scenes + 1
   1779     return scenes
   1780 
   1781 #------------Count shots--------
   1782 
   1783 def countshots(filmname, filmfolder, scene):
   1784     shots = 0
   1785     try:
   1786         allfiles = os.listdir(filmfolder + filmname + '/scene' + str(scene).zfill(3))
   1787     except:
   1788         allfiles = []
   1789         shots = 0
   1790     for a in allfiles:
   1791         if 'shot' in a:
   1792             shots = shots + 1
   1793     return shots
   1794 
   1795 #------------Count takes--------
   1796 
   1797 def counttakes(filmname, filmfolder, scene, shot):
   1798     takes = 0
   1799     try:
   1800         allfiles = os.listdir(filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3))
   1801     except:
   1802         allfiles = []
   1803         return takes
   1804     for a in allfiles:
   1805         if '.mp4' in a or '.h264' in a:
   1806             takes = takes + 1
   1807     return takes
   1808 
   1809 #-----------Count videos on floor-----
   1810 
   1811 def countonfloor(filmname, filmfolder):
   1812     print('dsad')
   1813 
   1814 
   1815 #------------Run Command-------------
   1816 
   1817 def run_command(command_line):
   1818     #command_line_args = shlex.split(command_line)
   1819     logger.info('Running: "' + command_line + '"')
   1820     try:
   1821         p = subprocess.Popen(command_line, shell=True).wait()
   1822         # process_output is now a string, not a file,
   1823         # you may want to do:
   1824     except (OSError, CalledProcessError) as exception:
   1825         logger.warning('Exception occured: ' + str(exception))
   1826         logger.warning('Process failed')
   1827         return False
   1828     else:
   1829         # no exception was raised
   1830         logger.info('Process finished')
   1831     return True
   1832 
   1833 #-------------Display bakg-------------------
   1834 
   1835 def displaybakg(camera, filename, underlay, layer):
   1836     # Load the arbitrarily sized image
   1837     img = Image.open(filename)
   1838     # Create an image padded to the required size with
   1839     # mode 'RGB'
   1840     pad = Image.new('RGB', (
   1841         ((img.size[0] + 31) // 32) * 32,
   1842         ((img.size[1] + 15) // 16) * 16,
   1843         ))
   1844     # Paste the original image into the padded one
   1845     pad.paste(img, (0, 0))
   1846 
   1847     # Add the overlay with the padded image as the source,
   1848     # but the original image's dimensions
   1849     underlay = camera.add_overlay(pad.tobytes(), size=img.size)
   1850     # By default, the overlay is in layer 0, beneath the
   1851     # preview (which defaults to layer 2). Here we make
   1852     # the new overlay semi-transparent, then move it above
   1853     # the preview
   1854     underlay.alpha = 255
   1855     underlay.layer = layer
   1856 
   1857 #-------------Display jpeg-------------------
   1858 
   1859 def displayimage(camera, filename, overlay, layer):
   1860     # Load the arbitrarily sized image
   1861     try:
   1862         img = Image.open(filename)
   1863     except:
   1864         #writemessage('Seems like an empty shot. Hit record!')
   1865         overlay = removeimage(camera, overlay)
   1866         return overlay
   1867     camera.stop_preview()
   1868     # Create an image padded to the required size with
   1869     # mode 'RGB'
   1870     pad = Image.new('RGB', (
   1871         ((img.size[0] + 31) // 32) * 32,
   1872         ((img.size[1] + 15) // 16) * 16,
   1873         ))
   1874     # Paste the original image into the padded one
   1875     pad.paste(img, (0, 0))
   1876 
   1877     # Add the overlay with the padded image as the source,
   1878     # but the original image's dimensions
   1879     overlay = camera.add_overlay(pad.tobytes(), size=img.size)
   1880     # By default, the overlay is in layer 0, beneath the
   1881     # preview (which defaults to layer 2). Here we make
   1882     # the new overlay semi-transparent, then move it above
   1883     # the preview
   1884     overlay.alpha = 255
   1885     overlay.layer = layer
   1886     return overlay
   1887 
   1888 def removeimage(camera, overlay):
   1889     if overlay:
   1890         try:
   1891             camera.remove_overlay(overlay)
   1892             overlay = None
   1893             camera.start_preview()
   1894         except:
   1895             pass
   1896         return overlay
   1897 
   1898 
   1899 #-------------Browse------------------
   1900 
   1901 def browse(filmname, filmfolder, scene, shot, take):
   1902     scenes = countscenes(filmfolder, filmname)
   1903     shots = countshots(filmname, filmfolder, scene)
   1904     takes = counttakes(filmname, filmfolder, scene, shot)
   1905     return scenes, shots, takes
   1906 
   1907 #-------------Browse2.0------------------
   1908 
   1909 def browse2(filmname, filmfolder, scene, shot, take, n, b):
   1910     scenes = countscenes(filmfolder, filmname)
   1911     shots = countshots(filmname, filmfolder, scene)
   1912     takes = counttakes(filmname, filmfolder, scene, shot)
   1913     #writemessage(str(scene) + ' < ' + str(scenes))
   1914     #time.sleep(4)
   1915     selected = n
   1916     if selected == 0 and b == 1:
   1917         if scene < scenes + 1: #remove this if u want to select any scene
   1918             scene = scene + 1
   1919             shot = countshots(filmname, filmfolder, scene)
   1920             take = counttakes(filmname, filmfolder, scene, shot)
   1921             #if take == 0:
   1922                 #shot = shot - 1
   1923                 #take = counttakes(filmname, filmfolder, scene, shot - 1)
   1924     elif selected == 1 and b == 1:
   1925         if shot < shots + 1: #remove this if u want to select any shot
   1926             shot = shot + 1 
   1927             take = counttakes(filmname, filmfolder, scene, shot)
   1928     elif selected == 2 and b == 1:
   1929         if take < takes + 1:
   1930             take = take + 1 
   1931     elif selected == 0 and b == -1:
   1932         if scene > 1:
   1933             scene = scene - 1
   1934             shot = countshots(filmname, filmfolder, scene)
   1935             take = counttakes(filmname, filmfolder, scene, shot)
   1936             #if take == 0:
   1937             #    shot = shot - 1
   1938             #    take = counttakes(filmname, filmfolder, scene, shot - 1)
   1939     elif selected == 1 and b == -1:
   1940         if shot > 1:
   1941             shot = shot - 1
   1942             take = counttakes(filmname, filmfolder, scene, shot)
   1943     elif selected == 2 and b == -1:
   1944         if take > 1:
   1945             take = take - 1 
   1946     return scene, shot, take
   1947 
   1948 #-------------Update------------------
   1949 
   1950 def update(tarinaversion, tarinavername):
   1951     logger.info('Current version ' + tarinaversion[:-1] + ' ' + tarinavername[:-1])
   1952     time.sleep(2)
   1953     logger.info('Checking for updates...')
   1954     try:
   1955         run_command('wget -N https://raw.githubusercontent.com/rbckman/tarina/master/VERSION -P /tmp/')
   1956     except:
   1957         logger.info('Sorry buddy, no internet connection')
   1958         time.sleep(2)
   1959         return tarinaversion, tarinavername
   1960     try:
   1961         f = open('/tmp/VERSION')
   1962         versionnumber = f.readline()
   1963         versionname = f.readline()
   1964     except:
   1965         logger.info('hmm.. something wrong with the update')
   1966     if round(float(tarinaversion),3) < round(float(versionnumber),3):
   1967         logger.info('New version found ' + versionnumber[:-1] + ' ' + versionname[:-1])
   1968         time.sleep(4)
   1969         logger.info('Updating...')
   1970         run_command('git -C ' + tarinafolder + ' pull')
   1971         run_command('sudo ' + tarinafolder + '/install.sh')
   1972         logger.info('Update done, will now reboot Tarina')
   1973         waitforanykey()
   1974         logger.info('Hold on rebooting Tarina...')
   1975         run_command('sudo reboot')
   1976     logger.info('Version is up-to-date!')
   1977     return tarinaversion, tarinavername
   1978 
   1979 #-------------Get films---------------
   1980 
   1981 def getfilms(filmfolder):
   1982     #get a list of films, in order of settings.p file last modified
   1983     films_sorted = []
   1984     films = next(os.walk(filmfolder))[1]
   1985     for i in films:
   1986         if not '.videos' in i:
   1987             if os.path.isfile(filmfolder + i + '/' + 'settings.p') == True:
   1988                 lastupdate = os.path.getmtime(filmfolder + i + '/' + 'settings.p')
   1989                 films_sorted.append((i,lastupdate))
   1990             else:
   1991                 films_sorted.append((i,0))
   1992     films_sorted = sorted(films_sorted, key=lambda tup: tup[1], reverse=True)
   1993     logger.info('*-- Films --*')
   1994     for p in films_sorted:
   1995         logger.info(p[0])
   1996     return films_sorted
   1997 
   1998 #-------------Load tarina config---------------
   1999 
   2000 def getconfig(camera):
   2001     version = camera.revision
   2002     home = os.path.expanduser('~')
   2003     configfile = home + '/.tarina/config.ini'
   2004     configdir = os.path.dirname(configfile)
   2005     if not os.path.isdir(configdir):
   2006         os.makedirs(configdir)
   2007     config = configparser.ConfigParser()
   2008     if config.read(configfile):
   2009         camera_model = config['SENSOR']['model']
   2010         camera_revision = config['SENSOR']['revision']
   2011         if camera_model == version:
   2012             return camera_model, camera_revision
   2013     elif version == 'imx219':
   2014         config['SENSOR']['model'] = version
   2015         config['SENSOR']['revision'] = 'standard'
   2016         with open(configfile, 'w') as f:
   2017             config.write(f)
   2018         return version, camera_revision
   2019     else:
   2020         pressed = ''
   2021         buttonpressed = ''
   2022         buttontime = time.time()
   2023         holdbutton = ''
   2024         selected = 0
   2025         header = 'What revision of ' + version + ' sensor are you using?'
   2026         menu = 'rev.C', 'rev.D', 'hq-camera'
   2027         while True:
   2028             settings = '', '', ''
   2029             writemenu(menu,settings,selected,header,showmenu)
   2030             pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   2031             if pressed == 'right':
   2032                 if selected < (len(settings) - 1):
   2033                     selected = selected + 1
   2034             elif pressed == 'left':
   2035                 if selected > 0:
   2036                     selected = selected - 1
   2037             elif pressed == 'middle':
   2038                 camera_model = version
   2039                 camera_revision = menu[selected]
   2040                 config['SENSOR'] = {}
   2041                 config['SENSOR']['model'] = camera_model
   2042                 config['SENSOR']['revision'] = camera_revision
   2043                 with open(configfile, 'w') as f:
   2044                     config.write(f)
   2045                 return camera_model, camera_revision
   2046             time.sleep(0.02)
   2047 
   2048 #-------------Load film---------------
   2049 
   2050 def loadfilm(filmname, filmfolder):
   2051     pressed = ''
   2052     buttonpressed = ''
   2053     buttontime = time.time()
   2054     holdbutton = ''
   2055     films = getfilms(filmfolder)
   2056     filmstotal = len(films[1:])
   2057     selectedfilm = 0
   2058     selected = 0
   2059     header = 'Up and down to select and load film'
   2060     menu = 'FILM:', 'BACK'
   2061     while True:
   2062         settings = films[selectedfilm][0], ''
   2063         writemenu(menu,settings,selected,header,showmenu)
   2064         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   2065         if pressed == 'down':
   2066             if selectedfilm < filmstotal:
   2067                 selectedfilm = selectedfilm + 1
   2068         elif pressed == 'up':
   2069             if selectedfilm > 0:
   2070                 selectedfilm = selectedfilm - 1
   2071         elif pressed == 'right':
   2072             if selected < (len(settings) - 1):
   2073                 selected = selected + 1
   2074         elif pressed == 'left':
   2075             if selected > 0:
   2076                 selected = selected - 1
   2077         elif pressed == 'middle' and menu[selected] == 'FILM:':
   2078             filmname = films[selectedfilm][0]
   2079             return filmname
   2080         elif pressed == 'middle' and menu[selected] == 'BACK':
   2081             writemessage('Returning')
   2082             return filmname
   2083         time.sleep(0.02)
   2084 
   2085 #-------------New film----------------
   2086 
   2087 def nameyourfilm(filmfolder, filmname, abc, newfilm):
   2088     oldfilmname = filmname
   2089     if newfilm == True:
   2090         filmname = ''
   2091     pressed = ''
   2092     buttonpressed = ''
   2093     buttontime = time.time()
   2094     holdbutton = ''
   2095     abcx = 0
   2096     helpmessage = 'Up, Down (select characters) Right (next). Middle (done), Retake (Cancel)'
   2097     cursor = '_'
   2098     blinking = True
   2099     pausetime = time.time()
   2100     while True:
   2101         if newfilm == True:
   2102             message = 'New film name: ' + filmname
   2103         else:
   2104             message = 'Edit film name: ' + filmname
   2105         print(term.clear+term.home)
   2106         print(message+cursor)
   2107         writemessage(message + cursor)
   2108         vumetermessage(helpmessage)
   2109         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   2110         if event == ' ':
   2111             event = '_'
   2112         if pressed == 'down':
   2113             pausetime = time.time()
   2114             if abcx < (len(abc) - 1):
   2115                 abcx = abcx + 1
   2116                 cursor = abc[abcx]
   2117         elif pressed == 'up':
   2118             pausetime = time.time()
   2119             if abcx > 0:
   2120                 abcx = abcx - 1
   2121                 cursor = abc[abcx]
   2122         elif pressed == 'right':
   2123             pausetime = time.time()
   2124             if len(filmname) < 30:
   2125                 filmname = filmname + abc[abcx]
   2126                 cursor = abc[abcx]
   2127             else:
   2128                 helpmessage = 'Yo, maximum characters reached bro!'
   2129         elif pressed == 'left' or pressed == 'remove':
   2130             pausetime = time.time()
   2131             if len(filmname) > 0:
   2132                 filmname = filmname[:-1]
   2133                 cursor = abc[abcx]
   2134         elif pressed == 'middle' or event == 10:
   2135             if len(filmname) > 0:
   2136                 if abc[abcx] != '_':
   2137                     filmname = filmname + abc[abcx]
   2138                 try:
   2139                     if filmname == oldfilmname:
   2140                         return oldfilmname
   2141                     elif filmname in getfilms(filmfolder)[0]:
   2142                         helpmessage = 'this filmname is already taken! pick another name!'
   2143                     elif filmname not in getfilms(filmfolder)[0]:
   2144                         logger.info("New film " + filmname)
   2145                         return(filmname)
   2146                 except:
   2147                     logger.info("New film " + filmname)
   2148                     return(filmname)
   2149         elif pressed == 'retake':
   2150             return oldfilmname
   2151         elif event in abc:
   2152             pausetime = time.time()
   2153             filmname = filmname + event
   2154         if time.time() - pausetime > 0.5:
   2155             if blinking == True:
   2156                 cursor = abc[abcx]
   2157             if blinking == False:
   2158                 cursor = ' '
   2159             blinking = not blinking
   2160             pausetime = time.time()
   2161         time.sleep(keydelay)
   2162 
   2163 #-------------New camera----------------
   2164 
   2165 def newcamera_ip(abc, network):
   2166     pressed = ''
   2167     buttonpressed = ''
   2168     buttontime = time.time()
   2169     holdbutton = ''
   2170     abcx = 0
   2171     helpmessage = 'Up, Down (select characters) Right (next). Middle (done), Retake (Cancel)'
   2172     cursor = '_'
   2173     blinking = True
   2174     pausetime = time.time()
   2175     ip_network = network.split('.')[:-1]
   2176     ip_network = '.'.join(ip_network)+'.'
   2177     ip = ''
   2178     while True:
   2179         message = 'Camera ip: ' + ip_network + ip
   2180         print(term.clear+term.home)
   2181         print(message+cursor)
   2182         writemessage(message + cursor)
   2183         vumetermessage(helpmessage)
   2184         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   2185         if event == ' ':
   2186             event = '_'
   2187         if pressed == 'down':
   2188             pausetime = time.time()
   2189             if abcx < (len(abc) - 1):
   2190                 abcx = abcx + 1
   2191                 cursor = abc[abcx]
   2192         elif pressed == 'up':
   2193             pausetime = time.time()
   2194             if abcx > 0:
   2195                 abcx = abcx - 1
   2196                 cursor = abc[abcx]
   2197         elif pressed == 'right':
   2198             pausetime = time.time()
   2199             if len(ip) < 2:
   2200                 ip = ip + abc[abcx]
   2201                 cursor = abc[abcx]
   2202             else:
   2203                 helpmessage = 'Yo, maximum ip reached bro!'
   2204         elif pressed == 'left' or pressed == 'remove':
   2205             pausetime = time.time()
   2206             if len(ip) > 0:
   2207                 ip = ip[:-1]
   2208                 cursor = abc[abcx]
   2209         elif pressed == 'middle' or event == 10:
   2210             if len(ip) > 0:
   2211                 if abc[abcx] != '_':
   2212                     if int(ip) < 256:
   2213                         ip = ip + abc[abcx]
   2214                         logger.info("New camera " + ip_network+ip)
   2215                         return ip_network+ip
   2216                     else:
   2217                         helpmessage = 'in the range of ips 1-256'
   2218         elif pressed == 'retake':
   2219             return 
   2220         elif event in abc:
   2221             pausetime = time.time()
   2222             ip = ip + event
   2223         if time.time() - pausetime > 0.5:
   2224             if blinking == True:
   2225                 cursor = abc[abcx]
   2226             if blinking == False:
   2227                 cursor = ' '
   2228             blinking = not blinking
   2229             pausetime = time.time()
   2230         time.sleep(keydelay)
   2231 
   2232 #------------Timelapse--------------------------
   2233 
   2234 def timelapse(beeps,camera,filmname,foldername,filename,between,duration,backlight):
   2235     pressed = ''
   2236     buttonpressed = ''
   2237     buttontime = time.time()
   2238     holdbutton = ''
   2239     sound = False
   2240     selected = 0
   2241     header = 'Adjust delay in seconds between videos'
   2242     menu = 'DELAY:', 'DURATION:', 'SOUND:', 'START', 'BACK'
   2243     while True:
   2244         settings = str(round(between,2)), str(round(duration,2)), str(sound), '', ''
   2245         writemenu(menu,settings,selected,header,showmenu)
   2246         seconds = (3600 / between) * duration
   2247         vumetermessage('1 h timelapse filming equals ' + str(round(seconds,2)) + ' second clip   ')
   2248         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   2249         if pressed == 'up' and menu[selected] == 'DELAY:':
   2250             between = between + 1
   2251         elif pressed == 'down' and menu[selected] == 'DELAY:':
   2252             if between > 1:
   2253                 between = between - 1
   2254         if pressed == 'up' and menu[selected] == 'SOUND:':
   2255             sound = True
   2256         elif pressed == 'down' and menu[selected] == 'SOUND:':
   2257             sound = False
   2258         elif pressed == 'up' and menu[selected] == 'DURATION:':
   2259             duration = duration + 0.1
   2260         elif pressed == 'down' and menu[selected] == 'DURATION:':
   2261             if duration > 0.3:
   2262                 duration = duration - 0.1
   2263         elif pressed == 'up' or pressed == 'down' and menu[selected] == 'SOUND:':
   2264             if sound == False:
   2265                 sound == True
   2266             if sound == True:
   2267                 sound == False
   2268         elif pressed == 'right':
   2269             if selected < (len(settings) - 1):
   2270                 selected = selected + 1
   2271         elif pressed == 'left':
   2272             if selected > 0:
   2273                 selected = selected - 1
   2274         elif pressed == 'middle':
   2275             if menu[selected] == 'START':
   2276                 if os.path.isdir(foldername+'timelapse') == False:
   2277                     os.makedirs(foldername + 'timelapse')
   2278                 time.sleep(0.02)
   2279                 writemessage('Recording timelapse, middlebutton to stop')
   2280                 n = 1
   2281                 recording = False
   2282                 starttime = time.time()
   2283                 t = 0
   2284                 files = []
   2285                 while True:
   2286                     t = time.time() - starttime
   2287                     pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   2288                     vumetermessage('Timelapse lenght is now ' + str(round(n * duration,2)) + ' second clip   ')
   2289                     if recording == False and t > between:
   2290                         if beeps > 0:
   2291                             buzz(150)
   2292                         #camera.start_recording(foldername + 'timelapse/' + filename + '_' + str(n).zfill(3) + '.h264', format='h264', quality=26, bitrate=5000000)
   2293                         camera.start_recording(foldername + 'timelapse/' + filename + '_' + str(n).zfill(3) + '.h264', format='h264', quality=quality, level=profilelevel)
   2294                         if sound == True:
   2295                             os.system(tarinafolder+'/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 &')
   2296                         files.append(foldername + 'timelapse/' + filename + '_' + str(n).zfill(3))
   2297                         starttime = time.time()
   2298                         recording = True
   2299                         n = n + 1
   2300                         t = 0
   2301                     if recording == True:
   2302                         writemessage('Recording timelapse ' + str(n) + ' ' + 'time:' + str(round(t,2)))
   2303                     if recording == False:
   2304                         writemessage('Between timelapse ' + str(n) + ' ' + 'time:' + str(round(t,2)))
   2305                     if t > duration and recording == True:
   2306                         if sound == True:
   2307                             os.system('pkill arecord')
   2308                         camera.stop_recording()
   2309                         recording = False
   2310                         starttime = time.time()
   2311                         t = 0
   2312                     if pressed == 'screen':
   2313                         if backlight == False:
   2314                             # requires wiringpi installed
   2315                             run_command('gpio -g pwm 19 1023')
   2316                             backlight = True
   2317                         elif backlight == True:
   2318                             run_command('gpio -g pwm 19 0')
   2319                             backlight = False
   2320                     elif pressed == 'middle' and n > 1:
   2321                         if recording == True:
   2322                             os.system('pkill arecord')
   2323                             camera.stop_recording()
   2324                         #create thumbnail
   2325                         try:
   2326                             camera.capture(foldername + filename + '.jpeg', resize=(800,450), use_video_port=True)
   2327                         except:
   2328                             logger.warning('something wrong with camera jpeg capture')
   2329                         writemessage('Compiling timelapse')
   2330                         logger.info('Hold on, rendering ' + str(len(files)) + ' scenes')
   2331                         #RENDER VIDEO
   2332                         renderfilename = foldername + filename
   2333                         n = 1
   2334                         videomerge = ['MP4Box']
   2335                         videomerge.append('-force-cat')
   2336                         for f in files:
   2337                             if sound == True:
   2338                                 compileshot(f,filmfolder,filmname)
   2339                                 audiotrim(foldername + 'timelapse/' + filename + '_' + str(n).zfill(3), 'end')
   2340                                 videomerge.append('-cat')
   2341                                 videomerge.append(f + '.mp4')
   2342                             else:
   2343                                 videomerge.append('-cat')
   2344                                 videomerge.append(f + '.h264')
   2345                             n = n + 1                            
   2346                         videomerge.append('-new')
   2347                         videomerge.append(renderfilename + '.mp4')
   2348                         call(videomerge, shell=False) #how to insert somekind of estimated time while it does this?
   2349                         ##RENDER AUDIO
   2350                         if sound == True:
   2351                             writemessage('Rendering sound')
   2352                             audiomerge = ['sox']
   2353                             #if render > 2:
   2354                             #    audiomerge.append(filename + '.wav')
   2355                             for f in files:
   2356                                 audiomerge.append(f + '.wav')
   2357                             audiomerge.append(renderfilename + '.wav')
   2358                             call(audiomerge, shell=False)
   2359                         ##MAKE AUDIO SILENCE
   2360                         if sound == False:
   2361                             audiosilence(foldername,filename)
   2362                         #cleanup
   2363                         #os.system('rm -r ' + foldername + 'timelapse')
   2364                         vumetermessage('timelapse done! ;)')
   2365                         return renderfilename, between, duration
   2366                     time.sleep(keydelay)
   2367             if menu[selected] == 'BACK':
   2368                 vumetermessage('ok!')
   2369                 return '', between, duration
   2370         time.sleep(keydelay)
   2371 
   2372 #------------Remove-----------------------
   2373 
   2374 def remove(filmfolder, filmname, scene, shot, take, sceneshotortake):
   2375     foldername = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/'
   2376     filename = 'take' + str(take).zfill(3)
   2377     pressed = ''
   2378     buttonpressed = ''
   2379     buttontime = time.time()
   2380     holdbutton = ''
   2381     time.sleep(0.1)
   2382     header = 'Are you sure you want to remove ' + sceneshotortake + '?'
   2383     menu = '', ''
   2384     settings = 'NO', 'YES'
   2385     selected = 0
   2386     otf_scene = countscenes(filmfolder, 'onthefloor')
   2387     otf_scene += 1
   2388     otf_shot = countshots('onthefloor', filmfolder, otf_scene)
   2389     otf_shot += 1
   2390     otf_take = counttakes('onthefloor', filmfolder, otf_scene, otf_shot)
   2391     otf_take += 1
   2392     while True:
   2393         writemenu(menu,settings,selected,header,showmenu)
   2394         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   2395         if pressed == 'right':
   2396             if selected < (len(settings) - 1):
   2397                 selected = selected + 1
   2398         elif pressed == 'left':
   2399             if selected > 0:
   2400                 selected = selected - 1
   2401         elif pressed == 'middle':
   2402             if selected == 1:
   2403                 if filmname == 'onthefloor':
   2404                     if sceneshotortake == 'take':
   2405                         os.system('rm ' + foldername + filename + '.h264')
   2406                         os.system('rm ' + foldername + filename + '.mp4')
   2407                         os.system('rm ' + foldername + filename + '.wav')
   2408                         os.system('rm ' + foldername + filename + '.jpeg')
   2409                     elif sceneshotortake == 'shot' and shot > 0:
   2410                         os.system('rm -r ' + foldername)
   2411                     elif sceneshotortake == 'scene':
   2412                         foldername = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3)
   2413                         os.system('rm -r ' + foldername)
   2414                         scene = countscenes(filmfolder, filmname)
   2415                         shot=1
   2416                         take=1
   2417                     elif sceneshotortake == 'film':
   2418                         foldername = filmfolder + filmname
   2419                         os.system('rm -r ' + foldername)
   2420                         os.makedirs(filmfolder+'onthefloor')
   2421                     return
   2422                 else:
   2423                     if sceneshotortake == 'take':
   2424                         writemessage('Throwing take on the floor' + str(take))
   2425                         onthefloor = filmfolder + 'onthefloor/' + 'scene' + str(otf_scene).zfill(3) + '/shot' + str(otf_shot).zfill(3) + '/take' + str(otf_take).zfill(3) 
   2426                         onthefloor_folder = filmfolder + 'onthefloor/' + 'scene' + str(otf_scene).zfill(3) + '/shot' + str(otf_shot).zfill(3) + '/'
   2427                         if os.path.isdir(onthefloor_folder) == False:
   2428                             os.makedirs(onthefloor)
   2429                         os.system('mv ' + foldername + filename + '.h264 ' + onthefloor + '.h264')
   2430                         os.system('mv ' + foldername + filename + '.mp4 ' + onthefloor + '.mp4')
   2431                         os.system('mv ' + foldername + filename + '.wav ' + onthefloor + '.wav')
   2432                         os.system('mv ' + foldername + filename + '.jpeg ' + onthefloor + '.jpeg')
   2433                         take = take - 1
   2434                         if take == 0:
   2435                             take = 1
   2436                     elif sceneshotortake == 'shot' and shot > 0:
   2437                         writemessage('Throwing shot on the floor' + str(shot))
   2438                         onthefloor = filmfolder + 'onthefloor/' + 'scene' + str(otf_scene).zfill(3) + '/shot' + str(otf_shot).zfill(3)+'/'
   2439                         os.makedirs(onthefloor)
   2440                         os.system('cp -r '+foldername+'* '+onthefloor)
   2441                         os.system('rm -r '+foldername)
   2442                         take = counttakes(filmname, filmfolder, scene, shot)
   2443                     elif sceneshotortake == 'scene':
   2444                         onthefloor = filmfolder + 'onthefloor/' + 'scene' + str(otf_scene).zfill(3)
   2445                         os.makedirs(onthefloor)
   2446                         writemessage('Throwing clips on the floor ' + str(scene))
   2447                         foldername = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3)
   2448                         os.system('mv ' + foldername + '/* ' + onthefloor+'/' )
   2449                         scene = countscenes(filmfolder, filmname)
   2450                         shot = 1
   2451                         take = 1
   2452                     elif sceneshotortake == 'film':
   2453                         foldername = filmfolder + filmname
   2454                         os.system('rm -r ' + foldername)
   2455                 return
   2456             elif selected == 0:
   2457                 return
   2458         time.sleep(0.02)
   2459 
   2460 #------------Remove and Organize----------------
   2461 
   2462 def organize(filmfolder, filmname):
   2463     global fps, db
   2464     origin_files=[]
   2465     scenes = next(os.walk(filmfolder + filmname))[1]
   2466     for i in scenes:
   2467         if 'scene' not in i:
   2468             scenes.remove(i)
   2469     # Takes
   2470     for i in sorted(scenes):
   2471         shots = next(os.walk(filmfolder + filmname + '/' + i))[1]
   2472         for p in sorted(shots):
   2473             takes = next(os.walk(filmfolder + filmname + '/' + i + '/' + p))[2]
   2474             if len(takes) == 0:
   2475                 logger.info('no takes in this shot, removing shot..')
   2476                 #os.system('rm -r ' + filmfolder + filmname + '/' + i + '/' + p)
   2477             organized_nr = 1
   2478             print(i)
   2479             print(p)
   2480             print(sorted(takes))
   2481             #time.sleep(2)
   2482             for s in sorted(takes):
   2483                 if '.mp4' in s or '.h264' in s:
   2484                     unorganized_nr = int(s[4:7])
   2485                     takename = filmfolder + filmname + '/' + i + '/' + p + '/take' + str(unorganized_nr).zfill(3)
   2486                     if '.mp4' in s:
   2487                         origin=os.path.realpath(takename+'.mp4')
   2488                         if origin != os.path.abspath(takename+'.mp4'):
   2489                             print('appending: '+origin)
   2490                             origin_files.append(origin)
   2491                     if '.h264' in s:
   2492                         origin=os.path.realpath(takename+'.h264')
   2493                         if origin != os.path.abspath(takename+'.h264'):
   2494                             origin_files.append(origin)
   2495                     if organized_nr == unorganized_nr:
   2496                         #print('correct')
   2497                         pass
   2498                     if organized_nr != unorganized_nr:
   2499                         print('false, correcting from ' + str(unorganized_nr) + ' to ' + str(organized_nr))
   2500                         print(s)
   2501                         time.sleep(3)
   2502                         mv = 'mv ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(unorganized_nr).zfill(3)
   2503                         run_command(mv + '.mp4 ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.mp4')
   2504                         run_command(mv + '.h264 ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.h264')
   2505                         run_command(mv + '.wav ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.wav')
   2506                         run_command(mv + '.jpeg ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.jpeg')
   2507                     #check if same video has both h246 and mp4 and render and remove h264
   2508                     for t in sorted(takes):
   2509                         if t.replace('.mp4','') == s.replace('.h264','') or s.replace('.mp4','') == t.replace('.h264',''):
   2510                             logger.info('Found both mp4 and h264 of same video!')
   2511                             logger.info(t)
   2512                             logger.info(s)
   2513                             #time.sleep(5)
   2514                             compileshot(takename,filmfolder,filmname)
   2515                             #organized_nr -= 1
   2516                     organized_nr += 1
   2517     # Shots
   2518     for i in sorted(scenes):
   2519         shots = next(os.walk(filmfolder + filmname + '/' + i))[1]
   2520         if len(shots) == 0:
   2521             logger.info('no shots in this scene, removing scene..')
   2522             os.system('rm -r ' + filmfolder + filmname + '/' + i)
   2523         organized_nr = 1
   2524         for p in sorted(shots):
   2525             if 'insert' in p:
   2526                 #add_organize(filmfolder, filmname)
   2527                 pass
   2528             elif 'shot' in p:
   2529                 #print(p)
   2530                 unorganized_nr = int(p[-3:])
   2531                 if organized_nr == unorganized_nr:
   2532                     #print('correct')
   2533                     pass
   2534                 if organized_nr != unorganized_nr:
   2535                     #print('false, correcting from ' + str(unorganized_nr) + ' to ' + str(organized_nr))
   2536                     os.system('mv ' + filmfolder + filmname + '/' + i + '/shot' + str(unorganized_nr).zfill(3) + ' ' + filmfolder + filmname + '/' + i + '/shot' + str(organized_nr).zfill(3))
   2537                 organized_nr += 1
   2538 
   2539     # Scenes
   2540     organized_nr = 1
   2541     for i in sorted(scenes):
   2542         if 'insert' in i:
   2543             #add_organize(filmfolder, filmname)
   2544             pass
   2545         elif 'scene' in i:
   2546             #print(i)
   2547             unorganized_nr = int(i[-3:])
   2548             if organized_nr == unorganized_nr:
   2549                 #print('correct')
   2550                 pass
   2551             if organized_nr != unorganized_nr:
   2552                 #print('false, correcting from ' + str(unorganized_nr) + ' to ' + str(organized_nr))
   2553                 os.system('mv ' + filmfolder + filmname + '/scene' + str(unorganized_nr).zfill(3) + ' ' + filmfolder + filmname + '/scene' + str(organized_nr).zfill(3))
   2554             organized_nr += 1
   2555 
   2556     logger.info('Organizer done! Everything is tidy')
   2557     return origin_files
   2558 
   2559 
   2560 #------------Add and Organize----------------
   2561 
   2562 def add_organize(filmfolder, filmname):
   2563     scenes = next(os.walk(filmfolder + filmname))[1]
   2564     for i in scenes:
   2565         if 'scene' not in i:
   2566             scenes.remove(i)
   2567     # Shots
   2568     for i in sorted(scenes):
   2569         shots = next(os.walk(filmfolder + filmname + '/' + i))[1]
   2570         for c in shots:
   2571             if 'shot' not in c:
   2572                 shots.remove(c)
   2573         organized_nr = len(shots)
   2574         for p in sorted(shots, reverse=True):
   2575             if 'yanked' in p:
   2576                 #print(p)
   2577                 os.system('mv -n ' + filmfolder + filmname + '/' + i + '/shot' + str(organized_nr - 1).zfill(3) + '_yanked ' + filmfolder + filmname + '/' + i + '/shot' + str(organized_nr).zfill(3))
   2578             elif 'insert' in p:
   2579                 os.system('mv -n ' + filmfolder + filmname + '/' + i + '/shot' + str(organized_nr - 1).zfill(3) + '_insert ' + filmfolder + filmname + '/' + i + '/shot' + str(organized_nr).zfill(3))
   2580                 run_command('touch ' + filmfolder + filmname + '/' + i + '/shot' + str(organized_nr).zfill(3) + '/.placeholder')
   2581             elif 'shot' in p:
   2582                 #print(p)
   2583                 unorganized_nr = int(p[-3:])
   2584                 if organized_nr == unorganized_nr:
   2585                     #print('correct')
   2586                     pass
   2587                 if organized_nr != unorganized_nr:
   2588                     #print('false, correcting from ' + str(unorganized_nr) + ' to ' + str(organized_nr))
   2589                     os.system('mv -n ' + filmfolder + filmname + '/' + i + '/shot' + str(unorganized_nr).zfill(3) + ' ' + filmfolder + filmname + '/' + i + '/shot' + str(organized_nr).zfill(3)) 
   2590             organized_nr -= 1
   2591 
   2592     # Scenes
   2593     organized_nr = len(scenes)
   2594     for i in sorted(scenes, reverse=True):
   2595         #print(i)
   2596         if 'yanked' in i:
   2597             os.system('mv -n ' + filmfolder + filmname + '/scene' + str(organized_nr - 1).zfill(3) + '_yanked ' + filmfolder + filmname + '/scene' + str(organized_nr).zfill(3))
   2598         elif 'insert' in i:
   2599             #print(p)
   2600             os.system('mv -n ' + filmfolder + filmname + '/scene' + str(organized_nr - 1).zfill(3) + '_insert ' + filmfolder + filmname + '/scene' + str(organized_nr).zfill(3))
   2601             run_command('touch ' + filmfolder + filmname + '/scene' + str(organized_nr).zfill(3) + '/.placeholder')
   2602         elif 'scene' in i:
   2603             #print(i)
   2604             unorganized_nr = int(i[-3:])
   2605             if organized_nr == unorganized_nr:
   2606                 #print('correct')
   2607                 pass
   2608             if organized_nr != unorganized_nr:
   2609                 #print('false, correcting from ' + str(unorganized_nr) + ' to ' + str(organized_nr))
   2610                 os.system('mv -n ' + filmfolder + filmname + '/scene' + str(unorganized_nr).zfill(3) + ' ' + filmfolder + filmname + '/scene' + str(organized_nr).zfill(3))
   2611         organized_nr -= 1
   2612     return
   2613 
   2614 
   2615 #-------------Stretch Audio--------------
   2616 
   2617 def stretchaudio(filename,fps):
   2618     fps_rounded=round(fps)
   2619     if int(fps_rounded) != 25:
   2620         pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + filename + '.mp4', shell=True)
   2621         videolenght = pipe.decode().strip()
   2622         try:
   2623             pipe = subprocess.check_output('mediainfo --Inform="Audio;%Duration%" ' + filename + '.wav', shell=True)
   2624             audiolenght = pipe.decode().strip()
   2625         except:
   2626             audiosilence('',filename)
   2627             audiolenght=videolenght
   2628         #if there is no audio lenght
   2629         logger.info('audio is:' + audiolenght)
   2630         if not audiolenght.strip():
   2631             audiolenght = 0
   2632         ratio = int(audiolenght)/int(videolenght)
   2633         print(str(ratio))
   2634         run_command('cp '+filename+'.wav '+filename+'_temp.wav')
   2635         run_command('ffmpeg -y -i ' + filename + '_temp.wav -filter:a atempo="'+str(ratio) + '" ' + filename + '.wav')
   2636         os.remove(filename + '_temp.wav')
   2637     time.sleep(5)
   2638     return
   2639 
   2640 #-------------Compile Shot--------------
   2641 
   2642 def compileshot(filename,filmfolder,filmname):
   2643     global fps, soundrate, channels
   2644     videolenght=0
   2645     audiolenght=0
   2646     #Check if file already converted
   2647     if os.path.isfile(filename + '.h264'):
   2648         logger.info('Video not converted!')
   2649         writemessage('Converting to playable video')
   2650         #remove old mp4 if corrupted like if an unpredicted shutdown in middle of converting
   2651         video_origins = (os.path.realpath(filename+'.h264'))[:-5]
   2652         os.system('rm ' + filename + '.mp4')
   2653         os.system('rm ' + video_origins + '.mp4')
   2654         print(filename+'.mp4 removed!')
   2655         video_origins = (os.path.realpath(filename+'.h264'))[:-5]
   2656         run_command('MP4Box -fps 25 -add ' + video_origins + '.h264 ' + video_origins + '.mp4')
   2657         os.system('ln -s '+video_origins+'.mp4 '+filename+'.mp4')
   2658         #add audio/video start delay sync
   2659         run_command('sox -V0 '+filename+'.wav /dev/shm/temp.wav trim 0.013')
   2660         run_command('mv /dev/shm/temp.wav '+ filename + '.wav')
   2661         stretchaudio(filename,fps)
   2662         audiosync, videolenght, audiolenght = audiotrim(filename, 'end')
   2663         origin=os.path.realpath(filename+'.mp4')
   2664         renderfilename=filename
   2665         muxing = True
   2666         if muxing == True:
   2667             #muxing mp3 layer to mp4 file
   2668             #count estimated audio filesize with a bitrate of 320 kb/s
   2669             audiosize = countsize(renderfilename + '.wav') * 0.453
   2670             os.system('mv ' + renderfilename + '.mp4 ' + renderfilename + '_tmp.mp4')
   2671             p = Popen(['ffmpeg', '-y', '-i', renderfilename + '.wav', '-acodec', 'libmp3lame', '-b:a', '320k', renderfilename + '.mp3'])
   2672             while p.poll() is None:
   2673                 time.sleep(0.2)
   2674                 try:
   2675                     rendersize = countsize(renderfilename + '.mp3')
   2676                 except:
   2677                     continue
   2678                 writemessage('audio rendering ' + str(int(rendersize)) + ' of ' + str(int(audiosize)) + ' kb done')
   2679             ##MERGE AUDIO & VIDEO
   2680             writemessage('Merging audio & video')
   2681             #os.remove(renderfilename + '.mp4') 
   2682             call(['MP4Box', '-rem', '2',  renderfilename + '_tmp.mp4'], shell=False)
   2683             call(['MP4Box', '-add', renderfilename + '_tmp.mp4', '-add', renderfilename + '.mp3', '-new', renderfilename + '.mp4'], shell=False)
   2684             os.remove(renderfilename + '_tmp.mp4')
   2685             os.remove(renderfilename + '.mp3')
   2686         db.update('videos', where='filename="'+origin+'"', videolenght=videolenght/1000, audiolenght=audiolenght/1000, audiosync=audiosync)
   2687         os.system('rm ' + video_origins + '.h264')
   2688         os.system('rm ' + filename + '.h264')
   2689         os.system('rm /dev/shm/temp.wav')
   2690         #run_command('omxplayer --layer 3 ' + filmfolder + '/.rendered/' + filename + '.mp4 &')
   2691         #time.sleep(0.8)
   2692         #run_command('aplay ' + foldername + filename + '.wav')
   2693     return
   2694 
   2695 #-------------Get shot files--------------
   2696 
   2697 def shotfiles(filmfolder, filmname, scene):
   2698     files = []
   2699     shots = countshots(filmname,filmfolder,scene)
   2700     print("shots"+str(shots))
   2701     shot = 1
   2702     while shot <= shots:
   2703         takes = counttakes(filmname,filmfolder,scene,shot)
   2704         if takes > 0:
   2705             folder = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/'
   2706             filename = 'take' + str(takes).zfill(3)
   2707             files.append(folder + filename)
   2708             print(files)
   2709         shot = shot + 1
   2710     #writemessage(str(len(shotfiles)))
   2711     #time.sleep(2)
   2712     return files
   2713 
   2714 #---------------Render Video------------------
   2715 
   2716 def rendervideo(filmfiles, filename, renderinfo):
   2717     if len(filmfiles) < 1:
   2718         writemessage('Nothing here!')
   2719         time.sleep(2)
   2720         return None
   2721     print('Rendering videofiles')
   2722     writemessage('Hold on, rendering ' + renderinfo + ' with ' + str(len(filmfiles)) + ' files')
   2723     videosize = 0
   2724     rendersize = 0
   2725     videomerge = ['MP4Box']
   2726     videomerge.append('-force-cat')
   2727     for f in filmfiles[:]:
   2728         videosize = videosize + countsize(f + '.mp4')
   2729         videomerge.append('-cat')
   2730         videomerge.append(f + '.mp4')
   2731     videomerge.append('-new')
   2732     videomerge.append(filename + '.mp4')
   2733     #videomerge.append(filename + '.h264')
   2734     #call(videomerge, shell=True) #how to insert somekind of estimated time while it does this?
   2735     p = Popen(videomerge)
   2736     #show progress
   2737     while p.poll() is None:
   2738         time.sleep(0.1)
   2739         try:
   2740             rendersize = countsize(filename + '.mp4')
   2741         except:
   2742             continue
   2743         writemessage('video rendering ' + str(int(rendersize)) + ' of ' + str(int(videosize)) + ' kb done')
   2744     print('Video rendered!')
   2745     return
   2746 
   2747 #---------------Render Audio----------------
   2748 
   2749 def renderaudio(audiofiles, filename, dubfiles, dubmix):
   2750     #if len(audiofiles) < 1:
   2751     #    writemessage('Nothing here!')
   2752     #    time.sleep(2)
   2753     #    return None
   2754     print('Rendering audiofiles')
   2755     ##PASTE AUDIO TOGETHER
   2756     writemessage('Hold on, rendering audio...')
   2757     audiomerge = ['sox']
   2758     #if render > 2:
   2759     #    audiomerge.append(filename + '.wav')
   2760     if len(audiofiles) > 0:
   2761         for f in audiofiles:
   2762             audiomerge.append(f + '.wav')
   2763         audiomerge.append(filename + '.wav')
   2764         call(audiomerge, shell=False)
   2765     #DUBBING
   2766     p = 1
   2767     for i, d in zip(dubmix, dubfiles):
   2768         writemessage('Dub ' + str(p) + ' audio found lets mix...')
   2769         pipe = subprocess.check_output('soxi -D ' + filename + '.wav', shell=True)
   2770         audiolenght = pipe.decode()
   2771         os.system('cp ' + filename + '.wav ' + filename + '_tmp.wav')
   2772         #Fade
   2773         run_command('sox -V0 -G ' + d + ' /dev/shm/fade.wav fade ' + str(round(i[2],1)) + ' 0 ' + str(round(i[3],1)))
   2774         run_command('sox -V0 -G -m -v ' + str(round(i[0],1)) + ' /dev/shm/fade.wav -v ' + str(round(i[1],1)) + ' ' + filename + '_tmp.wav ' + filename + '.wav trim 0 ' + audiolenght)
   2775         os.remove(filename + '_tmp.wav')
   2776         os.remove('/dev/shm/fade.wav')
   2777         print('Dub mix ' + str(p) + ' done!')
   2778         p += 1
   2779     return
   2780 
   2781 #-------------Fast Edit-----------------
   2782 def fastedit(filmfolder, filmname, filmfiles, scene):
   2783     scenedir = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/'
   2784     totlenght = 0
   2785     try:
   2786         os.remove(scenedir + '.fastedit')
   2787     except:
   2788         print('no fastedit file')
   2789     for f in filmfiles:
   2790         pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + f + '.mp4', shell=True)
   2791         videolenght = pipe.decode().strip()
   2792         totlenght = int(videolenght) + totlenght
   2793         print('writing shot lenghts for fastedit mode')
   2794         with open(scenedir + '.fastedit', 'a') as f:
   2795             f.write(str(totlenght)+'\n')
   2796     
   2797 
   2798 #-------------Get scene files--------------
   2799 
   2800 def scenefiles(filmfolder, filmname):
   2801     files = []
   2802     scenes = countscenes(filmfolder,filmname)
   2803     scene = 1
   2804     while scene <= scenes:
   2805         folder = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) + '/'
   2806         filename = 'scene'
   2807         files.append(folder + filename)
   2808         scene = scene + 1
   2809     #writemessage(str(len(shotfiles)))
   2810     #time.sleep(2)
   2811     return files
   2812 
   2813 #-------------Render Shot-------------
   2814 
   2815 def rendershot(filmfolder, filmname, scene, shot):
   2816     global fps
   2817     #This function checks and calls rendervideo & renderaudio if something has changed in the film
   2818     #Video
   2819     videohash = ''
   2820     oldvideohash = ''
   2821     take = counttakes(filmname, filmfolder, scene, shot)
   2822     renderfilename = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/take' + str(take).zfill(3) 
   2823     filmfiles = [renderfilename]
   2824     scenedir = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/'
   2825     # Check if video corrupt
   2826     renderfix = False
   2827     try:
   2828         pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + renderfilename + '.mp4', shell=True)
   2829         videolenght = pipe.decode().strip()
   2830     except:
   2831         videolenght = ''
   2832     print('Shot lenght ' + videolenght)
   2833     if videolenght == '':
   2834         print('Okey, shot file not found or is corrupted')
   2835         # For backwards compatibility remove old rendered scene files
   2836         # run_command('rm ' + renderfilename + '*')
   2837         renderfix = True
   2838     # Video Hash
   2839     for p in filmfiles:
   2840         compileshot(p.filmfolder,filmname)
   2841         videohash = videohash + str(int(countsize(p + '.mp4')))
   2842     print('Videohash of shot is: ' + videohash)
   2843     try:
   2844         with open(scenedir + '.videohash', 'r') as f:
   2845             oldvideohash = f.readline().strip()
   2846         print('oldvideohash is: ' + oldvideohash)
   2847     except:
   2848         print('no videohash found, making one...')
   2849         with open(scenedir + '.videohash', 'w') as f:
   2850             f.write(videohash)
   2851     #Audio
   2852     audiohash = ''
   2853     oldaudiohash = ''
   2854     newaudiomix = False
   2855     for p in filmfiles:
   2856         audiohash += str(int(countsize(p + '.wav')))
   2857     dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, scene, shot)
   2858     for p in dubfiles:
   2859         audiohash += str(int(countsize(p)))
   2860     print('Audiohash of scene is: ' + audiohash)
   2861     try:
   2862         with open(scenedir + '.audiohash', 'r') as f:
   2863             oldaudiohash = f.readline().strip()
   2864         print('oldaudiohash is: ' + oldaudiohash)
   2865     except:
   2866         print('no audiohash found, making one...')
   2867         with open(scenedir + '.audiohash', 'w') as f:
   2868             f.write(audiohash)
   2869     if audiohash != oldaudiohash or newmix == True or renderfix == True:
   2870         renderaudio(filmfiles, renderfilename, dubfiles, dubmix)
   2871         print('updating audiohash...')
   2872         with open(scenedir + '.audiohash', 'w') as f:
   2873             f.write(audiohash)
   2874         for i in range(len(dubfiles)):
   2875             os.system('cp ' + scenedir + '/dub/.settings' + str(i + 1).zfill(3) + ' ' + scenedir + '/dub/.rendered' + str(i + 1).zfill(3))
   2876         print('Audio rendered!')
   2877         newaudiomix = True
   2878     else:
   2879         print('Already rendered!')
   2880     return renderfilename, newaudiomix
   2881 
   2882 
   2883 #-------------Render Scene-------------
   2884 
   2885 def renderscene(filmfolder, filmname, scene):
   2886     global fps
   2887     #This function checks and calls rendervideo & renderaudio if something has changed in the film
   2888     #Video
   2889     videohash = ''
   2890     oldvideohash = ''
   2891     filmfiles = shotfiles(filmfolder, filmname, scene)
   2892     renderfilename = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/scene'
   2893     scenedir = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/'
   2894     # Check if video corrupt
   2895     renderfix = False
   2896     try:
   2897         pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + renderfilename + '.mp4', shell=True)
   2898         videolenght = pipe.decode().strip()
   2899     except:
   2900         videolenght = ''
   2901     print('Scene lenght ' + videolenght)
   2902     if videolenght == '':
   2903         print('Okey, scene file not found or is corrupted')
   2904         # For backwards compatibility remove old rendered scene files
   2905         #run_command('rm ' + renderfilename + '*')
   2906         renderfix = True
   2907     # Video Hash
   2908     for p in filmfiles:
   2909         compileshot(p,filmfolder,filmname)
   2910         videohash = videohash + str(int(countsize(p + '.mp4')))
   2911     print('Videohash of scene is: ' + videohash)
   2912     try:
   2913         with open(scenedir + '.videohash', 'r') as f:
   2914             oldvideohash = f.readline().strip()
   2915         print('oldvideohash is: ' + oldvideohash)
   2916     except:
   2917         print('no videohash found, making one...')
   2918         with open(scenedir + '.videohash', 'w') as f:
   2919             f.write(videohash)
   2920 
   2921     # Render if needed
   2922     if videohash != oldvideohash or renderfix == True:
   2923         rendervideo(filmfiles, renderfilename, 'scene ' + str(scene))
   2924         fastedit(filmfolder, filmname, filmfiles, scene)
   2925         print('updating videohash...')
   2926         with open(scenedir + '.videohash', 'w') as f:
   2927             f.write(videohash)
   2928 
   2929     #Audio
   2930     audiohash = ''
   2931     oldaudiohash = ''
   2932     newaudiomix = False
   2933     for p in filmfiles:
   2934         audiohash += str(int(countsize(p + '.wav')))
   2935     dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, scene, 0)
   2936     for p in dubfiles:
   2937         audiohash += str(int(countsize(p)))
   2938     print('Audiohash of scene is: ' + audiohash)
   2939     try:
   2940         with open(scenedir + '.audiohash', 'r') as f:
   2941             oldaudiohash = f.readline().strip()
   2942         print('oldaudiohash is: ' + oldaudiohash)
   2943     except:
   2944         print('no audiohash found, making one...')
   2945         with open(scenedir + '.audiohash', 'w') as f:
   2946             f.write(audiohash)
   2947     if audiohash != oldaudiohash or newmix == True or renderfix == True:
   2948         renderaudio(filmfiles, renderfilename, dubfiles, dubmix)
   2949         print('updating audiohash...')
   2950         with open(scenedir + '.audiohash', 'w') as f:
   2951             f.write(audiohash)
   2952         for i in range(len(dubfiles)):
   2953             os.system('cp ' + scenedir + '/dub/.settings' + str(i + 1).zfill(3) + ' ' + scenedir + '/dub/.rendered' + str(i + 1).zfill(3))
   2954         print('Audio rendered!')
   2955         newaudiomix = True
   2956         muxing = True
   2957         if muxing == True:
   2958             #muxing mp3 layer to mp4 file
   2959             #count estimated audio filesize with a bitrate of 320 kb/s
   2960             audiosize = countsize(renderfilename + '.wav') * 0.453
   2961             os.system('mv ' + renderfilename + '.mp4 ' + renderfilename + '_tmp.mp4')
   2962             if debianversion == 'stretch':
   2963                 p = Popen(['avconv', '-y', '-i', renderfilename + '.wav', '-acodec', 'libmp3lame', '-b:a', '320k', renderfilename + '.mp3'])
   2964             else:
   2965                 p = Popen(['ffmpeg', '-y', '-i', renderfilename + '.wav', '-acodec', 'libmp3lame', '-b:a', '320k', renderfilename + '.mp3'])
   2966             while p.poll() is None:
   2967                 time.sleep(0.2)
   2968                 try:
   2969                     rendersize = countsize(renderfilename + '.mp3')
   2970                 except:
   2971                     continue
   2972                 writemessage('audio rendering ' + str(int(rendersize)) + ' of ' + str(int(audiosize)) + ' kb done')
   2973             ##MERGE AUDIO & VIDEO
   2974             writemessage('Merging audio & video')
   2975             #os.remove(renderfilename + '.mp4') 
   2976             call(['MP4Box', '-rem', '2',  renderfilename + '_tmp.mp4'], shell=False)
   2977             call(['MP4Box', '-add', renderfilename + '_tmp.mp4', '-add', renderfilename + '.mp3', '-new', renderfilename + '.mp4'], shell=False)
   2978             os.remove(renderfilename + '_tmp.mp4')
   2979             os.remove(renderfilename + '.mp3')
   2980     else:
   2981         print('Already rendered!')
   2982     return renderfilename, newaudiomix
   2983 
   2984 #-------------Render film------------
   2985 
   2986 def renderfilm(filmfolder, filmname, comp, scene, muxing):
   2987     global fps
   2988     def render(q, filmfolder, filmname, comp, scene):
   2989         newaudiomix = False
   2990         #if comp == 1:
   2991         #    newaudiomix = True
   2992         #This function checks and calls renderscene first then rendervideo & renderaudio if something has changed in the film
   2993         if scene > 0:
   2994             scenefilename, audiomix = renderscene(filmfolder, filmname, scene)
   2995             q.put(scenefilename)
   2996             return
   2997         scenes = countscenes(filmfolder, filmname)
   2998         for i in range(scenes):
   2999             scenefilename, audiomix = renderscene(filmfolder, filmname, i + 1)
   3000             #Check if a scene has a new audiomix
   3001             print('audiomix of scene ' + str(i + 1) + ' is ' + str(audiomix))
   3002             if audiomix == True:
   3003                 newaudiomix = True
   3004         filmfiles = scenefiles(filmfolder, filmname)
   3005         #Video
   3006         videohash = ''
   3007         oldvideohash = ''
   3008         renderfilename = filmfolder + filmname + '/' + filmname
   3009         filmdir = filmfolder + filmname + '/'
   3010         for p in filmfiles:
   3011             print(p)
   3012             compileshot(p,filmfolder,filmname)
   3013             videohash += str(int(countsize(p + '.mp4')))
   3014         print('Videohash of film is: ' + videohash)
   3015         try:
   3016             with open(filmdir + '.videohash', 'r') as f:
   3017                 oldvideohash = f.readline().strip()
   3018             print('oldvideohash is: ' + oldvideohash)
   3019         except:
   3020             print('no videohash found, making one...')
   3021             with open(filmdir + '.videohash', 'w') as f:
   3022                 f.write(videohash)
   3023         if videohash != oldvideohash:
   3024             rendervideo(filmfiles, renderfilename, filmname)
   3025             print('updating video hash')
   3026             with open(filmdir + '.videohash', 'w') as f:
   3027                 f.write(videohash)
   3028         #Audio
   3029         audiohash = ''
   3030         oldaudiohash = ''
   3031         for p in filmfiles:
   3032             print(p)
   3033             audiohash += str(int(countsize(p + '.wav')))
   3034         dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, 0, 0)
   3035         for p in dubfiles:
   3036             audiohash += str(int(countsize(p)))
   3037         print('Audiohash of film is: ' + audiohash)
   3038         try:
   3039             with open(filmdir + '.audiohash', 'r') as f:
   3040                 oldaudiohash = f.readline().strip()
   3041             print('oldaudiohash is: ' + oldaudiohash)
   3042         except:
   3043             print('no audiohash found, making one...')
   3044             with open(filmdir+ '.audiohash', 'w') as f:
   3045                 f.write(audiohash)
   3046         #This is if the scene has a new audiomix
   3047         if newaudiomix == True:
   3048             newmix = True
   3049         if audiohash != oldaudiohash or newmix == True:
   3050             renderaudio(filmfiles, renderfilename, dubfiles, dubmix)
   3051             print('updating audiohash...')
   3052             with open(filmdir+ '.audiohash', 'w') as f:
   3053                 f.write(audiohash)
   3054             for i in range(len(dubfiles)):
   3055                 os.system('cp ' + filmdir + '/dub/.settings' + str(i + 1).zfill(3) + ' ' + filmdir + '/dub/.rendered' + str(i + 1).zfill(3))
   3056             print('Audio rendered!')
   3057             #compressing
   3058             if comp > 0:
   3059                 writemessage('compressing audio')
   3060                 os.system('mv ' + renderfilename + '.wav ' + renderfilename + '_tmp.wav')
   3061                 run_command('sox ' + renderfilename + '_tmp.wav ' + renderfilename + '.wav compand 0.3,1 6:-70,-60,-20 -5 -90 0.2')
   3062                 os.remove(renderfilename + '_tmp.wav')
   3063             if muxing == True:
   3064                 #muxing mp3 layer to mp4 file
   3065                 #count estimated audio filesize with a bitrate of 320 kb/s
   3066                 audiosize = countsize(renderfilename + '.wav') * 0.453
   3067                 os.system('mv ' + renderfilename + '.mp4 ' + renderfilename + '_tmp.mp4')
   3068                 if debianversion == 'stretch':
   3069                     p = Popen(['avconv', '-y', '-i', renderfilename + '.wav', '-acodec', 'libmp3lame', '-b:a', '320k', renderfilename + '.mp3'])
   3070                 else:
   3071                     p = Popen(['ffmpeg', '-y', '-i', renderfilename + '.wav', '-acodec', 'libmp3lame', '-b:a', '320k', renderfilename + '.mp3'])
   3072                 while p.poll() is None:
   3073                     time.sleep(0.2)
   3074                     try:
   3075                         rendersize = countsize(renderfilename + '.mp3')
   3076                     except:
   3077                         continue
   3078                     writemessage('audio rendering ' + str(int(rendersize)) + ' of ' + str(int(audiosize)) + ' kb done')
   3079                 ##MERGE AUDIO & VIDEO
   3080                 writemessage('Merging audio & video')
   3081                 #os.remove(renderfilename + '.mp4') 
   3082                 call(['MP4Box', '-rem', '2',  renderfilename + '_tmp.mp4'], shell=False)
   3083                 call(['MP4Box', '-add', renderfilename + '_tmp.mp4', '-add', renderfilename + '.mp3', '-new', renderfilename + '.mp4'], shell=False)
   3084                 os.remove(renderfilename + '_tmp.mp4')
   3085                 os.remove(renderfilename + '.mp3')
   3086         else:
   3087             print('Already rendered!')
   3088         q.put(renderfilename)
   3089     q = mp.Queue()
   3090     proc = mp.Process(target=render, args=(q,filmfolder,filmname,comp,scene))
   3091     proc.start()
   3092     procdone = False
   3093     status = ''
   3094     vumetermessage('press middlebutton to cancel')
   3095     while True:
   3096         if proc.is_alive() == False and procdone == False:
   3097             status = q.get()
   3098             print(status)
   3099             procdone = True
   3100             proc.join()
   3101             renderfilename = status
   3102             vumetermessage('')
   3103             break
   3104         if middlebutton() == True:
   3105             proc.terminate()
   3106             proc.join()
   3107             procdone = True
   3108             q=''
   3109             os.system('pkill MP4Box')
   3110             vumetermessage('canceled for now, maybe u want to render later ;)')
   3111             writemessage('press any button to continue')
   3112             print('canceling videorender')
   3113             renderfilename = ''
   3114             break
   3115     return renderfilename
   3116 
   3117 #-------------Get dub files-----------
   3118 
   3119 def getdubs(filmfolder, filmname, scene, shot):
   3120     #search for dub files
   3121     print('getting scene dubs')
   3122     dubfiles = []
   3123     dubmix = []
   3124     rerender = False
   3125     if scene > 0 and shot == 0:
   3126         filefolder = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/dub/'
   3127     elif scene > 0 and shot > 0:
   3128         filefolder = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/dub/'
   3129     else:
   3130         filefolder = filmfolder + filmname + '/dub/'
   3131     try:
   3132         allfiles = os.listdir(filefolder)
   3133     except:
   3134         print('no dubs')
   3135         return dubfiles, dubmix, rerender
   3136     for a in allfiles:
   3137         if 'dub' in a:
   3138             print('Dub audio found! ' + filefolder + a)
   3139             dubfiles.append(filefolder + a)
   3140     #check if dub mix has changed
   3141     dubnr = 1
   3142     for i in dubfiles:
   3143         dub = []
   3144         rendered_dub = []
   3145         try:
   3146             with open(filefolder + '.settings' + str(dubnr).zfill(3), 'r') as f:
   3147                 dubstr = f.read().splitlines()
   3148             for i in dubstr:
   3149                 dub.append(float(i))
   3150             print('dub ' + str(dubnr).zfill(3) + ' loaded!')
   3151             print(dub)
   3152         except:
   3153             print('cant find settings file')
   3154             dub = [1.0, 1.0, 0.0, 0.0]
   3155             with open(filefolder + ".settings" + str(dubnr).zfill(3), "w") as f:
   3156                 for i in dub:
   3157                     f.write(str(i) + '\n')
   3158         try:
   3159             with open(filefolder + '.rendered' + str(dubnr).zfill(3), 'r') as f:
   3160                 dubstr = f.read().splitlines()
   3161             for i in dubstr:
   3162                 rendered_dub.append(float(i))
   3163             print('rendered dub loaded')
   3164             print(rendered_dub)
   3165         except:
   3166             print('no rendered dubmix found!')
   3167         if rendered_dub != dub:
   3168             rerender = True
   3169         dubmix.append(dub)
   3170         dubnr += 1
   3171     return dubfiles, dubmix, rerender
   3172 
   3173 #------------Remove Dubs----------------
   3174 
   3175 def removedub(dubfolder, dubnr):
   3176     pressed = ''
   3177     buttonpressed = ''
   3178     buttontime = time.time()
   3179     holdbutton = ''
   3180     selected = 0
   3181     header = 'Are you sure you want to remove dub ' + str(dubnr) + '?'
   3182     menu = 'NO', 'YES'
   3183     settings = '', ''
   3184     while True:
   3185         writemenu(menu,settings,selected,header,showmenu)
   3186         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   3187         if pressed == 'right':
   3188             if selected < (len(menu) - 1):
   3189                 selected = selected + 1
   3190         elif pressed == 'left':
   3191             if selected > 0:
   3192                 selected = selected - 1
   3193         elif pressed == 'middle' and selected == 0:
   3194             logger.info('dont remove dub')
   3195             time.sleep(0.3)
   3196             break
   3197         elif pressed == 'middle' and selected == 1: 
   3198             os.system('rm ' + dubfolder + 'dub' + str(dubnr).zfill(3) + '.wav')
   3199             os.system('rm ' + dubfolder + '.settings' + str(dubnr).zfill(3))
   3200             os.system('rm ' + dubfolder + '.rendered' + str(dubnr).zfill(3))
   3201             time.sleep(0.5)
   3202             print(dubfolder)
   3203             dubs = next(os.walk(dubfolder))[2]
   3204             print(dubs)
   3205             for i in dubs:
   3206                 if 'dub' not in i:
   3207                     dubs.remove(i)
   3208             organized_nr = 1
   3209             for s in sorted(dubs):
   3210                 if '.wav' in s:
   3211                     print(s)
   3212                     unorganized_nr = int(s[3:-4])
   3213                     if organized_nr == unorganized_nr:
   3214                         print('correct')
   3215                         pass
   3216                     if organized_nr != unorganized_nr:
   3217                         print('false, correcting from ' + str(unorganized_nr) + ' to ' + str(organized_nr))
   3218                         run_command('mv ' + dubfolder + 'dub' + str(unorganized_nr).zfill(3) + '.wav ' + dubfolder + 'dub' + str(organized_nr).zfill(3) + '.wav')
   3219                         run_command('mv ' + dubfolder + '.settings' + str(unorganized_nr).zfill(3) + ' ' + dubfolder + '.settings' + str(organized_nr).zfill(3))
   3220                         run_command('mv ' + dubfolder + '.rendered' + str(unorganized_nr).zfill(3) + ' ' + dubfolder + '.rendered' + str(organized_nr).zfill(3))
   3221                     organized_nr += 1
   3222             logger.info('removed dub file!')
   3223             vumetermessage('dub removed!')
   3224             break
   3225         time.sleep(0.05)
   3226 
   3227 #-------------Clip settings---------------
   3228 
   3229 def clipsettings(filmfolder, filmname, scene, shot, plughw):
   3230     vumetermessage('press record, view or retake to be dubbing')
   3231     pressed = ''
   3232     buttonpressed = ''
   3233     buttontime = time.time()
   3234     holdbutton = ''
   3235     selected = 0
   3236     dubfiles = []
   3237     dubmix = []
   3238     dubmix_old = []
   3239     if scene > 0 and shot == 0:
   3240         header = 'Scene ' + str(scene) + ' dubbing settings'
   3241         filefolder = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/dub/'
   3242         dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, scene, 0)
   3243     elif scene > 0 and shot > 0:
   3244         header = 'Scene ' + str(scene) + ' shot ' + str(shot) + ' dubbing settings'
   3245         filefolder = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/dub/'
   3246         dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, scene, shot)
   3247     else:
   3248         header = 'Film ' + filmname + ' dubbing settings'
   3249         filefolder = filmfolder + filmname + '/dub/'
   3250         dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, 0, 0)
   3251     newdub = [1.0, 1.0, 0.1, 0.1]
   3252     dubselected = len(dubfiles) - 1
   3253     dubrecord = ''
   3254     while True:
   3255         nmix = round(newdub[0],1)
   3256         ndub = round(newdub[1],1)
   3257         nfadein = round(newdub[2],1)
   3258         nfadeout = round(newdub[3],1)
   3259         if dubfiles:
   3260             mix = round(dubmix[dubselected][0],1)
   3261             dub = round(dubmix[dubselected][1],1)
   3262             fadein = round(dubmix[dubselected][2],1)
   3263             fadeout = round(dubmix[dubselected][3],1)
   3264             menu = 'BACK', 'ADD:', '', '', 'DUB' + str(dubselected + 1) + ':', '', '', ''
   3265             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)
   3266         else:
   3267             menu = 'BACK', 'ADD:', '', ''
   3268             settings = '', 'd:' + str(nmix) + '/o:' + str(ndub), 'in:' + str(nfadein), 'out:' + str(nfadeout)
   3269         writemenu(menu,settings,selected,header,showmenu)
   3270         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   3271 
   3272         #NEW DUB SETTINGS
   3273         if pressed == 'up' and selected == 1:
   3274             if newdub[0] > 0.99 and newdub[1] > 0.01:
   3275                 newdub[1] -= 0.1
   3276             if newdub[1] > 0.99 and newdub[0] < 0.99:
   3277                 newdub[0] += 0.1
   3278         elif pressed == 'down' and selected == 1:
   3279             if newdub[1] > 0.99 and newdub[0] > 0.01:
   3280                 newdub[0] -= 0.1
   3281             if newdub[0] > 0.99 and newdub[1] < 0.99:
   3282                 newdub[1] += 0.1
   3283         elif pressed == 'up' and selected == 2:
   3284             newdub[2] += 0.1
   3285         elif pressed == 'down' and selected == 2:
   3286             if newdub[2] > 0.01:
   3287                 newdub[2] -= 0.1
   3288         elif pressed == 'up' and selected == 3:
   3289             newdub[3] += 0.1
   3290         elif pressed == 'down' and selected == 3:
   3291             if newdub[3] > 0.01:
   3292                 newdub[3] -= 0.1
   3293         elif pressed == 'record' and selected == 1:
   3294             dubmix.append(newdub)
   3295             dubrecord = filefolder + 'dub' + str(len(dubmix)).zfill(3) + '.wav'
   3296             break
   3297 
   3298         #DUB SETTINGS
   3299         elif pressed == 'up' and selected == 4:
   3300             if dubselected + 1 < len(dubfiles):
   3301                 dubselected = dubselected + 1
   3302         elif pressed == 'down' and selected == 4:
   3303             if dubselected > 0:
   3304                 dubselected = dubselected - 1
   3305         elif pressed == 'remove' and selected == 4:
   3306             removedub(filefolder, dubselected + 1)
   3307             dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, scene, shot)
   3308             dubselected = len(dubfiles) - 1
   3309             if len(dubfiles) == 0:
   3310                 selected = 0
   3311         elif pressed == 'record' and selected == 4:
   3312             dubrecord = filefolder + 'dub' + str(dubselected + 1).zfill(3) + '.wav'
   3313             break
   3314         elif pressed == 'up' and selected == 5:
   3315             if dubmix[dubselected][0] >= 0.99 and dubmix[dubselected][1] > 0.01:
   3316                 dubmix[dubselected][1] -= 0.1
   3317             if dubmix[dubselected][1] >= 0.99 and dubmix[dubselected][0] < 0.99:
   3318                 dubmix[dubselected][0] += 0.1
   3319         elif pressed == 'down' and selected == 5:
   3320             if dubmix[dubselected][1] >= 0.99 and dubmix[dubselected][0] > 0.01:
   3321                 dubmix[dubselected][0] -= 0.1
   3322             if dubmix[dubselected][0] >= 0.99 and dubmix[dubselected][1] < 0.99:
   3323                 dubmix[dubselected][1] += 0.1
   3324         elif pressed == 'up' and selected == 6:
   3325             dubmix[dubselected][2] += 0.1
   3326         elif pressed == 'down' and selected == 6:
   3327             if dubmix[dubselected][2] > 0.01:
   3328                 dubmix[dubselected][2] -= 0.1
   3329         elif pressed == 'up' and selected == 7:
   3330             dubmix[dubselected][3] += 0.1
   3331         elif pressed == 'down' and selected == 7:
   3332             if dubmix[dubselected][3] > 0.01:
   3333                 dubmix[dubselected][3] -= 0.1
   3334         elif pressed == 'right':
   3335             if selected < (len(settings) - 1):
   3336                 selected = selected + 1
   3337         elif pressed == 'left':
   3338             if selected > 0:
   3339                 selected = selected - 1
   3340         elif pressed == 'middle' and menu[selected] == 'BACK':
   3341             os.system('pkill aplay')
   3342             break
   3343         elif pressed == 'view': # mix dub and listen
   3344             run_command('pkill aplay')
   3345             dubfiles, dubmix, rerender = getdubs(filmfolder, filmname, scene, shot)
   3346             if scene:
   3347                 filename = filmfolder + filmname + '/scene' + str(scene).zfill(3) +'/scene'
   3348             else:
   3349                 filename = filmfolder + filmname + '/' + filmname
   3350             renderfilename = renderfilm(filmfolder, filmname, 0, scene, False)
   3351             playdub(filmname,renderfilename, 'scene')
   3352         time.sleep(0.05)
   3353     #Save dubmix before returning
   3354     if dubmix != dubmix_old:
   3355         if os.path.isdir(filefolder) == False:
   3356             os.makedirs(filefolder)
   3357         c = 1
   3358         for i in dubmix:
   3359             with open(filefolder + ".settings" + str(c).zfill(3), "w") as f:
   3360                 for p in i:
   3361                     f.write(str(round(p,1)) + '\n')
   3362                     print(str(round(p,1)))
   3363             c += 1
   3364         dubmix_old = dubmix
   3365     return dubrecord
   3366 
   3367 #---------------Play & DUB--------------------
   3368 
   3369 def playdub(filmname, filename, player_menu):
   3370     global headphoneslevel, miclevel, plughw, channels, filmfolder, scene, soundrate, soundformat
   3371     #read fastedit file
   3372     if player_menu == 'scene':
   3373         scenedir = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/'
   3374         try:
   3375             with open(scenedir + '.fastedit', 'r') as f:
   3376                 fastedit = f.read().splitlines()
   3377                 print(fastedit)
   3378         except:
   3379             print('no fastedit file found')
   3380             fastedit = 9999999
   3381     #omxplayer hack
   3382     os.system('rm /tmp/omxplayer*')
   3383     video = True
   3384     if player_menu == 'dub':
   3385         dub = True
   3386     else:
   3387         dub = False
   3388     if not os.path.isfile(filename + '.mp4'):
   3389         #should probably check if its not a corrupted video file
   3390         logger.info("no file to play")
   3391         if dub == True:
   3392             video = False
   3393         else:
   3394             return
   3395     t = 0
   3396     pressed = ''
   3397     buttonpressed = ''
   3398     buttontime = time.time()
   3399     holdbutton = ''
   3400     playing = False
   3401     pause = False
   3402     trim = False
   3403     videolag = 0
   3404     remove_shots = []
   3405     if video == True:
   3406         if player_menu == 'dubbb':
   3407             try:
   3408                 player = OMXPlayer(filename + '.mp4', args=['-n', '-1', '--fps', '25', '--layer', '3', '--no-osd', '--win', '0,15,800,475','--no-keys'], dbus_name='org.mpris.MediaPlayer2.omxplayer1', pause=True)
   3409             except:
   3410                 writemessage('Something wrong with omxplayer')
   3411                 time.sleep(0.5)
   3412                 return
   3413         else:
   3414             try:
   3415                 player = OMXPlayer(filename + '.mp4', args=['--adev', 'alsa:hw:'+str(plughw), '--fps', '25', '--layer', '3', '--no-osd', '--win', '0,15,800,475','--no-keys'], dbus_name='org.mpris.MediaPlayer2.omxplayer1', pause=True)
   3416             except:
   3417                 writemessage('Something wrong with omxplayer')
   3418                 time.sleep(0.5)
   3419                 return
   3420             #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)
   3421         writemessage('Loading...')
   3422         clipduration = player.duration()
   3423     #sound
   3424     #if player_menu != 'film':
   3425     #    try:
   3426     #        playerAudio = OMXPlayer(filename + '.wav', args=['--adev','alsa:hw:'+str(plughw)], dbus_name='org.mpris.MediaPlayer2.omxplayer2', pause=True)
   3427     #        time.sleep(0.2)
   3428     #    except:
   3429     #        writemessage('something wrong with audio player')
   3430     #        time.sleep(2)
   3431     #        return
   3432         #omxplayer hack to play really short videos.
   3433     if clipduration < 4:
   3434         logger.info("clip duration shorter than 4 sec")
   3435         player.previous()
   3436         if dub == True:
   3437             p = 0
   3438             while p < 3:
   3439                 writemessage('Dubbing in ' + str(3 - p) + 's')
   3440                 time.sleep(1)
   3441                 p+=1
   3442     if video == True:
   3443         player.play()
   3444         #run_command('aplay -D plughw:0 ' + filename + '.wav &')
   3445         #run_command('mplayer ' + filename + '.wav &')
   3446     if player_menu == 'dub':
   3447         run_command(tarinafolder + '/alsa-utils-1.1.3/aplay/arecord -D plughw:'+str(plughw)+' -f '+soundformat+' -c '+str(channels)+' -r '+soundrate+' -vv /dev/shm/dub.wav &')
   3448     time.sleep(0.5)
   3449     #try:
   3450     #    playerAudio.play()
   3451     #except:
   3452     #    logger.info('something wrong with omxplayer audio or playing film mp4 audio')
   3453         #logger.warning(e)
   3454     starttime = time.time()
   3455     selected = 1
   3456     while True:
   3457         if player_menu == 'scene':
   3458             fastedit_shot = 1
   3459             for i in fastedit:
   3460                 if int(t) > float(int(i)/1000):
   3461                     fastedit_shot = fastedit_shot + 1
   3462             if not remove_shots:
   3463                 vumetermessage('shot ' + str(fastedit_shot))
   3464             else:
   3465                 p = ''
   3466                 for i in remove_shots:
   3467                     p = p + str(i) + ','
   3468                 vumetermessage('shot ' + str(fastedit_shot) + ' remove:' + p)
   3469         if trim == True:
   3470             menu = 'CANCEL', 'FROM BEGINNING', 'FROM END'
   3471             settings = '','',''
   3472         elif pause == True:
   3473             if player_menu == 'shot':
   3474                 menu = 'BACK', 'PLAY', 'REPLAY', 'TRIM'
   3475                 settings = '','','',''
   3476             else:
   3477                 menu = 'BACK', 'PLAY', 'REPLAY'
   3478                 settings = '','',''
   3479         elif player_menu == 'dub': 
   3480             menu = 'BACK', 'REDUB', 'PHONES:', 'MIC:'
   3481             settings = '', '', str(headphoneslevel), str(miclevel)
   3482         else:
   3483             menu = 'BACK', 'PAUSE', 'REPLAY', 'PHONES:'
   3484             settings = '', '', '', str(headphoneslevel)
   3485         if dub == True:
   3486             header = 'Dubbing ' + str(round(t,1))
   3487         else:
   3488             header = 'Playing ' + str(round(t,1)) + ' of ' + str(clipduration) + ' s'
   3489         writemenu(menu,settings,selected,header,showmenu)
   3490         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   3491         if buttonpressed == True:
   3492             flushbutton()
   3493         if pressed == 'remove':
   3494             if fastedit_shot in remove_shots:
   3495                 remove_shots.remove(fastedit_shot)
   3496             else:
   3497                 remove_shots.append(fastedit_shot)
   3498             time.sleep(0.2)
   3499         elif pressed == 'right':
   3500             if selected < (len(settings) - 1):
   3501                 selected = selected + 1
   3502         elif pressed == 'left':
   3503             if selected > 0:
   3504                 selected = selected - 1
   3505         elif pressed == 'up':
   3506             if menu[selected] == 'PHONES:':
   3507                 if headphoneslevel < 100:
   3508                     headphoneslevel = headphoneslevel + 2
   3509                     run_command('amixer -c 0 sset Speaker ' + str(headphoneslevel) + '%')
   3510             elif menu[selected] == 'MIC:':
   3511                 if miclevel < 100:
   3512                     miclevel = miclevel + 2
   3513                     run_command('amixer -c 0 sset Mic ' + str(miclevel) + '% unmute')
   3514             else:
   3515                 try:
   3516                     player.set_position(t+2)
   3517                     #playerAudio.set_position(player.position())
   3518                 except:
   3519                     print('couldnt set position of player')
   3520         elif pressed == 'down':
   3521             if menu[selected] == 'PHONES:':
   3522                 if headphoneslevel > 0:
   3523                     headphoneslevel = headphoneslevel - 2
   3524                     run_command('amixer -c 0 sset Speaker ' + str(headphoneslevel) + '%')
   3525             elif menu[selected] == 'MIC:':
   3526                 if miclevel > 0:
   3527                     miclevel = miclevel - 2
   3528                     run_command('amixer -c 0 sset Mic ' + str(miclevel) + '% unmute')
   3529             else:
   3530                 if t > 1:
   3531                     try:
   3532                         player.set_position(t-2)
   3533                         #playerAudio.set_position(player.position())
   3534                     except:
   3535                         print('couldnt set position of player')
   3536         elif pressed == 'middle':
   3537             time.sleep(0.2)
   3538             if menu[selected] == 'BACK' or player.playback_status() == "Stopped":
   3539                 try:
   3540                     if video == True:
   3541                         #player.stop()
   3542                         #playerAudio.stop()
   3543                         player.quit()
   3544                         #playerAudio.quit()
   3545                     #os.system('pkill -9 aplay') 
   3546                 except:
   3547                     #kill it if it dont stop
   3548                     print('OMG! kill dbus-daemon')
   3549                 if dub == True:
   3550                     os.system('pkill arecord')
   3551                     time.sleep(0.2)
   3552                 os.system('pkill -9 omxplayer')
   3553                 #os.system('pkill -9 dbus-daemon')
   3554                 return remove_shots
   3555             elif menu[selected] == 'REPLAY' or menu[selected] == 'REDUB':
   3556                 pause = False
   3557                 try:
   3558                     os.system('pkill aplay')
   3559                     if dub == True:
   3560                         os.system('pkill arecord')
   3561                     if video == True:
   3562                         player.pause()
   3563                         player.set_position(0)
   3564                         #if player_menu != 'film':
   3565                             #playerAudio.pause()
   3566                             #playerAudio.set_position(0)
   3567                     if dub == True:
   3568                         p = 0
   3569                         while p < 3:
   3570                             writemessage('Dubbing in ' + str(3 - p) + 's')
   3571                             time.sleep(1)
   3572                             p+=1
   3573                     player.play()
   3574                     #if player_menu != 'film':
   3575                     #    playerAudio.play()
   3576                     #run_command('aplay -D plughw:0 ' + filename + '.wav &')
   3577                     if dub == True:
   3578                         run_command(tarinafolder + '/alsa-utils-1.1.3/aplay/arecord -D plughw:'+str(plughw)+' -f '+soundformat+' -c '+str(channels)+' -r '+soundrate+' -vv /dev/shm/dub.wav &')
   3579                 except:
   3580                     pass
   3581                 starttime = time.time()
   3582             elif menu[selected] == 'PAUSE':
   3583                 player.pause()
   3584                 #try:
   3585                 #    playerAudio.pause()
   3586                 #except:
   3587                 #    pass
   3588                 pause = True
   3589             elif menu[selected] == 'PLAY':
   3590                 player.play()
   3591                 #try:
   3592                 #    playerAudio.play()
   3593                 #except:
   3594                 #    pass
   3595                 pause = False
   3596             elif menu[selected] == 'TRIM':
   3597                 selected = 1
   3598                 trim = True
   3599             elif menu[selected] == 'CANCEL':
   3600                 selected = 1
   3601                 trim = False
   3602             elif menu[selected] == 'FROM BEGINNING':
   3603                 trim = ['beginning', player.position()]
   3604                 player.quit()
   3605                 #playerAudio.quit()
   3606                 return trim
   3607             elif menu[selected] == 'FROM END':
   3608                 trim = ['end', player.position()]
   3609                 player.quit()
   3610                 #playerAudio.quit()
   3611                 return trim
   3612         time.sleep(0.02)
   3613         if pause == False:
   3614             try:
   3615                 t = player.position()
   3616             except:
   3617                 os.system('pkill aplay') 
   3618                 if dub == True:
   3619                     os.system('pkill arecord')
   3620                 return remove_shots
   3621     player.quit()
   3622     #playerAudio.quit()
   3623     #os.system('pkill dbus-daemon')
   3624 
   3625 #---------------View Film--------------------
   3626 
   3627 def viewfilm(filmfolder, filmname):
   3628     scenes, shots, takes = countlast(filmname, filmfolder)
   3629     scene = 1
   3630     filmfiles = []
   3631     while scene <= scenes:
   3632         shots = countshots(filmname, filmfolder, scene)
   3633         if shots > 0:
   3634             filmfiles.extend(shotfiles(filmfolder, filmname, scene))
   3635         scene = scene + 1
   3636     return filmfiles
   3637 
   3638 #---------------Video Trim--------------------
   3639 
   3640 def videotrim(filename, trim_filename, where, s):
   3641     #theres two different ways of non-rerendering mp4 cut techniques that i know MP4Box and ffmpeg
   3642     if where == 'beginning':
   3643         logger.info('trimming clip from beginning')
   3644         #run_command('ffmpeg -ss ' + str(s) + ' -i ' + filename + '.mp4 -c copy ' + trim_filename + '.mp4')
   3645         run_command('MP4Box ' + filename + '.mp4 -splitx ' + str(s) + ':end -out ' + trim_filename + '.mp4')
   3646         run_command('cp ' + filename + '.wav ' + trim_filename + '.wav')
   3647         audiotrim(trim_filename, 'beginning')
   3648     if where == 'end':
   3649         logger.info('trimming clip from end')
   3650         #run_command('ffmpeg -to ' + str(s) + ' -i ' + filename + '.mp4 -c copy ' + trim_filename + '.mp4')
   3651         run_command('MP4Box ' + filename + '.mp4 -splitx 0:' + str(s) + ' -out ' + trim_filename + '.mp4')
   3652         run_command('cp ' + filename + '.wav ' + trim_filename + '.wav')
   3653         audiotrim(trim_filename, 'end')
   3654     #take last frame 
   3655     run_command('ffmpeg -sseof -1 -i ' + trim_filename + '.mp4 -update 1 -q:v 1 -vf scale=800:450 ' + trim_filename + '.jpeg')
   3656     return
   3657 
   3658 #--------------Get Audio cards--------------
   3659 def getaudiocards():
   3660     with open("/proc/asound/cards") as fp:
   3661         cards = fp.readlines()
   3662     audiocards = []
   3663     for i in cards:
   3664         if i[1] in ['0','1','2','3']:
   3665             print('audio card 0: ' + i[22:].rstrip('\n'))
   3666             audiocards.append(i[22:].rstrip('\n'))
   3667     return audiocards
   3668 
   3669 #--------------Audio Trim--------------------
   3670 # make audio file same lenght as video file
   3671 def audiotrim(filename, where):
   3672     global channels, fps
   3673     audiosync=0
   3674     print("chaaaaaaaaaaaaaaaanel8: " +str(channels))
   3675     writemessage('Audio syncing..')
   3676     pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + filename + '.mp4', shell=True)
   3677     videolenght = pipe.decode().strip()
   3678     print('videolenght:'+str(videolenght))
   3679     try:
   3680         pipe = subprocess.check_output('mediainfo --Inform="Audio;%Duration%" ' + filename + '.wav', shell=True)
   3681         audiolenght = pipe.decode().strip()
   3682     except:
   3683         audiosilence('',filename)
   3684         audiolenght=videolenght
   3685     #if there is no audio lenght
   3686     logger.info('audio is:' + audiolenght)
   3687     if not audiolenght.strip():
   3688         audiolenght = 0
   3689     #separate seconds and milliseconds
   3690     #videoms = int(videolenght) % 1000
   3691     #audioms = int(audiolenght) % 1000
   3692     #videos = int(videolenght) / 1000
   3693     #audios = int(audiolenght) / 1000
   3694     elif int(audiolenght) > int(videolenght):
   3695         #calculate difference
   3696         audiosync = int(audiolenght) - int(videolenght)
   3697         newaudiolenght = int(audiolenght) - audiosync
   3698         logger.info('Audiofile is: ' + str(audiosync) + 'ms longer')
   3699         #trim from end or beginning and put a 0.01 in- and outfade
   3700         if where == 'end':
   3701             run_command('sox -V0 ' + filename + '.wav ' + filename + '_temp.wav trim 0 -' + str(int(audiosync)/1000))
   3702         if where == 'beginning':
   3703             run_command('sox -V0 ' + filename + '.wav ' + filename + '_temp.wav trim ' + str(int(audiosync)/1000))
   3704         else:
   3705             run_command('sox -V0 -G ' + filename + '_temp.wav ' + filename + '.wav fade 0.01 0 0.01')
   3706         os.remove(filename + '_temp.wav')
   3707         #if int(audiosync) > 400:
   3708         #    writemessage('WARNING!!! VIDEO FRAMES DROPPED!')
   3709         #    vumetermessage('Consider changing to a faster microsd card.')
   3710         #    time.sleep(10)
   3711         delayerr = 'A' + str(audiosync)
   3712         print(delayerr)
   3713     elif int(audiolenght) < int(videolenght):
   3714         audiosync = int(videolenght) - int(audiolenght)
   3715         #calculate difference
   3716         #audiosyncs = videos - audios
   3717         #audiosyncms = videoms - audioms
   3718         #if audiosyncms < 0:
   3719         #    if audiosyncs > 0:
   3720         #        audiosyncs = audiosyncs - 1
   3721         #    audiosyncms = 1000 + audiosyncms
   3722         logger.info('Videofile is: ' + str(audiosync) + 'ms longer')
   3723         #make fade
   3724         #make delay file
   3725         print(str(int(audiosync)/1000))
   3726         run_command('sox -V0 -r '+soundrate+' -c '+str(channels)+' '+filename+'.wav '+filename+'_temp.wav trim 0.0 pad 0 ' + str(int(audiosync)/1000))
   3727         run_command('sox -V0 -G ' + filename + '_temp.wav ' + filename + '.wav fade 0.01 0 0.01')
   3728         #add silence to end
   3729         #run_command('sox -V0 /dev/shm/silence.wav ' + filename + '_temp.wav')
   3730         #run_command('cp '+filename+'.wav '+filename+'_temp.wav')
   3731         #run_command('sox -V0 -G ' + filename + '_temp.wav /dev/shm/silence.wav ' + filename + '.wav')
   3732         #os.remove(filename + '_temp.wav')
   3733         #os.remove('/dev/shm/silence.wav')
   3734         delayerr = 'V' + str(audiosync)
   3735         print(delayerr)
   3736     #os.remove('/dev/shm/' + filename + '.wav')
   3737     return float(audiosync)/1000, int(videolenght), int(audiolenght)
   3738     #os.system('mv audiosynced.wav ' + filename + '.wav')
   3739     #os.system('rm silence.wav')
   3740 
   3741 #--------------Audiosilence--------------------
   3742 # make an empty audio file as long as a video file
   3743 
   3744 def audiosilence(foldername,filename):
   3745     global channels
   3746     writemessage('Creating audiosilence..')
   3747     pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + foldername + filename + '.mp4', shell=True)
   3748     videolenght = pipe.decode()
   3749     logger.info('Video lenght is ' + videolenght)
   3750     #separate seconds and milliseconds
   3751     videoms = int(videolenght) % 1000
   3752     videos = int(videolenght) / 1000
   3753     logger.info('Videofile is: ' + str(videos) + 's ' + str(videoms))
   3754     run_command('sox -V0 -n -r '+soundrate+' -c '+str(channels)+' /dev/shm/silence.wav trim 0.0 ' + str(videos))
   3755     os.system('cp /dev/shm/silence.wav ' + foldername + filename + '.wav')
   3756     os.system('rm /dev/shm/silence.wav')
   3757 
   3758 #--------------Copy to USB-------------------
   3759 
   3760 def copytousb(filmfolder):
   3761     pressed = ''
   3762     buttonpressed = ''
   3763     buttontime = time.time()
   3764     holdbutton = ''
   3765     writemessage('Searching for usb storage device, middlebutton to cancel')
   3766     films = getfilms(filmfolder)
   3767     while True:
   3768         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   3769         usbconnected = os.path.ismount('/media/usb0')
   3770         if pressed == 'middle':
   3771             writemessage('canceling..')
   3772             time.sleep(2)
   3773             break
   3774         time.sleep(0.02)
   3775         if usbconnected == True:
   3776             #Copy new files to usb device
   3777             try:
   3778                 os.makedirs('/media/usb0/tarinafilms/')
   3779             except:
   3780                 pass
   3781             try:
   3782                 p = subprocess.check_output('stat -f -c %T /media/usb0', shell=True)
   3783                 filesystem = p.decode()
   3784                 print('filesystem info: ' + filesystem)
   3785             except:
   3786                 writemessage('Oh-no! dont know your filesystem')
   3787                 waitforanykey()
   3788                 return
   3789             for filmname in films:
   3790                 #check filmhash
   3791                 filmname = filmname[0]
   3792                 usbpath = '/media/usb0/tarinafilms/'+filmname
   3793                 usbfilmhash = ''
   3794                 filmhash = ''
   3795                 while True:
   3796                     if os.path.exists(usbpath) == False:
   3797                         break
   3798                     try:
   3799                         with open(filmfolder + filmname + '/.filmhash', 'r') as f:
   3800                             filmhash = f.readline().strip()
   3801                         print('filmhash is: ' + filmhash)
   3802                     except:
   3803                         print('no filmhash found!')
   3804                     try:
   3805                         with open(usbpath + '/.filmhash', 'r') as f:
   3806                             usbfilmhash = f.readline().strip()
   3807                         print('usbfilmhash is: ' + usbfilmhash)
   3808                     except:
   3809                         print('no usbfilmhash found!')
   3810                     if usbfilmhash == filmhash:
   3811                         print('same moviefilm found, updating clips...')
   3812                         break
   3813                     else:
   3814                         writemessage('Found a subsequent moviefilm...')
   3815                         print('same film exist with different filmhashes, copying to subsequent film folder')
   3816                         time.sleep(2)
   3817                         usbpath += '_new'
   3818                 try:
   3819                     os.makedirs(usbpath)
   3820                     writemessage('Copying film ' + filmname + '...')
   3821                 except:
   3822                     writemessage('Found existing ' + filmname + ', copying new files... ')
   3823                 try:
   3824                     run_command('rsync -avr -P ' + filmfolder + filmname + ' ' + usbpath)
   3825                 except:
   3826                     writemessage('couldnt copy film ' + filmname)
   3827                     waitforanykey()
   3828                     return
   3829             run_command('sync')
   3830             run_command('pumount /media/usb0')
   3831             writemessage('all files copied successfully!')
   3832             waitforanykey()
   3833             writemessage('You can safely unplug the usb device now')
   3834             time.sleep(2)
   3835             return
   3836 
   3837 #-----------Check for the webz---------
   3838 
   3839 def webz_on():
   3840     try:
   3841         # connect to the host -- tells us if the host is actually
   3842         # reachable
   3843         socket.create_connection(("google.com", 80))
   3844         return True
   3845     except OSError:
   3846         pass
   3847     writemessage('No internet connection!')
   3848     time.sleep(2)
   3849     return False
   3850 
   3851 #-------------Upload film------------
   3852 
   3853 def uploadfilm(filename, filmname):
   3854     pressed = ''
   3855     buttonpressed = ''
   3856     buttontime = time.time()
   3857     holdbutton = ''
   3858     mods = ['Back']
   3859     settings = ['']
   3860     writemessage('Searching for upload mods')
   3861     with open(tarinafolder + '/mods/upload-mods-enabled') as m:
   3862         mods.extend(m.read().splitlines())
   3863     for m in mods:
   3864         settings.append('')
   3865     menu = mods
   3866     selected = 0
   3867     while True:
   3868         header = 'Where do you want to upload?'
   3869         writemenu(menu,settings,selected,header,showmenu)
   3870         pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton)
   3871         if pressed == 'right':
   3872             if selected < (len(menu) - 1):
   3873                 selected = selected + 1
   3874         elif pressed == 'left':
   3875             if selected > 0:
   3876                 selected = selected - 1
   3877         elif pressed == 'middle' and  menu[selected] == 'Back':
   3878             return None
   3879         elif pressed == 'middle' and  menu[selected] in mods:
   3880             cmd = tarinafolder + '/mods/' + menu[selected] + '.sh ' + filmname + ' ' + filename + '.mp4'
   3881             return cmd
   3882         time.sleep(0.02)
   3883 
   3884 
   3885 #-------------Streaming---------------
   3886 
   3887 def startstream(camera, stream, plughw, channels):
   3888     #youtube
   3889     #youtube="rtmp://a.rtmp.youtube.com/live2/"
   3890     #with open("/home/pi/.youtube-live") as fp:
   3891     #    key = fp.readlines()
   3892     #print('using key: ' + key[0])
   3893     #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 flv ' + youtube + key[0]
   3894     #
   3895     #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'
   3896     #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'
   3897     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 -f mpegts udp://10.42.0.169:5002'
   3898     try:
   3899         stream = subprocess.Popen(stream_cmd, shell=True, stdin=subprocess.PIPE) 
   3900         camera.start_recording(stream.stdin, splitter_port=2, format='h264', bitrate = 55555)
   3901     except:
   3902         stream = ''
   3903     #now = time.strftime("%Y-%m-%d-%H:%M:%S") 
   3904     return stream
   3905 
   3906 def stopstream(camera, stream):
   3907     camera.stop_recording(splitter_port=2) 
   3908     os.system('pkill -9 ffmpeg') 
   3909     print("Camera safely shut down") 
   3910     print("Good bye")
   3911     stream = ''
   3912     return stream
   3913 
   3914 #-------------Beeps-------------------
   3915 
   3916 def beep():
   3917     buzzerrepetitions = 100
   3918     buzzerdelay = 0.00001
   3919     for _ in range(buzzerrepetitions):
   3920         for value in [0xC, 0x4]:
   3921             #GPIO.output(1, value)
   3922             bus.write_byte_data(DEVICE,OLATA,value)
   3923             time.sleep(buzzerdelay)
   3924     return
   3925 
   3926 def longbeep():
   3927     buzzerrepetitions = 100
   3928     buzzerdelay = 0.0001
   3929     for _ in range(buzzerrepetitions * 5):
   3930         for value in [0xC, 0x4]:
   3931             #GPIO.output(1, value)
   3932             bus.write_byte_data(DEVICE,OLATA,value)
   3933             buzzerdelay = buzzerdelay - 0.00000004
   3934             time.sleep(buzzerdelay)
   3935     bus.write_byte_data(DEVICE,OLATA,0x4)
   3936     return
   3937 
   3938 def buzz(buzzerlenght):
   3939     buzzerdelay = 0.0001
   3940     for _ in range(buzzerlenght):
   3941         for value in [0xC, 0x4]:
   3942             #GPIO.output(1, value)
   3943             bus.write_byte_data(DEVICE,OLATA,value)
   3944             time.sleep(buzzerdelay)
   3945     return
   3946 
   3947 #---------reading in a lens shading table----------
   3948 
   3949 def read_table(inFile):
   3950     # q&d-way to read in ls_table.h
   3951     ls_table = []
   3952     channel  = []
   3953     with open(inFile) as file:       
   3954         for line in file:
   3955             # we skip the unimportant stuff
   3956             if not (   line.startswith("uint") \
   3957                     or line.startswith("}")):
   3958                 # the comments separate the color planes
   3959                 if line.startswith("//"):                
   3960                     channel = []
   3961                     ls_table.append(channel)
   3962                 else:
   3963                     # scan in a single line
   3964                     line = line.replace(',','')
   3965                     lineData = [int(x) for x in line.split()]
   3966                     channel.append(lineData)
   3967     return np.array(ls_table,dtype=np.uint8)    
   3968 
   3969 #-------------Check if file empty----------
   3970 
   3971 def empty(filename):
   3972     if os.path.isfile(filename + '.mp4') == False:
   3973         return False
   3974     if os.path.isfile(filename + '.mp4') == True:
   3975         writemessage('Take already exists')
   3976         time.sleep(2)
   3977         return True
   3978 
   3979 #--------------BUTTONS-------------
   3980 
   3981 def waitforanykey():
   3982     vumetermessage("press any key to continue..")
   3983     time.sleep(1)
   3984     while True:
   3985         with term.cbreak():
   3986             val = term.inkey(timeout=0)
   3987         if not val:
   3988             event = ''
   3989         elif val.is_sequence:
   3990             event = val.name
   3991         elif val:
   3992             event = val
   3993         if i2cbuttons == True:
   3994             readbus = bus.read_byte_data(DEVICE,GPIOB)
   3995             readbus2 = bus.read_byte_data(DEVICE,GPIOA)
   3996         else:
   3997             readbus = 255
   3998             readbus2 = 247
   3999         if readbus != 255 or readbus2 != 247 or event != '':
   4000             time.sleep(0.05)
   4001             vumetermessage(' ')
   4002             return
   4003 
   4004 def middlebutton():
   4005     with term.cbreak():
   4006         val = term.inkey(timeout=0)
   4007     if val.is_sequence:
   4008         event = val.name
   4009         #print(event)
   4010     elif val:
   4011         event = val
   4012         #print(event)
   4013     else:
   4014         event = ''
   4015     if i2cbuttons == True:
   4016         readbus = bus.read_byte_data(DEVICE,GPIOB)
   4017         readbus2 = bus.read_byte_data(DEVICE,GPIOA)
   4018         if readbus != 255:
   4019             print('i2cbutton pressed: ' + str(readbus))
   4020         if readbus2 != 247:
   4021             print('i2cbutton pressed: ' + str(readbus2))
   4022     else:
   4023         readbus = 255
   4024         readbus2 = 247
   4025     pressed = ''
   4026     if event == 'KEY_ENTER' or event == 10 or event == 13 or (readbus == 247 and readbus2 == 247):
   4027         pressed = 'middle'
   4028         return True
   4029     return False
   4030 
   4031 def flushbutton():
   4032     with term.cbreak():
   4033         while True:
   4034             inp = term.inkey(timeout=0)
   4035             #print('flushing ' + repr(inp))
   4036             if inp == '':
   4037                 break
   4038 
   4039 def getbutton(lastbutton, buttonpressed, buttontime, holdbutton):
   4040     global i2cbuttons, serverstate, nextstatus, process, que, tarinactrl_ip, recording, onlysound, filmname, filmfolder, scene, shot, take, selected, camera, loadfilmsettings, selected, newfilmname
   4041     #Check controller
   4042     pressed = ''
   4043     nextstatus = ''
   4044     try:
   4045         if process.is_alive() == False and serverstate == 'on':
   4046             nextstatus = que.get()
   4047             if "*" in nextstatus:
   4048                 tarinactrl_ip = nextstatus.split('*')[1]
   4049                 nextstatus = nextstatus.split('*')[0]
   4050                 print('tarinactrl ip:' + tarinactrl_ip)
   4051             process = Process(target=listenforclients, args=("0.0.0.0", port, que))
   4052             process.start()
   4053             if 'SELECTED' in nextstatus:
   4054                 try:
   4055                     selected=int(nextstatus.split(':')[1])
   4056                 except:
   4057                     print('wtf?')
   4058             if nextstatus=="PICTURE":
   4059                 pressed="picture"
   4060             elif nextstatus=="UP":
   4061                 pressed="up"
   4062             elif nextstatus=="DOWN":
   4063                 pressed="down"
   4064             elif nextstatus=="LEFT":
   4065                 pressed="left"
   4066             elif nextstatus=="RIGHT":
   4067                 pressed="right"
   4068             elif nextstatus=="VIEW":
   4069                 pressed="view"
   4070             elif nextstatus=="MIDDLE":
   4071                 pressed="middle"
   4072             elif nextstatus=="DELETE":
   4073                 pressed="remove"
   4074             elif nextstatus=="REC":
   4075                 pressed="record_now"
   4076             elif nextstatus=="RETAKE":
   4077                 pressed="retake_now"
   4078             elif nextstatus=="STOP":
   4079                 if recording == True:
   4080                     pressed="record"
   4081             elif nextstatus=="STOPRETAKE":
   4082                 if recording == True:
   4083                     pressed="retake"
   4084             elif nextstatus=="RECSOUND":
   4085                 if recording==False:
   4086                     pressed="record"
   4087                     onlysound=True
   4088             elif nextstatus=="PLACEHOLDER":
   4089                 #selected=2
   4090                 pressed="insert_shot"
   4091             elif nextstatus=="NEWSCENE":
   4092                 pressed="new_scene"
   4093             elif "NEWFILM:" in nextstatus:
   4094                 newfilmname = nextstatus.split(':')[1]
   4095                 pressed="new_film"
   4096             elif "SYNCIP:" in nextstatus:
   4097                 ip = nextstatus.split(':')[1]
   4098                 stopinterface(camera)
   4099                 run_command('rsync -avr --update --progress --exclude="*.wav" pi@'+ip+':'+filmfolder+filmname+'/'+'scene'+str(scene).zfill(3)+' '+filmfolder+filmname+'/')
   4100                 sendtoserver(tarinactrl_ip,port,'SYNCDONE')
   4101                 #run_command('scp -r '+filmfolder+filmname+'/'+'scene'+str(scene).zfill(3)+' pi@'+ip+':'+filmfolder+filmname+'/')
   4102                 startinterface()
   4103                 camera = startcamera(lens,fps)
   4104                 loadfilmsettings = True
   4105             #print(nextstatus)
   4106     except:
   4107         print('process not found')
   4108     with term.cbreak():
   4109         val = term.inkey(timeout=0)
   4110     if val.is_sequence:
   4111         event = val.name
   4112         #print(event)
   4113     elif val:
   4114         event = val
   4115         #print(event)
   4116     else:
   4117         event = ''
   4118     keydelay = 0.08
   4119     if i2cbuttons == True:
   4120         readbus = bus.read_byte_data(DEVICE,GPIOB)
   4121         readbus2 = bus.read_byte_data(DEVICE,GPIOA)
   4122         if readbus == 0:
   4123             readbus = 255
   4124         if readbus2 == 0:
   4125             readbus2 = 247
   4126         if readbus != 255:
   4127             print('i2cbutton readbus pressed: ' + str(readbus))
   4128         if readbus2 != 247:
   4129             print('i2cbutton readbus2 pressed: ' + str(readbus2))
   4130     else:
   4131         readbus = 255
   4132         readbus2 = 247
   4133     if buttonpressed == False:
   4134         if event != '':
   4135             print(term.clear+term.home)
   4136         if event == 27:
   4137             pressed = 'quit'
   4138         elif event == 'KEY_ENTER' or event == 10 or event == 13 or (readbus == 247 and readbus2 == 247):
   4139             pressed = 'middle'
   4140         elif event == 'KEY_UP' or (readbus == 191 and readbus2 == 247):
   4141             pressed = 'up'
   4142         elif event == 'KEY_DOWN' or (readbus == 254 and readbus2 == 247):
   4143             pressed = 'down'
   4144         elif event == 'KEY_LEFT' or (readbus == 239 and readbus2 == 247):
   4145             pressed = 'left'
   4146         elif event == 'KEY_RIGHT' or (readbus == 251 and readbus2 == 247):
   4147             pressed = 'right'
   4148         elif event == 'KEY_PGUP' or event == ' ' or (readbus == 127 and readbus2 == 247):
   4149             pressed = 'record'
   4150         elif event == 'KEY_PGDOWN' or (readbus == 253 and readbus2 == 247):
   4151             pressed = 'retake'
   4152         elif event == 'KEY_TAB' or (readbus == 223 and readbus2 == 247):
   4153             pressed = 'view'
   4154         elif event == 'KEY_DELETE' or readbus2 == 246:
   4155             pressed = 'remove'
   4156         elif (readbus2 == 245 and readbus == 191):
   4157             pressed = 'peak'
   4158         elif (readbus2 == 245 and readbus == 223):
   4159             pressed = 'screen'
   4160         elif (readbus2 == 245 and readbus == 127):
   4161             pressed = 'showmenu'
   4162         elif (readbus2 == 245 and readbus == 251):
   4163             pressed = 'showhelp'
   4164         elif (readbus2 == 244):
   4165             pressed = 'changemode'
   4166         elif event == 'I' or event == 'P' or (readbus2 == 245 and readbus == 239):
   4167             pressed = 'insert'
   4168         elif event == 'C' or (readbus2 == 245 and readbus == 254):
   4169             pressed = 'copy'
   4170         elif event == 'M' or (readbus2 == 245 and readbus == 253):
   4171             pressed = 'move'
   4172         #elif readbus2 == 247:
   4173         #    pressed = 'shutdown'
   4174         #if pressed != '':
   4175             #print(pressed)
   4176         buttontime = time.time()
   4177         holdbutton = pressed
   4178         buttonpressed = True
   4179     if readbus == 255 and event == '' and nextstatus == '' :
   4180         buttonpressed = False
   4181     if float(time.time() - buttontime) > 0.2 and buttonpressed == True:
   4182         if holdbutton == 'up' or holdbutton == 'down' or holdbutton == 'right' or holdbutton == 'left' or holdbutton == 'shutdown' or holdbutton == 'remove':
   4183             pressed = holdbutton
   4184             keydelay = 0.02
   4185     if time.time() - buttontime > 2 and buttonpressed == True:
   4186         keydelay = 0.02
   4187     if time.time() - buttontime > 4 and buttonpressed == True:
   4188         keydelay = 0.01
   4189     return pressed, buttonpressed, buttontime, holdbutton, event, keydelay
   4190 
   4191 def startinterface():
   4192     call(['./startinterface.sh &'], shell = True)
   4193 
   4194 def stopinterface(camera):
   4195     try:
   4196         camera.stop_preview()
   4197         camera.close()
   4198     except:
   4199         print('no camera to close')
   4200     os.system('pkill arecord')
   4201     os.system('pkill startinterface')
   4202     os.system('pkill tarinagui')
   4203     run_command('sudo systemctl stop apache2')
   4204     return camera
   4205 
   4206 def startcamera(lens, fps):
   4207     global camera_model, fps_selection, fps_selected, cammode
   4208     camera = picamera.PiCamera()
   4209     if cammode == 'film':
   4210         reso=(1920,1080)
   4211     elif cammode == 'picture':
   4212         reso=(4056,3040)
   4213     camera.resolution = reso #tested modes 1920x816, 1296x552/578, v2 1640x698, 1640x1232, hqbinned 2028x1080, full 4056x3040
   4214     #Background image
   4215     underlay = None
   4216     bakgimg = tarinafolder + '/extras/bakg.jpg'
   4217     displaybakg(camera, bakgimg, underlay, 2)
   4218     #lensshade = ''
   4219     #npzfile = np.load('lenses/' + lens)
   4220     #lensshade = npzfile['lens_shading_table']
   4221     #
   4222     #camera frame rate sync to audio clock
   4223     #
   4224     camera_model, camera_revision = getconfig(camera)
   4225     # v1 = 'ov5647'
   4226     # v2 = ? 
   4227     logger.info("picamera version is: " + camera_model + ' ' + camera_revision)
   4228     if camera_model == 'imx219':
   4229         table = read_table('lenses/' + lens)
   4230         camera.lens_shading_table = table
   4231         camera.framerate = 24.999
   4232     elif camera_model == 'ov5647':
   4233         table = read_table('lenses/' + lens)
   4234         camera.lens_shading_table = table
   4235         # Different versions of ov5647 with different clock speeds, need to make a config file
   4236         # if there's more frames then the video will be longer when converting it to 25 fps,
   4237         # I try to get it as perfect as possible with trial and error.
   4238         # ov5647 Rev C
   4239         if camera_revision == 'rev.C':
   4240             camera.framerate = 26.03
   4241         # ov5647 Rev D"
   4242         if camera_revision == 'rev.D':
   4243             camera.framerate = 23.15
   4244     elif camera_model == 'imx477':
   4245         fps_selection=[5,15,24.985,35,49]
   4246         fps=fps_selection[fps_selected]
   4247         camera.framerate = fps 
   4248     else:
   4249         camera.framerate = fps
   4250     camera.crop = (0, 0, 1.0, 1.0)
   4251     camera.video_stabilization = True
   4252     camera.led = False
   4253     #lens_shading_table = np.zeros(camera._lens_shading_table_shape(), dtype=np.uint8) + 32
   4254     #camera.lens_shading_table = lens_shading_table
   4255     camera.start_preview()
   4256     camera.awb_mode = 'auto'
   4257     time.sleep(1)
   4258     return camera
   4259 
   4260 def tarinaserver(state):
   4261     #Tarina server
   4262     if state == True:
   4263         #Try to run apache
   4264         try:
   4265             run_command('sudo systemctl start apache2')
   4266             return 'on'
   4267         except:
   4268             writemessage("could not run tarina server")
   4269             time.sleep(2)
   4270             return 'off'
   4271     if state == False:
   4272         run_command('sudo systemctl stop apache2')
   4273         return 'off'
   4274 
   4275 if __name__ == '__main__':
   4276     import sys
   4277     try:
   4278         main()
   4279     except:
   4280         os.system('pkill arecord')
   4281         os.system('pkill startinterface')
   4282         os.system('pkill tarinagui')
   4283         print('Unexpected error : ', sys.exc_info()[0], sys.exc_info()[1])