File indexing completed on 2024-05-05 05:35:45
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 };