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