feat: improve link previews

This commit is contained in:
AlexeyZavar
2026-02-12 22:10:42 +03:00
parent cf72307b95
commit 06fec79ce7
10 changed files with 59 additions and 5 deletions
+1
View File
@@ -7848,6 +7848,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"ayu_GhostModeShortcut" = "Enter with Ghost";
"ayu_SettingsShowMessageSeconds" = "Show Message Seconds";
"ayu_FilterZalgo" = "Filter Zalgo";
"ayu_ImproveLinkPreviews" = "Improve Link Previews";
"ayu_ShowOnlyAddedEmojisAndStickers" = "Show Only Added Emojis & Stickers";
"ayu_ContextCopyID" = "Copy ID";
"ayu_IDCopiedToast" = "ID copied to clipboard.";
+1 -1
View File
@@ -4225,7 +4225,7 @@ void ApiWrap::sendMessage(
action.options.shortcutId);
if (exactWebPage
&& !ignoreWebPage
&& (manualWebPage || sending.empty())) {
&& (manualWebPage || sending.empty() || message.webPage.previewChanged)) {
histories.sendPreparedMessage(
history,
action.replyTo,
@@ -792,6 +792,12 @@ void AyuSettings::setAdaptiveCoverColor(bool val) {
save();
}
void AyuSettings::setImproveLinkPreviews(bool val) {
if (_improveLinkPreviews.current() == val) return;
_improveLinkPreviews = val;
save();
}
void AyuSettings::setCrashReporting(bool val) {
if (_crashReporting.current() == val) return;
_crashReporting = val;
@@ -881,6 +887,7 @@ void to_json(nlohmann::json &j, const AyuSettings &s) {
{"voiceConfirmation", s._voiceConfirmation.current()},
{"translationProvider", s._translationProvider.current()},
{"adaptiveCoverColor", s._adaptiveCoverColor.current()},
{"improveLinkPreviews", s._improveLinkPreviews.current()},
{"crashReporting", s._crashReporting.current()}
};
}
@@ -972,5 +979,6 @@ void from_json(const nlohmann::json &j, AyuSettings &s) {
s._voiceConfirmation = j.value("voiceConfirmation", defaults._voiceConfirmation.current());
s._translationProvider = j.value("translationProvider", defaults._translationProvider.current());
s._adaptiveCoverColor = j.value("adaptiveCoverColor", defaults._adaptiveCoverColor.current());
s._improveLinkPreviews = j.value("improveLinkPreviews", defaults._improveLinkPreviews.current());
s._crashReporting = j.value("crashReporting", defaults._crashReporting.current());
}
+4
View File
@@ -234,6 +234,7 @@ public:
[[nodiscard]] bool voiceConfirmation() const { return _voiceConfirmation.current(); }
[[nodiscard]] const QString &translationProvider() const { return _translationProvider.current(); }
[[nodiscard]] bool adaptiveCoverColor() const { return _adaptiveCoverColor.current(); }
[[nodiscard]] bool improveLinkPreviews() const { return _improveLinkPreviews.current(); }
[[nodiscard]] bool crashReporting() const { return _crashReporting.current(); }
void setSaveDeletedMessages(bool val);
@@ -309,6 +310,7 @@ public:
void setVoiceConfirmation(bool val);
void setTranslationProvider(const QString &val);
void setAdaptiveCoverColor(bool val);
void setImproveLinkPreviews(bool val);
void setCrashReporting(bool val);
[[nodiscard]] rpl::producer<bool> useGlobalGhostModeChanges() const { return _useGlobalGhostMode.value(); }
@@ -385,6 +387,7 @@ public:
[[nodiscard]] rpl::producer<bool> voiceConfirmationChanges() const { return _voiceConfirmation.value(); }
[[nodiscard]] rpl::producer<QString> translationProviderChanges() const { return _translationProvider.value(); }
[[nodiscard]] rpl::producer<bool> adaptiveCoverColorChanges() const { return _adaptiveCoverColor.value(); }
[[nodiscard]] rpl::producer<bool> improveLinkPreviewsChanges() const { return _improveLinkPreviews.value(); }
[[nodiscard]] rpl::producer<bool> crashReportingChanges() const { return _crashReporting.value(); }
friend void to_json(nlohmann::json &j, const AyuSettings &s);
@@ -469,6 +472,7 @@ private:
rpl::variable<bool> _voiceConfirmation = false;
rpl::variable<QString> _translationProvider = QString("telegram");
rpl::variable<bool> _adaptiveCoverColor = true;
rpl::variable<bool> _improveLinkPreviews = true;
rpl::variable<bool> _crashReporting = true;
rpl::variable<bool> _useGlobalGhostMode = true;
@@ -161,6 +161,7 @@ void SetupQoLToggles(not_null<Ui::VerticalLayout*> container, not_null<Window::S
AddSettingToggle(container, tr::ayu_DisableNotificationsDelay(), &AyuSettings::disableNotificationsDelay, &AyuSettings::setDisableNotificationsDelay);
AddSettingToggle(container, tr::ayu_ImproveLinkPreviews(), &AyuSettings::improveLinkPreviews, &AyuSettings::setImproveLinkPreviews);
AddSectionDivider(container);
@@ -1471,6 +1471,37 @@ void getRegistrationDate(not_null<PeerData*> peer, Fn<void(TextWithEntities)> ca
}
}
QString getBetterLinkPreview(const QString &url) {
const auto &settings = AyuSettings::getInstance();
if (!settings.improveLinkPreviews()) {
return url;
}
auto parsed = QUrl(url);
if (!parsed.isValid() || parsed.host().isEmpty()) {
return url;
}
auto host = parsed.host().toLower();
if (host == u"twitter.com"_q || host == u"x.com"_q) {
parsed.setHost(u"fixupx.com"_q);
} else if (host == u"tiktok.com"_q || host.endsWith(u".tiktok.com"_q)) {
host.replace(u"tiktok.com"_q, u"kktiktok.com"_q);
parsed.setHost(host);
} else if (host == u"reddit.com"_q || host == u"www.reddit.com"_q) {
parsed.setHost(u"vxreddit.com"_q);
} else if (host == u"instagram.com"_q || host == u"www.instagram.com"_q) {
parsed.setHost(u"kkinstagram.com"_q);
} else if (host == u"pixiv.net"_q || host == u"www.pixiv.net"_q) {
parsed.setHost(u"phixiv.net"_q);
} else {
return url;
}
return parsed.toString();
}
void applyGhostScheduling(
not_null<Main::Session*> session,
Api::SendOptions &options,
@@ -123,8 +123,9 @@ bool prependPseudoReply(
void getRegistrationDate(not_null<PeerData*> peer, Fn<void(TextWithEntities)> callback);
QString getBetterLinkPreview(const QString &url);
void applyGhostScheduling(
not_null<Main::Session*> session,
Api::SendOptions &options,
int delaySeconds = 12);
+1
View File
@@ -42,6 +42,7 @@ struct WebPageDraft {
bool invert : 1 = false;
bool manual : 1 = false;
bool removed : 1 = false;
bool previewChanged : 1 = false;
friend inline bool operator==(const WebPageDraft&, const WebPageDraft&)
= default;
+3 -2
View File
@@ -125,11 +125,12 @@ MTPInputMedia WebPageForMTP(
const Data::WebPageDraft &draft,
bool required) {
using Flag = MTPDinputMediaWebPage::Flag;
const auto url = getBetterLinkPreview(draft.url);
return MTP_inputMediaWebPage(
MTP_flags(((false && required) ? Flag() : Flag::f_optional)
MTP_flags((draft.previewChanged ? Flag() : Flag::f_optional)
| (draft.forceLargeMedia ? Flag::f_force_large_media : Flag())
| (draft.forceSmallMedia ? Flag::f_force_small_media : Flag())),
MTP_string(draft.url));
MTP_string(url));
}
Histories::Histories(not_null<Session*> owner)
@@ -16,6 +16,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "lang/lang_keys.h"
#include "main/main_session.h"
// AyuGram includes
#include "ayu/utils/telegram_helpers.h"
namespace HistoryView::Controls {
WebPageText TitleAndDescriptionFromWebPage(not_null<WebPageData*> d) {
@@ -156,7 +160,7 @@ void WebpageResolver::request(const QString &link, bool force) {
_requestId = _api.request(
MTPmessages_GetWebPagePreview(
MTP_flags(0),
MTP_string(link),
MTP_string(getBetterLinkPreview(link)),
MTPVector<MTPMessageEntity>()
)).done([=](
const MTPmessages_WebPagePreview &result,
@@ -229,6 +233,7 @@ WebpageProcessor::WebpageProcessor(
if (_data) {
_draft.id = _data->id;
_draft.url = _data->url;
_draft.previewChanged = (getBetterLinkPreview(link) != link);
updateFromData();
} else {
_links = QStringList();
@@ -392,6 +397,7 @@ void WebpageProcessor::checkPreview() {
_data = page;
_draft.id = _data->id;
_draft.url = _data->url;
_draft.previewChanged = (getBetterLinkPreview(chosen) != chosen);
} else {
_data = nullptr;
_draft = {};