]> git.sur5r.net Git - minitube/commitdiff
July is the official cat'n'mouse game month
authorFlavio <flavio@odisseo.local>
Fri, 18 Jul 2014 21:08:12 +0000 (23:08 +0200)
committerFlavio <flavio@odisseo.local>
Fri, 18 Jul 2014 21:08:12 +0000 (23:08 +0200)
src/video.cpp
src/video.h

index 7a37c08b4236e15e994b6b4c2802128cccd51011..ce351105601cb33c691b8ee73d281f44092d7fe7 100644 (file)
@@ -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())
index 7220a4d533187bb743d40c4e5952b9f682b13bb8..dc7dd60f592a2dfaee890ef6fe2163589957884b 100644 (file)
@@ -103,6 +103,7 @@ private:
     void foundVideoUrl(QString videoToken, int definitionCode);
     void parseFmtUrlMap(const QString &fmtUrlMap, bool fromWebPage = false);
     void captureFunction(const QString &name, const QString &js);
+    void captureObject(const QString &name, const QString &js);
     QString decryptSignature(const QString &s);
 
     QString m_title;
@@ -130,9 +131,10 @@ private:
     bool loadingStreamUrl;
     bool loadingThumbnail;
 
-    QHash<QString, QString> sigFunctions;
-    QString sigFuncName;
     QString fmtUrlMap;
+    QString sigFuncName;
+    QHash<QString, QString> sigFunctions;
+    QHash<QString, QString> sigObjects;
 };
 
 // This is required in order to use QPointer<Video> as a QVariant