New Upstream Release - minitube

Ready changes

Summary

Merged new upstream version: 3.9.3 (was: 3.9.1).

Resulting package

Built on 2022-09-29T11:23 (took 36m6s)

The resulting binary packages can be installed (if you have the apt repository enabled) by running one of:

apt install -t fresh-releases minitube-dbgsymapt install -t fresh-releases minitube

Lintian Result

Diff

diff --git a/debian/changelog b/debian/changelog
index 9a0f1b8..3a5defa 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+minitube (3.9.3-1) UNRELEASED; urgency=low
+
+  * New upstream release.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Thu, 29 Sep 2022 10:48:58 -0000
+
 minitube (3.9.1-1) unstable; urgency=medium
 
   * New upstream version 3.9.1
diff --git a/debian/patches/disable-update-check b/debian/patches/disable-update-check
index f3b8c09..659e62a 100644
--- a/debian/patches/disable-update-check
+++ b/debian/patches/disable-update-check
@@ -1,8 +1,10 @@
 Description: Disable update check as it's useless for a packaged version
 Author: Jakob Haufe <sur5r@debian.org>
 
---- minitube-3.8.1.orig/lib/updater/updater.pri
-+++ minitube-3.8.1/lib/updater/updater.pri
+Index: minitube/lib/updater/updater.pri
+===================================================================
+--- minitube.orig/lib/updater/updater.pri
++++ minitube/lib/updater/updater.pri
 @@ -1,4 +1,4 @@
 -DEFINES *= UPDATER
 +#DEFINES *= UPDATER
diff --git a/debian/patches/proper-tempfiles b/debian/patches/proper-tempfiles
index 2f5d44d..6c0e9a2 100644
--- a/debian/patches/proper-tempfiles
+++ b/debian/patches/proper-tempfiles
@@ -5,10 +5,10 @@ Description: Do proper temporary file creation
 Author: Jakob Haufe <sur5r@sur5r.net>
 Bug-Debian: http://bugs.debian.org/644935
 
-diff --git a/src/temporary.cpp b/src/temporary.cpp
-index 2bf7fcd..0561ecb 100644
---- a/src/temporary.cpp
-+++ b/src/temporary.cpp
+Index: minitube/src/temporary.cpp
+===================================================================
+--- minitube.orig/src/temporary.cpp
++++ minitube/src/temporary.cpp
 @@ -21,52 +21,27 @@ $END_LICENSE */
  #include "temporary.h"
  #include "constants.h"
@@ -73,10 +73,10 @@ index 2bf7fcd..0561ecb 100644
 +        delete tempfile;
      }
  }
-diff --git a/src/temporary.h b/src/temporary.h
-index de5e24d..b8fbba9 100644
---- a/src/temporary.h
-+++ b/src/temporary.h
+Index: minitube/src/temporary.h
+===================================================================
+--- minitube.orig/src/temporary.h
++++ minitube/src/temporary.h
 @@ -23,6 +23,7 @@ $END_LICENSE */
  
  #include <QtCore>
diff --git a/lib/http/.git b/lib/http/.git
new file mode 100644
index 0000000..d38a031
--- /dev/null
+++ b/lib/http/.git
@@ -0,0 +1 @@
+gitdir: ../../.git/modules/lib/http
diff --git a/lib/idle/.git b/lib/idle/.git
new file mode 100644
index 0000000..bfcd99f
--- /dev/null
+++ b/lib/idle/.git
@@ -0,0 +1 @@
+gitdir: ../../.git/modules/lib/idle
diff --git a/lib/js/.git b/lib/js/.git
new file mode 100644
index 0000000..ce9d765
--- /dev/null
+++ b/lib/js/.git
@@ -0,0 +1 @@
+gitdir: ../../.git/modules/lib/js
diff --git a/lib/js/js.cpp b/lib/js/js.cpp
index 8840064..0da5c79 100644
--- a/lib/js/js.cpp
+++ b/lib/js/js.cpp
@@ -1,6 +1,7 @@
 #include "js.h"
 
 #include "cachedhttp.h"
