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