diff --git a/hydrus/client/caches/ClientCaches.py b/hydrus/client/caches/ClientCaches.py index 1c40a885..3a215534 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', 'krita', 'svg', 'audio', 'video', 'zip' ] + names = [ 'hydrus', 'pdf', 'psd', 'clip', 'sai', 'krita', 'xcf', 'svg', 'audio', 'video', 'zip' ] bounding_dimensions = self._controller.options[ 'thumbnail_dimensions' ] thumbnail_scale_type = self._controller.new_options.GetInteger( 'thumbnail_scale_type' ) @@ -862,6 +862,7 @@ class ThumbnailCache( object ): 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.APPLICATION_XCF: return self._special_thumbs[ 'xcf' ] 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' ] diff --git a/hydrus/core/HydrusConstants.py b/hydrus/core/HydrusConstants.py index 9d95b519..79c7286e 100644 --- a/hydrus/core/HydrusConstants.py +++ b/hydrus/core/HydrusConstants.py @@ -716,12 +716,13 @@ AUDIO_WAVPACK = 53 APPLICATION_SAI2 = 54 APPLICATION_KRITA = 55 IMAGE_SVG = 56 +APPLICATION_XCF = 57 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_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 } +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_XCF, 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 } ) @@ -737,7 +738,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_KRITA, APPLICATION_PDF, APPLICATION_ZIP, APPLICATION_RAR, APPLICATION_7Z } +APPLICATIONS = { IMAGE_SVG, APPLICATION_FLASH, APPLICATION_PSD, APPLICATION_CLIP, APPLICATION_SAI2, APPLICATION_KRITA, APPLICATION_XCF, APPLICATION_PDF, APPLICATION_ZIP, APPLICATION_RAR, APPLICATION_7Z } general_mimetypes_to_mime_groups = { GENERAL_APPLICATION : APPLICATIONS, @@ -797,6 +798,7 @@ mime_enum_lookup = { 'application/clip' : APPLICATION_CLIP, 'application/sai2': APPLICATION_SAI2, 'application/x-krita': APPLICATION_KRITA, + 'image/x-xcf' : APPLICATION_XCF, 'application/octet-stream' : APPLICATION_OCTET_STREAM, 'application/x-yaml' : APPLICATION_YAML, 'PDF document' : APPLICATION_PDF, @@ -859,6 +861,7 @@ mime_string_lookup = { APPLICATION_CLIP : 'clip', APPLICATION_SAI2 : 'sai2', APPLICATION_KRITA : 'kra', + APPLICATION_XCF : 'xcf', APPLICATION_ZIP : 'zip', APPLICATION_RAR : 'rar', APPLICATION_7Z : '7z', @@ -921,6 +924,7 @@ mime_mimetype_string_lookup = { APPLICATION_CLIP : 'application/clip', APPLICATION_SAI2: 'application/sai2', APPLICATION_KRITA: 'application/x-krita', + APPLICATION_XCF : 'image/x-xcf', APPLICATION_ZIP : 'application/zip', APPLICATION_RAR : 'application/vnd.rar', APPLICATION_7Z : 'application/x-7z-compressed', @@ -983,6 +987,7 @@ mime_ext_lookup = { APPLICATION_CLIP : '.clip', APPLICATION_SAI2: '.sai2', APPLICATION_KRITA: '.kra', + APPLICATION_XCF : '.xcf', APPLICATION_ZIP : '.zip', APPLICATION_RAR : '.rar', APPLICATION_7Z : '.7z', diff --git a/hydrus/core/HydrusFileHandling.py b/hydrus/core/HydrusFileHandling.py index fb2ca2f5..3c130cf2 100644 --- a/hydrus/core/HydrusFileHandling.py +++ b/hydrus/core/HydrusFileHandling.py @@ -67,6 +67,7 @@ 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 ), + ( ( ( 0, b'gimp xcf ' ), ), HC.APPLICATION_XCF ), ( ( ( 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 ), diff --git a/static/xcf.png b/static/xcf.png new file mode 100644 index 00000000..b1e4af88 Binary files /dev/null and b/static/xcf.png differ