X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fjsfunctions.cpp;h=e63f14efbc25b7338f0bc4294f25bb915a7b3756;hb=533489a63a9716c645a11a99ca446978b20eedd0;hp=b23098f6a4ea2920f740c7f08dc9d747933d5930;hpb=4250cf62c1410d5c4e16720128264aeb59c8dc17;p=minitube diff --git a/src/jsfunctions.cpp b/src/jsfunctions.cpp index b23098f..e63f14e 100644 --- a/src/jsfunctions.cpp +++ b/src/jsfunctions.cpp @@ -19,29 +19,26 @@ along with Minitube. If not, see . $END_LICENSE */ #include "jsfunctions.h" -#include "networkaccess.h" -#include +#include "http.h" #include "constants.h" -namespace The { -NetworkAccess* http(); -} +#include JsFunctions* JsFunctions::instance() { - static JsFunctions *i = new JsFunctions(); + static JsFunctions *i = new JsFunctions(QLatin1String(Constants::WEBSITE) + "-ws/functions.js"); return i; } -JsFunctions::JsFunctions(QObject *parent) : QObject(parent), engine(0) { +JsFunctions::JsFunctions(const QString &url, QObject *parent) : QObject(parent), url(url), engine(0) { QFile file(jsPath()); if (file.exists()) { if (file.open(QIODevice::ReadOnly | QIODevice::Text)) parseJs(QString::fromUtf8(file.readAll())); else - qWarning() << file.errorString() << file.fileName(); + qWarning() << "Cannot open" << file.errorString() << file.fileName(); QFileInfo info(file); - if (info.lastModified().toTime_t() < QDateTime::currentDateTime().toTime_t() - 1800) - loadJs(); + bool stale = info.size() == 0 || info.lastModified().toTime_t() < QDateTime::currentDateTime().toTime_t() - 1800; + if (stale) loadJs(); } else { QFile resFile(QLatin1String(":/") + jsFilename()); resFile.open(QIODevice::ReadOnly | QIODevice::Text); @@ -52,92 +49,120 @@ JsFunctions::JsFunctions(QObject *parent) : QObject(parent), engine(0) { void JsFunctions::parseJs(const QString &js) { if (js.isEmpty()) return; + // qDebug() << "Parsing" << js; if (engine) delete engine; - engine = new QScriptEngine(); + engine = new QJSEngine(this); engine->evaluate(js); + emit ready(); +} + +QString JsFunctions::jsFilename() { + return QFileInfo(url).fileName(); } -const QLatin1String & JsFunctions::jsFilename() { - static const QLatin1String filename("functions.js"); - return filename; +QString JsFunctions::jsDir() { + return QStandardPaths::writableLocation(QStandardPaths::DataLocation); } -const QString & JsFunctions::jsPath() { - static const QString path( - #if QT_VERSION >= 0x050000 - QStandardPaths::writableLocation(QStandardPaths::DataLocation) - #else - QDesktopServices::storageLocation(QDesktopServices::DataLocation) - #endif - + "/" + jsFilename()); - return path; +QString JsFunctions::jsPath() { + return jsDir() + QLatin1String("/") + jsFilename(); } void JsFunctions::loadJs() { - QUrl url(QLatin1String(Constants::WEBSITE) + "-ws/" + jsFilename()); - url.addQueryItem("v", Constants::VERSION); - NetworkReply* reply = The::http()->get(url); + QUrl url(this->url); + QUrlQuery q; + q.addQueryItem("v", Constants::VERSION); + url.setQuery(q); + QObject* reply = Http::instance().get(url); connect(reply, SIGNAL(data(QByteArray)), SLOT(gotJs(QByteArray))); - connect(reply, SIGNAL(error(QNetworkReply*)), SLOT(errorJs(QNetworkReply*))); + connect(reply, SIGNAL(error(QString)), SLOT(errorJs(QString))); } -void JsFunctions::gotJs(QByteArray bytes) { - parseJs(QString::fromUtf8(bytes)); +void JsFunctions::gotJs(const QByteArray &bytes) { + if (bytes.isEmpty()) { + qWarning() << "Got empty js"; + return; + } + QDir().mkpath(jsDir()); QFile file(jsPath()); - if (!file.open(QIODevice::WriteOnly)) - qWarning() << file.errorString() << file.fileName(); + if (!file.open(QIODevice::WriteOnly)) { + qWarning() << "Cannot write" << file.errorString() << file.fileName(); + return; + } QDataStream stream(&file); stream.writeRawData(bytes.constData(), bytes.size()); + parseJs(QString::fromUtf8(bytes)); } -void JsFunctions::errorJs(QNetworkReply *reply) { - qWarning() << "Cannot get" << jsFilename() << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() - << reply->url().toString() << reply->errorString(); +void JsFunctions::errorJs(const QString &message) { + qWarning() << message; } -QString JsFunctions::evaluate(const QString &js) { +QJSValue JsFunctions::evaluate(const QString &js) { if (!engine) return QString(); - QScriptValue value = engine->evaluate(js); + QJSValue value = engine->evaluate(js); if (value.isUndefined()) qWarning() << "Undefined result for" << js; if (value.isError()) qWarning() << "Error in" << js << value.toString(); - return value.toString(); + return value; +} + +QString JsFunctions::string(const QString &js) { + return evaluate(js).toString(); +} + +QStringList JsFunctions::stringArray(const QString &js) { + QStringList items; + QJSValue array = evaluate(js); + if (!array.isArray()) return items; + QJSValueIterator it(array); + while (it.hasNext()) { + it.next(); + QJSValue value = it.value(); + if (!value.isString()) continue; + items << value.toString(); + } + return items; } QString JsFunctions::decryptSignature(const QString &s) { - return evaluate("decryptSignature('" + s + "')"); + return string("decryptSignature('" + s + "')"); } QString JsFunctions::decryptAgeSignature(const QString &s) { - return evaluate("decryptAgeSignature('" + s + "')"); + return string("decryptAgeSignature('" + s + "')"); } QString JsFunctions::videoIdRE() { - return evaluate("videoIdRE()"); + return string("videoIdRE()"); } QString JsFunctions::videoTokenRE() { - return evaluate("videoTokenRE()"); + return string("videoTokenRE()"); } QString JsFunctions::videoInfoFmtMapRE() { - return evaluate("videoInfoFmtMapRE()"); + return string("videoInfoFmtMapRE()"); } QString JsFunctions::webPageFmtMapRE() { - return evaluate("webPageFmtMapRE()"); + return string("webPageFmtMapRE()"); } QString JsFunctions::ageGateRE() { - return evaluate("ageGateRE()"); + return string("ageGateRE()"); } QString JsFunctions::jsPlayerRE() { - return evaluate("jsPlayerRE()"); + return string("jsPlayerRE()"); } QString JsFunctions::signatureFunctionNameRE() { - return evaluate("signatureFunctionNameRE()"); + return string("signatureFunctionNameRE()"); +} + +QStringList JsFunctions::apiKeys() { + return stringArray("apiKeys()"); }