bbb-utils/bbb.py

76 lines
1.5 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
#
# bbb.py
#
# Utilities to parse BBB recording components
#
# Copyright (c) 2023 Sylvain Munaut <tnt@246tNt.com>
# SPDX-License-Identifier: MIT
#
__all__ = [
'parse_cursor_xml',
'parse_deskshare_xml',
'parse_shapes_svg',
]
import re
import lxml.etree
def parse_cursor_xml(filename):
rv = []
xml_doc = lxml.etree.parse(filename)
for element in xml_doc.xpath("//recording/event"):
px, py = [float(x) for x in element.getchildren()[0].text.split()]
rv.append((
float(element.get("timestamp")),
px,
py,
))
return rv
def parse_deskshare_xml(filename):
rv = []
xml_doc = lxml.etree.parse(filename)
for element in xml_doc.xpath("//recording/event"):
st = float(element.get("start_timestamp"))
et = float(element.get("stop_timestamp"))
rv.append( (st, et, None) )
return rv
def parse_shapes_svg(filename):
rv = []
xml_doc = lxml.etree.parse(filename)
ns = {
'svg': 'http://www.w3.org/2000/svg',
'xlink': 'http://www.w3.org/1999/xlink',
}
for element in xml_doc.xpath("//svg:svg/svg:image", namespaces=ns):
# Parse/Validate href
href = element.get('{http://www.w3.org/1999/xlink}href')
if href == "presentation/deskshare.png":
slide = None
else:
m = re.match('^presentation/([0-9a-fA-F]{40,64}-[0-9]+)/slide-([0-9]+).png$', href)
if not m:
raise RuntimeError('Invalid presentation page link')
slide = (m.group(1), int(m.group(2)))
# Append
rv.append((
float(element.get('in')),
float(element.get('out')),
slide
))
return rv