File indexing completed on 2024-04-28 08:49:08

0001 /**
0002  * SPDX-FileCopyrightText: 2018 Jun Bo Bi <jambonmcyeah@gmail.com>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005  */
0006 
0007 #pragma once
0008 
0009 #include <core/kdeconnectplugin.h>
0010 
0011 #include <variant>
0012 
0013 #include <QHash>
0014 #include <vector>
0015 
0016 #include <winrt/Windows.ApplicationModel.h>
0017 #include <winrt/Windows.Foundation.Collections.h>
0018 #include <winrt/Windows.Media.Control.h>
0019 #include <winrt/Windows.Storage.Streams.h>
0020 
0021 using namespace winrt;
0022 using namespace Windows::Media::Control;
0023 using namespace Windows::Storage::Streams;
0024 using namespace Windows::ApplicationModel;
0025 
0026 #define PACKET_TYPE_MPRIS QStringLiteral("kdeconnect.mpris")
0027 
0028 class MprisControlPlugin : public KdeConnectPlugin
0029 {
0030     Q_OBJECT
0031 
0032 public:
0033     explicit MprisControlPlugin(QObject *parent, const QVariantList &args);
0034 
0035     void receivePacket(const NetworkPacket &np) override;
0036 
0037 private:
0038     GlobalSystemMediaTransportControlsSessionManager sessionManager;
0039     QHash<QString, GlobalSystemMediaTransportControlsSession> playerList;
0040 
0041     std::vector<GlobalSystemMediaTransportControlsSession::PlaybackInfoChanged_revoker> playbackInfoChangedHandlers;
0042     std::vector<GlobalSystemMediaTransportControlsSession::MediaPropertiesChanged_revoker> mediaPropertiesChangedHandlers;
0043     std::vector<GlobalSystemMediaTransportControlsSession::TimelinePropertiesChanged_revoker> timelinePropertiesChangedHandlers;
0044 
0045     std::optional<QString> getPlayerName(GlobalSystemMediaTransportControlsSession const &player);
0046     void sendMediaProperties(std::variant<NetworkPacket, QString> const &packetOrName, GlobalSystemMediaTransportControlsSession const &player);
0047     void sendPlaybackInfo(std::variant<NetworkPacket, QString> const &packetOrName, GlobalSystemMediaTransportControlsSession const &player);
0048     void sendTimelineProperties(std::variant<NetworkPacket, QString> const &packetOrName,
0049                                 GlobalSystemMediaTransportControlsSession const &player,
0050                                 bool lengthOnly = false);
0051     void updatePlayerList();
0052     void sendPlayerList();
0053     bool sendAlbumArt(std::variant<NetworkPacket, QString> const &packetOrName, GlobalSystemMediaTransportControlsSession const &player, QString artUrl);
0054 
0055     void handleDefaultPlayer(const NetworkPacket &np);
0056 
0057     QString randomUrl();
0058 };