#ifndef VIDEO_H
#define VIDEO_H
+#include <QtCore>
#include <QtGui>
-#include <QtNetwork>
-class Video : public QObject {
+#include "ytthumb.h"
+
+class YTVideo;
+class YTJSVideo;
+class VariantPromise;
+class Video : public QObject {
Q_OBJECT
public:
Video();
- Video* clone();
-
- enum License {
- LicenseYouTube = 1,
- LicenseCC
- };
+ ~Video();
+ Video *clone();
- const QString & title() const { return m_title; }
- void setTitle( QString title ) { m_title = title; }
+ enum License { LicenseYouTube = 1, LicenseCC };
+ Q_ENUM(License)
- const QString & description() const { return m_description; }
- void setDescription( QString description ) { m_description = description; }
+ const QString &getTitle() const { return title; }
+ void setTitle(const QString &value) { title = value; }
- const QString & author() const { return m_author; }
- void setAuthor( QString author ) { m_author = author; }
+ const QString &getDescription() const { return description; }
+ void setDescription(const QString &value) { description = value; }
- const QString & userId() const { return m_userId; }
- void setUserId( QString userId ) { m_userId = userId; }
+ const QString &getChannelTitle() const { return channelTitle; }
+ void setChannelTitle(const QString &value) { channelTitle = value; }
- const QUrl & webpage() const { return m_webpage; }
- void setWebpage(QUrl webpage);
+ const QString &getChannelId() const { return channelId; }
+ void setChannelId(const QString &value) { channelId = value; }
- void loadThumbnail();
- const QPixmap & thumbnail() const { return m_thumbnail; }
+ const QString &getWebpage();
+ void setWebpage(const QString &value);
- const QString & thumbnailUrl() { return m_thumbnailUrl; }
- void setThumbnailUrl(QString url) { m_thumbnailUrl = url; }
+ int getDuration() const { return duration; }
+ void setDuration(int value);
+ const QString &getFormattedDuration() const { return formattedDuration; }
- void loadMediumThumbnail();
- const QString & mediumThumbnailUrl() { return m_mediumThumbnailUrl; }
- void setMediumThumbnailUrl(QString url) { m_mediumThumbnailUrl = url; }
+ int getViewCount() const { return viewCount; }
+ void setViewCount(int value);
+ const QString &getFormattedViewCount() const { return formattedViewCount; }
- int duration() const { return m_duration; }
- void setDuration( int duration ) { m_duration = duration; }
- QString formattedDuration() const;
-
- int viewCount() const { return m_viewCount; }
- void setViewCount( int viewCount ) { m_viewCount = viewCount; }
-
- const QDateTime & published() const { return m_published; }
- void setPublished( QDateTime published ) { m_published = published; }
+ const QDateTime &getPublished() const { return published; }
+ void setPublished(const QDateTime &value);
+ const QString &getFormattedPublished() const { return formattedPublished; }
int getDefinitionCode() const { return definitionCode; }
void loadStreamUrl();
- const QUrl & getStreamUrl() { return m_streamUrl; }
+ const QString &getStreamUrl() { return streamUrl; }
+ bool isLoadingStreamUrl() const;
+ void abortLoadStreamUrl();
- void setId(QString id) { videoId = id; }
- const QString & id() const { return videoId; }
+ const QString &getId() const { return id; }
+ void setId(const QString &value) { id = value; }
- void setLicense(License license) { m_license = license; }
- License license() const { return m_license; }
+ License getLicense() const { return license; }
+ void setLicense(License value) { license = value; }
+
+ const auto &getThumbs() const { return thumbs; }
+ void addThumb(int width, int height, QString url);
+ VariantPromise &loadThumb(QSize size, qreal pixelRatio);
signals:
- void gotThumbnail();
- void gotMediumThumbnail(QByteArray bytes);
- void gotStreamUrl(QUrl streamUrl);
- void errorStreamUrl(QString message);
+ void gotStreamUrl(const QString &videoUrl, const QString &audioUrl);
+ void errorStreamUrl(const QString &message);
+ void changed();
private slots:
- void setThumbnail(QByteArray bytes);
- void gotVideoInfo(QByteArray);
- void errorVideoInfo(QNetworkReply*);
- void scrapeWebPage(QByteArray);
- void gotHeadHeaders(QNetworkReply*);
- void parseJsPlayer(QByteArray);
+ void streamUrlLoaded(const QString &streamUrl, const QString &audioUrl);
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);
- void captureObject(const QString &name, const QString &js);
- QString decryptSignature(const QString &s);
-
- QString m_title;
- QString m_description;
- QString m_author;
- QString m_userId;
- QUrl m_webpage;
- QUrl m_streamUrl;
- QPixmap m_thumbnail;
- QString m_thumbnailUrl;
- QString m_mediumThumbnailUrl;
- int m_duration;
- QDateTime m_published;
- int m_viewCount;
- License m_license;
- QString videoId;
- QString videoToken;
+ void loadStreamUrlJS();
+ void loadStreamUrlYT();
+
+ QString title;
+ QString description;
+ QString channelTitle;
+ QString channelId;
+ QString webpage;
+ QString streamUrl;
+ int duration;
+ QString formattedDuration;
+
+ QDateTime published;
+ QString formattedPublished;
+ int viewCount;
+ QString formattedViewCount;
+ License license;
+ QString id;
int definitionCode;
- // current index for the elTypes list
- // needed to iterate on elTypes
- int elIndex;
- bool ageGate;
-
- bool loadingStreamUrl;
- bool loadingThumbnail;
-
- QString fmtUrlMap;
- QString sigFuncName;
- QHash<QString, QString> sigFunctions;
- QHash<QString, QString> sigObjects;
+ YTVideo *ytVideo;
+ YTJSVideo *ytjsVideo;
+
+ QVector<YTThumb> thumbs;
+ bool thumbsNeedSorting = false;
};
// This is required in order to use QPointer<Video> as a QVariant