Bug 391545 - XF86AudioPlay no longer resumes play on spotify
Summary: XF86AudioPlay no longer resumes play on spotify
Status: RESOLVED UPSTREAM
Alias: None
Product: plasmashell
Classification: Plasma
Component: Media Player (show other bugs)
Version: 5.12.3
Platform: Other Linux
: NOR normal
Target Milestone: 1.0
Assignee: Friedrich W. H. Kossebau
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2018-03-07 21:06 UTC by Danny Auble
Modified: 2018-03-13 17:55 UTC (History)
3 users (show)

See Also:
Latest Commit:
Version Fixed In:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Danny Auble 2018-03-07 21:06:48 UTC
After upgrading to KDE 5.12.3 I find my play key on my keyboard no longer resumes play on spotify any more.  It does pause still, just doesn't resume play.

I have tested on amarok and both pause and play work as expected.  It appear the problem is only with spotify from my testing.

This used to work fine before the upgrade.

Sorry if this is the wrong product.  It wasn't clear what the Media Player widget controlling the play/pause button was under.
Comment 1 Friedrich W. H. Kossebau 2018-03-13 14:13:35 UTC
Hi, thanks for the report & sorry for having caused trouble for you by getting slightly more strict about MPRIS usage.

By your report I for now suspect this might be a bug with Spotify's (or some wrapper to it? no clue about spotify code) implementation of the MPRIS spec. I do not have/use spotify myself, so cannot test.

This is what you can do to help with this problem: 
On the commandline when spotify is running you can inspect its MPRIS properties. Please tell what you get as results when spotify is not reacting as expected.

# Find the D-Bus MPRIS service name of spotify
# Should return something like "org.mpris.MediaPlayer2.spotify"
qdbus | grep org.mpris.MediaPlayer2

# Assuming the name is "org.mpris.MediaPlayer2.spotify" (adapt if needed)
# now check the states of the properties "CanPlay" & "CanPause"
# (each qdbus call can also be done in one line, using multiline with \
# just because of this input field)
qdbus org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 \
    org.freedesktop.DBus.Properties.Get org.mpris.MediaPlayer2.Player CanPlay
qdbus org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 \
    org.freedesktop.DBus.Properties.Get org.mpris.MediaPlayer2.Player CanPause


The property query results ("true" or "false") should match what the MPRIS spec requires for them giving the current state the spotify app is in. See https://specifications.freedesktop.org/mpris-spec/latest/Player_Interface.html#Property:CanPlay . Especially important in the spec is this bit:
"Note that this is related to whether there is a "current track": the value should not depend on whether the track is currently paused or playing. In fact, if a track is currently playing (and CanControl is true), this should be true."

Chance is that this is not matched given your description. But for now just my assumption.
Comment 2 Danny Auble 2018-03-13 15:19:15 UTC
Friedrich, thanks for the help!

qdbus | grep org.mpris.MediaPlayer2
 org.mpris.MediaPlayer2.spotify

qdbus org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get org.mpris.MediaPlayer2.Player CanPlay
true
qdbus org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get org.mpris.MediaPlayer2.Player CanPause
true

At this point it seems to be correct

Note even stranger, I have set up another hotkey to expressly call

dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlayPause

and that works just fine for both play and pause.

I have tried uninstalling and reinstalling spotify as well and that didn't change the behavior.  This just started with the update.

I also tried on a different machine and functionality seems to be correct there, so this must be some sort of configuration issue.  I have tried with a completely new user on the bad system with the same bad results so the issue seems to be system wide.  I suppose I could reinstall everything from fresh, but I would rather avoid doing that.

At the moment I can still use the extra hotkey to do the play/pausing, but love the MediaPlayer interface when switching players (as I use Amarok very often as well).

Thanks again for your help!
Comment 3 Danny Auble 2018-03-13 15:24:45 UTC
For further reference

