gonzopiserver.py (31386B)
1 #!/usr/bin/env python3 2 3 import web 4 import os 5 import socket 6 import ifaddr 7 import sys 8 import time 9 import random 10 import hashlib 11 import configparser 12 import json 13 import datetime 14 from PIL import Image 15 from pymediainfo import MediaInfo 16 17 # Get path of the current dir, then use it as working directory: 18 rundir = os.path.dirname(__file__) 19 if rundir != '': 20 os.chdir(rundir) 21 22 urls = ( 23 '/','intro', 24 '/c/?', 'index', 25 '/f/(.*)?', 'films', 26 '/t/(.*)?', 'tree', 27 '/e/(.*)?', 'edit', 28 '/save-order/(.*)?', 'logorder', 29 '/p/(.*)?', 'player', 30 '/api','api' 31 ) 32 33 #--------------USB filmfolder------------------- 34 35 def usbfilmfolder(dsk): 36 usbmount = dsk 37 while True: 38 usbconnected = os.path.ismount('/media/usb'+str(usbmount)) 39 time.sleep(0.02) 40 if usbconnected == True: 41 try: 42 os.makedirs('/media/usb'+str(usbmount)+'/gonzopifilms/') 43 except: 44 pass 45 try: 46 p = subprocess.check_output('stat -f -c %T /media/usb'+str(usbmount), shell=True) 47 filesystem = p.decode() 48 print('filesystem info: ' + filesystem) 49 except: 50 print('Oh-no! dont know your filesystem') 51 filmfolder = '/media/usb'+str(usbmount)+'/gonzopifilms/' 52 return filmfolder 53 else: 54 usbmount = usbmount + 1 55 if usbmount > 20: 56 break 57 58 home = os.path.expanduser('~') 59 menuold = [] 60 vumeterold = '' 61 #configfile = home + '/.gonzopi/config.ini' 62 #configdir = os.path.dirname(configfile) 63 #config = configparser.ConfigParser() 64 #if config.read(configfile): 65 # filmfolder = config['USER']['filmfolder']+'/' 66 filmfolder = '/home/pi/gonzopifilms/' 67 real_filmfolder=filmfolder 68 69 os.system("unlink static/*") 70 #CHECK IF FILMING TO USB STORAGE 71 filmfolderusb=usbfilmfolder(0) 72 if filmfolderusb: 73 filmfolder=filmfolderusb 74 real_filmfolder=filmfolder 75 # Link video directory to static dir 76 os.system("ln -s -t static/ " + filmfolder) 77 filmfolder='static/gonzopifilms/' 78 filmdb = filmfolder+'.videos/gonzopi.db' 79 db = web.database(dbn='sqlite', db=filmdb) 80 else: 81 os.system("ln -s -t static/ " + filmfolder) 82 filmfolder='static/gonzopifilms/' 83 #fix filmfolder root to Videos/gonzopifilms 84 filmdb = filmfolder+'.videos/gonzopi.db' 85 db = web.database(dbn='sqlite', db=filmdb) 86 87 basedir = os.path.dirname(os.path.realpath(__file__)) 88 sys.path.append(basedir) 89 90 films = [] 91 92 #NETWORKS 93 94 networks=[] 95 adapters = ifaddr.get_adapters() 96 for adapter in adapters: 97 print("IPs of network adapter " + adapter.nice_name) 98 for ip in adapter.ips: 99 if '::' not in ip.ip[0] and '127.0.0.1' != ip.ip: 100 print(ip.ip) 101 networks.append(ip.ip) 102 network=networks[0] 103 104 app = web.application(urls, globals()) 105 render = web.template.render('templates/', base="base") 106 render2 = web.template.render('templates/', base="base2") 107 web.config.debug=False 108 os.system('rm '+basedir+'/sessions/*') 109 store = web.session.DiskStore(basedir + '/sessions/') 110 session = web.session.Session(app,store,initializer={'login': 0, 'user': '', 'backurl': '', 'bildsida': 0, 'cameras': [], 'reload': 0, 'randhash':'', 'menu':[]}) 111 112 port=55555 113 ip='0.0.0.0' 114 cameras=[] 115 recording = False 116 117 session.randhash = hashlib.md5(str(random.getrandbits(256)).encode('utf-8')).hexdigest() 118 119 oldhash = '' 120 oldthumb = '' 121 122 ##---------------Connection---------------------------------------------- 123 124 def pingtocamera(host, port, data): 125 #print("Sending to "+host+" on port "+str(port)+" DATA:"+data) 126 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 127 s.settimeout(0.01) 128 try: 129 while True: 130 s.connect((host, port)) 131 s.send(str.encode(data)) 132 if host not in cameras and host not in networks: 133 session.cameras.append(host) 134 print("Found camera! "+host) 135 print("Sent to server..") 136 break 137 except: 138 ('did not connect') 139 s.close() 140 141 def sendtocamera(host, port, data): 142 print("Sending to "+host+" on port "+str(port)+" DATA:"+data) 143 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 144 s.settimeout(0.1) 145 try: 146 while True: 147 s.connect((host, port)) 148 s.send(str.encode(data)) 149 print("Sent to server..") 150 break 151 except: 152 ('did not connect') 153 s.close() 154 155 156 def getfilms(filmfolder): 157 #get a list of films, in order of settings.p file last modified 158 films_sorted = [] 159 #print(filmfolder) 160 films = next(os.walk(filmfolder))[1] 161 for i in films: 162 if os.path.isfile(filmfolder + i + '/settings.p') == True: 163 lastupdate = os.path.getmtime(filmfolder + i + '/' + 'settings.p') 164 films_sorted.append((i,lastupdate)) 165 films_sorted = sorted(films_sorted, key=lambda tup: tup[1], reverse=True) 166 #print(films_sorted) 167 return films_sorted 168 169 #------------Count scenes-------- 170 171 def countscenes(filmfolder, filmname): 172 scenes = 0 173 try: 174 allfiles = os.listdir(filmfolder + filmname) 175 except: 176 allfiles = [] 177 scenes = 0 178 for a in allfiles: 179 if 'scene' in a: 180 scenes = scenes + 1 181 return scenes 182 183 #------------Count shots-------- 184 185 def countshots(filmname, filmfolder, scene): 186 shots = 0 187 try: 188 allfiles = os.listdir(filmfolder + filmname + '/scene' + str(scene).zfill(3)) 189 except: 190 allfiles = [] 191 shots = 0 192 for a in allfiles: 193 if 'shot' in a: 194 shots = shots + 1 195 return shots 196 197 #------------Count takes-------- 198 199 def counttakes(filmname, filmfolder, scene, shot): 200 takes = 0 201 try: 202 allfiles = os.listdir(filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3)) 203 except: 204 allfiles = [] 205 return takes 206 for a in allfiles: 207 if '.mp4' in a or '.h264' in a: 208 takes = takes + 1 209 return takes 210 211 def checkpicture(thumbdir,scene,shot,take): 212 if os.path.isfile(thumbdir) == False: 213 return "/"+filmfolder+name+"/scene"+str(scene).zfill(3)+"/shot"+str(shot).zfill(3)+"/picture"+str(take).zfill(3)+".jpeg" 214 else: 215 return '' 216 217 def if_exist(dir): 218 print(basedir+dir) 219 if os.path.isfile(basedir+dir) == False: 220 print('thumb not exist') 221 return False 222 else: 223 print('thumb is') 224 return True 225 226 def countsize(filename): 227 size = 0 228 if type(filename) is str: 229 size = os.stat(filename).st_size 230 else: 231 return 0 232 return size/1024 233 234 def checkvideo(video,filmfolder,film,scene,shot,take): 235 if take==None: 236 take=1 237 #print(basedir+video) 238 p = "/"+filmfolder+film+"/scene"+str(scene).zfill(3)+"/shot"+str(shot).zfill(3)+ "/picture"+str(take).zfill(3)+".jpeg" 239 #print(p) 240 v = '' 241 if video != '': 242 try: 243 if os.stat(basedir+video).st_size == 0: 244 v = '' 245 else: 246 v='video' 247 except: 248 v = '' 249 if os.path.isfile(basedir+p) == True: 250 return p, v 251 return '', v 252 253 def get_video_length(filepath): 254 video_origins = (os.path.realpath(filepath)) 255 try: 256 if os.path.isfile(filepath[:-3]+'info') == True: 257 with open(filepath[:-3]+'info', 'r') as f: 258 duration_ms = f.readline().strip() 259 print('duration in ms: ' + str(duration_ms)) 260 return str(datetime.timedelta(seconds=round(int(duration_ms)/1000))) 261 except: 262 pass 263 #try: 264 # video_db=db.select('videos', where='filename="'+video_origins+'"')[0] 265 # return str(datetime.timedelta(seconds=round(video_db.videolength))) 266 #except: 267 # pass 268 return 269 # Parse the file 270 try: 271 media_info = MediaInfo.parse(filepath) 272 except: 273 return 274 # Find the video track (usually the first video track) 275 for track in media_info.tracks: 276 if track.track_type == "Video": 277 # Duration is in milliseconds, convert to seconds 278 duration_ms = track.duration 279 if duration_ms is None: 280 return None # No duration found 281 db.update('videos', where='filename="'+video_origins+'"', videolength=duration_ms/1000, audiolength=duration_ms/1000) 282 return str(datetime.timedelta(seconds=round(duration_ms/1000))) 283 #return int(duration_ms) 284 return None # No video track found 285 286 def has_audio_track(file_path): 287 try: 288 # Parse the media file 289 media_info = MediaInfo.parse(file_path) 290 291 # Check for audio tracks 292 for track in media_info.tracks: 293 if track.track_type == "Audio": 294 return True 295 return False 296 297 except Exception as e: 298 print(f"Error parsing {file_path}: {e}") 299 return False 300 301 class intro: 302 def GET(self): 303 return render.intro() 304 305 class index: 306 def GET(self): 307 global recording 308 films = getfilms(filmfolder) 309 renderedfilms = [] 310 unrenderedfilms = [] 311 allfilms = [] 312 for f in films: 313 if os.path.isfile(filmfolder + f[0] + '/' + f[0] + '.mp4') == True: 314 renderedfilms.append(f[0]) 315 allfilms.append(f[0]) 316 else: 317 unrenderedfilms.append(f[0]) 318 allfilms.append(f[0]) 319 i=web.input(func=None,selected=None) 320 if i.selected != None: 321 sendtocamera(ip,port,'SELECTED:'+i.selected) 322 if i.func == 'search': 323 session.cameras=[] 324 # ping ip every 10 sec while not recording to connect cameras 325 pingip=0 326 while pingip < 255 : 327 pingip+=1 328 pingtocamera(network[:-3]+str(pingip),port,'PING') 329 elif i.func == 'record': 330 sendtocamera(ip,port,'RECORD') 331 elif i.func == 'retake': 332 print('retake') 333 elif i.func == 'up': 334 sendtocamera(ip,port,'UP') 335 elif i.func == 'down': 336 sendtocamera(ip,port,'DOWN') 337 elif i.func == 'left': 338 sendtocamera(ip,port,'LEFT') 339 elif i.func == 'right': 340 sendtocamera(ip,port,'RIGHT') 341 elif i.func == 'view': 342 sendtocamera(ip,port,'VIEW') 343 elif i.func == 'middle': 344 sendtocamera(ip,port,'MIDDLE') 345 elif i.func == 'delete': 346 sendtocamera(ip,port,'DELETE') 347 elif i.func == 'picture': 348 sendtocamera(ip,port,'PICTURE') 349 session.randhash = hashlib.md5(str(random.getrandbits(256)).encode('utf-8')).hexdigest() 350 session.reload = 1 351 elif i.func == 'camera0': 352 sendtocamera(ip,port,'CAMERA:0') 353 elif i.func == 'camera1': 354 sendtocamera(ip,port,'CAMERA:1') 355 elif i.func == 'camera2': 356 sendtocamera(ip,port,'CAMERA:2') 357 elif i.func == 'camera3': 358 sendtocamera(ip,port,'CAMERA:3') 359 elif i.func == 'camera4': 360 sendtocamera(ip,port,'CAMERA:4') 361 elif i.func == 'camera5': 362 sendtocamera(ip,port,'CAMERA:5') 363 elif i.func == 'camera6': 364 sendtocamera(ip,port,'CAMERA:6') 365 elif i.func == 'camera7': 366 sendtocamera(ip,port,'CAMERA:7') 367 elif i.func == 'camera8': 368 sendtocamera(ip,port,'CAMERA:8') 369 elif i.func == 'move': 370 sendtocamera(ip,port,'move') 371 elif i.func == 'copy': 372 sendtocamera(ip,port,'copy') 373 elif i.func == 'paste': 374 sendtocamera(ip,port,'paste') 375 interface=open('/dev/shm/interface','r') 376 vumeter=open('/dev/shm/vumeter','r') 377 menu=interface.readlines() 378 vumetermessage=vumeter.readlines()[0].rstrip('\n') 379 try: 380 selected=int(menu[0]) 381 except: 382 selected=0 383 try: 384 dsk=menu[3].split(':')[1].split(' ')[0] 385 dsk=dsk.rstrip('\n') 386 except: 387 dsk='' 388 try: 389 name=menu[4].split(':')[1] 390 name=name.rstrip('\n') 391 except: 392 name='' 393 try: 394 scene=menu[5].split(':')[1].split('/')[0] 395 except: 396 scene=1 397 try: 398 shot=menu[6].split(':')[1].split('/')[0] 399 except: 400 shot=1 401 try: 402 take=menu[7].split(':')[1].split('/')[0] 403 except: 404 take=1 405 session.reload = 0 406 if i.func == 'retake': 407 print(i.func) 408 if recording == False: 409 #sendtocamera(ip,port,'RETAKE:'+shot) 410 sendtocamera(ip,port,'RETAKE') 411 recording = True 412 else: 413 sendtocamera(ip,port,'STOPRETAKE') 414 recording = False 415 if i.func != None: 416 time.sleep(1) 417 session.reload = 1 418 raise web.seeother('/c/') 419 thumb="/"+filmfolder+name+"/scene"+str(scene).zfill(3)+"/shot"+str(shot).zfill(3)+"/picture"+str(take).zfill(3)+".jpeg" 420 #print(thumb) 421 if os.path.isfile(basedir+thumb) == False: 422 print(basedir+thumb) 423 thumb='' 424 return render2.index(allfilms, session.cameras, menu, selected,name,scene,shot,take,str,session.randhash,thumb,vumetermessage,i.func,filmfolder, dsk) 425 426 class films: 427 def GET(self, film): 428 shots = 0 429 takes = 0 430 gonzopifilms = getfilms(filmfolder) 431 renderedfilms = [] 432 unrenderedfilms = [] 433 allfilms = [] 434 for f in gonzopifilms: 435 if os.path.isfile(filmfolder + f[0] + '/' + f[0] + '.mp4') == True: 436 renderedfilms.append(f[0]) 437 allfilms.append(f[0]) 438 else: 439 unrenderedfilms.append(f[0]) 440 allfilms.append(f[0]) 441 i = web.input(page=None, scene=None, shot=None, take=None, film=None, randhash=None) 442 if i.scene != None: 443 shots = countshots(film, filmfolder, i.scene) 444 takes = counttakes(film, filmfolder, i.scene, i.shot) 445 if i.scene != None and i.shot != None: 446 shots = countshots(film, filmfolder, i.scene) 447 if i.randhash == None: 448 randhash = hashlib.md5(str(random.getrandbits(256)).encode('utf-8')).hexdigest() 449 scenes = countscenes(filmfolder, film) 450 return render.filmpage(allfilms, film, scenes, str, filmfolder, counttakes, countshots, shots, i.scene, takes, i.shot, i.take, checkvideo, randhash) 451 452 class tree: 453 def GET(self, film): 454 shots = 0 455 takes = 0 456 gonzopifilms = getfilms(filmfolder) 457 renderedfilms = [] 458 unrenderedfilms = [] 459 allfilms = [] 460 for f in gonzopifilms: 461 if os.path.isfile(filmfolder + f[0] + '/' + f[0] + '.mp4') == True: 462 renderedfilms.append(f[0]) 463 allfilms.append(f[0]) 464 else: 465 unrenderedfilms.append(f[0]) 466 allfilms.append(f[0]) 467 i = web.input(page=None, scene=None, shot=None, take=None, film=None, randhash=None) 468 if i.scene != None: 469 shots = countshots(film, filmfolder, i.scene) 470 takes = counttakes(film, filmfolder, i.scene, i.shot) 471 if i.scene != None and i.shot != None: 472 shots = countshots(film, filmfolder, i.scene) 473 if i.randhash == None: 474 randhash = hashlib.md5(str(random.getrandbits(256)).encode('utf-8')).hexdigest() 475 scenes = countscenes(filmfolder, film) 476 return render2.tree(allfilms, film, scenes, str, filmfolder, counttakes, countshots, countscenes, shots, i.scene, takes, i.shot, i.take, checkvideo, randhash, if_exist) 477 478 def createthumb(picture, thumbnail): 479 sendtocamera(ip,port,'THUMB|'+picture+':'+thumbnail) 480 481 class edit: 482 def GET(self, film): 483 shots = 0 484 takes = 0 485 interface=open('/dev/shm/interface','r') 486 vumeter=open('/dev/shm/vumeter','r') 487 menu=interface.readlines() 488 vumetermessage=vumeter.readlines()[0].rstrip('\n') 489 try: 490 selected=int(menu[0]) 491 except: 492 selected=0 493 try: 494 dsk=menu[3].split(':')[1].split(' ')[0] 495 dsk=dsk.rstrip('\n')[-1:] 496 dsk=int(dsk) 497 except: 498 dsk=0 499 filmfolder = '/home/pi/gonzopifilms/' 500 real_filmfolder=filmfolder 501 os.system("unlink static/*") 502 #CHECK IF FILMING TO USB STORAGE 503 filmfolderusb=usbfilmfolder(dsk) 504 if filmfolderusb: 505 filmfolder=filmfolderusb 506 real_filmfolder=filmfolder 507 # Link video directory to static dir 508 os.system("ln -s -t static/ " + filmfolder) 509 filmfolder='static/gonzopifilms/' 510 filmdb = filmfolder+'.videos/gonzopi.db' 511 db = web.database(dbn='sqlite', db=filmdb) 512 else: 513 os.system("ln -s -t static/ " + filmfolder) 514 filmfolder='static/gonzopifilms/' 515 #fix filmfolder root to Videos/gonzopifilms 516 filmdb = filmfolder+'.videos/gonzopi.db' 517 db = web.database(dbn='sqlite', db=filmdb) 518 gonzopifilms = getfilms(filmfolder) 519 renderedfilms = [] 520 unrenderedfilms = [] 521 allfilms = [] 522 filmdb = filmfolder+'.videos/gonzopi.db' 523 db = web.database(dbn='sqlite', db=filmdb) 524 for f in gonzopifilms: 525 if os.path.isfile(filmfolder + f[0] + '/' + f[0] + '.mp4') == True: 526 renderedfilms.append(f[0]) 527 allfilms.append(f[0]) 528 else: 529 unrenderedfilms.append(f[0]) 530 allfilms.append(f[0]) 531 i = web.input(page=None, scene=None, shot=None, take=None, film=None, randhash=None) 532 if i.scene != None: 533 shots = countshots(film, filmfolder, i.scene) 534 takes = counttakes(film, filmfolder, i.scene, i.shot) 535 if i.scene != None and i.shot != None: 536 shots = countshots(film, filmfolder, i.scene) 537 if i.randhash == None: 538 randhash = hashlib.md5(str(random.getrandbits(256)).encode('utf-8')).hexdigest() 539 scenes = countscenes(filmfolder, film) 540 return render2.edit(allfilms, film, scenes, str, filmfolder, counttakes, countshots, countscenes, shots, i.scene, takes, i.shot, i.take, checkvideo, randhash, if_exist, createthumb,basedir,time,get_video_length, db, real_filmfolder) 541 542 class logorder: 543 def POST(self, film): 544 try: 545 data = web.data() 546 order = json.loads(data) 547 548 if not order: 549 web.header('Content-Type', 'application/json') 550 return json.dumps({"error": "No data provided"}) 551 552 # Write alt values to file without index 553 with open(basedir+'/static/order.edit', 'w') as f: 554 for alt in order: 555 f.write(f"{alt}\n") 556 print(alt) 557 558 web.header('Content-Type', 'application/json') 559 return json.dumps({"message": "Order saved successfully"}) 560 except json.JSONDecodeError: 561 web.header('Content-Type', 'application/json') 562 return json.dumps({"error": "Invalid JSON data"}) 563 except Exception as e: 564 web.header('Content-Type', 'application/json') 565 return json.dumps({"error": f"Server error: {str(e)}"}) 566 567 568 class player: 569 def GET(self, film): 570 i=web.input(scene=None,shot=None,take=None) 571 randhash = hashlib.md5(str(random.getrandbits(256)).encode('utf-8')).hexdigest() 572 return render.player(real_filmfolder,filmfolder,film,i.scene,i.shot,i.take,str,randhash,has_audio_track) 573 574 class api: 575 def GET(self): 576 i=web.input(func=None,selected=None, scene=None, shot=None, film=None) 577 interface=open('/dev/shm/interface','r') 578 menu=interface.readlines() 579 vumeter=open('/dev/shm/vumeter','r') 580 vumetermessage=vumeter.readlines()[0].rstrip('\n') 581 #print(menu) 582 menudone='' 583 p=0 584 film=None 585 selectfilm=False 586 if menu != '': 587 scene=1 588 shot=1 589 take=1 590 for i in menu: 591 if p == 0: 592 selected=int(i)+3 593 if p > 1: 594 if selected == p: 595 #menudone=menudone+'<b> '+i.rstrip('\n')+' </b> | ' 596 menudone=menudone+'<ka style="text-decoration:none; font-size:20px;" color:fff;" href="">'+i+'</ka>' 597 else: 598 #menudone=menudone+i.rstrip('\n')+' | ' 599 menudone=menudone+'<a style="text-decoration:none; font-size:20px;" href="?selected='+str(p-3)+'"> '+i+' </a>' 600 #if p == 7: 601 # menudone=menudone+'<br>' 602 #if p == 13: 603 # menudone=menudone+'<br>' 604 #if p == 21: 605 # menudone=menudone+'<br>' 606 #if p == 30: 607 # menudone=menudone+'<br>' 608 if p == 2 and i.rstrip('\n') == 'Up and down to select and load film': 609 selectfilm=True 610 if p == 3 and selectfilm==True: 611 try: 612 film=i.split(':')[1].rstrip('\n') 613 except: 614 film=None 615 if p == 4 and selectfilm == False: 616 try: 617 film=i.split(':')[1].rstrip('\n') 618 except: 619 film=None 620 if p == 5 and film != None: 621 try: 622 scene=int(i.split(':')[1].split('/')[0]) 623 except: 624 scene=1 625 if p == 6 and film != None: 626 try: 627 shot=int(i.split(':')[1].split('/')[0].rstrip('*')) 628 except: 629 shot=1 630 if p == 7 and film != None: 631 try: 632 take=int(i.split(':')[1].split('/')[0]) 633 except: 634 take=1 635 if p > 0 and selected == 423: 636 menudone=menudone+'<ka style="text-decoration:none; font-size:20px;" color:fff;" href="">'+i+'</ka>' 637 #if p > 2 and film == None: 638 #menudone=menudone+'<ka style="text-decoration:none; font-size:20px;" color:fff;" href="">'+i+'</ka>' 639 p = p + 1 640 thumb = '' 641 video = '' 642 if film != None: 643 if selected == 0: 644 video = '/p/'+film 645 menudone+=menudone+'video' 646 if selected == 4: 647 video = '/p/'+film 648 elif selected == 5: 649 video = '/p/'+film+'?scene=' + str(scene) 650 elif selected == 6: 651 video = '/p/'+film+'?scene='+str(scene)+'&shot='+str(shot)+'&take='+str(take) 652 elif selected == 7: 653 video = '/p/'+film+'?scene='+str(scene)+'&shot='+str(shot)+'&take='+str(take) 654 else: 655 video = '/p/'+film+'?scene='+str(scene)+'&shot='+str(shot)+'&take='+str(take) 656 thumb = '/'+filmfolder + film + "/scene" + str(scene).zfill(3) + "/shot" + str(shot).zfill(3) + "/take" + str(take).zfill(3) + ".jpeg" 657 if os.path.isfile(basedir+thumb) == True: 658 randhashimg = '?'+hashlib.md5(str(random.getrandbits(256)).encode('utf-8')).hexdigest() 659 writemenu=menudone+'<br><br>'+vumetermessage+'<br><a href="'+video+'"><img src="'+thumb+randhashimg+'"></a>' 660 #writemenu=menudone+render.player(filmfolder,film,scene,shot,take,str) 661 else: 662 writemenu=menudone+'<br><br>'+vumetermessage+'<br>' 663 isActive=True 664 try: 665 with open('/dev/shm/videos_selected','r') as f: 666 selected_videos=[line.rstrip('\n') for line in f.readlines()] 667 except: 668 selected_videos=[] 669 return json.dumps({"film": film, "scene":scene,"shot":shot,"isActive":isActive, "selected":selected_videos}) 670 671 def POST(self): 672 global menuold, vumeterold, oldthumb, oldhash 673 i=web.input(func=None,selected=None, scene=None, shot=None, film=None) 674 if i.func == 'record': 675 sendtocamera(ip,port,'RECORD') 676 elif i.func == 'retake': 677 sendtocamera(ip,port,'RETAKE') 678 elif i.func == 'up': 679 sendtocamera(ip,port,'UP') 680 elif i.func == 'down': 681 sendtocamera(ip,port,'DOWN') 682 elif i.func == 'left': 683 sendtocamera(ip,port,'LEFT') 684 elif i.func == 'right': 685 sendtocamera(ip,port,'RIGHT') 686 elif i.func == 'view': 687 sendtocamera(ip,port,'VIEW') 688 elif i.func == 'middle': 689 sendtocamera(ip,port,'MIDDLE') 690 elif i.func == 'delete': 691 sendtocamera(ip,port,'DELETE') 692 elif i.func == 'picture': 693 sendtocamera(ip,port,'PICTURE') 694 elif i.func == 'camera0': 695 sendtocamera(ip,port,'CAMERA:0') 696 elif i.func == 'camera1': 697 sendtocamera(ip,port,'CAMERA:1') 698 elif i.func == 'camera2': 699 sendtocamera(ip,port,'CAMERA:2') 700 elif i.func == 'camera3': 701 sendtocamera(ip,port,'CAMERA:3') 702 elif i.func == 'camera4': 703 sendtocamera(ip,port,'CAMERA:4') 704 elif i.func == 'camera5': 705 sendtocamera(ip,port,'CAMERA:5') 706 elif i.func == 'camera6': 707 sendtocamera(ip,port,'CAMERA:6') 708 elif i.func == 'camera7': 709 sendtocamera(ip,port,'CAMERA:7') 710 elif i.func == 'camera8': 711 sendtocamera(ip,port,'CAMERA:8') 712 elif i.func == 'move': 713 sendtocamera(ip,port,'move') 714 elif i.func == 'copy': 715 sendtocamera(ip,port,'copy') 716 elif i.func == 'paste': 717 sendtocamera(ip,port,'paste') 718 elif i.scene!=None and i.shot!=None and i.film != None: 719 #sendtocamera(ip,port,'NEWFILM:'+i.film) 720 #time.sleep(0.05) 721 sendtocamera(ip,port,'SHOTSCENES:'+str(i.scene)+'|'+str(i.shot)+'#'+i.film) 722 time.sleep(0.2) 723 sendtocamera(ip,port,'SELECTED:3') 724 interface=open('/dev/shm/interface','r') 725 menu=interface.readlines() 726 vumeter=open('/dev/shm/vumeter','r') 727 vumetermessage=vumeter.readlines()[0].rstrip('\n') 728 if menu != menuold or vumetermessage != vumeterold: 729 menuold=menu 730 vumeterold=vumetermessage 731 #print(menu) 732 menudone='' 733 p=0 734 film=None 735 selectfilm=False 736 if menu != '' and menu != ' ': 737 scene=1 738 shot=1 739 take=1 740 for i in menu: 741 if i != '' and i != ' ': 742 if p == 0: 743 selected=int(i)+3 744 if p > 1: 745 if selected == p: 746 if i.rstrip('\n') != '': 747 #menudone=menudone+'<b> '+i.rstrip('\n')+' </b> | ' 748 menudone=menudone+'<ka style="text-decoration:none; font-size:20px;" color:fff;" href="">'+i+'</ka>' 749 else: 750 if i.rstrip('\n') != '': 751 #menudone=menudone+i.rstrip('\n')+' | ' 752 menudone=menudone+'<a style="text-decoration:none; font-size:20px;" href="?selected='+str(p-3)+'"> '+i+' </a>' 753 #if p == 7: 754 # menudone=menudone+'<br>' 755 #if p == 13: 756 # menudone=menudone+'<br>' 757 #if p == 21: 758 # menudone=menudone+'<br>' 759 #if p == 30: 760 # menudone=menudone+'<br>' 761 if p == 2 and i.rstrip('\n') == 'Up and down to select and load film': 762 selectfilm=True 763 if p == 3 and selectfilm==True: 764 try: 765 film=i.split(':')[1].rstrip('\n') 766 except: 767 film=None 768 if p == 4 and selectfilm == False: 769 try: 770 film=i.split(':')[1].rstrip('\n') 771 except: 772 film=None 773 if p == 5 and film != None: 774 try: 775 scene=int(i.split(':')[1].split('/')[0]) 776 except: 777 scene=1 778 if p == 6 and film != None: 779 try: 780 shot=int(i.split(':')[1].split('/')[0]) 781 except: 782 shot=1 783 if p == 7 and film != None: 784 try: 785 take=int(i.split(':')[1].split('/')[0]) 786 except: 787 take=1 788 if p > 0 and selected == 423: 789 menudone=menudone+'<ka style="text-decoration:none; font-size:20px;" color:fff;" href="">'+i+'</ka>' 790 #if p > 2 and film == None: 791 #menudone=menudone+'<ka style="text-decoration:none; font-size:20px;" color:fff;" href="">'+i+'</ka>' 792 p = p + 1 793 thumb = '' 794 video = '' 795 if film != None: 796 if selected == 0: 797 video = '/p/'+film 798 menudone+=menudone+'video' 799 if selected == 4: 800 video = '/p/'+film 801 elif selected == 5: 802 video = '/p/'+film+'?scene=' + str(scene) 803 elif selected == 6: 804 video = '/p/'+film+'?scene='+str(scene)+'&shot='+str(shot)+'&take='+str(take) 805 elif selected == 7: 806 video = '/p/'+film+'?scene='+str(scene)+'&shot='+str(shot)+'&take='+str(take) 807 else: 808 video = '/p/'+film+'?scene='+str(scene)+'&shot='+str(shot)+'&take='+str(take) 809 thumb = '/'+filmfolder + film + "/scene" + str(scene).zfill(3) + "/shot" + str(shot).zfill(3) + "/take" + str(take).zfill(3) + ".jpeg" 810 if os.path.isfile(basedir+thumb) == True: 811 if oldthumb != basedir+thumb: 812 randhashimg = '?'+hashlib.md5(str(random.getrandbits(256)).encode('utf-8')).hexdigest() 813 oldhash = randhashimg 814 oldthumb = basedir+thumb 815 else: 816 randhashimg = oldhash 817 writemenu=menudone+'<br><br>'+vumetermessage+'<br><a href="'+video+'"><img src="'+thumb+randhashimg+'"><br></a>'+'<a href="/e/'+film+'">edit view</a>' 818 #writemenu=menudone+render.player(filmfolder,film,scene,shot,take,str) 819 else: 820 writemenu=menudone+'<br><br>'+vumetermessage+'<br>' 821 f = open(basedir+'/static/menu.html', 'w') 822 f.write(writemenu) 823 f.close() 824 825 application = app.wsgifunc() 826