From d92f3549faaba4068be52e39daad276596af0704 Mon Sep 17 00:00:00 2001 From: Minnowo <62451415+Minnowo@users.noreply.github.com> Date: Thu, 6 Jul 2023 02:29:13 -0400 Subject: [PATCH] Add support for krita files --- hydrus/client/caches/ClientCaches.py | 3 ++- hydrus/core/HydrusConstants.py | 9 +++++++-- hydrus/core/HydrusFileHandling.py | 2 ++ hydrus/core/HydrusPaths.py | 1 + static/krita.png | Bin 0 -> 9775 bytes 5 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 static/krita.png diff --git a/hydrus/client/caches/ClientCaches.py b/hydrus/client/caches/ClientCaches.py index ab59fbb6..e505182d 100644 --- a/hydrus/client/caches/ClientCaches.py +++ b/hydrus/client/caches/ClientCaches.py @@ -744,7 +744,7 @@ class ThumbnailCache( object ): self._special_thumbs = {} - names = [ 'hydrus', 'pdf', 'psd', 'clip', 'sai', 'audio', 'video', 'zip' ] + names = [ 'hydrus', 'pdf', 'psd', 'clip', 'sai', 'krita', '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 in HC.ARCHIVES: return self._special_thumbs[ 'zip' ] else: return self._special_thumbs[ 'hydrus' ] diff --git a/hydrus/core/HydrusConstants.py b/hydrus/core/HydrusConstants.py index 070327fe..80329c46 100644 --- a/hydrus/core/HydrusConstants.py +++ b/hydrus/core/HydrusConstants.py @@ -714,12 +714,13 @@ APPLICATION_CBOR = 51 APPLICATION_WINDOWS_EXE = 52 AUDIO_WAVPACK = 53 APPLICATION_SAI2 = 54 +APPLICATION_KRITA = 55 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, 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, 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 } ) @@ -735,7 +736,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 = { APPLICATION_FLASH, APPLICATION_PSD, APPLICATION_CLIP, APPLICATION_SAI2, APPLICATION_PDF, APPLICATION_ZIP, APPLICATION_RAR, APPLICATION_7Z } +APPLICATIONS = { 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, @@ -793,6 +794,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, @@ -853,6 +855,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', @@ -913,6 +916,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', @@ -973,6 +977,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', diff --git a/hydrus/core/HydrusFileHandling.py b/hydrus/core/HydrusFileHandling.py index efebc342..42b077eb 100644 --- a/hydrus/core/HydrusFileHandling.py +++ b/hydrus/core/HydrusFileHandling.py @@ -65,6 +65,8 @@ 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-kritaPK' ), ), HC.APPLICATION_KRITA ), # important this comes before zip files because this is also a zip file + ( ( ( 58, b'application/x-kritaPK' ), ), HC.APPLICATION_KRITA ), # changes offset when compressed with zip64 ( ( ( 0, b'PK\x03\x04' ), ), HC.APPLICATION_ZIP ), ( ( ( 0, b'PK\x05\x06' ), ), HC.APPLICATION_ZIP ), ( ( ( 0, b'PK\x07\x08' ), ), HC.APPLICATION_ZIP ), diff --git a/hydrus/core/HydrusPaths.py b/hydrus/core/HydrusPaths.py index d9517ef8..d2a1b475 100644 --- a/hydrus/core/HydrusPaths.py +++ b/hydrus/core/HydrusPaths.py @@ -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' ) for mime in HC.AUDIO: diff --git a/static/krita.png b/static/krita.png new file mode 100644 index 0000000000000000000000000000000000000000..d3af56c986542bdb14fa47032f505f41b3aeffca GIT binary patch literal 9775 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