feat(youtube/overlay-buttons): launch external-downloader by clicking the offline download button in the video action bar

This commit is contained in:
inotia00 2023-06-28 22:14:49 +09:00
parent 196a1acefa
commit f2703c0c11
5 changed files with 65 additions and 2 deletions

View File

@ -0,0 +1,14 @@
package app.revanced.patches.youtube.overlaybutton.downloadbuttonhook.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import org.jf.dexlib2.AccessFlags
import org.jf.dexlib2.Opcode
object DownloadActionsFingerprint : MethodFingerprint(
returnType = "V",
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
parameters = listOf("L", "L", "Z"),
opcodes = listOf(Opcode.INVOKE_STATIC),
strings = listOf("offline/get_download_action")
)

View File

@ -0,0 +1,44 @@
package app.revanced.patches.youtube.overlaybutton.downloadbuttonhook.patch
import app.revanced.extensions.toErrorResult
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.util.smali.ExternalLabel
import app.revanced.patches.youtube.overlaybutton.downloadbuttonhook.fingerprints.DownloadActionsFingerprint
import app.revanced.patches.youtube.utils.annotations.YouTubeCompatibility
import app.revanced.util.integrations.Constants.UTILS_PATH
@Name("download-button-hook")
@Description("Replace download button with external download button.")
@YouTubeCompatibility
@Version("0.0.1")
class DownloadButtonHookPatch : BytecodePatch(
listOf(DownloadActionsFingerprint)
) {
override fun execute(context: BytecodeContext): PatchResult {
DownloadActionsFingerprint.result?.let {
it.mutableMethod.apply {
val targetIndex = it.scanResult.patternScanResult!!.startIndex
addInstructionsWithLabels(
targetIndex, """
invoke-static {}, $UTILS_PATH/HookDownloadButtonPatch;->shouldHookDownloadButton()Z
move-result v0
if-eqz v0, :default
invoke-static {}, $UTILS_PATH/HookDownloadButtonPatch;->startDownloadActivity()V
return-void
""", ExternalLabel("default", getInstruction(targetIndex))
)
}
} ?: return DownloadActionsFingerprint.toErrorResult()
return PatchResultSuccess()
}
}

View File

