Skip to content

Commit

Permalink
Fix signiture parsing algorithm
Browse files Browse the repository at this point in the history
Signed-off-by: Ivaylo Dimitrov <ivo.g.dimitrov.75@gmail.com>
  • Loading branch information
freemangordon committed Sep 1, 2019
1 parent 5662a8c commit 4c4d606
Showing 1 changed file with 24 additions and 18 deletions.
42 changes: 24 additions & 18 deletions src/streamsrequest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,6 @@ static QString unescape(const QString &s) {

foreach (QString part, parts) {
part = unescape(part);
part.replace(QRegExp("(^|&)sig="), "&signature=");
QStringList splitPart = part.split("url=");

if (!splitPart.isEmpty()) {
Expand All @@ -259,11 +258,7 @@ static QString unescape(const QString &s) {
QUrlQuery query(url);

foreach (const QString &param, params) {
query.addQueryItem(param.section('=', 0, 0), param.section('=', -1));
}

if (!query.hasQueryItem("signature")) {
query.addQueryItem("signature", splitPart.first().section("signature=", 1, 1).section('&', 0, 0));
query.addQueryItem(param.section('=', 0, 0), param.section('=', 1));
}

url.setQuery(query);
Expand All @@ -272,11 +267,7 @@ static QString unescape(const QString &s) {
format["url"] = url;
#else
foreach (const QString &param, params) {
url.addQueryItem(param.section('=', 0, 0), param.section('=', -1));
}

if (!url.hasQueryItem("signature")) {
url.addQueryItem("signature", splitPart.first().section("signature=", 1, 1).section('&', 0, 0));
url.addQueryItem(param.section('=', 0, 0), param.section('=', 1));
}

Format format = formatHash.value(url.queryItemValue("itag"));
Expand Down Expand Up @@ -321,10 +312,23 @@ static QString unescape(const QString &s) {
else
sp = "signature";

part.replace(QRegExp("(^|&)s="), "&" + sp + "=");
QString oldSig = part.section(sp + "=", 1, 1).section('&', 0, 0);
if (QRegExp("(^|&)s=").indexIn(part) != -1)
{
QString oldSig;

if (part.startsWith("s="))
{
oldSig = part.section("s=", 1, 1).section('&', 0, 0);
part.replace(0,2 , sp + "=");
}
else
{
oldSig = part.section("&s=", 1, 1).section('&', 0, 0);
part.replace(QRegExp("&s="), "&" + sp + "=");
}

part.replace(oldSig, decryptionFunction.call(QScriptValue(), QScriptValueList() << oldSig).toString());
part.replace(oldSig, decryptionFunction.call(QScriptValue(), QScriptValueList() << oldSig).toString());
}

QStringList splitPart = part.split("url=");

Expand All @@ -334,11 +338,12 @@ static QString unescape(const QString &s) {
params.removeDuplicates();

QUrl url(urlString.left(urlString.indexOf('?')));

#if QT_VERSION >= 0x050000
QUrlQuery query(url);

foreach (const QString &param, params) {
query.addQueryItem(param.section('=', 0, 0), param.section('=', -1));
query.addQueryItem(param.section('=', 0, 0), param.section('=', 1));
}

if (!query.hasQueryItem(sp)) {
Expand Down Expand Up @@ -413,7 +418,6 @@ static QString unescape(const QString &s) {
else {
response = response.section("url_encoded_fmt_stream_map=", 1, 1);
QString separator = response.left(response.indexOf('%'));

if ((separator == "s") || (response.contains("%26s%3D"))) {
#ifdef QYOUTUBE_DEBUG
qDebug() << "QYouTube::StreamsRequestPrivate::_q_onVideoInfoLoaded: Video has encrypted signatures. \
Expand Down Expand Up @@ -466,9 +470,11 @@ static QString unescape(const QString &s) {
response = response.section("url_encoded_fmt_stream_map\":\"", 1, 1).section("\",\"", 0, 0)
.trimmed().replace("\\u0026", "&")
.remove(QRegExp("itag=\\d+"));

if (response.contains("sig=")) {

if (response.startsWith("sig%3D", Qt::CaseInsensitive) ||
response.contains("%26sig%3D", Qt::CaseInsensitive)) {
extractVideoStreams();
return;
}
else {
bool ok;
Expand Down

0 comments on commit 4c4d606

Please sign in to comment.