File indexing completed on 2025-03-23 04:34:33
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"