Hello community, here is the log from the commit of package minitube for openSUSE:Factory checked in at 2020-11-25 19:30:19 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/minitube (Old) and /work/SRC/openSUSE:Factory/.minitube.new.5913 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "minitube" Wed Nov 25 19:30:19 2020 rev:21 rq:850687 version:3.6.6 Changes: -------- --- /work/SRC/openSUSE:Factory/minitube/minitube.changes 2020-11-12 22:49:40.598785966 +0100 +++ /work/SRC/openSUSE:Factory/.minitube.new.5913/minitube.changes 2020-11-25 19:31:09.946604452 +0100 @@ -1,0 +2,6 @@ +Tue Nov 24 19:45:58 UTC 2020 - Carsten Ziepke <[email protected]> + +- Update to version 3.6.6 + - handle thumb loading error + +------------------------------------------------------------------- Old: ---- minitube-3.6.5.tar.xz New: ---- minitube-3.6.6.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ minitube.spec ++++++ --- /var/tmp/diff_new_pack.jmhhZv/_old 2020-11-25 19:31:10.426604925 +0100 +++ /var/tmp/diff_new_pack.jmhhZv/_new 2020-11-25 19:31:10.430604928 +0100 @@ -17,7 +17,7 @@ Name: minitube -Version: 3.6.5 +Version: 3.6.6 Release: 0 Summary: Native YouTube Client License: GPL-3.0-or-later ++++++ _service ++++++ --- /var/tmp/diff_new_pack.jmhhZv/_old 2020-11-25 19:31:10.458604956 +0100 +++ /var/tmp/diff_new_pack.jmhhZv/_new 2020-11-25 19:31:10.458604956 +0100 @@ -4,7 +4,7 @@ <param name="url">https://github.com/flaviotordini/minitube.git</param> <param name="filename">minitube</param> <param name="versionformat">@PARENT_TAG@</param> - <param name="revision">3.6.5</param> + <param name="revision">3.6.6</param> </service> <service mode="disabled" name="recompress"> <param name="file">*.tar</param> ++++++ minitube-3.6.5.tar.xz -> minitube-3.6.6.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minitube-3.6.5/README.md new/minitube-3.6.6/README.md --- old/minitube-3.6.5/README.md 2020-10-26 19:16:19.000000000 +0100 +++ new/minitube-3.6.6/README.md 2020-11-21 22:20:22.000000000 +0100 @@ -14,7 +14,7 @@ git clone --recursive https://github.com/flaviotordini/minitube.git -You need Qt >= 5.10 and MPV >= 0.29.0. The following Qt modules are needed: core, gui, widgets, network, sql (using the Sqlite plugin), declarative, dbus, x11extras. +You need Qt >= 5.12 and MPV >= 0.29.0. The following Qt modules are needed: core, gui, widgets, network, sql (using the Sqlite plugin), declarative, dbus, x11extras. To be able to build on a Debian (or derivative) system: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minitube-3.6.5/lib/js/js.cpp new/minitube-3.6.6/lib/js/js.cpp --- old/minitube-3.6.5/lib/js/js.cpp 2020-10-26 19:16:19.000000000 +0100 +++ new/minitube-3.6.6/lib/js/js.cpp 2020-11-21 22:20:22.000000000 +0100 @@ -1,14 +1,12 @@ #include "js.h" -#include "jsnamfactory.h" - #include "cachedhttp.h" namespace { Http &cachedHttp() { static Http *h = [] { CachedHttp *cachedHttp = new CachedHttp(Http::instance(), "js"); - cachedHttp->setMaxSeconds(3600 * 6); + cachedHttp->setMaxSeconds(3600); // Avoid expiring the cached js cachedHttp->setMaxSize(0); @@ -85,12 +83,18 @@ if (engine) engine->deleteLater(); engine = new QQmlEngine(this); - engine->setNetworkAccessManagerFactory(new JSNAMFactory); + engine->setNetworkAccessManagerFactory(&namFactory); engine->globalObject().setProperty("global", engine->globalObject()); QJSValue timer = engine->newQObject(new JSTimer(engine)); + engine->globalObject().setProperty("setTimeoutQt", timer.property("setTimeout")); + QJSValue setTimeoutWrapperFunction = + engine->evaluate("function setTimeout(cb, delay) {" + "const args = Array.prototype.slice.call(arguments, 2);" + "return setTimeoutQt(cb, delay, args);" + "}"); + checkError(setTimeoutWrapperFunction); engine->globalObject().setProperty("clearTimeout", timer.property("clearTimeout")); - engine->globalObject().setProperty("setTimeout", timer.property("setTimeout")); connect(cachedHttp().get(url), &HttpReply::finished, this, [this](auto &reply) { if (!reply.isSuccessful()) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minitube-3.6.5/lib/js/js.h new/minitube-3.6.6/lib/js/js.h --- old/minitube-3.6.5/lib/js/js.h 2020-10-26 19:16:19.000000000 +0100 +++ new/minitube-3.6.6/lib/js/js.h 2020-11-21 22:20:22.000000000 +0100 @@ -3,6 +3,7 @@ #include <QtQml> +#include "jsnamfactory.h" #include "jsresult.h" class JSTimer : public QTimer { @@ -24,14 +25,26 @@ return QJSValue(); } // This should be static but cannot bind static functions to QJSEngine - Q_INVOKABLE QJSValue setTimeout(QJSValue callback, QJSValue delayTime) { - // qDebug() << callback.toString() << delayTime.toInt(); + Q_INVOKABLE QJSValue setTimeout(QJSValue callback, QJSValue delayTime, QJSValue args) { + // qDebug() << callback.toString() << delayTime.toInt() << args.toString(); + + QJSValueList valueArgs; + if (args.isArray()) { + const int argsLength = args.property("length").toInt(); + for (int i = 0; i < argsLength; ++i) { + auto arg = args.property(i); + qDebug() << "Adding arg" << arg.toString(); + valueArgs << arg; + } + } + auto timer = new JSTimer(); timer->setInterval(delayTime.toInt()); - connect(timer, &JSTimer::timeout, this, [callback]() mutable { + + connect(timer, &JSTimer::timeout, timer, [callback, valueArgs]() mutable { qDebug() << "Calling" << callback.toString(); if (!callback.isCallable()) qDebug() << callback.toString() << "is not callable"; - auto value = callback.call(); + auto value = callback.call(valueArgs); if (value.isError()) { qWarning() << "Error" << value.toString(); qDebug() << value.property("stack").toString().splitRef('\n'); @@ -62,6 +75,8 @@ static JS &instance(); explicit JS(QObject *parent = nullptr); + JSNAMFactory &getNamFactory() { return namFactory; }; + void initialize(const QUrl &url); bool checkError(const QJSValue &value); @@ -78,6 +93,7 @@ void initialize(); QQmlEngine *engine; + JSNAMFactory namFactory; bool initializing = false; bool ready = false; QUrl url; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minitube-3.6.5/lib/js/jsnamfactory.cpp new/minitube-3.6.6/lib/js/jsnamfactory.cpp --- old/minitube-3.6.5/lib/js/jsnamfactory.cpp 2020-10-26 19:16:19.000000000 +0100 +++ new/minitube-3.6.6/lib/js/jsnamfactory.cpp 2020-11-21 22:20:22.000000000 +0100 @@ -24,16 +24,19 @@ auto headers = meta2.rawHeaders(); for (auto i = headers.begin(); i != headers.end(); ++i) { // qDebug() << i->first << i->second; - if (i->first == "Cache-Control" || i->first == "Expires") { + static const QVector<QByteArray> headersToRemove{"Cache-Control", "Expires", "Pragma"}; + if (headersToRemove.contains(i->first)) { qDebug() << "Removing" << i->first << i->second; headers.erase(i); } } + meta2.setRawHeaders(headers); return meta2; } -JSNAM::JSNAM(QObject *parent) : QNetworkAccessManager(parent) { +JSNAM::JSNAM(QObject *parent, const JSNAMFactory &factory) + : QNetworkAccessManager(parent), factory(factory) { auto cache = new JSDiskCache(this); cache->setCacheDirectory(QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + "/js"); @@ -50,13 +53,16 @@ auto req2 = request; req2.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache); - // TODO maybe set user agent + auto end = factory.getRequestHeaders().cend(); + for (auto i = factory.getRequestHeaders().cbegin(); i != end; ++i) { + req2.setRawHeader(i.key(), i.value()); + } - qDebug() << req2.url(); + qDebug() << req2.url() << req2.rawHeaderList(); return QNetworkAccessManager::createRequest(op, req2, outgoingData); } QNetworkAccessManager *JSNAMFactory::create(QObject *parent) { qDebug() << "Creating NAM"; - return new JSNAM(parent); + return new JSNAM(parent, *this); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minitube-3.6.5/lib/js/jsnamfactory.h new/minitube-3.6.6/lib/js/jsnamfactory.h --- old/minitube-3.6.5/lib/js/jsnamfactory.h 2020-10-26 19:16:19.000000000 +0100 +++ new/minitube-3.6.6/lib/js/jsnamfactory.h 2020-11-21 22:20:22.000000000 +0100 @@ -3,30 +3,39 @@ #include <QtQml> -class JSDiskCache : public QNetworkDiskCache { +class JSNAMFactory : public QQmlNetworkAccessManagerFactory { public: - JSDiskCache(QObject *parent); - void updateMetaData(const QNetworkCacheMetaData &meta); - QIODevice *prepare(const QNetworkCacheMetaData &meta); + QNetworkAccessManager *create(QObject *parent); + + void setRequestHeaders(QMap<QByteArray, QByteArray> value) { requestHeaders = value; }; + const QMap<QByteArray, QByteArray> &getRequestHeaders() const { return requestHeaders; } private: - QNetworkCacheMetaData fixMetadata(const QNetworkCacheMetaData &meta); + QMap<QByteArray, QByteArray> requestHeaders; }; class JSNAM : public QNetworkAccessManager { Q_OBJECT public: - JSNAM(QObject *parent); + JSNAM(QObject *parent, const JSNAMFactory &factory); protected: QNetworkReply * createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData); + +private: + const JSNAMFactory &factory; }; -class JSNAMFactory : public QQmlNetworkAccessManagerFactory { +class JSDiskCache : public QNetworkDiskCache { public: - QNetworkAccessManager *create(QObject *parent); + JSDiskCache(QObject *parent); + void updateMetaData(const QNetworkCacheMetaData &meta); + QIODevice *prepare(const QNetworkCacheMetaData &meta); + +private: + QNetworkCacheMetaData fixMetadata(const QNetworkCacheMetaData &meta); }; #endif // YTJSNAMFACTORY_H diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minitube-3.6.5/lib/updater/marketplace.json new/minitube-3.6.6/lib/updater/marketplace.json --- old/minitube-3.6.5/lib/updater/marketplace.json 1970-01-01 01:00:00.000000000 +0100 +++ new/minitube-3.6.6/lib/updater/marketplace.json 2020-11-21 22:20:22.000000000 +0100 @@ -0,0 +1,48 @@ +{ + "$schema": "http://qt.io/schema/extension-schema-v1#", + "title": "Updater", + "extensionType": [ + "library" + ], + "version": "1", + "vendor": { + "name": "Flavio Tordini", + "url": "https://flavio.tordini.org" + }, + "contact": "Flavio Tordini <[email protected]>", + "copyright": [ + "Flavio Tordini" + ], + "author": "Flavio Tordini", + "icon": "https://flavio.tordini.org/favicon-196x196.png", + "licenses": [ + { + "licenseType": "GPLv3", + "licenseUrl": "https://opensource.org/licenses/GPL-3.0" + } + ], + "created": "2020-07-03", + "platforms": [ + "Windows", + "Linux", + "macOS" + ], + "qtVersions": [ + "5.10.0-or-later" + ], + "tags": [ + "updater,update,deploy,release,tools,utility" + ], + "price": { + "listprice": 0 + }, + "support": "[email protected]", + "bugUrl": "https://github.com/flaviotordini/updater/issues", + "sourceRepoUrl": "https://github.com/flaviotordini/updater", + "userManuals": [ + "https://github.com/flaviotordini/updater/blob/master/README.md" + ], + "dependencies": [ + "Network" + ] +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minitube-3.6.5/minitube.pro new/minitube-3.6.6/minitube.pro --- old/minitube-3.6.5/minitube.pro 2020-10-26 19:16:19.000000000 +0100 +++ new/minitube-3.6.6/minitube.pro 2020-11-21 22:20:22.000000000 +0100 @@ -1,7 +1,7 @@ CONFIG += c++17 exceptions_off rtti_off optimize_full object_parallel_to_source TEMPLATE = app -VERSION = 3.6.5 +VERSION = 3.6.6 DEFINES += APP_VERSION="$$VERSION" APP_NAME = Minitube diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minitube-3.6.5/src/invidious/invidious.cpp new/minitube-3.6.6/src/invidious/invidious.cpp --- old/minitube-3.6.5/src/invidious/invidious.cpp 2020-10-26 19:16:19.000000000 +0100 +++ new/minitube-3.6.6/src/invidious/invidious.cpp 2020-11-21 22:20:22.000000000 +0100 @@ -41,7 +41,7 @@ throttledHttp->setMilliseconds(500); CachedHttp *cachedHttp = new CachedHttp(*throttledHttp, "iv"); - cachedHttp->setMaxSeconds(86400); + cachedHttp->setMaxSeconds(3600); cachedHttp->setIgnoreHostname(true); cachedHttp->getValidators().insert("application/json", [](const auto &reply) -> bool { @@ -102,7 +102,6 @@ QJsonObject serverObj = serverArray.at(1).toObject(); if (serverObj["type"] == "https") { QString url = "https://" + host; - QUrl testUrl(url + "/api/v1/search?q=" + testKeyword); auto reply = http().get(testUrl); connect(reply, &HttpReply::finished, this, [this, url](auto &reply) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minitube-3.6.5/src/mainwindow.cpp new/minitube-3.6.6/src/mainwindow.cpp --- old/minitube-3.6.5/src/mainwindow.cpp 2020-10-26 19:16:19.000000000 +0100 +++ new/minitube-3.6.6/src/mainwindow.cpp 2020-11-21 22:20:22.000000000 +0100 @@ -169,7 +169,9 @@ } else if (VideoAPI::impl() == VideoAPI::YT3) { YT3::instance().initApiKeys(); } else if (VideoAPI::impl() == VideoAPI::JS) { - JS::instance().initialize(QUrl(QLatin1String(Constants::WEBSITE) + "-ws/bundle.js")); + JS::instance().getNamFactory().setRequestHeaders( + {{"User-Agent", HttpUtils::stealthUserAgent()}}); + JS::instance().initialize(QUrl(QLatin1String(Constants::WEBSITE) + "-ws/bundle2.js")); Invidious::instance().initServers(); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minitube-3.6.5/src/video.cpp new/minitube-3.6.6/src/video.cpp --- old/minitube-3.6.5/src/video.cpp 2020-10-26 19:16:19.000000000 +0100 +++ new/minitube-3.6.6/src/video.cpp 2020-11-21 22:20:22.000000000 +0100 @@ -84,8 +84,12 @@ void Video::loadThumbnail() { if (thumbnailUrl.isEmpty() || loadingThumbnail) return; loadingThumbnail = true; - QObject *reply = HttpUtils::yt().get(thumbnailUrl); + auto reply = HttpUtils::yt().get(thumbnailUrl); connect(reply, SIGNAL(data(QByteArray)), SLOT(setThumbnail(QByteArray))); + connect(reply, &HttpReply::error, this, [this](auto &msg) { + qWarning() << msg; + loadingThumbnail = false; + }); } void Video::setDuration(int value) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minitube-3.6.5/src/ytjs/ytjssearch.cpp new/minitube-3.6.6/src/ytjs/ytjssearch.cpp --- old/minitube-3.6.5/src/ytjs/ytjssearch.cpp 2020-10-26 19:16:19.000000000 +0100 +++ new/minitube-3.6.6/src/ytjs/ytjssearch.cpp 2020-11-21 22:20:22.000000000 +0100 @@ -78,7 +78,15 @@ QJSValue options = engine.newObject(); - if (startIndex > 1 && !nextpageRef.isEmpty()) options.setProperty("nextpageRef", nextpageRef); + if (startIndex > 1) { + if (!nextpageRef.isEmpty()) + options.setProperty("nextpageRef", nextpageRef); + else { + // non-first page was requested but we have no continuation token + emit error("No pagination token"); + return; + } + } options.setProperty("limit", max); switch (searchParams->safeSearch()) { _______________________________________________ openSUSE Commits mailing list -- [email protected] To unsubscribe, email [email protected] List Netiquette: https://en.opensuse.org/openSUSE:Mailing_list_netiquette List Archives: https://lists.opensuse.org/archives/list/[email protected]
