1 /* 2 SPDX-FileCopyrightText: 2010 Joris Guisson <joris.guisson@gmail.com> 3 SPDX-License-Identifier: GPL-2.0-or-later 4 */ 5 6 #include "mediacontroller.h" 7 8 #include <QBoxLayout> 9 #include <QFile> 10 11 #include <KLocalizedString> 12 13 #include "mediaplayer.h" 14 #include <taglib/fileref.h> 15 #include <taglib/tag.h> 16 17 namespace kt 18 { 19 static QString t2q(const TagLib::String &t) 20 { 21 return QString::fromWCharArray((const wchar_t *)t.toCWString(), t.length()); 22 } 23 24 MediaController::MediaController(kt::MediaPlayer *player, KActionCollection *ac, QWidget *parent) 25 : QWidget(parent) 26 { 27 setupUi(this); 28 29 info_label->setText(i18n("Ready to play")); 30 seek_slider->setMediaObject(player->media0bject()); 31 volume->setAudioOutput(player->output()); 32 volume->setOrientation(Qt::Horizontal); 33 34 connect(player, &MediaPlayer::stopped, this, &MediaController::stopped); 35 connect(player, &MediaPlayer::playing, this, &MediaController::playing); 36 37 play->setDefaultAction(ac->action(QStringLiteral("media_play"))); 38 play->setAutoRaise(true); 39 pause->setDefaultAction(ac->action(QStringLiteral("media_pause"))); 40 pause->setAutoRaise(true); 41 stop->setDefaultAction(ac->action(QStringLiteral("media_stop"))); 42 stop->setAutoRaise(true); 43 prev->setDefaultAction(ac->action(QStringLiteral("media_prev"))); 44 prev->setAutoRaise(true); 45 next->setDefaultAction(ac->action(QStringLiteral("media_next"))); 46 next->setAutoRaise(true); 47 48 setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum); 49 } 50 51 MediaController::~MediaController() 52 { 53 } 54 55 void MediaController::playing(const MediaFileRef &file) 56 { 57 if (file.path().isEmpty()) { 58 stopped(); 59 } else { 60 current_file = file; 61 metaDataChanged(); 62 } 63 } 64 65 void MediaController::stopped() 66 { 67 info_label->setText(i18n("Ready to play")); 68 current_file = MediaFileRef(QString()); 69 } 70 71 void MediaController::metaDataChanged() 72 { 73 QString extra_data; 74 QByteArray encoded = QFile::encodeName(current_file.path()); 75 TagLib::FileRef ref(encoded.data(), true, TagLib::AudioProperties::Fast); 76 if (ref.isNull()) { 77 info_label->setText(i18n("Playing: <b>%1</b>", current_file.name())); 78 return; 79 } 80 81 TagLib::Tag *tag = ref.tag(); 82 if (!tag) { 83 info_label->setText(i18n("Playing: <b>%1</b>", current_file.name())); 84 return; 85 } 86 87 QString artist = t2q(tag->artist()); 88 QString title = t2q(tag->title()); 89 QString album = t2q(tag->album()); 90 91 bool has_artist = !artist.isEmpty(); 92 bool has_title = !title.isEmpty(); 93 bool has_album = !album.isEmpty(); 94 95 if (has_artist && has_title && has_album) { 96 extra_data = i18n("<b>%2</b> - <b>%1</b> (Album: <b>%3</b>)", title, artist, album); 97 info_label->setText(extra_data); 98 } else if (has_title && has_artist) { 99 extra_data = i18n("<b>%2</b> - <b>%1</b>", title, artist); 100 info_label->setText(extra_data); 101 } else if (has_title) { 102 extra_data = i18n("<b>%1</b>", title); 103 info_label->setText(extra_data); 104 } else { 105 info_label->setText(i18n("<b>%1</b>", current_file.name())); 106 } 107 } 108 109 } 110