File indexing completed on 2024-04-14 03:49:05

0001 /*
0002     SPDX-FileCopyrightText: 2007 Frederik Gladhorn <frederik.gladhorn@kdemail.net>
0003     SPDX-FileCopyrightText: 2021 Andreas Cord-Landwehr <cordlandwehr@kde.org>
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "audiowidget.h"
0008 #include <KEduVocDocument>
0009 #include <KEduVocExpression>
0010 #include <QAudioOutput>
0011 #include <QDebug>
0012 #include <QRegularExpression>
0013 
0014 using namespace Editor;
0015 
0016 AudioWidget::AudioWidget(QWidget *parent)
0017     : QWidget(parent)
0018 {
0019     setupUi(this);
0020 
0021     connect(audioUrlRequester, &KUrlRequester::textChanged, this, &AudioWidget::slotAudioFileChanged);
0022     connect(playButton, &QPushButton::clicked, this, &AudioWidget::startPlayback);
0023     connect(recordButton, &QPushButton::clicked, this, &AudioWidget::startRecordAudio);
0024     connect(downloadButton, &QPushButton::clicked, this, &AudioWidget::downloadWebserviceAudio);
0025     connect(&m_player, &QMediaPlayer::playbackStateChanged, this, &AudioWidget::slotPlaybackFinished);
0026     connect(&m_webserviceDownloadWatcher, &QFutureWatcher<bool>::finished, this, &AudioWidget::handleDownloadWebserviceFinished);
0027 
0028     playButton->setEnabled(false);
0029     playButton->setIcon(QIcon::fromTheme(QStringLiteral("media-playback-start")));
0030     recordButton->setVisible(false); // TODO enable when recorder is implemented
0031     recordButton->setIcon(QIcon::fromTheme(QStringLiteral("media-record")));
0032     downloadButton->setEnabled(m_translateShell.isTranslateShellAvailable());
0033 
0034     audioUrlRequester->setEnabled(false);
0035 
0036     m_player.setAudioOutput(new QAudioOutput);
0037 }
0038 
0039 void AudioWidget::setDocument(KEduVocDocument *doc)
0040 {
0041     m_doc = doc;
0042 }
0043 
0044 QString AudioWidget::defaultOutputDirectory() const
0045 {
0046     if (m_doc) {
0047         return m_doc->url().path().remove(".kvtml") + "/media";
0048     } else {
0049         return QString();
0050     }
0051 }
0052 
0053 void AudioWidget::setTranslation(KEduVocExpression *entry, int translation)
0054 {
0055     m_currentTranslation = translation;
0056     m_entry = entry;
0057 
0058     if (m_entry) {
0059         recordButton->setEnabled(true);
0060         audioUrlRequester->setEnabled(true);
0061         audioUrlRequester->setUrl(m_entry->translation(m_currentTranslation)->soundUrl());
0062     } else {
0063         recordButton->setEnabled(false);
0064         audioUrlRequester->setEnabled(false);
0065 
0066         if (m_player.playbackState() == QMediaPlayer::PlayingState) {
0067             playButton->setEnabled(true);
0068         } else {
0069             playButton->setEnabled(false);
0070         }
0071 
0072         audioUrlRequester->clear();
0073     }
0074 }
0075 
0076 void AudioWidget::slotAudioFileChanged(const QString &url)
0077 {
0078     if (m_entry) {
0079         m_entry->translation(m_currentTranslation)->setSoundUrl(QUrl::fromLocalFile(url));
0080     }
0081     playButton->setEnabled(!url.isEmpty());
0082 }
0083 
0084 void AudioWidget::startPlayback()
0085 {
0086     QUrl soundFile = m_entry->translation(m_currentTranslation)->soundUrl();
0087     if (m_player.playbackState() == QMediaPlayer::PlayingState) {
0088         m_player.stop();
0089     }
0090     m_player.setSource(soundFile);
0091     m_player.play();
0092 }
0093 
0094 void AudioWidget::startRecordAudio()
0095 {
0096     /// FIXME: When Phonon gains the ability to record sound, implement me :)
0097 }
0098 
0099 void AudioWidget::slotPlaybackFinished(QMediaPlayer::PlaybackState state)
0100 {
0101     switch (state) {
0102     case QMediaPlayer::StoppedState:
0103         playButton->setIcon(QIcon::fromTheme(QStringLiteral("media-playback-start")));
0104         playButton->setEnabled(!audioUrlRequester->url().isEmpty());
0105         break;
0106 
0107     case QMediaPlayer::PlayingState:
0108         playButton->setIcon(QIcon::fromTheme(QStringLiteral("media-playback-stop")));
0109         playButton->setEnabled(false);
0110         break;
0111 
0112     case QMediaPlayer::PausedState:
0113         playButton->setIcon(QIcon::fromTheme(QStringLiteral("media-playback-start")));
0114         playButton->setEnabled(!audioUrlRequester->url().isEmpty());
0115         break;
0116     }
0117 }
0118 
0119 void AudioWidget::downloadWebserviceAudio()
0120 {
0121     if (!m_entry || !m_doc) {
0122         return;
0123     }
0124 
0125     QDir dir(defaultOutputDirectory());
0126     if (!dir.exists()) {
0127         dir.mkpath(dir.path());
0128     }
0129 
0130     QString soundFileName = m_entry->translation(m_currentTranslation)->soundUrl().toLocalFile();
0131     if (soundFileName.isEmpty()) {
0132         const QString fileName = m_entry->translation(m_currentTranslation)->text().replace(QRegularExpression("[^a-zA-Z\\s]"), QString());
0133         int index{0};
0134         do {
0135             soundFileName = dir.path() + '/' + fileName + '_' + QString::number(index) + ".ts";
0136             ++index;
0137             qDebug() << "test" << soundFileName;
0138         } while (QFile::exists(soundFileName));
0139         m_entry->translation(m_currentTranslation)->setSoundUrl(QUrl::fromLocalFile(soundFileName));
0140     }
0141     QFuture<bool> result = TranslateShellAdapter::downloadSoundFile(m_entry->translation(m_currentTranslation)->text(),
0142                                                                     m_doc->identifier(m_currentTranslation).locale(),
0143                                                                     soundFileName);
0144     m_webserviceDownloadWatcher.setFuture(result);
0145 }
0146 
0147 void AudioWidget::handleDownloadWebserviceFinished()
0148 {
0149     if (!m_entry) {
0150         return;
0151     }
0152     if (QFile::exists(m_entry->translation(m_currentTranslation)->soundUrl().toLocalFile())) {
0153         playButton->setEnabled(true);
0154         playButton->setIcon(QIcon::fromTheme(QStringLiteral("media-playback-start")));
0155         audioUrlRequester->setUrl(m_entry->translation(m_currentTranslation)->soundUrl());
0156     }
0157 }
0158 
0159 #include "moc_audiowidget.cpp"