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