qdbus org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2     org.freedesktop.DBus.Properties.GetAll org.mpris.MediaPlayer2.Player
CanControl: true
CanGoNext: true
CanGoPrevious: true
CanPause: true
CanPlay: true
CanSeek: true
LoopStatus: Playlist
MaximumRate: 1
Metadata: mpris:artUrl: http://open.spotify.com/thumb/0fd555d08a265b1c364044a4118cf6e1ea700f67
mpris:length: 323000000
mpris:trackid: spotify:track:6Oy2qpuumdnPo44ZpmxSY7
xesam:album: Liberty
xesam:artist: Duran Duran
xesam:autoRating: 0.16
xesam:contentCreated: 1990-01-01T00:00:00
xesam:discNumber: 1
xesam:title: Downtown
xesam:trackNumber: 11
xesam:url: spotify:track:6Oy2qpuumdnPo44ZpmxSY7
MinimumRate: 1
PlaybackStatus: Paused
Position: 0
Rate: 1
Shuffle: false
Volume: 0
Comment 4 Danny Auble 2018-03-13 15:31:45 UTC
If I attach dbus-monitor to it I get

dbus-monitor "sender='org.mpris.MediaPlayer2.spotify'"

When I hit play/pause

method return time=1520955006.105602 sender=:1.40 -> destination=:1.19 serial=1108 reply_serial=1360
   variant       boolean true
method return time=1520955006.105816 sender=:1.40 -> destination=:1.19 serial=1109 reply_serial=1361
   variant       string "Playing"
method return time=1520955006.106052 sender=:1.40 -> destination=:1.19 serial=1110 reply_serial=1362
   variant       boolean true
signal time=1520955006.109423 sender=:1.40 -> destination=(null destination) serial=1111 path=/StatusNotifierItem; interface=org.kde.StatusNotifierItem; member=NewStatus
   string "Passive"
signal time=1520955006.109442 sender=:1.40 -> destination=(null destination) serial=1112 path=/StatusNotifierItem; interface=org.kde.StatusNotifierItem; member=NewStatus
   string "Active"
signal time=1520955006.109452 sender=:1.40 -> destination=(null destination) serial=1113 path=/StatusNotifierItem; interface=org.kde.StatusNotifierItem; member=NewToolTip
method return time=1520955006.111189 sender=:1.40 -> destination=:1.19 serial=1114 reply_serial=1363
signal time=1520955006.111576 sender=:1.40 -> destination=(null destination) serial=1115 path=/org/mpris/MediaPlayer2; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
   string "org.mpris.MediaPlayer2.Player"
   array [
      dict entry(
         string "PlaybackStatus"
         variant             string "Paused"
      )
   ]
   array [
   ]
signal time=1520955006.111671 sender=:1.40 -> destination=(null destination) serial=1116 path=/StatusNotifierItem/menu; interface=com.canonical.dbusmenu; member=LayoutUpdated
   uint32 14
   int32 0
method return time=1520955006.111899 sender=:1.40 -> destination=:1.19 serial=1117 reply_serial=1364
   variant       int64 0
