Mercurial > libervia-backend
annotate libervia/backend/plugins/plugin_xep_0339.py @ 4306:94e0968987cd
plugin XEP-0033: code modernisation, improve delivery, data validation:
- Code has been rewritten using Pydantic models and `async` coroutines for data validation
and cleaner element parsing/generation.
- Delivery has been completely rewritten. It now works even if server doesn't support
multicast, and send to local multicast service first. Delivering to local multicast
service first is due to bad support of XEP-0033 in server (notably Prosody which has an
incomplete implementation), and the current impossibility to detect if a sub-domain
service handles fully multicast or only for local domains. This is a workaround to have
a good balance between backward compatilibity and use of bandwith, and to make it work
with the incoming email gateway implementation (the gateway will only deliver to
entities of its own domain).
- disco feature checking now uses `async` corountines. `host` implementation still use
Deferred return values for compatibility with legacy code.
rel 450
author | Goffi <goffi@goffi.org> |
---|---|
date | Thu, 26 Sep 2024 16:12:01 +0200 |
parents | 0d7bb4df2343 |
children |
rev | line source |
---|---|
4067
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1 #!/usr/bin/env python3 |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
2 |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
3 # Libervia plugin |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
4 # Copyright (C) 2009-2023 Jérôme Poisson (goffi@goffi.org) |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
5 |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
6 # This program is free software: you can redistribute it and/or modify |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
7 # it under the terms of the GNU Affero General Public License as published by |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
8 # the Free Software Foundation, either version 3 of the License, or |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
9 # (at your option) any later version. |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
10 |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 # This program is distributed in the hope that it will be useful, |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
14 # GNU Affero General Public License for more details. |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
15 |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 # You should have received a copy of the GNU Affero General Public License |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
17 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
18 |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
19 from typing import List |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
20 |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
21 from twisted.words.protocols.jabber.xmlstream import XMPPHandler |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
22 from twisted.words.xish import domish |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
23 from wokkel import disco, iwokkel |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
24 from zope.interface import implementer |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
25 |
4071
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4067
diff
changeset
|
26 from libervia.backend.core import exceptions |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4067
diff
changeset
|
27 from libervia.backend.core.constants import Const as C |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4067
diff
changeset
|
28 from libervia.backend.core.core_types import SatXMPPEntity |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4067
diff
changeset
|
29 from libervia.backend.core.i18n import _ |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4067
diff
changeset
|
30 from libervia.backend.core.log import getLogger |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4067
diff
changeset
|
31 from libervia.backend.tools import xml_tools |
4067
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
32 |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
33 log = getLogger(__name__) |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
34 |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
35 NS_JINGLE_RTP_SSMA = "urn:xmpp:jingle:apps:rtp:ssma:0" |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
36 |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
37 PLUGIN_INFO = { |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
38 C.PI_NAME: "Source-Specific Media Attributes in Jingle", |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
39 C.PI_IMPORT_NAME: "XEP-0339", |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
40 C.PI_TYPE: "XEP", |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
41 C.PI_MODES: C.PLUG_MODE_BOTH, |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
42 C.PI_PROTOCOLS: ["XEP-0339"], |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
43 C.PI_DEPENDENCIES: ["XEP-0092", "XEP-0167"], |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
44 C.PI_RECOMMENDATIONS: [], |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
45 C.PI_MAIN: "XEP_0339", |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
46 C.PI_HANDLER: "yes", |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
47 C.PI_DESCRIPTION: _("""Source-Specific Media Attributes in Jingle"""), |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
48 } |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
49 |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
50 |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
51 class XEP_0339: |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
52 def __init__(self, host): |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
53 log.info(f"plugin {PLUGIN_INFO[C.PI_NAME]!r} initialization") |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
54 self.host = host |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
55 host.trigger.add("XEP-0167_parse_sdp_a", self._parse_sdp_a_trigger) |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
56 host.trigger.add( |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
57 "XEP-0167_generate_sdp_content", self._generate_sdp_content_trigger |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
58 ) |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
59 host.trigger.add("XEP-0167_parse_description", self._parse_description_trigger) |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
60 host.trigger.add("XEP-0167_build_description", self._build_description_trigger) |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
61 |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
62 def get_handler(self, client): |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
63 return XEP_0339_handler() |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
64 |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
65 def _parse_sdp_a_trigger( |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
66 self, |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
67 attribute: str, |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
68 parts: List[str], |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
69 call_data: dict, |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
70 metadata: dict, |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
71 media_type: str, |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
72 application_data: dict, |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
73 transport_data: dict, |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
74 ) -> None: |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
75 """Parse "ssrc" attributes""" |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
76 if attribute == "ssrc": |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
77 assert application_data is not None |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
78 ssrc_id = int(parts[0]) |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
79 |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
80 if len(parts) > 1: |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
81 name, *values = " ".join(parts[1:]).split(":", 1) |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
82 if values: |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
83 value = values[0] or None |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
84 else: |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
85 value = None |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
86 application_data.setdefault("ssrc", {}).setdefault(ssrc_id, {})[ |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
87 name |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
88 ] = value |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
89 else: |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
90 log.warning(f"no attribute in ssrc: {' '.join(parts)}") |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
91 application_data.setdefault("ssrc", {}).setdefault(ssrc_id, {}) |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
92 elif attribute == "ssrc-group": |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
93 assert application_data is not None |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
94 semantics, *ssrc_ids = parts |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
95 ssrc_ids = [int(ssrc_id) for ssrc_id in ssrc_ids] |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
96 application_data.setdefault("ssrc-group", {})[semantics] = ssrc_ids |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
97 elif attribute == "msid": |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
98 assert application_data is not None |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
99 application_data["msid"] = " ".join(parts) |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
100 |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
101 def _generate_sdp_content_trigger( |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
102 self, |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
103 session: dict, |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
104 local: bool, |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
105 idx: int, |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
106 content_data: dict, |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
107 sdp_lines: List[str], |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
108 application_data: dict, |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
109 app_data_key: str, |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
110 media_data: dict, |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
111 media: str, |
4067
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
112 ) -> None: |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
113 """Generate "msid" and "ssrc" attributes""" |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
114 if "msid" in media_data: |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
115 sdp_lines.append(f"a=msid:{media_data['msid']}") |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
116 |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
117 ssrc_data = media_data.get("ssrc", {}) |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
118 ssrc_group_data = media_data.get("ssrc-group", {}) |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
119 |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
120 for ssrc_id, attributes in ssrc_data.items(): |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
121 if not attributes: |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
122 # there are no attributes for this SSRC ID, we add a simple line with only |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
123 # the SSRC ID |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
124 sdp_lines.append(f"a=ssrc:{ssrc_id}") |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
125 else: |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
126 for attr_name, attr_value in attributes.items(): |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
127 if attr_value is not None: |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
128 sdp_lines.append(f"a=ssrc:{ssrc_id} {attr_name}:{attr_value}") |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
129 else: |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
130 sdp_lines.append(f"a=ssrc:{ssrc_id} {attr_name}") |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
131 for semantics, ssrc_ids in ssrc_group_data.items(): |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
132 ssrc_lines = " ".join(str(ssrc_id) for ssrc_id in ssrc_ids) |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
133 sdp_lines.append(f"a=ssrc-group:{semantics} {ssrc_lines}") |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
134 |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
135 def _parse_description_trigger( |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
136 self, desc_elt: domish.Element, media_data: dict |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
137 ) -> bool: |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
138 """Parse the <source> and <ssrc-group> elements""" |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
139 for source_elt in desc_elt.elements(NS_JINGLE_RTP_SSMA, "source"): |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
140 try: |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
141 ssrc_id = int(source_elt["ssrc"]) |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
142 media_data.setdefault("ssrc", {})[ssrc_id] = {} |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
143 for param_elt in source_elt.elements(NS_JINGLE_RTP_SSMA, "parameter"): |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
144 name = param_elt["name"] |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
145 value = param_elt.getAttribute("value") |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
146 media_data["ssrc"][ssrc_id][name] = value |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
147 if name == "msid" and "msid" not in media_data: |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
148 media_data["msid"] = value |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
149 except (KeyError, ValueError) as e: |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
150 log.warning(f"Error while parsing <source>: {e}\n{source_elt.toXml()}") |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
151 |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
152 for ssrc_group_elt in desc_elt.elements(NS_JINGLE_RTP_SSMA, "ssrc-group"): |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
153 try: |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
154 semantics = ssrc_group_elt["semantics"] |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
155 semantic_ids = media_data.setdefault("ssrc-group", {})[semantics] = [] |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
156 for source_elt in ssrc_group_elt.elements(NS_JINGLE_RTP_SSMA, "source"): |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
157 semantic_ids.append(int(source_elt["ssrc"])) |
4067
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
158 except (KeyError, ValueError) as e: |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
159 log.warning( |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
160 f"Error while parsing <ssrc-group>: {e}\n{ssrc_group_elt.toXml()}" |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
161 ) |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
162 |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
163 return True |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
164 |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
165 def _build_description_trigger( |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
166 self, desc_elt: domish.Element, media_data: dict, session: dict |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
167 ) -> bool: |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
168 """Build the <source> and <ssrc-group> elements if possible""" |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
169 for ssrc_id, parameters in media_data.get("ssrc", {}).items(): |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
170 if "msid" not in parameters and "msid" in media_data: |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
171 parameters["msid"] = media_data["msid"] |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
172 source_elt = desc_elt.addElement((NS_JINGLE_RTP_SSMA, "source")) |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
173 source_elt["ssrc"] = str(ssrc_id) |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
174 for name, value in parameters.items(): |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
175 param_elt = source_elt.addElement((NS_JINGLE_RTP_SSMA, "parameter")) |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
176 param_elt["name"] = name |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
177 if value is not None: |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
178 param_elt["value"] = value |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
179 |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
180 for semantics, ssrc_ids in media_data.get("ssrc-group", {}).items(): |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
181 ssrc_group_elt = desc_elt.addElement((NS_JINGLE_RTP_SSMA, "ssrc-group")) |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
182 ssrc_group_elt["semantics"] = semantics |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
183 for ssrc_id in ssrc_ids: |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
184 source_elt = ssrc_group_elt.addElement((NS_JINGLE_RTP_SSMA, "source")) |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
185 source_elt["ssrc"] = str(ssrc_id) |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
186 |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
187 return True |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
188 |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
189 |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
190 @implementer(iwokkel.IDisco) |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
191 class XEP_0339_handler(XMPPHandler): |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
192 def getDiscoInfo(self, requestor, target, nodeIdentifier=""): |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
193 return [disco.DiscoFeature(NS_JINGLE_RTP_SSMA)] |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
194 |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
195 def getDiscoItems(self, requestor, target, nodeIdentifier=""): |
3f62c2445df1
plugin XEP-0339: "Source-Specific Media Attributes in Jingle" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
196 return [] |