diff --git a/src/libaudqt/infopopup-qt.cc b/src/libaudqt/infopopup-qt.cc
index a8c6f7ac0..77d9efe7a 100644
--- a/src/libaudqt/infopopup-qt.cc
+++ b/src/libaudqt/infopopup-qt.cc
@@ -18,9 +18,11 @@
  */
 
 #include <libaudcore/audstrings.h>
+#include <libaudcore/drct.h>
 #include <libaudcore/hook.h>
 #include <libaudcore/i18n.h>
 #include <libaudcore/playlist.h>
+#include <libaudcore/runtime.h>
 #include <libaudcore/tuple.h>
 
 #include "libaudqt-internal.h"
@@ -31,6 +33,7 @@
 #include <QLabel>
 #include <QPainter>
 #include <QPointer>
+#include <QProgressBar>
 
 namespace audqt
 {
@@ -43,6 +46,8 @@ public:
 private:
     void add_field(int row, const char * field, const char * value);
     void add_fields(const Tuple & tuple);
+    void add_progress_bar();
+    void update_progress();
     void art_ready(const char * filename);
     void finish_loading();
 
@@ -56,6 +61,7 @@ private:
 
     QHBoxLayout m_hbox;
     QGridLayout m_grid;
+    QProgressBar m_progress;
     bool m_queued = false;
 };
 
@@ -75,6 +81,9 @@ InfoPopup::InfoPopup(const String & filename, const Tuple & tuple)
     m_hbox.addLayout(&m_grid);
 
     add_fields(tuple);
+    add_progress_bar();
+
+    update_progress();
     finish_loading();
 }
 
@@ -124,6 +133,41 @@ void InfoPopup::add_field(int row, const char * field, const char * value)
     m_grid.addWidget(label, row, 1, Qt::AlignLeft | Qt::AlignTop);
 }
 
+void InfoPopup::add_progress_bar()
+{
+    m_grid.addWidget(&m_progress, m_grid.rowCount(), 0, 1, m_grid.columnCount(),
+                     Qt::AlignLeft | Qt::AlignTop);
+
+    auto timer = new Timer<InfoPopup>(TimerRate::Hz4, this,
+                                      &InfoPopup::update_progress);
+    connect(this, &QObject::destroyed, [timer]() { delete timer; });
+    timer->start();
+}
+
+void InfoPopup::update_progress()
+{
+    String filename;
+    int length = 0, time = 0;
+
+    if (aud_drct_get_playing())
+    {
+        filename = aud_drct_get_filename();
+        length = aud_drct_get_length();
+        time = aud_drct_get_time();
+    }
+
+    if (aud_get_bool("filepopup_showprogressbar") && filename &&
+        m_filename && !strcmp(filename, m_filename) && length > 0)
+    {
+        m_progress.setRange(0, length);
+        m_progress.setValue(time);
+        m_progress.setFormat(QString(str_format_time(time)));
+        m_progress.show();
+    }
+    else
+        m_progress.hide();
+}
+
 void InfoPopup::art_ready(const char * filename)
 {
     if (m_queued && strcmp(filename, m_filename) == 0)
