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