Completely hardcode mimetypes, improve mimetype search query.
This commit is contained in:
parent
dcaff7fb11
commit
35c29e6778
4 changed files with 77 additions and 33 deletions
|
@ -215,24 +215,76 @@ FILENAME_BADCHARS = '\\/:*?<>|"'
|
||||||
|
|
||||||
USER_ID_CHARACTERS = string.digits + string.ascii_uppercase
|
USER_ID_CHARACTERS = string.digits + string.ascii_uppercase
|
||||||
|
|
||||||
ADDITIONAL_MIMETYPES = {
|
MIMETYPES = {
|
||||||
'7z': 'archive',
|
'7z': ('archive', '7z'),
|
||||||
'gz': 'archive',
|
'gz': ('archive', 'gz'),
|
||||||
'rar': 'archive',
|
'rar': ('archive', 'rar'),
|
||||||
|
'tar': ('archive', 'tar'),
|
||||||
|
'zip': ('archive', 'zip'),
|
||||||
|
|
||||||
'aac': 'audio/aac',
|
'aac': ('audio', 'aac'),
|
||||||
'ac3': 'audio/ac3',
|
'ac3': ('audio', 'ac3'),
|
||||||
'dts': 'audio/dts',
|
'aif': ('audio', 'x-aiff'),
|
||||||
'm4a': 'audio/mp4',
|
'aifc': ('audio', 'x-aiff'),
|
||||||
'opus': 'audio/ogg',
|
'aiff': ('audio', 'x-aiff'),
|
||||||
|
'au': ('audio', 'basic'),
|
||||||
|
'dts': ('audio', 'dts'),
|
||||||
|
'm4a': ('audio', 'mp4'),
|
||||||
|
'mp2': ('audio', 'mpeg'),
|
||||||
|
'mp3': ('audio', 'mpeg'),
|
||||||
|
'opus': ('audio', 'ogg'),
|
||||||
|
'snd': ('audio', 'basic'),
|
||||||
|
'wav': ('audio', 'x-wav'),
|
||||||
|
|
||||||
'mkv': 'video/x-matroska',
|
'bmp': ('image', 'x-ms-bmp'),
|
||||||
|
'gif': ('image', 'gif'),
|
||||||
|
'ico': ('image', 'vnd.microsoft.icon'),
|
||||||
|
'ief': ('image', 'ief'),
|
||||||
|
'jpe': ('image', 'jpeg'),
|
||||||
|
'jpeg': ('image', 'jpeg'),
|
||||||
|
'jpg': ('image', 'jpeg'),
|
||||||
|
'png': ('image', 'png'),
|
||||||
|
'svg': ('image', 'svg+xml'),
|
||||||
|
'tif': ('image', 'tiff'),
|
||||||
|
'tiff': ('image', 'tiff'),
|
||||||
|
|
||||||
'ass': 'text/plain',
|
'ass': ('text', 'plain'),
|
||||||
'md': 'text/plain',
|
'bat': ('text', 'plain'),
|
||||||
'nfo': 'text/plain',
|
'c': ('text', 'plain'),
|
||||||
'rst': 'text/plain',
|
'css': ('text', 'css'),
|
||||||
'srt': 'text/plain',
|
'csv': ('text', 'csv'),
|
||||||
|
'etx': ('text', 'x-setext'),
|
||||||
|
'h': ('text', 'plain'),
|
||||||
|
'htm': ('text', 'html'),
|
||||||
|
'html': ('text', 'html'),
|
||||||
|
'js': ('text', 'javascript'),
|
||||||
|
'json': ('text', 'json'),
|
||||||
|
'ksh': ('text', 'plain'),
|
||||||
|
'md': ('text', 'plain'),
|
||||||
|
'nfo': ('text', 'plain'),
|
||||||
|
'pl': ('text', 'plain'),
|
||||||
|
'py': ('text', 'x-python'),
|
||||||
|
'rst': ('text', 'plain'),
|
||||||
|
'rtx': ('text', 'richtext'),
|
||||||
|
'sgm': ('text', 'x-sgml'),
|
||||||
|
'sgml': ('text', 'x-sgml'),
|
||||||
|
'srt': ('text', 'plain'),
|
||||||
|
'tsv': ('text', 'tab-separated-values'),
|
||||||
|
'txt': ('text', 'plain'),
|
||||||
|
'vcf': ('text', 'x-vcard'),
|
||||||
|
'xml': ('text', 'xml'),
|
||||||
|
|
||||||
|
'avi': ('video', 'x-msvideo'),
|
||||||
|
'm1v': ('video', 'mpeg'),
|
||||||
|
'mkv': ('video', 'x-matroska'),
|
||||||
|
'mov': ('video', 'quicktime'),
|
||||||
|
'mp4': ('video', 'mp4'),
|
||||||
|
'mpa': ('video', 'mpeg'),
|
||||||
|
'mpe': ('video', 'mpeg'),
|
||||||
|
'mpeg': ('video', 'mpeg'),
|
||||||
|
'mpg': ('video', 'mpeg'),
|
||||||
|
'qt': ('video', 'quicktime'),
|
||||||
|
'webm': ('video', 'webm'),
|
||||||
}
|
}
|
||||||
|
|
||||||
# Photodb ##########################################################################################
|
# Photodb ##########################################################################################
|
||||||
|
|
|
@ -5,7 +5,6 @@ codebase but don't deserve to be methods of any class.
|
||||||
import bs4
|
import bs4
|
||||||
import datetime
|
import datetime
|
||||||
import hashlib
|
import hashlib
|
||||||
import mimetypes
|
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import PIL.Image
|
import PIL.Image
|
||||||
|
@ -286,16 +285,9 @@ def generate_video_thumbnail(filepath, outfile, width, height, **special) -> PIL
|
||||||
)
|
)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def get_mimetype(filepath) -> typing.Optional[str]:
|
def get_mimetype(extension) -> typing.Optional[str]:
|
||||||
'''
|
extension = extension.strip('.')
|
||||||
Extension to mimetypes.guess_type which uses my
|
return constants.MIMETYPES.get(extension, None)
|
||||||
constants.ADDITIONAL_MIMETYPES.
|
|
||||||
'''
|
|
||||||
extension = os.path.splitext(filepath)[1].replace('.', '')
|
|
||||||
mimetype = constants.ADDITIONAL_MIMETYPES.get(extension, None)
|
|
||||||
if mimetype is None:
|
|
||||||
mimetype = mimetypes.guess_type(filepath)[0]
|
|
||||||
return mimetype
|
|
||||||
|
|
||||||
def hash_photoset(photos) -> str:
|
def hash_photoset(photos) -> str:
|
||||||
'''
|
'''
|
||||||
|
|
|
@ -926,12 +926,14 @@ class Photo(ObjectBase):
|
||||||
# self._mimetype vars to help memoize, which needs to be None-capable.
|
# self._mimetype vars to help memoize, which needs to be None-capable.
|
||||||
# So although I normally like using @property, this is less lines of
|
# So although I normally like using @property, this is less lines of
|
||||||
# code and less indirection really.
|
# code and less indirection really.
|
||||||
self.mimetype = helpers.get_mimetype(self.real_path.basename)
|
mime = helpers.get_mimetype(self.real_path.extension.no_dot)
|
||||||
|
|
||||||
if self.mimetype is None:
|
if mime is None:
|
||||||
self.simple_mimetype = None
|
self.simple_mimetype = None
|
||||||
|
self.mimetype = None
|
||||||
else:
|
else:
|
||||||
self.simple_mimetype = self.mimetype.split('/')[0]
|
self.simple_mimetype = mime[0]
|
||||||
|
self.mimetype = '/'.join(mime)
|
||||||
|
|
||||||
def _uncache(self):
|
def _uncache(self):
|
||||||
self.photodb.caches[Photo].remove(self.id)
|
self.photodb.caches[Photo].remove(self.id)
|
||||||
|
|
|
@ -725,7 +725,8 @@ class PDBPhotoMixin:
|
||||||
bindings.extend(extension_not)
|
bindings.extend(extension_not)
|
||||||
|
|
||||||
if mimetype:
|
if mimetype:
|
||||||
notnulls.add('extension')
|
extensions = {extension for (extension, (typ, subtyp)) in constants.MIMETYPES.items() if typ in mimetype}
|
||||||
|
wheres.append(f'extension IN {sqlhelpers.listify(extensions)} COLLATE NOCASE')
|
||||||
|
|
||||||
if within_directory:
|
if within_directory:
|
||||||
patterns = {d.absolute_path.rstrip(os.sep) for d in within_directory}
|
patterns = {d.absolute_path.rstrip(os.sep) for d in within_directory}
|
||||||
|
@ -808,9 +809,6 @@ class PDBPhotoMixin:
|
||||||
for row in generator:
|
for row in generator:
|
||||||
photo = self.get_cached_instance(objects.Photo, row)
|
photo = self.get_cached_instance(objects.Photo, row)
|
||||||
|
|
||||||
if mimetype and photo.simple_mimetype not in mimetype:
|
|
||||||
continue
|
|
||||||
|
|
||||||
if filename_tree and not filename_tree.evaluate(photo.basename.lower()):
|
if filename_tree and not filename_tree.evaluate(photo.basename.lower()):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue