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