tarina.py (213405B)
1 #!/usr/bin/env python3 2 # -*- coding: utf-8 -*- 3 4 5 # ```````` `````` ``````` ``` ```` ``` `````` 6 # ` ``` ` `` ``` ``` ``` ``` ```` `` `` ``` 7 # ``` ``````` ``` ```` ``` ```````` `````` 8 # ``` `` `` `````` ``` `` ````` ``` `` 9 # ``` ``` ``` ``` ``` ``` ``` ```` ``` ``` 10 # ```` ``` ```` ``` ``` ``` ```` ``` ``` ```` 11 12 # a Muse of Filmmaking 13 # https://tarina.org 14 15 import picamerax as picamera 16 import numpy as np 17 import string 18 import os 19 import time 20 import datetime 21 import multiprocessing as mp 22 from subprocess import call 23 from subprocess import Popen 24 from omxplayer import OMXPlayer 25 from multiprocessing import Process, Queue 26 import subprocess 27 import sys 28 import pickle 29 import RPi.GPIO as GPIO 30 from PIL import Image 31 import socket 32 import configparser 33 import shortuuid 34 import smbus 35 import ifaddr 36 import web 37 38 #import shlex 39 from blessed import Terminal 40 41 # bless the code! 42 term = Terminal() 43 44 #DEBIAN VERSION 45 pipe = subprocess.check_output('lsb_release -c -s', shell=True) 46 debianversion = pipe.decode().strip() 47 print('running debian ' + debianversion) 48 49 #I2CBUTTONS 50 probei2c = 0 51 while probei2c < 3: 52 try: 53 if debianversion == "stretch": 54 os.system('sudo modprobe i2c-dev') 55 bus = smbus.SMBus(3) # Rev 2 Pi uses 1 56 else: 57 os.system('sudo modprobe i2c-dev') 58 bus = smbus.SMBus(11) # Rev 2 Pi uses 1 59 DEVICE = 0x20 # Device address (A0-A2) 60 IODIRB = 0x0d # Pin pullups B-side 61 IODIRA = 0x00 # Pin pullups A-side 0x0c 62 IODIRApullup = 0x0c # Pin pullups A-side 0x0c 63 GPIOB = 0x13 # Register B-side for inputs 64 GPIOA = 0x12 # Register A-side for inputs 65 OLATA = 0x14 # Register for outputs 66 bus.write_byte_data(DEVICE,IODIRB,0xFF) # set all gpiob to input 67 bus.write_byte_data(DEVICE,IODIRApullup,0xF3) # set two pullup inputs and two outputs 68 bus.write_byte_data(DEVICE,IODIRA,0xF3) # set two inputs and two outputs 69 bus.write_byte_data(DEVICE,OLATA,0x4) 70 print("yes, found em i2c buttons!") 71 i2cbuttons = True 72 break 73 except: 74 print("could not find i2c buttons!! running in keyboard only mode") 75 print("trying again...") 76 i2cbuttons = False 77 probei2c += 1 78 time.sleep(1) 79 bus='' 80 81 #MAIN 82 def main(): 83 global headphoneslevel, miclevel, tarinafolder, screen, loadfilmsettings, plughw, channels, filmfolder, scene, showmenu, rendermenu, quality, profilelevel, i2cbuttons, menudone, soundrate, soundformat, process, serverstate, que, port, recording, onlysound, camera_model, fps_selection, fps_selected, fps, db, selected, cammode, newfilmname, camera_recording, abc 84 # Get path of the current dir, then use it as working directory: 85 rundir = os.path.dirname(__file__) 86 if rundir != '': 87 os.chdir(rundir) 88 #filmfolder = "/home/pi/Videos/" 89 #picfolder = "/home/pi/Pictures/" 90 tarinafolder = os.getcwd() 91 92 #MENUS 93 standardmenu = 'FILM:', 'SCENE:', 'SHOT:', 'TAKE:', '', 'SHUTTER:', 'ISO:', 'RED:', 'BLUE:', 'FPS:', 'Q:', 'BRIGHT:', 'CONT:', 'SAT:', 'FLIP:', 'BEEP:', 'LENGTH:', 'HW:', 'CH:', 'MIC:', 'PHONES:', 'COMP:', 'TIMELAPSE', 'MODE:', 'DSK:', 'SHUTDOWN', 'SRV:', 'SEARCH:', 'WIFI:', 'UPDATE', 'UPLOAD', 'BACKUP', 'LOAD', 'NEW', 'TITLE', 'LIVE:' 94 tarinactrlmenu = 'FILM:', 'SCENE:', 'SHOT:', 'TAKE:', '', 'SHUTTER:', 'ISO:', 'RED:', 'BLUE:', 'FPS:', 'Q:', 'BRIGHT:', 'CONT:', 'SAT:', 'FLIP:', 'BEEP:', 'LENGTH:', 'HW:', 'CH:', 'MIC:', 'PHONES:', 'COMP:', 'TIMELAPSE', 'MODE:', 'DSK:', 'SHUTDOWN', 'SRV:', 'SEARCH:', 'WIFI:', 'CAMERA:', 'Add CAMERA', 'New FILM', 'New SCENE', 'Sync SCENE' 95 #tarinactrlmenu = "BACK","CAMERA:", "Add CAMERA","New FILM","","New SCENE","Sync SCENE","Snapshot" 96 emptymenu='','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','' 97 menu = standardmenu 98 showtarinactrl = False 99 recordwithports = False 100 pressagain = '' 101 #STANDARD VALUES (some of these may not be needed, should do some clean up) 102 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' 103 numbers_only = ' ','1','2','3','4','5','6','7','8','9','0' 104 keydelay = 0.0555 105 selectedaction = 0 106 selected = 0 107 awb = 'auto', 'sunlight', 'cloudy', 'shade', 'tungsten', 'fluorescent', 'incandescent', 'flash', 'horizon' 108 awbx = 0 109 awb_lock = 'no' 110 cammode = 'film' 111 camera_model='' 112 fps = 25 113 fps_selected=2 114 quality = 27 115 profilelevel='4.2' 116 headphoneslevel = 40 117 miclevel = 50 118 soundformat = 'S16_LE' 119 soundrate = '48000' 120 recording = False 121 retake = False 122 lastmenu = '' 123 menudone = '' 124 rendermenu = True 125 showmenu = 1 126 showmenu_settings = True 127 showhelp = False 128 overlay = None 129 underlay = None 130 reclenght = 0 131 t = 0 132 rectime = '' 133 scene = 1 134 shot = 1 135 take = 1 136 pic = 1 137 onlysound=False 138 filmname = 'onthefloor' 139 newfilmname = '' 140 beeps = 0 141 beepcountdown = 0 142 beeping = False 143 backlight = True 144 lastbeep = time.time() 145 flip = 'no' 146 between = 30 147 duration = 0.2 148 lenses = os.listdir('lenses/') 149 lens = lenses[0] 150 buttontime = time.time() 151 pressed = '' 152 buttonpressed = False 153 holdbutton = '' 154 updatethumb = False 155 loadfilmsettings = True 156 oldsettings = '' 157 comp = 0 158 yanked = '' 159 copying = '' 160 moving = False 161 stream = '' 162 live = 'no' 163 peakshot = '' 164 peaktake = '' 165 plughw = 0 #default audio device 166 channels = 1 #default mono 167 #SAVE SETTINGS FREQUENCY IN SECS 168 pausetime = time.time() 169 savesettingsevery = 5 170 #TARINA VERSION 171 f = open(tarinafolder + '/VERSION') 172 tarinaversion = f.readline() 173 tarinavername = f.readline() 174 175 #START INTERFACE 176 startinterface() 177 178 db='' 179 #FIRE UP CAMERA 180 camera = startcamera(lens,fps) 181 #GET FILMFOLDER AND CAMERA VERSION 182 camera_model, camera_revision , filmfolder = getconfig(camera) 183 if os.path.isdir(filmfolder) == False: 184 os.makedirs(filmfolder) 185 186 #SYSTEM CONFIGS (turn off hdmi) 187 #run_command('tvservice -o') 188 #Kernel page cache optimization for sd card 189 run_command('sudo ' + tarinafolder + '/extras/sdcardhack.sh') 190 #Make screen shut off work and run full brightness 191 run_command('gpio -g mode 19 pwm ') 192 run_command('gpio -g pwm 19 1023') 193 #COUNT DISKSPACE 194 disk = os.statvfs(filmfolder) 195 diskleft = str(int(disk.f_bavail * disk.f_frsize / 1024 / 1024 / 1024)) + 'Gb' 196 197 #LOAD FILM AND SCENE SETTINGS 198 try: 199 filmname = getfilms(filmfolder)[0][0] 200 except: 201 filmname = filmname 202 try: 203 filmname_back = getfilms(filmfolder)[0][1] 204 except: 205 filmname_back = filmname 206 207 #THUMBNAILCHECKER 208 oldscene = scene 209 oldshot = shot 210 oldtake = take 211 #TURN ON WIFI AND TARINA SERVER 212 serverstate = 'on' 213 wifistate = 'on' 214 #serverstate = tarinaserver(False) 215 #TO_BE_OR_NOT_TO_BE 216 foldername = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) + '/' 217 filename = 'take' + str(take).zfill(3) 218 recordable = not os.path.isfile(foldername + filename + '.mp4') and not os.path.isfile(foldername + filename + '.h264') 219 onthefloor_folder=filmfolder+'onthefloor' 220 if os.path.isdir(onthefloor_folder) == False: 221 os.makedirs(onthefloor_folder) 222 223 #--------------Tarina Controller over socket ports --------# 224 225 #TARINACTRL 226 camerasconnected='' 227 sleep=0.2 228 cameras = [] 229 camerasoff =[] 230 camselected=0 231 newselected=0 232 mastersound=None 233 camera_recording=None 234 pingip=0 235 searchforcameras='off' 236 #NETWORKS 237 networks=[] 238 adapters = ifaddr.get_adapters() 239 for adapter in adapters: 240 print("IPs of network adapter " + adapter.nice_name) 241 for ip in adapter.ips: 242 if ':' not in ip.ip[0] and '127.0.0.1' != ip.ip: 243 print(ip.ip) 244 networks=[ip.ip] 245 if networks != []: 246 network=networks[0] 247 if network not in cameras: 248 cameras=[] 249 cameras.append(network) 250 251 port = 55555 252 que = Queue() 253 process = Process(target=listenforclients, args=("0.0.0.0", port, que)) 254 process.start() 255 nextstatus = '' 256 257 serverstate_old='off' 258 wifistate_old='off' 259 260 camera_model, camera_revision, filmfolder= getconfig(camera) 261 262 #--------------MAIN LOOP---------------# 263 while True: 264 pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton) 265 if pressagain != '': 266 pressed = pressagain 267 pressagain = '' 268 #event = screen.getch() 269 if wifistate != wifistate_old: 270 if wifistate == 'on': 271 run_command('sudo iwconfig wlan0 txpower auto') 272 elif wifistate == 'off': 273 run_command('sudo iwconfig wlan0 txpower off') 274 wifistate_old = wifistate 275 if serverstate != serverstate_old: 276 if serverstate == 'on': 277 tarinaserver(True) 278 elif serverstate == 'off': 279 tarinaserver(False) 280 serverstate_old=serverstate 281 if recording == False: 282 #SHUTDOWN 283 if pressed == 'middle' and menu[selected] == 'SHUTDOWN': 284 writemessage('Hold on shutting down...') 285 time.sleep(1) 286 run_command('sudo shutdown -h now') 287 #MODE 288 elif pressed == 'changemode': 289 if cammode == 'film': 290 cammode = 'picture' 291 vumetermessage('changing to picture mode') 292 elif cammode == 'picture': 293 cammode = 'film' 294 vumetermessage('changing to film mode') 295 camera.stop_preview() 296 camera.close() 297 camera = startcamera(lens,fps) 298 loadfilmsettings = True 299 #PICTURE 300 elif pressed == 'picture': 301 if os.path.isdir(foldername) == False: 302 os.makedirs(foldername) 303 picture = foldername +'picture' + str(take).zfill(3) + '.jpeg' 304 run_command('touch ' + foldername + '.placeholder') 305 print('taking picture') 306 camera.capture(picture,format="jpeg",use_video_port=True) 307 #PEAKING 308 elif pressed == 'peak' and recordable == True: 309 if shot > 1: 310 peakshot = shot - 1 311 peaktake = counttakes(filmname, filmfolder, scene, peakshot) 312 p_imagename = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(peakshot).zfill(3) + '/take' + str(peaktake).zfill(3) + '.jpeg' 313 overlay = displayimage(camera, p_imagename, overlay, 3) 314 while holdbutton == 'peak': 315 pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton) 316 vumetermessage('peaking ' + str(peakshot)) 317 time.sleep(0.03) 318 overlay = removeimage(camera, overlay) 319 #SHOWHELP 320 elif pressed == 'showhelp': 321 vumetermessage('Button layout') 322 if showhelp == False: 323 overlay = removeimage(camera, overlay) 324 overlay = displayimage(camera, tarinafolder+'/extras/buttons.png', overlay, 4) 325 showhelp = True 326 elif showhelp == True: 327 overlay = removeimage(camera, overlay) 328 updatethumb = True 329 showhelp = False 330 #while holdbutton == 'showhelp' or pressed == 'H': 331 # pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton) 332 # vumetermessage('Button layout') 333 # time.sleep(0.03) 334 #TIMELAPSE 335 elif pressed == 'middle' and menu[selected] == 'TIMELAPSE': 336 overlay = removeimage(camera, overlay) 337 takes = counttakes(filmname, filmfolder, scene, shot) 338 if takes > 0: 339 shot = countshots(filmname, filmfolder, scene) + 1 340 take = 1 341 foldername = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) + '/' 342 filename = 'take' + str(take).zfill(3) 343 renderedfilename, between, duration = timelapse(beeps,camera,filmname,foldername,filename,between,duration,backlight) 344 if renderedfilename != '': 345 #render thumbnail 346 #writemessage('creating thumbnail') 347 #run_command('avconv -i ' + foldername + filename + '.mp4 -frames 1 -vf scale=800:460 ' + foldername + filename + '.jpeg') 348 updatethumb = True 349 #VIEW SCENE 350 elif pressed == 'view' and menu[selected] == 'SCENE:': 351 writemessage('Loading scene...') 352 organize(filmfolder, filmname) 353 filmfiles = shotfiles(filmfolder, filmname, scene) 354 if len(filmfiles) > 0: 355 #Check if rendered video exist 356 camera.stop_preview() 357 #renderfilename, newaudiomix = renderscene(filmfolder, filmname, scene) 358 renderfilename = renderfilm(filmfolder, filmname, comp, scene, True) 359 if renderfilename != '': 360 remove_shots = playdub(filmname,renderfilename, 'film') 361 if remove_shots != []: 362 for i in remove_shots: 363 remove(filmfolder, filmname, scene, i, take, 'shot') 364 organize(filmfolder, filmname) 365 updatethumb = True 366 #loadfilmsettings = True 367 time.sleep(0.5) 368 else: 369 print('nothing to remove') 370 camera.start_preview() 371 else: 372 vumetermessage("There's absolutely nothing in this scene! hit rec!") 373 rendermenu = True 374 #VIEW FILM 375 elif pressed == 'view' and menu[selected] == 'FILM:': 376 writemessage('Loading film...') 377 organize(filmfolder, filmname) 378 filmfiles = viewfilm(filmfolder, filmname) 379 if len(filmfiles) > 0: 380 camera.stop_preview() 381 #removeimage(camera, overlay) 382 renderfilename = renderfilm(filmfolder, filmname, comp, 0, True) 383 if renderfilename != '': 384 remove_shots = playdub(filmname,renderfilename, 'film') 385 #overlay = displayimage(camera, imagename, overlay, 3) 386 camera.start_preview() 387 else: 388 vumetermessage('wow, shoot first! there is zero, nada, zip footage to watch now... just hit rec!') 389 rendermenu = True 390 #VIEW SHOT OR TAKE 391 elif pressed == 'view': 392 writemessage('Loading clip...') 393 organize(filmfolder, filmname) 394 takes = counttakes(filmname, filmfolder, scene, shot) 395 if takes > 0: 396 removeimage(camera, overlay) 397 camera.stop_preview() 398 foldername = filmfolder + filmname + '/scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) + '/' 399 filename = 'take' + str(take).zfill(3) 400 #compileshot(foldername + filename,filmfolder,filmname) 401 renderfilename, newaudiomix = rendershot(filmfolder, filmname, foldername+filename, scene, shot) 402 trim = playdub(filmname,foldername + filename, 'shot') 403 if trim: 404 take = counttakes(filmname, filmfolder, scene, shot)+1 405 trim_filename = foldername + 'take' + str(take).zfill(3) 406 videotrim(foldername + filename, trim_filename, trim[0], trim[1]) 407 if os.path.exists(foldername+'dub') == True: 408 print('trim dubs here') 409 imagename = foldername + filename + '.jpeg' 410 overlay = displayimage(camera, imagename, overlay, 3) 411 camera.start_preview() 412 else: 413 vumetermessage('nothing here! hit rec!') 414 rendermenu = True 415 #DUB SHOT 416 elif pressed == 'middle' and menu[selected] == 'SHOT:' and recordable == False: 417 newdub = clipsettings(filmfolder, filmname, scene, shot, take, plughw) 418 take = counttakes(filmname, filmfolder, scene, shot) 419 if newdub: 420 camera.stop_preview() 421 #save original sound 422 dubfolder = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/dub/' 423 saveoriginal = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/take'+str(take).zfill(3)+'.wav' 424 dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, scene, shot) 425 foldername = filmfolder + filmname + '/scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) + '/' 426 filename = 'take' + str(take).zfill(3) 427 if dubfiles==[]: 428 print('no dubs, copying original sound to original') 429 os.system('cp '+saveoriginal+' '+dubfolder+'original.wav') 430 time.sleep(2) 431 renderfilename, newaudiomix = rendershot(filmfolder, filmname, foldername+filename, scene, shot) 432 playdub(filmname,renderfilename, 'dub') 433 #run_command('sox -V0 -G /dev/shm/dub.wav -c 2 ' + newdub) 434 #add audio/video start delay sync 435 run_command('sox -V0 -G /dev/shm/dub.wav -c 2 /dev/shm/temp.wav trim 0.013') 436 run_command('mv /dev/shm/temp.wav '+ newdub) 437 audiosync, videolenght, audiolenght = audiotrim(renderfilename, 'end', newdub) 438 vumetermessage('new shot dubbing made!') 439 camera.start_preview() 440 time.sleep(1) 441 else: 442 vumetermessage('see ya around!') 443 rendermenu = True 444 #DUB SCENE 445 elif pressed == 'middle' and menu[selected] == 'SCENE:': 446 newdub = clipsettings(filmfolder, filmname, scene, 0, take, plughw) 447 if newdub: 448 camera.stop_preview() 449 renderfilename, newaudiomix = renderscene(filmfolder, filmname, scene) 450 playdub(filmname,renderfilename, 'dub') 451 #run_command('sox -V0 -G /dev/shm/dub.wav -c 2 ' + newdub) 452 #add audio/video start delay sync 453 run_command('sox -V0 -G /dev/shm/dub.wav -c 2 /dev/shm/temp.wav trim 0.013') 454 run_command('mv /dev/shm/temp.wav '+ newdub) 455 audiosync, videolenght, audiolenght = audiotrim(renderfilename, 'end', newdub) 456 vumetermessage('new scene dubbing made!') 457 camera.start_preview() 458 time.sleep(1) 459 else: 460 vumetermessage('see ya around!') 461 rendermenu = True 462 #DUB FILM 463 elif pressed == 'middle' and menu[selected] == 'FILM:': 464 newdub = clipsettings(filmfolder, filmname, 0, 0, take, plughw) 465 if newdub: 466 camera.stop_preview() 467 renderfilename = renderfilm(filmfolder, filmname, comp, 0, False) 468 playdub(filmname,renderfilename, 'dub') 469 run_command('sox -V0 -G /dev/shm/dub.wav -c 2 ' + newdub) 470 vumetermessage('new film dubbing made!') 471 camera.start_preview() 472 time.sleep(1) 473 else: 474 vumetermessage('see ya around!') 475 rendermenu = True 476 #BACKUP 477 elif pressed == 'middle' and menu[selected] == 'BACKUP': 478 copytousb(filmfolder) 479 rendermenu = True 480 #UPLOAD 481 elif pressed == 'middle' and menu[selected] == 'UPLOAD': 482 if webz_on() == True: 483 filmfiles = viewfilm(filmfolder, filmname) 484 if len(filmfiles) > 0: 485 renderfilename = renderfilm(filmfolder, filmname, comp, 0, True) 486 cmd = uploadfilm(renderfilename, filmname) 487 if cmd != None: 488 stopinterface(camera) 489 try: 490 run_command(cmd) 491 except: 492 logger.warning('uploadfilm bugging') 493 startinterface() 494 camera = startcamera(lens,fps) 495 loadfilmsettings = True 496 selectedaction = 0 497 rendermenu = True 498 #LOAD FILM 499 elif pressed == 'middle' and menu[selected] == 'LOAD': 500 filmname = loadfilm(filmname, filmfolder) 501 loadfilmsettings = True 502 #UPDATE 503 elif pressed == 'middle' and menu[selected] == 'UPDATE': 504 if webz_on() == True: 505 stopinterface(camera) 506 tarinaversion, tarinavername = update(tarinaversion, tarinavername) 507 startinterface() 508 camera = startcamera(lens,fps) 509 loadfilmsettings = True 510 selectedaction = 0 511 rendermenu = True 512 #WIFI 513 elif pressed == 'middle' and menu[selected] == 'WIFI:': 514 stopinterface(camera) 515 run_command('wicd-curses') 516 startinterface() 517 camera = startcamera(lens,fps) 518 loadfilmsettings = True 519 rendermenu = True 520 #NEW FILM 521 elif pressed == 'middle' and menu[selected] == 'NEW' or filmname == '' or pressed == 'new_film': 522 filmname_exist=False 523 if newfilmname == '': 524 newfilmname = nameyourfilm(filmfolder, filmname, abc, True) 525 allfilm = getfilms(filmfolder) 526 for i in allfilm: 527 if i[0] == newfilmname: 528 filmname_exist=True 529 if filmname != newfilmname and filmname_exist==False: 530 filmname = newfilmname 531 os.makedirs(filmfolder + filmname) 532 vumetermessage('Good luck with your film ' + filmname + '!') 533 #make a filmhash 534 print('making filmhash...') 535 filmhash = shortuuid.uuid() 536 with open(filmfolder + filmname + '/.filmhash', 'w') as f: 537 f.write(filmhash) 538 updatethumb = True 539 rendermenu = True 540 scene = 1 541 shot = 1 542 take = 1 543 #selectedaction = 0 544 newfilmname = '' 545 else: 546 print(term.clear) 547 filmname = newfilmname 548 newfilmname = '' 549 vumetermessage('film already exist!') 550 logger.info('film already exist!') 551 updatethumb = True 552 loadfilmsettings = True 553 rendermenu = True 554 #EDIT FILM NAME 555 elif pressed == 'middle' and menu[selected] == 'TITLE' or filmname == '': 556 newfilmname = nameyourfilm(filmfolder, filmname, abc, False) 557 if filmname != newfilmname: 558 os.system('mv ' + filmfolder + filmname + ' ' + filmfolder + newfilmname) 559 filmname = newfilmname 560 db = get_film_files(filmname,filmfolder,db) 561 vumetermessage('Film title changed to ' + filmname + '!') 562 else: 563 vumetermessage('') 564 rendermenu = True 565 #(YANK) COPY TAKE 566 elif pressed == 'copy' and menu[selected] == 'TAKE:' and recordable == False: 567 copying = 'take' 568 yanked = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3)+'/take' + str(take).zfill(3) 569 vumetermessage('Take ' + str(take) + ' copied! (I)nsert button to place it...') 570 time.sleep(1) 571 #(YANK) COPY SHOT 572 elif pressed == 'copy' and menu[selected] == 'SHOT:': 573 copying = 'shot' 574 yanked = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) 575 vumetermessage('Shot ' + str(shot) + ' copied! (I)nsert button to place it...') 576 time.sleep(1) 577 #(YANK) COPY SCENE 578 elif pressed == 'copy' and menu[selected] == 'SCENE:': 579 copying = 'scene' 580 yanked = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) 581 vumetermessage('Scene ' + str(scene) + ' copied! (I)nsert button to place it...') 582 time.sleep(1) 583 #(CUT) MOVE TAKE 584 elif pressed == 'move' and menu[selected] == 'TAKE:' and recordable == False: 585 copying = 'take' 586 moving = True 587 yanked = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3)+'/take' + str(take).zfill(3) 588 vumetermessage('Moving shot ' + str(shot) + ' (I)nsert button to place it...') 589 time.sleep(1) 590 #(CUT) MOVE SHOT 591 elif pressed == 'move' and menu[selected] == 'SHOT:': 592 copying='shot' 593 moving = True 594 yanked = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) 595 vumetermessage('Moving shot ' + str(shot) + ' (I)nsert button to place it...') 596 time.sleep(1) 597 #(CUT) MOVE SCENE 598 elif pressed == 'move' and menu[selected] == 'SCENE:': 599 copying='scene' 600 moving = True 601 yanked = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) 602 vumetermessage('Moving scene ' + str(scene) + ' (I)nsert button to place it...') 603 time.sleep(1) 604 #PASTE SHOT and PASTE SCENE 605 elif pressed == 'insert' and yanked: 606 if copying == 'take': 607 take = counttakes(filmname, filmfolder, scene, shot) 608 take=take+1 609 vumetermessage('Pasting take, please wait...') 610 paste = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) + '/take' + str(take).zfill(3) 611 #try: 612 # os.makedirs(filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot'+ str(shot).zfill(3)) 613 #except: 614 # pass 615 os.system('cp ' + yanked + '.mp4 ' + paste + '.mp4') 616 os.system('cp ' + yanked + '.jpeg ' + paste + '.jpeg') 617 os.system('cp ' + yanked + '.h264 ' + paste + '.h264') 618 os.system('cp ' + yanked + '.wav ' + paste + '.wav') 619 paste = '' 620 if moving == True: 621 os.system('rm -r ' + yanked + '*') 622 elif copying == 'shot': 623 vumetermessage('Pasting shot, please wait...') 624 paste = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot-1).zfill(3) + '_yanked' 625 try: 626 os.makedirs(filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3)) 627 except: 628 pass 629 os.system('cp -r ' + yanked + ' ' + paste) 630 if moving == True: 631 os.system('rm -r ' + yanked + '/*') 632 #Remove hidden placeholder 633 os.system('rm ' + yanked + '/.placeholder') 634 elif copying == 'scene': 635 vumetermessage('Pasting scene, please wait...') 636 paste = filmfolder + filmname + '/' + 'scene' + str(scene-1).zfill(3) + '_yanked' 637 os.system('cp -r ' + yanked + ' ' + paste) 638 if moving == True: 639 os.system('rm -r ' + yanked + '/*') 640 #Remove hidden placeholder 641 #os.system('rm ' + yanked + '/.placeholder') 642 add_organize(filmfolder, filmname) 643 organize(filmfolder, filmname) 644 updatethumb = True 645 scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take) 646 yanked = '' 647 copying = '' 648 moving = False 649 vumetermessage('Pasted!') 650 time.sleep(2) 651 #INSERT SHOT 652 elif pressed == 'insert' and menu[selected] != 'SCENE:' and yanked == '': 653 insertshot = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot-1).zfill(3) + '_insert' 654 try: 655 os.makedirs(insertshot) 656 except: 657 print('is there already prob') 658 add_organize(filmfolder, filmname) 659 scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take) 660 vumetermessage('Shot ' + str(shot) + ' inserted') 661 updatethumb = True 662 time.sleep(1) 663 #INSERT SHOT TO LAST SHOT 664 elif pressed == 'insert_shot': 665 logger.info('inserting shot') 666 shot = countshots(filmname, filmfolder, scene) 667 shot=shot+1 668 insertshot = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot-1).zfill(3) + '_insert' 669 try: 670 os.makedirs(insertshot) 671 except: 672 print('is there already prob') 673 add_organize(filmfolder, filmname) 674 scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take) 675 vumetermessage('Shot ' + str(shot) + ' inserted') 676 updatethumb = True 677 #INSERT TAKE 678 elif pressed == 'insert_take': 679 logger.info('inserting take') 680 insertshot = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) 681 try: 682 os.makedirs(insertshot) 683 run_command('touch ' + insertshot + '/.placeholder') 684 except: 685 print('is there already prob') 686 add_organize(filmfolder, filmname) 687 scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take) 688 vumetermessage('Take ' + str(shot) + ' inserted') 689 updatethumb = True 690 #time.sleep(1) 691 #INSERT SCENE 692 elif pressed == 'insert' and menu[selected] == 'SCENE:' and recordable == False and yanked == '': 693 insertscene = filmfolder + filmname + '/' + 'scene' + str(scene-1).zfill(3) + '_insert' 694 logger.info("inserting scene") 695 os.makedirs(insertscene) 696 add_organize(filmfolder, filmname) 697 take = 1 698 shot = 1 699 updatethumb = True 700 scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take) 701 vumetermessage('Scene ' + str(scene) + ' inserted') 702 time.sleep(1) 703 #NEW SCENE 704 elif pressed == 'new_scene': 705 scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take) 706 vumetermessage('got new scene') 707 scene=scenes+1 708 shot=1 709 take=1 710 #HELPME 711 #elif event == 'H': 712 # if webz_on() == True: 713 # writemessage('Rob resolving the error now...') 714 # try: 715 # stopinterface(camera) 716 # run_command('reset') 717 # run_command('ssh -R 18888:localhost:22 tarina@tarina.org -p 13337') 718 # startinterface() 719 # camera = startcamera(lens,fps) 720 # loadfilmsettings = True 721 # except: 722 # writemessage('sry! no rob help installed') 723 #DEVELOP 724 elif event == 'D': 725 try: 726 stopinterface(camera) 727 code.interact(local=locals()) 728 startinterface() 729 camera = startcamera(lens,fps) 730 loadfilmsetings = True 731 except: 732 writemessage('hmm.. couldnt enter developer mode') 733 #PICTURE 734 #elif event == 'J': 735 # try: 736 # stopinterface(camera) 737 # run_command('raspistill -ISO 800 -ss 6000000 -o '+picfolder+'test'+str(pic).zfill(3)+'.jpeg') 738 # pic = pic + 1 739 # #os.system('scp '+picfolder/+'test.jpeg user@10.42.0.1:~/pic.jpeg') 740 # startinterface() 741 # camera = startcamera(lens,fps) 742 # loadfilmsetings = True 743 # except: 744 # writemessage('hmm.. couldnt enter developer mode') 745 elif pressed == 'screen': 746 if backlight == False: 747 # requires wiringpi installed 748 run_command('gpio -g pwm 19 1023') 749 backlight = True 750 camera.start_preview() 751 elif backlight == True: 752 run_command('gpio -g pwm 19 0') 753 backlight = False 754 camera.stop_preview() 755 elif pressed == 'showmenu': 756 if showmenu == 1: 757 # requires wiringpi installed 758 showmenu = 0 759 showmenu_settings = False 760 elif showmenu == 0: 761 showmenu = 1 762 showmenu_settings = True 763 #DSK 764 elif pressed == 'middle' and menu[selected] == 'DSK:': 765 print("clean up film folder here") 766 #cleanupdisk(filmname,filmfolder) 767 #REMOVE DELETE 768 #take 769 elif pressed == 'remove' and menu[selected] == 'TAKE:': 770 remove(filmfolder, filmname, scene, shot, take, 'take') 771 organize(filmfolder, filmname) 772 scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take) 773 take = counttakes(filmname, filmfolder, scene, shot) 774 updatethumb = True 775 rendermenu = True 776 #loadfilmsettings = True 777 time.sleep(0.2) 778 #shot 779 elif pressed == 'remove' and menu[selected] == 'SHOT:': 780 remove(filmfolder, filmname, scene, shot, take, 'shot') 781 organize(filmfolder, filmname) 782 scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take) 783 take = counttakes(filmname, filmfolder, scene, shot) 784 updatethumb = True 785 rendermenu = True 786 #loadfilmsettings = True 787 time.sleep(0.2) 788 #scene 789 elif pressed == 'remove' and menu[selected] == 'SCENE:' or pressed=='remove_now': 790 remove(filmfolder, filmname, scene, shot, take, 'scene') 791 organize(filmfolder, filmname) 792 scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take) 793 shot = countshots(filmname, filmfolder, scene) 794 take = counttakes(filmname, filmfolder, scene, shot) 795 updatethumb = True 796 rendermenu = True 797 #loadfilmsettings = True 798 time.sleep(0.2) 799 #film 800 elif pressed == 'remove' and menu[selected] == 'FILM:': 801 remove(filmfolder, filmname, scene, shot, take, 'film') 802 filmname = getfilms(filmfolder)[0][0] 803 if filmname == '': 804 filmname = nameyourfilm(filmfolder,filmname,abc, True) 805 else: 806 scene, shot, take = countlast(filmname, filmfolder) 807 loadfilmsettings = True 808 updatethumb = True 809 rendermenu = True 810 time.sleep(0.2) 811 elif pressed == 'remove' and menu[selected] == 'CAMERA:': 812 if camselected != 0: 813 cameras.pop(camselected) 814 newselected=0 815 elif pressed == 'middle' and menu[selected] == 'Add CAMERA': 816 if networks != []: 817 newcamera = newcamera_ip(numbers_only, network) 818 if newcamera != '': 819 if newcamera not in cameras and newcamera not in networks: 820 sendtocamera(newcamera,port,'NEWFILM:'+filmname) 821 time.sleep(0.2) 822 sendtocamera(newcamera,port,'Q:'+str(quality)) 823 time.sleep(0.2) 824 sendtocamera(newcamera,port,'SHOT:'+str(shot)) 825 time.sleep(0.2) 826 sendtocamera(newcamera,port,'SCENE:'+str(scene)) 827 time.sleep(0.2) 828 sendtocamera(newcamera,port,'MAKEPLACEHOLDERS:'+str(scenes)+'|'+str(shots)) 829 cameras.append(newcamera) 830 rendermenu = True 831 #newselected=newselected+1 832 camera_recording=None 833 vumetermessage("New camera! "+newcamera) 834 else: 835 vumetermessage('No network!') 836 elif 'SYNCIP:' in pressed: 837 ip = pressed.split(':')[1] 838 vumetermessage('SYNCING!') 839 stopinterface(camera) 840 video_files=shotfiles(filmfolder, filmname, scene) 841 for i in video_files: 842 compileshot(i,filmfolder,filmname) 843 logger.info('SYNCING:'+i) 844 organize(filmfolder, filmname) 845 if not os.path.isfile('/home/pi/.ssh/id_rsa'): 846 run_command('ssh-keygen') 847 run_command('ssh-copy-id pi@'+ip) 848 try: 849 run_command('rsync -avr --update --progress --files-from='+filmfolder+filmname+'/scene'+str(scene).zfill(3)+'/.origin_videos / pi@'+ip+':/') 850 except: 851 logger.info('no origin videos') 852 #run_command('scp -r '+filmfolder+filmname+'/'+'scene'+str(scene).zfill(3)+' pi@'+ip+':'+filmfolder+filmname+'/') 853 sendtocamera(ip,port,'SYNCDONE:'+cameras[0]) 854 startinterface() 855 camera = startcamera(lens,fps) 856 loadfilmsettings = True 857 rendermenu = True 858 elif 'SYNCDONE:' in pressed: 859 stopinterface(camera) 860 ip = pressed.split(':')[1] 861 logger.info('SYNCING from ip:'+ip) 862 run_command('ssh-copy-id pi@'+ip) 863 try: 864 run_command('rsync -avr --update --progress pi@'+ip+':'+filmfolder+filmname+'/scene'+str(scene).zfill(3)+'/ '+filmfolder+filmname+'/scene'+str(scene).zfill(3)+'/') 865 except: 866 logger.info('no files') 867 with open(filmfolder+filmname+'/scene'+str(scene).zfill(3)+'/.origin_videos', 'r') as f: 868 scene_origin_files = [line.rstrip() for line in f] 869 #a=0 870 #for i in cameras: 871 # if a != 0: 872 # run_command('rsync -avr --update --progress '+filmfolder+filmname+'/scene'+str(scene).zfill(3)+'/ pi@'+i+':'+filmfolder+filmname+'/scene'+str(scene).zfill(3)+'/') 873 # time.sleep(3) 874 # a=a+1 875 startinterface() 876 camera = startcamera(lens,fps) 877 loadfilmsettings = True 878 rendermenu = True 879 vumetermessage('SYNC DONE!') 880 elif 'RETAKE:' in pressed: 881 shot=pressed.split(':')[1] 882 shot=int(shot) 883 retake = True 884 pressed="retake_now" 885 elif 'SCENE:' in pressed: 886 scene=pressed.split(':')[1] 887 scene=int(scene) 888 shot = countshots(filmname, filmfolder, scene) 889 take = counttakes(filmname, filmfolder, scene, shot) 890 elif 'SHOT:' in pressed: 891 shot=pressed.split(':')[1] 892 shot=int(shot) 893 take = counttakes(filmname, filmfolder, scene, shot) 894 elif 'REMOVE:' in pressed: 895 scene=pressed.split(':')[1] 896 scene=int(scene) 897 shot = countshots(filmname, filmfolder, scene) 898 take = counttakes(filmname, filmfolder, scene, shot) 899 pressagain='remove_now' 900 elif 'Q:' in pressed: 901 qual=pressed.split(':')[1] 902 quality=int(qual) 903 vumetermessage('Quality changed to '+str(quality)) 904 elif 'MAKEPLACEHOLDERS:' in pressed: 905 scenesshots=pressed.split(':')[1] 906 pscene=int(scenesshots.split('|')[0]) 907 pshots=int(scenesshots.split('|')[1]) 908 #to not throw away empty shots, make placeholders 909 for i in range(pshots): 910 placeholders=filmfolder + filmname + '/scene' + str(pscene).zfill(3) + '/shot' + str(i+1).zfill(3) 911 try: 912 os.makedirs(placeholders) 913 except: 914 logger.info('scene or shot already there!') 915 run_command('touch ' + placeholders + '/.placeholder') 916 scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take) 917 rendermenu = True 918 vumetermessage('CONNECTED TO MASTER TARINA!') 919 #SHOWTARINACTRL 920 if recordwithports: 921 if pressed == 'middle' and menu[selected] == "New FILM": 922 newfilmname = nameyourfilm(filmfolder, filmname, abc, True) 923 a=0 924 for i in cameras: 925 if i not in camerasoff: 926 sendtocamera(i,port,'NEWFILM:'+newfilmname) 927 a=a+1 928 elif pressed == "retake": 929 a=0 930 for i in cameras: 931 if i not in camerasoff: 932 if a == camselected: 933 if camera_recording == a: 934 if a==0: 935 if recording == True: 936 pressed="retake_now" 937 retake = True 938 camera_recording=None 939 else: 940 sendtocamera(i,port,'STOPRETAKE') 941 camera_recording=None 942 else: 943 if a==0: 944 if recording == False: 945 pressed="retake_now" 946 retake = True 947 camera_recording=0 948 else: 949 sendtocamera(i,port,'RETAKE:'+str(shot)) 950 camera_recording=camselected 951 else: 952 if a==0: 953 pressagain='insert_take' 954 else: 955 sendtocamera(i,port,'TAKEPLACEHOLDER') 956 a=a+1 957 elif pressed == "middle" and menu[selected]=="Sync SCENE": 958 for i in cameras: 959 if i != cameras[0]: 960 vumetermessage('Hold on syncing!') 961 sendtocamera(i,port,'SYNCIP:'+cameras[0]) 962 time.sleep(1) 963 elif pressed == "middle" and menu[selected]=='New SCENE': 964 a=0 965 for i in cameras: 966 if i not in camerasoff: 967 if a==0: 968 pressagain="new_scene" 969 else: 970 sendtocamera(i,port,'NEWSCENE') 971 a=a+1 972 elif pressed == "record" and camera_recording != None: 973 if camera_recording == 0: 974 if recording == True: 975 pressed='record_now' 976 else: 977 sendtocamera(cameras[camera_recording],port,'STOP') 978 camera_recording=None 979 elif pressed == "record" and camera_recording == None: 980 a=0 981 for i in cameras: 982 if i not in camerasoff: 983 if a == camselected: 984 if camselected==0: 985 pressed='record_now' 986 else: 987 sendtocamera(i,port,'REC') 988 camera_recording=camselected 989 else: 990 if a==0: 991 pressagain='insert_shot' 992 else: 993 sendtocamera(i,port,'PLACEHOLDER') 994 a=a+1 995 elif pressed == "remove" and menu[selected]=='SCENE:': 996 a=0 997 for i in cameras: 998 if a!=0: 999 sendtocamera(i,port,'REMOVE:'+str(scene)) 1000 a=a+1 1001 elif pressed == "up" and menu[selected]=='SCENE:': 1002 a=0 1003 for i in cameras: 1004 if a!=0: 1005 sendtocamera(i,port,'SCENE:'+str(scene+1)) 1006 a=a+1 1007 elif pressed == "down" and menu[selected]=='SCENE:': 1008 a=0 1009 for i in cameras: 1010 if a!=0: 1011 sendtocamera(i,port,'SCENE:'+str(scene-1)) 1012 a=a+1 1013 elif pressed == "up" and menu[selected]=='SHOT:': 1014 a=0 1015 for i in cameras: 1016 if a!=0: 1017 sendtocamera(i,port,'SHOT:'+str(shot+1)) 1018 a=a+1 1019 elif pressed == "down" and menu[selected]=='SHOT:': 1020 a=0 1021 for i in cameras: 1022 if a!=0: 1023 sendtocamera(i,port,'SHOT:'+str(shot-1)) 1024 a=a+1 1025 elif pressed == "up" and menu[selected]=='Q:': 1026 a=0 1027 for i in cameras: 1028 if a!=0: 1029 sendtocamera(i,port,'Q:'+str(quality+1)) 1030 a=a+1 1031 elif pressed == "down" and menu[selected]=='Q:': 1032 a=0 1033 for i in cameras: 1034 if a!=0: 1035 sendtocamera(i,port,'Q:'+str(quality-1)) 1036 a=a+1 1037 elif event == "0": 1038 newselected = 0 1039 elif event == "1": 1040 if len(cameras) > 1: 1041 newselected = 1 1042 elif event == "2": 1043 if len(cameras) > 2: 1044 newselected = 2 1045 elif event == "3": 1046 if len(cameras) > 3: 1047 newselected = 3 1048 elif event == "4": 1049 if len(cameras) > 4: 1050 newselected = 4 1051 elif event == "5": 1052 if len(cameras) > 5: 1053 newselected = 5 1054 elif event == "6": 1055 if len(cameras) > 6: 1056 newselected = 6 1057 elif event == "7": 1058 if len(cameras) > 7: 1059 newselected = 7 1060 elif event == "8": 1061 if len(cameras) > 8: 1062 newselected = 8 1063 elif event == "9": 1064 if len(cameras) > 9: 1065 newselected = 9 1066 elif event == "-": 1067 if cameras[camselected] not in camerasoff: 1068 camerasoff.append(cameras[camselected]) 1069 elif event == "+": 1070 if cameras[camselected] in camerasoff: 1071 camerasoff.remove(cameras[camselected]) 1072 elif camselected != newselected: 1073 if camera_recording != None: 1074 #change camera 1075 a=0 1076 for c in cameras: 1077 if c not in camerasoff: 1078 if a == camselected: 1079 if a == 0: 1080 #pressed='record_now' 1081 #pressagain='insert_shot' 1082 delayedstop=c 1083 else: 1084 #sendtocamera(c,port,'STOP') 1085 #time.sleep(sleep) 1086 #sendtocamera(c,port,'PLACEHOLDER') 1087 delayedstop=c 1088 elif a == newselected: 1089 if a == 0: 1090 if recording == False: 1091 pressed='record_now' 1092 else: 1093 sendtocamera(c,port,'REC') 1094 camera_recording=newselected 1095 else: 1096 if a == 0: 1097 pressagain='insert_shot' 1098 else: 1099 sendtocamera(c,port,'PLACEHOLDER') 1100 #time.sleep(2) 1101 a=a+1 1102 if delayedstop: 1103 time.sleep(0.05) 1104 if delayedstop==cameras[0]: 1105 if recording == True: 1106 pressed='record_now' 1107 pressagain='insert_shot' 1108 else: 1109 sendtocamera(delayedstop,port,'STOP') 1110 time.sleep(sleep) 1111 sendtocamera(delayedstop,port,'PLACEHOLDER') 1112 camselected=newselected 1113 rendermenu = True 1114 #vumetermessage('filming with '+camera_model +' ip:'+ network + ' '+camerasconnected+' camselected:'+str(camselected)) 1115 if len(cameras) > 1: 1116 vumetermessage('filming with '+camera_model +' ip:'+ cameras[camselected] + ' '+camerasconnected+' camselected:'+str(camselected)+' rec:'+str(camera_recording)) 1117 else: 1118 vumetermessage('filming with '+camera_model +' ip:'+ network + ' '+camerasconnected+' camselected:'+str(camselected)+' rec:'+str(camera_recording)) 1119 1120 1121 #RECORD AND PAUSE 1122 if beepcountdown > 1: 1123 if time.time() - lastbeep > 1: 1124 beep(bus) 1125 beepcountdown -= 1 1126 lastbeep = time.time() 1127 logger.info('beepcountdown: ' + str(beepcountdown)) 1128 vumetermessage('Filming in ' + str(beepcountdown) + ' seconds, press record again to cancel ') 1129 elif beepcountdown > 0: 1130 if time.time() - float(lastbeep) > 0.1: 1131 beep(bus) 1132 vumetermessage('Get ready!!') 1133 if time.time() - lastbeep > 1: 1134 longbeep(bus) 1135 beepcountdown = 0 1136 if recordwithports == True: 1137 if retake == True: 1138 pressed = 'retake_now' 1139 retake = False 1140 else: 1141 pressed = 'record_now' 1142 else: 1143 pressed = 'record' 1144 print('exhausted from all beepings') 1145 if pressed == 'record' and recordwithports==False or pressed == 'record_now' or pressed == 'retake_now' or pressed == 'retake' and recordwithports==False or reclenght != 0 and t > reclenght: 1146 overlay = removeimage(camera, overlay) 1147 if recording == False and recordable == True or recording == False and pressed == 'record_now' or recording == False and pressed == 'retake_now': 1148 #camera_recording=0 1149 scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take) 1150 if pressed == "record": 1151 #shot = shots+1 1152 take = takes+1 1153 elif pressed == "retake": 1154 take = takes+1 1155 elif pressed == 'record_now': 1156 shot=shots+1 1157 take=1 1158 elif pressed == 'retake_now': 1159 takes = counttakes(filmname, filmfolder, scene, shot) 1160 take = takes + 1 1161 foldername = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) + '/' 1162 filename = 'take' + str(take).zfill(3) 1163 if beeps > 0 and beeping == False: 1164 beeping = True 1165 beepcountdown = beeps 1166 elif beepcountdown == 0: 1167 beeping = False 1168 if os.path.isdir(foldername) == False: 1169 os.makedirs(foldername) 1170 if cammode == 'film': 1171 videos_totalt = db.query("SELECT COUNT(*) AS videos FROM videos")[0] 1172 tot = int(videos_totalt.videos) 1173 video_origins=datetime.datetime.now().strftime('%Y%d%m')+str(tot).zfill(5) 1174 db.insert('videos', tid=datetime.datetime.now(), filename=filmfolder+'.videos/'+video_origins+'.mp4', foldername=foldername, filmname=filmname, scene=scene, shot=shot, take=take, audiolenght=0, videolenght=0) 1175 os.system(tarinafolder + '/alsa-utils-1.1.3/aplay/arecord -D plughw:' + str(plughw) + ' -f '+soundformat+' -c ' + str(channels) + ' -r '+soundrate+' -vv '+ foldername + filename + '.wav &') 1176 sound_start = time.time() 1177 if onlysound != True: 1178 camera.start_recording(filmfolder+ '.videos/'+video_origins+'.h264', format='h264', quality=quality, level=profilelevel) 1179 starttime = time.time() 1180 os.system('ln -s '+filmfolder+'.videos/'+video_origins+'.h264 '+foldername+filename+'.h264') 1181 recording = True 1182 showmenu = 0 1183 if cammode == 'picture': 1184 #picdate=datetime.datetime.now().strftime('%Y%d%m') 1185 picture = foldername +'picture' + str(take).zfill(3) + '.jpeg' 1186 print('taking picture') 1187 camera.capture(picture,format="jpeg",use_video_port=True) 1188 run_command('touch ' + foldername + 'take' + str(take).zfill(3) + '.mp4') 1189 basewidth = 800 1190 img = Image.open(picture) 1191 wpercent = (basewidth/float(img.size[0])) 1192 hsize = int((float(img.size[1])*float(wpercent))) 1193 img = img.resize((basewidth,hsize), Image.ANTIALIAS) 1194 img.save(foldername+'take'+str(take).zfill(3) + '.jpeg') 1195 vumetermessage('Great Pic taken!!') 1196 updatethumb = True 1197 elif beepcountdown > 0 and beeping == True: 1198 beeping = False 1199 beepcountdown = 0 1200 vumetermessage('Filming was canceled!!') 1201 elif recording == True and float(time.time() - starttime) > 0.2: 1202 #print(term.clear+term.home) 1203 disk = os.statvfs(tarinafolder + '/') 1204 diskleft = str(int(disk.f_bavail * disk.f_frsize / 1024 / 1024 / 1024)) + 'Gb' 1205 recording = False 1206 if showmenu_settings == True: 1207 showmenu = 1 1208 if onlysound != True: 1209 camera.stop_recording() 1210 os.system('pkill arecord') 1211 soundlag=starttime-sound_start 1212 db.update('videos', where='filename="'+filmfolder+'.videos/'+video_origins+'.mp4"', soundlag=soundlag) 1213 #time.sleep(0.005) #get audio at least 0.1 longer 1214 #camera.capture(foldername + filename + '.jpeg', resize=(800,341)) 1215 if onlysound != True: 1216 try: 1217 #camera.capture(foldername + filename + '.jpeg', resize=(800,340), use_video_port=True) 1218 camera.capture(foldername + filename + '.jpeg', resize=(800,450), use_video_port=True) 1219 except: 1220 logger.warning('something wrong with camera jpeg capture') 1221 #delayerr = audiotrim(foldername,filename) 1222 onlysound = False 1223 scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take) 1224 if beeps > 0: 1225 if bus: 1226 buzz(300) 1227 else: 1228 run_command('aplay -D plughw:' + str(plughw) + ' '+ tarinafolder + '/extras/beep.wav') 1229 if round(fps) != 25: 1230 compileshot(foldername + filename,filmfolder,filmname) 1231 #os.system('cp /dev/shm/' + filename + '.wav ' + foldername + filename + '.wav') 1232 if beeps > 0: 1233 if bus: 1234 buzz(150) 1235 else: 1236 run_command('aplay -D plughw:' + str(plughw) + ' '+ tarinafolder + '/extras/beep.wav') 1237 t = 0 1238 rectime = '' 1239 vumetermessage('Tarina ' + tarinaversion[:-1] + ' ' + tarinavername[:-1]) 1240 updatethumb = True 1241 #camera_recording=0 1242 #if not in last shot or take then go to it 1243 if pressed == 'record' and recordable == False: 1244 scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take) 1245 shot=shots+1 1246 take=1 1247 #take = takes 1248 #takes = counttakes(filmname, filmfolder, scene, shot) 1249 if pressed == 'retake' and recordable == False: 1250 #scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take) 1251 takes = counttakes(filmname, filmfolder, scene, shot) 1252 #take = takes 1253 #takes = counttakes(filmname, filmfolder, scene, shot) 1254 take = takes + 1 1255 #ENTER (auto shutter, iso, awb on/off) 1256 elif pressed == 'middle' and menu[selected] == 'SHUTTER:': 1257 if camera.shutter_speed == 0: 1258 camera.shutter_speed = camera.exposure_speed 1259 else: 1260 camera.shutter_speed = 0 1261 elif pressed == 'middle' and menu[selected] == 'ISO:': 1262 if camera.iso == 0: 1263 camera.iso = 100 1264 else: 1265 camera.iso = 0 1266 elif pressed == 'middle' and menu[selected] == 'RED:': 1267 if camera.awb_mode == 'auto': 1268 camera.awb_gains = (float(camera.awb_gains[0]), float(camera.awb_gains[1])) 1269 camera.awb_mode = 'off' 1270 else: 1271 camera.awb_mode = 'auto' 1272 elif pressed == 'middle' and menu[selected] == 'BLUE:': 1273 if camera.awb_mode == 'auto': 1274 camera.awb_gains = (float(camera.awb_gains[0]), float(camera.awb_gains[1])) 1275 camera.awb_mode = 'off' 1276 else: 1277 camera.awb_mode = 'auto' 1278 elif pressed == 'middle' and menu[selected] == 'BEEP:': 1279 beeps = 0 1280 elif pressed == 'middle' and menu[selected] == 'LENGTH:': 1281 reclenght = 0 1282 elif pressed == 'middle' and menu[selected] == 'LIVE:': 1283 if stream == '': 1284 stream = startstream(camera, stream, plughw, channels) 1285 if stream == '': 1286 vumetermessage('something wrong with streaming') 1287 else: 1288 live = 'yes' 1289 else: 1290 stream = stopstream(camera, stream) 1291 live = 'no' 1292 elif pressed == 'middle' and menu[selected] == 'BRIGHT:': 1293 camera.brightness = 50 1294 elif pressed == 'middle' and menu[selected] == 'CONT:': 1295 camera.contrast = 0 1296 elif pressed == 'middle' and menu[selected] == 'SAT:': 1297 camera.saturation = 0 1298 elif pressed == 'middle' and menu[selected] == 'MIC:': 1299 miclevel = 70 1300 elif pressed == 'middle' and menu[selected] == 'PHONES:': 1301 headphoneslevel = 70 1302 elif pressed == 'middle' and menu[selected] == 'SRV:': 1303 if showtarinactrl == False: 1304 menu=tarinactrlmenu 1305 #selected=0 1306 showtarinactrl = True 1307 else: 1308 menu=standardmenu 1309 showtarinactrl=False 1310 1311 #UP 1312 elif pressed == 'up': 1313 if menu[selected] == 'FILM:': 1314 filmname = 'onthefloor' 1315 filmname_back = filmname 1316 filmname = loadfilm(filmname, filmfolder) 1317 loadfilmsettings = True 1318 if menu[selected] == 'BRIGHT:': 1319 camera.brightness = min(camera.brightness + 1, 99) 1320 elif menu[selected] == 'CONT:': 1321 camera.contrast = min(camera.contrast + 1, 99) 1322 elif menu[selected] == 'SAT:': 1323 camera.saturation = min(camera.saturation + 1, 99) 1324 elif menu[selected] == 'SHUTTER:': 1325 if camera.shutter_speed == 0: 1326 camera.shutter_speed = camera.exposure_speed 1327 if camera.shutter_speed < 5000: 1328 camera.shutter_speed = min(camera.shutter_speed + 50, 50000) 1329 else: 1330 camera.shutter_speed = min(camera.shutter_speed + 200, 50000) 1331 elif menu[selected] == 'ISO:': 1332 camera.iso = min(camera.iso + 100, 1600) 1333 elif menu[selected] == 'BEEP:': 1334 beeps = beeps + 1 1335 elif menu[selected] == 'FLIP:': 1336 if flip == 'yes': 1337 camera.hflip = False 1338 camera.vflip = False 1339 flip = 'no' 1340 time.sleep(0.2) 1341 else: 1342 camera.hflip = True 1343 camera.vflip = True 1344 flip = 'yes' 1345 time.sleep(0.2) 1346 elif menu[selected] == 'LENGTH:': 1347 reclenght = reclenght + 1 1348 time.sleep(0.1) 1349 elif menu[selected] == 'MIC:': 1350 if miclevel < 100: 1351 miclevel = miclevel + 2 1352 run_command('amixer -c 0 sset Mic ' + str(miclevel) + '% unmute') 1353 elif menu[selected] == 'PHONES:': 1354 if headphoneslevel < 100: 1355 headphoneslevel = headphoneslevel + 2 1356 run_command('amixer -c 0 sset Speaker ' + str(headphoneslevel) + '%') 1357 elif menu[selected] == 'SCENE:' and recording == False: 1358 if scene <= scenes: 1359 scene += 1 1360 #shot = countshots(filmname, filmfolder, scene) 1361 shot = 1 1362 take = counttakes(filmname, filmfolder, scene, shot) 1363 #scene, shots, takes = browse2(filmname, filmfolder, scene, shot, take, 0, 1) 1364 #shot = 1 1365 elif menu[selected] == 'SHOT:' and recording == False: 1366 if shot <= shots: 1367 shot += 1 1368 take = counttakes(filmname, filmfolder, scene, shot) 1369 #scene, shot, take = browse2(filmname, filmfolder, scene, shot, take, 1, 1) 1370 #takes = take 1371 elif menu[selected] == 'TAKE:' and recording == False: 1372 if take <= takes: 1373 take += 1 1374 #scene, shot, take = browse2(filmname, filmfolder, scene, shot, take, 2, 1) 1375 elif menu[selected] == 'RED:': 1376 camera.awb_mode = 'off' 1377 if float(camera.awb_gains[0]) < 7.98: 1378 camera.awb_gains = (round(camera.awb_gains[0],2) + 0.02, round(camera.awb_gains[1],2)) 1379 elif menu[selected] == 'BLUE:': 1380 camera.awb_mode = 'off' 1381 if float(camera.awb_gains[1]) < 7.98: 1382 camera.awb_gains = (round(camera.awb_gains[0],2), round(camera.awb_gains[1],2) + 0.02) 1383 elif menu[selected] == 'SRV:': 1384 if serverstate == 'on': 1385 try: 1386 os.makedirs(tarinafolder+'/srv/sessions') 1387 os.system('chown www-data '+tarinafolder+'/srv/sessions') 1388 except: 1389 print('srv folder exist') 1390 serverstate = 'false' 1391 serverstate = tarinaserver(False) 1392 elif serverstate == 'off': 1393 serverstate = 'on' 1394 serverstate = tarinaserver(True) 1395 elif menu[selected] == 'WIFI:': 1396 if wifistate == 'on': 1397 run_command('sudo iwconfig wlan0 txpower off') 1398 wifistate = 'off' 1399 elif wifistate == 'off': 1400 run_command('sudo iwconfig wlan0 txpower auto') 1401 wifistate = 'on' 1402 elif menu[selected] == 'SEARCH:': 1403 if searchforcameras == 'on': 1404 searchforcameras = 'off' 1405 elif searchforcameras == 'off': 1406 searchforcameras = 'on' 1407 elif menu[selected] == 'MODE:': 1408 if cammode == 'film': 1409 cammode = 'picture' 1410 vumetermessage('changing to picture mode') 1411 elif cammode == 'picture': 1412 cammode = 'film' 1413 vumetermessage('changing to film mode') 1414 camera.stop_preview() 1415 camera.close() 1416 camera = startcamera(lens,fps) 1417 loadfilmsettings = True 1418 elif menu[selected] == 'LENS:': 1419 s = 0 1420 for a in lenses: 1421 if a == lens: 1422 selectlens = s 1423 s += 1 1424 if selectlens < len(lenses) - 1: 1425 selectlens += 1 1426 lens = os.listdir('lenses/')[selectlens] 1427 #npzfile = np.load('lenses/' + lens) 1428 #lensshade = npzfile['lens_shading_table'] 1429 table = read_table('lenses/' + lens) 1430 camera.lens_shading_table = table 1431 elif menu[selected] == 'COMP:': 1432 if comp < 1: 1433 comp += 1 1434 elif menu[selected] == 'HW:': 1435 if plughw < len(getaudiocards())-1: 1436 plughw += 1 1437 vumetermessage(getaudiocards()[plughw]) 1438 elif menu[selected] == 'CH:': 1439 if channels == 1: 1440 channels = 2 1441 elif menu[selected] == 'FPS:': 1442 if camera_model == 'imx477': 1443 if fps_selected < len(fps_selection)-1: 1444 fps_selected+=1 1445 fps_selection=[5,8,10,11,12,13,14,15,24.985,35,49] 1446 fps=fps_selection[fps_selected] 1447 camera.framerate = fps 1448 elif menu[selected] == 'Q:': 1449 if quality < 39: 1450 quality += 1 1451 elif menu[selected] == 'CAMERA:': 1452 if camselected < len(cameras)-1: 1453 newselected = camselected+1 1454 logger.info('camera selected:'+str(camselected)) 1455 1456 #LEFT 1457 elif pressed == 'left': 1458 if selected > 0: 1459 selected = selected - 1 1460 else: 1461 selected = len(menu) - 1 1462 if selected == 4: 1463 selected = 3 1464 #DOWN 1465 elif pressed == 'down': 1466 if menu[selected] == 'FILM:': 1467 if filmname == 'onthefloor': 1468 try: 1469 filmname = getfilms(filmfolder)[1][0] 1470 except: 1471 filmname='onthefloor' 1472 filename_back = 'onthefloor' 1473 loadfilmsettings = True 1474 else: 1475 filmname = 'onthefloor' 1476 loadfilmsettings = True 1477 elif menu[selected] == 'BRIGHT:': 1478 camera.brightness = max(camera.brightness - 1, 0) 1479 elif menu[selected] == 'CONT:': 1480 camera.contrast = max(camera.contrast - 1, -100) 1481 elif menu[selected] == 'SAT:': 1482 camera.saturation = max(camera.saturation - 1, -100) 1483 elif menu[selected] == 'SHUTTER:': 1484 if camera.shutter_speed == 0: 1485 camera.shutter_speed = camera.exposure_speed 1486 if camera.shutter_speed < 5000: 1487 camera.shutter_speed = max(camera.shutter_speed - 50, 20) 1488 else: 1489 camera.shutter_speed = max(camera.shutter_speed - 200, 200) 1490 elif menu[selected] == 'ISO:': 1491 camera.iso = max(camera.iso - 100, 100) 1492 elif menu[selected] == 'BEEP:': 1493 if beeps > 0: 1494 beeps = beeps - 1 1495 elif menu[selected] == 'FLIP:': 1496 if flip == 'yes': 1497 camera.hflip = False 1498 camera.vflip = False 1499 flip = 'no' 1500 time.sleep(0.2) 1501 else: 1502 camera.hflip = True 1503 camera.vflip = True 1504 flip = 'yes' 1505 time.sleep(0.2) 1506 elif menu[selected] == 'LENGTH:': 1507 if reclenght > 0: 1508 reclenght = reclenght - 1 1509 time.sleep(0.1) 1510 elif menu[selected] == 'MIC:': 1511 if miclevel > 0: 1512 miclevel = miclevel - 2 1513 run_command('amixer -c 0 sset Mic ' + str(miclevel) + '% unmute') 1514 elif menu[selected] == 'PHONES:': 1515 if headphoneslevel > 0: 1516 headphoneslevel = headphoneslevel - 2 1517 run_command('amixer -c 0 sset Speaker ' + str(headphoneslevel) + '%') 1518 elif menu[selected] == 'SCENE:' and recording == False: 1519 if scene > 1: 1520 scene -= 1 1521 #shot = countshots(filmname, filmfolder, scene) 1522 shot=1 1523 take = counttakes(filmname, filmfolder, scene, shot) 1524 #scene, shots, take = browse2(filmname, filmfolder, scene, shot, take, 0, -1) 1525 #takes = take 1526 #shot = 1 1527 elif menu[selected] == 'SHOT:' and recording == False: 1528 if shot > 1: 1529 shot -= 1 1530 take = counttakes(filmname, filmfolder, scene, shot) 1531 #scene, shot, take = browse2(filmname, filmfolder, scene, shot, take, 1, -1) 1532 #takes = take 1533 elif menu[selected] == 'TAKE:' and recording == False: 1534 if take > 1: 1535 take -= 1 1536 #scene, shot, take = browse2(filmname, filmfolder, scene, shot, take, 2, -1) 1537 elif menu[selected] == 'RED:': 1538 camera.awb_mode = 'off' 1539 if float(camera.awb_gains[0]) > 0.02: 1540 camera.awb_gains = (round(camera.awb_gains[0],2) - 0.02, round(camera.awb_gains[1],2)) 1541 elif menu[selected] == 'BLUE:': 1542 camera.awb_mode = 'off' 1543 if float(camera.awb_gains[1]) > 0.02: 1544 camera.awb_gains = (round(camera.awb_gains[0],2), round(camera.awb_gains[1],2) - 0.02) 1545 elif menu[selected] == 'SRV:': 1546 if serverstate == 'on': 1547 try: 1548 os.makedirs(tarinafolder+'/srv/sessions') 1549 os.system('chown www-data '+tarinafolder+'/srv/sessions') 1550 except: 1551 print('srv folder exist') 1552 serverstate = tarinaserver(False) 1553 elif serverstate == 'off': 1554 serverstate = tarinaserver(True) 1555 elif menu[selected] == 'WIFI:': 1556 if wifistate == 'on': 1557 run_command('sudo iwconfig wlan0 txpower off') 1558 wifistate = 'off' 1559 elif wifistate == 'off': 1560 run_command('sudo iwconfig wlan0 txpower auto') 1561 wifistate = 'on' 1562 elif menu[selected] == 'SEARCH:': 1563 if searchforcameras == 'on': 1564 searchforcameras = 'off' 1565 elif searchforcameras == 'off': 1566 seaarchforcameras = 'on' 1567 elif menu[selected] == 'MODE:': 1568 if cammode == 'film': 1569 cammode = 'picture' 1570 vumetermessage('changing to picture mode') 1571 elif cammode == 'picture': 1572 cammode = 'film' 1573 vumetermessage('changing to film mode') 1574 camera.stop_preview() 1575 camera.close() 1576 camera = startcamera(lens,fps) 1577 loadfilmsettings = True 1578 elif menu[selected] == 'LENS:': 1579 s = 0 1580 for a in lenses: 1581 if a == lens: 1582 selectlens = s 1583 s += 1 1584 if selectlens > 0: 1585 selectlens -= 1 1586 lens = os.listdir('lenses/')[selectlens] 1587 #npzfile = np.load('lenses/' + lens) 1588 #lensshade = npzfile['lens_shading_table'] 1589 table = read_table('lenses/' + lens) 1590 camera.lens_shading_table = table 1591 elif menu[selected] == 'DUB:': 1592 if round(dub[0],1) == 1.0 and round(dub[1],1) > 0.0: 1593 dub[1] -= 0.1 1594 if round(dub[1],1) == 1.0 and round(dub[0],1) < 1.0: 1595 dub[0] += 0.1 1596 elif menu[selected] == 'COMP:': 1597 if comp > 0: 1598 comp -= 1 1599 elif menu[selected] == 'HW:': 1600 if plughw > 0: 1601 plughw -= 1 1602 vumetermessage(getaudiocards()[plughw]) 1603 elif menu[selected] == 'CH:': 1604 if channels == 2: 1605 channels = 1 1606 elif menu[selected] == 'FPS:': 1607 if camera_model == 'imx477': 1608 if fps_selected > 0: 1609 fps_selected-=1 1610 fps_selection=[5,8,10,11,12,13,14,15,24.985,35,49] 1611 fps=fps_selection[fps_selected] 1612 camera.framerate = fps 1613 elif menu[selected] == 'Q:': 1614 if quality > 10: 1615 quality -= 1 1616 elif menu[selected] == 'CAMERA:': 1617 if camselected > 0: 1618 newselected = camselected-1 1619 logger.info('camera selected:'+str(camselected)) 1620 1621 #RIGHT 1622 elif pressed == 'right': 1623 if selected < len(menu) - 1: 1624 selected = selected + 1 1625 else: 1626 selected = 0 1627 if selected == 4: #jump over recording time 1628 selected = 5 1629 #Start Recording Time 1630 if recording == True: 1631 t = time.time() - starttime 1632 rectime = time.strftime("%H:%M:%S", time.gmtime(t)) 1633 #Load settings 1634 if loadfilmsettings == True: 1635 db = get_film_files(filmname,filmfolder,db) 1636 try: 1637 filmsettings = loadsettings(filmfolder, filmname) 1638 camera.brightness = filmsettings[2] 1639 camera.contrast = filmsettings[3] 1640 camera.saturation = filmsettings[4] 1641 camera.shutter_speed = filmsettings[5] 1642 camera.iso = filmsettings[6] 1643 camera.awb_mode = filmsettings[7] 1644 camera.awb_gains = filmsettings[8] 1645 awb_lock = filmsettings[9] 1646 miclevel = filmsettings[10] 1647 headphoneslevel = filmsettings[11] 1648 beeps = filmsettings[12] 1649 flip = filmsettings[13] 1650 comp = filmsettings[14] 1651 between = filmsettings[15] 1652 duration = filmsettings[16] 1653 showmenu_settings = filmsettings[17] 1654 quality = filmsettings[18] 1655 #wifistate = filmsettings[19] 1656 #serverstate=filmsettings[20] 1657 plughw=filmsettings[21] 1658 channels=filmsettings[22] 1659 cammode=filmsettings[23] 1660 scene=filmsettings[24] 1661 shot=filmsettings[25] 1662 take=filmsettings[26] 1663 logger.info('film settings loaded & applied') 1664 time.sleep(0.2) 1665 except: 1666 logger.warning('could not load film settings') 1667 if flip == "yes": 1668 camera.vflip = True 1669 camera.hflip = True 1670 run_command('amixer -c 0 sset Mic ' + str(miclevel) + '% unmute') 1671 run_command('amixer -c 0 sset Speaker ' + str(headphoneslevel) + '%') 1672 origin_videos=organize(filmfolder, filmname) 1673 print('ORIGIN') 1674 print(origin_videos) 1675 print('total of videos: '+str(len(origin_videos))) 1676 if not os.path.isdir(filmfolder+'.videos/'): 1677 os.makedirs(filmfolder+'.videos/') 1678 allfiles = os.listdir(filmfolder+'.videos/') 1679 print(allfiles) 1680 print('alll') 1681 for origin in origin_videos: 1682 if origin in allfiles: 1683 try: 1684 #os.remove(origin) 1685 print('ORIGIN VIDEO FOLDER NOT IN SYNC' + origin) 1686 time.sleep(5) 1687 except: 1688 print('not exist') 1689 organize(filmfolder,'onthefloor') 1690 scenes, shots, takes = countlast(filmname, filmfolder) 1691 loadfilmsettings = False 1692 rendermenu = True 1693 updatethumb = True 1694 if scene == 0: 1695 scene = 1 1696 if take == 0: 1697 take = 1 1698 if shot == 0: 1699 shot = 1 1700 # If menu at SCENE show first shot thumbnail off that scene 1701 if menu[selected] == 'FILM:' and lastmenu != menu[selected] and recordable == False: 1702 updatethumb = True 1703 if menu[selected] == 'SCENE:' and lastmenu != menu[selected] and recordable == False: 1704 updatethumb = True 1705 if menu[selected] == 'SHOT:' and lastmenu != menu[selected] and recordable == False: 1706 updatethumb = True 1707 if menu[selected] == 'TAKE:' and lastmenu != menu[selected] and recordable == False: 1708 updatethumb = True 1709 #Check if scene, shot, or take changed and update thumbnail 1710 if oldscene != scene or oldshot != shot or oldtake != take or updatethumb == True: 1711 if recording == False: 1712 #logger.info('film:' + filmname + ' scene:' + str(scene) + '/' + str(scenes) + ' shot:' + str(shot) + '/' + str(shots) + ' take:' + str(take) + '/' + str(takes)) 1713 foldername = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) + '/' 1714 filename = 'take' + str(take).zfill(3) 1715 recordable = not os.path.isfile(foldername + filename + '.mp4') and not os.path.isfile(foldername + filename + '.h264') 1716 overlay = removeimage(camera, overlay) 1717 if menu[selected] == 'SCENE:' and recordable == False: # display first shot of scene if browsing scenes 1718 p = counttakes(filmname, filmfolder, scene, 1) 1719 imagename = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(1).zfill(3) + '/take' + str(p).zfill(3) + '.jpeg' 1720 #elif menu[selected] == 'FILM:' and recordable == True: 1721 # scene, shot, take = countlast(filmname,filmfolder) 1722 # shot += 1 1723 elif menu[selected] == 'FILM:' and recordable == False: # display first shot of film 1724 p = counttakes(filmname, filmfolder, 1, 1) 1725 imagename = filmfolder + filmname + '/scene' + str(1).zfill(3) + '/shot' + str(1).zfill(3) + '/take' + str(p).zfill(3) + '.jpeg' 1726 imagename = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/take' + str(take).zfill(3) + '.jpeg' 1727 overlay = displayimage(camera, imagename, overlay, 3) 1728 oldscene = scene 1729 oldshot = shot 1730 oldtake = take 1731 updatethumb = False 1732 scenes = countscenes(filmfolder, filmname) 1733 shots = countshots(filmname, filmfolder, scene) 1734 takes = counttakes(filmname, filmfolder, scene, shot) 1735 #If auto dont show value show auto (impovement here to show different colors in gui, yes!!?) 1736 if camera.iso == 0: 1737 cameraiso = 'auto' 1738 else: 1739 cameraiso = str(camera.iso) 1740 if camera.shutter_speed == 0: 1741 camerashutter = 'auto' 1742 else: 1743 camerashutter = str(camera.exposure_speed).zfill(5) 1744 if camera.awb_mode == 'auto': 1745 camerared = 'auto' 1746 camerablue = 'auto' 1747 else: 1748 camerared = str(float(camera.awb_gains[0]))[:4] 1749 camerablue = str(float(camera.awb_gains[1]))[:4] 1750 1751 #Check if menu is changed and save settings / sec 1752 if buttonpressed == True or recording == True or rendermenu == True: 1753 lastmenu = menu[selected] 1754 if showtarinactrl == False: 1755 menu = standardmenu 1756 settings = filmname, str(scene) + '/' + str(scenes), str(shot) + '/' + 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), str(flip), str(beeps), str(reclenght), str(plughw), str(channels), str(miclevel), str(headphoneslevel), str(comp), '', cammode, diskleft, '', serverstate, searchforcameras, wifistate, '', '', '', '', '', '', live 1757 else: 1758 #tarinactrlmenu = 'FILM:', 'SCENE:', 'SHOT:', 'TAKE:', '', 'SHUTTER:', 'ISO:', 'RED:', 'BLUE:', 'FPS:', 'Q:', 'BRIGHT:', 'CONT:', 'SAT:', 'FLIP:', 'BEEP:', 'LENGTH:', 'HW:', 'CH:', 'MIC:', 'PHONES:', 'COMP:', 'TIMELAPSE', 'MODE:', 'DSK:', 'SHUTDOWN', 'SRV:', 'SEARCH:', 'WIFI:', 'CAMERA:', 'Add CAMERA', 'New FILM', 'Sync FILM', 'Sync SCENE' 1759 menu = tarinactrlmenu 1760 #settings = '',str(camselected),'','',rectime,'','','','','','','','','','' 1761 settings = filmname, str(scene) + '/' + str(scenes), str(shot) + '/' + 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), str(flip), str(beeps), str(reclenght), str(plughw), str(channels), str(miclevel), str(headphoneslevel), str(comp), '', cammode, diskleft, '', serverstate, searchforcameras, wifistate, str(camselected), '', '', '', '', '', '' 1762 #Rerender menu if picamera settings change 1763 #if settings != oldsettings or selected != oldselected: 1764 writemenu(menu,settings,selected,'',showmenu) 1765 rendermenu = False 1766 #save settings if menu has been updated and x seconds passed 1767 if recording == False: 1768 #if time.time() - pausetime > savesettingsevery: 1769 if oldsettings != settings: 1770 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] 1771 #print('saving settings') 1772 savesettings(settings_to_save, filmname, filmfolder) 1773 if time.time() - pausetime > savesettingsevery: 1774 pausetime = time.time() 1775 #NETWORKS 1776 networks=[] 1777 adapters = ifaddr.get_adapters() 1778 for adapter in adapters: 1779 print("IPs of network adapter " + adapter.nice_name) 1780 for ip in adapter.ips: 1781 if ':' not in ip.ip[0] and '127.0.0.1' != ip.ip: 1782 print(ip.ip) 1783 networks=[ip.ip] 1784 if networks != []: 1785 network=networks[0] 1786 if network not in cameras: 1787 cameras=[] 1788 cameras.append(network) 1789 else: 1790 network='not connected' 1791 if len(cameras) > 1: 1792 camerasconnected='connected '+str(len(cameras)-1) 1793 recordwithports=True 1794 vumetermessage('filming with '+camera_model +' ip:'+ cameras[camselected] + ' '+camerasconnected+' camselected:'+str(camselected)+' rec:'+str(camera_recording)) 1795 else: 1796 camerasconnected='' 1797 recordwithports=False 1798 if searchforcameras == 'on': 1799 camerasconnected='searching '+str(pingip) 1800 vumetermessage('filming with '+camera_model +' ip:'+ network + ' '+camerasconnected) 1801 disk = os.statvfs(tarinafolder + '/') 1802 diskleft = str(int(disk.f_bavail * disk.f_frsize / 1024 / 1024 / 1024)) + 'Gb' 1803 #print(term.yellow+'filming with '+camera_model +' ip:'+ network 1804 print(camselected,camera_recording,cameras) 1805 #writemessage(pressed) 1806 oldsettings = settings 1807 oldselected = selected 1808 #PING TARINAS 1809 if searchforcameras == 'on': 1810 if camera_recording == None: 1811 if pingip < 256: 1812 pingip+=1 1813 else: 1814 pingip=0 1815 #searchforcameras='off' 1816 newcamera=pingtocamera(network[:-3]+str(pingip),port,'PING') 1817 if newcamera != '': 1818 if newcamera not in cameras and newcamera not in networks: 1819 cameras.append(newcamera) 1820 vumetermessage("Found camera! "+newcamera) 1821 print('-~-') 1822 print('pinging ip: '+network[:-3]+str(pingip)) 1823 else: 1824 searchforcameras = 'off' 1825 time.sleep(keydelay) 1826 1827 #--------------Logger----------------------- 1828 1829 class logger(): 1830 def info(info): 1831 print(term.yellow(info)) 1832 def warning(warning): 1833 print('Warning: ' + warning) 1834 1835 #-------------get film db files--- 1836 1837 def get_film_files(filmname,filmfolder,db): 1838 if not os.path.isdir(filmfolder+'.videos/'): 1839 os.makedirs(filmfolder+'.videos/') 1840 filmdb = filmfolder+'.videos/tarina.db' 1841 db = web.database(dbn='sqlite', db=filmdb) 1842 try: 1843 videodb=db.select('videos') 1844 return db 1845 except: 1846 db.query("CREATE TABLE videos (id integer PRIMARY KEY, tid DATETIME, filename TEXT, foldername TEXT, filmname TEXT, scene INT, shot INT, take INT, audiolenght FLOAT, videolenght FLOAT,soundlag FLOAT, audiosync FLOAT);") 1847 videodb=db.select('videos') 1848 return db 1849 1850 #--------------Save settings----------------- 1851 1852 def savesettings(settings, filmname, filmfolder): 1853 #db.insert('videos', tid=datetime.datetime.now()) 1854 try: 1855 with open(filmfolder + filmname + "/settings.p", "wb") as f: 1856 pickle.dump(settings, f) 1857 #logger.info("settings saved") 1858 except: 1859 logger.warning("could not save settings") 1860 #logger.warning(e) 1861 return 1862 1863 #--------------Load film settings-------------- 1864 1865 def loadsettings(filmfolder, filmname): 1866 try: 1867 settings = pickle.load(open(filmfolder + filmname + "/settings.p", "rb")) 1868 logger.info("settings loaded") 1869 return settings 1870 except: 1871 logger.info("couldnt load settings") 1872 return '' 1873 1874 1875 ##---------------Connection---------------------------------------------- 1876 def pingtocamera(host, port, data): 1877 print("Sending to "+host+" on port "+str(port)+" DATA:"+data) 1878 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 1879 s.settimeout(0.05) 1880 newcamera='' 1881 try: 1882 while True: 1883 s.connect((host, port)) 1884 s.send(str.encode(data)) 1885 newcamera=host 1886 print("Sent to server..") 1887 break 1888 except: 1889 print('did not connect') 1890 s.close() 1891 return newcamera 1892 1893 ##---------------Send to server---------------------------------------------- 1894 1895 def sendtocamera(host, port, data): 1896 print("Sending to "+host+" on port "+str(port)+" DATA:"+data) 1897 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 1898 s.settimeout(5) 1899 try: 1900 while True: 1901 s.connect((host, port)) 1902 s.send(str.encode(data)) 1903 print("Sent to server..") 1904 break 1905 except: 1906 print('did not connect') 1907 s.close() 1908 1909 ##---------------Send to server---------------------------------------------- 1910 1911 def sendtoserver(host, port, data): 1912 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 1913 try: 1914 while True: 1915 print('sending data to '+host+':'+str(port)) 1916 s.connect((host, port)) 1917 s.send(str.encode(data)) 1918 s.close() 1919 break 1920 except: 1921 print('sometin rong') 1922 1923 ##--------------Listen for Clients----------------------- 1924 1925 def listenforclients(host, port, q): 1926 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 1927 s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 1928 s.bind((host,port)) 1929 #s.settimeout(0.1) 1930 try: 1931 print("listening on port "+str(port)) 1932 s.listen(5) 1933 c, addr = s.accept() 1934 while True: 1935 data = c.recv(1024).decode() 1936 if not data: 1937 print("no data") 1938 break 1939 else: 1940 if addr: 1941 #print(addr[0],' sending back') 1942 #sendtoserver(addr[0],port,'rebounce'+data) 1943 nextstatus = data 1944 print("got data:"+nextstatus) 1945 c.close() 1946 q.put(nextstatus+'*'+addr[0]) 1947 break 1948 except: 1949 print("somthin wrong") 1950 q.put('') 1951 1952 #--------------Write the menu layer to dispmanx-------------- 1953 1954 def writemenu(menu,settings,selected,header,showmenu): 1955 global menudone, rendermenu 1956 oldmenu=menudone 1957 menudone = '' 1958 menudoneprint = '' 1959 menudone += str(selected) + '\n' 1960 menudone += str(showmenu) + '\n' 1961 menudone += header + '\n' 1962 n = 0 1963 for i, s in zip(menu, settings): 1964 menudone += i + s + '\n' 1965 if n == selected: 1966 menudoneprint += term.black_on_darkkhaki(i+s) + ' | ' 1967 else: 1968 menudoneprint += i + ' ' + s + ' | ' 1969 n += 1 1970 spaces = len(menudone) - 500 1971 menudone += spaces * ' ' 1972 if oldmenu != menudone or rendermenu == True: 1973 print(term.clear+term.home) 1974 if showmenu == 0: 1975 print(term.red+menudoneprint) 1976 else: 1977 print(menudoneprint) 1978 #menudone += 'EOF' 1979 f = open('/dev/shm/interface', 'w') 1980 f.write(menudone) 1981 f.close() 1982 return menudone 1983 1984 #------------Write to screen---------------- 1985 1986 def writemessage(message): 1987 menudone = "" 1988 menudone += '420' + '\n' 1989 menudone += message + '\n' 1990 #menudone += 'EOF' 1991 #clear = 500 1992 #clear = clear - len(message) 1993 f = open('/dev/shm/interface', 'w') 1994 f.write(menudone) 1995 f.close() 1996 1997 #------------Write to vumeter (last line)----- 1998 1999 def vumetermessage(message): 2000 clear = 72 2001 clear = clear - len(message) 2002 f = open('/dev/shm/vumeter', 'w') 2003 f.write(message + clear * ' ') 2004 f.close() 2005 2006 #------------Count file size----- 2007 2008 def countvideosize(filename): 2009 size = 0 2010 if type(filename) is list: 2011 size = 0 2012 for i in filename[:]: 2013 size = size + os.stat(i + '.mp4').st_size 2014 if type(filename) is str: 2015 size = os.stat(filename + '.mp4').st_size 2016 return size/1024 2017 2018 def countsize(filename): 2019 size = 0 2020 if type(filename) is str: 2021 size = os.stat(filename).st_size 2022 return size/1024 2023 2024 #------------Count scenes, takes and shots----- 2025 2026 def countlast(filmname, filmfolder): 2027 scenes = 0 2028 shots = 0 2029 takes = 0 2030 try: 2031 allfiles = os.listdir(filmfolder + filmname) 2032 except: 2033 allfiles = [] 2034 scenes = 0 2035 for a in allfiles: 2036 if 'scene' in a: 2037 scenes = scenes + 1 2038 try: 2039 allfiles = os.listdir(filmfolder + filmname + '/scene' + str(scenes).zfill(3)) 2040 except: 2041 allfiles = [] 2042 shots = 0 2043 for a in allfiles: 2044 if 'shot' in a: 2045 shots = shots + 1 2046 try: 2047 allfiles = os.listdir(filmfolder + filmname + '/scene' + str(scenes).zfill(3) + '/shot' + str(shots).zfill(3)) 2048 except: 2049 allfiles = [] 2050 takes = 0 2051 for a in allfiles: 2052 if '.mp4' in a or '.h264' in a: 2053 takes = takes + 1 2054 return scenes, shots, takes 2055 2056 #------------Count scenes-------- 2057 2058 def countscenes(filmfolder, filmname): 2059 scenes = 0 2060 try: 2061 allfiles = os.listdir(filmfolder + filmname) 2062 except: 2063 allfiles = [] 2064 scenes = 0 2065 for a in allfiles: 2066 if 'scene' in a: 2067 scenes = scenes + 1 2068 return scenes 2069 2070 #------------Count shots-------- 2071 2072 def countshots(filmname, filmfolder, scene): 2073 shots = 0 2074 try: 2075 allfiles = os.listdir(filmfolder + filmname + '/scene' + str(scene).zfill(3)) 2076 except: 2077 allfiles = [] 2078 shots = 0 2079 for a in allfiles: 2080 if 'shot' in a: 2081 shots = shots + 1 2082 return shots 2083 2084 #------------Count takes-------- 2085 2086 def counttakes(filmname, filmfolder, scene, shot): 2087 takes = 0 2088 doubles = '' 2089 try: 2090 allfiles = os.listdir(filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3)) 2091 except: 2092 allfiles = [] 2093 return takes 2094 for a in allfiles: 2095 if '.mp4' in a or '.h264' in a: 2096 if not doubles.replace('.h264', '.mp4') == a: 2097 takes = takes + 1 2098 doubles = a 2099 return takes 2100 2101 #-----------Count videos on floor----- 2102 2103 def countonfloor(filmname, filmfolder): 2104 print('dsad') 2105 2106 2107 #------------Run Command------------- 2108 2109 def run_command(command_line): 2110 #command_line_args = shlex.split(command_line) 2111 logger.info('Running: "' + command_line + '"') 2112 try: 2113 p = subprocess.Popen(command_line, shell=True).wait() 2114 # process_output is now a string, not a file, 2115 # you may want to do: 2116 except (OSError, CalledProcessError) as exception: 2117 logger.warning('Exception occured: ' + str(exception)) 2118 logger.warning('Process failed') 2119 return False 2120 else: 2121 # no exception was raised 2122 logger.info('Process finished') 2123 return True 2124 2125 #-------------Display bakg------------------- 2126 2127 def displaybakg(camera, filename, underlay, layer): 2128 # Load the arbitrarily sized image 2129 img = Image.open(filename) 2130 # Create an image padded to the required size with 2131 # mode 'RGB' 2132 pad = Image.new('RGB', ( 2133 ((img.size[0] + 31) // 32) * 32, 2134 ((img.size[1] + 15) // 16) * 16, 2135 )) 2136 # Paste the original image into the padded one 2137 pad.paste(img, (0, 0)) 2138 2139 # Add the overlay with the padded image as the source, 2140 # but the original image's dimensions 2141 underlay = camera.add_overlay(pad.tobytes(), size=img.size) 2142 # By default, the overlay is in layer 0, beneath the 2143 # preview (which defaults to layer 2). Here we make 2144 # the new overlay semi-transparent, then move it above 2145 # the preview 2146 underlay.alpha = 255 2147 underlay.layer = layer 2148 2149 #-------------Display jpeg------------------- 2150 2151 def displayimage(camera, filename, overlay, layer): 2152 # Load the arbitrarily sized image 2153 try: 2154 img = Image.open(filename) 2155 except: 2156 #writemessage('Seems like an empty shot. Hit record!') 2157 overlay = removeimage(camera, overlay) 2158 return overlay 2159 camera.stop_preview() 2160 # Create an image padded to the required size with 2161 # mode 'RGB' 2162 pad = Image.new('RGB', ( 2163 ((img.size[0] + 31) // 32) * 32, 2164 ((img.size[1] + 15) // 16) * 16, 2165 )) 2166 # Paste the original image into the padded one 2167 pad.paste(img, (0, 0)) 2168 2169 # Add the overlay with the padded image as the source, 2170 # but the original image's dimensions 2171 overlay = camera.add_overlay(pad.tobytes(), size=img.size) 2172 # By default, the overlay is in layer 0, beneath the 2173 # preview (which defaults to layer 2). Here we make 2174 # the new overlay semi-transparent, then move it above 2175 # the preview 2176 overlay.alpha = 255 2177 overlay.layer = layer 2178 return overlay 2179 2180 def removeimage(camera, overlay): 2181 if overlay: 2182 try: 2183 camera.remove_overlay(overlay) 2184 overlay = None 2185 camera.start_preview() 2186 except: 2187 pass 2188 return overlay 2189 2190 2191 #-------------Browse------------------ 2192 2193 def browse(filmname, filmfolder, scene, shot, take): 2194 scenes = countscenes(filmfolder, filmname) 2195 shots = countshots(filmname, filmfolder, scene) 2196 takes = counttakes(filmname, filmfolder, scene, shot) 2197 return scenes, shots, takes 2198 2199 #-------------Browse2.0------------------ 2200 2201 def browse2(filmname, filmfolder, scene, shot, take, n, b): 2202 scenes = countscenes(filmfolder, filmname) 2203 shots = countshots(filmname, filmfolder, scene) 2204 takes = counttakes(filmname, filmfolder, scene, shot) 2205 #writemessage(str(scene) + ' < ' + str(scenes)) 2206 #time.sleep(4) 2207 selected = n 2208 if selected == 0 and b == 1: 2209 if scene < scenes + 1: #remove this if u want to select any scene 2210 scene = scene + 1 2211 shot = countshots(filmname, filmfolder, scene) 2212 take = counttakes(filmname, filmfolder, scene, shot) 2213 #if take == 0: 2214 #shot = shot - 1 2215 #take = counttakes(filmname, filmfolder, scene, shot - 1) 2216 elif selected == 1 and b == 1: 2217 if shot < shots + 1: #remove this if u want to select any shot 2218 shot = shot + 1 2219 take = counttakes(filmname, filmfolder, scene, shot) 2220 elif selected == 2 and b == 1: 2221 if take < takes + 1: 2222 take = take + 1 2223 elif selected == 0 and b == -1: 2224 if scene > 1: 2225 scene = scene - 1 2226 shot = countshots(filmname, filmfolder, scene) 2227 take = counttakes(filmname, filmfolder, scene, shot) 2228 #if take == 0: 2229 # shot = shot - 1 2230 # take = counttakes(filmname, filmfolder, scene, shot - 1) 2231 elif selected == 1 and b == -1: 2232 if shot > 1: 2233 shot = shot - 1 2234 take = counttakes(filmname, filmfolder, scene, shot) 2235 elif selected == 2 and b == -1: 2236 if take > 1: 2237 take = take - 1 2238 return scene, shot, take 2239 2240 #-------------Update------------------ 2241 2242 def update(tarinaversion, tarinavername): 2243 logger.info('Current version ' + tarinaversion[:-1] + ' ' + tarinavername[:-1]) 2244 time.sleep(2) 2245 logger.info('Checking for updates...') 2246 try: 2247 run_command('wget -N https://raw.githubusercontent.com/rbckman/tarina/master/VERSION -P /tmp/') 2248 except: 2249 logger.info('Sorry buddy, no internet connection') 2250 time.sleep(2) 2251 return tarinaversion, tarinavername 2252 try: 2253 f = open('/tmp/VERSION') 2254 versionnumber = f.readline() 2255 versionname = f.readline() 2256 except: 2257 logger.info('hmm.. something wrong with the update') 2258 if round(float(tarinaversion),3) < round(float(versionnumber),3): 2259 logger.info('New version found ' + versionnumber[:-1] + ' ' + versionname[:-1]) 2260 time.sleep(4) 2261 logger.info('Updating...') 2262 run_command('git -C ' + tarinafolder + ' pull') 2263 #run_command('sudo ' + tarinafolder + '/install.sh') 2264 logger.info('Update done, will now reboot Tarina') 2265 waitforanykey() 2266 logger.info('Hold on rebooting Tarina...') 2267 run_command('sudo reboot') 2268 logger.info('Version is up-to-date!') 2269 return tarinaversion, tarinavername 2270 2271 #-------------Get films--------------- 2272 2273 def getfilms(filmfolder): 2274 #get a list of films, in order of settings.p file last modified 2275 films_sorted = [] 2276 films = next(os.walk(filmfolder))[1] 2277 for i in films: 2278 if not '.videos' in i: 2279 if os.path.isfile(filmfolder + i + '/' + 'settings.p') == True: 2280 lastupdate = os.path.getmtime(filmfolder + i + '/' + 'settings.p') 2281 films_sorted.append((i,lastupdate)) 2282 else: 2283 films_sorted.append((i,0)) 2284 films_sorted = sorted(films_sorted, key=lambda tup: tup[1], reverse=True) 2285 logger.info('*-- Films --*') 2286 for p in films_sorted: 2287 logger.info(p[0]) 2288 return films_sorted 2289 2290 #-------------Load tarina config--------------- 2291 2292 def getconfig(camera): 2293 filmfolder='' 2294 version = camera.revision 2295 home = os.path.expanduser('~') 2296 configfile = home + '/.tarina/config.ini' 2297 configdir = os.path.dirname(configfile) 2298 if not os.path.isdir(configdir): 2299 os.makedirs(configdir) 2300 config = configparser.ConfigParser() 2301 if config.read(configfile): 2302 try: 2303 camera_model = config['SENSOR']['model'] 2304 except: 2305 logger.info("couldnt read config") 2306 try: 2307 camera_revision = config['SENSOR']['revision'] 2308 except: 2309 logger.info("couldnt read config") 2310 try: 2311 filmfolder = config['USER']['filmfolder'] 2312 return camera_model, camera_revision, filmfolder+'/' 2313 except: 2314 logger.info("couldnt read config") 2315 if version == 'imx219': 2316 config['SENSOR'] = {} 2317 config['SENSOR']['model'] = version 2318 config['SENSOR']['revision'] = 'standard' 2319 with open(configfile, 'w') as f: 2320 config.write(f) 2321 camera_model = version 2322 camera_revision = 'standard' 2323 elif version == 'imx477': 2324 config['SENSOR'] = {} 2325 config['SENSOR']['model'] = version 2326 config['SENSOR']['revision'] = 'hq-camera' 2327 camera_model = version 2328 camera_revision = 'hq-camera' 2329 with open(configfile, 'w') as f: 2330 config.write(f) 2331 else: 2332 pressed = '' 2333 buttonpressed = '' 2334 buttontime = time.time() 2335 holdbutton = '' 2336 selected = 0 2337 header = 'What revision of ' + version + ' sensor are you using?' 2338 menu = 'rev.C', 'rev.D', 'hq-camera' 2339 while True: 2340 settings = '', '', '' 2341 writemenu(menu,settings,selected,header,showmenu) 2342 pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton) 2343 if pressed == 'right': 2344 if selected < (len(settings) - 1): 2345 selected = selected + 1 2346 elif pressed == 'left': 2347 if selected > 0: 2348 selected = selected - 1 2349 elif pressed == 'middle': 2350 camera_model = version 2351 camera_revision = menu[selected] 2352 config['SENSOR'] = {} 2353 config['SENSOR']['model'] = camera_model 2354 config['SENSOR']['revision'] = camera_revision 2355 with open(configfile, 'w') as f: 2356 config.write(f) 2357 time.sleep(0.02) 2358 2359 if filmfolder != '': 2360 return version, camera_revision, filmfolder+'/' 2361 else: 2362 filmfolder = namesomething('Your film folder: ', home+'/Videos') 2363 config['USER'] = {} 2364 config['USER']['filmfolder'] = filmfolder 2365 with open(configfile, 'w') as f: 2366 config.write(f) 2367 return camera_model, camera_revision, filmfolder+'/' 2368 2369 #-------------Calc folder size with du----------- 2370 2371 def du(path): 2372 """disk usage in human readable format (e.g. '2,1GB')""" 2373 return subprocess.check_output(['du','-sh', path]).split()[0].decode('utf-8') 2374 2375 2376 #------------Clean up---------------- 2377 2378 def cleanupdisk(filmname, filmfolder): 2379 alloriginfiles=[] 2380 films = getfilms(filmfolder) 2381 for f in films: 2382 alloriginfiles.extend(organize(filmfolder,f[0])) 2383 print(alloriginfiles) 2384 filesinfolder = next(os.walk(filmfolder+'.videos/'))[2] 2385 filesfolder=[] 2386 for i in filesinfolder: 2387 filesfolder.append(filmfolder+'.videos/'+i) 2388 print(filesfolder) 2389 for i in alloriginfiles: 2390 if i in filesfolder: 2391 print("YES, found link to origin") 2392 else: 2393 print("NOPE, no link to origin") 2394 print(i) 2395 #os.system('rm ' + i) 2396 #for i in filesfolder: 2397 # if i in alloriginfiles: 2398 # print("YES, found link to origin") 2399 # else: 2400 # print("NOPE, no link to origin") 2401 # print(i) 2402 # os.system('rm ' + i) 2403 2404 #-------------Load film--------------- 2405 2406 def loadfilm(filmname, filmfolder): 2407 pressed = '' 2408 buttonpressed = '' 2409 buttontime = time.time() 2410 holdbutton = '' 2411 films = getfilms(filmfolder) 2412 filmsize=[] 2413 for f in films: 2414 filmsize.append(du(filmfolder+f[0])) 2415 filmstotal = len(films[1:]) 2416 selectedfilm = 0 2417 selected = 0 2418 header = 'Up and down to select and load film' 2419 menu = 'FILM:', 'BACK' 2420 while True: 2421 settings = films[selectedfilm][0], '' 2422 writemenu(menu,settings,selected,header,showmenu) 2423 vumetermessage('filmsize: '+filmsize[selectedfilm]+' date: '+time.strftime('%Y-%m-%d %H:%M:%S',time.gmtime(films[selectedfilm][1]))) 2424 pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton) 2425 if pressed == 'down': 2426 if selectedfilm < filmstotal: 2427 selectedfilm = selectedfilm + 1 2428 elif pressed == 'up': 2429 if selectedfilm > 0: 2430 selectedfilm = selectedfilm - 1 2431 elif pressed == 'right': 2432 if selected < (len(settings) - 1): 2433 selected = selected + 1 2434 elif pressed == 'left': 2435 if selected > 0: 2436 selected = selected - 1 2437 elif pressed == 'middle' and menu[selected] == 'FILM:': 2438 filmname = films[selectedfilm][0] 2439 return filmname 2440 elif pressed == 'middle' and menu[selected] == 'BACK': 2441 writemessage('Returning') 2442 return filmname 2443 time.sleep(0.02) 2444 2445 2446 #---------Name anything really----------- 2447 2448 def namesomething(what, readymadeinput): 2449 global abc 2450 anything = readymadeinput 2451 pressed = '' 2452 buttonpressed = '' 2453 buttontime = time.time() 2454 holdbutton = '' 2455 abcx = 0 2456 helpmessage = 'Up, Down (select characters) Right (next). Middle (done)' 2457 cursor = '_' 2458 blinking = True 2459 pausetime = time.time() 2460 while True: 2461 message = what + anything 2462 print(term.clear+term.home) 2463 print(message+cursor) 2464 writemessage(message + cursor) 2465 vumetermessage(helpmessage) 2466 pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton) 2467 if event == ' ': 2468 event = '_' 2469 if pressed == 'down': 2470 pausetime = time.time() 2471 if abcx < (len(abc) - 1): 2472 abcx = abcx + 1 2473 cursor = abc[abcx] 2474 elif pressed == 'up': 2475 pausetime = time.time() 2476 if abcx > 0: 2477 abcx = abcx - 1 2478 cursor = abc[abcx] 2479 elif pressed == 'right': 2480 pausetime = time.time() 2481 if len(anything) < 30: 2482 anything = anything + abc[abcx] 2483 cursor = abc[abcx] 2484 else: 2485 helpmessage = 'Yo, maximum characters reached bro!' 2486 elif pressed == 'left' or pressed == 'remove': 2487 pausetime = time.time() 2488 if len(anything) > 0: 2489 anything = anything[:-1] 2490 cursor = abc[abcx] 2491 elif pressed == 'middle' or event == 10: 2492 if len(anything) > 0: 2493 if abc[abcx] != '_': 2494 anything = anything + abc[abcx] 2495 return anything 2496 elif event in abc: 2497 pausetime = time.time() 2498 anything = anything + event 2499 if time.time() - pausetime > 0.5: 2500 if blinking == True: 2501 cursor = abc[abcx] 2502 if blinking == False: 2503 cursor = ' ' 2504 blinking = not blinking 2505 pausetime = time.time() 2506 time.sleep(keydelay) 2507 2508 2509 #-------------New film---------------- 2510 2511 def nameyourfilm(filmfolder, filmname, abc, newfilm): 2512 oldfilmname = filmname 2513 if newfilm == True: 2514 filmname = '' 2515 pressed = '' 2516 buttonpressed = '' 2517 buttontime = time.time() 2518 holdbutton = '' 2519 abcx = 0 2520 helpmessage = 'Left (remove), Up, Down (select characters) Right (next). Middle (done), Retake (Cancel)' 2521 vumetermessage('Press enter if you want to leave it untitled') 2522 cursor = '_' 2523 blinking = True 2524 pausetime = time.time() 2525 while True: 2526 if newfilm == True: 2527 message = 'New film name: ' + filmname 2528 else: 2529 message = 'Edit film name: ' + filmname 2530 print(term.clear+term.home) 2531 print(message+cursor) 2532 print(helpmessage) 2533 writemessage(message + cursor) 2534 vumetermessage(helpmessage) 2535 pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton) 2536 if event == ' ': 2537 event = '_' 2538 if pressed == 'down': 2539 pausetime = time.time() 2540 if abcx < (len(abc) - 1): 2541 abcx = abcx + 1 2542 cursor = abc[abcx] 2543 elif pressed == 'up': 2544 pausetime = time.time() 2545 if abcx > 0: 2546 abcx = abcx - 1 2547 cursor = abc[abcx] 2548 elif pressed == 'right': 2549 pausetime = time.time() 2550 if len(filmname) < 30: 2551 filmname = filmname + abc[abcx] 2552 cursor = abc[abcx] 2553 else: 2554 helpmessage = 'Yo, maximum characters reached bro!' 2555 elif pressed == 'left' or pressed == 'remove': 2556 pausetime = time.time() 2557 if len(filmname) > 0: 2558 filmname = filmname[:-1] 2559 cursor = abc[abcx] 2560 elif pressed == 'middle' or event == 10: 2561 if filmname == '': 2562 filmname='untitledfilm' 2563 if len(filmname) > 0: 2564 if abc[abcx] != '_': 2565 filmname = filmname + abc[abcx] 2566 try: 2567 if filmname == oldfilmname: 2568 return oldfilmname 2569 elif filmname in getfilms(filmfolder)[0]: 2570 helpmessage = 'this filmname is already taken! make a sequel!' 2571 filmname = filmname+'2' 2572 elif filmname not in getfilms(filmfolder)[0]: 2573 logger.info("New film " + filmname) 2574 return(filmname) 2575 except: 2576 logger.info("New film " + filmname) 2577 return(filmname) 2578 elif pressed == 'retake': 2579 return oldfilmname 2580 elif event in abc: 2581 pausetime = time.time() 2582 filmname = filmname + event 2583 if time.time() - pausetime > 0.5: 2584 if blinking == True: 2585 cursor = abc[abcx] 2586 if blinking == False: 2587 cursor = ' ' 2588 blinking = not blinking 2589 pausetime = time.time() 2590 time.sleep(keydelay) 2591 2592 #-------------New camera---------------- 2593 2594 def newcamera_ip(abc, network): 2595 pressed = '' 2596 buttonpressed = '' 2597 buttontime = time.time() 2598 holdbutton = '' 2599 abcx = 0 2600 helpmessage = 'Up, Down (select characters) Right (next). Middle (done), Retake (Cancel)' 2601 cursor = '_' 2602 blinking = True 2603 pausetime = time.time() 2604 ip_network = network.split('.')[:-1] 2605 ip_network = '.'.join(ip_network)+'.' 2606 ip = '' 2607 while True: 2608 message = 'Camera ip: ' + ip_network + ip 2609 print(term.clear+term.home) 2610 print(message+cursor) 2611 writemessage(message + cursor) 2612 vumetermessage(helpmessage) 2613 pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton) 2614 if event == ' ': 2615 event = '_' 2616 if pressed == 'down': 2617 pausetime = time.time() 2618 if abcx < (len(abc) - 1): 2619 abcx = abcx + 1 2620 cursor = abc[abcx] 2621 elif pressed == 'up': 2622 pausetime = time.time() 2623 if abcx > 0: 2624 abcx = abcx - 1 2625 cursor = abc[abcx] 2626 elif pressed == 'right': 2627 pausetime = time.time() 2628 if len(ip) < 2: 2629 ip = ip + abc[abcx] 2630 cursor = abc[abcx] 2631 else: 2632 helpmessage = 'Yo, maximum ip reached bro!' 2633 elif pressed == 'left' or pressed == 'remove': 2634 pausetime = time.time() 2635 if len(ip) > 0: 2636 ip = ip[:-1] 2637 cursor = abc[abcx] 2638 elif pressed == 'middle' or event == 10: 2639 if abc[abcx] != ' ' or ip != '': 2640 ip = ip + abc[abcx] 2641 if int(ip) < 256: 2642 logger.info("New camera " + ip_network+ip) 2643 return (ip_network+ip).strip() 2644 else: 2645 helpmessage = 'in the range of ips 1-256' 2646 elif pressed == 'retake': 2647 return '' 2648 elif event in abc: 2649 pausetime = time.time() 2650 ip = ip + event 2651 if time.time() - pausetime > 0.5: 2652 if blinking == True: 2653 cursor = abc[abcx] 2654 if blinking == False: 2655 cursor = ' ' 2656 blinking = not blinking 2657 pausetime = time.time() 2658 time.sleep(keydelay) 2659 2660 #------------Timelapse-------------------------- 2661 2662 def timelapse(beeps,camera,filmname,foldername,filename,between,duration,backlight): 2663 pressed = '' 2664 buttonpressed = '' 2665 buttontime = time.time() 2666 holdbutton = '' 2667 sound = False 2668 selected = 0 2669 header = 'Adjust delay in seconds between videos' 2670 menu = 'DELAY:', 'DURATION:', 'SOUND:', 'START', 'BACK' 2671 while True: 2672 settings = str(round(between,2)), str(round(duration,2)), str(sound), '', '' 2673 writemenu(menu,settings,selected,header,showmenu) 2674 seconds = (3600 / between) * duration 2675 vumetermessage('1 h timelapse filming equals ' + str(round(seconds,2)) + ' second clip ') 2676 pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton) 2677 if pressed == 'up' and menu[selected] == 'DELAY:': 2678 between = between + 1 2679 elif pressed == 'down' and menu[selected] == 'DELAY:': 2680 if between > 1: 2681 between = between - 1 2682 if pressed == 'up' and menu[selected] == 'SOUND:': 2683 sound = True 2684 elif pressed == 'down' and menu[selected] == 'SOUND:': 2685 sound = False 2686 elif pressed == 'up' and menu[selected] == 'DURATION:': 2687 duration = duration + 0.1 2688 elif pressed == 'down' and menu[selected] == 'DURATION:': 2689 if duration > 0.3: 2690 duration = duration - 0.1 2691 elif pressed == 'up' or pressed == 'down' and menu[selected] == 'SOUND:': 2692 if sound == False: 2693 sound == True 2694 if sound == True: 2695 sound == False 2696 elif pressed == 'right': 2697 if selected < (len(settings) - 1): 2698 selected = selected + 1 2699 elif pressed == 'left': 2700 if selected > 0: 2701 selected = selected - 1 2702 elif pressed == 'middle': 2703 if menu[selected] == 'START': 2704 if os.path.isdir(foldername+'timelapse') == False: 2705 os.makedirs(foldername + 'timelapse') 2706 time.sleep(0.02) 2707 writemessage('Recording timelapse, middlebutton to stop') 2708 n = 1 2709 recording = False 2710 starttime = time.time() 2711 t = 0 2712 files = [] 2713 while True: 2714 t = time.time() - starttime 2715 pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton) 2716 vumetermessage('Timelapse lenght is now ' + str(round(n * duration,2)) + ' second clip ') 2717 if recording == False and t > between: 2718 if beeps > 0: 2719 if bus: 2720 buzz(150) 2721 else: 2722 run_command('aplay -D plughw:' + str(plughw) + ' '+ tarinafolder + '/extras/beep.wav') 2723 #camera.start_recording(foldername + 'timelapse/' + filename + '_' + str(n).zfill(3) + '.h264', format='h264', quality=26, bitrate=5000000) 2724 camera.start_recording(foldername + 'timelapse/' + filename + '_' + str(n).zfill(3) + '.h264', format='h264', quality=quality, level=profilelevel) 2725 if sound == True: 2726 os.system(tarinafolder+'/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 &') 2727 files.append(foldername + 'timelapse/' + filename + '_' + str(n).zfill(3)) 2728 starttime = time.time() 2729 recording = True 2730 n = n + 1 2731 t = 0 2732 if recording == True: 2733 writemessage('Recording timelapse ' + str(n) + ' ' + 'time:' + str(round(t,2))) 2734 if recording == False: 2735 writemessage('Between timelapse ' + str(n) + ' ' + 'time:' + str(round(t,2))) 2736 if t > duration and recording == True: 2737 if sound == True: 2738 os.system('pkill arecord') 2739 camera.stop_recording() 2740 recording = False 2741 starttime = time.time() 2742 t = 0 2743 if pressed == 'screen': 2744 if backlight == False: 2745 # requires wiringpi installed 2746 run_command('gpio -g pwm 19 1023') 2747 backlight = True 2748 elif backlight == True: 2749 run_command('gpio -g pwm 19 0') 2750 backlight = False 2751 elif pressed == 'middle' and n > 1: 2752 if recording == True: 2753 os.system('pkill arecord') 2754 camera.stop_recording() 2755 #create thumbnail 2756 try: 2757 camera.capture(foldername + filename + '.jpeg', resize=(800,450), use_video_port=True) 2758 except: 2759 logger.warning('something wrong with camera jpeg capture') 2760 writemessage('Compiling timelapse') 2761 logger.info('Hold on, rendering ' + str(len(files)) + ' scenes') 2762 #RENDER VIDEO 2763 renderfilename = foldername + filename 2764 n = 1 2765 videomerge = ['MP4Box'] 2766 videomerge.append('-force-cat') 2767 for f in files: 2768 if sound == True: 2769 compileshot(f,filmfolder,filmname) 2770 audiotrim(foldername + 'timelapse/' + filename + '_' + str(n).zfill(3), 'end', '') 2771 videomerge.append('-cat') 2772 videomerge.append(f + '.mp4') 2773 else: 2774 videomerge.append('-cat') 2775 videomerge.append(f + '.h264') 2776 n = n + 1 2777 videomerge.append('-new') 2778 videomerge.append(renderfilename + '.mp4') 2779 call(videomerge, shell=False) #how to insert somekind of estimated time while it does this? 2780 ##RENDER AUDIO 2781 if sound == True: 2782 writemessage('Rendering sound') 2783 audiomerge = ['sox'] 2784 #if render > 2: 2785 # audiomerge.append(filename + '.wav') 2786 for f in files: 2787 audiomerge.append(f + '.wav') 2788 audiomerge.append(renderfilename + '.wav') 2789 call(audiomerge, shell=False) 2790 ##MAKE AUDIO SILENCE 2791 if sound == False: 2792 audiosilence(foldername,filename) 2793 #cleanup 2794 #os.system('rm -r ' + foldername + 'timelapse') 2795 vumetermessage('timelapse done! ;)') 2796 return renderfilename, between, duration 2797 time.sleep(keydelay) 2798 if menu[selected] == 'BACK': 2799 vumetermessage('ok!') 2800 return '', between, duration 2801 time.sleep(keydelay) 2802 2803 #------------Remove----------------------- 2804 2805 def remove(filmfolder, filmname, scene, shot, take, sceneshotortake): 2806 foldername = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/' 2807 filename = 'take' + str(take).zfill(3) 2808 pressed = '' 2809 buttonpressed = '' 2810 buttontime = time.time() 2811 holdbutton = '' 2812 time.sleep(0.1) 2813 header = 'Are you sure you want to remove ' + sceneshotortake + '?' 2814 menu = '', '' 2815 settings = 'NO', 'YES' 2816 selected = 0 2817 otf_scene = countscenes(filmfolder, 'onthefloor') 2818 otf_scene += 1 2819 otf_shot = countshots('onthefloor', filmfolder, otf_scene) 2820 otf_shot += 1 2821 otf_take = counttakes('onthefloor', filmfolder, otf_scene, otf_shot) 2822 otf_take += 1 2823 while True: 2824 writemenu(menu,settings,selected,header,showmenu) 2825 pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton) 2826 if pressed == 'right': 2827 if selected < (len(settings) - 1): 2828 selected = selected + 1 2829 elif pressed == 'left': 2830 if selected > 0: 2831 selected = selected - 1 2832 elif pressed == 'middle': 2833 if selected == 1: 2834 if filmname == 'onthefloor': 2835 if sceneshotortake == 'take': 2836 os.system('rm ' + foldername + filename + '.h264') 2837 os.system('rm ' + foldername + filename + '.mp4') 2838 os.system('rm ' + foldername + filename + '.wav') 2839 os.system('rm ' + foldername + filename + '.jpeg') 2840 elif sceneshotortake == 'shot' and shot > 0: 2841 os.system('rm -r ' + foldername) 2842 elif sceneshotortake == 'scene': 2843 foldername = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) 2844 os.system('rm -r ' + foldername) 2845 scene = countscenes(filmfolder, filmname) 2846 shot=1 2847 take=1 2848 elif sceneshotortake == 'film': 2849 foldername = filmfolder + filmname 2850 os.system('rm -r ' + foldername) 2851 os.makedirs(filmfolder+'onthefloor') 2852 return 2853 else: 2854 if sceneshotortake == 'take': 2855 writemessage('Throwing take on the floor' + str(take)) 2856 onthefloor = filmfolder + 'onthefloor/' + 'scene' + str(otf_scene).zfill(3) + '/shot' + str(otf_shot).zfill(3) + '/take' + str(otf_take).zfill(3) 2857 onthefloor_folder = filmfolder + 'onthefloor/' + 'scene' + str(otf_scene).zfill(3) + '/shot' + str(otf_shot).zfill(3) + '/' 2858 if os.path.isdir(onthefloor_folder) == False: 2859 os.makedirs(onthefloor) 2860 os.system('mv ' + foldername + filename + '.h264 ' + onthefloor + '.h264') 2861 os.system('mv ' + foldername + filename + '.mp4 ' + onthefloor + '.mp4') 2862 os.system('mv ' + foldername + filename + '.wav ' + onthefloor + '.wav') 2863 os.system('mv ' + foldername + filename + '.jpeg ' + onthefloor + '.jpeg') 2864 take = take - 1 2865 if take == 0: 2866 take = 1 2867 elif sceneshotortake == 'shot' and shot > 0: 2868 writemessage('Throwing shot on the floor' + str(shot)) 2869 onthefloor = filmfolder + 'onthefloor/' + 'scene' + str(otf_scene).zfill(3) + '/shot' + str(otf_shot).zfill(3)+'/' 2870 os.makedirs(onthefloor) 2871 os.system('cp -r '+foldername+'* '+onthefloor) 2872 os.system('rm -r '+foldername) 2873 take = counttakes(filmname, filmfolder, scene, shot) 2874 elif sceneshotortake == 'scene': 2875 onthefloor = filmfolder + 'onthefloor/' + 'scene' + str(otf_scene).zfill(3) 2876 os.makedirs(onthefloor) 2877 writemessage('Throwing clips on the floor ' + str(scene)) 2878 foldername = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) 2879 os.system('mv ' + foldername + '/* ' + onthefloor+'/' ) 2880 scene = countscenes(filmfolder, filmname) 2881 shot = 1 2882 take = 1 2883 elif sceneshotortake == 'film': 2884 foldername = filmfolder + filmname 2885 os.system('rm -r ' + foldername) 2886 organize(filmfolder, 'onthefloor') 2887 return 2888 elif selected == 0: 2889 return 2890 time.sleep(0.02) 2891 2892 #------------Remove and Organize---------------- 2893 2894 def organize(filmfolder, filmname): 2895 global fps, db 2896 origin_files=[] 2897 scenes = next(os.walk(filmfolder + filmname))[1] 2898 for i in scenes: 2899 if 'scene' not in i: 2900 scenes.remove(i) 2901 # Takes 2902 for i in sorted(scenes): 2903 origin_scene_files=[] 2904 shots = next(os.walk(filmfolder + filmname + '/' + i))[1] 2905 for p in sorted(shots): 2906 takes = next(os.walk(filmfolder + filmname + '/' + i + '/' + p))[2] 2907 if len(takes) == 0: 2908 logger.info('no takes in this shot, removing shot if no placeholder') 2909 if not os.path.isfile(filmfolder + filmname + '/' + i + '/' + p + '/.placeholder'): 2910 os.system('rm -r ' + filmfolder + filmname + '/' + i + '/' + p) 2911 organized_nr = 1 2912 print(i) 2913 print(p) 2914 print(sorted(takes)) 2915 #time.sleep(2) 2916 for s in sorted(takes): 2917 if '.mp4' in s or '.h264' in s: 2918 unorganized_nr = int(s[4:7]) 2919 takename = filmfolder + filmname + '/' + i + '/' + p + '/take' + str(unorganized_nr).zfill(3) 2920 if '.mp4' in s: 2921 origin=os.path.realpath(takename+'.mp4') 2922 if origin != os.path.abspath(takename+'.mp4'): 2923 print('appending: '+origin) 2924 origin_files.append(origin) 2925 origin_scene_files.append(origin) 2926 if os.path.isfile(takename+'.h264'): 2927 print('oh no boubles found!') 2928 if '.h264' in s: 2929 origin=os.path.realpath(takename+'.h264') 2930 if origin != os.path.abspath(takename+'.h264'): 2931 origin_files.append(origin) 2932 origin_scene_files.append(origin) 2933 if organized_nr == unorganized_nr: 2934 #print('correct') 2935 pass 2936 if organized_nr != unorganized_nr: 2937 print('false, correcting from ' + str(unorganized_nr) + ' to ' + str(organized_nr)) 2938 print(s) 2939 #time.sleep(3) 2940 mv = 'mv ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(unorganized_nr).zfill(3) 2941 run_command(mv + '.mp4 ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.mp4') 2942 run_command(mv + '.h264 ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.h264') 2943 run_command(mv + '.wav ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.wav') 2944 run_command(mv + '.jpeg ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.jpeg') 2945 #check if same video has both h246 and mp4 and render and remove h264 2946 for t in sorted(takes): 2947 if t.replace('.mp4','') == s.replace('.h264','') or s.replace('.mp4','') == t.replace('.h264',''): 2948 logger.info('Found both mp4 and h264 of same video!') 2949 logger.info(t) 2950 logger.info(s) 2951 #time.sleep(5) 2952 compileshot(takename,filmfolder,filmname) 2953 organized_nr -= 1 2954 organized_nr += 1 2955 origin_files.extend(origin_scene_files) 2956 with open(filmfolder+filmname+'/'+i+'/.origin_videos', 'w') as outfile: 2957 outfile.write('\n'.join(str(i) for i in origin_scene_files)) 2958 2959 # Shots 2960 for i in sorted(scenes): 2961 shots = next(os.walk(filmfolder + filmname + '/' + i))[1] 2962 if len(shots) == 0: 2963 logger.info('no shots in this scene, removing scene..') 2964 os.system('rm -r ' + filmfolder + filmname + '/' + i) 2965 organized_nr = 1 2966 for p in sorted(shots): 2967 if 'insert' in p: 2968 #add_organize(filmfolder, filmname) 2969 pass 2970 elif 'shot' in p: 2971 #print(p) 2972 unorganized_nr = int(p[-3:]) 2973 if organized_nr == unorganized_nr: 2974 #print('correct') 2975 pass 2976 if organized_nr != unorganized_nr: 2977 #print('false, correcting from ' + str(unorganized_nr) + ' to ' + str(organized_nr)) 2978 os.system('mv ' + filmfolder + filmname + '/' + i + '/shot' + str(unorganized_nr).zfill(3) + ' ' + filmfolder + filmname + '/' + i + '/shot' + str(organized_nr).zfill(3)) 2979 organized_nr += 1 2980 2981 # Scenes 2982 organized_nr = 1 2983 for i in sorted(scenes): 2984 if 'insert' in i: 2985 #add_organize(filmfolder, filmname) 2986 pass 2987 elif 'scene' in i: 2988 #print(i) 2989 unorganized_nr = int(i[-3:]) 2990 if organized_nr == unorganized_nr: 2991 #print('correct') 2992 pass 2993 if organized_nr != unorganized_nr: 2994 #print('false, correcting from ' + str(unorganized_nr) + ' to ' + str(organized_nr)) 2995 os.system('mv ' + filmfolder + filmname + '/scene' + str(unorganized_nr).zfill(3) + ' ' + filmfolder + filmname + '/scene' + str(organized_nr).zfill(3)) 2996 organized_nr += 1 2997 2998 logger.info('Organizer done! Everything is tidy') 2999 return origin_files 3000 3001 3002 #------------Add and Organize---------------- 3003 3004 def add_organize(filmfolder, filmname): 3005 scenes = next(os.walk(filmfolder + filmname))[1] 3006 for i in scenes: 3007 if 'scene' not in i: 3008 scenes.remove(i) 3009 # Shots 3010 for i in sorted(scenes): 3011 shots = next(os.walk(filmfolder + filmname + '/' + i))[1] 3012 for c in shots: 3013 if 'shot' not in c: 3014 shots.remove(c) 3015 organized_nr = len(shots) 3016 for p in sorted(shots, reverse=True): 3017 if 'yanked' in p: 3018 #print(p) 3019 os.system('mv -n ' + filmfolder + filmname + '/' + i + '/shot' + str(organized_nr - 1).zfill(3) + '_yanked ' + filmfolder + filmname + '/' + i + '/shot' + str(organized_nr).zfill(3)) 3020 elif 'insert' in p: 3021 os.system('mv -n ' + filmfolder + filmname + '/' + i + '/shot' + str(organized_nr - 1).zfill(3) + '_insert ' + filmfolder + filmname + '/' + i + '/shot' + str(organized_nr).zfill(3)) 3022 run_command('touch ' + filmfolder + filmname + '/' + i + '/shot' + str(organized_nr).zfill(3) + '/.placeholder') 3023 elif 'shot' in p: 3024 #print(p) 3025 unorganized_nr = int(p[-3:]) 3026 if organized_nr == unorganized_nr: 3027 #print('correct') 3028 pass 3029 if organized_nr != unorganized_nr: 3030 #print('false, correcting from ' + str(unorganized_nr) + ' to ' + str(organized_nr)) 3031 os.system('mv -n ' + filmfolder + filmname + '/' + i + '/shot' + str(unorganized_nr).zfill(3) + ' ' + filmfolder + filmname + '/' + i + '/shot' + str(organized_nr).zfill(3)) 3032 organized_nr -= 1 3033 3034 # Scenes 3035 organized_nr = len(scenes) 3036 for i in sorted(scenes, reverse=True): 3037 #print(i) 3038 if 'yanked' in i: 3039 os.system('mv -n ' + filmfolder + filmname + '/scene' + str(organized_nr - 1).zfill(3) + '_yanked ' + filmfolder + filmname + '/scene' + str(organized_nr).zfill(3)) 3040 elif 'insert' in i: 3041 #print(p) 3042 os.system('mv -n ' + filmfolder + filmname + '/scene' + str(organized_nr - 1).zfill(3) + '_insert ' + filmfolder + filmname + '/scene' + str(organized_nr).zfill(3)) 3043 run_command('touch ' + filmfolder + filmname + '/scene' + str(organized_nr).zfill(3) + '/.placeholder') 3044 elif 'scene' in i: 3045 #print(i) 3046 unorganized_nr = int(i[-3:]) 3047 if organized_nr == unorganized_nr: 3048 #print('correct') 3049 pass 3050 if organized_nr != unorganized_nr: 3051 #print('false, correcting from ' + str(unorganized_nr) + ' to ' + str(organized_nr)) 3052 os.system('mv -n ' + filmfolder + filmname + '/scene' + str(unorganized_nr).zfill(3) + ' ' + filmfolder + filmname + '/scene' + str(organized_nr).zfill(3)) 3053 organized_nr -= 1 3054 return 3055 3056 3057 #-------------Stretch Audio-------------- 3058 3059 def stretchaudio(filename,fps): 3060 fps_rounded=round(fps) 3061 if int(fps_rounded) != 25: 3062 pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + filename + '.mp4', shell=True) 3063 videolenght = pipe.decode().strip() 3064 try: 3065 pipe = subprocess.check_output('mediainfo --Inform="Audio;%Duration%" ' + filename + '.wav', shell=True) 3066 audiolenght = pipe.decode().strip() 3067 except: 3068 audiosilence('',filename) 3069 audiolenght=videolenght 3070 #if there is no audio lenght 3071 logger.info('audio is:' + audiolenght) 3072 if not audiolenght.strip(): 3073 audiolenght = 0 3074 ratio = int(audiolenght)/int(videolenght) 3075 print(str(ratio)) 3076 run_command('cp '+filename+'.wav '+filename+'_temp.wav') 3077 run_command('ffmpeg -y -i ' + filename + '_temp.wav -filter:a atempo="'+str(ratio) + '" ' + filename + '.wav') 3078 os.remove(filename + '_temp.wav') 3079 #time.sleep(5) 3080 return 3081 3082 #-------------Compile Shot-------------- 3083 3084 def compileshot(filename,filmfolder,filmname): 3085 global fps, soundrate, channels 3086 videolenght=0 3087 audiolenght=0 3088 #Check if file already converted 3089 if '.h264' in filename: 3090 filename=filename.replace('.h264','') 3091 if '.mp4' in filename: 3092 filename=filename.replace('.mp4','') 3093 if os.path.isfile(filename + '.h264'): 3094 logger.info('Video not converted!') 3095 writemessage('Converting to playable video') 3096 #remove old mp4 if corrupted like if an unpredicted shutdown in middle of converting 3097 video_origins = (os.path.realpath(filename+'.h264'))[:-5] 3098 os.system('rm ' + filename + '.mp4') 3099 os.system('rm ' + video_origins + '.mp4') 3100 print(filename+'.mp4 removed!') 3101 run_command('MP4Box -fps 25 -add ' + video_origins + '.h264 ' + video_origins + '.mp4') 3102 os.system('ln -sf '+video_origins+'.mp4 '+filename+'.mp4') 3103 if not os.path.isfile(filename + '.wav'): 3104 audiosilence('',filename) 3105 #add audio/video start delay sync 3106 run_command('sox -V0 '+filename+'.wav -c 2 /dev/shm/temp.wav trim 0.013') 3107 run_command('mv /dev/shm/temp.wav '+ filename + '.wav') 3108 stretchaudio(filename,fps) 3109 audiosync, videolenght, audiolenght = audiotrim(filename, 'end','') 3110 muxing = False 3111 if muxing == True: 3112 #muxing mp3 layer to mp4 file 3113 #count estimated audio filesize with a bitrate of 320 kb/s 3114 audiosize = countsize(filename + '.wav') * 0.453 3115 p = Popen(['ffmpeg', '-y', '-i', filename + '.wav', '-acodec', 'libmp3lame', '-ac', '2', '-b:a', '320k', filename + '.mp3']) 3116 while p.poll() is None: 3117 time.sleep(0.2) 3118 try: 3119 rendersize = countsize(filename + '.mp3') 3120 except: 3121 continue 3122 writemessage('audio rendering ' + str(int(rendersize)) + ' of ' + str(int(audiosize)) + ' kb done') 3123 ##MERGE AUDIO & VIDEO 3124 writemessage('Merging audio & video') 3125 #os.remove(renderfilename + '.mp4') 3126 call(['MP4Box', '-rem', '2', video_origins + '.mp4'], shell=False) 3127 call(['MP4Box', '-fps', '25', '-add', video_origins + '.mp4', '-add', filename + '.mp3', '-new', video_origins + '_tmp.mp4'], shell=False) 3128 os.system('cp -f ' + video_origins + '_tmp.mp4 ' + video_origins + '.mp4') 3129 os.remove(video_origins + '_tmp.mp4') 3130 os.remove(filename + '.mp3') 3131 origin=os.path.realpath(filename+'.mp4') 3132 db.update('videos', where='filename="'+origin+'"', videolenght=videolenght/1000, audiolenght=audiolenght/1000, audiosync=audiosync) 3133 os.system('rm ' + video_origins + '.h264') 3134 os.system('rm ' + filename + '.h264') 3135 os.system('rm /dev/shm/temp.wav') 3136 os.system('ln -sf '+video_origins+'.mp4 '+filename+'.mp4') 3137 logger.info('compile done!') 3138 #run_command('omxplayer --layer 3 ' + filmfolder + '/.rendered/' + filename + '.mp4 &') 3139 #time.sleep(0.8) 3140 #run_command('aplay ' + foldername + filename + '.wav') 3141 return 3142 3143 #-------------Get shot files-------------- 3144 3145 def shotfiles(filmfolder, filmname, scene): 3146 files = [] 3147 shots = countshots(filmname,filmfolder,scene) 3148 print("shots"+str(shots)) 3149 shot = 1 3150 for i in range(shots): 3151 takes = counttakes(filmname,filmfolder,scene,shot) 3152 if takes > 0: 3153 folder = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/' 3154 filename = 'take' + str(takes).zfill(3) 3155 files.append(folder + filename) 3156 print(folder+filename) 3157 shot = shot + 1 3158 #writemessage(str(len(shotfiles))) 3159 #time.sleep(2) 3160 return files 3161 3162 #--------Show JPEG as progress when rendering 3163 3164 #---------------Render Video------------------ 3165 3166 def rendervideo(filmfiles, filename, renderinfo): 3167 if len(filmfiles) < 1: 3168 writemessage('Nothing here!') 3169 time.sleep(2) 3170 return None 3171 print('Rendering videofiles') 3172 writemessage('Hold on, rendering ' + renderinfo + ' with ' + str(len(filmfiles)) + ' files') 3173 videosize = 0 3174 rendersize = 0 3175 videomerge = ['MP4Box'] 3176 videomerge.append('-force-cat') 3177 for f in filmfiles[:]: 3178 videosize = videosize + countsize(f + '.mp4') 3179 videomerge.append('-cat') 3180 videomerge.append(f + '.mp4#video') 3181 videomerge.append('-new') 3182 videomerge.append(filename + '.mp4') 3183 #videomerge.append(filename + '.h264') 3184 #call(videomerge, shell=True) #how to insert somekind of estimated time while it does this? 3185 p = Popen(videomerge) 3186 #show progress 3187 while p.poll() is None: 3188 time.sleep(0.1) 3189 try: 3190 rendersize = countsize(filename + '.mp4') 3191 except: 3192 continue 3193 writemessage('video rendering ' + str(int(rendersize)) + ' of ' + str(int(videosize)) + ' kb done') 3194 print('Video rendered!') 3195 return 3196 3197 #---------------Render Audio---------------- 3198 3199 def renderaudio(audiofiles, filename, dubfiles, dubmix): 3200 #if len(audiofiles) < 1: 3201 # writemessage('Nothing here!') 3202 # time.sleep(2) 3203 # return None 3204 print('Rendering audiofiles') 3205 ##PASTE AUDIO TOGETHER 3206 writemessage('Hold on, rendering audio...') 3207 audiomerge = ['sox'] 3208 #if render > 2: 3209 # audiomerge.append(filename + '.wav') 3210 if isinstance(audiofiles, list): 3211 for f in audiofiles: 3212 audiomerge.append(f + '.wav') 3213 audiomerge.append(filename + '.wav') 3214 call(audiomerge, shell=False) 3215 else: 3216 #if rendering scene with one shot 3217 if audiofiles[0] != filename: 3218 os.system('cp '+audiofiles[0]+'.wav '+filename+'.wav') 3219 #DUBBING 3220 p = 1 3221 pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + filename + '.mp4', shell=True) 3222 videolenght = pipe.decode().strip() 3223 audiolenght=videolenght 3224 for i, d in zip(dubmix, dubfiles): 3225 writemessage('Dub ' + str(p) + ' audio found lets mix...') 3226 #first trimit! 3227 audiotrim(filename, 'end', d) 3228 try: 3229 pipe = subprocess.check_output('soxi -D ' + d, shell=True) 3230 dubaudiolenght = pipe.decode() 3231 if dubaudiolengt != videolenght: 3232 print('dub wrong lenght!') 3233 time.sleep(5) 3234 except: 3235 pass 3236 os.system('cp ' + filename + '.wav ' + filename + '_tmp.wav') 3237 #Fade and make stereo 3238 run_command('sox -V0 -G ' + d + ' /dev/shm/fade.wav fade ' + str(round(i[2],1)) + ' 0 ' + str(round(i[3],1))) 3239 run_command('sox -V0 -G -m -v ' + str(round(i[0],1)) + ' /dev/shm/fade.wav -v ' + str(round(i[1],1)) + ' ' + filename + '_tmp.wav ' + filename + '.wav trim 0 ' + audiolenght) 3240 os.remove(filename + '_tmp.wav') 3241 os.remove('/dev/shm/fade.wav') 3242 print('Dub mix ' + str(p) + ' done!') 3243 p += 1 3244 return 3245 3246 #-------------Fast Edit----------------- 3247 def fastedit(filmfolder, filmname, filmfiles, scene): 3248 scenedir = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/' 3249 totlenght = 0 3250 try: 3251 os.remove(scenedir + '.fastedit') 3252 except: 3253 print('no fastedit file') 3254 for f in filmfiles: 3255 pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + f + '.mp4', shell=True) 3256 videolenght = pipe.decode().strip() 3257 totlenght = int(videolenght) + totlenght 3258 print('writing shot lenghts for fastedit mode') 3259 with open(scenedir + '.fastedit', 'a') as f: 3260 f.write(str(totlenght)+'\n') 3261 3262 3263 #-------------Get scene files-------------- 3264 3265 def scenefiles(filmfolder, filmname): 3266 files = [] 3267 scenes = countscenes(filmfolder,filmname) 3268 scene = 1 3269 while scene <= scenes: 3270 folder = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) + '/' 3271 filename = 'scene' 3272 files.append(folder + filename) 3273 scene = scene + 1 3274 #writemessage(str(len(shotfiles))) 3275 #time.sleep(2) 3276 return files 3277 3278 #-------------Render Shot------------- 3279 3280 def rendershot(filmfolder, filmname, renderfilename, scene, shot): 3281 global fps 3282 #This function checks and calls rendervideo & renderaudio if something has changed in the film 3283 #Video 3284 videohash = '' 3285 oldvideohash = '' 3286 #take = counttakes(filmname, filmfolder, scene, shot) 3287 #renderfilename = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/take' + str(take).zfill(3) 3288 # Video Hash 3289 #if something shutdown in middle of process 3290 if os.path.isfile(renderfilename + '_tmp.mp4') == True: 3291 os.system('cp ' + renderfilename + '_tmp.mp4 ' + renderfilename + '.mp4') 3292 compileshot(renderfilename,filmfolder,filmname) 3293 videohash = videohash + str(int(countsize(renderfilename + '.mp4'))) 3294 print('Videohash of shot is: ' + videohash) 3295 #if os.path.isfile(renderfilename + '.h264') and os.path.isfile(renderfilename + '.mp4'): 3296 # os.system('rm ' + renderfilename + '.h264 ') 3297 scenedir = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/' 3298 # Check if video corrupt 3299 renderfix = False 3300 if os.path.isfile(renderfilename + '.jpeg') == False: 3301 run_command('ffmpeg -sseof -1 -i ' + renderfilename + '.mp4 -update 1 -q:v 1 -vf scale=800:450 ' + renderfilename + '.jpeg') 3302 try: 3303 pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + renderfilename + '.mp4', shell=True) 3304 videolenght = pipe.decode().strip() 3305 except: 3306 videolenght = '' 3307 print('Shot lenght ' + videolenght) 3308 if videolenght == '': 3309 print('Okey, shot file not found or is corrupted') 3310 # For backwards compatibility remove old rendered scene files 3311 # run_command('rm ' + renderfilename + '*') 3312 renderfix = True 3313 try: 3314 with open(scenedir + '.videohash', 'r') as f: 3315 oldvideohash = f.readline().strip() 3316 print('oldvideohash is: ' + oldvideohash) 3317 except: 3318 print('no videohash found, making one...') 3319 with open(scenedir + '.videohash', 'w') as f: 3320 f.write(videohash) 3321 #Audio 3322 audiohash = '' 3323 oldaudiohash = '' 3324 newaudiomix = False 3325 audiohash += str(int(countsize(renderfilename + '.wav'))) 3326 dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, scene, shot) 3327 for p in dubfiles: 3328 audiohash += str(int(countsize(p))) 3329 print('Audiohash of shot is: ' + audiohash) 3330 try: 3331 with open(scenedir + '.audiohash', 'r') as f: 3332 oldaudiohash = f.readline().strip() 3333 print('oldaudiohash is: ' + oldaudiohash) 3334 except: 3335 print('no audiohash found, making one...') 3336 with open(scenedir + '.audiohash', 'w') as f: 3337 f.write(audiohash) 3338 if audiohash != oldaudiohash or newmix == True or renderfix == True: 3339 #make scene rerender 3340 os.system('touch '+filmfolder + filmname + '/scene' + str(scene).zfill(3)+'/.rerender') 3341 #copy original sound 3342 if os.path.exists(scenedir+'dub') == True: 3343 os.system('cp '+scenedir+'dub/original.wav '+renderfilename+'.wav') 3344 #os.system('cp '+dubfolder+'original.wav '+renderfilename+'.wav') 3345 renderaudio(renderfilename, renderfilename, dubfiles, dubmix) 3346 print('updating audiohash...') 3347 with open(scenedir + '.audiohash', 'w') as f: 3348 f.write(audiohash) 3349 for i in range(len(dubfiles)): 3350 os.system('cp ' + scenedir + '/dub/.settings' + str(i + 1).zfill(3) + ' ' + scenedir + '/dub/.rendered' + str(i + 1).zfill(3)) 3351 print('Audio rendered!') 3352 newaudiomix = True 3353 muxing = True 3354 if muxing == True: 3355 #muxing mp3 layer to mp4 file 3356 #count estimated audio filesize with a bitrate of 320 kb/s 3357 audiosize = countsize(renderfilename + '.wav') * 0.453 3358 os.system('mv ' + renderfilename + '.mp4 ' + renderfilename + '_tmp.mp4') 3359 if debianversion == 'stretch': 3360 p = Popen(['avconv', '-y', '-i', renderfilename + '.wav', '-acodec', 'libmp3lame', '-ac', '2', '-b:a', '320k', renderfilename + '.mp3']) 3361 else: 3362 p = Popen(['ffmpeg', '-y', '-i', renderfilename + '.wav', '-acodec', 'libmp3lame', '-ac', '2', '-b:a', '320k', renderfilename + '.mp3']) 3363 while p.poll() is None: 3364 time.sleep(0.02) 3365 try: 3366 rendersize = countsize(renderfilename + '.mp3') 3367 except: 3368 continue 3369 writemessage('audio rendering ' + str(int(rendersize)) + ' of ' + str(int(audiosize)) + ' kb done') 3370 ##MERGE AUDIO & VIDEO 3371 writemessage('Merging audio & video') 3372 #os.remove(renderfilename + '.mp4') 3373 call(['MP4Box', '-rem', '2', renderfilename + '_tmp.mp4'], shell=False) 3374 call(['MP4Box', '-add', renderfilename + '_tmp.mp4', '-add', renderfilename + '.mp3', '-new', renderfilename + '.mp4'], shell=False) 3375 try: 3376 os.remove(renderfilename + '_tmp.mp4') 3377 os.remove(renderfilename + '.mp3') 3378 except: 3379 print('nothin to remove') 3380 else: 3381 print('Already rendered!') 3382 return renderfilename, newaudiomix 3383 3384 3385 #-------------Render Scene------------- 3386 3387 def renderscene(filmfolder, filmname, scene): 3388 global fps 3389 #This function checks and calls rendervideo & renderaudio if something has changed in the film 3390 #Video 3391 videohash = '' 3392 oldvideohash = '' 3393 filmfiles = shotfiles(filmfolder, filmname, scene) 3394 renderfilename = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/scene' 3395 scenedir = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/' 3396 # Check if video corrupt 3397 renderfixscene = False 3398 try: 3399 pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + renderfilename + '.mp4', shell=True) 3400 videolenght = pipe.decode().strip() 3401 except: 3402 videolenght = '' 3403 renderfixscene = True 3404 print('Scene lenght ' + videolenght) 3405 if videolenght == '': 3406 print('Okey, hold your horses, rendering!') 3407 # For backwards compatibility remove old rendered scene files 3408 #run_command('rm ' + renderfilename + '.mp4') 3409 #run_command('rm ' + renderfilename + '.wav') 3410 #vumetermessage('corrupted scene file! removing, please render again') 3411 renderfixscene = True 3412 #return '', '' 3413 # Video Hash 3414 for p in filmfiles: 3415 #compileshot(p,filmfolder,filmname) 3416 #print(p) 3417 #time.sleep(5) 3418 scene = int(p.rsplit('scene',1)[1][:3]) 3419 shot = int(p.rsplit('shot',1)[1][:3]) 3420 rendershotname, renderfix = rendershot(filmfolder, filmname, p, scene, shot) 3421 if renderfix == True: 3422 renderfixscene = True 3423 if rendershotname: 3424 try: 3425 videohash = videohash + str(int(countsize(p + '.mp4'))) 3426 except: 3427 print('no file? ') 3428 print('Videohash of scene is: ' + videohash) 3429 try: 3430 with open(scenedir + '.videohash', 'r') as f: 3431 oldvideohash = f.readline().strip() 3432 print('oldvideohash is: ' + oldvideohash) 3433 except: 3434 print('no videohash found, making one...') 3435 with open(scenedir + '.videohash', 'w') as f: 3436 f.write(videohash) 3437 3438 print('renderfix is:'+str(renderfixscene)) 3439 # Render if needed 3440 if videohash != oldvideohash or renderfixscene == True or renderfix == True: 3441 rendervideo(filmfiles, renderfilename, 'scene ' + str(scene)) 3442 fastedit(filmfolder, filmname, filmfiles, scene) 3443 print('updating videohash...') 3444 with open(scenedir + '.videohash', 'w') as f: 3445 f.write(videohash) 3446 #time.sleep(3) 3447 3448 #Audio 3449 audiohash = '' 3450 oldaudiohash = '' 3451 newaudiomix = False 3452 for p in filmfiles: 3453 try: 3454 audiohash += str(int(countsize(p + '.wav'))) 3455 except: 3456 audiohash=0 3457 renderfix=True 3458 dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, scene, 0) 3459 for p in dubfiles: 3460 try: 3461 audiohash += str(int(countsize(p))) 3462 except: 3463 audiohash=0 3464 print('Audiohash of scene is: ' + audiohash) 3465 try: 3466 with open(scenedir + '.audiohash', 'r') as f: 3467 oldaudiohash = f.readline().strip() 3468 print('oldaudiohash is: ' + oldaudiohash) 3469 except: 3470 print('no audiohash found, making one...') 3471 with open(scenedir + '.audiohash', 'w') as f: 3472 f.write(audiohash) 3473 renderfixscene=True 3474 if os.path.isfile(scenedir+'/.rerender') == True: 3475 renderfixscene=True 3476 os.system('rm '+scenedir+'/.rerender') 3477 if audiohash != oldaudiohash or newmix == True or renderfix == True or renderfixscene == True: 3478 renderaudio(filmfiles, renderfilename, dubfiles, dubmix) 3479 print('updating audiohash...') 3480 with open(scenedir + '.audiohash', 'w') as f: 3481 f.write(audiohash) 3482 for i in range(len(dubfiles)): 3483 os.system('cp ' + scenedir + '/dub/.settings' + str(i + 1).zfill(3) + ' ' + scenedir + '/dub/.rendered' + str(i + 1).zfill(3)) 3484 print('Audio rendered!') 3485 newaudiomix = True 3486 muxing = True 3487 if muxing == True: 3488 #muxing mp3 layer to mp4 file 3489 #count estimated audio filesize with a bitrate of 320 kb/s 3490 try: 3491 audiosize = countsize(renderfilename + '.wav') * 0.453 3492 except: 3493 print('noothing here') 3494 os.system('mv ' + renderfilename + '.mp4 ' + renderfilename + '_tmp.mp4') 3495 if debianversion == 'stretch': 3496 p = Popen(['avconv', '-y', '-i', renderfilename + '.wav', '-acodec', 'libmp3lame', '-ac', '2', '-b:a', '320k', renderfilename + '.mp3']) 3497 else: 3498 p = Popen(['ffmpeg', '-y', '-i', renderfilename + '.wav', '-acodec', 'libmp3lame', '-ac', '2', '-b:a', '320k', renderfilename + '.mp3']) 3499 while p.poll() is None: 3500 time.sleep(0.02) 3501 try: 3502 rendersize = countsize(renderfilename + '.mp3') 3503 except: 3504 continue 3505 writemessage('audio rendering ' + str(int(rendersize)) + ' of ' + str(int(audiosize)) + ' kb done') 3506 ##MERGE AUDIO & VIDEO 3507 writemessage('Merging audio & video') 3508 #os.remove(renderfilename + '.mp4') 3509 call(['MP4Box', '-rem', '2', renderfilename + '_tmp.mp4'], shell=False) 3510 call(['MP4Box', '-add', renderfilename + '_tmp.mp4', '-add', renderfilename + '.mp3', '-new', renderfilename + '.mp4'], shell=False) 3511 os.remove(renderfilename + '_tmp.mp4') 3512 os.remove(renderfilename + '.mp3') 3513 else: 3514 print('Already rendered!') 3515 return renderfilename, newaudiomix 3516 3517 #-------------Render film------------ 3518 3519 def renderfilm(filmfolder, filmname, comp, scene, muxing): 3520 global fps 3521 def render(q, filmfolder, filmname, comp, scene): 3522 newaudiomix = False 3523 #if comp == 1: 3524 # newaudiomix = True 3525 #This function checks and calls renderscene first then rendervideo & renderaudio if something has changed in the film 3526 if scene > 0: 3527 scenefilename, audiomix = renderscene(filmfolder, filmname, scene) 3528 q.put(scenefilename) 3529 return 3530 scenes = countscenes(filmfolder, filmname) 3531 for i in range(scenes): 3532 scenefilename, audiomix = renderscene(filmfolder, filmname, i + 1) 3533 #Check if a scene has a new audiomix 3534 print('audiomix of scene ' + str(i + 1) + ' is ' + str(audiomix)) 3535 if audiomix == True: 3536 newaudiomix = True 3537 filmfiles = scenefiles(filmfolder, filmname) 3538 #Video 3539 videohash = '' 3540 oldvideohash = '' 3541 renderfilename = filmfolder + filmname + '/' + filmname 3542 filmdir = filmfolder + filmname + '/' 3543 scenedir = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/' 3544 for p in filmfiles: 3545 print(p) 3546 #compileshot(p,filmfolder,filmname) 3547 videohash += str(int(countsize(p + '.mp4'))) 3548 print('Videohash of film is: ' + videohash) 3549 try: 3550 with open(filmdir + '.videohash', 'r') as f: 3551 oldvideohash = f.readline().strip() 3552 print('oldvideohash is: ' + oldvideohash) 3553 except: 3554 print('no videohash found, making one...') 3555 with open(filmdir + '.videohash', 'w') as f: 3556 f.write(videohash) 3557 if videohash != oldvideohash: 3558 rendervideo(filmfiles, renderfilename, filmname) 3559 print('updating video hash') 3560 with open(filmdir + '.videohash', 'w') as f: 3561 f.write(videohash) 3562 #Audio 3563 audiohash = '' 3564 oldaudiohash = '' 3565 for p in filmfiles: 3566 print(p) 3567 audiohash += str(int(countsize(p + '.wav'))) 3568 dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, 0, 0) 3569 for p in dubfiles: 3570 audiohash += str(int(countsize(p))) 3571 print('Audiohash of film is: ' + audiohash) 3572 try: 3573 with open(filmdir + '.audiohash', 'r') as f: 3574 oldaudiohash = f.readline().strip() 3575 print('oldaudiohash is: ' + oldaudiohash) 3576 except: 3577 print('no audiohash found, making one...') 3578 with open(filmdir+ '.audiohash', 'w') as f: 3579 f.write(audiohash) 3580 #This is if the scene has a new audiomix 3581 if newaudiomix == True: 3582 newmix = True 3583 if audiohash != oldaudiohash or newmix == True: 3584 renderaudio(filmfiles, renderfilename, dubfiles, dubmix) 3585 print('updating audiohash...') 3586 with open(filmdir+ '.audiohash', 'w') as f: 3587 f.write(audiohash) 3588 for i in range(len(dubfiles)): 3589 os.system('cp ' + filmdir + '/dub/.settings' + str(i + 1).zfill(3) + ' ' + filmdir + '/dub/.rendered' + str(i + 1).zfill(3)) 3590 print('Audio rendered!') 3591 #compressing 3592 if comp > 0: 3593 writemessage('compressing audio') 3594 os.system('mv ' + renderfilename + '.wav ' + renderfilename + '_tmp.wav') 3595 #run_command('sox ' + renderfilename + '_tmp.wav ' + renderfilename + '.wav compand 0.3,1 6:-70,-60,-20 -5 -90 0.2') 3596 run_command('sox ' + renderfilename + '_tmp.wav ' + renderfilename + '.wav compand 0.0,1 6:-70,-43,-20 -6 -90 0.1') 3597 os.remove(renderfilename + '_tmp.wav') 3598 if muxing == True: 3599 #muxing mp3 layer to mp4 file 3600 #count estimated audio filesize with a bitrate of 320 kb/s 3601 audiosize = countsize(renderfilename + '.wav') * 0.453 3602 os.system('mv ' + renderfilename + '.mp4 ' + renderfilename + '_tmp.mp4') 3603 if debianversion == 'stretch': 3604 p = Popen(['avconv', '-y', '-i', renderfilename + '.wav', '-acodec', 'libmp3lame', '-ac', '2', '-b:a', '320k', renderfilename + '.mp3']) 3605 else: 3606 p = Popen(['ffmpeg', '-y', '-i', renderfilename + '.wav', '-acodec', 'libmp3lame', '-ac', '2', '-b:a', '320k', renderfilename + '.mp3']) 3607 while p.poll() is None: 3608 time.sleep(0.02) 3609 try: 3610 rendersize = countsize(renderfilename + '.mp3') 3611 except: 3612 continue 3613 writemessage('audio rendering ' + str(int(rendersize)) + ' of ' + str(int(audiosize)) + ' kb done') 3614 ##MERGE AUDIO & VIDEO 3615 writemessage('Merging audio & video') 3616 #os.remove(renderfilename + '.mp4') 3617 call(['MP4Box', '-rem', '2', renderfilename + '_tmp.mp4'], shell=False) 3618 call(['MP4Box', '-add', renderfilename + '_tmp.mp4', '-add', renderfilename + '.mp3', '-new', renderfilename + '.mp4'], shell=False) 3619 os.remove(renderfilename + '_tmp.mp4') 3620 os.remove(renderfilename + '.mp3') 3621 else: 3622 print('Already rendered!') 3623 q.put(renderfilename) 3624 q = mp.Queue() 3625 proc = mp.Process(target=render, args=(q,filmfolder,filmname,comp,scene)) 3626 proc.start() 3627 procdone = False 3628 status = '' 3629 vumetermessage('press middlebutton to cancel') 3630 while True: 3631 if proc.is_alive() == False and procdone == False: 3632 status = q.get() 3633 print(status) 3634 procdone = True 3635 proc.join() 3636 renderfilename = status 3637 vumetermessage('') 3638 break 3639 if middlebutton() == True: 3640 proc.terminate() 3641 proc.join() 3642 procdone = True 3643 q='' 3644 os.system('pkill MP4Box') 3645 vumetermessage('canceled for now, maybe u want to render later ;)') 3646 writemessage('press any button to continue') 3647 print('canceling videorender') 3648 renderfilename = '' 3649 break 3650 return renderfilename 3651 3652 #-------------Get dub files----------- 3653 3654 def getdubs(filmfolder, filmname, scene, shot): 3655 #search for dub files 3656 print('getting scene dubs') 3657 dubfiles = [] 3658 dubmix = [] 3659 rerender = False 3660 if scene > 0 and shot == 0: 3661 filefolder = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/dub/' 3662 elif scene > 0 and shot > 0: 3663 filefolder = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/dub/' 3664 else: 3665 filefolder = filmfolder + filmname + '/dub/' 3666 try: 3667 allfiles = os.listdir(filefolder) 3668 except: 3669 print('no dubs') 3670 return dubfiles, dubmix, rerender 3671 for a in allfiles: 3672 if 'dub' in a: 3673 print('Dub audio found! ' + filefolder + a) 3674 dubfiles.append(filefolder + a) 3675 #check if dub mix has changed 3676 dubnr = 1 3677 for i in dubfiles: 3678 dub = [] 3679 rendered_dub = [] 3680 try: 3681 with open(filefolder + '.settings' + str(dubnr).zfill(3), 'r') as f: 3682 dubstr = f.read().splitlines() 3683 for i in dubstr: 3684 dub.append(float(i)) 3685 print('dub ' + str(dubnr).zfill(3) + ' loaded!') 3686 print(dub) 3687 except: 3688 print('cant find settings file') 3689 dub = [1.0, 1.0, 0.0, 0.0] 3690 with open(filefolder + ".settings" + str(dubnr).zfill(3), "w") as f: 3691 for i in dub: 3692 f.write(str(i) + '\n') 3693 try: 3694 with open(filefolder + '.rendered' + str(dubnr).zfill(3), 'r') as f: 3695 dubstr = f.read().splitlines() 3696 for i in dubstr: 3697 rendered_dub.append(float(i)) 3698 print('rendered dub loaded') 3699 print(rendered_dub) 3700 except: 3701 print('no rendered dubmix found!') 3702 if rendered_dub != dub: 3703 rerender = True 3704 dubmix.append(dub) 3705 dubnr += 1 3706 return dubfiles, dubmix, rerender 3707 3708 #------------Remove Dubs---------------- 3709 3710 def removedub(dubfolder, dubnr): 3711 pressed = '' 3712 buttonpressed = '' 3713 buttontime = time.time() 3714 holdbutton = '' 3715 selected = 0 3716 header = 'Are you sure you want to remove dub ' + str(dubnr) + '?' 3717 menu = 'NO', 'YES' 3718 settings = '', '' 3719 while True: 3720 writemenu(menu,settings,selected,header,showmenu) 3721 pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton) 3722 if pressed == 'right': 3723 if selected < (len(menu) - 1): 3724 selected = selected + 1 3725 elif pressed == 'left': 3726 if selected > 0: 3727 selected = selected - 1 3728 elif pressed == 'middle' and selected == 0: 3729 logger.info('dont remove dub') 3730 time.sleep(0.3) 3731 break 3732 elif pressed == 'middle' and selected == 1: 3733 os.system('rm ' + dubfolder + 'dub' + str(dubnr).zfill(3) + '.wav') 3734 os.system('rm ' + dubfolder + '.settings' + str(dubnr).zfill(3)) 3735 os.system('rm ' + dubfolder + '.rendered' + str(dubnr).zfill(3)) 3736 time.sleep(0.5) 3737 print(dubfolder) 3738 dubs = next(os.walk(dubfolder))[2] 3739 print(dubs) 3740 for i in dubs: 3741 if 'dub' not in i: 3742 dubs.remove(i) 3743 organized_nr = 1 3744 for s in sorted(dubs): 3745 if '.wav' in s and 'dub' in s: 3746 print(s) 3747 unorganized_nr = int(s[3:-4]) 3748 if organized_nr == unorganized_nr: 3749 print('correct') 3750 pass 3751 if organized_nr != unorganized_nr: 3752 print('false, correcting from ' + str(unorganized_nr) + ' to ' + str(organized_nr)) 3753 run_command('mv ' + dubfolder + 'dub' + str(unorganized_nr).zfill(3) + '.wav ' + dubfolder + 'dub' + str(organized_nr).zfill(3) + '.wav') 3754 run_command('mv ' + dubfolder + '.settings' + str(unorganized_nr).zfill(3) + ' ' + dubfolder + '.settings' + str(organized_nr).zfill(3)) 3755 run_command('mv ' + dubfolder + '.rendered' + str(unorganized_nr).zfill(3) + ' ' + dubfolder + '.rendered' + str(organized_nr).zfill(3)) 3756 organized_nr += 1 3757 logger.info('removed dub file!') 3758 vumetermessage('dub removed!') 3759 break 3760 time.sleep(0.05) 3761 3762 #-------------Clip settings--------------- 3763 3764 def clipsettings(filmfolder, filmname, scene, shot, take, plughw): 3765 vumetermessage('press record, view or retake to be dubbing') 3766 pressed = '' 3767 buttonpressed = '' 3768 buttontime = time.time() 3769 holdbutton = '' 3770 selected = 0 3771 dubfiles = [] 3772 dubmix = [] 3773 dubmix_old = [] 3774 if scene > 0 and shot == 0: 3775 header = 'Scene ' + str(scene) + ' dubbing settings' 3776 filefolder = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/dub/' 3777 dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, scene, 0) 3778 elif scene > 0 and shot > 0: 3779 header = 'Scene ' + str(scene) + ' shot ' + str(shot) + ' dubbing settings' 3780 filefolder = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/dub/' 3781 dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, scene, shot) 3782 else: 3783 header = 'Film ' + filmname + ' dubbing settings' 3784 filefolder = filmfolder + filmname + '/dub/' 3785 dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, 0, 0) 3786 newdub = [1.0, 1.0, 0.1, 0.1] 3787 dubselected = len(dubfiles) - 1 3788 dubrecord = '' 3789 while True: 3790 nmix = round(newdub[0],1) 3791 ndub = round(newdub[1],1) 3792 nfadein = round(newdub[2],1) 3793 nfadeout = round(newdub[3],1) 3794 if dubfiles: 3795 mix = round(dubmix[dubselected][0],1) 3796 dub = round(dubmix[dubselected][1],1) 3797 fadein = round(dubmix[dubselected][2],1) 3798 fadeout = round(dubmix[dubselected][3],1) 3799 menu = 'BACK', 'ADD:', '', '', 'DUB' + str(dubselected + 1) + ':', '', '', '' 3800 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) 3801 else: 3802 menu = 'BACK', 'ADD:', '', '' 3803 settings = '', 'd:' + str(nmix) + '/o:' + str(ndub), 'in:' + str(nfadein), 'out:' + str(nfadeout) 3804 writemenu(menu,settings,selected,header,showmenu) 3805 pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton) 3806 3807 #NEW DUB SETTINGS 3808 if pressed == 'up' and selected == 1: 3809 if newdub[0] > 0.99 and newdub[1] > 0.01: 3810 newdub[1] -= 0.1 3811 if newdub[1] > 0.99 and newdub[0] < 0.99: 3812 newdub[0] += 0.1 3813 elif pressed == 'down' and selected == 1: 3814 if newdub[1] > 0.99 and newdub[0] > 0.01: 3815 newdub[0] -= 0.1 3816 if newdub[0] > 0.99 and newdub[1] < 0.99: 3817 newdub[1] += 0.1 3818 elif pressed == 'up' and selected == 2: 3819 newdub[2] += 0.1 3820 elif pressed == 'down' and selected == 2: 3821 if newdub[2] > 0.01: 3822 newdub[2] -= 0.1 3823 elif pressed == 'up' and selected == 3: 3824 newdub[3] += 0.1 3825 elif pressed == 'down' and selected == 3: 3826 if newdub[3] > 0.01: 3827 newdub[3] -= 0.1 3828 elif pressed == 'record' or pressed == 'middle' and selected == 1: 3829 dubmix.append(newdub) 3830 dubrecord = filefolder + 'dub' + str(len(dubfiles)+1).zfill(3) + '.wav' 3831 break 3832 elif pressed == 'retake' and selected == 4: 3833 dubrecord = filefolder + 'dub' + str(dubselected + 1).zfill(3) + '.wav' 3834 break 3835 #DUB SETTINGS 3836 elif pressed == 'up' and selected == 4: 3837 if dubselected + 1 < len(dubfiles): 3838 dubselected = dubselected + 1 3839 elif pressed == 'down' and selected == 4: 3840 if dubselected > 0: 3841 dubselected = dubselected - 1 3842 elif pressed == 'remove' and selected == 4: 3843 removedub(filefolder, dubselected + 1) 3844 dubfiles, dubmix, newmix = getdubs(filmfolder, filmname, scene, shot) 3845 dubselected = len(dubfiles) - 1 3846 if len(dubfiles) == 0: 3847 #save original sound 3848 saveoriginal = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/take'+str(take).zfill(3)+'.wav' 3849 print('no dubs, copying original sound to original') 3850 os.system('cp '+filefolder+'original.wav '+saveoriginal) 3851 #removedub folder 3852 os.system('rm -r ' + filefolder) 3853 time.sleep(1) 3854 selected = 0 3855 elif pressed == 'up' and selected == 5: 3856 if dubmix[dubselected][0] >= 0.99 and dubmix[dubselected][1] > 0.01: 3857 dubmix[dubselected][1] -= 0.1 3858 if dubmix[dubselected][1] >= 0.99 and dubmix[dubselected][0] < 0.99: 3859 dubmix[dubselected][0] += 0.1 3860 elif pressed == 'down' and selected == 5: 3861 if dubmix[dubselected][1] >= 0.99 and dubmix[dubselected][0] > 0.01: 3862 dubmix[dubselected][0] -= 0.1 3863 if dubmix[dubselected][0] >= 0.99 and dubmix[dubselected][1] < 0.99: 3864 dubmix[dubselected][1] += 0.1 3865 elif pressed == 'up' and selected == 6: 3866 dubmix[dubselected][2] += 0.1 3867 elif pressed == 'down' and selected == 6: 3868 if dubmix[dubselected][2] > 0.01: 3869 dubmix[dubselected][2] -= 0.1 3870 elif pressed == 'up' and selected == 7: 3871 dubmix[dubselected][3] += 0.1 3872 elif pressed == 'down' and selected == 7: 3873 if dubmix[dubselected][3] > 0.01: 3874 dubmix[dubselected][3] -= 0.1 3875 elif pressed == 'right': 3876 if selected < (len(settings) - 1): 3877 selected = selected + 1 3878 elif pressed == 'left': 3879 if selected > 0: 3880 selected = selected - 1 3881 elif pressed == 'middle' and menu[selected] == 'BACK': 3882 os.system('pkill aplay') 3883 break 3884 elif pressed == 'view': # mix dub and listen 3885 run_command('pkill aplay') 3886 dubfiles, dubmix, rerender = getdubs(filmfolder, filmname, scene, shot) 3887 if scene: 3888 filename = filmfolder + filmname + '/scene' + str(scene).zfill(3) +'/scene' 3889 else: 3890 filename = filmfolder + filmname + '/' + filmname 3891 renderfilename = renderfilm(filmfolder, filmname, 0, scene, False) 3892 playdub(filmname,renderfilename, 'scene') 3893 time.sleep(0.05) 3894 #Save dubmix before returning 3895 if dubmix != dubmix_old: 3896 if os.path.isdir(filefolder) == False: 3897 os.makedirs(filefolder) 3898 c = 1 3899 for i in dubmix: 3900 with open(filefolder + ".settings" + str(c).zfill(3), "w") as f: 3901 for p in i: 3902 f.write(str(round(p,1)) + '\n') 3903 print(str(round(p,1))) 3904 c += 1 3905 dubmix_old = dubmix 3906 return dubrecord 3907 3908 #---------------Play & DUB-------------------- 3909 3910 def playdub(filmname, filename, player_menu): 3911 global headphoneslevel, miclevel, plughw, channels, filmfolder, scene, soundrate, soundformat 3912 #read fastedit file 3913 if player_menu == 'scene': 3914 scenedir = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/' 3915 try: 3916 with open(scenedir + '.fastedit', 'r') as f: 3917 fastedit = f.read().splitlines() 3918 print(fastedit) 3919 except: 3920 print('no fastedit file found') 3921 fastedit = 9999999 3922 #omxplayer hack 3923 os.system('rm /tmp/omxplayer*') 3924 video = True 3925 if player_menu == 'dub': 3926 dub = True 3927 else: 3928 dub = False 3929 if not os.path.isfile(filename + '.mp4'): 3930 #should probably check if its not a corrupted video file 3931 logger.info("no file to play") 3932 if dub == True: 3933 video = False 3934 else: 3935 return 3936 t = 0 3937 pressed = '' 3938 buttonpressed = '' 3939 buttontime = time.time() 3940 holdbutton = '' 3941 playing = False 3942 pause = False 3943 trim = False 3944 videolag = 0 3945 remove_shots = [] 3946 if video == True: 3947 if player_menu == 'dubbb': 3948 try: 3949 player = OMXPlayer(filename + '.mp4', args=['-n', '-1', '--fps', '25', '--layer', '3', '--no-osd', '--win', '0,15,800,475','--no-keys'], dbus_name='org.mpris.MediaPlayer2.omxplayer1', pause=True) 3950 except: 3951 writemessage('Something wrong with omxplayer') 3952 time.sleep(0.5) 3953 return 3954 else: 3955 try: 3956 player = OMXPlayer(filename + '.mp4', args=['--adev', 'alsa:hw:'+str(plughw), '--fps', '25', '--layer', '3', '--no-osd', '--win', '0,15,800,475','--no-keys'], dbus_name='org.mpris.MediaPlayer2.omxplayer1', pause=True) 3957 except: 3958 writemessage('Something wrong with omxplayer') 3959 time.sleep(0.5) 3960 return 3961 #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) 3962 writemessage('Loading...') 3963 clipduration = player.duration() 3964 #sound 3965 #if player_menu != 'film': 3966 # try: 3967 # playerAudio = OMXPlayer(filename + '.wav', args=['--adev','alsa:hw:'+str(plughw)], dbus_name='org.mpris.MediaPlayer2.omxplayer2', pause=True) 3968 # time.sleep(0.2) 3969 # except: 3970 # writemessage('something wrong with audio player') 3971 # time.sleep(2) 3972 # return 3973 #omxplayer hack to play really short videos. 3974 if clipduration < 4: 3975 logger.info("clip duration shorter than 4 sec") 3976 player.previous() 3977 if dub == True: 3978 p = 0 3979 while p < 3: 3980 writemessage('Dubbing in ' + str(3 - p) + 's') 3981 time.sleep(1) 3982 p+=1 3983 if video == True: 3984 player.play() 3985 #run_command('aplay -D plughw:0 ' + filename + '.wav &') 3986 #run_command('mplayer ' + filename + '.wav &') 3987 if player_menu == 'dub': 3988 run_command(tarinafolder + '/alsa-utils-1.1.3/aplay/arecord -D plughw:'+str(plughw)+' -f '+soundformat+' -c '+str(channels)+' -r '+soundrate+' -vv /dev/shm/dub.wav &') 3989 time.sleep(0.5) 3990 #try: 3991 # playerAudio.play() 3992 #except: 3993 # logger.info('something wrong with omxplayer audio or playing film mp4 audio') 3994 #logger.warning(e) 3995 starttime = time.time() 3996 selected = 1 3997 while True: 3998 if player_menu == 'scene': 3999 fastedit_shot = 1 4000 for i in fastedit: 4001 if int(t) > float(int(i)/1000): 4002 fastedit_shot = fastedit_shot + 1 4003 if not remove_shots: 4004 vumetermessage('shot ' + str(fastedit_shot)) 4005 else: 4006 p = '' 4007 for i in remove_shots: 4008 p = p + str(i) + ',' 4009 vumetermessage('shot ' + str(fastedit_shot) + ' remove:' + p) 4010 if trim == True: 4011 menu = 'CANCEL', 'FROM BEGINNING', 'FROM END' 4012 settings = '','','' 4013 elif pause == True: 4014 if player_menu == 'shot': 4015 menu = 'BACK', 'PLAY', 'REPLAY', 'TRIM' 4016 settings = '','','','' 4017 else: 4018 menu = 'BACK', 'PLAY', 'REPLAY' 4019 settings = '','','' 4020 elif player_menu == 'dub': 4021 menu = 'BACK', 'REDUB', 'PHONES:', 'MIC:' 4022 settings = '', '', str(headphoneslevel), str(miclevel) 4023 else: 4024 menu = 'BACK', 'PAUSE', 'REPLAY', 'PHONES:' 4025 settings = '', '', '', str(headphoneslevel) 4026 if dub == True: 4027 header = 'Dubbing ' + str(round(t,1)) 4028 else: 4029 header = 'Playing ' + str(round(t,1)) + ' of ' + str(clipduration) + ' s' 4030 writemenu(menu,settings,selected,header,showmenu) 4031 pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton) 4032 if buttonpressed == True: 4033 flushbutton() 4034 if pressed == 'remove': 4035 if fastedit_shot in remove_shots: 4036 remove_shots.remove(fastedit_shot) 4037 else: 4038 remove_shots.append(fastedit_shot) 4039 time.sleep(0.2) 4040 elif pressed == 'right': 4041 if selected < (len(settings) - 1): 4042 selected = selected + 1 4043 elif pressed == 'left': 4044 if selected > 0: 4045 selected = selected - 1 4046 elif pressed == 'up': 4047 if menu[selected] == 'PHONES:': 4048 if headphoneslevel < 100: 4049 headphoneslevel = headphoneslevel + 2 4050 run_command('amixer -c 0 sset Speaker ' + str(headphoneslevel) + '%') 4051 elif menu[selected] == 'MIC:': 4052 if miclevel < 100: 4053 miclevel = miclevel + 2 4054 run_command('amixer -c 0 sset Mic ' + str(miclevel) + '% unmute') 4055 else: 4056 try: 4057 player.set_position(t+2) 4058 #playerAudio.set_position(player.position()) 4059 except: 4060 print('couldnt set position of player') 4061 elif pressed == 'down': 4062 if menu[selected] == 'PHONES:': 4063 if headphoneslevel > 0: 4064 headphoneslevel = headphoneslevel - 2 4065 run_command('amixer -c 0 sset Speaker ' + str(headphoneslevel) + '%') 4066 elif menu[selected] == 'MIC:': 4067 if miclevel > 0: 4068 miclevel = miclevel - 2 4069 run_command('amixer -c 0 sset Mic ' + str(miclevel) + '% unmute') 4070 else: 4071 if t > 1: 4072 try: 4073 player.set_position(t-2) 4074 #playerAudio.set_position(player.position()) 4075 except: 4076 print('couldnt set position of player') 4077 elif pressed == 'middle' or pressed == 'record': 4078 time.sleep(0.2) 4079 if menu[selected] == 'BACK' or player.playback_status() == "Stopped" or pressed == 'record': 4080 try: 4081 if video == True: 4082 #player.stop() 4083 #playerAudio.stop() 4084 player.quit() 4085 #playerAudio.quit() 4086 #os.system('pkill -9 aplay') 4087 except: 4088 #kill it if it dont stop 4089 print('OMG! kill dbus-daemon') 4090 if dub == True: 4091 os.system('pkill arecord') 4092 time.sleep(0.2) 4093 os.system('pkill -9 omxplayer') 4094 #os.system('pkill -9 dbus-daemon') 4095 return remove_shots 4096 elif menu[selected] == 'REPLAY' or menu[selected] == 'REDUB': 4097 pause = False 4098 try: 4099 os.system('pkill aplay') 4100 if dub == True: 4101 os.system('pkill arecord') 4102 if video == True: 4103 player.pause() 4104 player.set_position(0) 4105 #if player_menu != 'film': 4106 #playerAudio.pause() 4107 #playerAudio.set_position(0) 4108 if dub == True: 4109 p = 0 4110 while p < 3: 4111 writemessage('Dubbing in ' + str(3 - p) + 's') 4112 time.sleep(1) 4113 p+=1 4114 player.play() 4115 #if player_menu != 'film': 4116 # playerAudio.play() 4117 #run_command('aplay -D plughw:0 ' + filename + '.wav &') 4118 if dub == True: 4119 run_command(tarinafolder + '/alsa-utils-1.1.3/aplay/arecord -D plughw:'+str(plughw)+' -f '+soundformat+' -c '+str(channels)+' -r '+soundrate+' -vv /dev/shm/dub.wav &') 4120 except: 4121 pass 4122 starttime = time.time() 4123 elif menu[selected] == 'PAUSE': 4124 player.pause() 4125 #try: 4126 # playerAudio.pause() 4127 #except: 4128 # pass 4129 pause = True 4130 elif menu[selected] == 'PLAY': 4131 player.play() 4132 #try: 4133 # playerAudio.play() 4134 #except: 4135 # pass 4136 pause = False 4137 elif menu[selected] == 'TRIM': 4138 selected = 1 4139 trim = True 4140 elif menu[selected] == 'CANCEL': 4141 selected = 1 4142 trim = False 4143 elif menu[selected] == 'FROM BEGINNING': 4144 trim = ['beginning', player.position()] 4145 player.quit() 4146 #playerAudio.quit() 4147 return trim 4148 elif menu[selected] == 'FROM END': 4149 trim = ['end', player.position()] 4150 player.quit() 4151 #playerAudio.quit() 4152 return trim 4153 time.sleep(0.02) 4154 if pause == False: 4155 try: 4156 t = player.position() 4157 except: 4158 os.system('pkill aplay') 4159 if dub == True: 4160 os.system('pkill arecord') 4161 return remove_shots 4162 player.quit() 4163 #playerAudio.quit() 4164 #os.system('pkill dbus-daemon') 4165 4166 #---------------View Film-------------------- 4167 4168 def viewfilm(filmfolder, filmname): 4169 scenes, shots, takes = countlast(filmname, filmfolder) 4170 scene = 1 4171 filmfiles = [] 4172 while scene <= scenes: 4173 shots = countshots(filmname, filmfolder, scene) 4174 if shots > 0: 4175 filmfiles.extend(shotfiles(filmfolder, filmname, scene)) 4176 scene = scene + 1 4177 return filmfiles 4178 4179 #---------------Video Trim-------------------- 4180 4181 def videotrim(filename, trim_filename, where, s): 4182 #theres two different ways of non-rerendering mp4 cut techniques that i know MP4Box and ffmpeg 4183 if where == 'beginning': 4184 logger.info('trimming clip from beginning') 4185 #run_command('ffmpeg -ss ' + str(s) + ' -i ' + filename + '.mp4 -c copy ' + trim_filename + '.mp4') 4186 run_command('MP4Box ' + filename + '.mp4 -splitx ' + str(s) + ':end -out ' + trim_filename + '.mp4') 4187 run_command('cp ' + filename + '.wav ' + trim_filename + '.wav') 4188 audiotrim(trim_filename, 'beginning','') 4189 if where == 'end': 4190 logger.info('trimming clip from end') 4191 #run_command('ffmpeg -to ' + str(s) + ' -i ' + filename + '.mp4 -c copy ' + trim_filename + '.mp4') 4192 run_command('MP4Box ' + filename + '.mp4 -splitx 0:' + str(s) + ' -out ' + trim_filename + '.mp4') 4193 run_command('cp ' + filename + '.wav ' + trim_filename + '.wav') 4194 audiotrim(trim_filename, 'end','') 4195 #take last frame 4196 run_command('ffmpeg -sseof -1 -i ' + trim_filename + '.mp4 -update 1 -q:v 1 -vf scale=800:450 ' + trim_filename + '.jpeg') 4197 return 4198 4199 #--------------Get Audio cards-------------- 4200 def getaudiocards(): 4201 with open("/proc/asound/cards") as fp: 4202 cards = fp.readlines() 4203 audiocards = [] 4204 for i in cards: 4205 if i[1] in ['0','1','2','3']: 4206 print('audio card 0: ' + i[22:].rstrip('\n')) 4207 audiocards.append(i[22:].rstrip('\n')) 4208 return audiocards 4209 4210 #--------------Audio Trim-------------------- 4211 # make audio file same lenght as video file 4212 def audiotrim(filename, where, dub): 4213 global channels, fps 4214 videofile=filename 4215 audiosync=0 4216 print("chaaaaaaaaaaaaaaaanel8: " +str(channels)) 4217 writemessage('Audio syncing..') 4218 pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + filename + '.mp4', shell=True) 4219 videolenght = pipe.decode().strip() 4220 print('videolenght:'+str(videolenght)) 4221 if dub: 4222 filename=dub[:-4] 4223 try: 4224 pipe = subprocess.check_output('mediainfo --Inform="Audio;%Duration%" ' + filename + '.wav', shell=True) 4225 audiolenght = pipe.decode().strip() 4226 except: 4227 audiosilence('',filename) 4228 audiolenght=videolenght 4229 #if there is no audio lenght 4230 logger.info('audio is:' + audiolenght) 4231 if not audiolenght.strip(): 4232 audiolenght = 0 4233 #separate seconds and milliseconds 4234 #videoms = int(videolenght) % 1000 4235 #audioms = int(audiolenght) % 1000 4236 #videos = int(videolenght) / 1000 4237 #audios = int(audiolenght) / 1000 4238 elif int(audiolenght) > int(videolenght): 4239 #calculate difference 4240 audiosync = int(audiolenght) - int(videolenght) 4241 newaudiolenght = int(audiolenght) - audiosync 4242 logger.info('Audiofile is: ' + str(audiosync) + 'ms longer') 4243 #trim from end or beginning and put a 0.01 in- and outfade 4244 if where == 'end': 4245 run_command('sox -V0 ' + filename + '.wav ' + filename + '_temp.wav trim 0 -' + str(int(audiosync)/1000)) 4246 if where == 'beginning': 4247 logger.info('trimming from beginning at: '+str(int(audiosync)/1000)) 4248 run_command('sox -V0 ' + filename + '.wav ' + filename + '_temp.wav trim ' + str(int(audiosync)/1000)) 4249 run_command('sox -V0 -G ' + filename + '_temp.wav ' + filename + '.wav fade 0.01 0 0.01') 4250 os.remove(filename + '_temp.wav') 4251 #if int(audiosync) > 400: 4252 # writemessage('WARNING!!! VIDEO FRAMES DROPPED!') 4253 # vumetermessage('Consider changing to a faster microsd card.') 4254 # time.sleep(10) 4255 delayerr = 'A' + str(audiosync) 4256 print(delayerr) 4257 elif int(audiolenght) < int(videolenght): 4258 audiosync = int(videolenght) - int(audiolenght) 4259 #calculate difference 4260 #audiosyncs = videos - audios 4261 #audiosyncms = videoms - audioms 4262 #if audiosyncms < 0: 4263 # if audiosyncs > 0: 4264 # audiosyncs = audiosyncs - 1 4265 # audiosyncms = 1000 + audiosyncms 4266 logger.info('Videofile is: ' + str(audiosync) + 'ms longer') 4267 logger.info('Videofile is: ' + str(int(audiosync)/1000) + 's longer') 4268 #time.sleep(2) 4269 #make fade 4270 #make delay file 4271 print(str(int(audiosync)/1000)) 4272 run_command('sox -V0 -r '+soundrate+' -c 2 '+filename+'.wav '+filename+'_temp.wav trim 0.0 pad 0 ' + str(int(audiosync)/1000)) 4273 run_command('sox -V0 -G ' + filename + '_temp.wav ' + filename + '.wav fade 0.01 0 0.01') 4274 #add silence to end 4275 #run_command('sox -V0 /dev/shm/silence.wav ' + filename + '_temp.wav') 4276 #run_command('cp '+filename+'.wav '+filename+'_temp.wav') 4277 #run_command('sox -V0 -G ' + filename + '_temp.wav /dev/shm/silence.wav ' + filename + '.wav') 4278 os.remove(filename + '_temp.wav') 4279 #os.remove('/dev/shm/silence.wav') 4280 delayerr = 'V' + str(audiosync) 4281 print(delayerr) 4282 print('the results:') 4283 pipe = subprocess.check_output('mediainfo --Inform="Audio;%Duration%" ' + filename + '.wav', shell=True) 4284 audiolenght = pipe.decode().strip() 4285 print('aftersyncvideo: '+str(videolenght) + ' audio:'+str(audiolenght)) 4286 if int(audiolenght) != int(videolenght): 4287 vumetermessage('SYNCING FAILED!') 4288 time.sleep(10) 4289 #os.remove('/dev/shm/' + filename + '.wav') 4290 return float(audiosync)/1000, int(videolenght), int(audiolenght) 4291 #os.system('mv audiosynced.wav ' + filename + '.wav') 4292 #os.system('rm silence.wav') 4293 4294 #--------------Audiosilence-------------------- 4295 # make an empty audio file as long as a video file 4296 4297 def audiosilence(foldername,filename): 4298 global channels 4299 writemessage('Creating audiosilence..') 4300 pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + foldername + filename + '.mp4', shell=True) 4301 videolenght = pipe.decode() 4302 logger.info('Video lenght is ' + videolenght) 4303 #separate seconds and milliseconds 4304 videoms = int(videolenght) % 1000 4305 videos = int(videolenght) / 1000 4306 logger.info('Videofile is: ' + str(videos) + 's ' + str(videoms)) 4307 run_command('sox -V0 -n -r '+soundrate+' -c 2 /dev/shm/silence.wav trim 0.0 ' + str(videos)) 4308 os.system('cp /dev/shm/silence.wav ' + foldername + filename + '.wav') 4309 os.system('rm /dev/shm/silence.wav') 4310 4311 #--------------Copy to USB------------------- 4312 4313 def copytousb(filmfolder): 4314 pressed = '' 4315 buttonpressed = '' 4316 buttontime = time.time() 4317 holdbutton = '' 4318 writemessage('Searching for usb storage device, middlebutton to cancel') 4319 films = getfilms(filmfolder) 4320 while True: 4321 pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton) 4322 usbconnected = os.path.ismount('/media/usb0') 4323 if pressed == 'middle': 4324 writemessage('canceling..') 4325 time.sleep(2) 4326 break 4327 time.sleep(0.02) 4328 if usbconnected == True: 4329 #Copy new files to usb device 4330 try: 4331 os.makedirs('/media/usb0/tarinafilms/') 4332 except: 4333 pass 4334 try: 4335 p = subprocess.check_output('stat -f -c %T /media/usb0', shell=True) 4336 filesystem = p.decode() 4337 print('filesystem info: ' + filesystem) 4338 except: 4339 writemessage('Oh-no! dont know your filesystem') 4340 waitforanykey() 4341 return 4342 for filmname in films: 4343 #check filmhash 4344 filmname = filmname[0] 4345 usbpath = '/media/usb0/tarinafilms/'+filmname 4346 usbfilmhash = '' 4347 filmhash = '' 4348 while True: 4349 if os.path.exists(usbpath) == False: 4350 break 4351 try: 4352 with open(filmfolder + filmname + '/.filmhash', 'r') as f: 4353 filmhash = f.readline().strip() 4354 print('filmhash is: ' + filmhash) 4355 except: 4356 print('no filmhash found!') 4357 try: 4358 with open(usbpath + '/.filmhash', 'r') as f: 4359 usbfilmhash = f.readline().strip() 4360 print('usbfilmhash is: ' + usbfilmhash) 4361 except: 4362 print('no usbfilmhash found!') 4363 if usbfilmhash == filmhash: 4364 print('same moviefilm found, updating clips...') 4365 break 4366 else: 4367 writemessage('Found a subsequent moviefilm...') 4368 print('same film exist with different filmhashes, copying to subsequent film folder') 4369 time.sleep(2) 4370 usbpath += '_new' 4371 try: 4372 os.makedirs(usbpath) 4373 writemessage('Copying film ' + filmname + '...') 4374 except: 4375 writemessage('Found existing ' + filmname + ', copying new files... ') 4376 try: 4377 run_command('rsync -avr -P ' + filmfolder + filmname + ' ' + usbpath) 4378 except: 4379 writemessage('couldnt copy film ' + filmname) 4380 waitforanykey() 4381 return 4382 run_command('sync') 4383 run_command('pumount /media/usb0') 4384 writemessage('all files copied successfully!') 4385 waitforanykey() 4386 writemessage('You can safely unplug the usb device now') 4387 time.sleep(2) 4388 return 4389 4390 #-----------Check for the webz--------- 4391 4392 def webz_on(): 4393 try: 4394 # connect to the host -- tells us if the host is actually 4395 # reachable 4396 socket.create_connection(("google.com", 80)) 4397 return True 4398 except OSError: 4399 pass 4400 writemessage('No internet connection!') 4401 time.sleep(2) 4402 return False 4403 4404 #-------------Upload film------------ 4405 4406 def uploadfilm(filename, filmname): 4407 pressed = '' 4408 buttonpressed = '' 4409 buttontime = time.time() 4410 holdbutton = '' 4411 mods = ['Back'] 4412 settings = [''] 4413 writemessage('Searching for upload mods') 4414 with open(tarinafolder + '/mods/upload-mods-enabled') as m: 4415 mods.extend(m.read().splitlines()) 4416 for m in mods: 4417 settings.append('') 4418 menu = mods 4419 selected = 0 4420 while True: 4421 header = 'Where do you want to upload?' 4422 writemenu(menu,settings,selected,header,showmenu) 4423 pressed, buttonpressed, buttontime, holdbutton, event, keydelay = getbutton(pressed, buttonpressed, buttontime, holdbutton) 4424 if pressed == 'right': 4425 if selected < (len(menu) - 1): 4426 selected = selected + 1 4427 elif pressed == 'left': 4428 if selected > 0: 4429 selected = selected - 1 4430 elif pressed == 'middle' and menu[selected] == 'Back': 4431 return None 4432 elif pressed == 'middle' and menu[selected] in mods: 4433 cmd = tarinafolder + '/mods/' + menu[selected] + '.sh ' + filmname + ' ' + filename + '.mp4' 4434 return cmd 4435 time.sleep(0.02) 4436 4437 4438 #-------------Streaming--------------- 4439 4440 def startstream(camera, stream, plughw, channels): 4441 #youtube 4442 #youtube="rtmp://a.rtmp.youtube.com/live2/" 4443 #with open("/home/pi/.youtube-live") as fp: 4444 # key = fp.readlines() 4445 #print('using key: ' + key[0]) 4446 #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 flv ' + youtube + key[0] 4447 # 4448 #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' 4449 #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' 4450 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 -f mpegts udp://10.42.0.169:5002' 4451 try: 4452 stream = subprocess.Popen(stream_cmd, shell=True, stdin=subprocess.PIPE) 4453 camera.start_recording(stream.stdin, splitter_port=2, format='h264', bitrate = 55555) 4454 except: 4455 stream = '' 4456 #now = time.strftime("%Y-%m-%d-%H:%M:%S") 4457 return stream 4458 4459 def stopstream(camera, stream): 4460 camera.stop_recording(splitter_port=2) 4461 os.system('pkill -9 ffmpeg') 4462 print("Camera safely shut down") 4463 print("Good bye") 4464 stream = '' 4465 return stream 4466 4467 #-------------Beeps------------------- 4468 4469 def beep(bus): 4470 global tarinafolder, plughw 4471 if bus: 4472 buzzerrepetitions = 100 4473 buzzerdelay = 0.00001 4474 for _ in range(buzzerrepetitions): 4475 for value in [0xC, 0x4]: 4476 #GPIO.output(1, value) 4477 bus.write_byte_data(DEVICE,OLATA,value) 4478 time.sleep(buzzerdelay) 4479 else: 4480 run_command('aplay -D plughw:' + str(plughw) + ' '+ tarinafolder + '/extras/beep.wav') 4481 return 4482 4483 def longbeep(bus): 4484 global tarinafolder, plughw 4485 if bus: 4486 buzzerrepetitions = 100 4487 buzzerdelay = 0.0001 4488 for _ in range(buzzerrepetitions * 5): 4489 for value in [0xC, 0x4]: 4490 #GPIO.output(1, value) 4491 bus.write_byte_data(DEVICE,OLATA,value) 4492 buzzerdelay = buzzerdelay - 0.00000004 4493 time.sleep(buzzerdelay) 4494 bus.write_byte_data(DEVICE,OLATA,0x4) 4495 else: 4496 run_command('aplay -D plughw:' + str(plughw) + ' '+ tarinafolder + '/extras/beep_long.wav') 4497 return 4498 4499 def buzz(buzzerlenght): 4500 buzzerdelay = 0.0001 4501 for _ in range(buzzerlenght): 4502 for value in [0xC, 0x4]: 4503 #GPIO.output(1, value) 4504 bus.write_byte_data(DEVICE,OLATA,value) 4505 time.sleep(buzzerdelay) 4506 return 4507 4508 #---------reading in a lens shading table---------- 4509 4510 def read_table(inFile): 4511 # q&d-way to read in ls_table.h 4512 ls_table = [] 4513 channel = [] 4514 with open(inFile) as file: 4515 for line in file: 4516 # we skip the unimportant stuff 4517 if not ( line.startswith("uint") \ 4518 or line.startswith("}")): 4519 # the comments separate the color planes 4520 if line.startswith("//"): 4521 channel = [] 4522 ls_table.append(channel) 4523 else: 4524 # scan in a single line 4525 line = line.replace(',','') 4526 lineData = [int(x) for x in line.split()] 4527 channel.append(lineData) 4528 return np.array(ls_table,dtype=np.uint8) 4529 4530 #-------------Check if file empty---------- 4531 4532 def empty(filename): 4533 if os.path.isfile(filename + '.mp4') == False: 4534 return False 4535 if os.path.isfile(filename + '.mp4') == True: 4536 writemessage('Take already exists') 4537 time.sleep(1) 4538 return True 4539 4540 #--------------BUTTONS------------- 4541 4542 def waitforanykey(): 4543 vumetermessage("press any key to continue..") 4544 time.sleep(1) 4545 while True: 4546 with term.cbreak(): 4547 val = term.inkey(timeout=0) 4548 if not val: 4549 event = '' 4550 elif val.is_sequence: 4551 event = val.name 4552 elif val: 4553 event = val 4554 if i2cbuttons == True: 4555 readbus = bus.read_byte_data(DEVICE,GPIOB) 4556 readbus2 = bus.read_byte_data(DEVICE,GPIOA) 4557 else: 4558 readbus = 255 4559 readbus2 = 247 4560 if readbus != 255 or readbus2 != 247 or event != '': 4561 time.sleep(0.05) 4562 vumetermessage(' ') 4563 return 4564 4565 def middlebutton(): 4566 with term.cbreak(): 4567 val = term.inkey(timeout=0) 4568 if val.is_sequence: 4569 event = val.name 4570 #print(event) 4571 elif val: 4572 event = val 4573 #print(event) 4574 else: 4575 event = '' 4576 if i2cbuttons == True: 4577 readbus = bus.read_byte_data(DEVICE,GPIOB) 4578 readbus2 = bus.read_byte_data(DEVICE,GPIOA) 4579 if readbus != 255: 4580 print('i2cbutton pressed: ' + str(readbus)) 4581 if readbus2 != 247: 4582 print('i2cbutton pressed: ' + str(readbus2)) 4583 else: 4584 readbus = 255 4585 readbus2 = 247 4586 pressed = '' 4587 if event == 'KEY_ENTER' or event == 10 or event == 13 or (readbus == 247 and readbus2 == 247): 4588 pressed = 'middle' 4589 return True 4590 return False 4591 4592 def flushbutton(): 4593 with term.cbreak(): 4594 while True: 4595 inp = term.inkey(timeout=0) 4596 #print('flushing ' + repr(inp)) 4597 if inp == '': 4598 break 4599 4600 def getbutton(lastbutton, buttonpressed, buttontime, holdbutton): 4601 global i2cbuttons, serverstate, nextstatus, process, que, tarinactrl_ip, recording, onlysound, filmname, filmfolder, scene, shot, take, selected, camera, loadfilmsettings, selected, newfilmname 4602 #Check controller 4603 pressed = '' 4604 nextstatus = '' 4605 try: 4606 if process.is_alive() == False and serverstate == 'on': 4607 nextstatus = que.get() 4608 if "*" in nextstatus: 4609 tarinactrl_ip = nextstatus.split('*')[1] 4610 nextstatus = nextstatus.split('*')[0] 4611 print('tarinactrl ip:' + tarinactrl_ip) 4612 process = Process(target=listenforclients, args=("0.0.0.0", port, que)) 4613 process.start() 4614 if 'SELECTED' in nextstatus: 4615 try: 4616 selected=int(nextstatus.split(':')[1]) 4617 except: 4618 print('wtf?') 4619 if nextstatus=="PICTURE": 4620 pressed="picture" 4621 elif nextstatus=="UP": 4622 pressed="up" 4623 elif nextstatus=="DOWN": 4624 pressed="down" 4625 elif nextstatus=="LEFT": 4626 pressed="left" 4627 elif nextstatus=="RIGHT": 4628 pressed="right" 4629 elif nextstatus=="VIEW": 4630 pressed="view" 4631 elif nextstatus=="MIDDLE": 4632 pressed="middle" 4633 elif nextstatus=="DELETE": 4634 pressed="remove" 4635 elif nextstatus=="REC": 4636 pressed="record_now" 4637 elif nextstatus=="STOP": 4638 if recording == True: 4639 pressed="record" 4640 elif nextstatus=="STOPRETAKE": 4641 if recording == True: 4642 pressed="retake" 4643 elif nextstatus=="RECSOUND": 4644 if recording==False: 4645 pressed="record" 4646 onlysound=True 4647 elif nextstatus=="PLACEHOLDER": 4648 pressed="insert_shot" 4649 elif nextstatus=="TAKEPLACEHOLDER": 4650 pressed="insert_take" 4651 elif nextstatus=="NEWSCENE": 4652 pressed="new_scene" 4653 elif "NEWFILM:" in nextstatus: 4654 newfilmname = nextstatus.split(':')[1] 4655 pressed="new_film" 4656 elif "SYNCIP:" in nextstatus: 4657 pressed=nextstatus 4658 elif "SYNCDONE" in nextstatus: 4659 pressed=nextstatus 4660 elif "RETAKE:" in nextstatus: 4661 pressed=nextstatus 4662 elif "SCENE:" in nextstatus: 4663 pressed=nextstatus 4664 elif "SHOT:" in nextstatus: 4665 pressed=nextstatus 4666 elif "REMOVE:" in nextstatus: 4667 pressed=nextstatus 4668 elif "Q:" in nextstatus: 4669 pressed=nextstatus 4670 elif "MAKEPLACEHOLDERS:" in nextstatus: 4671 pressed=nextstatus 4672 #print(nextstatus) 4673 except: 4674 #print('process not found') 4675 pass 4676 4677 with term.cbreak(): 4678 val = term.inkey(timeout=0) 4679 if val.is_sequence: 4680 event = val.name 4681 #print(event) 4682 flushbutton() 4683 elif val: 4684 event = val 4685 #print(event) 4686 flushbutton() 4687 else: 4688 event = '' 4689 keydelay = 0.08 4690 if i2cbuttons == True: 4691 readbus = bus.read_byte_data(DEVICE,GPIOB) 4692 readbus2 = bus.read_byte_data(DEVICE,GPIOA) 4693 if readbus == 0: 4694 readbus = 255 4695 if readbus2 == 0: 4696 readbus2 = 247 4697 if readbus != 255: 4698 print('i2cbutton readbus pressed: ' + str(readbus)) 4699 if readbus2 != 247: 4700 print('i2cbutton readbus2 pressed: ' + str(readbus2)) 4701 else: 4702 readbus = 255 4703 readbus2 = 247 4704 if buttonpressed == False: 4705 #if event != '': 4706 # print(term.clear+term.home) 4707 if event == 27: 4708 pressed = 'quit' 4709 elif event == 'KEY_ENTER' or event == 10 or event == 13 or (readbus == 247 and readbus2 == 247): 4710 pressed = 'middle' 4711 elif event == 'KEY_UP' or (readbus == 191 and readbus2 == 247): 4712 pressed = 'up' 4713 elif event == 'KEY_DOWN' or (readbus == 254 and readbus2 == 247): 4714 pressed = 'down' 4715 elif event == 'KEY_LEFT' or (readbus == 239 and readbus2 == 247): 4716 pressed = 'left' 4717 elif event == 'KEY_RIGHT' or (readbus == 251 and readbus2 == 247): 4718 pressed = 'right' 4719 elif event == 'KEY_PGUP' or event == ' ' or (readbus == 127 and readbus2 == 247): 4720 pressed = 'record' 4721 elif event == 'KEY_PGDOWN' or (readbus == 253 and readbus2 == 247): 4722 pressed = 'retake' 4723 elif event == 'KEY_TAB' or readbus2 == 246: 4724 pressed = 'view' 4725 elif event == 'KEY_DELETE' or (readbus == 223 and readbus2 == 247): 4726 pressed = 'remove' 4727 elif event == 'KEY_BACKSPACE': 4728 pressed = 'remove' 4729 elif event == 'P' or (readbus2 == 245 and readbus == 191): 4730 pressed = 'peak' 4731 elif event == 'S' or (readbus2 == 245 and readbus == 223): 4732 pressed = 'screen' 4733 elif event == 'A' or (readbus2 == 245 and readbus == 127): 4734 pressed = 'showmenu' 4735 elif event == (readbus2 == 245 and readbus == 239): 4736 pressed = 'changemode' 4737 elif event == 'H' or (readbus2 == 245 and readbus == 247): 4738 pressed = 'showhelp' 4739 elif event == 'I' or (readbus2 == 245 and readbus == 253): 4740 pressed = 'insert' 4741 elif event == 'C' or (readbus2 == 244): 4742 pressed = 'copy' 4743 elif event == 'M' or (readbus2 == 245 and readbus == 254): 4744 pressed = 'move' 4745 #elif readbus2 == 247: 4746 # pressed = 'shutdown' 4747 #if pressed != '': 4748 #print(pressed) 4749 buttontime = time.time() 4750 holdbutton = pressed 4751 buttonpressed = True 4752 if readbus == 255 and event == '' and nextstatus == '' : 4753 buttonpressed = False 4754 if float(time.time() - buttontime) > 0.2 and buttonpressed == True: 4755 if holdbutton == 'up' or holdbutton == 'down' or holdbutton == 'right' or holdbutton == 'left' or holdbutton == 'shutdown' or holdbutton == 'remove': 4756 pressed = holdbutton 4757 keydelay = 0.02 4758 if time.time() - buttontime > 2 and buttonpressed == True: 4759 keydelay = 0.02 4760 if time.time() - buttontime > 4 and buttonpressed == True: 4761 keydelay = 0.01 4762 return pressed, buttonpressed, buttontime, holdbutton, event, keydelay 4763 4764 def startinterface(): 4765 call(['./startinterface.sh &'], shell = True) 4766 4767 def stopinterface(camera): 4768 try: 4769 camera.stop_preview() 4770 camera.close() 4771 except: 4772 print('no camera to close') 4773 os.system('pkill arecord') 4774 os.system('pkill startinterface') 4775 os.system('pkill tarinagui') 4776 #run_command('sudo systemctl stop apache2') 4777 return camera 4778 4779 def startcamera(lens, fps): 4780 global camera_model, fps_selection, fps_selected, cammode 4781 camera = picamera.PiCamera() 4782 if cammode == 'film': 4783 reso=(1920,1080) 4784 elif cammode == 'picture': 4785 reso=(4056,3040) 4786 camera.resolution = reso #tested modes 1920x816, 1296x552/578, v2 1640x698, 1640x1232, hqbinned 2028x1080, full 4056x3040 4787 #Background image 4788 underlay = None 4789 bakgimg = tarinafolder + '/extras/bakg.jpg' 4790 displaybakg(camera, bakgimg, underlay, 2) 4791 #lensshade = '' 4792 #npzfile = np.load('lenses/' + lens) 4793 #lensshade = npzfile['lens_shading_table'] 4794 # 4795 #camera frame rate sync to audio clock 4796 # 4797 camera_model, camera_revision , filmfolder = getconfig(camera) 4798 if os.path.isdir(filmfolder) == False: 4799 os.makedirs(filmfolder) 4800 # v1 = 'ov5647' 4801 # v2 = ? 4802 logger.info("picamera version is: " + camera_model + ' ' + camera_revision) 4803 if camera_model == 'imx219': 4804 table = read_table('lenses/' + lens) 4805 camera.lens_shading_table = table 4806 camera.framerate = 24.999 4807 elif camera_model == 'ov5647': 4808 table = read_table('lenses/' + lens) 4809 camera.lens_shading_table = table 4810 # Different versions of ov5647 with different clock speeds, need to make a config file 4811 # if there's more frames then the video will be longer when converting it to 25 fps, 4812 # I try to get it as perfect as possible with trial and error. 4813 # ov5647 Rev C 4814 if camera_revision == 'rev.C': 4815 camera.framerate = 26.03 4816 # ov5647 Rev D" 4817 if camera_revision == 'rev.D': 4818 camera.framerate = 23.15 4819 elif camera_model == 'imx477': 4820 fps_selection=[5,15,24.985,35,49] 4821 fps=fps_selection[fps_selected] 4822 camera.framerate = fps 4823 else: 4824 camera.framerate = fps 4825 camera.crop = (0, 0, 1.0, 1.0) 4826 camera.video_stabilization = True 4827 camera.led = False 4828 #lens_shading_table = np.zeros(camera._lens_shading_table_shape(), dtype=np.uint8) + 32 4829 #camera.lens_shading_table = lens_shading_table 4830 camera.start_preview() 4831 camera.awb_mode = 'auto' 4832 time.sleep(1) 4833 return camera 4834 4835 def tarinaserver(state): 4836 #Tarina server 4837 if state == True: 4838 #Try to run apache 4839 try: 4840 run_command('sudo systemctl start apache2') 4841 return 'on' 4842 except: 4843 writemessage("could not run tarina server") 4844 time.sleep(2) 4845 return 'off' 4846 if state == False: 4847 run_command('sudo systemctl stop apache2') 4848 return 'off' 4849 4850 if __name__ == '__main__': 4851 import sys 4852 try: 4853 main() 4854 except: 4855 os.system('pkill arecord') 4856 os.system('pkill startinterface') 4857 os.system('pkill tarinagui') 4858 print('Unexpected error : ', sys.exc_info()[0], sys.exc_info()[1])