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

0001 /**
0002  * SPDX-FileCopyrightText: 2013 Albert Vaca <albertvaka@gmail.com>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005  */
0006 
0007 #include "mprisremoteplugin.h"
0008 
0009 #include <KPluginFactory>
0010 
0011 #include <QDebug>
0012 
0013 #include <core/device.h>
0014 
0015 #include "plugin_mprisremote_debug.h"
0016 
0017 K_PLUGIN_CLASS_WITH_JSON(MprisRemotePlugin, "kdeconnect_mprisremote.json")
0018 
0019 void MprisRemotePlugin::receivePacket(const NetworkPacket &np)
0020 {
0021     if (np.type() != PACKET_TYPE_MPRIS)
0022         return;
0023 
0024     if (np.has(QStringLiteral("player"))) {
0025         const QString player = np.get<QString>(QStringLiteral("player"));
0026         if (!m_players.contains(player)) {
0027             m_players[player] = new MprisRemotePlayer(player, this);
0028         }
0029         m_players[player]->parseNetworkPacket(np);
0030     }
0031 
0032     if (np.has(QStringLiteral("playerList"))) {
0033         QStringList players = np.get<QStringList>(QStringLiteral("playerList"));
0034 
0035         // Remove players not available any more
0036         for (auto iter = m_players.begin(); iter != m_players.end();) {
0037             if (!players.contains(iter.key())) {
0038                 iter.value()->deleteLater();
0039                 iter = m_players.erase(iter);
0040             } else {
0041                 ++iter;
0042             }
0043         }
0044 
0045         // Add new players
0046         for (const QString &player : players) {
0047             if (!m_players.contains(player)) {
0048                 m_players[player] = new MprisRemotePlayer(player, this);
0049                 requestPlayerStatus(player);
0050             }
0051         }
0052 
0053         if (m_players.empty()) {
0054             m_currentPlayer = QString();
0055         } else if (!m_players.contains(m_currentPlayer)) {
0056             m_currentPlayer = m_players.firstKey();
0057         }
0058     }
0059     Q_EMIT propertiesChanged();
0060 }
0061 
0062 long MprisRemotePlugin::position() const
0063 {
0064     auto player = m_players.value(m_currentPlayer);
0065     return player ? player->position() : 0;
0066 }
0067 
0068 QString MprisRemotePlugin::dbusPath() const
0069 {
0070     return QLatin1String("/modules/kdeconnect/devices/%1/mprisremote").arg(device()->id());
0071 }
0072 
0073 void MprisRemotePlugin::requestPlayerStatus(const QString &player)
0074 {
0075     NetworkPacket np(PACKET_TYPE_MPRIS_REQUEST,
0076                      {{QStringLiteral("player"), player}, {QStringLiteral("requestNowPlaying"), true}, {QStringLiteral("requestVolume"), true}});
0077     sendPacket(np);
0078 }
0079 
0080 void MprisRemotePlugin::requestPlayerList()
0081 {
0082     NetworkPacket np(PACKET_TYPE_MPRIS_REQUEST, {{QStringLiteral("requestPlayerList"), true}});
0083     sendPacket(np);
0084 }
0085 
0086 void MprisRemotePlugin::sendAction(const QString &action)
0087 {
0088     NetworkPacket np(PACKET_TYPE_MPRIS_REQUEST, {{QStringLiteral("player"), m_currentPlayer}, {QStringLiteral("action"), action}});
0089     sendPacket(np);
0090 }
0091 
0092 void MprisRemotePlugin::seek(int offset) const
0093 {
0094     NetworkPacket np(PACKET_TYPE_MPRIS_REQUEST, {{QStringLiteral("player"), m_currentPlayer}, {QStringLiteral("Seek"), offset}});
0095     sendPacket(np);
0096 }
0097 
0098 void MprisRemotePlugin::setVolume(int volume)
0099 {
0100     NetworkPacket np(PACKET_TYPE_MPRIS_REQUEST, {{QStringLiteral("player"), m_currentPlayer}, {QStringLiteral("setVolume"), volume}});
0101     sendPacket(np);
0102 }
0103 
0104 void MprisRemotePlugin::setPosition(int position)
0105 {
0106     NetworkPacket np(PACKET_TYPE_MPRIS_REQUEST, {{QStringLiteral("player"), m_currentPlayer}, {QStringLiteral("SetPosition"), position}});
0107     sendPacket(np);
0108 
0109     m_players[m_currentPlayer]->setPosition(position);
0110 }
0111 
0112 void MprisRemotePlugin::setPlayer(const QString &player)
0113 {
0114     if (m_currentPlayer != player) {
0115         m_currentPlayer = player;
0116         requestPlayerStatus(player);
0117         Q_EMIT propertiesChanged();
0118     }
0119 }
0120 
0121 bool MprisRemotePlugin::isPlaying() const
0122 {
0123     auto player = m_players.value(m_currentPlayer);
0124     return player ? player->playing() : false;
0125 }
0126 
0127 int MprisRemotePlugin::length() const
0128 {
0129     auto player = m_players.value(m_currentPlayer);
0130     return player ? player->length() : 0;
0131 }
0132 
0133 int MprisRemotePlugin::volume() const
0134 {
0135     auto player = m_players.value(m_currentPlayer);
0136     return player ? player->volume() : 0;
0137 }
0138 
0139 QString MprisRemotePlugin::player() const
0140 {
0141     if (m_currentPlayer.isEmpty())
0142         return QString();
0143     return m_currentPlayer;
0144 }
0145 
0146 QStringList MprisRemotePlugin::playerList() const
0147 {
0148     return m_players.keys();
0149 }
0150 
0151 QString MprisRemotePlugin::title() const
0152 {
0153     auto player = m_players.value(m_currentPlayer);
0154     return player ? player->title() : QString();
0155 }
0156 
0157 QString MprisRemotePlugin::album() const
0158 {
0159     auto player = m_players.value(m_currentPlayer);
0160     return player ? player->album() : QString();
0161 }
0162 
0163 QString MprisRemotePlugin::artist() const
0164 {
0165     auto player = m_players.value(m_currentPlayer);
0166     return player ? player->artist() : QString();
0167 }
0168 
0169 bool MprisRemotePlugin::canSeek() const
0170 {
0171     auto player = m_players.value(m_currentPlayer);
0172     return player ? player->canSeek() : false;
0173 }
0174 
0175 #include "moc_mprisremoteplugin.cpp"
0176 #include "mprisremoteplugin.moc"