22
33#include < qcontainerfwd.h>
44#include < qobject.h>
5+ #include < qproperty.h>
56#include < qqmlintegration.h>
67#include < qtmetamacros.h>
78#include < qtypes.h>
@@ -125,25 +126,27 @@ class MprisPlayer: public QObject {
125126 // / A map of common properties is available [here](https://www.freedesktop.org/wiki/Specifications/mpris-spec/metadata).
126127 // / Do not count on any of them actually being present.
127128 // /
128- // / Note that the @@trackTitle, @@trackAlbum, @@trackAlbumArtist, @@trackArtists and @@trackArtUrl
129+ // / Note that the @@trackTitle, @@trackAlbum, @@trackAlbumArtist, @@trackArtist and @@trackArtUrl
129130 // / properties have extra logic to guard against bad players sending weird metadata, and should
130131 // / be used over grabbing the properties directly from the metadata.
131- Q_PROPERTY (QVariantMap metadata READ metadata NOTIFY metadataChanged);
132+ Q_PROPERTY (QVariantMap metadata READ metadata NOTIFY metadataChanged BINDABLE bindableMetadata );
132133 // / An opaque identifier for the current track unique within the current player.
133134 // /
134135 // / > [!WARNING] This is NOT `mpris:trackid` as that is sometimes missing or nonunique
135136 // / > in some players.
136- Q_PROPERTY (quint32 uniqueId READ uniqueId NOTIFY trackChanged);
137+ Q_PROPERTY (quint32 uniqueId READ uniqueId NOTIFY trackChanged BINDABLE bindableUniqueId );
137138 // / The title of the current track, or "Unknown Track" if none was provided.
138- Q_PROPERTY (QString trackTitle READ trackTitle NOTIFY trackTitleChanged);
139+ Q_PROPERTY (QString trackTitle READ trackTitle NOTIFY trackTitleChanged BINDABLE bindableTrackTitle);
140+ // / The current track's artist, or an empty string if none was provided.
141+ Q_PROPERTY (QString trackArtist READ trackArtist NOTIFY trackArtistChanged BINDABLE bindableTrackArtist);
142+ // / > [!ERROR] deprecated in favor of @@trackArtist.
143+ Q_PROPERTY (QString trackArtists READ trackArtist NOTIFY trackArtistChanged BINDABLE bindableTrackArtist);
139144 // / The current track's album, or "Unknown Album" if none was provided.
140- Q_PROPERTY (QString trackAlbum READ trackAlbum NOTIFY trackAlbumChanged);
145+ Q_PROPERTY (QString trackAlbum READ trackAlbum NOTIFY trackAlbumChanged BINDABLE bindableTrackAlbum );
141146 // / The current track's album artist, or "Unknown Artist" if none was provided.
142- Q_PROPERTY (QString trackAlbumArtist READ trackAlbumArtist NOTIFY trackAlbumArtistChanged);
143- // / The current track's artists, or an empty list if none were provided.
144- Q_PROPERTY (QString trackArtists READ trackArtists NOTIFY trackArtistsChanged);
147+ Q_PROPERTY (QString trackAlbumArtist READ trackAlbumArtist NOTIFY trackAlbumArtistChanged BINDABLE bindableTrackAlbumArtist);
145148 // / The current track's art url, or `""` if none was provided.
146- Q_PROPERTY (QString trackArtUrl READ trackArtUrl NOTIFY trackArtUrlChanged);
149+ Q_PROPERTY (QString trackArtUrl READ trackArtUrl NOTIFY trackArtUrlChanged BINDABLE bindableTrackArtUrl );
147150 // / The playback state of the media player.
148151 // /
149152 // / - If @@canPlay is false, you cannot assign the `Playing` state.
@@ -254,7 +257,13 @@ class MprisPlayer: public QObject {
254257 [[nodiscard]] bool volumeSupported () const ;
255258 void setVolume (qreal volume);
256259
257- [[nodiscard]] const QVariantMap& metadata () const ;
260+ QS_BINDABLE_GETTER (quint32, bUniqueId, uniqueId, bindableUniqueId);
261+ QS_BINDABLE_GETTER (QVariantMap, bMetadata, metadata, bindableMetadata);
262+ QS_BINDABLE_GETTER (QString, bTrackTitle, trackTitle, bindableTrackTitle);
263+ QS_BINDABLE_GETTER (QString, bTrackAlbum, trackAlbum, bindableTrackAlbum);
264+ QS_BINDABLE_GETTER (QString, bTrackAlbumArtist, trackAlbumArtist, bindableTrackAlbumArtist);
265+ QS_BINDABLE_GETTER (QString, bTrackArtist, trackArtist, bindableTrackArtist);
266+ QS_BINDABLE_GETTER (QString, bTrackArtUrl, trackArtUrl, bindableTrackArtUrl);
258267
259268 [[nodiscard]] MprisPlaybackState::Enum playbackState () const ;
260269 void setPlaybackState (MprisPlaybackState::Enum playbackState);
@@ -281,9 +290,22 @@ class MprisPlayer: public QObject {
281290signals:
282291 // / The track has changed.
283292 // /
284- // / All track info change signalss will fire immediately after if applicable,
285- // / but their values will be updated before the signal fires.
293+ // / All track information properties that were sent by the player
294+ // / will be updated immediately following this signal. @@postTrackChanged
295+ // / will be sent after they update.
296+ // /
297+ // / Track information properties: @@uniqueId, @@metadata, @@trackTitle,
298+ // / @@trackArtist, @@trackAlbum, @@trackAlbumArtist, @@trackArtUrl
299+ // /
300+ // / > [!WARNING] Some particularly poorly behaved players will update metadata
301+ // / > *before* indicating the track has changed.
286302 void trackChanged ();
303+ // / Sent after track info related properties have been updated, following @@trackChanged.
304+ // /
305+ // / > [!WARNING] It is not safe to assume all track information is up to date after
306+ // / > this signal is emitted. A large number of players will update track information,
307+ // / > particularly @@trackArtUrl, slightly after this signal.
308+ void postTrackChanged ();
287309
288310 QSDOC_HIDE void ready ();
289311 void canControlChanged ();
@@ -306,9 +328,9 @@ class MprisPlayer: public QObject {
306328 void volumeSupportedChanged ();
307329 void metadataChanged ();
308330 void trackTitleChanged ();
331+ void trackArtistChanged ();
309332 void trackAlbumChanged ();
310333 void trackAlbumArtistChanged ();
311- void trackArtistsChanged ();
312334 void trackArtUrlChanged ();
313335 void playbackStateChanged ();
314336 void loopStateChanged ();
@@ -369,30 +391,21 @@ private slots:
369391
370392 DBusMprisPlayerApp* app = nullptr ;
371393 DBusMprisPlayer* player = nullptr ;
372- quint32 mUniqueId = 0 ;
373394 QString mTrackId ;
374395 QString mTrackUrl ;
375- QString mTrackTitle ;
376- QString mTrackArtists ;
377- QString mTrackAlbum ;
378- QString mTrackAlbumArtist ;
379- QString mTrackArtUrl ;
380-
381- DECLARE_MEMBER_NS (MprisPlayer, uniqueId, mUniqueId );
382396
383397 DECLARE_MEMBER (MprisPlayer, length, mLength , lengthChanged);
384398 DECLARE_MEMBER_SET (length, setLength);
385399
386400 // clang-format off
387- DECLARE_PRIVATE_MEMBER (MprisPlayer, trackTitle, setTrackTitle, mTrackTitle , trackTitleChanged);
388- DECLARE_PRIVATE_MEMBER (MprisPlayer, trackArtists, setTrackArtists, mTrackArtists , trackArtistsChanged);
389- DECLARE_PRIVATE_MEMBER (MprisPlayer, trackAlbum, setTrackAlbum, mTrackAlbum , trackAlbumChanged);
390- DECLARE_PRIVATE_MEMBER (MprisPlayer, trackAlbumArtist, setTrackAlbumArtist, mTrackAlbumArtist , trackAlbumArtistChanged);
391- DECLARE_PRIVATE_MEMBER (MprisPlayer, trackArtUrl, setTrackArtUrl, mTrackArtUrl , trackArtUrlChanged);
401+ Q_OBJECT_BINDABLE_PROPERTY (MprisPlayer, quint32, bUniqueId);
402+ Q_OBJECT_BINDABLE_PROPERTY (MprisPlayer, QVariantMap, bMetadata, &MprisPlayer::metadataChanged);
403+ Q_OBJECT_BINDABLE_PROPERTY (MprisPlayer, QString, bTrackArtist, &MprisPlayer::trackArtistChanged);
404+ Q_OBJECT_BINDABLE_PROPERTY (MprisPlayer, QString, bTrackTitle, &MprisPlayer::trackTitleChanged);
405+ Q_OBJECT_BINDABLE_PROPERTY (MprisPlayer, QString, bTrackAlbum, &MprisPlayer::trackAlbumChanged);
406+ Q_OBJECT_BINDABLE_PROPERTY (MprisPlayer, QString, bTrackAlbumArtist, &MprisPlayer::trackAlbumArtistChanged);
407+ Q_OBJECT_BINDABLE_PROPERTY (MprisPlayer, QString, bTrackArtUrl, &MprisPlayer::trackArtUrlChanged);
392408 // clang-format on
393-
394- public:
395- DECLARE_MEMBER_GET (uniqueId);
396409};
397410
398411} // namespace qs::service::mpris
0 commit comments