method return time=1520955006.114116 sender=:1.40 -> destination=:1.19 serial=1118 reply_serial=1365
   uint32 14
   struct {
      int32 0
      array [
         dict entry(
            string "children-display"
            variant                string "submenu"
         )
      ]
      array [
         variant             struct {
               int32 1
               array [
                  dict entry(
                     string "enabled"
                     variant                         boolean false
                  )
                  dict entry(
                     string "label"
                     variant                         string "Duran Duran â Ordinary World"
                  )
               ]
               array [
               ]
            }
         variant             struct {
               int32 2
               array [
                  dict entry(
                     string "type"
                     variant                         string "separator"
                  )
               ]
               array [
               ]
            }
         variant             struct {
               int32 3
               array [
                  dict entry(
                     string "label"
                     variant                         string "Open Spotify"
                  )
               ]
               array [
               ]
            }
         variant             struct {
               int32 4
               array [
                  dict entry(
                     string "type"
                     variant                         string "separator"
                  )
               ]
               array [
               ]
            }
         variant             struct {
               int32 5
               array [
                  dict entry(
                     string "label"
                     variant                         string "Play"
                  )
               ]
               array [
               ]
            }
         variant             struct {
               int32 6
               array [
                  dict entry(
                     string "type"
                     variant                         string "separator"
                  )
               ]
               array [
               ]
            }
         variant             struct {
               int32 7
               array [
                  dict entry(
                     string "label"
                     variant                         string "Next"
                  )
               ]
               array [
               ]
            }
         variant             struct {
               int32 8
               array [
                  dict entry(
                     string "label"
                     variant                         string "Previous"
                  )
               ]
               array [
               ]
            }
         variant             struct {
               int32 9
               array [
                  dict entry(
                     string "type"
                     variant                         string "separator"
                  )
               ]
               array [
               ]
            }
         variant             struct {
               int32 10
               array [
                  dict entry(
                     string "label"
                     variant                         string "Shuffle"
                  )
               ]
               array [
               ]
            }
         variant             struct {
               int32 11
               array [
                  dict entry(
                     string "label"
                     variant                         string "Repeat"
                  )
               ]
               array [
               ]
            }
         variant             struct {
               int32 12
               array [
                  dict entry(
                     string "type"
                     variant                         string "separator"
                  )
               ]
               array [
               ]
            }
         variant             struct {
               int32 13
               array [
                  dict entry(
                     string "label"
                     variant                         string "Exit"
                  )
               ]
               array [
               ]
            }
      ]
   }
method return time=1520955006.123956 sender=:1.40 -> destination=:1.19 serial=1119 reply_serial=1366
   array [
      dict entry(
         string "AttentionIconName"
         variant             string ""
      )
      dict entry(
         string "AttentionIconPixmap"
         variant             array [
            ]
      )
      dict entry(
         string "AttentionMovieName"
         variant             string ""
      )
      dict entry(
         string "Category"
         variant             string "ApplicationStatus"
      )
      dict entry(
         string "IconName"
         variant             string "spotify_9412_fd48efb25a68b4b9d05cbe144830d1e9"
      )
      dict entry(
         string "IconPixmap"
         variant             array [
            ]
      )
      dict entry(
         string "IconThemePath"
         variant             string "/tmp/sni-qt_spotify_9412-bDm7Oy/icons"
      )
      dict entry(
         string "Id"
         variant             string "spotify"
      )
      dict entry(
         string "ItemIsMenu"
         variant             boolean false
      )
      dict entry(
         string "Menu"
         variant             object path "/StatusNotifierItem/menu"
      )
      dict entry(
         string "OverlayIconName"
         variant             string ""
      )
      dict entry(
         string "OverlayIconPixmap"
         variant             array [
            ]
      )
      dict entry(
         string "Status"
         variant             string "Active"
      )
      dict entry(
         string "Title"
         variant             string "spotify"
      )
      dict entry(
         string "ToolTip"
         variant             struct {
               string "spotify_9412_fd48efb25a68b4b9d05cbe144830d1e9"
               array [
               ]
               string "Spotify"
               string ""
            }
      )
      dict entry(
         string "WindowId"
         variant             int32 0
      )
   ]


But then when I hit play/pause again

method return time=1520955057.838120 sender=:1.40 -> destination=:1.19 serial=1120 reply_serial=1371
   variant       boolean true
method return time=1520955057.838249 sender=:1.40 -> destination=:1.19 serial=1121 reply_serial=1372
   variant       string "Paused"
method return time=1520955057.838392 sender=:1.40 -> destination=:1.19 serial=1122 reply_serial=1373
   variant       boolean true
method return time=1520955057.838511 sender=:1.40 -> destination=:1.19 serial=1123 reply_serial=1374


If I hit my custom hotkey to play again I get

