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:
parent
e59a067db8
commit
226870430b
@ -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
|
||||
|
55
www/minitube/patches/patch-src_jsfunctions_cpp
Normal file
55
www/minitube/patches/patch-src_jsfunctions_cpp
Normal 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()");
|
||||
}
|
35
www/minitube/patches/patch-src_jsfunctions_h
Normal file
35
www/minitube/patches/patch-src_jsfunctions_h
Normal 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;
|
||||
};
|
20
www/minitube/patches/patch-src_main_cpp
Normal file
20
www/minitube/patches/patch-src_main_cpp
Normal 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);
|
198
www/minitube/patches/patch-src_video_cpp
Normal file
198
www/minitube/patches/patch-src_video_cpp
Normal 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 {
|
24
www/minitube/patches/patch-src_video_h
Normal file
24
www/minitube/patches/patch-src_video_h
Normal 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);
|
Loading…
Reference in New Issue
Block a user