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