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