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