]> git.sur5r.net Git - minitube/commitdiff
New upstream version 3.9.3 upstream
authorJakob Haufe <sur5r@debian.org>
Sun, 13 Nov 2022 18:12:33 +0000 (19:12 +0100)
committerJakob Haufe <sur5r@debian.org>
Sun, 13 Nov 2022 18:12:33 +0000 (19:12 +0100)
20 files changed:
lib/js/js.cpp
lib/js/js.pri
lib/js/jsvm.cpp [new file with mode: 0644]
lib/js/jsvm.h [new file with mode: 0644]
lib/media/src/mpv/mediampv.cpp
locale/ar.ts
locale/da.ts
locale/gl.ts
locale/id.ts
locale/pt_BR.ts
locale/ru.ts
locale/uk.ts
locale/uk_UA.ts
locale/zh_CN.ts
minitube.pro
src/mainwindow.cpp
src/standardfeedsview.cpp
src/standardfeedsview.h
src/videosourcewidget.cpp
src/videosourcewidget.h

index 884006497bac55fd3580d303cb0291faf6e96d24..0da5c7927dcb163ea734c00da3e1022bf4331fac 100644 (file)
@@ -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();
         }
index 62baf7f6da08ebf69da6e601912e50b678c84910..d0584e9445e513efbc956d2ce8112b6fe2b60b42 100644 (file)
@@ -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 (file)
index 0000000..8d70be1
--- /dev/null
@@ -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 (file)
index 0000000..a522bd5
--- /dev/null
@@ -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
index 8a548b7b10b73caf63803c2dbe7264bf487c315b..4cad49da9394d2ac76708cfeb10612a396ae521f 100644 (file)
@@ -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;
     }
 
index 6fe886c60e4e70a8f9e6ee56776b972c0e97ed9b..3a0326a96c210193ae229bc0d90dc2e3f4455f92 100644 (file)
@@ -27,7 +27,7 @@
     </message>
     <message>
         <source>Powered by %1</source>
-        <translation type="unfinished"/>
+        <translation>بدعم من %1</translation>
     </message>
     <message>
         <source>Open-source software</source>
     </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>
     </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>
     </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>
     </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>
     </message>
     <message>
         <source>Menu</source>
-        <translation type="unfinished"/>
+        <translation>قائمة</translation>
     </message>
     <message>
         <source>&amp;Love %1? Rate it!</source>
     </message>
     <message>
         <source>This year</source>
-        <translation type="unfinished"/>
+        <translation>هذه السنة</translation>
     </message>
     <message>
         <source>HD</source>
     </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>
     </message>
     <message>
         <source>Download Update</source>
-        <translation type="unfinished"/>
+        <translation>تحميل التحديث</translation>
     </message>
     <message>
         <source>Downloading update...</source>
     </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>
     </message>
     <message>
         <source>Download Update</source>
-        <translation type="unfinished"/>
+        <translation>تحميل التحديث</translation>
     </message>
 </context>
 </TS>
\ No newline at end of file
index c55af319d7da168c28e702e82d69fbdc4924b6dc..eba1e5a505388c08a0552da7bf0b07264349866c 100644 (file)
     </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>
index 88f99ae5eaaad1c1a0419c9c1f9d1501fac8bfb0..657521bbb673a54454a5fc65eb36bc312e4b2895 100644 (file)
@@ -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>
     </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>
     </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>
     </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>
     </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>
     </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>
     <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>
     </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>
     <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>
     </message>
     <message>
         <source>Download Update</source>
-        <translation type="unfinished"/>
+        <translation>Baixar actualización</translation>
     </message>
 </context>
 </TS>
\ No newline at end of file
index ce3ee9c344a59d55c67de1176e07f3ea078a08da..7f2ee97a8ef4c8c4686c0eff8def95f7ea9b8093 100644 (file)
     </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>
index 3cb23d5f749364fb4acf429671342e098ee9b291..bd50391183ceca89a20c62fd34d8f8c6c170df7d 100644 (file)
     </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>
     </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>
     </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>
index 93fc4f9de2621a617ca1bc853f13c62a8041e101..7954b017cbeeaa4ceb1a79c1d9aa110d533957dd 100644 (file)
@@ -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>
     </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>
     </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>
     </message>
     <message>
         <source>channel</source>