@ -11,6 +11,7 @@ import app.revanced.patcher.patch.ResourcePatch
import app.revanced.patcher.patch.annotations.DependsOn import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patcher.patch.annotations.Patch import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patches.youtube.overlaybutton.alwaysrepeat.patch.AlwaysRepeatPatch import app.revanced.patches.youtube.overlaybutton.alwaysrepeat.patch.AlwaysRepeatPatch
import app.revanced.patches.youtube.overlaybutton.downloadbuttonhook.patch.DownloadButtonHookPatch
import app.revanced.patches.youtube.utils.annotations.YouTubeCompatibility import app.revanced.patches.youtube.utils.annotations.YouTubeCompatibility
import app.revanced.patches.youtube.utils.overridespeed.patch.OverrideSpeedHookPatch import app.revanced.patches.youtube.utils.overridespeed.patch.OverrideSpeedHookPatch
import app.revanced.patches.youtube.utils.playerbutton.patch.PlayerButtonHookPatch import app.revanced.patches.youtube.utils.playerbutton.patch.PlayerButtonHookPatch
@ -30,6 +31,7 @@ import org.w3c.dom.Element
@DependsOn( @DependsOn(
[ [
AlwaysRepeatPatch::class, AlwaysRepeatPatch::class,
DownloadButtonHookPatch::class,
OverrideSpeedHookPatch::class, OverrideSpeedHookPatch::class,
PlayerButtonHookPatch::class, PlayerButtonHookPatch::class,
PlayerControlsPatch::class, PlayerControlsPatch::class,

View File

@ -389,6 +389,9 @@
<string name="revanced_hide_player_overlay_filter_summary_off">Player overlay filter is shown</string> <string name="revanced_hide_player_overlay_filter_summary_off">Player overlay filter is shown</string>
<string name="revanced_hide_player_overlay_filter_summary_on">Player overlay filter is hidden</string> <string name="revanced_hide_player_overlay_filter_summary_on">Player overlay filter is hidden</string>
<string name="revanced_hide_player_overlay_filter_title">Hide player overlay filter</string> <string name="revanced_hide_player_overlay_filter_title">Hide player overlay filter</string>
<string name="revanced_hook_download_button_summary">"Replace download button with external download button
Only available on YouTube v18.24.37+"</string>
<string name="revanced_hook_download_button_title">Hook download button</string>
<string name="revanced_hide_preview_comment_off">Preview comment is shown</string> <string name="revanced_hide_preview_comment_off">Preview comment is shown</string>
<string name="revanced_hide_preview_comment_on">Preview comment is hidden</string> <string name="revanced_hide_preview_comment_on">Preview comment is hidden</string>
<string name="revanced_hide_preview_comment_title">Hide preview comment</string> <string name="revanced_hide_preview_comment_title">Hide preview comment</string>

View File

@ -424,9 +424,9 @@
<SwitchPreference android:title="@string/revanced_overlay_button_always_repeat_title" android:key="revanced_overlay_button_always_repeat" android:defaultValue="true" android:summary="@string/revanced_overlay_button_always_repeat_summary" /> <SwitchPreference android:title="@string/revanced_overlay_button_always_repeat_title" android:key="revanced_overlay_button_always_repeat" android:defaultValue="true" android:summary="@string/revanced_overlay_button_always_repeat_summary" />
<SwitchPreference android:title="@string/revanced_overlay_button_copy_video_url_title" android:key="revanced_overlay_button_copy_video_url" android:defaultValue="true" android:summary="@string/revanced_overlay_button_copy_video_url_summary" /> <SwitchPreference android:title="@string/revanced_overlay_button_copy_video_url_title" android:key="revanced_overlay_button_copy_video_url" android:defaultValue="true" android:summary="@string/revanced_overlay_button_copy_video_url_summary" />
<SwitchPreference android:title="@string/revanced_overlay_button_copy_video_url_timestamp_title" android:key="revanced_overlay_button_copy_video_url_timestamp" android:defaultValue="false" android:summary="@string/revanced_overlay_button_copy_video_url_timestamp_summary" /> <SwitchPreference android:title="@string/revanced_overlay_button_copy_video_url_timestamp_title" android:key="revanced_overlay_button_copy_video_url_timestamp" android:defaultValue="false" android:summary="@string/revanced_overlay_button_copy_video_url_timestamp_summary" />
<SwitchPreference android:title="@string/revanced_overlay_button_external_downloader_title" android:key="revanced_overlay_button_external_downloader" android:defaultValue="false" android:summary="@string/revanced_overlay_button_external_downloader_summary" /> <SwitchPreference android:title="@string/revanced_overlay_button_external_downloader_title" android:key="revanced_overlay_button_external_downloader" android:defaultValue="true" android:summary="@string/revanced_overlay_button_external_downloader_summary" />
<SwitchPreference android:title="@string/revanced_overlay_button_speed_dialog_title" android:key="revanced_overlay_button_speed_dialog" android:defaultValue="true" android:summary="@string/revanced_overlay_button_speed_dialog_summary" /> <SwitchPreference android:title="@string/revanced_overlay_button_speed_dialog_title" android:key="revanced_overlay_button_speed_dialog" android:defaultValue="true" android:summary="@string/revanced_overlay_button_speed_dialog_summary" />
<PreferenceScreen android:title="@string/revanced_external_downloader_settings_title" android:key="downloader" android:summary="@string/revanced_external_downloader_settings_summary"> <PreferenceScreen android:title="@string/revanced_external_downloader_settings_title" android:key="external_downloader" android:summary="@string/revanced_external_downloader_settings_summary">
<Preference android:title=" " android:selectable="false" android:summary="@string/revanced_external_downloader_settings_title" /> <Preference android:title=" " android:selectable="false" android:summary="@string/revanced_external_downloader_settings_title" />
<app.revanced.integrations.settingsmenu.ResettableEditTextPreference android:hint="com.deniscerri.ytdl" android:title="@string/revanced_external_downloader_name_title" android:key="revanced_external_downloader_name" android:summary="@string/revanced_external_downloader_name_summary" android:inputType="text" /> <app.revanced.integrations.settingsmenu.ResettableEditTextPreference android:hint="com.deniscerri.ytdl" android:title="@string/revanced_external_downloader_name_title" android:key="revanced_external_downloader_name" android:summary="@string/revanced_external_downloader_name_summary" android:inputType="text" />
</PreferenceScreen> </PreferenceScreen>