annotate src/plugins/plugin_xep_0264.py @ 2521:327bbbe793ce

plugin XEP-0264: handle truncated files
author Goffi <goffi@goffi.org>
date Wed, 14 Mar 2018 08:11:20 +0100
parents 2d3c9dcec384
children 65e278997715
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2513
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
1 #!/usr/bin/env python2
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
2 # -*- coding: utf-8 -*-
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
3
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
4 # SAT plugin for managing xep-0264
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
5 # Copyright (C) 2009-2018 Jérôme Poisson (goffi@goffi.org)
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
6 # Copyright (C) 2014 Emmanuel Gil Peyrot (linkmauve@linkmauve.fr)
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
7
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
8 # This program is free software: you can redistribute it and/or modify
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
9 # it under the terms of the GNU Affero General Public License as published by
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
10 # the Free Software Foundation, either version 3 of the License, or
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
11 # (at your option) any later version.
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
12
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
13 # This program is distributed in the hope that it will be useful,
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
16 # GNU Affero General Public License for more details.
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
17
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
18 # You should have received a copy of the GNU Affero General Public License
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
19 # along with this program. If not, see <http://www.gnu.org/licenses/>.
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
20
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
21 from sat.core.i18n import _
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
22 from sat.core.constants import Const as C
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
23 from sat.core.log import getLogger
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
24 log = getLogger(__name__)
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
25 from twisted.internet import threads
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
26 from twisted.python.failure import Failure
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
27
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
28 from zope.interface import implements
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
29
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
30 from wokkel import disco, iwokkel
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
31
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
32 from sat.core import exceptions
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
33 import hashlib
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
34 try:
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
35 from PIL import Image
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
36 except:
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
37 raise exceptions.MissingModule(u"Missing module pillow, please download/install it from https://python-pillow.github.io")
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
38
2521
327bbbe793ce plugin XEP-0264: handle truncated files
Goffi <goffi@goffi.org>
parents: 2513
diff changeset
39 # cf. https://stackoverflow.com/a/23575424
327bbbe793ce plugin XEP-0264: handle truncated files
Goffi <goffi@goffi.org>
parents: 2513
diff changeset
40 from PIL import ImageFile
327bbbe793ce plugin XEP-0264: handle truncated files
Goffi <goffi@goffi.org>
parents: 2513
diff changeset
41 ImageFile.LOAD_TRUNCATED_IMAGES = True
327bbbe793ce plugin XEP-0264: handle truncated files
Goffi <goffi@goffi.org>
parents: 2513
diff changeset
42
2513
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
43 try:
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
44 from twisted.words.protocols.xmlstream import XMPPHandler
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
45 except ImportError:
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
46 from wokkel.subprotocols import XMPPHandler
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
47
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
48
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
49 MIME_TYPE = u'image/jpeg'
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
50 SAVE_FORMAT = u'JPEG' # (cf. Pillow documentation)
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
51
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
52 NS_THUMBS = 'urn:xmpp:thumbs:1'
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
53
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
54 PLUGIN_INFO = {
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
55 C.PI_NAME: "XEP-0264",
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
56 C.PI_IMPORT_NAME: "XEP-0264",
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
57 C.PI_TYPE: "XEP",
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
58 C.PI_MODES: C.PLUG_MODE_BOTH,
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
59 C.PI_PROTOCOLS: ["XEP-0264"],
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
60 C.PI_DEPENDENCIES: ["XEP-0234"],
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
61 C.PI_MAIN: "XEP_0264",
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
62 C.PI_HANDLER: "yes",
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
63 C.PI_DESCRIPTION: _("""Thumbnails handling""")
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
64 }
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
65
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
66
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
67 class XEP_0264(object):
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
68 SIZE_SMALL = (250, 250)
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
69 SIZE_MEDIUM = (1024, 1024)
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
70
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
71 def __init__(self, host):
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
72 log.info(_(u"Plugin XEP_0264 initialization"))
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
73 self.host = host
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
74 host.trigger.add("XEP-0234_buildFileElement", self._addFileThumbnails)
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
75 host.trigger.add("XEP-0234_parseFileElement", self._getFileThumbnails)
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
76
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
77 def getHandler(self, client):
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
78 return XEP_0264_handler()
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
79
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
80 ## triggers ##
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
81
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
82 def _addFileThumbnails(self, file_elt, extra_args):
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
83 try:
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
84 thumbnails = extra_args[u'extra'][C.KEY_THUMBNAILS]
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
85 except KeyError:
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
86 return
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
87 for thumbnail in thumbnails:
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
88 thumbnail_elt = file_elt.addElement((NS_THUMBS, u'thumbnail'))
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
89 thumbnail_elt['uri'] = u'cid:' + thumbnail['id']
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
90 thumbnail_elt['media-type'] = MIME_TYPE
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
91 width, height = thumbnail['size']
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
92 thumbnail_elt['width'] = unicode(width)
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
93 thumbnail_elt['height'] = unicode(height)
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
94
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
95 def _getFileThumbnails(self, file_elt, file_data):
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
96 thumbnails = []
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
97 for thumbnail_elt in file_elt.elements(NS_THUMBS, u'thumbnail'):
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
98 uri = thumbnail_elt['uri']
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
99 if uri.startswith ('cid:'):
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
100 thumbnail = {'id': uri[4:]}
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
101 width = thumbnail_elt.getAttribute('width')
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
102 height = thumbnail_elt.getAttribute('height')
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
103 if width and height:
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
104 try:
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
105 thumbnail['size'] = int(width), int(height)
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
106 except ValueError:
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
107 pass
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
108 try:
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
109 thumbnail['mime_type'] = thumbnail_elt['media-type']
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
110 except KeyError:
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
111 pass
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
112 thumbnails.append(thumbnail)
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
113
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
114 if thumbnails:
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
115 file_data.setdefault('extra', {})[C.KEY_THUMBNAILS] = thumbnails
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
116
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
117 ## thumbnails generation ##
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
118
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
119 def getThumbId(self, image_uid, size):
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
120 """return an ID unique for image/size combination
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
121
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
122 @param image_uid(unicode): unique id of the image
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
123 can be a hash
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
124 @param size(tuple(int)): requested size of thumbnail
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
125 @return (unicode): unique id for this image/size
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
126 """
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
127 return hashlib.sha256(repr((image_uid, size))).hexdigest()
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
128
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
129 def _blockingGenThumb(self, source_path, size=None, max_age=None, image_uid=None):
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
130 """Generate a thumbnail for image
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
131
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
132 This is a blocking method and must be executed in a thread
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
133 params are the same as for [generateThumbnail]
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
134 """
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
135 if size is None:
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
136 size = self.SIZE_SMALL
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
137 try:
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
138 img = Image.open(source_path)
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
139 except IOError:
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
140 return Failure(exceptions.DataError(u"Can't open image"))
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
141
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
142 img.thumbnail(size)
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
143 uid = self.getThumbId(image_uid or source_path, size)
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
144
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
145 with self.host.common_cache.cacheData(
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
146 PLUGIN_INFO[C.PI_IMPORT_NAME],
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
147 uid,
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
148 MIME_TYPE,
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
149 max_age,
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
150 ) as f:
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
151 img.save(f, SAVE_FORMAT)
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
152
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
153 return img.size, uid
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
154
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
155 def generateThumbnail(self, source_path, size=None, max_age=None, image_uid=None):
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
156 """Generate a thumbnail of image
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
157
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
158 @param source_path(unicode): absolute path to source image
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
159 @param size(int, None): max size of the thumbnail
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
160 can be one of self.SIZE_*
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
161 None to use default value (i.e. self.SIZE_SMALL)
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
162 @param max_age(int, None): same as for [memory.cache.Cache.cacheData])
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
163 @param image_uid(unicode, None): unique ID to identify the image
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
164 use hash whenever possible
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
165 if None, source_path will be used
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
166 @return D(tuple[tuple[int,int], unicode]): tuple with:
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
167 - size of the thumbnail
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
168 - unique Id of the thumbnail
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
169 """
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
170
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
171 d = threads.deferToThread(
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
172 self._blockingGenThumb, source_path, size, max_age, image_uid=image_uid)
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
173 d.addErrback(lambda failure_:
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
174 log.error(u"thumbnail generation error: {}".format(failure_)))
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
175 return d
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
176
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
177
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
178 class XEP_0264_handler(XMPPHandler):
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
179 implements(iwokkel.IDisco)
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
180
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
181 def getDiscoInfo(self, requestor, target, nodeIdentifier=''):
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
182 return [disco.DiscoFeature(NS_THUMBS)]
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
183
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
184 def getDiscoItems(self, requestor, target, nodeIdentifier=''):
2d3c9dcec384 plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff changeset
185 return []