Merge branch 'master' of 192.168.0.2:photoassistant
This commit is contained in:
2
BUGs
2
BUGs
@@ -1,2 +1,4 @@
|
||||
### Next: 1
|
||||
BUG-1: whenever we see a bug...
|
||||
|
||||
BUG-2: Fix the function FixPath so its not just C:, use isPosixPath instead...
|
||||
|
||||
133
files.py
133
files.py
@@ -19,44 +19,18 @@ import numpy
|
||||
################################################################################
|
||||
from settings import Settings
|
||||
|
||||
class FileData():
|
||||
def __init__(self):
|
||||
self.view_path=''
|
||||
self.view_list=[]
|
||||
self.symlink=''
|
||||
self.file_list=[]
|
||||
|
||||
################################################################################
|
||||
# Utility Functions for Files
|
||||
################################################################################
|
||||
|
||||
# Converts linux paths into windows paths
|
||||
# HACK: assumes c:, might be best to just look for [a-z]: ?
|
||||
def FixPath(p):
|
||||
if p.startswith('c:'):
|
||||
p = p.replace('/', '\\')
|
||||
return p
|
||||
|
||||
# Returns an md5 hash of the fnames' contents
|
||||
def md5(fname):
|
||||
hash_md5 = hashlib.md5()
|
||||
with open(fname, "rb") as f:
|
||||
for chunk in iter(lambda: f.read(4096), b""):
|
||||
hash_md5.update(chunk)
|
||||
return hash_md5.hexdigest()
|
||||
|
||||
def isImage(file):
|
||||
try:
|
||||
img = Image.open(file)
|
||||
return True
|
||||
except:
|
||||
return False
|
||||
|
||||
def isVideo(file):
|
||||
try:
|
||||
fileInfo = MediaInfo.parse(file)
|
||||
for track in fileInfo.tracks:
|
||||
if track.track_type == "Video":
|
||||
return True
|
||||
return False
|
||||
except Exception as e:
|
||||
return False
|
||||
|
||||
def getExif(file):
|
||||
def getExif(self, file):
|
||||
f = open(file, 'rb')
|
||||
try:
|
||||
tags = exifread.process_file(f)
|
||||
@@ -68,60 +42,82 @@ def getExif(file):
|
||||
|
||||
fthumbnail = base64.b64encode(tags['JPEGThumbnail'])
|
||||
fthumbnail = str(fthumbnail)[2:-1]
|
||||
|
||||
return fthumbnail
|
||||
|
||||
class FileData():
|
||||
def __init__(self):
|
||||
self.view_path=''
|
||||
self.view_list=[]
|
||||
self.symlink=''
|
||||
def isVideo(self, file):
|
||||
try:
|
||||
fileInfo = MediaInfo.parse(file)
|
||||
for track in fileInfo.tracks:
|
||||
if track.track_type == "Video":
|
||||
return True
|
||||
return False
|
||||
except Exception as e:
|
||||
return False
|
||||
|
||||
#
|
||||
# HACK: At present this only handles one path (need to re-factor if we have
|
||||
# multiple valid paths in import_path)
|
||||
#
|
||||
def GenerateFileData():
|
||||
# Converts linux paths into windows paths
|
||||
# HACK: assumes c:, might be best to just look for [a-z]: ?
|
||||
def FixPath(self, p):
|
||||
if p.startswith('c:'):
|
||||
p = p.replace('/', '\\')
|
||||
return p
|
||||
|
||||
# Returns an md5 hash of the fnames' contents
|
||||
def md5(self, fname):
|
||||
hash_md5 = hashlib.md5()
|
||||
with open(fname, "rb") as f:
|
||||
for chunk in iter(lambda: f.read(4096), b""):
|
||||
hash_md5.update(chunk)
|
||||
return hash_md5.hexdigest()
|
||||
|
||||
def isImage(self, file):
|
||||
try:
|
||||
img = Image.open(file)
|
||||
return True
|
||||
except:
|
||||
return False
|
||||
|
||||
##############################################################################
|
||||
# HACK: At present this only handles one path (need to re-factor if we have #
|
||||
# multiple valid paths in import_path) #
|
||||
##############################################################################
|
||||
def GenerateFileData(self):
|
||||
sets = Settings.query.filter(Settings.name=="import_path").all()
|
||||
paths= sets[0].value.split("#")
|
||||
file_list=[]
|
||||
view_list=[]
|
||||
fdata = FileData()
|
||||
for p in paths:
|
||||
p = FixPath(p)
|
||||
if os.path.exists( p ):
|
||||
fdata.view_path = p
|
||||
|
||||
for path in paths:
|
||||
path = self.FixPath(path)
|
||||
if os.path.exists( path ):
|
||||
self.view_path = path
|
||||
# to serve static content of the images, we create a symlink
|
||||
# from inside the static subdir of each import_path that exists
|
||||
fdata.symlink = FixPath('static/{}'.format( os.path.basename(p[0:-1])))
|
||||
if not os.path.exists(fdata.symlink):
|
||||
os.symlink(p, fdata.symlink)
|
||||
self.symlink = self.FixPath('static/{}'.format( os.path.basename(path[0:-1])))
|
||||
if not os.path.exists(self.symlink):
|
||||
os.symlink(path, self.symlink)
|
||||
|
||||
file_list.append(glob.glob(fdata.view_path + '**', recursive=True))
|
||||
for file in file_list[0]:
|
||||
self.file_list.append(glob.glob(self.view_path + '**', recursive=True))
|
||||
for file in self.file_list[0]:
|
||||
fthumbnail = None
|
||||
if file == p:
|
||||
if file == path:
|
||||
continue
|
||||
if os.path.isdir(file):
|
||||
ftype = 'Directory'
|
||||
elif isImage(file):
|
||||
elif self.isImage(file):
|
||||
ftype = 'Image'
|
||||
fthumbnail = getExif(file)
|
||||
elif isVideo(file):
|
||||
fthumbnail = self.getExif(file)
|
||||
elif self.isVideo(file):
|
||||
ftype = 'Video'
|
||||
else:
|
||||
ftype = 'File'
|
||||
|
||||
if ftype != "Directory":
|
||||
fhash=md5(file)
|
||||
fhash=self.md5(file)
|
||||
else:
|
||||
fhash=None
|
||||
|
||||
fsize = round(os.stat(file).st_size/(1024*1024))
|
||||
fname=file.replace(p, "")
|
||||
view_list.append( Files( name=fname, type=ftype, size_mb=fsize, hash=fhash, thumbnail=fthumbnail ))
|
||||
fdata.view_list = view_list
|
||||
return fdata
|
||||
fname=file.replace(path, "")
|
||||
self.view_list.append( Files( name=fname, type=ftype, size_mb=fsize, hash=fhash, thumbnail=fthumbnail ))
|
||||
return self
|
||||
|
||||
################################################################################
|
||||
# Class describing Files in the database, and via sqlalchemy, connected to the DB as well
|
||||
@@ -140,12 +136,14 @@ class Files(db.Model):
|
||||
return "<id: {}, name: {}>".format(self.id, self.name )
|
||||
|
||||
|
||||
|
||||
################################################################################
|
||||
# /file_list -> show detailed file list of files from import_path(s)
|
||||
################################################################################
|
||||
@app.route("/file_list", methods=["GET"])
|
||||
def file_list():
|
||||
file_data=GenerateFileData()
|
||||
filedata = FileData()
|
||||
file_data=filedata.GenerateFileData()
|
||||
return render_template("file_list.html", page_title='View Files (details)', file_data=file_data, alert=st.GetAlert(), message=st.GetMessage() )
|
||||
|
||||
################################################################################
|
||||
@@ -153,7 +151,8 @@ def file_list():
|
||||
################################################################################
|
||||
@app.route("/files", methods=["GET"])
|
||||
def files():
|
||||
file_data=GenerateFileData()
|
||||
filedata = FileData()
|
||||
file_data=filedata.GenerateFileData()
|
||||
return render_template("files.html", page_title='View Files', file_data=file_data, alert=st.GetAlert(), message=st.GetMessage() )
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user