Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package galene for openSUSE:Factory checked in at 2022-12-20 20:20:58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/galene (Old) and /work/SRC/openSUSE:Factory/.galene.new.1835 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "galene" Tue Dec 20 20:20:58 2022 rev:22 rq:1043878 version:0.6.1 Changes: -------- --- /work/SRC/openSUSE:Factory/galene/galene.changes 2022-09-11 21:57:24.893639153 +0200 +++ /work/SRC/openSUSE:Factory/.galene.new.1835/galene.changes 2022-12-20 20:21:41.202272707 +0100 @@ -1,0 +2,11 @@ +Fri Oct 07 15:01:30 UTC 2022 - [email protected] + +- Update to version 0.6.1: + * Add a camera/microphone indicator in the users list, and hide + audio-only peers by default. They can be reenabled in the side menu. + * Ensure that autolocked groups are locked on creation. Thanks to + Michael Ströder. + * Don't send chat history multiple times. Thanks to Rémy Nollet. + * Fix status display for remote (redirected) groups. + +------------------------------------------------------------------- Old: ---- galene-0.6.tar.gz New: ---- galene-0.6.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ galene.spec ++++++ --- /var/tmp/diff_new_pack.tOTD3R/_old 2022-12-20 20:21:41.790275929 +0100 +++ /var/tmp/diff_new_pack.tOTD3R/_new 2022-12-20 20:21:41.794275951 +0100 @@ -25,7 +25,7 @@ %bcond_without apparmor Name: galene -Version: 0.6 +Version: 0.6.1 Release: 0 Summary: Galène videoconferencing server License: MIT ++++++ _service ++++++ --- /var/tmp/diff_new_pack.tOTD3R/_old 2022-12-20 20:21:41.846276236 +0100 +++ /var/tmp/diff_new_pack.tOTD3R/_new 2022-12-20 20:21:41.850276258 +0100 @@ -3,8 +3,8 @@ <param name="url">https://github.com/jech/galene.git</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">galene-0.6</param> - <param name="version">0.6</param> + <param name="revision">galene-0.6.1</param> + <param name="version">0.6.1</param> <param name="changesgenerate">enable</param> <!--param name="versionrewrite-pattern">galene-(\d+)</param> <param name="versionrewrite-replacement">\1</param--> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.tOTD3R/_old 2022-12-20 20:21:41.878276411 +0100 +++ /var/tmp/diff_new_pack.tOTD3R/_new 2022-12-20 20:21:41.882276434 +0100 @@ -3,6 +3,6 @@ <param name="url">git://github.com/jech/galene.git</param> <param name="changesrevision">ba75bfeb3acd33f92084fa0eb88be9aee824badf</param></service><service name="tar_scm"> <param name="url">https://github.com/jech/galene.git</param> - <param name="changesrevision">c67a9307dae3bfce9c910c8cd35f3c916c70aaed</param></service></servicedata> + <param name="changesrevision">6e7a5f8cc615fece358066207546170b4bc890aa</param></service></servicedata> (No newline at EOF) ++++++ galene-0.6.tar.gz -> galene-0.6.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/galene-0.6/CHANGES new/galene-0.6.1/CHANGES --- old/galene-0.6/CHANGES 2022-09-10 14:27:58.000000000 +0200 +++ new/galene-0.6.1/CHANGES 2022-10-07 14:38:49.000000000 +0200 @@ -1,3 +1,12 @@ +7 October 2022: Galene 0.6.1 + + * Add a camera/microphone indicator in the users list, and hide + audio-only peers by default. They can be reenabled in the side menu. + * Ensure that autolocked groups are locked on creation. Thanks to + Michael Ströder. + * Don't send chat history multiple times. Thanks to Rémy Nollet. + * Fix status display for remote (redirected) groups. + 10 September 2022: Galene 0.6 * Version the protocol: the handshake message now contains a version diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/galene-0.6/INSTALL new/galene-0.6.1/INSTALL --- old/galene-0.6/INSTALL 2022-09-10 14:27:58.000000000 +0200 +++ new/galene-0.6.1/INSTALL 2022-10-07 14:38:49.000000000 +0200 @@ -2,7 +2,7 @@ ## Build the `galene` binary -You will need Go 1.13 or later (type `go version`). Then do: +You will need Go 1.16 or later (type `go version`). Then do: CGO_ENABLED=0 go build -ldflags='-s -w' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/galene-0.6/group/group.go new/galene-0.6.1/group/group.go --- old/galene-0.6/group/group.go 2022-09-10 14:27:58.000000000 +0200 +++ new/galene-0.6.1/group/group.go 2022-10-07 14:38:49.000000000 +0200 @@ -433,20 +433,18 @@ timestamp: time.Now(), } groups.groups[name] = g - return g, nil, nil } g.mu.Lock() defer g.mu.Unlock() + notify := false if desc != nil { - if descriptionMatch(g.description, desc) { - return g, nil, nil + if !descriptionMatch(g.description, desc) { + g.description = desc + notify = true } - g.description = desc - } else if descriptionUnchanged(name, g.description) { - return g, nil, nil - } else { + } else if !descriptionUnchanged(name, g.description) { desc, err = readDescription(name) if err != nil { if !os.IsNotExist(err) { @@ -456,11 +454,15 @@ return nil, nil, err } g.description = desc + notify = true } - clients := g.getClientsUnlocked(nil) - autoLockKick(g, clients) + autoLockKick(g) + var clients []Client + if notify { + clients = g.getClientsUnlocked(nil) + } return g, clients, nil } @@ -629,11 +631,13 @@ } // called locked -func autoLockKick(g *Group, clients []Client) { +func autoLockKick(g *Group) { if !(g.description.Autolock && g.locked == nil) && !g.description.Autokick { return } + + clients := g.getClientsUnlocked(nil) for _, c := range clients { if member("op", c.Permissions()) { return @@ -642,11 +646,9 @@ if g.description.Autolock && g.locked == nil { m := "this group is locked" g.locked = &m - go func(clients []Client) { - for _, c := range clients { - c.Joined(g.Name(), "change") - } - }(g.getClientsUnlocked(nil)) + for _, c := range clients { + c.Joined(g.Name(), "change") + } } if g.description.Autokick { @@ -676,7 +678,7 @@ g.Name(), "delete", c.Id(), "", nil, nil, ) } - autoLockKick(g, clients) + autoLockKick(g) } func (g *Group) GetClients(except Client) []Client { @@ -1185,8 +1187,9 @@ type Status struct { Name string `json:"name"` - Location string `json:"location"` - Endpoint string `json:"endpoint"` + Redirect string `json:"redirect,omitempty"` + Location string `json:"location,omitempty"` + Endpoint string `json:"endpoint,omitempty"` DisplayName string `json:"displayName,omitempty"` Description string `json:"description,omitempty"` AuthServer string `json:"authServer,omitempty"` @@ -1201,6 +1204,15 @@ func (g *Group) Status(authentified bool, base string) Status { desc := g.Description() + if desc.Redirect != "" { + return Status{ + Name: g.name, + Redirect: desc.Redirect, + DisplayName: desc.DisplayName, + Description: desc.Description, + } + } + var location, endpoint string if base != "" { burl, err := url.Parse(base) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/galene-0.6/rtpconn/webclient.go new/galene-0.6.1/rtpconn/webclient.go --- old/galene-0.6/rtpconn/webclient.go 2022-09-10 14:27:58.000000000 +0200 +++ new/galene-0.6.1/rtpconn/webclient.go 2022-10-07 14:38:49.000000000 +0200 @@ -1168,8 +1168,9 @@ case joinedAction: var status *group.Status var data map[string]interface{} + var g *group.Group if a.group != "" { - g := group.Get(a.group) + g = group.Get(a.group) if g != nil { s := g.Status(true, "") status = &s @@ -1190,18 +1191,25 @@ if err != nil { return err } - h := c.group.GetChatHistory() - for _, m := range h { - err := c.write(clientMessage{ - Type: "chathistory", - Source: m.Id, - Username: m.User, - Time: m.Time, - Value: m.Value, - Kind: m.Kind, - }) - if err != nil { - return err + if a.kind == "join" { + if g == nil { + log.Println("g is null when joining" + + "this shouldn't happen") + return nil + } + h := g.GetChatHistory() + for _, m := range h { + err := c.write(clientMessage{ + Type: "chathistory", + Source: m.Id, + Username: m.User, + Time: m.Time, + Value: m.Value, + Kind: m.Kind, + }) + if err != nil { + return err + } } } case permissionsChangedAction: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/galene-0.6/static/galene.css new/galene-0.6.1/static/galene.css --- old/galene-0.6/static/galene.css 2022-09-10 14:27:58.000000000 +0200 +++ new/galene-0.6.1/static/galene.css 2022-10-07 14:38:49.000000000 +0200 @@ -905,6 +905,10 @@ border: 2px solid #610a86; } +.peer-hidden { + display: none; +} + .media { width: 100%; max-height: calc(var(--vh, 1vh) * 100 - 76px); @@ -1156,6 +1160,22 @@ content: "\f256"; } +#users > div::after { + font-family: 'Font Awesome 6 Free'; + color: #808080; + margin-left: 5px; + font-weight: 900; + float: right; +} + +#users > div.user-status-microphone::after { + content: "\f130"; +} + +#users > div.user-status-camera::after { + content: "\f030"; +} + .close-icon { font: normal 1em/1 Arial, sans-serif; display: inline-block; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/galene-0.6/static/galene.html new/galene-0.6.1/static/galene.html --- old/galene-0.6/static/galene.html 2022-09-10 14:27:58.000000000 +0200 +++ new/galene-0.6.1/static/galene.html 2022-10-07 14:38:49.000000000 +0200 @@ -242,6 +242,10 @@ <label for="activitybox">Activity detection</label> </form> + <form> + <input id="displayallbox" type="checkbox"/> + <label for="displayallbox">Display audio-only users</label> + </form> </fieldset> </div> </div> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/galene-0.6/static/galene.js new/galene-0.6.1/static/galene.js --- old/galene-0.6/static/galene.js 2022-09-10 14:27:58.000000000 +0200 +++ new/galene-0.6.1/static/galene.js 2022-10-07 14:38:49.000000000 +0200 @@ -41,6 +41,7 @@ * @property {string} [send] * @property {string} [request] * @property {boolean} [activityDetection] + * @property {boolean} [displayAll] * @property {Array.<number>} [resolution] * @property {boolean} [mirrorView] * @property {boolean} [blackboardMode] @@ -219,6 +220,13 @@ store = true; } + if(settings.hasOwnProperty('displayAll')) { + getInputElement('displayallbox').checked = settings.displayAll; + } else { + settings.displayAll = getInputElement('displayallbox').checked; + store = true; + } + if(settings.hasOwnProperty('preprocessing')) { getInputElement('preprocessingbox').checked = settings.preprocessing; } else { @@ -367,7 +375,7 @@ displayError(e); }; c.ondowntrack = function(track, transceiver, label, stream) { - setMedia(c, false); + setMedia(c); }; c.onnegotiationcompleted = function() { resetMedia(c); @@ -379,7 +387,7 @@ if(getSettings().activityDetection) c.setStatsInterval(activityDetectionInterval); - setMedia(c, false); + setMedia(c); } // Store current browser viewport height in css variable @@ -659,6 +667,18 @@ } }; +getInputElement('displayallbox').onchange = function(e) { + if(!(this instanceof HTMLInputElement)) + throw new Error('Unexpected type for this'); + updateSettings({displayAll: this.checked}); + for(let id in serverConnection.down) { + let c = serverConnection.down[id]; + let elt = document.getElementById('peer-' + c.localId); + showHideMedia(c, elt); + } +}; + + /** * @this {Stream} * @param {Object<string,any>} stats @@ -1311,7 +1331,7 @@ let media = /** @type{HTMLVideoElement} */ (document.getElementById('media-' + c.localId)); setUpStream(cn, c.stream); - await setMedia(cn, true, + await setMedia(cn, cn.label == 'camera' && getSettings().mirrorView, cn.label == 'video' && media); return cn; @@ -1411,7 +1431,7 @@ } setUpStream(c, stream); - await setMedia(c, true, settings.mirrorView); + await setMedia(c, settings.mirrorView); setButtonsVisibility(); } @@ -1450,7 +1470,7 @@ let c = newUpStream(); c.label = 'screenshare'; setUpStream(c, stream); - await setMedia(c, true); + await setMedia(c); setButtonsVisibility(); } @@ -1495,7 +1515,7 @@ displayWarning('You have been muted'); } - await setMedia(c, true, false, video); + await setMedia(c, false, video); c.userdata.play = true; setButtonsVisibility(); } @@ -1671,25 +1691,24 @@ * setMedia adds a new media element corresponding to stream c. * * @param {Stream} c - * @param {boolean} isUp - * - indicates whether the stream goes in the up direction * @param {boolean} [mirror] * - whether to mirror the video * @param {HTMLVideoElement} [video] * - the video element to add. If null, a new element with custom * controls will be created. */ -async function setMedia(c, isUp, mirror, video) { - let peersdiv = document.getElementById('peers'); - +async function setMedia(c, mirror, video) { let div = document.getElementById('peer-' + c.localId); if(!div) { div = document.createElement('div'); div.id = 'peer-' + c.localId; div.classList.add('peer'); + let peersdiv = document.getElementById('peers'); peersdiv.appendChild(div); } + showHideMedia(c, div) + let media = /** @type {HTMLVideoElement} */ (document.getElementById('media-' + c.localId)); if(!media) { @@ -1697,7 +1716,7 @@ media = video; } else { media = document.createElement('video'); - if(isUp) + if(c.up) media.muted = true; } @@ -1717,7 +1736,7 @@ if(!video && media.srcObject !== c.stream) media.srcObject = c.stream; - if(!isUp) { + if(!c.up) { media.onfullscreenchange = function(e) { forceDownRate(c.id, document.fullscreenElement === media, false); } @@ -1737,7 +1756,7 @@ showVideo(); resizePeers(); - if(!isUp && isSafari() && !findUpMedia('camera')) { + if(!c.up && isSafari() && !findUpMedia('camera')) { // Safari doesn't allow autoplay unless the user has granted media access try { let stream = await navigator.mediaDevices.getUserMedia({audio: true}); @@ -1747,6 +1766,29 @@ } } + +/** + * @param {Stream} c + * @param {HTMLElement} elt + */ +function showHideMedia(c, elt) { + let display = c.up || getSettings().displayAll; + if(!display && c.stream) { + let tracks = c.stream.getTracks(); + for(let i = 0; i < tracks.length; i++) { + let t = tracks[i]; + if(t.kind === 'video') { + display = true; + break; + } + } + } + if(display) + elt.classList.remove('peer-hidden'); + else + elt.classList.add('peer-hidden'); +} + /** * resetMedia resets the source stream of the media element associated * with c. This has the side-effect of resetting any frozen frames. @@ -2174,6 +2216,26 @@ elt.classList.add('user-status-raisehand'); else elt.classList.remove('user-status-raisehand'); + + let microphone=false, camera = false; + for(let label in userinfo.streams) { + for(let kind in userinfo.streams[label]) { + if(kind == 'audio') + microphone = true; + else + camera = true; + } + } + if(camera) { + elt.classList.remove('user-status-microphone'); + elt.classList.add('user-status-camera'); + } else if(microphone) { + elt.classList.add('user-status-microphone'); + elt.classList.remove('user-status-camera'); + } else { + elt.classList.remove('user-status-microphone'); + elt.classList.remove('user-status-camera'); + } } /** diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/galene-0.6/static/mainpage.js new/galene-0.6.1/static/mainpage.js --- old/galene-0.6/static/mainpage.js 2022-09-10 14:27:58.000000000 +0200 +++ new/galene-0.6.1/static/mainpage.js 2022-10-07 14:38:49.000000000 +0200 @@ -30,12 +30,13 @@ if(group === '') return; let url = '/group/' + group + '/'; + let statusUrl = url + '.status.json'; try { groupinput.disabled = true; button.disabled = true; try { - let resp = await fetch(url, { + let resp = await fetch(statusUrl, { method: 'HEAD', }); if(!resp.ok) { @@ -46,7 +47,7 @@ return; } } catch(e) { - displayError(`Coudln't connect: ${e.toString()}`); + displayError(`Couldn't connect: ${e.toString()}`); return; } } finally { @@ -118,8 +119,12 @@ td2.textContent = group.description; tr.appendChild(td2); let td3 = document.createElement('td'); - let locked = group.locked ? ', locked' : ''; - td3.textContent = `(${group.clientCount} clients${locked})`; + if(!group.redirect) { + let locked = group.locked ? ', locked' : ''; + td3.textContent = `(${group.clientCount} clients${locked})`; + } else { + td3.textContent = '(remote)'; + } tr.appendChild(td3); table.appendChild(tr); } ++++++ vendor.tar.gz ++++++
