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