tarinaserver.py (7900B)
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 12 # Get path of the current dir, then use it as working directory: 13 rundir = os.path.dirname(__file__) 14 if rundir != '': 15 os.chdir(rundir) 16 17 filmfolder = '/home/pi/Videos/' 18 19 basedir = os.path.dirname(os.path.realpath(__file__)) 20 sys.path.append(basedir) 21 22 # Link video directory to static dir 23 if os.path.isfile('static/Videos') == False: 24 os.system("ln -s -t static/ " + filmfolder) 25 26 films = [] 27 28 #NETWORKS 29 30 networks=[] 31 adapters = ifaddr.get_adapters() 32 for adapter in adapters: 33 print("IPs of network adapter " + adapter.nice_name) 34 for ip in adapter.ips: 35 if '::' not in ip.ip[0] and '127.0.0.1' != ip.ip: 36 print(ip.ip) 37 networks.append(ip.ip) 38 network=networks[0] 39 40 urls = ( 41 '/?', 'index', 42 '/f/(.*)?', 'films' 43 ) 44 45 app = web.application(urls, globals()) 46 render = web.template.render('templates/', base="base") 47 web.config.debug=False 48 os.system('rm '+basedir+'/sessions/*') 49 store = web.session.DiskStore(basedir + '/sessions/') 50 session = web.session.Session(app,store,initializer={'login': 0, 'user': '', 'backurl': '', 'bildsida': 0, 'cameras': [], 'reload': 0, 'randhash':''}) 51 52 port=55555 53 ip='0.0.0.0' 54 cameras=[] 55 recording = False 56 57 session.randhash = hashlib.md5(str(random.getrandbits(256)).encode('utf-8')).hexdigest() 58 59 ##---------------Connection---------------------------------------------- 60 61 def pingtocamera(host, port, data): 62 print("Sending to "+host+" on port "+str(port)+" DATA:"+data) 63 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 64 s.settimeout(0.01) 65 try: 66 while True: 67 s.connect((host, port)) 68 s.send(str.encode(data)) 69 if host not in cameras and host not in networks: 70 session.cameras.append(host) 71 print("Found camera! "+host) 72 print("Sent to server..") 73 break 74 except: 75 ('did not connect') 76 s.close() 77 78 def sendtocamera(host, port, data): 79 print("Sending to "+host+" on port "+str(port)+" DATA:"+data) 80 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 81 s.settimeout(0.1) 82 try: 83 while True: 84 s.connect((host, port)) 85 s.send(str.encode(data)) 86 print("Sent to server..") 87 break 88 except: 89 ('did not connect') 90 s.close() 91 92 93 def getfilms(filmfolder): 94 #get a list of films, in order of settings.p file last modified 95 films_sorted = [] 96 films = next(os.walk(filmfolder))[1] 97 for i in films: 98 if os.path.isfile(filmfolder + i + '/settings.p') == True: 99 lastupdate = os.path.getmtime(filmfolder + i + '/' + 'settings.p') 100 films_sorted.append((i,lastupdate)) 101 else: 102 films_sorted.append((i,0)) 103 films_sorted = sorted(films_sorted, key=lambda tup: tup[1], reverse=True) 104 print(films_sorted) 105 return films_sorted 106 107 #------------Count scenes-------- 108 109 def countscenes(filmfolder, filmname): 110 scenes = 0 111 try: 112 allfiles = os.listdir(filmfolder + filmname) 113 except: 114 allfiles = [] 115 scenes = 0 116 for a in allfiles: 117 if 'scene' in a: 118 scenes = scenes + 1 119 return scenes 120 121 #------------Count shots-------- 122 123 def countshots(filmname, filmfolder, scene): 124 shots = 0 125 try: 126 allfiles = os.listdir(filmfolder + filmname + '/scene' + str(scene).zfill(3)) 127 except: 128 allfiles = [] 129 shots = 0 130 for a in allfiles: 131 if 'shot' in a: 132 shots = shots + 1 133 return shots 134 135 #------------Count takes-------- 136 137 def counttakes(filmname, filmfolder, scene, shot): 138 takes = 0 139 try: 140 allfiles = os.listdir(filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3)) 141 except: 142 allfiles = [] 143 return takes 144 for a in allfiles: 145 if '.mp4' in a or '.h264' in a: 146 takes = takes + 1 147 return takes 148 149 class index: 150 def GET(self): 151 global recording 152 films = getfilms(filmfolder) 153 renderedfilms = [] 154 unrenderedfilms = [] 155 for f in films: 156 if os.path.isfile('static/Videos/' + f[0] + '/' + f[0] + '.mp4') == True: 157 renderedfilms.append(f[0]) 158 else: 159 unrenderedfilms.append(f[0]) 160 i=web.input(func=None,selected=None) 161 if i.selected != None: 162 sendtocamera(ip,port,'SELECTED:'+i.selected) 163 if i.func == 'search': 164 session.cameras=[] 165 # ping ip every 10 sec while not recording to connect cameras 166 pingip=0 167 while pingip < 255 : 168 pingip+=1 169 pingtocamera(network[:-3]+str(pingip),port,'PING') 170 elif i.func == 'record': 171 sendtocamera(ip,port,'REC') 172 elif i.func == 'retake': 173 print('retake') 174 elif i.func == 'up': 175 sendtocamera(ip,port,'UP') 176 elif i.func == 'down': 177 sendtocamera(ip,port,'DOWN') 178 elif i.func == 'left': 179 sendtocamera(ip,port,'LEFT') 180 elif i.func == 'right': 181 sendtocamera(ip,port,'RIGHT') 182 elif i.func == 'view': 183 sendtocamera(ip,port,'VIEW') 184 elif i.func == 'middle': 185 sendtocamera(ip,port,'MIDDLE') 186 elif i.func == 'delete': 187 sendtocamera(ip,port,'DELETE') 188 elif i.func == 'picture': 189 sendtocamera(ip,port,'PICTURE') 190 session.randhash = hashlib.md5(str(random.getrandbits(256)).encode('utf-8')).hexdigest() 191 session.reload = 1 192 interface=open('/dev/shm/interface','r') 193 vumeter=open('/dev/shm/vumeter','r') 194 menu=interface.readlines() 195 vumetermessage=vumeter.readlines()[0].rstrip('\n') 196 try: 197 selected=int(menu[0]) 198 except: 199 selected=0 200 try: 201 name=menu[3].split(':')[1] 202 name=name.rstrip('\n') 203 except: 204 name='' 205 try: 206 scene=menu[4].split(':')[1].split('/')[0] 207 except: 208 scene=1 209 try: 210 shot=menu[5].split(':')[1].split('/')[0] 211 except: 212 shot=1 213 try: 214 take=menu[6].split(':')[1].split('/')[0] 215 except: 216 take=1 217 session.reload = 0 218 if i.func == 'retake': 219 print(i.func+'fuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuiccccccccccccccccccccccccccccccccccccccccckkkkkkkkkkkkkkkkkkkkkkkkkk') 220 if recording == False: 221 sendtocamera(ip,port,'RETAKE:'+shot) 222 recording = True 223 else: 224 sendtocamera(ip,port,'STOPRETAKE') 225 recording = False 226 if i.func != None: 227 time.sleep(1) 228 session.reload = 1 229 raise web.seeother('/') 230 thumb="/static/Videos/"+name+"/scene"+str(scene).zfill(3)+"/shot"+str(shot).zfill(3)+"/picture"+str(take).zfill(3)+".jpeg" 231 print(thumb) 232 if os.path.isfile(basedir+thumb) == False: 233 print(basedir+thumb) 234 thumb='' 235 return render.index(renderedfilms, unrenderedfilms, session.cameras, menu, selected,name,scene,shot,take,str,session.randhash,thumb,vumetermessage,i.func) 236 237 class films: 238 def GET(self, film): 239 shots = 0 240 takes = 0 241 i = web.input(page=None, scene=None, shot=None, take=None) 242 if i.scene != None: 243 shots = countshots(film, filmfolder, i.scene) 244 takes = counttakes(film, filmfolder, i.scene, i.shot) 245 if i.scene != None and i.shot != None: 246 shots = countshots(film, filmfolder, i.scene) 247 scenes = countscenes(filmfolder, film) 248 return render.filmpage(film, scenes, str, filmfolder, counttakes, countshots, shots, i.scene, takes, i.shot, i.take) 249 250 application = app.wsgifunc() 251