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