-        <translation type="unfinished"/>
+        <translation>канал</translation>
     </message>
 </context>
 <context>
     </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>
     </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>
     </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>
     <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>
     </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>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>
     </message>
     <message>
         <source>Download Update</source>
-        <translation type="unfinished"/>
+        <translation>Скачать обновление</translation>
     </message>
 </context>
 </TS>
\ No newline at end of file
index 41591c5d0cf1093852e020ac2711d3dcd587fb9b..39c4f2578a6fecb2dc3d434e71d1c4ae9164629b 100644 (file)
     </message>
     <message>
         <source>Toggle &amp;Menu Bar</source>
-        <translation type="unfinished"/>
+        <translation>Приховати &amp;Menu Bar</translation>
     </message>
     <message>
         <source>Menu</source>
     </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>
index 79a663904c0a25bc9d64e0f53acd5010d24259cc..4f0b30570262335e135b0153f483ae62e224b5c6 100644 (file)
@@ -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>
     </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>
     </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>Ð\9fÑ\80и ÐºÑ\83пÑ\96влÑ\96 Ð¿Ð¾Ð²Ð½Ð¾Ñ\97 Ð²ÐµÑ\80Ñ\81Ñ\96Ñ\97, Ð\92и, Ñ\82акож, Ð½Ð°Ð´Ð°Ñ\94Ñ\82е Ð¿Ñ\96дÑ\82Ñ\80имкÑ\83 Ð²Ð°Ð¶ÐºÑ\96й Ñ\80обоÑ\82Ñ\96, Ñ\8fка Ð±Ñ\83ла Ð·Ð°Ð´Ñ\96Ñ\8fна Ð¿Ñ\96д Ñ\87аÑ\81 створення %1.</translation>
+        <translation>Ð\9aÑ\83пÑ\83Ñ\8eÑ\87и Ð¿Ð¾Ð²Ð½Ñ\83 Ð²ÐµÑ\80Ñ\81Ñ\96Ñ\8e Ð\92и Ñ\82акож Ð¿Ñ\96дÑ\82Ñ\80имÑ\83Ñ\94Ñ\82е Ð²Ð°Ð¶ÐºÑ\83 Ð¿Ñ\80аÑ\86Ñ\8e Ð²Ð½ÐµÑ\81енÑ\83 Ð² створення %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>
     </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>
     </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>
     </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>
     </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>
     </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>
     </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>
     <name>Extra</name>
     <message>
         <source>The executable file has been tempered with, maybe by a virus.</source>
-        <translation>Ð\92иконÑ\83ваний Ñ\84айл Ð±Ñ\83ло Ð¿Ð¾Ñ\88коджено, Ð¼Ð¾Ð¶Ðµ Ð±Ñ\83Ñ\82и, Ð²Ñ\96Ñ\80Ñ\83Ñ\81.</translation>
+        <translation>Ð\92иконÑ\83ваний Ñ\84айл Ð±Ñ\83ло Ð¿Ð¾Ñ\88коджено, Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾ Ð²Ñ\96Ñ\80Ñ\83Ñ\81ом.</translation>
     </message>
     <message>
         <source>%1 will not run. Try installing again.</source>
     </message>
     <message>
         <source>Next track</source>
-        <translation>Ð\9dаÑ\81Ñ\82Ñ\83пний Ñ\82Ñ\80ек</translation>
+        <translation>Ð\9dаÑ\81Ñ\82Ñ\83пна Ð´Ð¾Ñ\80Ñ\96жка</translation>
     </message>
     <message>
         <source>Previous track</source>
-        <translation>Ð\9fопеÑ\80еднÑ\96й Ñ\82Ñ\80ек</translation>
+        <translation>Ð\9fопеÑ\80еднÑ\8f Ð´Ð¾Ñ\80Ñ\96жка</translation>
     </message>
     <message>
         <source>Increase volume</source>
     </message>
     <message>
         <source>Find videos and channels by keyword</source>
-        <translation>Знайти видива та канали за ключовими словами</translation>
+        <translation>Знайти відео та канали за ключовими словами</translation>
     </message>
     <message>
         <source>Browse</source>
     </message>
     <message>
         <source>Browse videos by category</source>
-        <translation>Оглянути видива за катеґоріями</translation>
+        <translation>Оглянути відео за катеґоріями</translation>
     </message>
     <message>
         <source>Subscriptions</source>
     </message>
     <message>
         <source>Go back to the previous track</source>