method return time=1520955079.886141 sender=:1.40 -> destination=:1.129 serial=1124 reply_serial=3
   string "<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
  <interface name="org.mpris.MediaPlayer2">
    <method name="Raise"/>
    <method name="Quit"/>
    <property access="read" type="b" name="CanQuit"/>
    <property access="read" type="b" name="CanRaise"/>
    <property access="read" type="b" name="HasTrackList"/>
    <property access="read" type="s" name="Identity"/>
    <property access="read" type="s" name="DesktopEntry"/>
    <property access="read" type="as" name="SupportedUriSchemes"/>
    <property access="read" type="as" name="SupportedMimeTypes"/>
  </interface>
  <interface name="org.mpris.MediaPlayer2.Player">
    <method name="Next"/>
    <method name="Previous"/>
    <method name="Pause"/>
    <method name="PlayPause"/>
    <method name="Stop"/>
    <method name="Play"/>
    <method name="Seek">
      <arg direction="in" type="x" name="Offset"/>
    </method>
    <method name="SetPosition">
      <arg direction="in" type="o" name="TrackId"/>
      <arg direction="in" type="x" name="Position"/>
    </method>
    <method name="OpenUri">
      <arg direction="in" type="s"/>
    </method>
    <!-- Signals -->
    <signal name="Seeked">
      <arg type="x" name="Position"/>
    </signal>
    <!-- Properties -->
    <property access="read" type="s" name="PlaybackStatus"/>
    <property access="readwrite" type="s" name="LoopStatus"/>
    <property access="readwrite" type="d" name="Rate"/>
    <property access="readwrite" type="b" name="Shuffle"/>
    <property access="read" type="a{sv}" name="Metadata">
      <annotation value="QVariantMap" name="com.trolltech.QtDBus.QtTypeName"/>
    </property>
    <property access="readwrite" type="d" name="Volume"/>
    <property access="read" type="x" name="Position"/>
    <property access="read" type="d" name="MinimumRate"/>
    <property access="read" type="d" name="MaximumRate"/>
    <property access="read" type="b" name="CanGoNext"/>
    <property access="read" type="b" name="CanGoPrevious"/>
    <property access="read" type="b" name="CanPlay"/>
    <property access="read" type="b" name="CanPause"/>
    <property access="read" type="b" name="CanSeek"/>
    <property access="read" type="b" name="CanControl"/>
  </interface>
  <interface name="org.freedesktop.DBus.Properties">
    <method name="Get">
      <arg name="interface_name" type="s" direction="in"/>
      <arg name="property_name" type="s" direction="in"/>
      <arg name="value" type="v" direction="out"/>
    </method>
    <method name="Set">
      <arg name="interface_name" type="s" direction="in"/>
      <arg name="property_name" type="s" direction="in"/>
      <arg name="value" type="v" direction="in"/>
    </method>
    <method name="GetAll">
      <arg name="interface_name" type="s" direction="in"/>
      <arg name="values" type="a{sv}" direction="out"/>
      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QVariantMap"/>
    </method>
  </interface>
  <interface name="org.freedesktop.DBus.Introspectable">
    <method name="Introspect">
      <arg name="xml_data" type="s" direction="out"/>
    </method>
  </interface>
  <interface name="org.freedesktop.DBus.Peer">
    <method name="Ping"/>
    <method name="GetMachineId">
      <arg name="machine_uuid" type="s" direction="out"/>
    </method>
  </interface>
</node>
"
signal time=1520955079.889369 sender=:1.40 -> destination=(null destination) serial=1125 path=/StatusNotifierItem; interface=org.kde.StatusNotifierItem; member=NewStatus
   string "Passive"
signal time=1520955079.889380 sender=:1.40 -> destination=(null destination) serial=1126 path=/StatusNotifierItem; interface=org.kde.StatusNotifierItem; member=NewStatus
   string "Active"
signal time=1520955079.889390 sender=:1.40 -> destination=(null destination) serial=1127 path=/StatusNotifierItem; interface=org.kde.StatusNotifierItem; member=NewToolTip
method return time=1520955079.900514 sender=:1.40 -> destination=:1.129 serial=1128 reply_serial=5
signal time=1520955079.901184 sender=:1.40 -> destination=(null destination) serial=1129 path=/org/mpris/MediaPlayer2; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
   string "org.mpris.MediaPlayer2.Player"
   array [
      dict entry(
         string "PlaybackStatus"
         variant             string "Playing"
      )
   ]
   array [
   ]
