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