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