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