Merge remote-tracking branch 'hydrusnetwork/master' into svg
This commit is contained in:
commit
5a5293fa8f
|
@ -744,7 +744,7 @@ class ThumbnailCache( object ):
|
|||
|
||||
self._special_thumbs = {}
|
||||
|
||||
names = [ 'hydrus', 'pdf', 'psd', 'clip', 'sai', 'svg', 'audio', 'video', 'zip' ]
|
||||
names = [ 'hydrus', 'pdf', 'psd', 'clip', 'sai', 'krita', 'svg', 'audio', 'video', 'zip' ]
|
||||
|
||||
bounding_dimensions = self._controller.options[ 'thumbnail_dimensions' ]
|
||||
thumbnail_scale_type = self._controller.new_options.GetInteger( 'thumbnail_scale_type' )
|
||||
|
@ -861,6 +861,7 @@ class ThumbnailCache( object ):
|
|||
elif mime == HC.APPLICATION_PDF: return self._special_thumbs[ 'pdf' ]
|
||||
elif mime == HC.APPLICATION_PSD: return self._special_thumbs[ 'psd' ]
|
||||
elif mime == HC.APPLICATION_SAI2: return self._special_thumbs[ 'sai' ]
|
||||
elif mime == HC.APPLICATION_KRITA: return self._special_thumbs[ 'krita' ]
|
||||
elif mime == HC.IMAGE_SVG: return self._special_thumbs[ 'svg' ]
|
||||
elif mime in HC.ARCHIVES: return self._special_thumbs[ 'zip' ]
|
||||
else: return self._special_thumbs[ 'hydrus' ]
|
||||
|
|
|
@ -714,13 +714,14 @@ APPLICATION_CBOR = 51
|
|||
APPLICATION_WINDOWS_EXE = 52
|
||||
AUDIO_WAVPACK = 53
|
||||
APPLICATION_SAI2 = 54
|
||||
IMAGE_SVG = 55
|
||||
APPLICATION_KRITA = 55
|
||||
IMAGE_SVG = 56
|
||||
APPLICATION_OCTET_STREAM = 100
|
||||
APPLICATION_UNKNOWN = 101
|
||||
|
||||
GENERAL_FILETYPES = { GENERAL_APPLICATION, GENERAL_AUDIO, GENERAL_IMAGE, GENERAL_VIDEO, GENERAL_ANIMATION }
|
||||
|
||||
SEARCHABLE_MIMES = { IMAGE_JPEG, IMAGE_PNG, IMAGE_APNG, IMAGE_GIF, IMAGE_WEBP, IMAGE_TIFF, IMAGE_ICON, IMAGE_SVG, APPLICATION_FLASH, VIDEO_AVI, VIDEO_FLV, VIDEO_MOV, VIDEO_MP4, VIDEO_MKV, VIDEO_REALMEDIA, VIDEO_WEBM, VIDEO_OGV, VIDEO_MPEG, APPLICATION_CLIP, APPLICATION_PSD, APPLICATION_SAI2, APPLICATION_PDF, APPLICATION_ZIP, APPLICATION_RAR, APPLICATION_7Z, AUDIO_M4A, AUDIO_MP3, AUDIO_REALMEDIA, AUDIO_OGG, AUDIO_FLAC, AUDIO_WAVE, AUDIO_TRUEAUDIO, AUDIO_WMA, VIDEO_WMV, AUDIO_MKV, AUDIO_MP4, AUDIO_WAVPACK }
|
||||
SEARCHABLE_MIMES = { IMAGE_JPEG, IMAGE_PNG, IMAGE_APNG, IMAGE_GIF, IMAGE_WEBP, IMAGE_TIFF, IMAGE_ICON, IMAGE_SVG, APPLICATION_FLASH, VIDEO_AVI, VIDEO_FLV, VIDEO_MOV, VIDEO_MP4, VIDEO_MKV, VIDEO_REALMEDIA, VIDEO_WEBM, VIDEO_OGV, VIDEO_MPEG, APPLICATION_CLIP, APPLICATION_PSD, APPLICATION_SAI2, APPLICATION_KRITA, APPLICATION_PDF, APPLICATION_ZIP, APPLICATION_RAR, APPLICATION_7Z, AUDIO_M4A, AUDIO_MP3, AUDIO_REALMEDIA, AUDIO_OGG, AUDIO_FLAC, AUDIO_WAVE, AUDIO_TRUEAUDIO, AUDIO_WMA, VIDEO_WMV, AUDIO_MKV, AUDIO_MP4, AUDIO_WAVPACK }
|
||||
|
||||
STORABLE_MIMES = set( SEARCHABLE_MIMES ).union( { APPLICATION_HYDRUS_UPDATE_CONTENT, APPLICATION_HYDRUS_UPDATE_DEFINITIONS } )
|
||||
|
||||
|
@ -736,7 +737,7 @@ AUDIO = { AUDIO_M4A, AUDIO_MP3, AUDIO_OGG, AUDIO_FLAC, AUDIO_WAVE, AUDIO_WMA, AU
|
|||
|
||||
VIDEO = { VIDEO_AVI, VIDEO_FLV, VIDEO_MOV, VIDEO_MP4, VIDEO_WMV, VIDEO_MKV, VIDEO_REALMEDIA, VIDEO_WEBM, VIDEO_OGV, VIDEO_MPEG }
|
||||
|
||||
APPLICATIONS = { IMAGE_SVG, APPLICATION_FLASH, APPLICATION_PSD, APPLICATION_CLIP, APPLICATION_SAI2, APPLICATION_PDF, APPLICATION_ZIP, APPLICATION_RAR, APPLICATION_7Z }
|
||||
APPLICATIONS = { IMAGE_SVG, APPLICATION_FLASH, APPLICATION_PSD, APPLICATION_CLIP, APPLICATION_SAI2, APPLICATION_KRITA, APPLICATION_PDF, APPLICATION_ZIP, APPLICATION_RAR, APPLICATION_7Z }
|
||||
|
||||
general_mimetypes_to_mime_groups = {
|
||||
GENERAL_APPLICATION : APPLICATIONS,
|
||||
|
@ -761,7 +762,7 @@ MIMES_THAT_MAY_HAVE_AUDIO = tuple( list( MIMES_THAT_DEFINITELY_HAVE_AUDIO ) + li
|
|||
|
||||
ARCHIVES = { APPLICATION_ZIP, APPLICATION_HYDRUS_ENCRYPTED_ZIP, APPLICATION_RAR, APPLICATION_7Z }
|
||||
|
||||
MIMES_WITH_THUMBNAILS = set( IMAGES ).union( ANIMATIONS ).union( VIDEO ).union( { IMAGE_SVG, APPLICATION_FLASH, APPLICATION_CLIP, APPLICATION_PSD } )
|
||||
MIMES_WITH_THUMBNAILS = set( IMAGES ).union( ANIMATIONS ).union( VIDEO ).union( { IMAGE_SVG, APPLICATION_FLASH, APPLICATION_CLIP, APPLICATION_PSD, APPLICATION_KRITA } )
|
||||
|
||||
FILES_THAT_CAN_HAVE_ICC_PROFILE = { IMAGE_JPEG, IMAGE_PNG, IMAGE_GIF, IMAGE_TIFF }
|
||||
|
||||
|
@ -795,6 +796,7 @@ mime_enum_lookup = {
|
|||
'image/vnd.adobe.photoshop' : APPLICATION_PSD,
|
||||
'application/clip' : APPLICATION_CLIP,
|
||||
'application/sai2': APPLICATION_SAI2,
|
||||
'application/x-krita': APPLICATION_KRITA,
|
||||
'application/octet-stream' : APPLICATION_OCTET_STREAM,
|
||||
'application/x-yaml' : APPLICATION_YAML,
|
||||
'PDF document' : APPLICATION_PDF,
|
||||
|
@ -856,6 +858,7 @@ mime_string_lookup = {
|
|||
APPLICATION_PSD : 'photoshop psd',
|
||||
APPLICATION_CLIP : 'clip',
|
||||
APPLICATION_SAI2 : 'sai2',
|
||||
APPLICATION_KRITA : 'kra',
|
||||
APPLICATION_ZIP : 'zip',
|
||||
APPLICATION_RAR : 'rar',
|
||||
APPLICATION_7Z : '7z',
|
||||
|
@ -917,6 +920,7 @@ mime_mimetype_string_lookup = {
|
|||
APPLICATION_PSD : 'application/x-photoshop',
|
||||
APPLICATION_CLIP : 'application/clip',
|
||||
APPLICATION_SAI2: 'application/sai2',
|
||||
APPLICATION_KRITA: 'application/x-krita',
|
||||
APPLICATION_ZIP : 'application/zip',
|
||||
APPLICATION_RAR : 'application/vnd.rar',
|
||||
APPLICATION_7Z : 'application/x-7z-compressed',
|
||||
|
@ -978,6 +982,7 @@ mime_ext_lookup = {
|
|||
APPLICATION_PSD : '.psd',
|
||||
APPLICATION_CLIP : '.clip',
|
||||
APPLICATION_SAI2: '.sai2',
|
||||
APPLICATION_KRITA: '.kra',
|
||||
APPLICATION_ZIP : '.zip',
|
||||
APPLICATION_RAR : '.rar',
|
||||
APPLICATION_7Z : '.7z',
|
||||
|
|
|
@ -4,6 +4,7 @@ import struct
|
|||
|
||||
from hydrus.core import HydrusAudioHandling
|
||||
from hydrus.core import HydrusClipHandling
|
||||
from hydrus.core import HydrusKritaHandling
|
||||
from hydrus.core import HydrusSVGHandling
|
||||
from hydrus.core import HydrusConstants as HC
|
||||
from hydrus.core import HydrusData
|
||||
|
@ -66,6 +67,10 @@ headers_and_mime.extend( [
|
|||
( ( ( 0, b'8BPS\x00\x02' ), ), HC.APPLICATION_PSD ), # PSB, which is basically PSD v2 and does giganto resolution
|
||||
( ( ( 0, b'CSFCHUNK' ), ), HC.APPLICATION_CLIP ),
|
||||
( ( ( 0, b'SAI-CANVAS' ), ), HC.APPLICATION_SAI2 ),
|
||||
( ( ( 38, b'application/x-krita' ), ), HC.APPLICATION_KRITA ), # important this comes before zip files because this is also a zip file
|
||||
( ( ( 42, b'application/x-krita' ), ), HC.APPLICATION_KRITA ), # https://gitlab.freedesktop.org/xdg/shared-mime-info/-/blob/master/data/freedesktop.org.xml.in#L2829
|
||||
( ( ( 58, b'application/x-krita' ), ), HC.APPLICATION_KRITA ),
|
||||
( ( ( 63, b'application/x-krita' ), ), HC.APPLICATION_KRITA ),
|
||||
( ( ( 0, b'PK\x03\x04' ), ), HC.APPLICATION_ZIP ),
|
||||
( ( ( 0, b'PK\x05\x06' ), ), HC.APPLICATION_ZIP ),
|
||||
( ( ( 0, b'PK\x07\x08' ), ), HC.APPLICATION_ZIP ),
|
||||
|
@ -153,6 +158,28 @@ def GenerateThumbnailBytes( path, target_resolution, mime, duration, num_frames,
|
|||
|
||||
HydrusTemp.CleanUpTempPath( os_file_handle, temp_path )
|
||||
|
||||
|
||||
elif mime == HC.APPLICATION_KRITA:
|
||||
|
||||
( os_file_handle, temp_path ) = HydrusTemp.GetTempPath()
|
||||
|
||||
try:
|
||||
|
||||
HydrusKritaHandling.ExtractZippedImageToPath( path, temp_path )
|
||||
|
||||
thumbnail_bytes = HydrusImageHandling.GenerateThumbnailBytesFromStaticImagePath( temp_path, target_resolution, HC.IMAGE_PNG, clip_rect = clip_rect )
|
||||
|
||||
except Exception as e:
|
||||
|
||||
thumb_path = os.path.join( HC.STATIC_DIR, 'krita.png' )
|
||||
|
||||
thumbnail_bytes = HydrusImageHandling.GenerateThumbnailBytesFromStaticImagePath( thumb_path, target_resolution, HC.IMAGE_PNG, clip_rect = clip_rect )
|
||||
|
||||
finally:
|
||||
|
||||
HydrusTemp.CleanUpTempPath( os_file_handle, temp_path )
|
||||
|
||||
|
||||
elif mime == HC.IMAGE_SVG:
|
||||
|
||||
try:
|
||||
|
@ -168,7 +195,7 @@ def GenerateThumbnailBytes( path, target_resolution, mime, duration, num_frames,
|
|||
|
||||
thumbnail_bytes = HydrusImageHandling.GenerateThumbnailBytesFromStaticImagePath( thumb_path, target_resolution, HC.IMAGE_PNG, clip_rect = clip_rect )
|
||||
|
||||
|
||||
|
||||
elif mime == HC.APPLICATION_FLASH:
|
||||
|
||||
( os_file_handle, temp_path ) = HydrusTemp.GetTempPath()
|
||||
|
@ -330,6 +357,10 @@ def GetFileInfo( path, mime = None, ok_to_look_for_hydrus_updates = False ):
|
|||
|
||||
( ( width, height ), duration, num_frames ) = HydrusClipHandling.GetClipProperties( path )
|
||||
|
||||
elif mime == HC.APPLICATION_KRITA:
|
||||
|
||||
( width, height ) = HydrusKritaHandling.GetKraProperties( path )
|
||||
|
||||
elif mime == HC.IMAGE_SVG:
|
||||
|
||||
( width, height ) = HydrusSVGHandling.GetSVGResolution( path )
|
||||
|
|
|
@ -0,0 +1,93 @@
|
|||
|
||||
from hydrus.core import HydrusExceptions
|
||||
from hydrus.core import HydrusTemp
|
||||
|
||||
import zipfile
|
||||
import re
|
||||
|
||||
KRITA_FILE_THUMB = "preview.png"
|
||||
KRITA_FILE_MERGED = "mergedimage.png"
|
||||
|
||||
|
||||
def ExtractSingleFileFromZip( path_to_zip, filename_to_extract, extract_into_file_path ):
|
||||
|
||||
with zipfile.ZipFile( path_to_zip ) as zip_handle:
|
||||
|
||||
with zip_handle.open( filename_to_extract ) as reader:
|
||||
|
||||
with open( extract_into_file_path, "wb" ) as writer:
|
||||
|
||||
writer.write( reader.read() )
|
||||
|
||||
|
||||
def ExtractZippedImageToPath( path_to_zip, temp_path_file ):
|
||||
|
||||
try:
|
||||
|
||||
ExtractSingleFileFromZip( path_to_zip, KRITA_FILE_MERGED, temp_path_file )
|
||||
|
||||
return
|
||||
|
||||
except KeyError:
|
||||
|
||||
pass
|
||||
|
||||
|
||||
try:
|
||||
|
||||
ExtractSingleFileFromZip( path_to_zip, KRITA_FILE_THUMB, temp_path_file )
|
||||
|
||||
except KeyError:
|
||||
|
||||
raise HydrusExceptions.DamagedOrUnusualFileException( f'This krita file had no {KRITA_FILE_MERGED} or {KRITA_FILE_THUMB}, so no PNG thumb could be extracted!' )
|
||||
|
||||
|
||||
# TODO: animation and frame stuff which is also in the maindoc.xml
|
||||
def GetKraProperties( path ):
|
||||
|
||||
( os_file_handle, maindoc_xml ) = HydrusTemp.GetTempPath()
|
||||
|
||||
DOCUMENT_INFO_FILE = "maindoc.xml"
|
||||
|
||||
# TODO: probably actually parse the xml instead of using regex
|
||||
FIND_KEY_VALUE = re.compile(r"([a-z\-\_]+)\s*=\s*['\"]([^'\"]+)", re.IGNORECASE)
|
||||
|
||||
width = None
|
||||
height = None
|
||||
|
||||
try:
|
||||
|
||||
ExtractSingleFileFromZip( path, DOCUMENT_INFO_FILE, maindoc_xml )
|
||||
|
||||
with open(maindoc_xml, "r") as reader:
|
||||
|
||||
for line in reader:
|
||||
|
||||
for match in FIND_KEY_VALUE.findall( line ):
|
||||
|
||||
key, value = match
|
||||
|
||||
if key == "width" and value.isdigit():
|
||||
|
||||
width = int(value)
|
||||
|
||||
if key == "height" and value.isdigit():
|
||||
|
||||
height = int(value)
|
||||
|
||||
if width is not None and height is not None:
|
||||
|
||||
break
|
||||
|
||||
except KeyError:
|
||||
|
||||
raise HydrusExceptions.DamagedOrUnusualFileException( f'This krita file had no {DOCUMENT_INFO_FILE}, so no information could be extracted!' )
|
||||
|
||||
finally:
|
||||
|
||||
HydrusTemp.CleanUpTempPath( os_file_handle, maindoc_xml )
|
||||
|
||||
return width, height
|
||||
|
||||
|
||||
|
|
@ -24,6 +24,7 @@ mimes_to_default_thumbnail_paths[ HC.APPLICATION_PDF ] = os.path.join( HC.STATIC
|
|||
mimes_to_default_thumbnail_paths[ HC.APPLICATION_PSD ] = os.path.join( HC.STATIC_DIR, 'psd.png' )
|
||||
mimes_to_default_thumbnail_paths[ HC.APPLICATION_CLIP ] = os.path.join( HC.STATIC_DIR, 'clip.png' )
|
||||
mimes_to_default_thumbnail_paths[ HC.APPLICATION_SAI2 ] = os.path.join( HC.STATIC_DIR, 'sai.png' )
|
||||
mimes_to_default_thumbnail_paths[ HC.APPLICATION_KRITA ] = os.path.join( HC.STATIC_DIR, 'krita.png' )
|
||||
mimes_to_default_thumbnail_paths[ HC.IMAGE_SVG ] = os.path.join( HC.STATIC_DIR, 'svg.png' )
|
||||
|
||||
for mime in HC.AUDIO:
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 23 KiB |
Loading…
Reference in New Issue