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