diff --git a/bbb-common-web/scala/TestScalaXml.sc b/bbb-common-web/scala/TestScalaXml.sc index b3566fb5e56c1aa34ac4caa0dee590e26c9f4741..5bd27083770f24bf4ad43ac60963b16f7312b406 100755 --- a/bbb-common-web/scala/TestScalaXml.sc +++ b/bbb-common-web/scala/TestScalaXml.sc @@ -65,6 +65,7 @@ val baz = foo1 map { f => baz.size val playback = xml \ "playback" + val extensions = playback \ "extensions" val preview = extensions \ "preview" diff --git a/bbb-common-web/src/main/scala/org/bigbluebutton/api2/domain/Recording.scala b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/domain/Recording.scala index f3798b1e77a7f956e63615fc03ca47970239db3d..137f9de1d5f443bff86f05448a27ba35c09ffddb 100755 --- a/bbb-common-web/src/main/scala/org/bigbluebutton/api2/domain/Recording.scala +++ b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/domain/Recording.scala @@ -1,4 +1,40 @@ package org.bigbluebutton.api2.domain -case class Extensions(extensions: scala.xml.NodeSeq) + +object RecMeta { + def getMeetingId(r: RecMeta): String = { + r.meeting match { + case Some(m) => m.externalId + case None => r.id + } + } + + def getInternalId(r: RecMeta): Option[String] = { + r.meeting match { + case Some(m) => Some(m.id) + case None => None + } + } + + def getMeetingName(r: RecMeta): String = { + r.meeting match { + case Some(m) => m.name + case None => + r.meta match { + case Some(m) => m.getOrElse("meetingName", "unknown") + case None => "unknown" + } + } + } + + +} + +case class RecMeta(id: String, state: String, published: Boolean, startTime: Long, endTime: Long, + participants: Int, rawSize: Int, meeting: Option[RecMetaMeeting], + meta: Option[Map[String, String]], playback: Option[RecMetaPlayback]) +case class RecMetaMeeting(id: String, externalId: String, name: String, breakout: Boolean) +case class RecMetaPlayback(format: String, link: String, processingTime: Int, + duration: Int, size: Int, extensions: Option[scala.xml.NodeSeq]) case class RecMetaImage(width: String, height: String, alt: String, link: String) +case class RecMetaBreakout(parentId: String, sequence: Int, meetingId: String) \ No newline at end of file diff --git a/bbb-common-web/src/main/scala/org/bigbluebutton/api2/util/RecMetaXmlHelper.scala b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/util/RecMetaXmlHelper.scala index c6e5efd7e87915da9336660a609f99250129b341..969a4aca4ee86306aacde98664a5aae1b121c90d 100755 --- a/bbb-common-web/src/main/scala/org/bigbluebutton/api2/util/RecMetaXmlHelper.scala +++ b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/util/RecMetaXmlHelper.scala @@ -2,6 +2,8 @@ package org.bigbluebutton.api2.util import java.io.IOException +import org.bigbluebutton.api2.domain.{RecMeta, RecMetaBreakout, RecMetaMeeting, RecMetaPlayback} + import scala.xml.{Elem, NodeSeq, XML} object RecMetaXmlHelper extends LogHelper { @@ -21,7 +23,36 @@ object RecMetaXmlHelper extends LogHelper { } } - def getExtensions(playbackXml: Elem): Option[NodeSeq] = { + private def getText(elem: NodeSeq, key: String, default: String): String = { + val res = (elem \ key).text + if (res.isEmpty) default else res + } + + private def getValInt(elem: NodeSeq, key: String, default: Int): Int = { + val res = (elem \ key).text + if (res.isEmpty) default else res.toInt + } + + private def getValLong(elem: NodeSeq, key: String, default: Long): Long = { + val res = (elem \ key).text + if (res.isEmpty) default else res.toLong + } + + def getPlayback(metaXml: Elem): Option[RecMetaPlayback] = { + val playback = metaXml \ "playback" + if (playback.isEmpty) None + else { + val format = getText(playback, "format", "unknown") + val link = getText(playback, "link", "unknown") + val processingTime = getValInt(playback, "processing_time", 0) + val duration = getValInt(playback, "duration", 0) + val size = getValInt(playback, "size", 0) + val extensions = getExtensions(playback) + Some(RecMetaPlayback(format, link, processingTime, duration, size, extensions)) + } + } + + def getExtensions(playbackXml: NodeSeq): Option[NodeSeq] = { val extensions = playbackXml \ "extensions" if (extensions.isEmpty) None else Some(extensions) @@ -42,6 +73,58 @@ object RecMetaXmlHelper extends LogHelper { } else { None } + } + + def getMeeting(metaXml: Elem): Option[RecMetaMeeting] = { + val meetingNode = (metaXml \ "meeting") + if (meetingNode.isEmpty) { + None + } else { + val meetingElem = meetingNode(0) // convert from Node to Elem + val id = meetingElem.attribute("id").getOrElse("unknown").toString + val externalId = meetingElem.attribute("externalId").getOrElse("unknown").toString + val name = meetingElem.attribute("name").getOrElse("unknown").toString + val breakout = meetingElem.attribute("breakout").getOrElse("false") + Some(RecMetaMeeting(id, externalId, name, breakout.toString.toBoolean)) + } + } + + def getBreakout(metaXml: Elem): Option[RecMetaBreakout] = { + val breakoutNode = (metaXml \ "breakout") + if (breakoutNode.isEmpty) { + None + } else { + val breakoutElem = breakoutNode(0) // convert from Node to Elem + val parentId = breakoutElem.attribute("parentMeetingId").getOrElse("unknown").toString + val sequence = breakoutElem.attribute("sequence").getOrElse("0").toString + val meetingId = breakoutElem.attribute("meetingId").getOrElse("unknown").toString + Some(RecMetaBreakout(parentId, sequence.toInt, meetingId)) + } + } + + def getRecMeta(metaXml: Elem): Option[RecMeta] = { + val id = getText(metaXml, "id", "unknown") + val state = getText(metaXml, "state", "unknown") + val published = getText(metaXml, "published", "true") + val startTime = getValLong(metaXml, "start_time", 0) + val endTime = getValLong(metaXml, "end_time", 0) + val rawSize = getValInt(metaXml, "raw_size", 0) + val participants = getValInt(metaXml, "participants", 0) + val meeting = getMeeting(metaXml) + val meta = getMeta(metaXml) + val playback = getPlayback(metaXml) + + Some(RecMeta(id, state, published.toString.toBoolean, startTime, endTime, participants, rawSize, + meeting, meta, playback)) + } + + def getRecMetaXml(r: RecMeta): Elem = { + val recordIdElem = <recordID>{r.id}</recordID> + val meetingIdElem = <meetingID>{RecMeta.getMeetingId(r)}</meetingID> + val internalId = RecMeta.getInternalId(r) + + val buffer = new scala.xml.NodeBuffer + } } diff --git a/bbb-common-web/src/test/resources/sample-get-recordings-response.xml b/bbb-common-web/src/test/resources/sample-get-recordings-response.xml new file mode 100755 index 0000000000000000000000000000000000000000..a3c4980fb1f0766d4a16c2a0463d71522228355d --- /dev/null +++ b/bbb-common-web/src/test/resources/sample-get-recordings-response.xml @@ -0,0 +1,298 @@ +<?xml version="1.0" encoding="UTF-8"?> +<response> + <returncode>SUCCESS</returncode> + <recordings> + <recording> + <recordID>bc04628ab61776c9f65c695dc59f36abf8955bbc-1504087272607</recordID> + <meetingID>f01411a126dd7ea29c9c3859523bc1baac3c1e2f</meetingID> + <internalMeetingID>bc04628ab61776c9f65c695dc59f36abf8955bbc-1504087272607</internalMeetingID> + <name>теÑÑ‚</name> + <isBreakout>false</isBreakout> + <published>true</published> + <state>published</state> + <startTime>1504087272607</startTime> + <endTime>1504087451081</endTime> + <participants>2</participants> + <metadata> + <gl-listed>false</gl-listed> + <gl-token>an-a02174f6-теÑÑ‚</gl-token> + <gl-webhooks-callback-url>https://demo.bigbluebutton.org/b/rooms/an-a02174f6/%D1%82%D0%B5%D1%81%D1%82/callback</gl-webhooks-callback-url> + <isBreakout>false</isBreakout> + <meeting-name>теÑÑ‚</meeting-name> + <meetingId>f01411a126dd7ea29c9c3859523bc1baac3c1e2f</meetingId> + <meetingName>теÑÑ‚</meetingName> + <room-id>an-a02174f6</room-id> + </metadata> + <playback> + <format> + <type>presentation</type> + <url>https://demo.bigbluebutton.org/playback/presentation/2.0/playback.html?meetingId=bc04628ab61776c9f65c695dc59f36abf8955bbc-1504087272607</url> + <processingTime>15016</processingTime> + <length>0</length> + <preview> + <images> + <image width="176" height="136" alt="Welcome to">https://demo.bigbluebutton.org/presentation/bc04628ab61776c9f65c695dc59f36abf8955bbc-1504087272607/presentation/d2d9a672040fbde2a47a10bf6c37b6a4b5ae187f-1504087272638/thumbnails/thumb-1.png</image> + <image width="176" height="136" alt="(this slide left blank for use as a whiteboard)">https://demo.bigbluebutton.org/presentation/bc04628ab61776c9f65c695dc59f36abf8955bbc-1504087272607/presentation/d2d9a672040fbde2a47a10bf6c37b6a4b5ae187f-1504087272638/thumbnails/thumb-2.png</image> + <image width="176" height="136" alt="(this slide left blank for use as a whiteboard)">https://demo.bigbluebutton.org/presentation/bc04628ab61776c9f65c695dc59f36abf8955bbc-1504087272607/presentation/d2d9a672040fbde2a47a10bf6c37b6a4b5ae187f-1504087272638/thumbnails/thumb-3.png</image> + </images> + </preview> + </format> + </playback> + </recording> + <recording> + <recordID>b27af2f930d418879550e09c7548d1cdd0be25cf-1504122319984</recordID> + <meetingID>5bd0e35013bc9761d06f01d4bfd9b4ae1c8df289</meetingID> + <internalMeetingID>b27af2f930d418879550e09c7548d1cdd0be25cf-1504122319984</internalMeetingID> + <name>Prueba 2</name> + <isBreakout>false</isBreakout> + <published>true</published> + <state>published</state> + <startTime>1504122319984</startTime> + <endTime>1504122655395</endTime> + <participants>4</participants> + <metadata> + <gl-listed>false</gl-listed> + <gl-token>vi-249c619c-Prueba 2</gl-token> + <gl-webhooks-callback-url>https://demo.bigbluebutton.org/b/rooms/vi-249c619c/Prueba%202/callback</gl-webhooks-callback-url> + <isBreakout>false</isBreakout> + <meeting-name>Prueba 2</meeting-name> + <meetingId>5bd0e35013bc9761d06f01d4bfd9b4ae1c8df289</meetingId> + <meetingName>Prueba 2</meetingName> + <room-id>vi-249c619c</room-id> + </metadata> + <playback> + <format> + <type>presentation</type> + <url>https://demo.bigbluebutton.org/playback/presentation/2.0/playback.html?meetingId=b27af2f930d418879550e09c7548d1cdd0be25cf-1504122319984</url> + <processingTime>10915</processingTime> + <length>1</length> + <preview> + <images> + <image width="176" height="136" alt="Welcome to">https://demo.bigbluebutton.org/presentation/b27af2f930d418879550e09c7548d1cdd0be25cf-1504122319984/presentation/d2d9a672040fbde2a47a10bf6c37b6a4b5ae187f-1504122320002/thumbnails/thumb-1.png</image> + <image width="176" height="136" alt="(this slide left blank for use as a whiteboard)">https://demo.bigbluebutton.org/presentation/b27af2f930d418879550e09c7548d1cdd0be25cf-1504122319984/presentation/d2d9a672040fbde2a47a10bf6c37b6a4b5ae187f-1504122320002/thumbnails/thumb-2.png</image> + <image width="176" height="136" alt="(this slide left blank for use as a whiteboard)">https://demo.bigbluebutton.org/presentation/b27af2f930d418879550e09c7548d1cdd0be25cf-1504122319984/presentation/d2d9a672040fbde2a47a10bf6c37b6a4b5ae187f-1504122320002/thumbnails/thumb-3.png</image> + </images> + </preview> + </format> + </playback> + </recording> + <recording> + <recordID>92054d4d63772d6cd6eb222b24ba4afe704a6e02-1504111840674</recordID> + <meetingID>c35c6b973eb05cbb9757b2f3a765ada07777ca32</meetingID> + <internalMeetingID>92054d4d63772d6cd6eb222b24ba4afe704a6e02-1504111840674</internalMeetingID> + <name>Let&#39;s Talk English: Episode 5</name> + <isBreakout>false</isBreakout> + <published>true</published> + <state>published</state> + <startTime>1504111840674</startTime> + <endTime>1504116188350</endTime> + <participants>2</participants> + <metadata> + <gl-listed>false</gl-listed> + <gl-token>es-4701f53c-Let&#39;s Talk English: Episode 5</gl-token> + <gl-webhooks-callback-url>https://demo.bigbluebutton.org/b/rooms/es-4701f53c/Let&#39;s%20Talk%20English:%20Episode%205/callback</gl-webhooks-callback-url> + <isBreakout>false</isBreakout> + <meeting-name>Let&#39;s Talk English: Episode 5</meeting-name> + <meetingId>c35c6b973eb05cbb9757b2f3a765ada07777ca32</meetingId> + <meetingName>Let&#39;s Talk English: Episode 5</meetingName> + <room-id>es-4701f53c</room-id> + </metadata> + <playback> + <format> + <type>presentation</type> + <url>https://demo.bigbluebutton.org/playback/presentation/2.0/playback.html?meetingId=92054d4d63772d6cd6eb222b24ba4afe704a6e02-1504111840674</url> + <processingTime>1135643</processingTime> + <length>53</length> + <preview> + <images> + <image width="176" height="136" alt="Welcome to">https://demo.bigbluebutton.org/presentation/92054d4d63772d6cd6eb222b24ba4afe704a6e02-1504111840674/presentation/d2d9a672040fbde2a47a10bf6c37b6a4b5ae187f-1504111840688/thumbnails/thumb-1.png</image> + <image width="176" height="136" alt="(this slide left blank for use as a whiteboard)">https://demo.bigbluebutton.org/presentation/92054d4d63772d6cd6eb222b24ba4afe704a6e02-1504111840674/presentation/d2d9a672040fbde2a47a10bf6c37b6a4b5ae187f-1504111840688/thumbnails/thumb-2.png</image> + <image width="176" height="136" alt="(this slide left blank for use as a whiteboard)">https://demo.bigbluebutton.org/presentation/92054d4d63772d6cd6eb222b24ba4afe704a6e02-1504111840674/presentation/d2d9a672040fbde2a47a10bf6c37b6a4b5ae187f-1504111840688/thumbnails/thumb-3.png</image> + </images> + </preview> + </format> + </playback> + </recording> + <recording> + <recordID>6e35e3b2778883f5db637d7a5dba0a427f692e91-1504093550964</recordID> + <meetingID>English 101</meetingID> + <internalMeetingID>6e35e3b2778883f5db637d7a5dba0a427f692e91-1504093550964</internalMeetingID> + <name>English 101</name> + <isBreakout>false</isBreakout> + <published>true</published> + <state>published</state> + <startTime>1504093550964</startTime> + <endTime>1504093678083</endTime> + <participants>1</participants> + <metadata> + <description>TEST</description> + <email>Test Antonio</email> + <isBreakout>false</isBreakout> + <meetingId>English 101</meetingId> + <meetingName>English 101</meetingName> + <title>English 101</title> + </metadata> + <playback> + <format> + <type>presentation</type> + <url>https://demo.bigbluebutton.org/playback/presentation/2.0/playback.html?meetingId=6e35e3b2778883f5db637d7a5dba0a427f692e91-1504093550964</url> + <processingTime>22380</processingTime> + <length>1</length> + <preview> + <images> + <image width="176" height="136" alt="Welcome to">https://demo.bigbluebutton.org/presentation/6e35e3b2778883f5db637d7a5dba0a427f692e91-1504093550964/presentation/d2d9a672040fbde2a47a10bf6c37b6a4b5ae187f-1504093550976/thumbnails/thumb-1.png</image> + <image width="176" height="136" alt="(this slide left blank for use as a whiteboard)">https://demo.bigbluebutton.org/presentation/6e35e3b2778883f5db637d7a5dba0a427f692e91-1504093550964/presentation/d2d9a672040fbde2a47a10bf6c37b6a4b5ae187f-1504093550976/thumbnails/thumb-2.png</image> + <image width="176" height="136" alt="(this slide left blank for use as a whiteboard)">https://demo.bigbluebutton.org/presentation/6e35e3b2778883f5db637d7a5dba0a427f692e91-1504093550964/presentation/d2d9a672040fbde2a47a10bf6c37b6a4b5ae187f-1504093550976/thumbnails/thumb-3.png</image> + </images> + </preview> + </format> + </playback> + </recording> + <recording> + <recordID>81f4deea7881b1dc8df4016738e71b91e296346e-1504111142171</recordID> + <meetingID>c5ba1738a5c36c030b0ed0f561d0cb07b95bda42</meetingID> + <internalMeetingID>81f4deea7881b1dc8df4016738e71b91e296346e-1504111142171</internalMeetingID> + <name>kk</name> + <isBreakout>false</isBreakout> + <published>true</published> + <state>published</state> + <startTime>1504111142171</startTime> + <endTime>1504112672948</endTime> + <participants>3</participants> + <metadata> + <gl-listed>false</gl-listed> + <gl-token>ma-e7684b5a-kk</gl-token> + <gl-webhooks-callback-url>https://demo.bigbluebutton.org/b/rooms/ma-e7684b5a/kk/callback</gl-webhooks-callback-url> + <isBreakout>false</isBreakout> + <meeting-name>kk</meeting-name> + <meetingId>c5ba1738a5c36c030b0ed0f561d0cb07b95bda42</meetingId> + <meetingName>kk</meetingName> + <room-id>ma-e7684b5a</room-id> + </metadata> + <playback> + <format> + <type>presentation</type> + <url>https://demo.bigbluebutton.org/playback/presentation/2.0/playback.html?meetingId=81f4deea7881b1dc8df4016738e71b91e296346e-1504111142171</url> + <processingTime>20933</processingTime> + <length>4</length> + <preview> + <images> + <image width="176" height="136" alt="Welcome to">https://demo.bigbluebutton.org/presentation/81f4deea7881b1dc8df4016738e71b91e296346e-1504111142171/presentation/d2d9a672040fbde2a47a10bf6c37b6a4b5ae187f-1504111142183/thumbnails/thumb-1.png</image> + <image width="176" height="136" alt="(this slide left blank for use as a whiteboard)">https://demo.bigbluebutton.org/presentation/81f4deea7881b1dc8df4016738e71b91e296346e-1504111142171/presentation/d2d9a672040fbde2a47a10bf6c37b6a4b5ae187f-1504111142183/thumbnails/thumb-2.png</image> + <image width="176" height="136" alt="(this slide left blank for use as a whiteboard)">https://demo.bigbluebutton.org/presentation/81f4deea7881b1dc8df4016738e71b91e296346e-1504111142171/presentation/d2d9a672040fbde2a47a10bf6c37b6a4b5ae187f-1504111142183/thumbnails/thumb-3.png</image> + </images> + </preview> + </format> + </playback> + </recording> + <recording> + <recordID>6d380f36aa632afbdc0bf1334e6c5100b24c8b3a-1503352241858</recordID> + <meetingID>cc1a7a1d7c9c073a051f42de1ee541133a7e418b</meetingID> + <internalMeetingID>6d380f36aa632afbdc0bf1334e6c5100b24c8b3a-1503352241858</internalMeetingID> + <name>test</name> + <isBreakout>false</isBreakout> + <published>true</published> + <state>published</state> + <startTime>1503352241858</startTime> + <endTime>1503352273297</endTime> + <participants>1</participants> + <metadata> + <gl-listed>false</gl-listed> + <gl-token>ff-23292c3b-test</gl-token> + <gl-webhooks-callback-url>https://test20.bigbluebutton.org/b/rooms/ff-23292c3b/test/callback</gl-webhooks-callback-url> + <isBreakout>false</isBreakout> + <meeting-name>test</meeting-name> + <meetingId>cc1a7a1d7c9c073a051f42de1ee541133a7e418b</meetingId> + <meetingName>test</meetingName> + <room-id>ff-23292c3b</room-id> + </metadata> + <playback> + <format> + <type>presentation</type> + <url>https://demo.bigbluebutton.org/playback/presentation/2.0/playback.html?meetingId=6d380f36aa632afbdc0bf1334e6c5100b24c8b3a-1503352241858</url> + <processingTime>11990</processingTime> + <length>0</length> + <preview> + <images> + <image width="176" height="136" alt="Welcome to">https://test20.bigbluebutton.org/presentation/6d380f36aa632afbdc0bf1334e6c5100b24c8b3a-1503352241858/presentation/d2d9a672040fbde2a47a10bf6c37b6a4b5ae187f-1503352243680/thumbnails/thumb-1.png</image> + <image width="176" height="136" alt="(this slide left blank for use as a whiteboard)">https://test20.bigbluebutton.org/presentation/6d380f36aa632afbdc0bf1334e6c5100b24c8b3a-1503352241858/presentation/d2d9a672040fbde2a47a10bf6c37b6a4b5ae187f-1503352243680/thumbnails/thumb-2.png</image> + <image width="176" height="136" alt="(this slide left blank for use as a whiteboard)">https://test20.bigbluebutton.org/presentation/6d380f36aa632afbdc0bf1334e6c5100b24c8b3a-1503352241858/presentation/d2d9a672040fbde2a47a10bf6c37b6a4b5ae187f-1503352243680/thumbnails/thumb-3.png</image> + </images> + </preview> + </format> + </playback> + </recording> + <recording> + <recordID>b27af2f930d418879550e09c7548d1cdd0be25cf-1504122114653</recordID> + <meetingID>5bd0e35013bc9761d06f01d4bfd9b4ae1c8df289</meetingID> + <internalMeetingID>b27af2f930d418879550e09c7548d1cdd0be25cf-1504122114653</internalMeetingID> + <name>Prueba 2</name> + <isBreakout>false</isBreakout> + <published>true</published> + <state>published</state> + <startTime>1504122114653</startTime> + <endTime>1504122278594</endTime> + <participants>2</participants> + <metadata> + <gl-listed>false</gl-listed> + <gl-token>vi-249c619c-Prueba 2</gl-token> + <gl-webhooks-callback-url>https://demo.bigbluebutton.org/b/rooms/vi-249c619c/Prueba%202/callback</gl-webhooks-callback-url> + <isBreakout>false</isBreakout> + <meeting-name>Prueba 2</meeting-name> + <meetingId>5bd0e35013bc9761d06f01d4bfd9b4ae1c8df289</meetingId> + <meetingName>Prueba 2</meetingName> + <room-id>vi-249c619c</room-id> + </metadata> + <playback> + <format> + <type>presentation</type> + <url>https://demo.bigbluebutton.org/playback/presentation/2.0/playback.html?meetingId=b27af2f930d418879550e09c7548d1cdd0be25cf-1504122114653</url> + <processingTime>14123</processingTime> + <length>2</length> + <preview> + <images> + <image width="176" height="136" alt="Welcome to">https://demo.bigbluebutton.org/presentation/b27af2f930d418879550e09c7548d1cdd0be25cf-1504122114653/presentation/d2d9a672040fbde2a47a10bf6c37b6a4b5ae187f-1504122114668/thumbnails/thumb-1.png</image> + <image width="176" height="136" alt="(this slide left blank for use as a whiteboard)">https://demo.bigbluebutton.org/presentation/b27af2f930d418879550e09c7548d1cdd0be25cf-1504122114653/presentation/d2d9a672040fbde2a47a10bf6c37b6a4b5ae187f-1504122114668/thumbnails/thumb-2.png</image> + <image width="176" height="136" alt="(this slide left blank for use as a whiteboard)">https://demo.bigbluebutton.org/presentation/b27af2f930d418879550e09c7548d1cdd0be25cf-1504122114653/presentation/d2d9a672040fbde2a47a10bf6c37b6a4b5ae187f-1504122114668/thumbnails/thumb-3.png</image> + </images> + </preview> + </format> + </playback> + </recording> + <recording> + <recordID>6e35e3b2778883f5db637d7a5dba0a427f692e91-1504093384390</recordID> + <meetingID>English 101</meetingID> + <internalMeetingID>6e35e3b2778883f5db637d7a5dba0a427f692e91-1504093384390</internalMeetingID> + <name>English 101</name> + <isBreakout>false</isBreakout> + <published>true</published> + <state>published</state> + <startTime>1504093384390</startTime> + <endTime>1504093447265</endTime> + <participants>1</participants> + <metadata> + <description>test</description> + <email>Antonio</email> + <isBreakout>false</isBreakout> + <meetingId>English 101</meetingId> + <meetingName>English 101</meetingName> + <title>English 101</title> + </metadata> + <playback> + <format> + <type>presentation</type> + <url>https://demo.bigbluebutton.org/playback/presentation/2.0/playback.html?meetingId=6e35e3b2778883f5db637d7a5dba0a427f692e91-1504093384390</url> + <processingTime>8584</processingTime> + <length>0</length> + <preview> + <images> + <image width="176" height="136" alt="Welcome to">https://demo.bigbluebutton.org/presentation/6e35e3b2778883f5db637d7a5dba0a427f692e91-1504093384390/presentation/d2d9a672040fbde2a47a10bf6c37b6a4b5ae187f-1504093384402/thumbnails/thumb-1.png</image> + <image width="176" height="136" alt="(this slide left blank for use as a whiteboard)">https://demo.bigbluebutton.org/presentation/6e35e3b2778883f5db637d7a5dba0a427f692e91-1504093384390/presentation/d2d9a672040fbde2a47a10bf6c37b6a4b5ae187f-1504093384402/thumbnails/thumb-2.png</image> + <image width="176" height="136" alt="(this slide left blank for use as a whiteboard)">https://demo.bigbluebutton.org/presentation/6e35e3b2778883f5db637d7a5dba0a427f692e91-1504093384390/presentation/d2d9a672040fbde2a47a10bf6c37b6a4b5ae187f-1504093384402/thumbnails/thumb-3.png</image> + </images> + </preview> + </format> + </playback> + </recording> + </recordings> +</response> \ No newline at end of file diff --git a/bbb-common-web/src/test/resources/sample-metadata.xml b/bbb-common-web/src/test/resources/sample-metadata.xml index 513f2d99f8835320ea2780f6929b2ff8519955cb..f8d87ae825cd3a86abc76bb0f1a904b531b9ee4c 100755 --- a/bbb-common-web/src/test/resources/sample-metadata.xml +++ b/bbb-common-web/src/test/resources/sample-metadata.xml @@ -17,6 +17,7 @@ <meetingId>5bd0e35013bc9761d06f01d4bfd9b4ae1c8df289</meetingId> <gl-listed>false</gl-listed> </meta> + <breakout parentMeetingId="f3ffe06acedf425565cc024c8ebe89a6552e8782-1489172964374" sequence="2" meetingId="f2041d123b6a4b994e7ad87ee9d348496a73472c-1489173065780"/> <breakoutRooms> <breakoutRoom>32ee8bcccfad34f85c58a12f87fc4268130a4fd3-1489173065780</breakoutRoom> <breakoutRoom>721d83a3907548734d4a505992ebb94ec1454a91-1489173065780</breakoutRoom> diff --git a/bbb-common-web/src/test/scala/org/bigbluebutton/api2/util/RecMetaXmlHelperTests.scala b/bbb-common-web/src/test/scala/org/bigbluebutton/api2/util/RecMetaXmlHelperTests.scala index 4e5f425efa91df4189d5a86ccc146ec1e471882e..991e650024569d8729c933de3c089b11e2b82c64 100755 --- a/bbb-common-web/src/test/scala/org/bigbluebutton/api2/util/RecMetaXmlHelperTests.scala +++ b/bbb-common-web/src/test/scala/org/bigbluebutton/api2/util/RecMetaXmlHelperTests.scala @@ -25,7 +25,47 @@ class RecMetaXmlHelperTests extends UnitSpec { } } + it should "get meeting element" in { + val xml = RecMetaXmlHelper.loadMetadataXml(metaFile) + xml match { + case Some(metaXml) => + RecMetaXmlHelper.getMeeting(metaXml) match { + case Some(meeting) => + assert(meeting.id == "b27af2f930d418879550e09c7548d1cdd0be25cf-1504122319984") + assert(meeting.breakout == false) + case None => fail("Failed to get meeting element.") + } + + case None => fail("Failed to load metadata.xml") + } + } + + it should "get playback element" in { + val xml = RecMetaXmlHelper.loadMetadataXml(metaFile) + xml match { + case Some(metaXml) => + RecMetaXmlHelper.getPlayback(metaXml) match { + case Some(playback) => + assert(playback.size == 531235) + assert(playback.extensions.isDefined) + case None => fail("Failed to get playback element.") + } + + case None => fail("Failed to load metadata.xml") + } + } + it should "get extensions" in { - val xml = + val xml = RecMetaXmlHelper.loadMetadataXml(metaFile) + xml match { + case Some(metaXml) => + RecMetaXmlHelper.getMeta(metaXml) match { + case Some(meta) => + assert(meta.size == 8) + case None => fail("Failed to get extensions element.") + } + + case None => fail("Failed to load metadata.xml") + } } }