Mercurial > libervia-backend
annotate sat/plugins/plugin_xep_0264.py @ 2617:81b70eeb710f
quick_frontend(contact list): refactored update:
update is now called with appropriate constant value (C.UPDATE_ADD, C.UPDATE_DELETE, C.UPDATE_MODIFY and so on) when a widget change visibility according to current options.
Before it was linked to cache only (C.UPDATE_ADD was only called when contact was first added to cache).
This make widget handling in frontends more easy.
Renamed entityToShow to entityVisible, which seems to correspond better.
Started reducing lines lenght to 90 chars as a test. May become the new coding style soon.
author | Goffi <goffi@goffi.org> |
---|---|
date | Sun, 24 Jun 2018 21:59:29 +0200 |
parents | 26edcf3a30eb |
children | 56f94936df1e |
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) |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2521
diff
changeset
|
94 return True |
2513
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
95 |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
96 def _getFileThumbnails(self, file_elt, file_data): |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
97 thumbnails = [] |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
98 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
|
99 uri = thumbnail_elt['uri'] |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
100 if uri.startswith ('cid:'): |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
101 thumbnail = {'id': uri[4:]} |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
102 width = thumbnail_elt.getAttribute('width') |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
103 height = thumbnail_elt.getAttribute('height') |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
104 if width and height: |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
105 try: |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
106 thumbnail['size'] = int(width), int(height) |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
107 except ValueError: |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
108 pass |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
109 try: |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
110 thumbnail['mime_type'] = thumbnail_elt['media-type'] |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
111 except KeyError: |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
112 pass |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
113 thumbnails.append(thumbnail) |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
114 |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
115 if thumbnails: |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
116 file_data.setdefault('extra', {})[C.KEY_THUMBNAILS] = thumbnails |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2521
diff
changeset
|
117 return True |
2513
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 ## thumbnails generation ## |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
120 |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
121 def getThumbId(self, image_uid, size): |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
122 """return an ID unique for image/size combination |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
123 |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
124 @param image_uid(unicode): unique id of the image |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
125 can be a hash |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
126 @param size(tuple(int)): requested size of thumbnail |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
127 @return (unicode): unique id for this image/size |
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 return hashlib.sha256(repr((image_uid, size))).hexdigest() |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
130 |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
131 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
|
132 """Generate a thumbnail for image |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
133 |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
134 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
|
135 params are the same as for [generateThumbnail] |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
136 """ |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
137 if size is None: |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
138 size = self.SIZE_SMALL |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
139 try: |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
140 img = Image.open(source_path) |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
141 except IOError: |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
142 return Failure(exceptions.DataError(u"Can't open image")) |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
143 |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
144 img.thumbnail(size) |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
145 uid = self.getThumbId(image_uid or source_path, size) |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
146 |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
147 with self.host.common_cache.cacheData( |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
148 PLUGIN_INFO[C.PI_IMPORT_NAME], |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
149 uid, |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
150 MIME_TYPE, |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
151 max_age, |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
152 ) as f: |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
153 img.save(f, SAVE_FORMAT) |
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 return img.size, uid |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
156 |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
157 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
|
158 """Generate a thumbnail of image |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
159 |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
160 @param source_path(unicode): absolute path to source image |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
161 @param size(int, None): max size of the thumbnail |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
162 can be one of self.SIZE_* |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
163 None to use default value (i.e. self.SIZE_SMALL) |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
164 @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
|
165 @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
|
166 use hash whenever possible |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
167 if None, source_path will be used |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
168 @return D(tuple[tuple[int,int], unicode]): tuple with: |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
169 - size of the thumbnail |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
170 - unique Id of the thumbnail |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
171 """ |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
172 |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
173 d = threads.deferToThread( |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
174 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
|
175 d.addErrback(lambda failure_: |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
176 log.error(u"thumbnail generation error: {}".format(failure_))) |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
177 return d |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
178 |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
179 |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
180 class XEP_0264_handler(XMPPHandler): |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
181 implements(iwokkel.IDisco) |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
182 |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
183 def getDiscoInfo(self, requestor, target, nodeIdentifier=''): |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
184 return [disco.DiscoFeature(NS_THUMBS)] |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
185 |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
186 def getDiscoItems(self, requestor, target, nodeIdentifier=''): |
2d3c9dcec384
plugin XEP-0264: thumbnails handling implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
187 return [] |