diff --git a/src/singletons/Settings.hpp b/src/singletons/Settings.hpp index 95f957fd..3b142db0 100644 --- a/src/singletons/Settings.hpp +++ b/src/singletons/Settings.hpp @@ -162,6 +162,7 @@ public: BoolSetting linksDoubleClickOnly = {"/links/doubleClickToOpen", false}; BoolSetting linkInfoTooltip = {"/links/linkInfoTooltip", false}; IntSetting thumbnailSize = {"/appearance/thumbnailSize", 0}; + IntSetting thumbnailSizeStream = {"/appearance/thumbnailSizeStream", 2}; BoolSetting unshortLinks = {"/links/unshortLinks", false}; BoolSetting lowercaseDomains = {"/links/linkLowercase", true}; diff --git a/src/widgets/settingspages/GeneralPage.cpp b/src/widgets/settingspages/GeneralPage.cpp index 6353b760..150973bb 100644 --- a/src/widgets/settingspages/GeneralPage.cpp +++ b/src/widgets/settingspages/GeneralPage.cpp @@ -544,6 +544,31 @@ void GeneralPage::initLayout(SettingsLayout &layout) else if (args.value == "Large") return 300; + return fuzzyToInt(args.value, 0); + }); + layout.addDropdown( + "Show stream thumbnail", {"Off", "Small", "Medium", "Large"}, + s.thumbnailSizeStream, + [](auto val) { + if (val == 0) + return QString("Off"); + else if (val == 1) + return QString("Small"); + else if (val == 2) + return QString("Medium"); + else if (val == 3) + return QString("Large"); + else + return QString::number(val); + }, + [](auto args) { + if (args.value == "Small") + return 1; + else if (args.value == "Medium") + return 2; + else if (args.value == "Large") + return 3; + return fuzzyToInt(args.value, 0); }); layout.addCheckbox("Double click to open links and other elements in chat", diff --git a/src/widgets/splits/SplitHeader.cpp b/src/widgets/splits/SplitHeader.cpp index b05a3428..d0df0b76 100644 --- a/src/widgets/splits/SplitHeader.cpp +++ b/src/widgets/splits/SplitHeader.cpp @@ -20,7 +20,6 @@ #include "widgets/splits/Split.hpp" #include "widgets/splits/SplitContainer.hpp" -#include #include #include #include @@ -85,12 +84,18 @@ namespace { return text; } - auto formatTooltip(const TwitchChannel::StreamStatus &s) + auto formatTooltip(const TwitchChannel::StreamStatus &s, QString thumbnail) { return QString(" \ -

%1%2%3%4%5 for %6 with %7 viewers

") +

%1%2%3%4%5%6 for %7 with %8 viewers

") .arg(s.title.toHtmlEscaped()) .arg(s.title.isEmpty() ? QString() : "

") + .arg(getSettings()->thumbnailSizeStream.getValue() > 0 + ? (thumbnail.isEmpty() + ? "Couldn't fetch thumbnail" + : "
") + : QString()) .arg(s.game.toHtmlEscaped()) .arg(s.game.isEmpty() ? QString() : "
") .arg(s.rerun ? "Vod-casting" : "Live") @@ -567,7 +572,38 @@ void SplitHeader::updateChannelText() if (streamStatus->live) { this->isLive_ = true; - this->tooltipText_ = formatTooltip(*streamStatus); + QString url = "https://static-cdn.jtvnw.net/" + "previews-ttv/live_user_" + + channel->getName().toLower(); + switch (getSettings()->thumbnailSizeStream.getValue()) + { + case 1: + url.append("-80x45.jpg"); + break; + case 2: + url.append("-160x90.jpg"); + break; + case 3: + url.append("-360x180.jpg"); + break; + default: + url = ""; + } + if (!url.isEmpty() && + (!this->lastThumbnail_.isValid() || + this->lastThumbnail_.elapsed() > 5 * 60 * 1000)) + { + NetworkRequest(url, NetworkRequestType::Get) + .onSuccess([this](auto result) -> Outcome { + this->thumbnail_ = + QString::fromLatin1(result.getData().toBase64()); + updateChannelText(); + return Success; + }) + .execute(); + this->lastThumbnail_.restart(); + } + this->tooltipText_ = formatTooltip(*streamStatus, this->thumbnail_); title += formatTitle(*streamStatus, *getSettings()); } else diff --git a/src/widgets/splits/SplitHeader.hpp b/src/widgets/splits/SplitHeader.hpp index fb58833e..7bd8042a 100644 --- a/src/widgets/splits/SplitHeader.hpp +++ b/src/widgets/splits/SplitHeader.hpp @@ -52,6 +52,8 @@ private: Split *const split_{}; QString tooltipText_{}; bool isLive_{false}; + QString thumbnail_; + QElapsedTimer lastThumbnail_; // ui Button *dropdownButton_{};