signal time=1520955079.901633 sender=:1.40 -> destination=(null destination) serial=1130 path=/StatusNotifierItem/menu; interface=com.canonical.dbusmenu; member=LayoutUpdated
   uint32 13
   int32 0
method return time=1520955079.905751 sender=:1.40 -> destination=:1.19 serial=1131 reply_serial=1376
   array [
      dict entry(
         string "AttentionIconName"
         variant             string ""
      )
      dict entry(
         string "AttentionIconPixmap"
         variant             array [
            ]
      )
      dict entry(
         string "AttentionMovieName"
         variant             string ""
      )
      dict entry(
         string "Category"
         variant             string "ApplicationStatus"
      )
      dict entry(
         string "IconName"
         variant             string "spotify_9412_fd48efb25a68b4b9d05cbe144830d1e9"
      )
      dict entry(
         string "IconPixmap"
         variant             array [
            ]
      )
      dict entry(
         string "IconThemePath"
         variant             string "/tmp/sni-qt_spotify_9412-bDm7Oy/icons"
      )
      dict entry(
         string "Id"
         variant             string "spotify"
      )
      dict entry(
         string "ItemIsMenu"
         variant             boolean false
      )
      dict entry(
         string "Menu"
         variant             object path "/StatusNotifierItem/menu"
      )
      dict entry(
         string "OverlayIconName"
         variant             string ""
      )
      dict entry(
         string "OverlayIconPixmap"
         variant             array [
            ]
      )
      dict entry(
         string "Status"
         variant             string "Active"
      )
      dict entry(
         string "Title"
         variant             string "spotify"
      )
      dict entry(
         string "ToolTip"
         variant             struct {
               string "spotify_9412_fd48efb25a68b4b9d05cbe144830d1e9"
               array [
               ]
               string "Spotify - Duran Duran – Ordinary World"
               string ""
            }
      )
      dict entry(
         string "WindowId"
         variant             int32 0
      )
   ]
method return time=1520955079.905933 sender=:1.40 -> destination=:1.19 serial=1132 reply_serial=1377
   variant       int64 0
method return time=1520955079.906225 sender=:1.40 -> destination=:1.19 serial=1133 reply_serial=1378
   uint32 13
   struct {
      int32 0
      array [
         dict entry(
            string "children-display"
            variant                string "submenu"
         )
      ]
      array [
         variant             struct {
               int32 1
               array [
                  dict entry(
                     string "enabled"
                     variant                         boolean false
                  )
                  dict entry(
                     string "label"
                     variant                         string "Duran Duran – Ordinary World"
                  )
               ]
               array [
               ]
            }
         variant             struct {
               int32 2
               array [
                  dict entry(
                     string "type"
                     variant                         string "separator"
                  )
               ]
               array [
               ]
            }
         variant             struct {
               int32 3
               array [
                  dict entry(
                     string "label"
                     variant                         string "Open Spotify"
                  )
               ]
               array [
               ]
            }
         variant             struct {
               int32 4
               array [
                  dict entry(
                     string "type"
                     variant                         string "separator"
                  )
               ]
               array [
               ]
            }
         variant             struct {
               int32 5
               array [
                  dict entry(
                     string "label"
                     variant                         string "Pause"
                  )
               ]
               array [
               ]
            }
         variant             struct {
               int32 6
               array [
                  dict entry(
                     string "label"
                     variant                         string "Next"
                  )
               ]
               array [
               ]
            }
         variant             struct {
               int32 7
               array [
                  dict entry(
                     string "label"
                     variant                         string "Previous"
                  )
               ]
               array [
               ]
            }
         variant             struct {
               int32 8
               array [
                  dict entry(
                     string "type"
                     variant                         string "separator"
                  )
               ]
               array [
               ]
            }
         variant             struct {
               int32 9
               array [
                  dict entry(
                     string "label"
                     variant                         string "Shuffle"
                  )
               ]
               array [
               ]
            }
         variant             struct {
               int32 10
               array [
                  dict entry(
                     string "label"
                     variant                         string "Repeat"
                  )
               ]
               array [
               ]
            }
         variant             struct {
               int32 11
               array [
                  dict entry(
                     string "type"
                     variant                         string "separator"
                  )
               ]
               array [
               ]
            }
         variant             struct {
               int32 12
               array [
                  dict entry(
                     string "label"
                     variant                         string "Exit"
                  )
               ]
               array [
               ]
            }
      ]
   }

