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 ++++++

Reply via email to