Mercurial > libervia-backend
annotate sat/plugins/plugin_xep_0446.py @ 4002:5245b675f7ad
plugin XEP-0313: don't wait for MAM to be retrieved in connection workflow:
MAM retrieval can be long, and can be done after connection, message just need to be
sorted when being inserted (i.e. frontends must do insort).
To avoid blocking connection for too long and result in bad UX and timeout risk, one2one
MAM message are not retrieved in background.
author | Goffi <goffi@goffi.org> |
---|---|
date | Fri, 10 Mar 2023 17:22:45 +0100 |
parents | 0ff265725489 |
children | 524856bd7b19 |
rev | line source |
---|---|
3896
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1 #!/usr/bin/env python3 |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
2 |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
3 # Copyright (C) 2009-2022 Jérôme Poisson (goffi@goffi.org) |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
4 |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
5 # This program is free software: you can redistribute it and/or modify |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
6 # it under the terms of the GNU Affero General Public License as published by |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
7 # the Free Software Foundation, either version 3 of the License, or |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
8 # (at your option) any later version. |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
9 |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
10 # This program is distributed in the hope that it will be useful, |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
13 # GNU Affero General Public License for more details. |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
14 |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
15 # You should have received a copy of the GNU Affero General Public License |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
17 |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
18 from logging import exception |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
19 from typing import Optional, Union, Tuple, Dict, Any |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
20 from pathlib import Path |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
21 |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
22 from twisted.words.xish import domish |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
23 |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
24 from sat.core.constants import Const as C |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
25 from sat.core.i18n import _ |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
26 from sat.core.log import getLogger |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
27 from sat.core import exceptions |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
28 from sat.tools import utils |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
29 |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
30 log = getLogger(__name__) |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
31 |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
32 |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
33 PLUGIN_INFO = { |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
34 C.PI_NAME: "File Metadata Element", |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
35 C.PI_IMPORT_NAME: "XEP-0446", |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
36 C.PI_TYPE: "XEP", |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
37 C.PI_MODES: C.PLUG_MODE_BOTH, |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
38 C.PI_PROTOCOLS: ["XEP-0446"], |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
39 C.PI_DEPENDENCIES: ["XEP-0300"], |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
40 C.PI_MAIN: "XEP_0446", |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
41 C.PI_HANDLER: "no", |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
42 C.PI_DESCRIPTION: _("""Implementation of XEP-0446 (File Metadata Element)"""), |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
43 } |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
44 |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
45 NS_FILE_METADATA = "urn:xmpp:file:metadata:0" |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
46 |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
47 |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
48 class XEP_0446: |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
49 |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
50 def __init__(self, host): |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
51 log.info(_("XEP-0446 (File Metadata Element) plugin initialization")) |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
52 host.registerNamespace("file-metadata", NS_FILE_METADATA) |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
53 self._hash = host.plugins["XEP-0300"] |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
54 |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
55 def get_file_metadata_elt( |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
56 self, |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
57 name: Optional[str] = None, |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
58 media_type: Optional[str] = None, |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
59 desc: Optional[str] = None, |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
60 size: Optional[int] = None, |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
61 file_hash: Optional[Tuple[str, str]] = None, |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
62 date: Optional[Union[float, int]] = None, |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
63 width: Optional[int] = None, |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
64 height: Optional[int] = None, |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
65 length: Optional[int] = None, |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
66 thumbnail: Optional[str] = None, |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
67 ) -> domish.Element: |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
68 """Generate the element describing a file |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
69 |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
70 @param name: name of the file |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
71 @param media_type: media-type |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
72 @param desc: description |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
73 @param size: size in bytes |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
74 @param file_hash: (algo, hash) |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
75 @param date: timestamp of the last modification datetime |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
76 @param width: image width in pixels |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
77 @param height: image height in pixels |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
78 @param length: video length in seconds |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
79 @param thumbnail: URL to a thumbnail |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
80 @return: ``<file/>`` element |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
81 """ |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
82 if name: |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
83 name = Path(name).name |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
84 file_elt = domish.Element((NS_FILE_METADATA, "file")) |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
85 for name, value in ( |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
86 ("name", name), |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
87 ("media-type", media_type), |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
88 ("desc", desc), |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
89 ("size", size), |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
90 ("width", width), |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
91 ("height", height), |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
92 ("length", length), |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
93 ): |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
94 if value is not None: |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
95 file_elt.addElement(name, content=str(value)) |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
96 if file_hash is not None: |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
97 hash_algo, hash_ = file_hash |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
98 file_elt.addChild(self._hash.buildHashElt(hash_, hash_algo)) |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
99 if date is not None: |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
100 file_elt.addElement("date", utils.xmpp_date(date)) |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
101 if thumbnail is not None: |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
102 # TODO: implement thumbnails |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
103 log.warning("thumbnail is not implemented yet") |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
104 return file_elt |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
105 |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
106 def parse_file_metadata_elt( |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
107 self, |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
108 file_metadata_elt: domish.Element |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
109 ) -> Dict[str, Any]: |
3922
0ff265725489
plugin XEP-0447: handle attachment and download:
Goffi <goffi@goffi.org>
parents:
3896
diff
changeset
|
110 """Parse <file/> element |
3896
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
111 |
3922
0ff265725489
plugin XEP-0447: handle attachment and download:
Goffi <goffi@goffi.org>
parents:
3896
diff
changeset
|
112 @param file_metadata_elt: <file/> element |
3896
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
113 a parent element can also be used |
3922
0ff265725489
plugin XEP-0447: handle attachment and download:
Goffi <goffi@goffi.org>
parents:
3896
diff
changeset
|
114 @return: file metadata. It's a dict whose keys correspond to |
3896
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
115 [get_file_metadata_elt] parameters |
3922
0ff265725489
plugin XEP-0447: handle attachment and download:
Goffi <goffi@goffi.org>
parents:
3896
diff
changeset
|
116 @raise exceptions.NotFound: no <file/> element has been found |
3896
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
117 """ |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
118 |
3922
0ff265725489
plugin XEP-0447: handle attachment and download:
Goffi <goffi@goffi.org>
parents:
3896
diff
changeset
|
119 if file_metadata_elt.name != "file": |
3896
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
120 try: |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
121 file_metadata_elt = next( |
3922
0ff265725489
plugin XEP-0447: handle attachment and download:
Goffi <goffi@goffi.org>
parents:
3896
diff
changeset
|
122 file_metadata_elt.elements(NS_FILE_METADATA, "file") |
3896
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
123 ) |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
124 except StopIteration: |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
125 raise exceptions.NotFound |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
126 data: Dict[str, Any] = {} |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
127 |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
128 for key, type_ in ( |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
129 ("name", str), |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
130 ("media-type", str), |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
131 ("desc", str), |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
132 ("size", int), |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
133 ("date", "timestamp"), |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
134 ("width", int), |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
135 ("height", int), |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
136 ("length", int), |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
137 ): |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
138 elt = next(file_metadata_elt.elements(NS_FILE_METADATA, key), None) |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
139 if elt is not None: |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
140 if type_ in (str, int): |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
141 content = str(elt) |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
142 if key == "name": |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
143 # we avoid malformed names or names containing path elements |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
144 content = Path(content).name |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
145 elif key == "media-type": |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
146 key = "media_type" |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
147 data[key] = type_(content) |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
148 elif type == "timestamp": |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
149 data[key] = utils.parse_xmpp_date(str(elt)) |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
150 else: |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
151 raise exceptions.InternalError |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
152 |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
153 try: |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
154 algo, hash_ = self._hash.parseHashElt(file_metadata_elt) |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
155 except exceptions.NotFound: |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
156 pass |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
157 except exceptions.DataError: |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
158 from sat.tools.xml_tools import pFmtElt |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
159 log.warning("invalid <hash/> element:\n{pFmtElt(file_metadata_elt)}") |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
160 else: |
3922
0ff265725489
plugin XEP-0447: handle attachment and download:
Goffi <goffi@goffi.org>
parents:
3896
diff
changeset
|
161 data["file_hash"] = (algo, hash_) |
3896
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
162 |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
163 # TODO: thumbnails |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
164 |
dbf0c7faaf49
plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
165 return data |