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