Merge bugfixes from upstream's git repo:

Restore wheel scroll setting
(git commit 96ad9483a14d0b2252fb9eac976d8ed563bb4aca)

Fix VEVO videos
(git commit 6ef6d1752c7fac4f1db7ddc283e934acc8a4556b)
This commit is contained in:
dcoppa 2014-12-17 10:02:08 +00:00
parent e59a067db8
commit 226870430b
6 changed files with 335 additions and 1 deletions

View File

@ -1,9 +1,11 @@
# $OpenBSD: Makefile,v 1.36 2014/10/29 08:18:23 dcoppa Exp $
# $OpenBSD: Makefile,v 1.37 2014/12/17 10:02:08 dcoppa Exp $
COMMENT = standalone YouTube.com video browser/player
DISTNAME = minitube-2.3
REVISION = 0
CATEGORIES = www multimedia
HOMEPAGE = http://flavio.tordini.org/minitube

View File

@ -0,0 +1,55 @@
$OpenBSD: patch-src_jsfunctions_cpp,v 1.1 2014/12/17 10:02:08 dcoppa Exp $
commit 6ef6d1752c7fac4f1db7ddc283e934acc8a4556b
Author: Flavio <flavio.tordini@gmail.com>
Date: Thu Nov 13 13:22:36 2014 +0100
Fix VEVO videos
--- src/jsfunctions.cpp.orig Thu Oct 23 05:47:15 2014
+++ src/jsfunctions.cpp Wed Dec 17 03:42:47 2014
@@ -94,7 +94,7 @@ void JsFunctions::errorJs(QNetworkReply *reply) {
<< reply->url().toString() << reply->errorString();
}
-QString JsFunctions::evaluateFunction(const QString &function) {
+QString JsFunctions::evaluate(const QString &function) {
if (!engine) return QString();
QScriptValue value = engine->evaluate(function);
if (value.isUndefined())
@@ -106,9 +106,33 @@ QString JsFunctions::evaluateFunction(const QString &f
}
QString JsFunctions::decryptSignature(const QString &s) {
- return evaluateFunction("decryptSignature('" + s + "')");
+ return evaluate("decryptSignature('" + s + "')");
}
QString JsFunctions::decryptAgeSignature(const QString &s) {
- return evaluateFunction("decryptAgeSignature('" + s + "')");
+ return evaluate("decryptAgeSignature('" + s + "')");
+}
+
+QString JsFunctions::videoIdRE() {
+ return evaluate("videoIdRE()");
+}
+
+QString JsFunctions::videoTokenRE() {
+ return evaluate("videoTokenRE()");
+}
+
+QString JsFunctions::videoInfoFmtMapRE() {
+ return evaluate("videoInfoFmtMapRE()");
+}
+
+QString JsFunctions::webPageFmtMapRE() {
+ return evaluate("webPageFmtMapRE()");
+}
+
+QString JsFunctions::jsPlayerRE() {
+ return evaluate("jsPlayerRE()");
+}
+
+QString JsFunctions::signatureFunctionNameRE() {
+ return evaluate("signatureFunctionNameRE()");
}

View File

@ -0,0 +1,35 @@
$OpenBSD: patch-src_jsfunctions_h,v 1.1 2014/12/17 10:02:08 dcoppa Exp $
commit 6ef6d1752c7fac4f1db7ddc283e934acc8a4556b
Author: Flavio <flavio.tordini@gmail.com>
Date: Thu Nov 13 13:22:36 2014 +0100
Fix VEVO videos
--- src/jsfunctions.h.orig Thu Oct 23 05:47:15 2014
+++ src/jsfunctions.h Wed Dec 17 03:44:28 2014
@@ -33,7 +33,16 @@ class JsFunctions : public QObject { (public)
static JsFunctions* instance();
QString decryptSignature(const QString &s);
QString decryptAgeSignature(const QString &s);
+ QString videoIdRE();
+ QString videoTokenRE();
+ QString videoInfoFmtMapRE();
+ QString webPageFmtMapRE();
+ QString jsPlayerRE();
+ QString signatureFunctionNameRE();
+protected:
+ QString evaluate(const QString &function);
+
private slots:
void gotJs(QByteArray bytes);
void errorJs(QNetworkReply *reply);
@@ -44,7 +53,6 @@ private slots: (private)
static const QString &jsPath();
void loadJs();
void parseJs(const QString &js);
- QString evaluateFunction(const QString &function);
QScriptEngine *engine;
};

View File

@ -0,0 +1,20 @@
$OpenBSD: patch-src_main_cpp,v 1.1 2014/12/17 10:02:08 dcoppa Exp $
commit 96ad9483a14d0b2252fb9eac976d8ed563bb4aca
Author: Flavio <flavio.tordini@gmail.com>
Date: Thu Nov 13 13:21:53 2014 +0100
Restore wheel scroll setting
--- src/main.cpp.orig Wed Dec 17 03:37:01 2014
+++ src/main.cpp Wed Dec 17 03:38:25 2014
@@ -54,6 +54,9 @@ int main(int argc, char **argv) {
app.setOrganizationName(QLatin1String(Constants::ORG_NAME));
app.setOrganizationDomain(QLatin1String(Constants::ORG_DOMAIN));
app.setAttribute(Qt::AA_DontShowIconsInMenus);
+#ifndef APP_WIN
+ app.setWheelScrollLines(1);
+#endif
#ifdef APP_EXTRA
Extra::appSetup(&app);

View File

@ -0,0 +1,198 @@
$OpenBSD: patch-src_video_cpp,v 1.3 2014/12/17 10:02:08 dcoppa Exp $
commit 6ef6d1752c7fac4f1db7ddc283e934acc8a4556b
Author: Flavio <flavio.tordini@gmail.com>
Date: Thu Nov 13 13:22:36 2014 +0100
Fix VEVO videos
--- src/video.cpp.orig Thu Oct 23 05:47:15 2014
+++ src/video.cpp Wed Dec 17 03:42:47 2014
@@ -35,10 +35,10 @@ static const QString jsNameChars = "a-zA-Z0-9\\$_";
Video::Video() : m_duration(0),
m_viewCount(-1),
+ m_license(LicenseYouTube),
definitionCode(0),
elIndex(0),
ageGate(false),
- m_license(LicenseYouTube),
loadingStreamUrl(false),
loadingThumbnail(false)
{ }
@@ -67,11 +67,8 @@ void Video::setWebpage(QUrl webpage) {
m_webpage = webpage;
// Get Video ID
- // youtube-dl line 428
- // QRegExp re("^((?:http://)?(?:\\w+\\.)?youtube\\.com/(?:(?:v/)|(?:(?:watch(?:\\.php)?)?\\?(?:.+&)?v=)))?([0-9A-Za-z_-]+)(?(1).+)?$");
- QRegExp re("^https?://www\\.youtube\\.com/watch\\?v=([0-9A-Za-z_-]+).*");
- bool match = re.exactMatch(m_webpage.toString());
- if (!match) {
+ QRegExp re(JsFunctions::instance()->videoIdRE());
+ if (re.indexIn(m_webpage.toString()) == -1) {
qWarning() << QString("Cannot get video id for %1").arg(m_webpage.toString());
// emit errorStreamUrl(QString("Cannot get video id for %1").arg(m_webpage.toString()));
// loadingStreamUrl = false;
@@ -163,29 +160,26 @@ void Video::gotVideoInfo(QByteArray data) {
// qDebug() << "videoInfo" << videoInfo;
// get video token
- QRegExp re = QRegExp("^.*&token=([^&]+).*$");
- bool match = re.exactMatch(videoInfo);
- // handle regexp failure
- if (!match) {
- // qDebug() << "Cannot get token. Trying next el param";
+ QRegExp videoTokeRE(JsFunctions::instance()->videoTokenRE());
+ if (videoTokeRE.indexIn(videoInfo) == -1) {
+ qWarning() << "Cannot get token. Trying next el param" << videoInfo << videoTokeRE.pattern();
// Don't panic! We're gonna try another magic "el" param
elIndex++;
getVideoInfo();
return;
}
- QString videoToken = re.cap(1);
+ QString videoToken = videoTokeRE.cap(1);
+ // qWarning() << "got token" << videoToken;
while (videoToken.contains('%'))
videoToken = QByteArray::fromPercentEncoding(videoToken.toLatin1());
// qDebug() << "videoToken" << videoToken;
this->videoToken = videoToken;
// get fmt_url_map
- re = QRegExp("^.*&url_encoded_fmt_stream_map=([^&]+).*$");
- match = re.exactMatch(videoInfo);
- // handle regexp failure
- if (!match) {
- // qDebug() << "Cannot get urlMap. Trying next el param";
+ QRegExp fmtMapRE(JsFunctions::instance()->videoInfoFmtMapRE());
+ if (fmtMapRE.indexIn(videoInfo) == -1) {
+ qWarning() << "Cannot get urlMap. Trying next el param";
// Don't panic! We're gonna try another magic "el" param
elIndex++;
getVideoInfo();
@@ -194,7 +188,8 @@ void Video::gotVideoInfo(QByteArray data) {
// qDebug() << "Got token and urlMap" << elIndex;
- QString fmtUrlMap = re.cap(1);
+ QString fmtUrlMap = fmtMapRE.cap(1);
+ // qWarning() << "got fmtUrlMap" << fmtUrlMap;
fmtUrlMap = QByteArray::fromPercentEncoding(fmtUrlMap.toUtf8());
parseFmtUrlMap(fmtUrlMap);
}
@@ -339,18 +334,16 @@ void Video::scrapeWebPage(QByteArray data) {
return;
}
- QRegExp re(".*\"url_encoded_fmt_stream_map\":\\s+\"([^\"]+)\".*");
- bool match = re.exactMatch(html);
- // on regexp failure, stop and report error
- if (!match) {
- qWarning() << "Error parsing video page";
+ QRegExp fmtMapRE(JsFunctions::instance()->webPageFmtMapRE());
+ if (fmtMapRE.indexIn(html) == -1) {
+ // qWarning() << "Error parsing video page";
// emit errorStreamUrl("Error parsing video page");
// loadingStreamUrl = false;
elIndex++;
getVideoInfo();
return;
}
- fmtUrlMap = re.cap(1);
+ fmtUrlMap = fmtMapRE.cap(1);
fmtUrlMap.replace("\\u0026", "&");
// parseFmtUrlMap(fmtUrlMap, true);
@@ -367,7 +360,7 @@ void Video::scrapeWebPage(QByteArray data) {
}
#endif
- QRegExp jsPlayerRe("\"assets\":.+\"js\":\\s*\"([^\"]+)\"");
+ QRegExp jsPlayerRe(JsFunctions::instance()->jsPlayerRE());
if (jsPlayerRe.indexIn(html) != -1) {
QString jsPlayerUrl = jsPlayerRe.cap(1);
jsPlayerUrl.remove('\\');
@@ -384,55 +377,15 @@ void Video::scrapeWebPage(QByteArray data) {
}
}
-void Video::gotHeadHeaders(QNetworkReply* reply) {
- int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
- // qDebug() << "gotHeaders" << statusCode;
- if (statusCode == 200) {
- foundVideoUrl(videoToken, definitionCode);
- } else {
-
- // try next (lower quality) definition
- /*
- QStringList definitionNames = VideoDefinition::getDefinitionNames();
- int currentIndex = definitionNames.indexOf(currentDefinition);
- int previousIndex = 0;
- if (currentIndex > 0) {
- previousIndex = currentIndex - 1;
- }
- if (previousIndex > 0) {
- QString nextDefinitionName = definitionNames.at(previousIndex);
- findVideoUrl(nextDefinitionName);
- } else {
- foundVideoUrl(videoToken, 18);
- }*/
-
-
- QList<int> definitionCodes = VideoDefinition::getDefinitionCodes();
- int currentIndex = definitionCodes.indexOf(definitionCode);
- int previousIndex = 0;
- if (currentIndex > 0) {
- previousIndex = currentIndex - 1;
- int definitionCode = definitionCodes.at(previousIndex);
- if (definitionCode == 18) {
- // This is assumed always available
- foundVideoUrl(videoToken, 18);
- } else {
- findVideoUrl(definitionCode);
- }
-
- } else {
- foundVideoUrl(videoToken, 18);
- }
-
- }
-}
-
void Video::parseJsPlayer(QByteArray bytes) {
QString js = QString::fromUtf8(bytes);
// qWarning() << "jsPlayer" << js;
- QRegExp funcNameRe("signature=([" + jsNameChars + "]+)");
+
+ // QRegExp funcNameRe("\"signature\"\\w*,\\w*([" + jsNameChars + "]+)");
+ QRegExp funcNameRe(JsFunctions::instance()->signatureFunctionNameRE().arg(jsNameChars));
+
if (funcNameRe.indexIn(js) == -1) {
- qWarning() << "Cannot capture signature function name";
+ qWarning() << "Cannot capture signature function name" << js;
} else {
sigFuncName = funcNameRe.cap(1);
captureFunction(sigFuncName, js);
@@ -546,20 +499,6 @@ QString Video::decryptSignature(const QString &s) {
return QString();
}
return value.toString();
-}
-
-void Video::findVideoUrl(int definitionCode) {
- this->definitionCode = definitionCode;
-
- QUrl videoUrl = QUrl(QString(
- "http://www.youtube.com/get_video?video_id=%1&t=%2&eurl=&el=&ps=&asv=&fmt=%3"
- ).arg(videoId, videoToken, QString::number(definitionCode)));
-
- QObject *reply = The::http()->head(videoUrl);
- connect(reply, SIGNAL(finished(QNetworkReply*)), SLOT(gotHeadHeaders(QNetworkReply*)));
- // connect(reply, SIGNAL(error(QNetworkReply*)), SLOT(errorVideoInfo(QNetworkReply*)));
-
- // see you in gotHeadHeaders()
}
QString Video::formattedDuration() const {

View File

@ -0,0 +1,24 @@
$OpenBSD: patch-src_video_h,v 1.1 2014/12/17 10:02:08 dcoppa Exp $
commit 6ef6d1752c7fac4f1db7ddc283e934acc8a4556b
Author: Flavio <flavio.tordini@gmail.com>
Date: Thu Nov 13 13:22:36 2014 +0100
Fix VEVO videos
--- src/video.h.orig Thu Oct 23 05:47:15 2014
+++ src/video.h Wed Dec 17 03:42:47 2014
@@ -97,13 +97,11 @@ private slots:
void gotVideoInfo(QByteArray);
void errorVideoInfo(QNetworkReply*);
void scrapeWebPage(QByteArray);
- void gotHeadHeaders(QNetworkReply*);
void parseJsPlayer(QByteArray bytes);
void parseDashManifest(QByteArray bytes);
private:
void getVideoInfo();
- void findVideoUrl(int definitionCode);
void foundVideoUrl(QString videoToken, int definitionCode);
void parseFmtUrlMap(const QString &fmtUrlMap, bool fromWebPage = false);
void captureFunction(const QString &name, const QString &js);