From bd87415996b4b827e41cc2d62bfaa8e36dc694b0 Mon Sep 17 00:00:00 2001
From: KMY <tt@kmycode.net>
Date: Sun, 3 Sep 2023 10:27:24 +0900
Subject: [PATCH] Add link_preview setting

---
 app/models/account.rb                               | 8 ++++++++
 app/models/concerns/has_user_settings.rb            | 4 ++++
 app/models/user_settings.rb                         | 1 +
 app/services/fetch_link_card_service.rb             | 2 +-
 app/views/settings/preferences/other/show.html.haml | 3 +++
 config/locales/simple_form.en.yml                   | 1 +
 config/locales/simple_form.ja.yml                   | 1 +
 7 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/app/models/account.rb b/app/models/account.rb
index c9a36eb4b7..b94f208635 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -323,6 +323,13 @@ class Account < ApplicationRecord
     user&.setting_translatable_private || (settings.present? && settings['translatable_private']) || false
   end
 
+  def link_preview?
+    return user.setting_link_preview if local? && user.present?
+    return settings['link_preview'] if settings.present? && settings.key?('link_preview')
+
+    true
+  end
+
   def public_statuses_count
     hide_statuses_count? ? 0 : statuses_count
   end
@@ -389,6 +396,7 @@ class Account < ApplicationRecord
       'hide_following_count' => hide_following_count?,
       'hide_followers_count' => hide_followers_count?,
       'translatable_private' => translatable_private?,
+      'link_preview' => link_preview?,
     }
     if Setting.enable_block_emoji_reaction_settings
       config = config.merge({
diff --git a/app/models/concerns/has_user_settings.rb b/app/models/concerns/has_user_settings.rb
index 17ab1c2c1b..abc12cfb44 100644
--- a/app/models/concerns/has_user_settings.rb
+++ b/app/models/concerns/has_user_settings.rb
@@ -103,6 +103,10 @@ module HasUserSettings
     settings['translatable_private']
   end
 
+  def setting_link_preview
+    settings['link_preview']
+  end
+
   def setting_hide_statuses_count
     settings['hide_statuses_count']
   end
diff --git a/app/models/user_settings.rb b/app/models/user_settings.rb
index 1db8c53f7f..802d706191 100644
--- a/app/models/user_settings.rb
+++ b/app/models/user_settings.rb
@@ -13,6 +13,7 @@ class UserSettings
   setting :noindex, default: -> { ::Setting.noindex }
   setting :noai, default: true
   setting :translatable_private, default: false
+  setting :link_preview, default: true
   setting :bio_markdown, default: false
   setting :discoverable_local, default: false
   setting :hide_statuses_count, default: false
diff --git a/app/services/fetch_link_card_service.rb b/app/services/fetch_link_card_service.rb
index 790cf44548..8323c6cdfe 100644
--- a/app/services/fetch_link_card_service.rb
+++ b/app/services/fetch_link_card_service.rb
@@ -20,7 +20,7 @@ class FetchLinkCardService < BaseService
     @status       = status
     @original_url = parse_urls
 
-    return if @original_url.nil? || @status.preview_cards.any?
+    return if @original_url.nil? || @status.preview_cards.any? || !@status.account.link_preview?
 
     @url = @original_url.to_s
 
diff --git a/app/views/settings/preferences/other/show.html.haml b/app/views/settings/preferences/other/show.html.haml
index a01bce556c..788f8ac854 100644
--- a/app/views/settings/preferences/other/show.html.haml
+++ b/app/views/settings/preferences/other/show.html.haml
@@ -17,6 +17,9 @@
     .fields-group
       = ff.input :translatable_private, wrapper: :with_label, kmyblue: true, label: I18n.t('simple_form.labels.defaults.setting_translatable_private')
 
+    .fields-group
+      = ff.input :link_preview, wrapper: :with_label, kmyblue: true, label: I18n.t('simple_form.labels.defaults.setting_link_preview')
+
     %h4= t 'preferences.posting_defaults'
 
     .fields-row
diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml
index b6a70352b2..bf2d957c72 100644
--- a/config/locales/simple_form.en.yml
+++ b/config/locales/simple_form.en.yml
@@ -242,6 +242,7 @@ en:
         setting_hide_network: Hide your social graph
         setting_hide_recent_emojis: Hide recent emojis
         setting_hide_statuses_count: Hide statuses count
+        setting_link_preview: Generate post link preview card
         setting_noai: Set noai meta tags
         setting_public_post_to_unlisted: Convert public post to public unlisted if not using Web app
         setting_reduce_motion: Reduce motion in animations
diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml
index 28ac8994c4..a1c5c825a7 100644
--- a/config/locales/simple_form.ja.yml
+++ b/config/locales/simple_form.ja.yml
@@ -251,6 +251,7 @@ ja:
         setting_hide_network: 繋がりを隠す
         setting_hide_recent_emojis: 絵文字ピッカーで最近使用した絵文字を隠す(リアクションデッキのみを表示する)
         setting_hide_statuses_count: 投稿数を隠す
+        setting_link_preview: リンクのプレビューを生成する
         setting_stay_privacy: 投稿時に公開範囲を保存する
         setting_noai: 自分のコンテンツのAI学習利用に対して不快感を表明する
         setting_public_post_to_unlisted: サードパーティから公開範囲「公開」で投稿した場合、「ローカル公開」に変更する