-        <translation>Повернутися до попереднього треку</translation>
+        <translation>Повернутися до попередньої доріжки</translation>
     </message>
     <message>
         <source>S&amp;kip</source>
     </message>
     <message>
         <source>Skip to the next video</source>
-        <translation>Перейти до наступного видива</translation>
+        <translation>Перейти до наступного відео</translation>
     </message>
     <message>
         <source>&amp;Play</source>
     </message>
     <message>
         <source>Hide the playlist and the toolbar</source>
-        <translation>Сховати перелік та панель інструментів</translation>
+        <translation>Сховати перелік та панель знарядь</translation>
     </message>
     <message>
         <source>Open the &amp;YouTube Page</source>
     </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>
     </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>
     </message>
     <message>
         <source>Remove the selected videos from the playlist</source>
-        <translation>Ð\92илÑ\83Ñ\87иÑ\82и Ð¾Ð±Ñ\80анÑ\96 Ð²Ð¸Ð´Ð¸Ð²Ð° Ð· Ð¿ÐµÑ\80елÑ\96кÑ\83</translation>
+        <translation>Ð\92илÑ\83Ñ\87иÑ\82и Ð²Ð¸Ð±Ñ\80анÑ\96 Ð²Ñ\96део Ð· Ð³Ñ\80айлиÑ\81Ñ\82а</translation>
     </message>
     <message>
         <source>Move &amp;Up</source>
     </message>
     <message>
         <source>Move up the selected videos in the playlist</source>
-        <translation>Ð\9fеÑ\80емÑ\96Ñ\81Ñ\82иÑ\82и Ð¾Ð±Ñ\80ане Ð²Ð¸Ð´Ð¸Ð²Ð¾ Ð´Ð¾Ð³Ð¾Ñ\80и Ñ\83 Ð¿ÐµÑ\80елÑ\96кÑ\83</translation>
+        <translation>Ð\9fеÑ\80емÑ\96Ñ\81Ñ\82иÑ\82и Ð²Ð¸Ð±Ñ\80ане Ð²Ñ\96део Ð´Ð¾Ð³Ð¾Ñ\80и Ñ\83 Ð³Ñ\80айлиÑ\81Ñ\82Ñ\96</translation>
     </message>
     <message>
         <source>Move &amp;Down</source>
     </message>
     <message>
         <source>Move down the selected videos in the playlist</source>
-        <translation>Ð\9fеÑ\80емÑ\96Ñ\81Ñ\82иÑ\82и Ð¾Ð±Ñ\80ане Ð²Ð¸Ð´Ð¸Ð²Ð¾ Ð´Ð¾Ð½Ð¸Ð·Ñ\83 Ð² Ð¿ÐµÑ\80елÑ\96кÑ\83</translation>
+        <translation>Ð\9fеÑ\80емÑ\96Ñ\81Ñ\82иÑ\82и Ð²Ð¸Ð±Ñ\80ане Ð²Ñ\96део Ð´Ð¾Ð½Ð¸Ð·Ñ\83 Ð² Ð³Ñ\80айлиÑ\81Ñ\82Ñ\96</translation>
     </message>
     <message>
         <source>&amp;Clear Recent Searches</source>
     </message>
     <message>
         <source>Clear the search history. Cannot be undone.</source>
-        <translation>Очистити історію пошуку (зміни незворотні).</translation>
+        <translation>Очистити дієпис пошуку (зміни незворотні).</translation>
     </message>
     <message>
         <source>&amp;Quit</source>
     </message>
     <message>
         <source>&amp;Website</source>
-        <translation>&amp;Веб-сайт</translation>
+        <translation>&amp;Вебсайт</translation>
     </message>
     <message>
         <source>%1 on the Web</source>
     </message>
     <message>
         <source>Manually start playing videos</source>
-        <translation>Почати відтворення видива самотужки</translation>
+        <translation>Почати відтворення відео самотужки</translation>
     </message>
     <message>
         <source>&amp;Downloads</source>
     </message>
     <message>
         <source>Show details about video downloads</source>
-        <translation>Ð\9fоказаÑ\82и Ð´ÐµÑ\82алÑ\96 Ð¿Ñ\80о Ð²Ð¸Ð´Ð¸Ð²Ð°, Ñ\89о Ð·Ð°Ð²Ð°Ð½Ñ\82ажÑ\83Ñ\8eÑ\82Ñ\8cÑ\81Ñ\8f</translation>
+        <translation>Ð\9fоказаÑ\82и Ð´ÐµÑ\82алÑ\96 Ð¿Ñ\80о Ð·Ð°Ð²Ð°Ð½Ñ\82ажÑ\83ванÑ\96 Ð²Ñ\96део</translation>
     </message>
     <message>
         <source>&amp;Download</source>
     </message>
     <message>
         <source>Download the current video</source>
