diff --git a/localization/rssguard_en.ts b/localization/rssguard_en.ts
index c20512f8f..6796d6d63 100644
--- a/localization/rssguard_en.ts
+++ b/localization/rssguard_en.ts
@@ -4504,47 +4504,47 @@ Login tokens expiration: %2
-
+
No media
-
+
Loading...
-
+
Media loaded
-
+
Media stalled
-
+
Buffering...
-
+
Loaded
-
+
Ended
-
+
Media is invalid
-
+
Unknown
@@ -7963,12 +7963,12 @@ Unread news: %2
Downloads
-
+
Media player
-
+
Web browser
Web browser
@@ -8497,17 +8497,17 @@ Last login on: %4
-
+
Open link as audio/video
-
+
Open with external tool
-
+
No external tools activated
diff --git a/src/librssguard/core/feeddownloader.cpp b/src/librssguard/core/feeddownloader.cpp
index 2727e8167..e26ec4cef 100644
--- a/src/librssguard/core/feeddownloader.cpp
+++ b/src/librssguard/core/feeddownloader.cpp
@@ -542,8 +542,14 @@ QString FeedDownloadResults::overview(int how_many_feeds) const {
QStringList result;
for (int i = 0, number_items_output = qMin(how_many_feeds, m_updatedFeeds.size()); i < number_items_output; i++) {
- result.append(m_updatedFeeds.keys().at(i)->title() + QSL(": ") +
- QString::number(m_updatedFeeds.value(m_updatedFeeds.keys().at(i)).size()));
+ auto* fd = m_updatedFeeds.keys().at(i);
+ auto msgs = m_updatedFeeds.value(fd);
+
+ if (fd->isQuiet()) {
+ continue;
+ }
+
+ result.append(fd->title() + QSL(": ") + QString::number(msgs.size()));
}
QString res_str = result.join(QSL("\n"));
diff --git a/src/librssguard/gui/notifications/articlelistnotification.cpp b/src/librssguard/gui/notifications/articlelistnotification.cpp
index f87941367..5a5092573 100644
--- a/src/librssguard/gui/notifications/articlelistnotification.cpp
+++ b/src/librssguard/gui/notifications/articlelistnotification.cpp
@@ -83,6 +83,10 @@ void ArticleListNotification::loadResults(const QHash>& ne
});
for (Feed* fd : ks) {
+ if (fd->isQuiet()) {
+ continue;
+ }
+
m_ui.m_cmbFeeds->addItem(fd->sanitizedTitle(), QVariant::fromValue(fd));
}
}
diff --git a/src/librssguard/gui/reusable/mediaplayer.cpp b/src/librssguard/gui/reusable/mediaplayer.cpp
index 5552908c3..5c8f2bd35 100644
--- a/src/librssguard/gui/reusable/mediaplayer.cpp
+++ b/src/librssguard/gui/reusable/mediaplayer.cpp
@@ -17,12 +17,15 @@ MediaPlayer::MediaPlayer(QWidget* parent)
m_ui.setupUi(this);
m_player->setVideoOutput(m_ui.m_video);
+
+#if QT_VERSION_MAJOR == 6
m_player->setAudioOutput(m_audio);
+#endif
setupIcons();
createConnections();
- onPlaybackStateChanged(QMediaPlayer::PlaybackState::StoppedState);
+ onPlaybackStateChanged(QMediaPlayer::PLAYBACK_STATE::StoppedState);
onMediaStatusChanged(QMediaPlayer::MediaStatus::NoMedia);
}
@@ -33,14 +36,24 @@ WebBrowser* MediaPlayer::webBrowser() const {
}
void MediaPlayer::playUrl(const QString& url) {
- setVolume(m_ui.m_slidVolume->value());
+ if (m_muted) {
+ muteUnmute();
+ }
+ else {
+ setVolume(m_ui.m_slidVolume->value());
+ }
+#if QT_VERSION_MAJOR == 6
m_player->setSource(url);
+#else
+ m_player->setMedia(QUrl(url));
+#endif
+
m_player->play();
}
void MediaPlayer::playPause() {
- if (m_player->playbackState() != QMediaPlayer::PlaybackState::PlayingState) {
+ if (m_player->PLAYBACK_STATE_METHOD() != QMediaPlayer::PLAYBACK_STATE::PlayingState) {
m_player->play();
}
else {
@@ -53,7 +66,13 @@ void MediaPlayer::stop() {
}
void MediaPlayer::download() {
- emit urlDownloadRequested(m_player->source());
+ emit urlDownloadRequested(
+#if QT_VERSION_MAJOR == 6
+ m_player->source()
+#else
+ m_player->media().request().url()
+#endif
+ );
}
void MediaPlayer::muteUnmute() {
@@ -64,12 +83,17 @@ void MediaPlayer::muteUnmute() {
}
void MediaPlayer::setVolume(int volume) {
- m_player->audioOutput()->setVolume(volume / 100.0f);
+#if QT_VERSION_MAJOR == 6
+ m_player->audioOutput()->setVolume(convertSliderVolume(volume));
+#else
+ m_player->setVolume(volume);
+#endif
+
m_ui.m_btnVolume->setIcon(volume <= 0 ? m_iconMute : m_iconUnmute);
}
void MediaPlayer::seek(int position) {
- m_player->setPosition(position * 1000);
+ m_player->setPosition(convertSliderProgress(position));
}
void MediaPlayer::onDurationChanged(qint64 duration) {
@@ -95,19 +119,19 @@ void MediaPlayer::onMediaStatusChanged(QMediaPlayer::MediaStatus status) {
m_ui.m_lblStatus->setText(mediaStatusToString(status));
}
-void MediaPlayer::onPlaybackStateChanged(QMediaPlayer::PlaybackState state) {
+void MediaPlayer::onPlaybackStateChanged(QMediaPlayer::PLAYBACK_STATE state) {
switch (state) {
- case QMediaPlayer::StoppedState:
+ case QMediaPlayer::PLAYBACK_STATE::StoppedState:
m_ui.m_btnPlayPause->setIcon(m_iconPlay);
m_ui.m_btnStop->setEnabled(false);
break;
- case QMediaPlayer::PlayingState:
+ case QMediaPlayer::PLAYBACK_STATE::PlayingState:
m_ui.m_btnPlayPause->setIcon(m_iconPause);
m_ui.m_btnStop->setEnabled(true);
break;
- case QMediaPlayer::PausedState:
+ case QMediaPlayer::PLAYBACK_STATE::PausedState:
m_ui.m_btnPlayPause->setIcon(m_iconPlay);
m_ui.m_btnStop->setEnabled(true);
break;
@@ -116,10 +140,14 @@ void MediaPlayer::onPlaybackStateChanged(QMediaPlayer::PlaybackState state) {
void MediaPlayer::onPositionChanged(qint64 position) {
m_ui.m_slidProgress->blockSignals(true);
- m_ui.m_slidProgress->setValue(position / 1000);
+ m_ui.m_slidProgress->setValue(convertToSliderProgress(position));
m_ui.m_slidProgress->blockSignals(false);
}
+int MediaPlayer::convertToSliderProgress(qint64 player_progress) const {
+ return player_progress / 1000;
+}
+
void MediaPlayer::onSeekableChanged(bool seekable) {
m_ui.m_slidProgress->setEnabled(seekable);
@@ -128,6 +156,14 @@ void MediaPlayer::onSeekableChanged(bool seekable) {
}
}
+float MediaPlayer::convertSliderVolume(int slider_volume) const {
+ return slider_volume / 100.0f;
+}
+
+qint64 MediaPlayer::convertSliderProgress(int slider_progress) const {
+ return qint64(slider_progress) * qint64(1000);
+}
+
QString MediaPlayer::mediaStatusToString(QMediaPlayer::MediaStatus status) const {
switch (status) {
case QMediaPlayer::NoMedia:
@@ -171,11 +207,26 @@ void MediaPlayer::setupIcons() {
void MediaPlayer::createConnections() {
connect(m_player, &QMediaPlayer::durationChanged, this, &MediaPlayer::onDurationChanged);
+
+#if QT_VERSION_MAJOR == 6
connect(m_player, &QMediaPlayer::errorOccurred, this, &MediaPlayer::onErrorOccurred);
+#else
+ connect(m_player, QOverload::of(&QMediaPlayer::error), this, [this](QMediaPlayer::Error error) {
+ onErrorOccurred(error);
+ });
+#endif
+
+#if QT_VERSION_MAJOR == 6
connect(m_player, &QMediaPlayer::hasAudioChanged, this, &MediaPlayer::onAudioAvailable);
connect(m_player, &QMediaPlayer::hasVideoChanged, this, &MediaPlayer::onVideoAvailable);
- connect(m_player, &QMediaPlayer::mediaStatusChanged, this, &MediaPlayer::onMediaStatusChanged);
connect(m_player, &QMediaPlayer::playbackStateChanged, this, &MediaPlayer::onPlaybackStateChanged);
+#else
+ connect(m_player, &QMediaPlayer::audioAvailableChanged, this, &MediaPlayer::onAudioAvailable);
+ connect(m_player, &QMediaPlayer::videoAvailableChanged, this, &MediaPlayer::onVideoAvailable);
+ connect(m_player, &QMediaPlayer::stateChanged, this, &MediaPlayer::onPlaybackStateChanged);
+#endif
+
+ connect(m_player, &QMediaPlayer::mediaStatusChanged, this, &MediaPlayer::onMediaStatusChanged);
connect(m_player, &QMediaPlayer::positionChanged, this, &MediaPlayer::onPositionChanged);
connect(m_player, &QMediaPlayer::seekableChanged, this, &MediaPlayer::onSeekableChanged);
diff --git a/src/librssguard/gui/reusable/mediaplayer.h b/src/librssguard/gui/reusable/mediaplayer.h
index c19d531f9..86ac83ae0 100644
--- a/src/librssguard/gui/reusable/mediaplayer.h
+++ b/src/librssguard/gui/reusable/mediaplayer.h
@@ -9,6 +9,14 @@
#include
+#if QT_VERSION_MAJOR == 6
+#define PLAYBACK_STATE PlaybackState
+#define PLAYBACK_STATE_METHOD playbackState
+#else
+#define PLAYBACK_STATE State
+#define PLAYBACK_STATE_METHOD state
+#endif
+
class QAudioOutput;
class MediaPlayer : public TabContent {
@@ -29,7 +37,8 @@ class MediaPlayer : public TabContent {
void download();
void muteUnmute();
- // NOTE: Volume is from 0 to 100.
+ // NOTE: Volume is from 0 to 100 taken directly from slider or
+ // elsewhere.
void setVolume(int volume);
// NOTE: Media is seekable in miliseconds, but that is too muc
@@ -37,11 +46,13 @@ class MediaPlayer : public TabContent {
void seek(int position);
void onDurationChanged(qint64 duration);
- void onErrorOccurred(QMediaPlayer::Error error, const QString& error_string);
+ void onErrorOccurred(QMediaPlayer::Error error, const QString& error_string = {});
void onAudioAvailable(bool available);
void onVideoAvailable(bool available);
void onMediaStatusChanged(QMediaPlayer::MediaStatus status);
- void onPlaybackStateChanged(QMediaPlayer::PlaybackState state);
+
+ void onPlaybackStateChanged(QMediaPlayer::PLAYBACK_STATE state);
+
void onPositionChanged(qint64 position);
void onSeekableChanged(bool seekable);
@@ -49,6 +60,10 @@ class MediaPlayer : public TabContent {
void urlDownloadRequested(const QUrl& url);
private:
+ float convertSliderVolume(int slider_volume) const;
+ qint64 convertSliderProgress(int slider_progress) const;
+ int convertToSliderProgress(qint64 player_progress) const;
+
QString mediaStatusToString(QMediaPlayer::MediaStatus status) const;
void setupIcons();
diff --git a/src/librssguard/gui/tabwidget.cpp b/src/librssguard/gui/tabwidget.cpp
index bce5ec166..c79756c38 100644
--- a/src/librssguard/gui/tabwidget.cpp
+++ b/src/librssguard/gui/tabwidget.cpp
@@ -227,6 +227,11 @@ int TabWidget::addEmptyBrowser() {
int TabWidget::addMediaPlayer(const QString& url, bool make_active) {
auto* player = new MediaPlayer(this);
+ connect(player,
+ &MediaPlayer::urlDownloadRequested,
+ qApp->downloadManager(),
+ QOverload::of(&DownloadManager::download));
+
int index = addTab(player,
qApp->icons()->fromTheme(QSL("player_play"), QSL("media-playback-start")),
tr("Media player"),
diff --git a/src/librssguard/gui/webviewers/webengine/webengineviewer.cpp b/src/librssguard/gui/webviewers/webengine/webengineviewer.cpp
index 866898ef0..513d4f27a 100644
--- a/src/librssguard/gui/webviewers/webengine/webengineviewer.cpp
+++ b/src/librssguard/gui/webviewers/webengine/webengineviewer.cpp
@@ -101,9 +101,11 @@ void WebEngineViewer::contextMenuEvent(QContextMenuEvent* event) {
}
});
- menu->addAction(qApp->icons()->fromTheme(QSL("document-open")), tr("Open link as audio/video"), [link_url]() {
- qApp->mainForm()->tabWidget()->addMediaPlayer(link_url, true);
- });
+ menu->addAction(qApp->icons()->fromTheme(QSL("player_play"), QSL("media-playback-start")),
+ tr("Open link as audio/video"),
+ [link_url]() {
+ qApp->mainForm()->tabWidget()->addMediaPlayer(link_url, true);
+ });
}
if (menu_data.mediaUrl().isValid() || menu_data.linkUrl().isValid()) {