gonzopi

git clone https://git.tarina.org/gonzopi
Log | Files | Refs | README | LICENSE

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