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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 []