+#include "jsvm.h"
 
 namespace {
 Http &cachedHttp() {
@@ -55,8 +56,6 @@ JSResult &JS::callFunction(JSResult *result, const QString &name, const QJSValue
         return *result;
     }
 
-    resetNAM();
-
     auto function = engine->evaluate(name);
     if (!function.isCallable()) {
         qWarning() << function.toString() << " is not callable";
@@ -116,6 +115,9 @@ void JS::initialize() {
     checkError(setTimeoutWrapperFunction);
     engine->globalObject().setProperty("clearTimeout", timer.property("clearTimeout"));
 
+    QJSValue vm = engine->newQObject(new JSVM(engine));
+    engine->globalObject().setProperty("runInContextQt", vm.property("runInContext"));
+
     connect(cachedHttp().get(url), &HttpReply::finished, this, [this](auto &reply) {
         if (!reply.isSuccessful()) {
             emit initFailed("Cannot load JS");
@@ -126,6 +128,7 @@ void JS::initialize() {
         auto value = engine->evaluate(reply.body());
         if (!checkError(value)) {
             qDebug() << "Initialized";
+            resetNAM();
             ready = true;
             emit initialized();
         }
diff --git a/lib/js/js.pri b/lib/js/js.pri
index 62baf7f..d0584e9 100644
--- a/lib/js/js.pri
+++ b/lib/js/js.pri
@@ -6,9 +6,11 @@ QT *= qml
 HEADERS += \
     $$PWD/js.h \
     $$PWD/jsnamfactory.h \
-    $$PWD/jsresult.h
+    $$PWD/jsresult.h \
+    $$PWD/jsvm.h
 
 SOURCES += \
     $$PWD/js.cpp \
     $$PWD/jsnamfactory.cpp \
-    $$PWD/jsresult.cpp
+    $$PWD/jsresult.cpp \
+    $$PWD/jsvm.cpp
diff --git a/lib/js/jsvm.cpp b/lib/js/jsvm.cpp
new file mode 100644
index 0000000..8d70be1
--- /dev/null
+++ b/lib/js/jsvm.cpp
@@ -0,0 +1,20 @@
+#include "jsvm.h"
+
+JSVM::JSVM(QQmlEngine *parent) : QObject{parent}, parentEngine(parent) {}
+
+QJSValue JSVM::runInContext(QString code, QJSValue props) {
+    auto engine = QQmlEngine(this);
+
+    auto objectKeysFunction = parentEngine->evaluate("Object.keys");
+    auto keys = objectKeysFunction.call({props});
+    const int keyLength = keys.property("length").toInt();
+    for (int i = 0; i < keyLength; ++i) {
+        auto key = keys.property(i).toString();
+        auto value = props.property(key).toString();
+        qDebug() << "Setting property" << key << value;
+        engine.globalObject().setProperty(key, value);
+    }
+
+    auto res = engine.evaluate(code).toString();
+    return parentEngine->toScriptValue(res);
+}
diff --git a/lib/js/jsvm.h b/lib/js/jsvm.h
new file mode 100644
index 0000000..a522bd5
--- /dev/null
+++ b/lib/js/jsvm.h
@@ -0,0 +1,18 @@
+#ifndef JSVM_H
+#define JSVM_H
+
+#include <QtCore>
+#include <QtQml>
+
+class JSVM : public QObject {
+    Q_OBJECT
+public:
+    explicit JSVM(QQmlEngine *parent);
+
+    Q_INVOKABLE QJSValue runInContext(QString code, QJSValue props);
+
+private:
+    QQmlEngine *parentEngine;
+};
+
+#endif // JSVM_H
diff --git a/lib/media/.git b/lib/media/.git
new file mode 100644
index 0000000..13211a6
--- /dev/null
+++ b/lib/media/.git
@@ -0,0 +1 @@
+gitdir: ../../.git/modules/lib/media
diff --git a/lib/media/src/mpv/mediampv.cpp b/lib/media/src/mpv/mediampv.cpp
index 8a548b7..4cad49d 100644
--- a/lib/media/src/mpv/mediampv.cpp
+++ b/lib/media/src/mpv/mediampv.cpp
@@ -86,6 +86,7 @@ MediaMPV::MediaMPV(QObject *parent) : Media(parent), widget(nullptr) {
     mpv_observe_property(mpv, 0, "volume", MPV_FORMAT_DOUBLE);
     mpv_observe_property(mpv, 0, "mute", MPV_FORMAT_FLAG);
     mpv_observe_property(mpv, 0, "pause", MPV_FORMAT_FLAG);
+    mpv_observe_property(mpv, 0, "paused-for-cache", MPV_FORMAT_FLAG);
 }
 
 // This slot is invoked by wakeup() (through the mpvEvents signal).
@@ -200,6 +201,13 @@ void MediaMPV::handleMpvEvent(mpv_event *event) {
             }
         }
 
+        else if (strcmp(prop->name, "paused-for-cache") == 0) {
+            if (prop->format == MPV_FORMAT_FLAG) {
+                int pausedForCache = *(int *)prop->data;
+                setState(pausedForCache == 1 ? Media::BufferingState : Media::PlayingState);
+            }
+        }
+
         break;
     }
 
diff --git a/lib/promises/.git b/lib/promises/.git
new file mode 100644
index 0000000..080d5d1
--- /dev/null
+++ b/lib/promises/.git
@@ -0,0 +1 @@
+gitdir: ../../.git/modules/lib/promises
diff --git a/lib/updater/.git b/lib/updater/.git
new file mode 100644
index 0000000..81cae77
--- /dev/null
+++ b/lib/updater/.git
@@ -0,0 +1 @@
+gitdir: ../../.git/modules/lib/updater
diff --git a/locale/ar.ts b/locale/ar.ts
index 6fe886c..3a0326a 100644
--- a/locale/ar.ts
+++ b/locale/ar.ts
@@ -27,7 +27,7 @@
     </message>
     <message>
         <source>Powered by %1</source>
-        <translation type="unfinished"/>
+        <translation>بدعم من %1</translation>
     </message>
     <message>
         <source>Open-source software</source>
@@ -107,7 +107,7 @@
     </message>
     <message numerus="yes">
         <source>You have %n new video(s)</source>
-        <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+        <translation><numerusform>You have %n new video(s)</numerusform><numerusform>You have %n new video(s)</numerusform><numerusform>You have %n new video(s)</numerusform><numerusform>You have %n new video(s)</numerusform><numerusform>You have %n new video(s)</numerusform><numerusform>لديك %n فيديو جديد</numerusform></translation>
     </message>
 </context>
 <context>
@@ -192,11 +192,11 @@
     </message>
     <message numerus="yes">
         <source>%n day(s) ago</source>
-        <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+        <translation><numerusform>%n يوم مضى</numerusform><numerusform>%n يوم مضى</numerusform><numerusform>%n يوم مضى</numerusform><numerusform>%n يوم مضى</numerusform><numerusform>%n يوم مضى</numerusform><numerusform>%n يوم مضى</numerusform></translation>
     </message>
     <message numerus="yes">
         <source>%n month(s) ago</source>
-        <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+        <translation><numerusform>%n شهر مضى</numerusform><numerusform>%n شهر مضى</numerusform><numerusform>%n شهر مضى</numerusform><numerusform>%n شهر مضى</numerusform><numerusform>%n شهر مضى</numerusform><numerusform>%n شهر مضى</numerusform></translation>
     </message>
     <message>
         <source>K</source>
@@ -219,11 +219,11 @@
     </message>
     <message numerus="yes">
         <source>%n week(s) ago</source>
-        <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+        <translation><numerusform>%n اسبوع مضى</numerusform><numerusform>%n اسبوع مضى</numerusform><numerusform>%n اسبوع مضى</numerusform><numerusform>%n اسبوع مضى</numerusform><numerusform>%n اسبوع مضى</numerusform><numerusform>%n اسبوع مضى</numerusform></translation>
     </message>
     <message numerus="yes">
         <source>%n year(s) ago</source>
-        <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+        <translation><numerusform>%n سنة مضت</numerusform><numerusform>%n سنة مضت</numerusform><numerusform>%n سنة مضت</numerusform><numerusform>%n سنة مضت</numerusform><numerusform>%n سنة مضت</numerusform><numerusform>%n سنة مضت</numerusform></translation>
     </message>
 </context>
 <context>
@@ -277,7 +277,7 @@
     </message>
     <message numerus="yes">
         <source>%n Download(s)</source>
-        <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+        <translation><numerusform>%n تحميل</numerusform><numerusform>%n تحميل</numerusform><numerusform>%n تحميل</numerusform><numerusform>%n تحميل</numerusform><numerusform>%n تحميل</numerusform><numerusform>%n تحميل</numerusform></translation>
     </message>
 </context>
 <context>
@@ -674,7 +674,7 @@
     </message>
     <message>
         <source>Menu</source>
-        <translation type="unfinished"/>
+        <translation>قائمة</translation>
     </message>
     <message>
         <source>&amp;Love %1? Rate it!</source>
@@ -1038,7 +1038,7 @@
     </message>
     <message>
         <source>This year</source>
-        <translation type="unfinished"/>
+        <translation>هذه السنة</translation>
     </message>
     <message>
         <source>HD</source>
@@ -1171,19 +1171,19 @@
     </message>
     <message>
         <source>Music</source>
-        <translation type="unfinished"/>
+        <translation>موسيقى</translation>
     </message>
     <message>
         <source>News</source>
-        <translation type="unfinished"/>
+        <translation>الأخبار</translation>
     </message>
     <message>
         <source>Movies</source>
-        <translation type="unfinished"/>
+        <translation>الأفلام</translation>
     </message>
     <message>
         <source>Gaming</source>
-        <translation type="unfinished"/>
+        <translation>الألعاب</translation>
     </message>
 </context>
 <context>
@@ -1225,7 +1225,7 @@
     </message>
     <message>
         <source>Download Update</source>
-        <translation type="unfinished"/>
+        <translation>تحميل التحديث</translation>
     </message>
     <message>
         <source>Downloading update...</source>
@@ -1241,7 +1241,7 @@
     </message>
     <message>
         <source>Version %1 is available.</source>
-        <translation type="unfinished"/>
+        <translation>الإصدار %1 متوفر.</translation>
     </message>
     <message>
         <source>An update has been downloaded and is ready to be installed.</source>
@@ -1492,7 +1492,7 @@
     </message>
     <message>
         <source>Download Update</source>
-        <translation type="unfinished"/>
+        <translation>تحميل التحديث</translation>
     </message>
 </context>
 </TS>
\ No newline at end of file
diff --git a/locale/da.ts b/locale/da.ts
index c55af31..eba1e5a 100644
--- a/locale/da.ts
+++ b/locale/da.ts
@@ -27,11 +27,11 @@
     </message>
     <message>
         <source>Powered by %1</source>
-        <translation type="unfinished"/>
+        <translation>Styrket af 1%</translation>
     </message>
     <message>
         <source>Open-source software</source>
-        <translation type="unfinished"/>
+        <translation>Åben-Kildekode software</translation>
     </message>
     <message>
         <source>Icon designed by %1.</source>
diff --git a/locale/gl.ts b/locale/gl.ts
index 88f99ae..657521b 100644
--- a/locale/gl.ts
+++ b/locale/gl.ts
@@ -1,4 +1,4 @@
-<?xml version="1.0" ?><!DOCTYPE TS><TS language="gl" version="2.1">
+<?xml version="1.0" ?><!DOCTYPE TS><TS version="2.1" language="gl">
 <context>
     <name>AboutView</name>
     <message>
@@ -223,7 +223,7 @@
     </message>
     <message numerus="yes">
         <source>%n year(s) ago</source>
-        <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+        <translation><numerusform>%n ano(s) atrás</numerusform><numerusform>%n ano(s) atrás</numerusform></translation>
     </message>
 </context>
 <context>
@@ -852,15 +852,15 @@
     </message>
     <message>
         <source>Rewind %1 seconds</source>
-        <translation type="unfinished"/>
+        <translation>Rebobina %1 segundos</translation>
     </message>
     <message>
         <source>Fast forward %1 seconds</source>
-        <translation type="unfinished"/>
+        <translation>Avanzar %1 segundos</translation>
     </message>
     <message>
         <source>channel</source>
-        <translation type="unfinished"/>
+        <translation>canle</translation>
     </message>
 </context>
 <context>
@@ -1038,19 +1038,19 @@
     </message>
     <message>
         <source>This year</source>
-        <translation type="unfinished"/>
+        <translation>Este ano</translation>
     </message>
     <message>
         <source>HD</source>
-        <translation type="unfinished"/>
+        <translation>HD</translation>
     </message>
     <message>
         <source>4K</source>
-        <translation type="unfinished"/>
+        <translation>4K</translation>
     </message>
     <message>
         <source>HDR</source>
-        <translation type="unfinished"/>
+        <translation>HDR</translation>
     </message>
 </context>
 <context>
@@ -1099,19 +1099,19 @@
     </message>
     <message>
         <source>Remove</source>
-        <translation type="unfinished"/>
+        <translation>Eliminar</translation>
     </message>
     <message>
         <source>Need a remote control for %1? Try %2!</source>
-        <translation type="unfinished"/>
+        <translation>Necesitas un control remoto para %1? Proba %2!</translation>
     </message>
     <message>
         <source>I keep improving %1 to make it the best I can. Support this work!</source>
-        <translation type="unfinished"/>
+        <translation>Sigo mellorando %1 para que sexa o mellor posible. Apoia este traballo!</translation>
     </message>
     <message>
         <source>An update is ready to be installed. Quit and install update.</source>
-        <translation type="unfinished"/>
+        <translation>Hai unha actualización para ser instalada. Saia e instale a actualización.</translation>
     </message>
 </context>
 <context>
@@ -1167,23 +1167,23 @@
     </message>
     <message>
         <source>Trending</source>
-        <translation type="unfinished"/>
+        <translation>Tendencia</translation>
     </message>
     <message>
         <source>Music</source>
-        <translation type="unfinished"/>
+        <translation>Música</translation>
     </message>
     <message>
         <source>News</source>
-        <translation type="unfinished"/>
+        <translation>Noticias</translation>
     </message>
     <message>
         <source>Movies</source>
-        <translation type="unfinished"/>
+        <translation>Películas</translation>
     </message>
     <message>
         <source>Gaming</source>
-        <translation type="unfinished"/>
+        <translation>Xogos</translation>
     </message>
 </context>
 <context>
@@ -1201,31 +1201,31 @@
     <name>Updater</name>
     <message>
         <source>Check for Updates...</source>
-        <translation type="unfinished"/>
+        <translation>Buscando actualizacións...</translation>
     </message>
     <message>
         <source>Version %1 is available...</source>
-        <translation type="unfinished"/>
+        <translation>Está dispoñible a versión %1...</translation>
     </message>
     <message>
         <source>Downloading version %1...</source>
-        <translation type="unfinished"/>
+        <translation>Baixando a versión %1...</translation>
     </message>
     <message>
         <source>Restart to Update</source>
-        <translation type="unfinished"/>
+        <translation>Reiniciar para actualizar</translation>
     </message>
     <message>
         <source>Version %1 download failed</source>
-        <translation type="unfinished"/>
+        <translation>Erro ao baixar a versión %1</translation>
     </message>
     <message>
         <source>Check for Updates</source>
-        <translation type="unfinished"/>
+        <translation>Buscar actualizacións</translation>
     </message>
     <message>
         <source>Download Update</source>
-        <translation type="unfinished"/>
+        <translation>Baixar actualización</translation>
     </message>
     <message>
         <source>Downloading update...</source>
@@ -1233,19 +1233,19 @@
     </message>
     <message>
         <source>Retry Update Download</source>
-        <translation type="unfinished"/>
+        <translation>Volver a intentar baixar a actualización</translation>
     </message>
     <message>
         <source>You have the latest version.</source>
-        <translation type="unfinished"/>
+        <translation>Xa tes a última versión.</translation>
     </message>
     <message>
         <source>Version %1 is available.</source>
-        <translation type="unfinished"/>
+        <translation>Está dispoñible a versión %1.</translation>
     </message>
     <message>
         <source>An update has been downloaded and is ready to be installed.</source>
-        <translation type="unfinished"/>
+        <translation>Baixouse unha actualización e está listo para que se instale.</translation>
     </message>
 </context>
 <context>
@@ -1461,18 +1461,18 @@
     <name>updater::DefaultUpdater</name>
     <message>
         <source>There are currently no updates available.</source>
-        <translation type="unfinished"/>
+        <translation>Non hai actualmente actualizacións dispoñibles.</translation>
     </message>
 </context>
 <context>
     <name>updater::Dialog</name>
     <message>
         <source>You already have the latest version</source>
-        <translation type="unfinished"/>
+        <translation>Xa tes a última versión</translation>
     </message>
     <message>
         <source>Downloading %1 %2...</source>
-        <translation type="unfinished"/>
+        <translation>Baixando %1 %2...</translation>
     </message>
     <message>
         <source>A new version of %1 is available!</source>
@@ -1492,7 +1492,7 @@
     </message>
     <message>
         <source>Download Update</source>
-        <translation type="unfinished"/>
+        <translation>Baixar actualización</translation>
     </message>
 </context>
 </TS>
\ No newline at end of file
diff --git a/locale/id.ts b/locale/id.ts
index ce3ee9c..7f2ee97 100644
--- a/locale/id.ts
+++ b/locale/id.ts
@@ -27,11 +27,11 @@
     </message>
     <message>
         <source>Powered by %1</source>
-        <translation type="unfinished"/>
+        <translation>Ditenagai oleh %1</translation>
     </message>
     <message>
         <source>Open-source software</source>
-        <translation type="unfinished"/>
+        <translation>Peranti lunak sumber terbuka</translation>
     </message>
     <message>
         <source>Icon designed by %1.</source>
diff --git a/locale/pt_BR.ts b/locale/pt_BR.ts
index 3cb23d5..bd50391 100644
--- a/locale/pt_BR.ts
+++ b/locale/pt_BR.ts
@@ -223,7 +223,7 @@
     </message>
     <message numerus="yes">
         <source>%n year(s) ago</source>
-        <translation><numerusform>%n ano atrás</numerusform><numerusform>%n anos atrás</numerusform></translation>
+        <translation><numerusform>%n ano atrás</numerusform><numerusform>%n ano(s) atrás</numerusform></translation>
     </message>
 </context>
 <context>
@@ -1213,7 +1213,7 @@
     </message>
     <message>
         <source>Restart to Update</source>
-        <translation>Reiniciar para atualizar</translation>
+        <translation>Reiniciar para Atualizar</translation>
     </message>
     <message>
         <source>Version %1 download failed</source>
@@ -1221,7 +1221,7 @@
     </message>
     <message>
         <source>Check for Updates</source>
-        <translation>Verificar se há atualizações</translation>
+        <translation>Verificar se há Atualizações</translation>
     </message>
     <message>
         <source>Download Update</source>
diff --git a/locale/ru.ts b/locale/ru.ts
index 93fc4f9..7954b01 100644
--- a/locale/ru.ts
+++ b/locale/ru.ts
@@ -1,4 +1,4 @@
-<?xml version="1.0" ?><!DOCTYPE TS><TS language="ru" version="2.1">
+<?xml version="1.0" ?><!DOCTYPE TS><TS version="2.1" language="ru">
 <context>
     <name>AboutView</name>
     <message>
@@ -224,7 +224,7 @@
     </message>
     <message numerus="yes">
         <source>%n year(s) ago</source>
-        <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+        <translation><numerusform>%n год назад</numerusform><numerusform>%n лет назад</numerusform><numerusform>%n лет назад</numerusform><numerusform>%n лет назад</numerusform></translation>
     </message>
 </context>
 <context>
@@ -278,7 +278,7 @@
     </message>
     <message numerus="yes">
         <source>%n Download(s)</source>
-        <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+        <translation><numerusform>Скачано %n раз</numerusform><numerusform>Скачано %n раз</numerusform><numerusform>Скачано %n раз</numerusform><numerusform>Скачано %n раз</numerusform></translation>
     </message>
 </context>
 <context>
@@ -861,7 +861,7 @@
     </message>
     <message>
         <source>channel</source>
-        <translation type="unfinished"/>
+        <translation>канал</translation>
     </message>
 </context>
 <context>
@@ -1039,19 +1039,19 @@
     </message>
     <message>
         <source>This year</source>
-        <translation type="unfinished"/>
+        <translation>В этом году</translation>
     </message>
     <message>
         <source>HD</source>
-        <translation type="unfinished"/>
+        <translation>HD</translation>
     </message>
     <message>
         <source>4K</source>
-        <translation type="unfinished"/>
+        <translation>4K</translation>
     </message>
     <message>
         <source>HDR</source>
-        <translation type="unfinished"/>
+        <translation>HDR</translation>
     </message>
 </context>
 <context>
@@ -1100,19 +1100,19 @@
     </message>
     <message>
         <source>Remove</source>
-        <translation type="unfinished"/>
+        <translation>Убрать</translation>
     </message>
     <message>
         <source>Need a remote control for %1? Try %2!</source>
-        <translation type="unfinished"/>
+        <translation>Нужен пульт для %1? Попробуйте %2!</translation>
     </message>
     <message>
         <source>I keep improving %1 to make it the best I can. Support this work!</source>
-        <translation type="unfinished"/>
+        <translation>Я буду улучшать %1 , чтобы достичь лучшего результата. Поддержите работу!</translation>
     </message>
     <message>
         <source>An update is ready to be installed. Quit and install update.</source>
-        <translation type="unfinished"/>
+        <translation>Обновление готово для установки. Выйдите и установите обновление.</translation>
     </message>
 </context>
 <context>
@@ -1168,23 +1168,23 @@
     </message>
     <message>
         <source>Trending</source>
-        <translation type="unfinished"/>
+        <translation>Популярное</translation>
     </message>
     <message>
         <source>Music</source>
-        <translation type="unfinished"/>
+        <translation>Музыка</translation>
     </message>
     <message>
         <source>News</source>
-        <translation type="unfinished"/>
+        <translation>Новости</translation>
     </message>
     <message>
         <source>Movies</source>
-        <translation type="unfinished"/>
+        <translation>Фильмы</translation>
     </message>
     <message>
         <source>Gaming</source>
-        <translation type="unfinished"/>
+        <translation>Игры</translation>
     </message>
 </context>
 <context>
@@ -1202,31 +1202,31 @@
     <name>Updater</name>
     <message>
         <source>Check for Updates...</source>
-        <translation type="unfinished"/>
+        <translation>Проверить обновления...</translation>
     </message>
     <message>
         <source>Version %1 is available...</source>
-        <translation type="unfinished"/>
+        <translation>Доступна версия %1 </translation>
     </message>
     <message>
         <source>Downloading version %1...</source>
-        <translation type="unfinished"/>
+        <translation>Качаю версию %1...</translation>
     </message>
     <message>
         <source>Restart to Update</source>
-        <translation type="unfinished"/>
+        <translation>Перезапуск для обновления</translation>
     </message>
     <message>
         <source>Version %1 download failed</source>
-        <translation type="unfinished"/>
+        <translation>Загрузка версии %1 сорвалась</translation>
     </message>
     <message>
         <source>Check for Updates</source>
-        <translation type="unfinished"/>
+        <translation>Проверить обновления</translation>
     </message>
     <message>
         <source>Download Update</source>
-        <translation type="unfinished"/>
+        <translation>Скачать обновление</translation>
     </message>
     <message>
         <source>Downloading update...</source>
@@ -1234,19 +1234,19 @@
     </message>
     <message>
         <source>Retry Update Download</source>
-        <translation type="unfinished"/>
+        <translation>Попытаться скачать обновление заново</translation>
     </message>
     <message>
         <source>You have the latest version.</source>
-        <translation type="unfinished"/>
+        <translation>У вас последняя версия.</translation>
     </message>
     <message>
         <source>Version %1 is available.</source>
-        <translation type="unfinished"/>
+        <translation>Доступна версия %1 </translation>
     </message>
     <message>
         <source>An update has been downloaded and is ready to be installed.</source>
-        <translation type="unfinished"/>
+        <translation>Обновление было загружено и готово к установке.</translation>
     </message>
 </context>
 <context>
@@ -1462,18 +1462,18 @@
     <name>updater::DefaultUpdater</name>
     <message>
         <source>There are currently no updates available.</source>
-        <translation type="unfinished"/>
+        <translation>Нет новых обновлений.</translation>
     </message>
 </context>
 <context>
     <name>updater::Dialog</name>
     <message>
         <source>You already have the latest version</source>
-        <translation type="unfinished"/>
+        <translation>У вас уже последняя версия</translation>
     </message>
     <message>
         <source>Downloading %1 %2...</source>
-        <translation type="unfinished"/>
+        <translation>Загружается %1 %2...</translation>
     </message>
     <message>
         <source>A new version of %1 is available!</source>
@@ -1493,7 +1493,7 @@
     </message>
     <message>
         <source>Download Update</source>
-        <translation type="unfinished"/>
+        <translation>Скачать обновление</translation>
     </message>
 </context>
 </TS>
\ No newline at end of file
diff --git a/locale/uk.ts b/locale/uk.ts
index 41591c5..39c4f25 100644
--- a/locale/uk.ts
+++ b/locale/uk.ts
@@ -671,7 +671,7 @@
     </message>
     <message>
         <source>Toggle &amp;Menu Bar</source>
-        <translation type="unfinished"/>
+        <translation>Приховати &amp;Menu Bar</translation>
     </message>
     <message>
         <source>Menu</source>
@@ -791,7 +791,7 @@
     </message>
     <message>
         <source>You can still access the menu bar by pressing the ALT key</source>
-        <translation type="unfinished"/>
+        <translation>Відкрити меню можна натисканням ALT</translation>
     </message>
 </context>
 <context>
diff --git a/locale/uk_UA.ts b/locale/uk_UA.ts
index 79a6639..4f0b305 100644
--- a/locale/uk_UA.ts
+++ b/locale/uk_UA.ts
@@ -19,7 +19,7 @@
     </message>
     <message>
         <source>Please &lt;a href=&apos;%1&apos;&gt;donate&lt;/a&gt; to support the continued development of %2.</source>
-        <translation>Будь ласка, &lt;a href=&apos;%1&apos;&gt;внесіть пожертву,&lt;/a&gt; аби підтримати подальший розвиток %2.</translation>
+        <translation>Будь ласка, &lt;a href=&apos;%1&apos;&gt;внесіть пожертву&lt;/a&gt;, щоб підтримати подальший розвиток %2.</translation>
     </message>
     <message>
         <source>Translate %1 to your native language using %2</source>
@@ -27,11 +27,11 @@
     </message>
     <message>
         <source>Powered by %1</source>
-        <translation type="unfinished"/>
+        <translation>За допомогою %1</translation>
     </message>
     <message>
         <source>Open-source software</source>
-        <translation type="unfinished"/>
+        <translation>ПЗ із відкритим джерельним кодом</translation>
     </message>
     <message>
         <source>Icon designed by %1.</source>
@@ -74,11 +74,11 @@
     </message>
     <message>
         <source>The full version allows you to watch videos without interruptions.</source>
-        <translation>Повна версія дозволяє дивитися видиво без перерв.</translation>
+        <translation>Повна версія дозволяє дивитися відео без перерв.</translation>
     </message>
     <message>
         <source>By purchasing the full version, you will also support the hard work I put into creating %1.</source>
-        <translation>При купівлі повної версії, Ви, також, надаєте підтримку важкій роботі, яка була задіяна під час створення %1.</translation>
+        <translation>Купуючи повну версію Ви також підтримуєте важку працю внесену в створення %1.</translation>
     </message>
     <message>
         <source>Use Demo</source>
@@ -97,7 +97,7 @@
     <name>AppWidget</name>
     <message>
         <source>Download</source>
-        <translation type="unfinished"/>
+        <translation>Завантажити</translation>
     </message>
 </context>
 <context>
@@ -108,18 +108,18 @@
     </message>
     <message numerus="yes">
         <source>You have %n new video(s)</source>
-        <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+        <translation><numerusform>У Вас %n нове відео</numerusform><numerusform>У Вас %n нових відео</numerusform><numerusform>У Вас %n нових відео</numerusform><numerusform>У Вас %n нових відео</numerusform></translation>
     </message>
 </context>
 <context>
     <name>ChannelItemDelegate</name>
     <message>
         <source>All Videos</source>
-        <translation>Усі видива</translation>
+        <translation>Усі відео</translation>
     </message>
     <message>
         <source>Unwatched Videos</source>
-        <translation>Не переглянуті видива</translation>
+        <translation>Не переглянуті відео</translation>
     </message>
 </context>
 <context>
@@ -142,11 +142,11 @@
     </message>
     <message>
         <source>Most Watched</source>
-        <translation>Найбільш переглядаюче</translation>
+        <translation>Найбільш переглядувані</translation>
     </message>
     <message>
         <source>Sort by</source>
-        <translation>Сортувати за</translation>
+        <translation>Ґатункувати за</translation>
     </message>
     <message>
         <source>Mark all as watched</source>
@@ -158,15 +158,15 @@
     </message>
     <message>
         <source>You have no subscriptions. Use the star symbol to subscribe to channels.</source>
-        <translation>У Вас немає підписок. Використовуйте символ зірочки, аби підписуватися на канали.</translation>
+        <translation>У Вас нема підписок. Використовуйте символ зірочки, щоб підписуватися на канали.</translation>
     </message>
     <message>
         <source>All Videos</source>
-        <translation>Усі видива</translation>
+        <translation>Усі відео</translation>
     </message>
     <message>
         <source>Unwatched Videos</source>
-        <translation>Не переглянуті видива</translation>
+        <translation>Не переглянуті відео</translation>
     </message>
     <message>
         <source>Mark as Watched</source>
@@ -178,41 +178,41 @@
     </message>
     <message>
         <source>There are no updated subscriptions at this time.</source>
-        <translation>Наразі оновлень підписок немає.</translation>
+        <translation>Наразі оновлень підписок нема.</translation>
     </message>
 </context>
 <context>
     <name>DataUtils</name>
     <message>
         <source>Just now</source>
-        <translation>Тільки що</translation>
+        <translation>Тільки-но</translation>
     </message>
     <message numerus="yes">
         <source>%n hour(s) ago</source>
-        <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+        <translation><numerusform>%n год. тому</numerusform><numerusform>%n год. тому</numerusform><numerusform>%n год. тому</numerusform><numerusform>%n год. тому</numerusform></translation>
     </message>
     <message numerus="yes">
         <source>%n day(s) ago</source>
-        <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+        <translation><numerusform>%n день тому</numerusform><numerusform>%n дні тому</numerusform><numerusform>%n днів тому</numerusform><numerusform>%n днів тому</numerusform></translation>
     </message>
     <message numerus="yes">
         <source>%n month(s) ago</source>
-        <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+        <translation><numerusform>%n місяць тому</numerusform><numerusform>%n місяці тому</numerusform><numerusform>%n місяців тому</numerusform><numerusform>%n місяців тому</numerusform></translation>
     </message>
     <message>
         <source>K</source>
         <comment>K as in Kilo, i.e. thousands</comment>
-        <translation type="unfinished"/>
+        <translation>Тис</translation>
     </message>
     <message>
         <source>M</source>
         <comment>M stands for Millions</comment>
-        <translation type="unfinished"/>
+        <translation>Млн</translation>
     </message>
     <message>
         <source>B</source>
         <comment>B stands for Billions</comment>
-        <translation type="unfinished"/>
+        <translation>Млрд</translation>
     </message>
     <message>
         <source>%1 views</source>
@@ -220,11 +220,11 @@
     </message>
     <message numerus="yes">
         <source>%n week(s) ago</source>
-        <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+        <translation><numerusform>%n тиждень тому</numerusform><numerusform>%n тижні тому</numerusform><numerusform>%n тижнів тому</numerusform><numerusform>%n тижнів тому</numerusform></translation>
     </message>
     <message numerus="yes">
         <source>%n year(s) ago</source>
-        <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+        <translation><numerusform>%n рік тому</numerusform><numerusform>%n роки тому</numerusform><numerusform>%n років тому</numerusform><numerusform>%n років тому</numerusform></translation>
     </message>
 </context>
 <context>
@@ -278,7 +278,7 @@
     </message>
     <message numerus="yes">
         <source>%n Download(s)</source>
-        <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+        <translation><numerusform>%n Завантаження</numerusform><numerusform>%n Завантаження</numerusform><numerusform>%n Завантажень</numerusform><numerusform>%n Завантажень</numerusform></translation>
     </message>
 </context>
 <context>
@@ -315,7 +315,7 @@
     <name>Extra</name>
     <message>
         <source>The executable file has been tempered with, maybe by a virus.</source>
-        <translation>Виконуваний файл було пошкоджено, може бути, вірус.</translation>
+        <translation>Виконуваний файл було пошкоджено, можливо вірусом.</translation>
     </message>
     <message>
         <source>%1 will not run. Try installing again.</source>
@@ -354,11 +354,11 @@
     </message>
     <message>
         <source>Next track</source>
-        <translation>Наступний трек</translation>
+        <translation>Наступна доріжка</translation>
     </message>
     <message>
         <source>Previous track</source>
-        <translation>Попередній трек</translation>
+        <translation>Попередня доріжка</translation>
     </message>
     <message>
         <source>Increase volume</source>
@@ -389,7 +389,7 @@
     </message>
     <message>
         <source>Find videos and channels by keyword</source>
-        <translation>Знайти видива та канали за ключовими словами</translation>
+        <translation>Знайти відео та канали за ключовими словами</translation>
     </message>
     <message>
         <source>Browse</source>
@@ -397,7 +397,7 @@
     </message>
     <message>
         <source>Browse videos by category</source>
-        <translation>Оглянути видива за катеґоріями</translation>
+        <translation>Оглянути відео за катеґоріями</translation>
     </message>
     <message>
         <source>Subscriptions</source>
@@ -443,7 +443,7 @@
     </message>
     <message>
         <source>Go back to the previous track</source>
-        <translation>Повернутися до попереднього треку</translation>
+        <translation>Повернутися до попередньої доріжки</translation>
     </message>
     <message>
         <source>S&amp;kip</source>
@@ -451,7 +451,7 @@
     </message>
     <message>
         <source>Skip to the next video</source>
-        <translation>Перейти до наступного видива</translation>
+        <translation>Перейти до наступного відео</translation>
     </message>
     <message>
         <source>&amp;Play</source>
@@ -475,7 +475,7 @@
     </message>
     <message>
         <source>Hide the playlist and the toolbar</source>
-        <translation>Сховати перелік та панель інструментів</translation>
+        <translation>Сховати перелік та панель знарядь</translation>
     </message>
     <message>
         <source>Open the &amp;YouTube Page</source>
@@ -483,7 +483,7 @@
     </message>
     <message>
         <source>Go to the YouTube video page and pause playback</source>
-        <translation>Відкрити сторінку YouTube та призупинити відтворення видива</translation>
+        <translation>Відкрити сторінку YouTube та призупинити відтворення відео</translation>
     </message>
     <message>
         <source>Copy the YouTube &amp;Link</source>
@@ -491,23 +491,23 @@
     </message>
     <message>
         <source>Copy the current video YouTube link to the clipboard</source>
-        <translation>Скопіювати YouTube посилання поточного видива до буферу</translation>
+        <translation>Скопіювати YouTube-посилання поточного відео до буферу</translation>
     </message>
     <message>
         <source>Copy the Video Stream &amp;URL</source>
-        <translation>Копіювати посилання на ви&amp;диво потік</translation>
+        <translation>Копіювати посилання на ві&amp;деопотік</translation>
     </message>
     <message>
         <source>Copy the current video stream URL to the clipboard</source>
-        <translation>Скопіювати посилання поточного видива до буферу</translation>
+        <translation>Скопіювати посилання поточного відео до буферу</translation>
     </message>
     <message>
         <source>Find Video &amp;Parts</source>
-        <translation>Знайти &amp;фраґменти видива</translation>
+        <translation>Знайти &amp;фрагменти відео</translation>
     </message>
     <message>
         <source>Find other video parts hopefully in the right order</source>
-        <translation>Знайти інші частини видива, сподіваюся, у правильному порядку</translation>
+        <translation>Знайти инші частини відео, сподіваюсь, у правильному порядку</translation>
     </message>
     <message>
         <source>&amp;Remove</source>
@@ -515,7 +515,7 @@
     </message>
     <message>
         <source>Remove the selected videos from the playlist</source>
-        <translation>Вилучити обрані видива з переліку</translation>
+        <translation>Вилучити вибрані відео з грайлиста</translation>
     </message>
     <message>
         <source>Move &amp;Up</source>
@@ -523,7 +523,7 @@
     </message>
     <message>
         <source>Move up the selected videos in the playlist</source>
-        <translation>Перемістити обране видиво догори у переліку</translation>
+        <translation>Перемістити вибране відео догори у грайлисті</translation>
     </message>
     <message>
         <source>Move &amp;Down</source>
@@ -531,7 +531,7 @@
     </message>
     <message>
         <source>Move down the selected videos in the playlist</source>
-        <translation>Перемістити обране видиво донизу в переліку</translation>
+        <translation>Перемістити вибране відео донизу в грайлисті</translation>
     </message>
     <message>
         <source>&amp;Clear Recent Searches</source>
@@ -539,7 +539,7 @@
     </message>
     <message>
         <source>Clear the search history. Cannot be undone.</source>
-        <translation>Очистити історію пошуку (зміни незворотні).</translation>
+        <translation>Очистити дієпис пошуку (зміни незворотні).</translation>
     </message>
     <message>
         <source>&amp;Quit</source>
@@ -551,7 +551,7 @@
     </message>
     <message>
         <source>&amp;Website</source>
-        <translation>&amp;Веб-сайт</translation>
+        <translation>&amp;Вебсайт</translation>
     </message>
     <message>
         <source>%1 on the Web</source>
@@ -587,7 +587,7 @@
     </message>
     <message>
         <source>Manually start playing videos</source>
-        <translation>Почати відтворення видива самотужки</translation>
+        <translation>Почати відтворення відео самотужки</translation>
     </message>
     <message>
         <source>&amp;Downloads</source>
@@ -595,7 +595,7 @@
     </message>
     <message>
         <source>Show details about video downloads</source>
-        <translation>Показати деталі про видива, що завантажуються</translation>
+        <translation>Показати деталі про завантажувані відео</translation>
     </message>
     <message>
         <source>&amp;Download</source>
@@ -603,7 +603,7 @@
     </message>
     <message>
         <source>Download the current video</source>
-        <translation>Завантажити це видиво</translation>
+        <translation>Завантажити це відео</translation>
     </message>
     <message>
         <source>Take &amp;Snapshot</source>
@@ -615,7 +615,7 @@
     </message>
     <message>
         <source>Share the current video using %1</source>
-        <translation>Поділитися поточним видивом за допомогою %1</translation>
+        <translation>Поділитися поточним відео за допомогою %1</translation>
     </message>
     <message>
         <source>&amp;Email</source>
@@ -635,7 +635,7 @@
     </message>
     <message>
         <source>&amp;Stop After This Video</source>
-        <translation>Зу&amp;пинити після цього видиво</translation>
+        <translation>Зу&amp;пинити після цього відео</translation>
     </message>
     <message>
         <source>&amp;Report an Issue...</source>
@@ -651,11 +651,11 @@
     </message>
     <message>
         <source>&amp;Related Videos</source>
-        <translation>Схо&amp;жі видива</translation>
+        <translation>Схо&amp;жі відео</translation>
     </message>
     <message>
         <source>Watch videos related to the current one</source>
-        <translation>Дивитися видива, пов’язані з поточним</translation>
+        <translation>Дивитися відео, пов’язані з поточним</translation>
     </message>
     <message>
         <source>Open in &amp;Browser...</source>
@@ -663,19 +663,19 @@
     </message>
     <message>
         <source>Restricted Mode</source>
-        <translation type="unfinished"/>
+        <translation>Безпечний режим</translation>
     </message>
     <message>
         <source>Hide videos that may contain inappropriate content</source>
-        <translation type="unfinished"/>
+        <translation>Сховати відео, які можуть містити невідповідний вміст</translation>
     </message>
     <message>
         <source>Toggle &amp;Menu Bar</source>
-        <translation type="unfinished"/>
+        <translation>Приховати &amp;Меню</translation>
     </message>
     <message>
         <source>Menu</source>
-        <translation type="unfinished"/>
+        <translation>Меню</translation>
     </message>
     <message>
         <source>&amp;Love %1? Rate it!</source>
@@ -695,11 +695,11 @@
     </message>
     <message>
         <source>&amp;Playlist</source>
-        <translation>&amp;Перелік відтворення</translation>
+        <translation>&amp;Грайлист</translation>
     </message>
     <message>
         <source>&amp;Video</source>
-        <translation>&amp;Видиво</translation>
+        <translation>&amp;Відео</translation>
     </message>
     <message>
         <source>&amp;Share</source>
@@ -715,7 +715,7 @@
     </message>
     <message>
         <source>Press %1 to raise the volume, %2 to lower it</source>
-        <translation>Натисніть %1, аби приглушити гучність, та %2, щоб її відновити</translation>
+        <translation>Натисніть %1, аби приглушити гучність, і %2, щоб її відновити</translation>
     </message>
     <message>
         <source>Choose your content location</source>
@@ -731,7 +731,7 @@
     </message>
     <message>
         <source>If you close %1 now, this download will be cancelled.</source>
-        <translation>Якщо закрити %1 негайно, усі завантаження буде скасовано.</translation>
+        <translation>Якщо закрити %1 негайно, всі завантаження буде скасовано.</translation>
     </message>
     <message>
         <source>Close and cancel download</source>
@@ -779,7 +779,7 @@
     </message>
     <message>
         <source>Maximum video definition set to %1</source>
-        <translation>Режим чіткості видива %1</translation>
+        <translation>Режим чіткости відео %1</translation>
     </message>
     <message>
         <source>Your privacy is now safe</source>
@@ -791,22 +791,22 @@
     </message>
     <message>
         <source>You can still access the menu bar by pressing the ALT key</source>
-        <translation type="unfinished"/>
+        <translation>Відкрити меню можна натисканням ALT</translation>
     </message>
 </context>
 <context>
     <name>MediaView</name>
     <message>
         <source>You can now paste the YouTube link into another application</source>
-        <translation>Тепер Ви можете використовувати YouTube посилання на видиво у зовнішній проґрамі</translation>
+        <translation>Тепер Ви можете використовувати YouTube-посилання на відео у зовнішній проґрамі</translation>
     </message>
     <message>
         <source>You can now paste the video stream URL into another application</source>
-        <translation>Тепер Ви можете використовувати посилання на видиво у зовнішній проґрамі</translation>
+        <translation>Тепер Ви можете використовувати посилання на відео у зовнішній проґрамі</translation>
     </message>
     <message>
         <source>The link will be valid only for a limited time.</source>
-        <translation>Посилання буде дійсне лише протягом обмеженого часу.</translation>
+        <translation>Посилання буде дійсне лише впродовж обмеженого часу.</translation>
     </message>
     <message>
         <source>Downloading %1</source>
@@ -841,7 +841,7 @@
     </message>
     <message>
         <source>Switched to %1</source>
-        <translation type="unfinished"/>
+        <translation>Перемикнутися на %1</translation>
     </message>
     <message>
         <source>Unsubscribed from %1</source>
@@ -861,7 +861,7 @@
     </message>
     <message>
         <source>channel</source>
-        <translation type="unfinished"/>
+        <translation>канал</translation>
     </message>
 </context>
 <context>
@@ -902,7 +902,7 @@
     <name>PickMessage</name>
     <message>
         <source>Pick a video</source>
-        <translation type="unfinished"/>
+        <translation>Оберіть відео</translation>
     </message>
 </context>
 <context>
@@ -937,11 +937,11 @@
     </message>
     <message>
         <source>Open parent folder</source>
-        <translation>Перейти до теки з видивами</translation>
+        <translation>Перейти до теки з відео</translation>
     </message>
     <message>
         <source>Restart downloading</source>
-        <translation>Завантажити заново</translation>
+        <translation>Перезапустити завантаження</translation>
     </message>
 </context>
 <context>
@@ -956,14 +956,14 @@
     </message>
     <message>
         <source>No more videos</source>
-        <translation>Більше немає</translation>
+        <translation>Більше нема</translation>
     </message>
 </context>
 <context>
     <name>RefineSearchWidget</name>
     <message>
         <source>Sort by</source>
-        <translation>Сортувати за</translation>
+        <translation>Ґатункувати за</translation>
     </message>
     <message>
         <source>Relevance</source>
@@ -1039,19 +1039,19 @@
     </message>
     <message>
         <source>This year</source>
-        <translation type="unfinished"/>
+        <translation>Цього року</translation>
     </message>
     <message>
         <source>HD</source>
-        <translation type="unfinished"/>
+        <translation>HD</translation>
     </message>
     <message>
         <source>4K</source>
-        <translation type="unfinished"/>
+        <translation>4K</translation>
     </message>
     <message>
         <source>HDR</source>
-        <translation type="unfinished"/>
+        <translation>HDR</translation>
     </message>
 </context>
 <context>
@@ -1100,19 +1100,19 @@
     </message>
     <message>
         <source>Remove</source>
-        <translation type="unfinished"/>
+        <translation>Вилучити</translation>
     </message>
     <message>
         <source>Need a remote control for %1? Try %2!</source>
-        <translation type="unfinished"/>
+        <translation>Потрібен пульт дистанційного керування для %1? Спробуйте %2!</translation>
     </message>
     <message>
         <source>I keep improving %1 to make it the best I can. Support this work!</source>
-        <translation type="unfinished"/>
+        <translation>Я постійно вдосконалюю %1, щоб зробити це якнайкраще. Підтримайте цю роботу!</translation>
     </message>
     <message>
         <source>An update is ready to be installed. Quit and install update.</source>
-        <translation type="unfinished"/>
+        <translation>Оновлення готове до встановлення. Закрийте та встановіть оновлення.</translation>
     </message>
 </context>
 <context>
@@ -1123,7 +1123,7 @@
     </message>
     <message>
         <source>&amp;Forward</source>
-        <translation type="unfinished"/>
+        <translation>&amp;Уперед</translation>
     </message>
     <message>
         <source>Forward to %1</source>
@@ -1168,23 +1168,23 @@
     </message>
     <message>
         <source>Trending</source>
-        <translation type="unfinished"/>
+        <translation>Тенденція</translation>
     </message>
     <message>
         <source>Music</source>
-        <translation type="unfinished"/>
+        <translation>Музика</translation>
     </message>
     <message>
         <source>News</source>
-        <translation type="unfinished"/>
+        <translation>Новини</translation>
     </message>
     <message>
         <source>Movies</source>
-        <translation type="unfinished"/>
+        <translation>Фільми</translation>
     </message>
     <message>
         <source>Gaming</source>
-        <translation type="unfinished"/>
+        <translation>Ігри</translation>
     </message>
 </context>
 <context>
@@ -1195,38 +1195,38 @@
     </message>
     <message>
         <source>Downloading %1...</source>
-        <translation type="unfinished"/>
+        <translation>Завантаження %1...</translation>
     </message>
 </context>
 <context>
     <name>Updater</name>
     <message>
         <source>Check for Updates...</source>
-        <translation type="unfinished"/>
+        <translation>Перевірити наявність оновлень...</translation>
     </message>
     <message>
         <source>Version %1 is available...</source>
-        <translation type="unfinished"/>
+        <translation>Доступна версія %1 ...</translation>
     </message>
     <message>
         <source>Downloading version %1...</source>
-        <translation type="unfinished"/>
+        <translation>Завантаження версії %1...</translation>
     </message>
     <message>
         <source>Restart to Update</source>
-        <translation type="unfinished"/>
+        <translation>Перезапустити оновлення</translation>
     </message>
     <message>
         <source>Version %1 download failed</source>
-        <translation type="unfinished"/>
+        <translation>Не вдалося завантажити версію %1</translation>
     </message>
     <message>
         <source>Check for Updates</source>
-        <translation type="unfinished"/>
+        <translation>Перевірити наявність оновлень</translation>
     </message>
     <message>
         <source>Download Update</source>
-        <translation type="unfinished"/>
+        <translation>Завантажити оновлення</translation>
     </message>
     <message>
         <source>Downloading update...</source>
@@ -1234,37 +1234,37 @@
     </message>
     <message>
         <source>Retry Update Download</source>
-        <translation type="unfinished"/>
+        <translation>Повторити спробу завантаження оновлення</translation>
     </message>
     <message>
         <source>You have the latest version.</source>
-        <translation type="unfinished"/>
+        <translation>У вас остання версія.</translation>
     </message>
     <message>
         <source>Version %1 is available.</source>
-        <translation type="unfinished"/>
+        <translation>Доступна версія %1.</translation>
     </message>
     <message>
         <source>An update has been downloaded and is ready to be installed.</source>
-        <translation type="unfinished"/>
+        <translation>Оновлення завантажено та готове до встановлення.</translation>
     </message>
 </context>
 <context>
     <name>YTJSVideo</name>
     <message>
         <source>Cannot get video stream for %1</source>
-        <translation>Не вдалося отримати видивопотік для %1</translation>
+        <translation>Не вдалось отримати відеопотік для %1</translation>
     </message>
 </context>
 <context>
     <name>YTRegions</name>
     <message>
         <source>Algeria</source>
-        <translation>Алжир</translation>
+        <translation>Алжір</translation>
     </message>
     <message>
         <source>Argentina</source>
-        <translation>Аргентина</translation>
+        <translation>Арґентина</translation>
     </message>
     <message>
         <source>Australia</source>
@@ -1392,7 +1392,7 @@
     </message>
     <message>
         <source>Russia</source>
-        <translation>Російська Федерація</translation>
+        <translation>Московія</translation>
     </message>
     <message>
         <source>Saudi Arabia</source>
@@ -1412,7 +1412,7 @@
     </message>
     <message>
         <source>Spain</source>
-        <translation>Іспанія</translation>
+        <translation>Еспанія</translation>
     </message>
     <message>
         <source>Sweden</source>
@@ -1440,7 +1440,7 @@
     </message>
     <message>
         <source>United Kingdom</source>
-        <translation>Великобританія</translation>
+        <translation>Велика Британія</translation>
     </message>
     <message>
         <source>Yemen</source>
@@ -1455,25 +1455,25 @@
     <name>YTVideo</name>
     <message>
         <source>Cannot get video stream for %1</source>
-        <translation>Не вдалося отримати видивопотік для %1</translation>
+        <translation>Не вдалось отримати відеопотік для %1</translation>
     </message>
 </context>
 <context>
     <name>updater::DefaultUpdater</name>
     <message>
         <source>There are currently no updates available.</source>
-        <translation type="unfinished"/>
+        <translation>Наразі оновлень нема.</translation>
     </message>
 </context>
 <context>
     <name>updater::Dialog</name>
     <message>
         <source>You already have the latest version</source>
-        <translation type="unfinished"/>
+        <translation>У вас вже є остання версія</translation>
     </message>
     <message>
         <source>Downloading %1 %2...</source>
-        <translation type="unfinished"/>
+        <translation>Завантаження %1 %2...</translation>
     </message>
     <message>
         <source>A new version of %1 is available!</source>
@@ -1493,7 +1493,7 @@
     </message>
     <message>
         <source>Download Update</source>
-        <translation type="unfinished"/>
+        <translation>Завантажити оновлення</translation>
     </message>
 </context>
 </TS>
\ No newline at end of file
diff --git a/locale/zh_CN.ts b/locale/zh_CN.ts
index 9c8a76c..4176c7b 100644
--- a/locale/zh_CN.ts
+++ b/locale/zh_CN.ts
@@ -223,7 +223,7 @@
     </message>
     <message numerus="yes">
         <source>%n year(s) ago</source>
-        <translation type="unfinished"><numerusform></numerusform></translation>
+        <translation><numerusform>%n 年前</numerusform></translation>
     </message>
 </context>
 <context>
@@ -1038,19 +1038,19 @@
     </message>
     <message>
         <source>This year</source>
-        <translation type="unfinished"/>
+        <translation>今年</translation>
     </message>
     <message>
         <source>HD</source>
-        <translation type="unfinished"/>
+        <translation>HD</translation>
     </message>
     <message>
         <source>4K</source>
-        <translation type="unfinished"/>
+        <translation>4K</translation>
     </message>
     <message>
         <source>HDR</source>
-        <translation type="unfinished"/>
+        <translation>HDR</translation>
     </message>
 </context>
 <context>
@@ -1111,7 +1111,7 @@
     </message>
     <message>
         <source>An update is ready to be installed. Quit and install update.</source>
-        <translation type="unfinished"/>
+        <translation>更新已准备好,退出并安装更新</translation>
     </message>
 </context>
 <context>
@@ -1167,23 +1167,23 @@
     </message>
     <message>
         <source>Trending</source>
-        <translation type="unfinished"/>
+        <translation>趋势</translation>
     </message>
     <message>
         <source>Music</source>
-        <translation type="unfinished"/>
+        <translation>音乐</translation>
     </message>
     <message>
         <source>News</source>
-        <translation type="unfinished"/>
+        <translation>新闻</translation>
     </message>
     <message>
         <source>Movies</source>
-        <translation type="unfinished"/>
+        <translation>电影</translation>
     </message>
     <message>
         <source>Gaming</source>
-        <translation type="unfinished"/>
+        <translation>游戏</translation>
     </message>
 </context>
 <context>
@@ -1201,31 +1201,31 @@
     <name>Updater</name>
     <message>
         <source>Check for Updates...</source>
-        <translation type="unfinished"/>
+        <translation>查检更新</translation>
     </message>
     <message>
         <source>Version %1 is available...</source>
-        <translation type="unfinished"/>
+        <translation>版本 %1 可用</translation>
     </message>
     <message>
         <source>Downloading version %1...</source>
-        <translation type="unfinished"/>
+        <translation>下载版本 %1...</translation>
     </message>
     <message>
         <source>Restart to Update</source>
-        <translation type="unfinished"/>
+        <translation>重启开始更新</translation>
     </message>
     <message>
         <source>Version %1 download failed</source>
-        <translation type="unfinished"/>
+        <translation>版本 %1 下载失败</translation>
     </message>
     <message>
         <source>Check for Updates</source>
-        <translation type="unfinished"/>
+        <translation>查检更新</translation>
     </message>
     <message>
         <source>Download Update</source>
-        <translation type="unfinished"/>
+        <translation>下载更新</translation>
     </message>
     <message>
         <source>Downloading update...</source>
@@ -1233,19 +1233,19 @@
     </message>
     <message>
         <source>Retry Update Download</source>
-        <translation type="unfinished"/>
+        <translation>重试下载更新</translation>
     </message>
     <message>
         <source>You have the latest version.</source>
-        <translation type="unfinished"/>
+        <translation>已是最新版本</translation>
     </message>
     <message>
         <source>Version %1 is available.</source>
-        <translation type="unfinished"/>
+        <translation>版本 %1 可用</translation>
     </message>
     <message>
         <source>An update has been downloaded and is ready to be installed.</source>
-        <translation type="unfinished"/>
+        <translation>更新下载,准备更新</translation>
     </message>
 </context>
 <context>
@@ -1461,18 +1461,18 @@
     <name>updater::DefaultUpdater</name>
     <message>
         <source>There are currently no updates available.</source>
-        <translation type="unfinished"/>
+        <translation>当前没有更新可用</translation>
     </message>
 </context>
 <context>
     <name>updater::Dialog</name>
     <message>
         <source>You already have the latest version</source>
-        <translation type="unfinished"/>
+        <translation>已是最新版本</translation>
     </message>
     <message>
         <source>Downloading %1 %2...</source>
-        <translation type="unfinished"/>
+        <translation>已下载 %1 %2...</translation>
     </message>
     <message>
         <source>A new version of %1 is available!</source>
@@ -1492,7 +1492,7 @@
     </message>
     <message>
         <source>Download Update</source>
-        <translation type="unfinished"/>
+        <translation>下载更新</translation>
     </message>
 </context>
 </TS>
\ No newline at end of file
diff --git a/minitube.pro b/minitube.pro
index 71420f3..646dd4e 100644
--- a/minitube.pro
+++ b/minitube.pro
@@ -1,7 +1,7 @@
 CONFIG += c++17 exceptions_off rtti_off object_parallel_to_source
 
 TEMPLATE = app
-VERSION = 3.9.1
+VERSION = 3.9.3
 DEFINES += APP_VERSION="$$VERSION"
 
 APP_NAME = Minitube
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 610c0d1..e4f09c6 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -171,7 +171,7 @@ MainWindow::MainWindow()
     } else if (VideoAPI::impl() == VideoAPI::YT3) {
         YT3::instance().initApiKeys();
     } else if (VideoAPI::impl() == VideoAPI::JS) {
-        JS::instance().initialize(QUrl(QLatin1String(Constants::WEBSITE) + "-ws/bundle2.js"));
+        JS::instance().initialize(QUrl(QLatin1String(Constants::WEBSITE) + "-ws/bundle3.js"));
         // JS::instance().initialize(QUrl("http://localhost:8000/bundle-test.js"));
         Invidious::instance().initServers();
     }
diff --git a/src/standardfeedsview.cpp b/src/standardfeedsview.cpp
index 2fb697d..4c23365 100644
--- a/src/standardfeedsview.cpp
+++ b/src/standardfeedsview.cpp
@@ -82,6 +82,19 @@ void StandardFeedsView::load() {
     QAction *regionAction = MainWindow::instance()->getRegionAction();
     regionAction->setText(region.name);
     regionAction->setIcon(YTRegions::iconForRegionId(region.id));
+
+    loadNextPreview();
+}
+
+void StandardFeedsView::loadNextPreview(VideoSourceWidget *previous) {
+    int index = 0;
+    if (previous) {
+        index = sourceWidgets.indexOf(previous);
+        index++;
+        if (index == sourceWidgets.length() || index < 0) return;
+    }
+    auto w = sourceWidgets.at(index);
+    w->loadPreview()->finally([this, w] { loadNextPreview(w); });
 }
 
 void StandardFeedsView::layoutCategories(const QVector<YTCategory> &categories) {
@@ -106,6 +119,9 @@ void StandardFeedsView::addVideoSourceWidget(VideoSource *videoSource) {
     int i = layout->count();
     const int cols = VideoAPI::impl() == VideoAPI::YT3 ? 5 : 2;
     layout->addWidget(w, i / cols, i % cols);
+
+    connect(w, &QObject::destroyed, this, [this, w] { sourceWidgets.removeOne(w); });
+    sourceWidgets << w;
 }
 
 void StandardFeedsView::removeVideoSourceWidget(VideoSourceWidget *videoSourceWidget) {
diff --git a/src/standardfeedsview.h b/src/standardfeedsview.h
index aa07c0c..1070cab 100644
--- a/src/standardfeedsview.h
+++ b/src/standardfeedsview.h
@@ -56,9 +56,12 @@ private slots:
 private:
     void resetLayout();
     void addVideoSourceWidget(VideoSource *videoSource);
+    void loadNextPreview(VideoSourceWidget *previous = nullptr);
+
     YTStandardFeed *
     buildStandardFeed(const QString &feedId, const QString &label, QString time = QString());
     QGridLayout *layout;
+    QVector<VideoSourceWidget *> sourceWidgets;
 };
 
 #endif // CATEGORIESVIEW_H
diff --git a/src/videosourcewidget.cpp b/src/videosourcewidget.cpp
index 2e4adf7..3cb2ef0 100644
--- a/src/videosourcewidget.cpp
+++ b/src/videosourcewidget.cpp
@@ -33,7 +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()));
 }
 
@@ -54,9 +53,10 @@ void VideoSourceWidget::previewVideo(const QVector<Video *> &videos) {
     video->loadThumb(size(), lastPixelRatio)
             .then([this](auto variant) { setPixmapData(variant.toByteArray()); })
             .onFailed([](auto msg) { qDebug() << msg; })
-            .finally([videos] {
+            .finally([this, videos] {
                 for (auto v : videos)
                     v->deleteLater();
+                emit previewLoaded();
             });
 }
 
@@ -66,10 +66,18 @@ 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() {
diff --git a/src/videosourcewidget.h b/src/videosourcewidget.h
index b6fda3a..3a491ea 100644
--- a/src/videosourcewidget.h
+++ b/src/videosourcewidget.h
@@ -23,6 +23,7 @@ $END_LICENSE */
 
 #include <QtWidgets>
 
+#include "emptypromise.h"
 #include "gridwidget.h"
 
 class Video;
@@ -35,9 +36,11 @@ class VideoSourceWidget : public GridWidget {
 public:
     VideoSourceWidget(VideoSource *videoSource, QWidget *parent = 0);
     VideoSource *getVideoSource() { return videoSource; }
+    EmptyPromise *loadPreview();
 
 signals:
     void activated(VideoSource *videoSource);
+    void previewLoaded();
     void unavailable(VideoSourceWidget *videoSourceWidget);
 
 protected:
@@ -49,8 +52,6 @@ private slots:
     void setPixmapData(const QByteArray &bytes);
 
 private:
-    void loadPreview();
-
     QPixmap playPixmap();
     VideoSource *videoSource;
     QPixmap pixmap;

Debdiff

[The following lists of changes regard files as different if they have different names, permissions or owners.]

Files in second set of .debs but not in first

-rw-r--r--  root/root   /usr/lib/debug/.build-id/4b/5bd1fbee006727d3e1f61785991fb16ca72eb6.debug

Files in first set of .debs but not in second

-rw-r--r--  root/root   /usr/lib/debug/.build-id/57/501b9671a60152611f3896397ccc8d727df134.debug

No differences were encountered between the control files of package minitube

Control files of package minitube-dbgsym: lines which differ (wdiff format)

  • Build-Ids: 57501b9671a60152611f3896397ccc8d727df134 4b5bd1fbee006727d3e1f61785991fb16ca72eb6

More details

Full run details