Hopefully this is helpful
Comment 5 Friedrich W. H. Kossebau 2018-03-13 15:37:25 UTC
Thanks for the info. Okay, that make things more transparent: in a change for Plasma 5.12.3, in the desire to properly support the CanPause flag, the media key handling code was changed from using the "PlayPause" method to use instead explicitly the "Play" & "Pause" methods and take the current PlaybackStatus into account.

See the respective current code in Plasma here:
https://cgit.kde.org/plasma-workspace.git/tree/dataengines/mpris2/multiplexedservice.cpp?h=Plasma%2F5.12#n78

So there is either the chance that spotify does not properly update the PlaybackStatus or does not react to the call of "Play" method.

Can you check that method and property as well?
Comment 6 Danny Auble 2018-03-13 15:45:07 UTC
I am glad it makes sense at least :).

How would I check this method and property?

Thanks again for you help!
Comment 7 Friedrich W. H. Kossebau 2018-03-13 16:01:49 UTC
Calling the "Play" method would be done like this:

qdbus org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 \
    org.mpris.MediaPlayer2.Player.Play

Spec for Play behaviour is at https://specifications.freedesktop.org/mpris-spec/latest/Player_Interface.html#Method:Play

For all the methods you would just use "org.mpris.MediaPlayer2.Player." + method name in the above call. So what you do here is:
qdbus service object-in-service method-of-object (args, none here)

Getting the "PlaybackStatus" property:

qdbus org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 \
    org.freedesktop.DBus.Properties.Get org.mpris.MediaPlayer2.Player \
    PlaybackStatus
Comment 8 Danny Auble 2018-03-13 16:05:06 UTC
Thanks for the tutorial :).

That appears to be the issue.

qdbus org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2     org.mpris.MediaPlayer2.Player.Play

results in nothing.

qdbus org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2     org.mpris.MediaPlayer2.Player.Pause

works just fine.

Any idea how to fix it (or go back to the old method)?  Seems strange it works on other systems.
Comment 9 Danny Auble 2018-03-13 16:05:52 UTC
qdbus org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2     org.mpris.MediaPlayer2.Player.PlayPause

Also works just fine as well (expected).
Comment 10 Friedrich W. H. Kossebau 2018-03-13 16:24:14 UTC
Seems we found the cause, good.

So this then is a bug in spofify (or whatever adapter there is for it to support MPRIS). They need to properly handle the "Play" method, if they want to rightfully claim to support MPRIS. The purpose of specs such as MPRIS is to have a generic contract which every party complies to, so things work across systems out-of-the-box.
I hope you agree that adapting implementations (like here Plasma) to deal with some parties misbehaving ruins the idea of the spec.

So please report this bug about not handling the "Play" method to where you got spotify from. You did not mention your operating system, so I cannot give any hint myself who you might need to contact, hope you do know or can find out.

While most other MPRIS controllers might also default to use the "PlayPause" method (so this bug is not uncovered), there is a chance other MPRIS controllers also try just the "Play" method and will fail as well. So best for all in the long-term is to have spotify behave correctly.
Comment 11 Danny Auble 2018-03-13 17:41:08 UTC
I agree, thanks for your help on this.  I have already verified they have this fixed in a newer release of spotify.  The spotify version with the problem is 0.9.17.8.  1.0.69 is working as expected.

I also verified the 'good' system I though it worked with was actually still running KDE 5.10.5 so it also makes sense why it was working.

Thanks for your help and great information on how to debug.
Comment 12 Friedrich W. H. Kossebau 2018-03-13 17:55:39 UTC
spotify 1.0.69 working as expected is good news.
Thanks for that update, and thanks also again for your active support in sorting out things :)