-        <translation>Завантажити це видиво</translation>
+        <translation>Завантажити це відео</translation>
     </message>
     <message>
         <source>Take &amp;Snapshot</source>
     </message>
     <message>
         <source>Share the current video using %1</source>
-        <translation>Поділитися поточним видивом за допомогою %1</translation>
+        <translation>Поділитися поточним відео за допомогою %1</translation>
     </message>
     <message>
         <source>&amp;Email</source>
     </message>
     <message>
         <source>&amp;Stop After This Video</source>
-        <translation>Зу&amp;пинити після цього видиво</translation>
+        <translation>Зу&amp;пинити після цього відео</translation>
     </message>
     <message>
         <source>&amp;Report an Issue...</source>
     </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>
     </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>
     </message>
     <message>
         <source>&amp;Playlist</source>
-        <translation>&amp;Ð\9fеÑ\80елÑ\96к Ð²Ñ\96дÑ\82воÑ\80еннÑ\8f</translation>
+        <translation>&amp;Ð\93Ñ\80айлиÑ\81Ñ\82</translation>
     </message>
     <message>
         <source>&amp;Video</source>
-        <translation>&amp;Видиво</translation>
+        <translation>&amp;Відео</translation>
     </message>
     <message>
         <source>&amp;Share</source>
     </message>
     <message>
         <source>Press %1 to raise the volume, %2 to lower it</source>
-        <translation>Ð\9dаÑ\82иÑ\81нÑ\96Ñ\82Ñ\8c %1, Ð°Ð±Ð¸ Ð¿Ñ\80иглÑ\83Ñ\88иÑ\82и Ð³Ñ\83Ñ\87нÑ\96Ñ\81Ñ\82Ñ\8c, Ñ\82а %2, щоб її відновити</translation>
+        <translation>Ð\9dаÑ\82иÑ\81нÑ\96Ñ\82Ñ\8c %1, Ð°Ð±Ð¸ Ð¿Ñ\80иглÑ\83Ñ\88иÑ\82и Ð³Ñ\83Ñ\87нÑ\96Ñ\81Ñ\82Ñ\8c, Ñ\96 %2, щоб її відновити</translation>
     </message>
     <message>
         <source>Choose your content location</source>
     </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>
     </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>
     </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>Ð\9fоÑ\81иланнÑ\8f Ð±Ñ\83де Ð´Ñ\96йÑ\81не Ð»Ð¸Ñ\88е Ð¿Ñ\80оÑ\82Ñ\8fгом обмеженого часу.</translation>
+        <translation>Ð\9fоÑ\81иланнÑ\8f Ð±Ñ\83де Ð´Ñ\96йÑ\81не Ð»Ð¸Ñ\88е Ð²Ð¿Ñ\80одовж обмеженого часу.</translation>
     </message>
     <message>
         <source>Downloading %1</source>
     </message>
     <message>
         <source>Switched to %1</source>
-        <translation type="unfinished"/>
+        <translation>Перемикнутися на %1</translation>
     </message>
     <message>
         <source>Unsubscribed from %1</source>
     </message>
     <message>
         <source>channel</source>
-        <translation type="unfinished"/>
+        <translation>канал</translation>
     </message>
 </context>
 <context>
     <name>PickMessage</name>
     <message>
         <source>Pick a video</source>
-        <translation type="unfinished"/>
+        <translation>Оберіть відео</translation>
     </message>
 </context>
 <context>
     </message>
     <message>
         <source>Open parent folder</source>
-        <translation>Перейти до теки з видивами</translation>
+        <translation>Перейти до теки з відео</translation>
     </message>
     <message>
         <source>Restart downloading</source>
-        <translation>Ð\97аванÑ\82ажиÑ\82и Ð·Ð°Ð½Ð¾Ð²Ð¾</translation>
+        <translation>Ð\9fеÑ\80езапÑ\83Ñ\81Ñ\82иÑ\82и Ð·Ð°Ð²Ð°Ð½Ñ\82аженнÑ\8f</translation>
     </message>
 </context>
 <context>
     </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>
     </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>
     </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>
     </message>
     <message>
         <source>&amp;Forward</source>
