]> git.sur5r.net Git - minitube/blobdiff - src/videosourcewidget.cpp
Upload 3.9.3-2 to unstable
[minitube] / src / videosourcewidget.cpp
index 0e39560fbc24ca7906eaca2334bf85797579189b..3cb2ef0345a9aa28a4f78bf645b3ebac5c67e32c 100644 (file)
@@ -19,12 +19,13 @@ along with Minitube.  If not, see <http://www.gnu.org/licenses/>.
 $END_LICENSE */
 
 #include "videosourcewidget.h"
-#include "videosource.h"
-#include "video.h"
 #include "fontutils.h"
-#include "iconutils.h"
 #include "http.h"
 #include "httputils.h"
+#include "iconutils.h"
+#include "variantpromise.h"
+#include "video.h"
+#include "videosource.h"
 
 VideoSourceWidget::VideoSourceWidget(VideoSource *videoSource, QWidget *parent)
     : GridWidget(parent),
@@ -32,9 +33,6 @@ VideoSourceWidget::VideoSourceWidget(VideoSource *videoSource, QWidget *parent)
       lastPixelRatio(0) {
     videoSource->setParent(this);
     setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
-
-    loadPreview();
-
     connect(this, SIGNAL(activated()), SLOT(activate()));
 }
 
@@ -45,17 +43,21 @@ void VideoSourceWidget::activate() {
 void VideoSourceWidget::previewVideo(const QVector<Video *> &videos) {
     videoSource->disconnect();
     if (videos.isEmpty()) {
+        qDebug() << "Unavailable video source" << videoSource->getName();
         emit unavailable(this);
         return;
     }
     Video *video = videos.at(0);
-    lastPixelRatio = window()->devicePixelRatio();
-    bool needLargeThumb = lastPixelRatio > 1.0 || window()->width() > 1000;
-    QString url =  needLargeThumb ? video->getLargeThumbnailUrl() : video->getMediumThumbnailUrl();
-    if (url.isEmpty()) url = video->getMediumThumbnailUrl();
-    video->deleteLater();
-    QObject *reply = HttpUtils::yt().get(url);
-    connect(reply, SIGNAL(data(QByteArray)), SLOT(setPixmapData(QByteArray)));
+    lastPixelRatio = devicePixelRatio();
+
+    video->loadThumb(size(), lastPixelRatio)
+            .then([this](auto variant) { setPixmapData(variant.toByteArray()); })
+            .onFailed([](auto msg) { qDebug() << msg; })
+            .finally([this, videos] {
+                for (auto v : videos)
+                    v->deleteLater();
+                emit previewLoaded();
+            });
 }
 
 void VideoSourceWidget::setPixmapData(const QByteArray &bytes) {
@@ -64,17 +66,25 @@ void VideoSourceWidget::setPixmapData(const QByteArray &bytes) {
     update();
 }
 
-void VideoSourceWidget::loadPreview() {
-    connect(videoSource, SIGNAL(gotVideos(QVector<Video*>)),
-            SLOT(previewVideo(QVector<Video*>)), Qt::UniqueConnection);
+EmptyPromise *VideoSourceWidget::loadPreview() {
+    auto promise = new EmptyPromise(this);
+    connect(this, &VideoSourceWidget::previewLoaded, promise, &EmptyPromise::resolve);
+    connect(this, &VideoSourceWidget::unavailable, promise, [promise] {
+        promise->reject(staticMetaObject.className() + QLatin1String(" unavailable"));
+    });
+
+    connect(videoSource, SIGNAL(gotVideos(QVector<Video *>)), SLOT(previewVideo(QVector<Video *>)),
+            Qt::UniqueConnection);
     videoSource->loadVideos(1, 1);
+
+    return promise;
 }
 
 QPixmap VideoSourceWidget::playPixmap() {
     const int s = height() / 2;
     const int padding = s / 8;
 
-    qreal ratio = window()->devicePixelRatio();
+    qreal ratio = devicePixelRatio();
     QPixmap playIcon = QPixmap(s * ratio, s * ratio);
     playIcon.setDevicePixelRatio(ratio);
     playIcon.fill(Qt::transparent);
@@ -100,8 +110,9 @@ QPixmap VideoSourceWidget::playPixmap() {
 
 void VideoSourceWidget::paintEvent(QPaintEvent *event) {
     GridWidget::paintEvent(event);
+    // if (devicePixelRatio() != lastPixelRatio) loadPreview();
+
     if (pixmap.isNull()) return;
-    if (window()->devicePixelRatio() != lastPixelRatio) loadPreview();
 
     QPainter p(this);
 
@@ -148,7 +159,7 @@ void VideoSourceWidget::paintEvent(QPaintEvent *event) {
     QString name = videoSource->getName();
     bool tooBig = false;
     p.save();
-    p.setFont(FontUtils::medium());
+    p.setFont(FontUtils::big());
     QRect textBox = p.boundingRect(nameBox, Qt::AlignCenter | Qt::TextWordWrap, name);
     if (textBox.height() > nameBox.height()) {
         p.setFont(font());