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