#include "jsfunctions.h"
#include "temporary.h"
#include "compatibility/qurlqueryhelper.h"
+#include "datautils.h"
namespace The {
NetworkAccess* http();
connect(reply, SIGNAL(data(QByteArray)), SLOT(setThumbnail(QByteArray)));
}
-void Video::setThumbnail(QByteArray bytes) {
+void Video::setThumbnail(const QByteArray &bytes) {
loadingThumbnail = false;
+ qreal ratio = qApp->devicePixelRatio();
m_thumbnail = QPixmap();
m_thumbnail.loadFromData(bytes);
- if (m_thumbnail.width() > 160)
- m_thumbnail = m_thumbnail.scaledToWidth(160, Qt::SmoothTransformation);
+ m_thumbnail.setDevicePixelRatio(ratio);
+ const int thumbWidth = 160 * ratio;
+ if (m_thumbnail.width() > thumbWidth)
+ m_thumbnail = m_thumbnail.scaledToWidth(thumbWidth, Qt::SmoothTransformation);
emit gotThumbnail();
}
-void Video::loadMediumThumbnail() {
- if (m_mediumThumbnailUrl.isEmpty()) return;
- QObject *reply = The::http()->get(m_mediumThumbnailUrl);
- connect(reply, SIGNAL(data(QByteArray)), SIGNAL(gotMediumThumbnail(QByteArray)));
-}
-
void Video::loadStreamUrl() {
if (loadingStreamUrl) {
qDebug() << "Already loading stream URL for" << this->title();
// see you in gotVideoInfo...
}
-void Video::gotVideoInfo(QByteArray data) {
- QString videoInfo = QString::fromUtf8(data);
+void Video::gotVideoInfo(const QByteArray &bytes) {
+ QString videoInfo = QString::fromUtf8(bytes);
// qDebug() << "videoInfo" << videoInfo;
// get video token
// qDebug() << "fmtUrlMap" << fmtUrlMap;
const QStringList formatUrls = fmtUrlMap.split(',', QString::SkipEmptyParts);
QHash<int, QString> urlMap;
- foreach(QString formatUrl, formatUrls) {
+ foreach(const QString &formatUrl, formatUrls) {
// qDebug() << "formatUrl" << formatUrl;
const QStringList urlParams = formatUrl.split('&', QString::SkipEmptyParts);
// qDebug() << "urlParams" << urlParams;
int format = -1;
QString url;
QString sig;
- foreach(QString urlParam, urlParams) {
+ foreach(const QString &urlParam, urlParams) {
// qWarning() << urlParam;
if (urlParam.startsWith("itag=")) {
int separator = urlParam.indexOf("=");
emit errorStreamUrl(tr("Network error: %1 for %2").arg(reply->errorString(), reply->url().toString()));
}
-void Video::scrapeWebPage(QByteArray data) {
- QString html = QString::fromUtf8(data);
+void Video::scrapeWebPage(const QByteArray &bytes) {
+ QString html = QString::fromUtf8(bytes);
QRegExp ageGateRE(JsFunctions::instance()->ageGateRE());
if (ageGateRE.indexIn(html) != -1) {
}
}
-void Video::parseJsPlayer(QByteArray bytes) {
+void Video::parseJsPlayer(const QByteArray &bytes) {
QString js = QString::fromUtf8(bytes);
// qWarning() << "jsPlayer" << js;
parseFmtUrlMap(fmtUrlMap, true);
}
-void Video::parseDashManifest(QByteArray bytes) {
+void Video::parseDashManifest(const QByteArray &bytes) {
QFile file(Temporary::filename() + ".mpd");
if (!file.open(QIODevice::WriteOnly))
qWarning() << file.errorString() << file.fileName();
void Video::captureFunction(const QString &name, const QString &js) {
QRegExp funcRe("function\\s+" + QRegExp::escape(name) + "\\s*\\([" + jsNameChars + ",\\s]*\\)\\s*\\{[^\\}]+\\}");
if (funcRe.indexIn(js) == -1) {
- qWarning() << "Cannot capture function" << name;
- return;
+ // try var foo = function(bar) { };
+ funcRe = QRegExp("var\\s+" + QRegExp::escape(name) + "\\s*=\\s*function\\s*\\([" + jsNameChars + ",\\s]*\\)\\s*\\{[^\\}]+\\}");
+ if (funcRe.indexIn(js) == -1) {
+ qWarning() << "Cannot capture function" << name;
+ return;
+ }
}
QString func = funcRe.cap(0);
sigFunctions.insert(name, func);
QString Video::decryptSignature(const QString &s) {
if (sigFuncName.isEmpty()) return QString();
QScriptEngine engine;
- foreach (QString f, sigObjects.values()) {
+ foreach (const QString &f, sigObjects.values()) {
QScriptValue value = engine.evaluate(f);
if (value.isError())
qWarning() << "Error in" << f << value.toString();
}
- foreach (QString f, sigFunctions.values()) {
+ foreach (const QString &f, sigFunctions.values()) {
QScriptValue value = engine.evaluate(f);
if (value.isError())
qWarning() << "Error in" << f << value.toString();
}
QString Video::formattedDuration() const {
- QString format = m_duration > 3600 ? "h:mm:ss" : "m:ss";
- return QTime().addSecs(m_duration).toString(format);
+ return DataUtils::formatDuration(m_duration);
}
void Video::saveDefinitionForUrl(const QString& url, const VideoDefinition& definition) {