-        <translation type="unfinished"/>
+        <translation>&amp;Уперед</translation>
     </message>
     <message>
         <source>Forward to %1</source>
     </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>
     </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>
     </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>Ð\9dе Ð²Ð´Ð°Ð»Ð¾Ñ\81Ñ\8f Ð¾Ñ\82Ñ\80имаÑ\82и Ð²Ð¸Ð´Ð¸Ð²опотік для %1</translation>
+        <translation>Ð\9dе Ð²Ð´Ð°Ð»Ð¾Ñ\81Ñ\8c Ð¾Ñ\82Ñ\80имаÑ\82и Ð²Ñ\96деопотік для %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>
     </message>
     <message>
         <source>Russia</source>
-        <translation>РоÑ\81Ñ\96йÑ\81Ñ\8cка Ð¤ÐµÐ´ÐµÑ\80аÑ\86ія</translation>
+        <translation>Ð\9cоÑ\81ковія</translation>
     </message>
     <message>
         <source>Saudi Arabia</source>
     </message>
     <message>
         <source>Spain</source>
-        <translation>Ð\86спанія</translation>
+        <translation>Ð\95спанія</translation>
     </message>
     <message>
         <source>Sweden</source>
     </message>
     <message>
         <source>United Kingdom</source>
-        <translation>Ð\92еликобританія</translation>
+        <translation>Ð\92елика Ð\91ританія</translation>
     </message>
     <message>
         <source>Yemen</source>
     <name>YTVideo</name>
     <message>
         <source>Cannot get video stream for %1</source>
-        <translation>Ð\9dе Ð²Ð´Ð°Ð»Ð¾Ñ\81Ñ\8f Ð¾Ñ\82Ñ\80имаÑ\82и Ð²Ð¸Ð´Ð¸Ð²опотік для %1</translation>
+        <translation>Ð\9dе Ð²Ð´Ð°Ð»Ð¾Ñ\81Ñ\8c Ð¾Ñ\82Ñ\80имаÑ\82и Ð²Ñ\96деопотік для %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>
     </message>
     <message>
         <source>Download Update</source>
-        <translation type="unfinished"/>
+        <translation>Завантажити оновлення</translation>
     </message>
 </context>
 </TS>
\ No newline at end of file
index 9c8a76ca0efb3e1703857c5283fb396200e4a895..4176c7bdfc0c0722cfd34c9c9b945ac1ff33e911 100644 (file)
     </message>
     <message numerus="yes">
         <source>%n year(s) ago</source>
-        <translation type="unfinished"><numerusform></numerusform></translation>
+        <translation><numerusform>%n 年前</numerusform></translation>
     </message>
 </context>
 <context>
     </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>
     </message>
     <message>
         <source>An update is ready to be installed. Quit and install update.</source>
-        <translation type="unfinished"/>
+        <translation>更新已准备好,退出并安装更新</translation>
     </message>
 </context>
 <context>
     </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>
     <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>
     </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>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>
     </message>
     <message>
         <source>Download Update</source>
-        <translation type="unfinished"/>
+        <translation>下载更新</translation>
     </message>
 </context>
 </TS>
\ No newline at end of file
index 71420f3121d6789d22d86592ebafefad0bea293e..646dd4ed1e3d4df9d2c2a99f13ce851dbc78cec0 100644 (file)
@@ -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
index 610c0d16b680c69c78e49d0e0fd8977289293a77..e4f09c6ba5dd724b4e4f03a7cea932a8f59d977f 100644 (file)
@@ -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();
     }
index 2fb697d9bbe3c72e044324bbeb455b348c9845cf..4c23365c427464bb4f5bf53b12e68eab1586fcf8 100644 (file)
@@ -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) {
index aa07c0c1585eb1321dc2ca55ff52aa38a3f443e2..1070cab00c855cf48b8055ba08c926ed5f097ef0 100644 (file)
@@ -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
index 2e4adf7613ad8f28615eddb3c0241f2d49a29c61..3cb2ef0345a9aa28a4f78bf645b3ebac5c67e32c 100644 (file)
@@ -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() {
index b6fda3a6a95f0d143f009f2f665d1851f760f85b..3a491ea6f0017629f196a5c5d0b88a6992558295 100644 (file)
@@ -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;