File indexing completed on 2024-04-28 16:51:33

0001 /*
0002     SPDX-FileCopyrightText: 2017 Kai Uwe Broulik <kde@privat.broulik.de>
0003     SPDX-FileCopyrightText: 2017 David Edmundson <davidedmundson@kde.org>
0004 
0005     SPDX-License-Identifier: MIT
0006 */
0007 
0008 #pragma once
0009 
0010 #include "abstractbrowserplugin.h"
0011 
0012 #include <QHash>
0013 #include <QString>
0014 #include <QTimer>
0015 #include <QUrl>
0016 
0017 class QDBusObjectPath;
0018 class QDBusAbstractAdaptor;
0019 
0020 class MPrisPlugin : public AbstractBrowserPlugin
0021 {
0022     Q_OBJECT
0023 
0024     // Root
0025     Q_PROPERTY(QString Identity READ identity)
0026     Q_PROPERTY(QString DesktopEntry READ desktopEntry)
0027     Q_PROPERTY(bool CanRaise READ canRaise)
0028     Q_PROPERTY(bool Fullscreen READ fullscreen WRITE setFullscreen NOTIFY fullscreenChanged)
0029     Q_PROPERTY(bool CanSetFullscreen READ canSetFullscreen NOTIFY canSetFullscreenChanged)
0030 
0031     // Player
0032     Q_PROPERTY(bool CanGoNext READ canGoNext)
0033     Q_PROPERTY(bool CanGoPrevious READ canGoPrevious)
0034     Q_PROPERTY(bool CanControl READ canControl NOTIFY canControlChanged)
0035     Q_PROPERTY(bool CanPause READ canPause NOTIFY playbackStatusChanged)
0036     Q_PROPERTY(bool CanPlay READ canPlay NOTIFY playbackStatusChanged)
0037     Q_PROPERTY(bool CanSeek READ canSeek NOTIFY canSeekChanged)
0038     Q_PROPERTY(qreal Volume READ volume WRITE setVolume)
0039     Q_PROPERTY(qlonglong Position READ position)
0040     Q_PROPERTY(double Rate READ playbackRate WRITE setPlaybackRate NOTIFY playbackRateChanged)
0041     Q_PROPERTY(double MinimumRate READ minimumRate NOTIFY minimumRateChanged)
0042     Q_PROPERTY(double MaximumRate READ maximumRate NOTIFY maximumRateChanged)
0043     Q_PROPERTY(QString PlaybackStatus READ playbackStatus NOTIFY playbackStatusChanged)
0044     Q_PROPERTY(QString LoopStatus READ loopStatus WRITE setLoopStatus)
0045     Q_PROPERTY(QVariantMap Metadata READ metadata NOTIFY metadataChanged)
0046 
0047 public:
0048     explicit MPrisPlugin(QObject *parent);
0049 
0050     bool onUnload() override;
0051 
0052     using AbstractBrowserPlugin::handleData;
0053     void handleData(const QString &event, const QJsonObject &data) override;
0054 
0055     // mpris properties ____________
0056 
0057     // Root
0058     QString identity() const;
0059     QString desktopEntry() const;
0060     bool canRaise() const;
0061 
0062     bool fullscreen() const;
0063     void setFullscreen(bool fullscreen);
0064     bool canSetFullscreen() const;
0065 
0066     // Player
0067     bool canGoNext() const;
0068     bool canGoPrevious() const;
0069     bool canControl() const;
0070     bool canPause() const;
0071     bool canPlay() const;
0072     bool canSeek() const;
0073 
0074     qreal volume() const;
0075     void setVolume(qreal volume);
0076 
0077     qlonglong position() const;
0078 
0079     double playbackRate() const;
0080     void setPlaybackRate(double playbackRate);
0081 
0082     double minimumRate() const;
0083     double maximumRate() const;
0084 
0085     QString playbackStatus() const;
0086 
0087     QString loopStatus() const;
0088     void setLoopStatus(const QString &loopStatus);
0089 
0090     QVariantMap metadata() const;
0091 
0092     // dbus-exported methods ________
0093 
0094     // Root
0095     void Raise();
0096     void Quit();
0097 
0098     // Player
0099     void Next();
0100     void Previous();
0101     void Pause();
0102     void PlayPause();
0103     void Stop();
0104     void Play();
0105     void Seek(qlonglong offset);
0106     void SetPosition(const QDBusObjectPath &path, qlonglong position);
0107     void OpenUri(const QString &uri);
0108 
0109 Q_SIGNALS:
0110     void fullscreenChanged();
0111     void canSetFullscreenChanged();
0112     void canControlChanged();
0113     void playbackStatusChanged();
0114     void canSeekChanged();
0115     void playbackRateChanged();
0116     void minimumRateChanged();
0117     void maximumRateChanged();
0118     void metadataChanged();
0119 
0120 private:
0121     void emitPropertyChange(const QDBusAbstractAdaptor *interface, const char *propertyName);
0122     void sendPropertyChanges();
0123 
0124     bool registerService();
0125     bool unregisterService();
0126 
0127     void setPlaybackStatus(const QString &playbackStatus);
0128     void setLength(qlonglong length);
0129     void setPosition(qlonglong position);
0130     void processMetadata(const QJsonObject &data);
0131     void processCallbacks(const QJsonArray &data);
0132 
0133     QString effectiveTitle() const;
0134 
0135     QDBusAbstractAdaptor *m_root;
0136     QDBusAbstractAdaptor *m_player;
0137 
0138     QTimer m_propertyChangeSignalTimer;
0139     // interface - <property name, value>
0140     QHash<QString, QVariantMap> m_pendingPropertyChanges;
0141 
0142     QString m_serviceName;
0143 
0144     bool m_fullscreen = false;
0145     bool m_canSetFullscreen = false;
0146 
0147     QString m_playbackStatus;
0148     QString m_loopStatus;
0149     QHash<QString, bool> m_possibleLoopStatus;
0150 
0151     bool m_canGoNext = false;
0152     bool m_canGoPrevious = false;
0153 
0154     QString m_pageTitle;
0155     QString m_tabTitle;
0156 
0157     QUrl m_url;
0158     QUrl m_mediaSrc;
0159 
0160     QString m_title;
0161     QString m_artist;
0162     QString m_album;
0163     QUrl m_posterUrl;
0164     QUrl m_artworkUrl;
0165 
0166     qreal m_volume = 1.0;
0167     bool m_muted = false;
0168 
0169     qlonglong m_length = 0;
0170     qlonglong m_position = 0;
0171     qreal m_playbackRate = 1.0;
0172 };