- SearchParams *params = new SearchParams();
- params->setChannelId(channel->getChannelId());
- params->setSortBy(SearchParams::SortByNewest);
- params->setTransient(true);
- params->setPublishedAfter(channel->getChecked());
- YTSearch *videoSource = new YTSearch(params, this);
- connect(videoSource, SIGNAL(gotVideos(QList<Video*>)), SLOT(videosLoaded(QList<Video*>)));
+ checkWebPage(channel);
+ } else
+ finish();
+}
+
+void ChannelAggregator::checkWebPage(YTChannel *channel) {
+ currentChannel = channel;
+
+ QString channelId = channel->getChannelId();
+ QString url;
+ if (channelId.startsWith("UC") && !channelId.contains(' ')) {
+ url = "https://www.youtube.com/channel/" + channelId + "/videos";
+ } else {
+ url = "https://www.youtube.com/user/" + channelId + "/videos";
+ }
+
+ QObject *reply = HttpUtils::yt().get(url);
+
+ connect(reply, SIGNAL(data(QByteArray)), SLOT(parseWebPage(QByteArray)));
+ connect(reply, SIGNAL(error(QString)), SLOT(errorWebPage(QString)));
+}
+
+void ChannelAggregator::parseWebPage(const QByteArray &bytes) {
+ bool hasNewVideos = true;
+ QRegExp re = QRegExp("[\\?&]v=([0-9A-Za-z_-]+)");
+ if (re.indexIn(bytes) != -1) {
+ QString videoId = re.cap(1);
+ QString latestVideoId = currentChannel->latestVideoId();
+ qDebug() << "Comparing" << videoId << latestVideoId;
+ hasNewVideos = videoId != latestVideoId;
+ } else {
+ qDebug() << "Cannot capture latest video id";
+ }
+ if (hasNewVideos) {
+ if (currentChannel) {
+ reallyProcessChannel(currentChannel);
+ currentChannel = 0;
+ }
+ } else {
+ currentChannel->updateChecked();
+ currentChannel = 0;
+ processNextChannel();
+ }
+}
+
+void ChannelAggregator::errorWebPage(const QString &message) {
+ Q_UNUSED(message);
+ reallyProcessChannel(currentChannel);
+ currentChannel = 0;
+}
+
+void ChannelAggregator::reallyProcessChannel(YTChannel *channel) {
+ SearchParams *params = new SearchParams();
+ params->setChannelId(channel->getChannelId());
+ params->setSortBy(SearchParams::SortByNewest);
+ params->setTransient(true);
+ params->setPublishedAfter(channel->getChecked());
+
+ if (VideoAPI::impl() == VideoAPI::YT3) {
+ YTSearch *videoSource = new YTSearch(params);
+ connect(videoSource, SIGNAL(gotVideos(QVector<Video *>)),
+ SLOT(videosLoaded(QVector<Video *>)));
+ videoSource->loadVideos(50, 1);
+ } else if (VideoAPI::impl() == VideoAPI::IV) {
+ auto *videoSource = new IVChannelSource(params);
+ connect(videoSource, SIGNAL(gotVideos(QVector<Video *>)),
+ SLOT(videosLoaded(QVector<Video *>)));
+ videoSource->loadVideos(50, 1);
+ } else if (VideoAPI::impl() == VideoAPI::JS) {
+ auto *videoSource = new YTJSChannelSource(params);
+ connect(videoSource, SIGNAL(gotVideos(QVector<Video *>)),
+ SLOT(videosLoaded(QVector<Video *>)));