From cf629ffc10b5aba226e8353214d21636f9af627f Mon Sep 17 00:00:00 2001 From: Cam Date: Mon, 11 Jan 2021 11:31:10 +1100 Subject: [PATCH 1/2] removed newline...? git weirdness --- templates/photos.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/photos.html b/templates/photos.html index f768580..5865dc1 100644 --- a/templates/photos.html +++ b/templates/photos.html @@ -24,4 +24,4 @@ -{% endblock main_content %} +{% endblock main_content %} \ No newline at end of file From 980db74a78e2958fe11118d0b9561af1eae33abb Mon Sep 17 00:00:00 2001 From: Cam Date: Mon, 11 Jan 2021 11:47:37 +1100 Subject: [PATCH 2/2] added a bug, and also stuck all of our utility functions for files into a class --- BUGs | 2 + files.py | 191 +++++++++++++++++++++++++++---------------------------- 2 files changed, 97 insertions(+), 96 deletions(-) diff --git a/BUGs b/BUGs index 3a7e50a..2cbf9bd 100644 --- a/BUGs +++ b/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... diff --git a/files.py b/files.py index 3937a7f..c3e3d10 100644 --- a/files.py +++ b/files.py @@ -19,109 +19,105 @@ import numpy ################################################################################ from settings import Settings - -################################################################################ -# 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): - f = open(file, 'rb') - try: - tags = exifread.process_file(f) - except: - print('NO EXIF TAGS?!?!?!?') - f.close() - raise - f.close() - - 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='' + self.file_list=[] + +################################################################################ +# Utility Functions for Files +################################################################################ -# -# HACK: At present this only handles one path (need to re-factor if we have -# multiple valid paths in import_path) -# -def GenerateFileData(): - 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 - # 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) + def getExif(self, file): + f = open(file, 'rb') + try: + tags = exifread.process_file(f) + except: + print('NO EXIF TAGS?!?!?!?') + f.close() + raise + f.close() - file_list.append(glob.glob(fdata.view_path + '**', recursive=True)) - for file in file_list[0]: - fthumbnail = None - if file == p: - continue - if os.path.isdir(file): - ftype = 'Directory' - elif isImage(file): - ftype = 'Image' - fthumbnail = getExif(file) - elif isVideo(file): - ftype = 'Video' - else: - ftype = 'File' + fthumbnail = base64.b64encode(tags['JPEGThumbnail']) + fthumbnail = str(fthumbnail)[2:-1] + return fthumbnail + + 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 - if ftype != "Directory": - fhash=md5(file) - else: - fhash=None + # 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 - 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 + # 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("#") + + 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 + self.symlink = self.FixPath('static/{}'.format( os.path.basename(path[0:-1]))) + if not os.path.exists(self.symlink): + os.symlink(path, self.symlink) + + self.file_list.append(glob.glob(self.view_path + '**', recursive=True)) + for file in self.file_list[0]: + fthumbnail = None + if file == path: + continue + if os.path.isdir(file): + ftype = 'Directory' + elif self.isImage(file): + ftype = 'Image' + fthumbnail = self.getExif(file) + elif self.isVideo(file): + ftype = 'Video' + else: + ftype = 'File' + + if ftype != "Directory": + fhash=self.md5(file) + else: + fhash=None + + fsize = round(os.stat(file).st_size/(1024*1024)) + 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 "".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() )