X-Git-Url: https://git.sur5r.net/?p=minitube;a=blobdiff_plain;f=src%2Fvideo.cpp;h=ce351105601cb33c691b8ee73d281f44092d7fe7;hp=7a37c08b4236e15e994b6b4c2802128cccd51011;hb=e911bb9726db1c3e46ba365e52f7541b8f4a47d4;hpb=e1b27669bf677853c8bdf9ccb49173c52a8df5da diff --git a/src/video.cpp b/src/video.cpp index 7a37c08..ce35110 100644 --- a/src/video.cpp +++ b/src/video.cpp @@ -424,11 +424,37 @@ void Video::captureFunction(const QString &name, const QString &js) { captureFunction(funcName, js); pos += invokedFuncRe.matchedLength(); } + + // capture referenced objects + QRegExp objRe("[\\s=;\\(]([" + jsNameChars + "]+)\\.[" + jsNameChars + "]+"); + pos = name.length() + 9; + while ((pos = objRe.indexIn(func, pos)) != -1) { + QString objName = objRe.cap(1); + if (!sigObjects.contains(objName)) + captureObject(objName, js); + pos += objRe.matchedLength(); + } +} + +void Video::captureObject(const QString &name, const QString &js) { + QRegExp re("var\\s+" + QRegExp::escape(name) + "\\s*=\\s*\\{.+\\}\\s*;"); + re.setMinimal(true); + if (re.indexIn(js) == -1) { + qWarning() << "Cannot capture object" << name; + return; + } + QString obj = re.cap(0); + sigObjects.insert(name, obj); } QString Video::decryptSignature(const QString &s) { if (sigFuncName.isEmpty()) return QString(); QScriptEngine engine; + foreach (QString f, sigObjects.values()) { + QScriptValue value = engine.evaluate(f); + if (value.isError()) + qWarning() << "Error in" << f << value.toString(); + } foreach (QString f, sigFunctions.values()) { QScriptValue value = engine.evaluate(f); if (value.isError())