From 9733b6090daec5ae50fe6ea51ea62d4943da3ae1 Mon Sep 17 00:00:00 2001
From: inotia00 <108592928+inotia00@users.noreply.github.com>
Date: Sun, 13 Oct 2024 22:54:56 +0900
Subject: [PATCH] feat(YouTube/YT Music): add `Return YouTube Username` patch
---
.../visual/VisualPreferencesIconsPatch.kt | 1 +
.../ReturnYouTubeUsernamePatch.kt | 40 +++++++++++++++++++
.../music/utils/settings/CategoryType.kt | 1 +
.../patches/shared/integrations/Constants.kt | 3 +-
.../BaseReturnYouTubeUsernamePatch.kt | 19 +++++++++
.../visual/VisualPreferencesIconsPatch.kt | 1 +
.../ReturnYouTubeUsernamePatch.kt | 34 ++++++++++++++++
.../utils/settings/SettingsBytecodePatch.kt | 4 +-
.../music/settings/host/values/strings.xml | 17 ++++++++
...ce_screen_return_youtube_username_icon.xml | 18 +++++++++
.../youtube/settings/host/values/strings.xml | 17 ++++++++
.../youtube/settings/xml/revanced_prefs.xml | 9 +++++
...ce_screen_return_youtube_username_icon.xml | 18 +++++++++
13 files changed, 179 insertions(+), 3 deletions(-)
create mode 100644 src/main/kotlin/app/revanced/patches/music/utils/returnyoutubeusername/ReturnYouTubeUsernamePatch.kt
create mode 100644 src/main/kotlin/app/revanced/patches/shared/returnyoutubeusername/BaseReturnYouTubeUsernamePatch.kt
create mode 100644 src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubeusername/ReturnYouTubeUsernamePatch.kt
create mode 100644 src/main/resources/music/visual/shared/drawable/revanced_preference_screen_return_youtube_username_icon.xml
create mode 100644 src/main/resources/youtube/visual/shared/drawable/revanced_preference_screen_return_youtube_username_icon.xml
diff --git a/src/main/kotlin/app/revanced/patches/music/layout/visual/VisualPreferencesIconsPatch.kt b/src/main/kotlin/app/revanced/patches/music/layout/visual/VisualPreferencesIconsPatch.kt
index c7969c38a5..1306f0c3f0 100644
--- a/src/main/kotlin/app/revanced/patches/music/layout/visual/VisualPreferencesIconsPatch.kt
+++ b/src/main/kotlin/app/revanced/patches/music/layout/visual/VisualPreferencesIconsPatch.kt
@@ -139,6 +139,7 @@ object VisualPreferencesIconsPatch : BaseResourcePatch(
"revanced_preference_screen_settings",
"revanced_preference_screen_video",
"revanced_preference_screen_ryd",
+ "revanced_preference_screen_return_youtube_username",
"revanced_preference_screen_sb",
"revanced_preference_screen_misc",
)
diff --git a/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubeusername/ReturnYouTubeUsernamePatch.kt b/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubeusername/ReturnYouTubeUsernamePatch.kt
new file mode 100644
index 0000000000..442f28a1fa
--- /dev/null
+++ b/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubeusername/ReturnYouTubeUsernamePatch.kt
@@ -0,0 +1,40 @@
+package app.revanced.patches.music.utils.returnyoutubeusername
+
+import app.revanced.patcher.data.BytecodeContext
+import app.revanced.patches.music.utils.compatibility.Constants.COMPATIBLE_PACKAGE
+import app.revanced.patches.music.utils.settings.CategoryType
+import app.revanced.patches.music.utils.settings.SettingsPatch
+import app.revanced.patches.shared.returnyoutubeusername.BaseReturnYouTubeUsernamePatch
+import app.revanced.util.patch.BaseBytecodePatch
+
+@Suppress("unused")
+object ReturnYouTubeUsernamePatch : BaseBytecodePatch(
+ name = "Return YouTube Username",
+ description = "Adds option to replace YouTube Handle with Username in comments using YouTube Data API v3.",
+ dependencies = setOf(
+ BaseReturnYouTubeUsernamePatch::class,
+ SettingsPatch::class,
+ ),
+ compatiblePackages = COMPATIBLE_PACKAGE,
+ use = false
+) {
+ override fun execute(context: BytecodeContext) {
+
+ SettingsPatch.addSwitchPreference(
+ CategoryType.RETURN_YOUTUBE_USERNAME,
+ "revanced_return_youtube_username_enabled",
+ "false"
+ )
+ SettingsPatch.addPreferenceWithIntent(
+ CategoryType.RETURN_YOUTUBE_USERNAME,
+ "revanced_return_youtube_username_youtube_data_api_v3_developer_key",
+ "revanced_return_youtube_username_enabled"
+ )
+ if (SettingsPatch.upward0627) {
+ SettingsPatch.addPreferenceWithIntent(
+ CategoryType.RETURN_YOUTUBE_USERNAME,
+ "revanced_return_youtube_username_youtube_data_api_v3_about"
+ )
+ }
+ }
+}
diff --git a/src/main/kotlin/app/revanced/patches/music/utils/settings/CategoryType.kt b/src/main/kotlin/app/revanced/patches/music/utils/settings/CategoryType.kt
index 4219f5ba33..875ccfa44f 100644
--- a/src/main/kotlin/app/revanced/patches/music/utils/settings/CategoryType.kt
+++ b/src/main/kotlin/app/revanced/patches/music/utils/settings/CategoryType.kt
@@ -11,6 +11,7 @@ enum class CategoryType(val value: String, var added: Boolean) {
SETTINGS("settings", false),
VIDEO("video", false),
RETURN_YOUTUBE_DISLIKE("ryd", false),
+ RETURN_YOUTUBE_USERNAME("return_youtube_username", false),
SPONSOR_BLOCK("sb", false),
MISC("misc", false)
}
\ No newline at end of file
diff --git a/src/main/kotlin/app/revanced/patches/shared/integrations/Constants.kt b/src/main/kotlin/app/revanced/patches/shared/integrations/Constants.kt
index 59d7f47aeb..03c2e3fe8f 100644
--- a/src/main/kotlin/app/revanced/patches/shared/integrations/Constants.kt
+++ b/src/main/kotlin/app/revanced/patches/shared/integrations/Constants.kt
@@ -6,6 +6,7 @@ object Constants {
const val PATCHES_PATH = "$INTEGRATIONS_PATH/patches"
const val COMPONENTS_PATH = "$PATCHES_PATH/components"
+ const val INTEGRATIONS_UTILS_PATH = "$INTEGRATIONS_PATH/utils"
const val INTEGRATIONS_SETTING_CLASS_DESCRIPTOR = "$INTEGRATIONS_PATH/settings/Setting;"
- const val INTEGRATIONS_UTILS_CLASS_DESCRIPTOR = "$INTEGRATIONS_PATH/utils/Utils;"
+ const val INTEGRATIONS_UTILS_CLASS_DESCRIPTOR = "$INTEGRATIONS_UTILS_PATH/Utils;"
}
\ No newline at end of file
diff --git a/src/main/kotlin/app/revanced/patches/shared/returnyoutubeusername/BaseReturnYouTubeUsernamePatch.kt b/src/main/kotlin/app/revanced/patches/shared/returnyoutubeusername/BaseReturnYouTubeUsernamePatch.kt
new file mode 100644
index 0000000000..daf5814dd2
--- /dev/null
+++ b/src/main/kotlin/app/revanced/patches/shared/returnyoutubeusername/BaseReturnYouTubeUsernamePatch.kt
@@ -0,0 +1,19 @@
+package app.revanced.patches.shared.returnyoutubeusername
+
+import app.revanced.patcher.data.BytecodeContext
+import app.revanced.patcher.patch.BytecodePatch
+import app.revanced.patcher.patch.annotation.Patch
+import app.revanced.patches.shared.integrations.Constants.PATCHES_PATH
+import app.revanced.patches.shared.textcomponent.TextComponentPatch
+
+@Patch(dependencies = [TextComponentPatch::class])
+object BaseReturnYouTubeUsernamePatch : BytecodePatch(emptySet()) {
+ private const val INTEGRATIONS_CLASS_DESCRIPTOR =
+ "$PATCHES_PATH/ReturnYouTubeUsernamePatch;"
+
+ override fun execute(context: BytecodeContext) {
+ TextComponentPatch.hookSpannableString(INTEGRATIONS_CLASS_DESCRIPTOR, "preFetchLithoText")
+ TextComponentPatch.hookTextComponent(INTEGRATIONS_CLASS_DESCRIPTOR)
+ }
+}
+
diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/visual/VisualPreferencesIconsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/visual/VisualPreferencesIconsPatch.kt
index 39ba1eddd9..46a2abeb25 100644
--- a/src/main/kotlin/app/revanced/patches/youtube/layout/visual/VisualPreferencesIconsPatch.kt
+++ b/src/main/kotlin/app/revanced/patches/youtube/layout/visual/VisualPreferencesIconsPatch.kt
@@ -195,6 +195,7 @@ object VisualPreferencesIconsPatch : BaseResourcePatch(
"revanced_preference_screen_swipe_controls",
"revanced_preference_screen_video",
"revanced_preference_screen_ryd",
+ "revanced_preference_screen_return_youtube_username",
"revanced_preference_screen_sb",
"revanced_preference_screen_misc",
)
diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubeusername/ReturnYouTubeUsernamePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubeusername/ReturnYouTubeUsernamePatch.kt
new file mode 100644
index 0000000000..6f0cca8806
--- /dev/null
+++ b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubeusername/ReturnYouTubeUsernamePatch.kt
@@ -0,0 +1,34 @@
+package app.revanced.patches.youtube.utils.returnyoutubeusername
+
+import app.revanced.patcher.data.BytecodeContext
+import app.revanced.patches.shared.returnyoutubeusername.BaseReturnYouTubeUsernamePatch
+import app.revanced.patches.youtube.utils.compatibility.Constants.COMPATIBLE_PACKAGE
+import app.revanced.patches.youtube.utils.settings.SettingsPatch
+import app.revanced.util.patch.BaseBytecodePatch
+
+@Suppress("unused")
+object ReturnYouTubeUsernamePatch : BaseBytecodePatch(
+ name = "Return YouTube Username",
+ description = "Adds option to replace YouTube Handle with Username in comments using YouTube Data API v3.",
+ dependencies = setOf(
+ BaseReturnYouTubeUsernamePatch::class,
+ SettingsPatch::class,
+ ),
+ compatiblePackages = COMPATIBLE_PACKAGE,
+ use = false
+) {
+ override fun execute(context: BytecodeContext) {
+
+ /**
+ * Add settings
+ */
+ SettingsPatch.addPreference(
+ arrayOf(
+ "PREFERENCE_SCREEN: RETURN_YOUTUBE_USERNAME"
+ )
+ )
+
+ SettingsPatch.updatePatchStatus(this)
+
+ }
+}
diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/settings/SettingsBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/settings/SettingsBytecodePatch.kt
index d4625b195e..e46e4a1236 100644
--- a/src/main/kotlin/app/revanced/patches/youtube/utils/settings/SettingsBytecodePatch.kt
+++ b/src/main/kotlin/app/revanced/patches/youtube/utils/settings/SettingsBytecodePatch.kt
@@ -8,8 +8,8 @@ import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patches.shared.integrations.Constants.INTEGRATIONS_UTILS_CLASS_DESCRIPTOR
+import app.revanced.patches.shared.integrations.Constants.INTEGRATIONS_UTILS_PATH
import app.revanced.patches.shared.mapping.ResourceMappingPatch
-import app.revanced.patches.youtube.utils.integrations.Constants.INTEGRATIONS_PATH
import app.revanced.patches.youtube.utils.integrations.Constants.UTILS_PATH
import app.revanced.patches.youtube.utils.mainactivity.MainActivityResolvePatch
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch
@@ -31,7 +31,7 @@ object SettingsBytecodePatch : BytecodePatch(
"$UTILS_PATH/InitializationPatch;"
private const val INTEGRATIONS_THEME_METHOD_DESCRIPTOR =
- "$INTEGRATIONS_PATH/utils/ThemeUtils;->setTheme(Ljava/lang/Enum;)V"
+ "$INTEGRATIONS_UTILS_PATH/BaseThemeUtils;->setTheme(Ljava/lang/Enum;)V"
internal lateinit var contexts: BytecodeContext
diff --git a/src/main/resources/music/settings/host/values/strings.xml b/src/main/resources/music/settings/host/values/strings.xml
index bd037e0e1b..ef7bbb9c25 100644
--- a/src/main/resources/music/settings/host/values/strings.xml
+++ b/src/main/resources/music/settings/host/values/strings.xml
@@ -318,6 +318,23 @@ Some features may not work properly in the old player layout."
Hidden
+
+ Return YouTube Username
+
+ Enable Return YouTube Username
+ Show Username instead of Handle in comments.
+ YouTube Data API key
+ The developer key for using the YouTube Data API v3.
+ About YouTube Data API key
+ "YouTube Data API v3 Developer Key is required to replace Handle with Username.
+
+The daily quota for API keys on the free plan is 10,000, and 1 quota is used to replace Handle with Username for 1 comment.
+
+Click to see how to issue a API key."
+ Issue YouTube Data API v3 developer key
+ 1. Go to <a href=%1$s>Create a new project</a>.<br>2. Click the <b>CREATE</b> button.<br>3. Go to <a href=%2$s>YouTube Data API v3</a>.<br>4. Click the <b>ENABLE</b> button.<br>5. Click the <b>CREATE CREDENTIALS</b> button.<br>6. Select the <b>Public data</b> option.<br>7. Click the <b>NEXT</b> button.<br>8. Copy the API key.<br><br>※ API key should never be shared with others, so it is not included in Import / Export settings.
+
+
SponsorBlock
diff --git a/src/main/resources/music/visual/shared/drawable/revanced_preference_screen_return_youtube_username_icon.xml b/src/main/resources/music/visual/shared/drawable/revanced_preference_screen_return_youtube_username_icon.xml
new file mode 100644
index 0000000000..44d1ed65a0
--- /dev/null
+++ b/src/main/resources/music/visual/shared/drawable/revanced_preference_screen_return_youtube_username_icon.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/youtube/settings/host/values/strings.xml b/src/main/resources/youtube/settings/host/values/strings.xml
index 709c7bf0d8..98023d30f6 100644
--- a/src/main/resources/youtube/settings/host/values/strings.xml
+++ b/src/main/resources/youtube/settings/host/values/strings.xml
@@ -1483,6 +1483,23 @@ Limitation: Dislikes may not appear if the user is not logged in or in incognito
Hidden
+
+ Return YouTube Username
+
+ Enable Return YouTube Username
+ Username is used.
+ Handle is used.
+ YouTube Data API key
+ The developer key for using the YouTube Data API v3.
+ About YouTube Data API key
+ "YouTube Data API v3 Developer Key is required to replace Handle with Username.
+
+The daily quota for API keys on the free plan is 10,000, and 1 quota is used to replace Handle with Username for 1 comment.
+
+Click to see how to issue a API key."
+ Issue YouTube Data API v3 developer key
+ 1. Go to <a href=%1$s>Create a new project</a>.<br>2. Click the <b>CREATE</b> button.<br>3. Go to <a href=%2$s>YouTube Data API v3</a>.<br>4. Click the <b>ENABLE</b> button.<br>5. Click the <b>CREATE CREDENTIALS</b> button.<br>6. Select the <b>Public data</b> option.<br>7. Click the <b>NEXT</b> button.<br>8. Copy the API key.<br><br>※ API key should never be shared with others, so it is not included in Import / Export settings.
+
SponsorBlock
diff --git a/src/main/resources/youtube/settings/xml/revanced_prefs.xml b/src/main/resources/youtube/settings/xml/revanced_prefs.xml
index 64b6997793..d971fb4875 100644
--- a/src/main/resources/youtube/settings/xml/revanced_prefs.xml
+++ b/src/main/resources/youtube/settings/xml/revanced_prefs.xml
@@ -664,6 +664,14 @@
PREFERENCE_SCREEN: RETURN_YOUTUBE_DISLIKE -->
+
+
+