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