static const QString PLAY(QLatin1String("play"));
/** The variable APPEND contains the action label for append */
static const QString APPEND(QLatin1String("append"));
-/** The variable QUEUE contains the action label for queue */
-static const QString QUEUE(QLatin1String("queue"));
/** The variable NONE says that no action is needed */
static const QString NONE(QLatin1String("none"));
+// for reference:
+// https://specifications.freedesktop.org/mpris-spec/latest/
+
+typedef QList<QDBusObjectPath> TrackListType;
AudioPlayerControlRunner::AudioPlayerControlRunner(QObject *parent, const QVariantList& args)
- : Plasma::AbstractRunner(parent, args)
+ : Plasma::AbstractRunner(parent, args)
{
Q_UNUSED(args);
- setObjectName(QLatin1String( "Audio Player Control Runner" ));
+ setObjectName(QLatin1String("Audio Player Control Runner"));
setSpeed(AbstractRunner::SlowSpeed);
qDBusRegisterMetaType<QList<QVariantMap> >();
{
}
-
void AudioPlayerControlRunner::prep()
{
m_running = false;
m_songsInPlaylist = 0;
- m_currentTrack = -1;
m_nextSongAvailable = false;
m_prevSongAvailable = false;
- QDBusInterface player(QString::fromLatin1( "org.mpris.%1").arg(m_player), QLatin1String( "/TrackList" ), QLatin1String( "org.freedesktop.MediaPlayer" ));
- QDBusPendingCall call = player.asyncCall(QLatin1String( "GetLength" ));
- QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this);
- QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
- this, SLOT(songsInPlaylist(QDBusPendingCallWatcher*)));
+ QDBusInterface player(QString::fromLatin1("org.mpris.MediaPlayer2.%1").arg(m_player),
+ QLatin1String("/org/mpris/MediaPlayer2"), QLatin1String("org.mpris.MediaPlayer2.Player"));
+ m_running = player.isValid();
- call = player.asyncCall(QLatin1String( "GetCurrentTrack" ));
- watcher = new QDBusPendingCallWatcher(call, this);
- QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
- this, SLOT(prevNextSongAvailable(QDBusPendingCallWatcher*)));
+ if (m_running) {
+ QDBusInterface trackList(QString::fromLatin1("org.mpris.MediaPlayer2.%1").arg(m_player),
+ QLatin1String("/org/mpris/MediaPlayer2"), QLatin1String("org.mpris.MediaPlayer2.TrackList"));
+ m_songsInPlaylist = qvariant_cast<TrackListType>(trackList.property("Tracks")).size();
+
+ // NOTE: Audacious implements both properties but not org.mpris.MediaPlayer2.TrackList, the
+ // properties also are set to true even if there is only one track in the playlist - what
+ // to do with that?
+ // NOTE: VLC implements org.mpris.MediaPlayer2.TrackList but not the properties - what to
+ // do with that?
+ if (m_songsInPlaylist > 0) {
+ m_nextSongAvailable = player.property("CanGoNext").toBool();
+ m_prevSongAvailable = player.property("CanGoPrevious").toBool();
+ }
+ }
}
void AudioPlayerControlRunner::match(Plasma::RunnerContext &context)
QList<Plasma::QueryMatch> matches;
if (m_useCommands) {
- /* DBus paths that are used in the command executes */
- /* The data variable looks like this:
- * "/PlayerQLatin1String( " " )org.freedesktop.MediaPlayerQLatin1String( " " )PlayQLatin1String( " " )actionsQLatin1String( " " )start" args...
- * <path> <interface> <method> <actions> <start player>
- * <actions> is NONE if no action is needed
- */
-
QVariantList playcontrol;
- playcontrol << QLatin1String( "/Player" ) << QLatin1String( "org.freedesktop.MediaPlayer" );
+ playcontrol << QLatin1String("/org/mpris/MediaPlayer2") << QLatin1String("org.mpris.MediaPlayer2.Player");
/* The commands */
- //Play
+ // Play
+ // TODO: does not make sense if already playing (not paused)
if (context.isValid() && m_comPlay.startsWith(term, Qt::CaseInsensitive) &&
- (!m_running || m_songsInPlaylist)) {
+ (!m_running || m_songsInPlaylist)) {
QVariantList data = playcontrol;
- data << ((currentSong() == -1) ? QLatin1String( "Next" ) : QLatin1String( "Play" )) << NONE << QLatin1String( "start" );
- matches << createMatch(this, i18n("Start playing"), i18n("Audio player control"), QLatin1String( "play" ),
- KIcon( QLatin1String( "media-playback-start" )), data, 1.0);
+ data << QLatin1String("Play") << NONE << QLatin1String("start");
+ matches << createMatch(this, i18n("Start playing"), i18n("Audio player control"), QLatin1String("play"),
+ KIcon(QLatin1String("media-playback-start")), data, 1.0);
}
if (!context.isValid() || !m_running) {
- //The interface of the player is not availalbe, so the rest of the commands
- //is not needed
+ // The interface of the player is not availalbe, so the rest of the commands
+ // is not needed
context.addMatches(term,matches);
return;
}
if (context.isValid() && m_songsInPlaylist) {
- //The playlist isn't empty
- //Next song
- if (m_comNext.startsWith(term,Qt::CaseInsensitive)
- && m_nextSongAvailable) {
+ // The playlist isn't empty
+ // Next song
+ if (m_comNext.startsWith(term, Qt::CaseInsensitive) && m_nextSongAvailable) {
QVariantList data = playcontrol;
- data << QLatin1String( "Next" ) << NONE << QLatin1String( "nostart" );
+ data << QLatin1String("Next") << NONE << QLatin1String("nostart");
matches << createMatch(this, i18n("Play next song"), i18n("Audio player control"),
- QLatin1String( "next" ), KIcon( QLatin1String( "media-skip-forward" )), data, 1.0);
+ QLatin1String("next"), KIcon(QLatin1String("media-skip-forward")), data, 1.0);
}
- //Previous song
- if (context.isValid() && m_comPrev.startsWith(term,Qt::CaseInsensitive)
- && m_prevSongAvailable) {
+ // Previous song
+ if (context.isValid() && m_comPrev.startsWith(term, Qt::CaseInsensitive) && m_prevSongAvailable) {
QVariantList data = playcontrol;
- data << QLatin1String( "Prev" ) << NONE << QLatin1String( "nostart" );
+ data << QLatin1String("Previous") << NONE << QLatin1String("nostart");
matches << createMatch(this, i18n("Play previous song"), i18n("Audio player control") ,
- QLatin1String( "previous" ), KIcon( QLatin1String( "media-skip-backward" )), data, 1.0);
+ QLatin1String("previous"), KIcon(QLatin1String("media-skip-backward")), data, 1.0);
}
- }//--- if (m_songsInPlaylist)
+ } // --- if (m_songsInPlaylist)
- //Pause
- if (context.isValid() && m_comPause.startsWith(term,Qt::CaseInsensitive)) {
+ // Pause
+ // TODO: does not make sense if not playing (paused)
+ if (context.isValid() && m_comPause.startsWith(term, Qt::CaseInsensitive)) {
QVariantList data = playcontrol;
- data << QLatin1String( "Pause" ) << NONE << QLatin1String( "nostart" );
+ data << QLatin1String("Pause") << NONE << QLatin1String("nostart");
matches << createMatch(this, i18n("Pause playing"), i18n("Audio player control"),
- QLatin1String( "pause" ), KIcon( QLatin1String( "media-playback-pause" )), data, 1.0);
+ QLatin1String("pause"), KIcon(QLatin1String("media-playback-pause")), data, 1.0);
}
- //Stop
- if (context.isValid() && m_comStop.startsWith(term,Qt::CaseInsensitive)) {
+ // Stop
+ if (context.isValid() && m_comStop.startsWith(term, Qt::CaseInsensitive)) {
QVariantList data = playcontrol;
- data << QLatin1String( "Stop" ) << NONE << QLatin1String( "nostart" );
+ data << QLatin1String("Stop") << NONE << QLatin1String("nostart");
matches << createMatch(this, i18n("Stop playing"), i18n("Audio player control"),
- QLatin1String( "stop" ), KIcon( QLatin1String( "media-playback-stop" )), data, 1.0);
+ QLatin1String("stop"), KIcon(QLatin1String("media-playback-stop")), data, 1.0);
}
- //Increase
- if (context.isValid() && m_comIncrease.startsWith(term,Qt::CaseInsensitive)) {
- QVariantList data = playcontrol;
- data << QLatin1String( "VolumeUp" ) << NONE << QLatin1String( "nostart" ) << m_increaseBy;
- matches << createMatch(this, i18n("Increase volume by %1" , m_increaseBy),
- QLatin1String( "volumeup" ), i18n("Audio player control"), KIcon(QLatin1String( "audio-volume-high" )), data, 1.0);
- } else if (context.isValid() && equals(term, QRegExp( m_comIncrease + QLatin1String( " \\d{1,2}0{0,1}" ) ) ) ) {
- int volumeChange = getNumber(term, ' ' );
- QVariantList data = playcontrol;
- data << QLatin1String( "VolumeUp" ) << NONE << QLatin1String( "nostart" ) << volumeChange;
- matches << createMatch(this, i18n("Increase volume by %1" , volumeChange),
- QLatin1String( "volumeup" ), i18n("Audio player control"), KIcon(QLatin1String( "audio-volume-high" )), data, 1.0);
- }
-
- //Decrease
- if (context.isValid() && m_comDecrease.startsWith(term,Qt::CaseInsensitive)) {
- QVariantList data = playcontrol;
- data << QLatin1String( "VolumeDown" ) << NONE << QLatin1String( "nostart" ) << m_decreaseBy;
- matches << createMatch(this, i18n("Reduce volume by %1", m_decreaseBy),
- QLatin1String( "volumedown" ), i18n("Audio player control"), KIcon(QLatin1String( "audio-volume-low" )), data, 1.0);
- } else if (context.isValid() && equals(term, QRegExp( m_comDecrease + QLatin1String( " \\d{1,2}0{0,1}" ) ) ) ) {
- int volumeChange = getNumber(term, ' ');
- QVariantList data = playcontrol;
- data << QLatin1String( "VolumeDown" ) << NONE << QLatin1String( "nostart" ) << volumeChange;
- matches << createMatch(this, i18n("Reduce volume by %1", volumeChange),
- QLatin1String( "volumedown" ), i18n("Audio player control"), KIcon(QLatin1String( "audio-volume-low" )), data, 1.0);
- }
-
- //Set volume to
- if (context.isValid() && equals(term, QRegExp( m_comVolume + QLatin1String( " \\d{1,2}0{0,1}" ) ) ) ) {
+ // Set volume to
+ if (context.isValid() && equals(term, QRegExp(m_comVolume + QLatin1String(" \\d{1,2}0{0,1}") ) ) ) {
QVariantList data = playcontrol;
int newVolume = getNumber(term , ' ');
- data << QLatin1String( "VolumeSet" ) << NONE << QLatin1String( "nostart" ) << newVolume;
+ data << QLatin1String("Volume") << NONE << QLatin1String("nostart") << (newVolume / 100.0);
matches << createMatch(this, i18n("Set volume to %1%" , newVolume),
- QLatin1String( "volume" ), i18n("Audio player control"), KIcon(QLatin1String( "audio-volume-medium" )), data, 1.0);
+ QLatin1String("volume"), i18n("Audio player control"), KIcon(QLatin1String("audio-volume-medium")), data, 1.0);
}
- //Mute
- if (context.isValid() && m_comMute.startsWith(term,Qt::CaseInsensitive)) {
- QVariantList data = playcontrol;
- data << QLatin1String( "Mute" ) << NONE << QLatin1String( "nostart" );
- matches << createMatch(this, i18n("Mute"), i18n("Audio player control"),
- QLatin1String( "mute" ), KIcon( QLatin1String( "audio-volume-muted" )), data, 1.0);
- }
-
- //Quit player
- if (context.isValid() && m_comQuit.startsWith(term,Qt::CaseInsensitive)) {
+ // Quit player
+ if (context.isValid() && m_comQuit.startsWith(term, Qt::CaseInsensitive)) {
QVariantList data;
- data << QLatin1String( "/" ) << QLatin1String( "org.freedesktop.MediaPlayer" ) << QLatin1String( "Quit" ) << NONE
- << QLatin1String( "nostart" );
- matches << createMatch(this, i18n("Quit %1", m_player),QLatin1String( "" ),
- QLatin1String( "quit" ), KIcon( QLatin1String( "application-exit" )), data, 1.0);
- }
- }//--- if (m_useCommands)
-
- if (context.isValid() && m_searchCollection) {
- QString actionNames;
- QString searchTerm = term;
- QString command;
-
- if (term.startsWith(m_comPlay,Qt::CaseInsensitive)
- && term.length() > m_comPlay.length()) {
- command = m_comPlay;
- actionNames = PLAY;
- } else if (term.startsWith(m_comAppend, Qt::CaseInsensitive)
- && term.length() > m_comAppend.length()) {
- command = m_comAppend;
- actionNames = APPEND;
- } else if (term.startsWith(m_comQueue, Qt::CaseInsensitive)
- && term.length() > m_comQueue.length()) {
- command = m_comQueue;
- actionNames = QUEUE;
- } else {
- actionNames = QString::fromLatin1( "%1,%2,%3").arg(PLAY).arg(APPEND).arg(QUEUE);
+ data << QLatin1String("/org/mpris/MediaPlayer2") << QLatin1String("org.mpris.MediaPlayer2") << QLatin1String("Quit") << NONE
+ << QLatin1String("nostart");
+ matches << createMatch(this, i18n("Quit %1", m_player), QLatin1String(""),
+ QLatin1String("quit"), KIcon(QLatin1String("application-exit")), data, 1.0);
}
-
- if (!context.isValid())
- {
- return;
- }
- searchTerm = searchTerm.right(searchTerm.length() - (command.length() + 1));
- matches << searchCollectionFor(searchTerm, actionNames);
- //Adds matches for all song matches for term
- }
+ } // --- if (m_useCommands)
context.addMatches(term, matches);
}
void AudioPlayerControlRunner::run(const Plasma::RunnerContext &context, const Plasma::QueryMatch &match)
{
Q_UNUSED(context)
- QDBusInterface tracklist(QString::fromLatin1( "org.mpris.%1").arg(m_player),
- QLatin1String( "/TrackList" ), QLatin1String( "org.freedesktop.MediaPlayer" ));
QVariantList data = match.data().value<QVariantList>();
- /* Only Amarok part*/
- QString url = data[2].toString();
- int pos = posInPlaylist(url);
- kDebug() << "pos" << pos;
- QAction *a = match.selectedAction();
- if (data[3].toString().compare(NONE)) {
- if (!a)
- {
- a = action(data[3].toString());
- }
- if (a == action(QUEUE)) {
- KUrl::List list;
- list << KUrl(url);
- KRun::run(QLatin1String( "amarok --queue %u" ), list, 0);
- } else if (a == action(APPEND)) {
- if (!(pos > -1)) {
- tracklist.call(QDBus::NoBlock, QLatin1String( "AddTrack" ), url , false);
- }
- } else {
- //Action play was selected
- if (pos > -1) {
- tracklist.call(QDBus::NoBlock, QLatin1String( "PlayTrack" ), pos);
- } else {
- tracklist.call(QDBus::NoBlock, QLatin1String( "AddTrack" ), url, true);
- }
- }
- }/* Only Amarok part over */ else {
- if ((data[4].toString().compare(QLatin1String( "start" )) == 0)) {
- //The players's interface isn't available but it should be started
- if (!startPlayer()) {
- return;
- }
+ if (data[4].toString().compare(QLatin1String("start")) == 0) {
+ // The players's interface isn't available but it should be started
+ if (!startPlayer()) {
+ return;
}
+ }
- QDBusMessage msg = QDBusMessage::createMethodCall(QString::fromLatin1( "org.mpris.%1").arg(m_player),data[0].toString(),
- data[1].toString(), data[2].toString());
- kDebug() << msg;
- QVariantList args;
- for (int i = 5;data.length() > i;++i) {
- args << data[i];
- }
- msg.setArguments(args);
- QDBusConnection::sessionBus().call(msg, QDBus::NoBlock);
+ // special case for properties
+ if (data[2].toString().compare(QLatin1String("Volume")) == 0) {
+ QDBusInterface player(QString::fromLatin1("org.mpris.MediaPlayer2.%1").arg(m_player),
+ data[0].toString(), data[1].toString());
+ player.setProperty(data[2].toByteArray(), data[5]);
+ return;
}
+
+ QDBusMessage msg = QDBusMessage::createMethodCall(QString::fromLatin1("org.mpris.MediaPlayer2.%1").arg(m_player),
+ data[0].toString(), data[1].toString(), data[2].toString());
+ kDebug() << msg;
+ QVariantList args;
+ for (int i = 5; data.length() > i;++i) {
+ args << data[i];
+ }
+ msg.setArguments(args);
+ QDBusConnection::sessionBus().call(msg, QDBus::NoBlock);
}
QList<QAction*> AudioPlayerControlRunner::actionsForMatch(const Plasma::QueryMatch &match)
if (data.length() > 3 && data[3].toString().compare(NONE)) {
if (!action(PLAY)) {
- addAction(PLAY, KIcon(QLatin1String( "media-playback-start" )), i18n("Play"));
- addAction(QUEUE, KIcon(QLatin1String( "media-track-queue-amarok" )), i18n("Queue"));
- addAction(APPEND, KIcon(QLatin1String( "media-track-add-amarok" )), i18n("Append to playlist"));
+ addAction(PLAY, KIcon(QLatin1String("media-playback-start")), i18n("Play"));
+ addAction(APPEND, KIcon(QLatin1String("media-track-add-amarok")), i18n("Append to playlist"));
}
const QStringList actions = data[3].toString().split(QLatin1Char( ',' ));
-
for (int i = 0; i < actions.length(); ++i) {
ret << action(actions[i]);
}
void AudioPlayerControlRunner::reloadConfiguration()
{
KConfigGroup grp = config();
- m_player = grp.readEntry(CONFIG_PLAYER, "amarok");
+ m_player = grp.readEntry(CONFIG_PLAYER, "vlc");
m_useCommands = grp.readEntry(CONFIG_COMMANDS, true);
- m_searchCollection = grp.readEntry(CONFIG_COLLECTION, true);
m_comPlay = grp.readEntry(CONFIG_PLAY, i18n("play"));
m_comAppend = grp.readEntry(CONFIG_APPEND, i18n("append"));
- m_comQueue = grp.readEntry(CONFIG_QUEUE, i18n("queue"));
m_comPause = grp.readEntry(CONFIG_PAUSE, i18n("pause"));
m_comNext = grp.readEntry(CONFIG_NEXT, i18n("next"));
- m_comMute = grp.readEntry(CONFIG_MUTE, i18n("mute"));
- m_comIncrease = grp.readEntry(CONFIG_INCREASE, i18n("increase"));
- m_increaseBy = qBound(0, grp.readEntry(CONFIG_INCREASE_BY, 15), 100);
- m_comDecrease = grp.readEntry(CONFIG_DECREASE, i18n("decrease"));
- m_decreaseBy = qBound(0, grp.readEntry(CONFIG_DECREASE_BY, 15), 100);
m_comPrev = grp.readEntry(CONFIG_PREV, i18n("prev"));
m_comStop = grp.readEntry(CONFIG_STOP, i18n("stop"));
m_comVolume = grp.readEntry(CONFIG_VOLUME, i18n("volume"));
/* Adding the syntaxes for helping the user */
QList<Plasma::RunnerSyntax> syntaxes;
- if (m_player == QLatin1String( "amarok" )) {
- syntaxes << Plasma::RunnerSyntax(m_comPlay + QLatin1String( " :q:" ),
- i18n("Plays the selected song. If :q: is not empty it lists songs matching :q: to play them"));
- syntaxes << Plasma::RunnerSyntax(m_comAppend + QLatin1String( " :q:" ),
- i18n("Displays songs matching :q: for appending the selected to the playlist"));
- syntaxes << Plasma::RunnerSyntax(m_comQueue + QLatin1String( " :q:" ),
- i18n("Displays songs matching :q: for queueing them"));
- } else {
- syntaxes << Plasma::RunnerSyntax(m_comPlay,
- i18n("Plays a song from playlist"));
- }
+ syntaxes << Plasma::RunnerSyntax(m_comPlay, i18n("Plays a song from playlist"));
syntaxes << Plasma::RunnerSyntax(m_comPause,i18n("Pauses the playing"));
syntaxes << Plasma::RunnerSyntax(m_comNext, i18n("Plays the next song in the playlist if one is available"));
- syntaxes << Plasma::RunnerSyntax(m_comMute, i18n("Mutes/unmutes the player"));
- syntaxes << Plasma::RunnerSyntax(m_comIncrease + QLatin1String( " :q:" ),
- i18n("Increases the volume by :q:. If :q: is empty it increases by the configured value"));
- syntaxes << Plasma::RunnerSyntax(m_comDecrease + QLatin1String( " :q:" ),
- i18n("Decreases the volume by :q:. If :q: is empty it decreases by the configured value"));
syntaxes << Plasma::RunnerSyntax(m_comPrev, i18n("Plays the previous song if one is available"));
syntaxes << Plasma::RunnerSyntax(m_comStop, i18n("Stops the playing"));
- syntaxes << Plasma::RunnerSyntax(m_comVolume + QLatin1String( " :q:" ), i18n("Sets the volume to :q:"));
+ syntaxes << Plasma::RunnerSyntax(m_comVolume + QLatin1String(" :q:"), i18n("Sets the volume to :q:"));
syntaxes << Plasma::RunnerSyntax(m_comQuit, i18n("Quits the player"));
setSyntaxes(syntaxes);
if (!KRun::run(m_player, KUrl::List(), 0)) {
//We couldn't start the player
KMessageBox::error(0, i18n("%1 not found", m_player),
- i18n("%1 was not found so the runner is unable to work.", m_player));
+ i18n("%1 was not found so the runner is unable to work.", m_player));
return false;
}
//Waiting for the player's interface to appear
;
}*/
- return true;
-}
-
-int AudioPlayerControlRunner::posInPlaylist(const KUrl& url)
-{
- QDBusInterface player(QString::fromLatin1( "org.mpris.%1").arg(m_player), QLatin1String( "/TrackList" ), QLatin1String( "org.freedesktop.MediaPlayer" ));
- for (int i = 0; i < m_songsInPlaylist; i++) {
- QDBusPendingReply<QVariantMap> data = player.asyncCall(QLatin1String( "GetMetadata" ), i);
- KUrl curl = KUrl(KUrl::fromPercentEncoding(data.value().value(QLatin1String( "location" )).toByteArray()));
- kDebug() << curl << ":" << url;
- if (curl == url) {
- return i;
- }
- }
- return -1;
-}
-
-void AudioPlayerControlRunner::songsInPlaylist(QDBusPendingCallWatcher *call)
-{
- QDBusPendingReply<int> reply = *call;
- m_running = !reply.isError();
-
- if (m_running) {
- m_songsInPlaylist = reply.value();
- if (m_currentTrack > -1) {
- // calculate if the next song is available given the new count
- m_nextSongAvailable = m_songsInPlaylist > m_currentTrack;
- }
- } else {
- m_songsInPlaylist = 0;
- }
-
- call->deleteLater();
-}
-
-void AudioPlayerControlRunner::prevNextSongAvailable(QDBusPendingCallWatcher *call)
-{
- QDBusPendingReply<int> reply = *call;
- m_running = !reply.isError();
-
- if (m_running) {
- m_currentTrack = reply.value();
- if (m_songsInPlaylist > 0) {
- m_nextSongAvailable = m_songsInPlaylist > m_currentTrack;
- m_prevSongAvailable = m_currentTrack > 0;
- }
- } else {
- m_currentTrack = 0;
- }
- call->deleteLater();
+ return true;
}
bool AudioPlayerControlRunner::equals(const QString &text, QRegExp reg)
int AudioPlayerControlRunner::getNumber(const QString& term, const char character)
{
- return term.section(QLatin1Char( character ), 1, 1).toInt();
-}
-
-QList<Plasma::QueryMatch> AudioPlayerControlRunner::searchCollectionFor(const QString &term, const QString &actionNames)
-{
- QDBusInterface amarok(QString::fromLatin1( "org.mpris.%1").arg(m_player),
- QLatin1String( "/Collection" ), QLatin1String( "org.kde.amarok.Collection" ));
-
-
- QString query(QLatin1String( "<query version=\"1.0\"><limit value=\"5\" /><filters>" ));
- QStringList queryItems = term.split(QLatin1Char( ' ' ), QString::SkipEmptyParts);
- foreach(const QString &queryItem, queryItems) {
- query.append(QString::fromLatin1( "<or><include field=\"title\" value=\"%1\" />").arg(queryItem));
- query.append(QString::fromLatin1( "<or><include field=\"artist\" value=\"%1\" />").arg(queryItem));
- query.append(QString::fromLatin1( "<or><include field=\"album\" value=\"%1\" /></or>").arg(queryItem));
- query.append(QLatin1String( "</or></or>"));
- }
-
- query.append(QLatin1String( "</filters><includeCollection id=\"localCollection\" /></query>" ));
-
- QDBusPendingReply<QList<QVariantMap> > reply = amarok.asyncCall(QLatin1String( "MprisQuery" ), query);
- reply.waitForFinished();
-
- if (!reply.isValid()) {
- return QList<Plasma::QueryMatch>();
- }
-
- QVariantList data;
- data << QLatin1String( "/TrackList" ) << QLatin1String( "org.freedesktop.MediaPlayer" );
- QList<Plasma::QueryMatch> matches;
- foreach (const QVariantMap &map, reply.value()) {
- QString artist = map[QLatin1String( "artist" )].toString();
- QString title = map[QLatin1String( "title" )].toString();
- QString url = map[QLatin1String( "location" )].toString();
- QUrl arturl = map[QLatin1String( "arturl" )].toUrl();
- double relevance = map[QLatin1String( "rating" )].toInt()*0.2;
- //QString album = map["xesam:album"].toString();
-
- data << url << actionNames;
- Plasma::QueryMatch match(this);
- match.setType(Plasma::QueryMatch::PossibleMatch);
-
- if (arturl.isValid() && arturl.isLocalFile()) {
- const QImage image = QImage(arturl.toLocalFile());
- QIcon icon(new ImageIconEngine(image));
- match.setIcon(icon);
- } else {
- match.setIcon(KIcon( QLatin1String( "audio-x-generic" )));
- }
-
- match.setText(QString::fromLatin1( "%1 - %2").arg(artist).arg(title));
- match.setData(data);
- match.setRelevance(relevance);
- match.setId(QLatin1String( "track_" ) + url);
- matches.append(match);
- data.removeLast();
- data.removeLast();
- }//--- foreach
-
- return matches;
+ return term.section(QLatin1Char(character), 1, 1).toInt();
}
-int AudioPlayerControlRunner::currentSong()
-{
- QDBusPendingReply<int> current = QDBusInterface(QString::fromLatin1( "org.mpris.%1").arg(m_player), QLatin1String( "/TrackList" ), QLatin1String( "org.freedesktop.MediaPlayer" )).asyncCall(QLatin1String( "GetCurrentTrack" ));
- current.waitForFinished();
- return current;
-}
#include "moc_audioplayercontrolrunner.cpp"
layout->addWidget(m_ui, 0, 0);
connect(m_ui->commands, SIGNAL(clicked(bool)),this,SLOT(changed()));
- connect(m_ui->searchCollection, SIGNAL(stateChanged(int)),this,SLOT(changed()));
connect(m_ui->player_combo, SIGNAL(currentIndexChanged(int)), this, SLOT(changed()));
connect(m_ui->player_combo, SIGNAL(editTextChanged(QString)), this, SLOT(changed()));
connect(m_ui->play_edit, SIGNAL(textChanged(QString)), this, SLOT(changed()));
connect(m_ui->append_edit, SIGNAL(textChanged(QString)),this,SLOT(changed()));
- connect(m_ui->queue_edit, SIGNAL(textChanged(QString)),this,SLOT(changed()));
connect(m_ui->pause_edit, SIGNAL(textChanged(QString)), this, SLOT(changed()));
connect(m_ui->next_edit, SIGNAL(textChanged(QString)), this, SLOT(changed()));
- connect(m_ui->mute_edit, SIGNAL(textChanged(QString)), this, SLOT(changed()));
- connect(m_ui->up_edit, SIGNAL(textChanged(QString)), this, SLOT(changed()));
- connect(m_ui->up_value, SIGNAL(valueChanged(int)), this, SLOT(changed()));
- connect(m_ui->down_edit, SIGNAL(textChanged(QString)), this, SLOT(changed()));
- connect(m_ui->down_value, SIGNAL(valueChanged(int)), this, SLOT(changed()));
connect(m_ui->prev_edit, SIGNAL(textChanged(QString)), this, SLOT(changed()));
connect(m_ui->stop_edit, SIGNAL(textChanged(QString)), this, SLOT(changed()));
connect(m_ui->volume_edit, SIGNAL(textChanged(QString)), this, SLOT(changed()));
/* Setup the combobox to select the player */
m_ui->player_combo->setDuplicatesEnabled(false);
- connect(m_ui->player_combo, SIGNAL(currentIndexChanged(int)), this, SLOT(onPlayerChanged(int)));
- connect(m_ui->player_combo, SIGNAL(editTextChanged(QString)), this, SLOT(onPlayerChanged(QString)));
- m_ui->player_combo->addItem(i18n("Amarok"), QLatin1String("amarok"));
+ m_ui->player_combo->addItem(i18n("VLC"), QLatin1String("vlc"));
+ m_ui->player_combo->addItem(i18n("Audacious"), QLatin1String("audacious"));
/* template for adding other players:
* m_ui->player_combo->addItem(i18n("player's name"), "the end of it's MPRIS interface");
*/
KSharedConfig::Ptr cfg = KSharedConfig::openConfig(QLatin1String("krunnerrc"));
KConfigGroup grp = cfg->group("Runners");
grp = KConfigGroup(&grp, "Audio Player Control Runner");
- QString player = grp.readEntry(CONFIG_PLAYER, "amarok");
+ QString player = grp.readEntry(CONFIG_PLAYER, "vlc");
int index = m_ui->player_combo->findData(player);
if (index == -1) {
m_ui->player_combo->addItem(player, player);
m_ui->player_combo->setCurrentIndex(index);
}
m_ui->commands->setChecked(grp.readEntry(CONFIG_COMMANDS,true));
- m_ui->searchCollection->setChecked(grp.readEntry(CONFIG_COLLECTION,true));
m_ui->play_edit->setText(grp.readEntry(CONFIG_PLAY , i18n("play")));
m_ui->append_edit->setText(grp.readEntry(CONFIG_APPEND, i18n("append")));
- m_ui->queue_edit->setText(grp.readEntry(CONFIG_QUEUE,i18n("queue")));
m_ui->pause_edit->setText(grp.readEntry(CONFIG_PAUSE, i18n("pause")));
m_ui->next_edit->setText(grp.readEntry(CONFIG_NEXT, i18nc("next song", "next")));
- m_ui->mute_edit->setText(grp.readEntry(CONFIG_MUTE , i18n("mute")));
- m_ui->up_edit->setText(grp.readEntry(CONFIG_INCREASE, i18nc("increase the sound volume", "increase")));
- m_ui->up_value->setValue(grp.readEntry(CONFIG_INCREASE_BY , 15));
- m_ui->down_edit->setText(grp.readEntry(CONFIG_DECREASE , i18nc("decrease the sound volume", "decrease")));
- m_ui->down_value->setValue(grp.readEntry(CONFIG_DECREASE_BY, 15));
m_ui->prev_edit->setText(grp.readEntry(CONFIG_PREV , i18nc("previous song", "prev")));
m_ui->stop_edit->setText(grp.readEntry(CONFIG_STOP , i18n("stop")));
m_ui->volume_edit->setText(grp.readEntry(CONFIG_VOLUME , i18nc("set the sound volume", "volume")));
KSharedConfig::Ptr cfg = KSharedConfig::openConfig(QLatin1String("krunnerrc"));
KConfigGroup grp = cfg->group("Runners");
grp = KConfigGroup(&grp, "Audio Player Control Runner");
- if (!m_ui->searchCollection->isEnabled()) {
- //Another player than Amarok is selected
- grp.writeEntry(CONFIG_COLLECTION, false);
- } else {
- grp.writeEntry(CONFIG_COLLECTION, m_ui->searchCollection->isChecked());
- }
grp.writeEntry(CONFIG_COMMANDS,m_ui->commands->isChecked());
grp.writeEntry(CONFIG_PLAY, m_ui->play_edit->text());
grp.writeEntry(CONFIG_APPEND, m_ui->append_edit->text());
- grp.writeEntry(CONFIG_QUEUE, m_ui->queue_edit->text());
grp.writeEntry(CONFIG_PAUSE, m_ui->pause_edit->text());
grp.writeEntry(CONFIG_STOP, m_ui->stop_edit->text());
grp.writeEntry(CONFIG_PREV, m_ui->prev_edit->text());
grp.writeEntry(CONFIG_NEXT, m_ui->next_edit->text());
- grp.writeEntry(CONFIG_INCREASE, m_ui->up_edit->text());
- grp.writeEntry(CONFIG_INCREASE_BY, m_ui->up_value->value());
- grp.writeEntry(CONFIG_DECREASE, m_ui->down_edit->text());
- grp.writeEntry(CONFIG_DECREASE_BY, m_ui->down_value->value());
- grp.writeEntry(CONFIG_MUTE, m_ui->mute_edit->text());
grp.writeEntry(CONFIG_VOLUME, m_ui->volume_edit->text());
grp.writeEntry(CONFIG_QUIT, m_ui->quit_edit->text());
QString data = m_ui->player_combo->itemData(m_ui->player_combo->findText(
{
KCModule::defaults();
- m_ui->player_combo->setCurrentIndex(m_ui->player_combo->findData(QLatin1String("amarok")));
- m_ui->searchCollection->setChecked(true);
+ m_ui->player_combo->setCurrentIndex(m_ui->player_combo->findData(QLatin1String("vlc")));
m_ui->commands->setChecked(true);
m_ui->play_edit->setText(i18n("Play"));
m_ui->append_edit->setText(i18n("Append"));
- m_ui->queue_edit->setText(i18n("Queue"));
m_ui->pause_edit->setText(i18n("Pause")) ;
m_ui->next_edit->setText(i18n("Next"));
- m_ui->mute_edit->setText(i18n("Mute"));
- m_ui->up_edit->setText(i18n("Increase"));
- m_ui->up_value->setValue(15);
- m_ui->down_edit->setText(i18n("Decrease"));
- m_ui->down_value->setValue(15);
m_ui->prev_edit->setText(i18n("Prev"));
m_ui->stop_edit->setText(i18n("Stop"));
m_ui->volume_edit->setText(i18n("Volume"));
emit changed(true);
}
-
-void AudioPlayerControlRunnerConfig::onPlayerChanged(int index)
-{
- const QString data = m_ui->player_combo->itemData(index).toString();
- if (data != QLatin1String("amarok")) {
- m_ui->searchCollection->setEnabled(false);
- } else {
- m_ui->searchCollection->setEnabled(true);
- }
-}
-
-void AudioPlayerControlRunnerConfig::onPlayerChanged(QString player)
-{
- onPlayerChanged(m_ui->player_combo->findText(player));
-}
<x>0</x>
<y>0</y>
<width>452</width>
- <height>544</height>
+ <height>354</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="KComboBox" name="player_combo">
<property name="toolTip">
- <string>The collection search is only available for Amarok.
-You may add another player. That player has to support the MPRIS specification.</string>
+ <string>You may add another player. That player has to support the MPRISv2 specification.</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
- <widget class="QCheckBox" name="searchCollection">
- <property name="locale">
- <locale language="English" country="UnitedStates"/>
- </property>
- <property name="text">
- <string>Search &collection</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
<widget class="QGroupBox" name="commands">
<property name="locale">
<locale language="English" country="UnitedStates"/>
</layout>
</item>
<item>
- <layout class="QHBoxLayout" name="queue_layout">
- <item>
- <widget class="QLabel" name="queue_label">
- <property name="locale">
- <locale language="English" country="UnitedStates"/>
- </property>
- <property name="text">
- <string>Q&ueue a song:</string>
- </property>
- <property name="buddy">
- <cstring>queue_edit</cstring>
- </property>
- </widget>
- </item>
- <item>
- <widget class="KLineEdit" name="queue_edit">
- <property name="toolTip">
- <string>Use: queue <term> (where <term> matches to artist, title or album)</string>
- </property>
- <property name="locale">
- <locale language="English" country="UnitedStates"/>
- </property>
- <property name="urlDropsEnabled">
- <bool>false</bool>
- </property>
- <property name="showClearButton" stdset="0">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
<layout class="QHBoxLayout" name="pause_layout">
<item>
<widget class="QLabel" name="pause_label">
<widget class="KLineEdit" name="volume_edit">
<property name="toolTip">
<string>The numbers are automatically added at the end:
-Amarok:Volume=10</string>
+Player:Volume=10</string>
</property>
<property name="locale">
<locale language="English" country="UnitedStates"/>
</layout>
</item>
<item>
- <layout class="QHBoxLayout" name="up_layout">
- <item>
- <widget class="QLabel" name="up_label1">
- <property name="locale">
- <locale language="English" country="UnitedStates"/>
- </property>
- <property name="text">
- <string>&Increase volume by</string>
- </property>
- <property name="buddy">
- <cstring>up_value</cstring>
- </property>
- </widget>
- </item>
- <item>
- <widget class="KIntSpinBox" name="up_value">
- <property name="locale">
- <locale language="English" country="UnitedStates"/>
- </property>
- <property name="maximum">
- <number>100</number>
- </property>
- <property name="value">
- <number>0</number>
- </property>
- <property name="base">
- <number>10</number>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="up_label2">
- <property name="locale">
- <locale language="English" country="UnitedStates"/>
- </property>
- <property name="text">
- <string>:</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="KLineEdit" name="up_edit">
- <property name="locale">
- <locale language="English" country="UnitedStates"/>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="urlDropsEnabled">
- <bool>false</bool>
- </property>
- <property name="showClearButton" stdset="0">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <layout class="QHBoxLayout" name="down_layout">
- <item>
- <widget class="QLabel" name="down_label1">
- <property name="locale">
- <locale language="English" country="UnitedStates"/>
- </property>
- <property name="text">
- <string>&Decrease volume by</string>
- </property>
- <property name="buddy">
- <cstring>down_value</cstring>
- </property>
- </widget>
- </item>
- <item>
- <widget class="KIntSpinBox" name="down_value">
- <property name="locale">
- <locale language="English" country="UnitedStates"/>
- </property>
- <property name="maximum">
- <number>100</number>
- </property>
- <property name="value">
- <number>0</number>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="down_label2">
- <property name="locale">
- <locale language="English" country="UnitedStates"/>
- </property>
- <property name="text">
- <string>:</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="KLineEdit" name="down_edit">
- <property name="locale">
- <locale language="English" country="UnitedStates"/>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="urlDropsEnabled">
- <bool>false</bool>
- </property>
- <property name="showClearButton" stdset="0">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <layout class="QHBoxLayout" name="mute_layout">
- <item>
- <widget class="QLabel" name="mute_label">
- <property name="locale">
- <locale language="English" country="UnitedStates"/>
- </property>
- <property name="text">
- <string>&Mute:</string>
- </property>
- <property name="buddy">
- <cstring>mute_edit</cstring>
- </property>
- </widget>
- </item>
- <item>
- <widget class="KLineEdit" name="mute_edit">
- <property name="locale">
- <locale language="English" country="UnitedStates"/>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="urlDropsEnabled">
- <bool>false</bool>
- </property>
- <property name="showClearButton" stdset="0">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
<layout class="QHBoxLayout" name="quit_layout">
<item>
<widget class="QLabel" name="quit_label">
</customwidget>
</customwidgets>
<tabstops>
- <tabstop>searchCollection</tabstop>
<tabstop>commands</tabstop>
<tabstop>play_edit</tabstop>
<tabstop>append_edit</tabstop>
- <tabstop>queue_edit</tabstop>
<tabstop>pause_edit</tabstop>
<tabstop>stop_edit</tabstop>
<tabstop>prev_edit</tabstop>
<tabstop>next_edit</tabstop>
<tabstop>volume_edit</tabstop>
- <tabstop>up_value</tabstop>
- <tabstop>up_edit</tabstop>
- <tabstop>down_value</tabstop>
- <tabstop>down_edit</tabstop>
- <tabstop>mute_edit</tabstop>
<tabstop>quit_edit</tabstop>
</tabstops>
<resources/>
Name[x-test]=xxControl Audio Playerxx
Name[zh_CN]=控制音乐播放器
Name[zh_TW]=控制音效播放器
-Comment=Allows to control MPRIS audio players (it is able to search through Amarok's collection, too)
-Comment[ar]=يسمح بالتحكم بمشغل الصوتيات MPRIS (يمكنه أن يبحث في مجموعة أماروك أيضاً)
-Comment[bs]=Dopušta kontroliranje MPRIS audio plejera (može da traži u Amarokovoj kolekciji, također)
-Comment[ca]=Permet controlar reproductors d'àudio MPRIS (també permet cercar a la col·lecció de l'Amarok)
-Comment[ca@valencia]=Permet controlar reproductors d'àudio MPRIS (també permet cercar a la col·lecció de l'Amarok)
-Comment[cs]=Dovoluje ovládání audio přehrávačů MPRIS (je také možné vyhledávat ve sbírce Amarok)
-Comment[da]=Lader dig betjene MPRIS-lydafspillere (den kan også søge i Amaroks samling)
-Comment[de]=Ermöglicht die Steuerung von MPRIS-Medienspielern (und kann zudem die Sammlung von Amarok durchsuchen)
-Comment[el]=Επιτρέπει τον έλεγχο αναπαραγωγέων ήχου MPRIS (μπορεί να ψάξει στη συλλογή του Amarok, επίσης)
-Comment[en_GB]=Allows to control MPRIS audio players (it is able to search through Amarok's collection, too)
-Comment[es]=Permite controlar reproductores de audio MPRIS (también es capaz de buscar en la colección de Amarok)
-Comment[et]=Võimaldab juhtida MPRIS helifailide mängijaid (ning suudab ka otsida Amaroki kogudes)
-Comment[fi]=Mahdollistaa MPRIS-äänisoitinten hallinnan (myös Amarokin kokoelmista voi etsiä)
-Comment[fr]=Permet de contrôler les lecteurs audio « MPRIS » (également capable de chercher dans les collections d'AmaroK)
-Comment[gl]=Permite controlar reprodutores de son de tipo MPRIS. Tamén pode explorar as coleccións de Amarok.
-Comment[hr]=Omogućuje kontrolu MPRIS-svirača zvuka (također je u mogućnosti pretraživati kolekciju u Amaroku)
-Comment[hu]=Lehetővé teszi az MPRIS zenelejátszók vezérlését, valamint képes keresni az Amarok gyűjteményében is
-Comment[it]=Consente di controllare i lettori audio MPRIS (è in grado di cercare anche nella collezione di Amarok)
-Comment[kk]=MPRIS аудиоплейерлерді басқаруға мүмкіндік береді (ол Amarok-тың жиындардық ақтара алады)
-Comment[km]=អនុញ្ញាតឲ្យត្រួតពិនិត្យកម្មវិធីចាក់អូឌីយ៉ូ MPRIS (វាអាចស្វែងរកតាមរយៈសម្រាំងរបស់ Amarok បានផងដែរ)
-Comment[ko]=MPRIS 오디오 재생기 제어 (Amarok 모음집 검색 기능 포함)
-Comment[lt]=Leidžia valdyti MPRIS audio grotuvus (tai galima ieškoti per Amarok fonetiką taip pat)
-Comment[lv]=Ļauj kontrolēt MPRIS audio atskaņotājus (spēj arī meklēt Amarok kolekcijā)
-Comment[mr]=MPRIS ऑडिओ प्लेयर्स वर नियंत्रण ठेवतो (एमेरोकच्या संग्रहात शोधूही शकतो)
-Comment[nb]=Kan styre MPRIS-lydspillere (det kan også søke gjennom Amaroks samling)
-Comment[nds]=Stüern för MPRIS-Klangafspelers (kann ok Amarok sien Sammeln dörkieken)
-Comment[nl]=Staat toe om MPRIS audiospelers te besturen (kan ook in de verzameling van Amarok zoeken)
-Comment[nn]=Kontroller MPRIS-baserte lydspelarar (òg med støtte for Amarok)
-Comment[pl]=Pozwala sterować odtwarzaczami muzyki MPRIS (możliwe jest również wyszukiwanie w zbiorze Amaroka)
-Comment[pt]=Permite controlar os leitores de áudio MPRIS (também é capaz de percorrer a colecção do Amarok)
-Comment[pt_BR]=Permite controlar os reprodutores de áudio MPRIS (também é capaz de pesquisar a coleção do Amarok)
-Comment[ru]=Позволяет управлять аудиопроигрывателями, совместимыми с MPRIS (поддерживает поиск в коллекции Amarok)
-Comment[sk]=Ovládanie MPRIS audio prehrávačov (je možné tiež hľadať v kolekciách Amaroku)
-Comment[sl]=Omogoča nadzor predvajalnikov zvoka MPRIS (lahko tudi išče po Amarokovih zbirkah)
-Comment[sr]=Управљајте МПРИС аудио плејерима (може да претражује и Амарокову збирку)
-Comment[sr@ijekavian]=Управљајте МПРИС аудио плејерима (може да претражује и Амарокову збирку)
-Comment[sr@ijekavianlatin]=Upravljajte MPRIS audio plejerima (može da pretražuje i Amarokovu zbirku)
-Comment[sr@latin]=Upravljajte MPRIS audio plejerima (može da pretražuje i Amarokovu zbirku)
-Comment[sv]=Gör det möjligt att styra MPRIS-ljudspelare (kan också söka igenom Amaroks samling)
-Comment[th]=ช่วยควบคุมโปรแกรมเล่นเสียง MPRIS (สามารถค้นหาผ่านคลังสื่อของ 'แอมอะร็อก' ได้เช่นกัน)
-Comment[tr]=MPRIS müzik çalarları kontrol etmeyi sağlar (Amarok koleksiyonunda arama yapmayı da sağlar)
-Comment[uk]=Надає змогу керувати аудіопрогравачами стандарту MPRIS (крім того, може здійснювати пошук у збірці Amarok)
-Comment[x-test]=xxAllows to control MPRIS audio players (it is able to search through Amarok's collection, too)xx
-Comment[zh_CN]=让您控制 MPRIS 音乐播放器(还能搜索 Amarok 的收藏)
-Comment[zh_TW]=允許控制 MPRIS 音效播放器(也可以透過 Amarok 的收藏搜尋)
+Comment=Allows to control MPRIS audio player
+Comment[ar]=يسمح بالتحكم بمشغل الصوتيات MPRIS
+Comment[bs]=Dopušta kontroliranje MPRIS audio plejera
+Comment[ca]=Permet controlar reproductors d'àudio MPRIS
+Comment[ca@valencia]=Permet controlar reproductors d'àudio MPRIS
+Comment[cs]=Dovoluje ovládání audio přehrávačů MPRIS
+Comment[da]=Lader dig betjene MPRIS-lydafspillere
+Comment[de]=Ermöglicht die Steuerung von MPRIS-Medienspielern
+Comment[el]=Επιτρέπει τον έλεγχο αναπαραγωγέων ήχου MPRIS
+Comment[en_GB]=Allows to control MPRIS audio players
+Comment[es]=Permite controlar reproductores de audio MPRIS
+Comment[et]=Võimaldab juhtida MPRIS helifailide mängijaid
+Comment[fi]=Mahdollistaa MPRIS-äänisoitinten hallinnan
+Comment[fr]=Permet de contrôler les lecteurs audio « MPRIS »
+Comment[gl]=Permite controlar reprodutores de son de tipo MPRIS
+Comment[hr]=Omogućuje kontrolu MPRIS-svirača zvuka
+Comment[hu]=Lehetővé teszi az MPRIS zenelejátszók vezérlését
+Comment[it]=Consente di controllare i lettori audio MPRIS
+Comment[kk]=MPRIS аудиоплейерлерді басқаруға мүмкіндік береді
+Comment[km]=អនុញ្ញាតឲ្យត្រួតពិនិត្យកម្មវិធីចាក់អូឌីយ៉ូ MPRIS
+Comment[ko]=MPRIS 오디오 재생기 제어
+Comment[lt]=Leidžia valdyti MPRIS audio grotuvus
+Comment[lv]=Ļauj kontrolēt MPRIS audio atskaņotājus
+Comment[mr]=MPRIS ऑडिओ प्लेयर्स वर नियंत्रण ठेवतो
+Comment[nb]=Kan styre MPRIS-lydspillere
+Comment[nds]=Stüern för MPRIS-Klangafspelers
+Comment[nl]=Staat toe om MPRIS audiospelers te besturen
+Comment[nn]=Kontroller MPRIS-baserte lydspelarar
+Comment[pl]=Pozwala sterować odtwarzaczami muzyki MPRIS
+Comment[pt]=Permite controlar os leitores de áudio MPRIS
+Comment[pt_BR]=Permite controlar os reprodutores de áudio MPRIS
+Comment[ru]=Позволяет управлять аудиопроигрывателями, совместимыми с MPRIS
+Comment[sk]=Ovládanie MPRIS audio prehrávačov
+Comment[sl]=Omogoča nadzor predvajalnikov zvoka MPRIS
+Comment[sr]=Управљајте МПРИС аудио плејерима
+Comment[sr@ijekavian]=Управљајте МПРИС аудио плејерима
+Comment[sr@ijekavianlatin]=Upravljajte MPRIS audio plejerima
+Comment[sr@latin]=Upravljajte MPRIS audio plejerima
+Comment[sv]=Gör det möjligt att styra MPRIS-ljudspelare
+Comment[th]=ช่วยควบคุมโปรแกรมเล่นเสียง MPRIS
+Comment[tr]=MPRIS müzik çalarları kontrol etmeyi sağlar
+Comment[uk]=Надає змогу керувати аудіопрогравачами стандарту MPRIS
+Comment[x-test]=xxAllows to control MPRIS audio playersxx
+Comment[zh_CN]=让您控制 MPRIS 音乐播放器
+Comment[zh_TW]=允許控制 MPRIS 音效播放器
X-KDE-ServiceTypes=Plasma/Runner
Type=Service
Icon=applications-multimedia