Skip to content

Commit b29d8fb

Browse files
committed
YouTube: Add External Download Button
1 parent 3678155 commit b29d8fb

File tree

6 files changed

+108
-3
lines changed

6 files changed

+108
-3
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
- Remember video quality changes
2424
- Show advanced video quality menu
2525
- Copy video url video player button
26+
- Open external downloader app
2627

2728
### Spotify
2829
- Unlock Spotify Premium

app/build.gradle.kts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,8 @@ abstract class CopyResourcesTask @Inject constructor() : DefaultTask() {
189189
"settings/drawable",
190190
"sponsorblock/drawable",
191191
"swipecontrols/drawable",
192-
"copyvideourl/drawable"
192+
"copyvideourl/drawable",
193+
"downloads/drawable"
193194
)
194195

195196
for (drawable in drawables) {

app/src/main/java/io/github/chsbuffer/revancedxposed/shared/misc/settings/preference/TextPreference.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
package io.github.chsbuffer.revancedxposed.shared.misc.settings.preference
44

5-
import android.preference.EditTextPreference
5+
import android.preference.Preference
66
import app.revanced.extension.shared.settings.preference.ResettableEditTextPreference
77

88
class TextPreference(
@@ -11,7 +11,7 @@ class TextPreference(
1111
summaryKey: String? = "${key}_summary",
1212
icon: String? = null,
1313
layout: String? = null,
14-
tag: Class<out EditTextPreference> = ResettableEditTextPreference::class.java,
14+
tag: Class<out Preference> = ResettableEditTextPreference::class.java,
1515
val inputType: InputType = InputType.TEXT
1616
) : BasePreference(key, titleKey, summaryKey, icon, layout, tag) {
1717
}

app/src/main/java/io/github/chsbuffer/revancedxposed/youtube/YoutubeHook.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import io.github.chsbuffer.revancedxposed.injectHostClassLoaderToSelf
1111
import io.github.chsbuffer.revancedxposed.youtube.ad.HideAds
1212
import io.github.chsbuffer.revancedxposed.youtube.ad.VideoAds
1313
import io.github.chsbuffer.revancedxposed.youtube.interaction.CopyVideoUrl
14+
import io.github.chsbuffer.revancedxposed.youtube.interaction.Downloads
1415
import io.github.chsbuffer.revancedxposed.youtube.interaction.SwipeControls
1516
import io.github.chsbuffer.revancedxposed.youtube.layout.NavigationButtons
1617
import io.github.chsbuffer.revancedxposed.youtube.layout.SponsorBlock
@@ -33,6 +34,7 @@ class YoutubeHook(
3334
::HideAds,
3435
::SponsorBlock,
3536
::CopyVideoUrl,
37+
::Downloads,
3638
::HideShortsComponents,
3739
::NavigationButtons,
3840
::SwipeControls,
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package io.github.chsbuffer.revancedxposed.youtube.interaction
2+
3+
import android.app.Activity
4+
import app.revanced.extension.youtube.patches.DownloadsPatch
5+
import app.revanced.extension.youtube.settings.preference.ExternalDownloaderPreference
6+
import app.revanced.extension.youtube.videoplayer.ExternalDownloadButton
7+
import io.github.chsbuffer.revancedxposed.AccessFlags
8+
import io.github.chsbuffer.revancedxposed.R
9+
import io.github.chsbuffer.revancedxposed.fingerprint
10+
import io.github.chsbuffer.revancedxposed.shared.misc.settings.preference.PreferenceScreenPreference
11+
import io.github.chsbuffer.revancedxposed.shared.misc.settings.preference.PreferenceScreenPreference.Sorting
12+
import io.github.chsbuffer.revancedxposed.shared.misc.settings.preference.SwitchPreference
13+
import io.github.chsbuffer.revancedxposed.shared.misc.settings.preference.TextPreference
14+
import io.github.chsbuffer.revancedxposed.youtube.YoutubeHook
15+
import io.github.chsbuffer.revancedxposed.youtube.misc.BottomControl
16+
import io.github.chsbuffer.revancedxposed.youtube.misc.PlayerControls
17+
import io.github.chsbuffer.revancedxposed.youtube.misc.PreferenceScreen
18+
import io.github.chsbuffer.revancedxposed.youtube.misc.addBottomControl
19+
import io.github.chsbuffer.revancedxposed.youtube.misc.initializeBottomControl
20+
import io.github.chsbuffer.revancedxposed.youtube.video.VideoInformationHook
21+
import org.luckypray.dexkit.query.enums.StringMatchType
22+
23+
fun YoutubeHook.Downloads() {
24+
25+
dependsOn(
26+
::PlayerControls,
27+
::VideoInformationHook,
28+
)
29+
30+
PreferenceScreen.PLAYER.addPreferences(
31+
PreferenceScreenPreference(
32+
key = "revanced_external_downloader_screen",
33+
sorting = Sorting.UNSORTED,
34+
preferences = setOf(
35+
SwitchPreference("revanced_external_downloader"),
36+
SwitchPreference("revanced_external_downloader_action_button"),
37+
TextPreference(
38+
"revanced_external_downloader_name",
39+
tag = ExternalDownloaderPreference::class.java
40+
),
41+
),
42+
),
43+
)
44+
45+
addBottomControl(R.layout.revanced_external_download_button)
46+
initializeBottomControl(
47+
BottomControl(
48+
R.id.revanced_external_download_button,
49+
ExternalDownloadButton::initializeButton,
50+
ExternalDownloadButton::setVisibility,
51+
ExternalDownloadButton::setVisibilityImmediate,
52+
ExternalDownloadButton::setVisibilityNegatedImmediate,
53+
)
54+
)
55+
56+
getDexMethod("mainActivityOnCreateFingerprint") {
57+
fingerprint {
58+
returns("V")
59+
parameters("Landroid/os/Bundle;")
60+
methodMatcher { name = "onCreate" }
61+
classMatcher { className(".MainActivity", StringMatchType.EndsWith) }
62+
}
63+
}.hookMethod { after { DownloadsPatch.activityCreated(it.thisObject as Activity) } }
64+
65+
getDexMethod("offlineVideoEndpointFingerprint") {
66+
fingerprint {
67+
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
68+
returns("V")
69+
parameters(
70+
"Ljava/util/Map;",
71+
"L",
72+
"Ljava/lang/String", // VideoId
73+
"L",
74+
)
75+
strings("Object is not an offlineable video: ")
76+
}
77+
}.hookMethod {
78+
before {
79+
if (DownloadsPatch.inAppDownloadButtonOnClick(it.args[2] as String))
80+
it.result = null
81+
}
82+
}
83+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<merge xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:tools="http://schemas.android.com/tools"
4+
tools:ignore="MissingClass">
5+
6+
<com.google.android.libraries.youtube.common.ui.TouchImageView
7+
android:id="@+id/revanced_external_download_button"
8+
android:layout_width="48.0dip"
9+
android:layout_height="60.0dip"
10+
android:background="@null"
11+
android:clickable="true"
12+
android:focusable="true"
13+
android:longClickable="false"
14+
android:paddingTop="6.5dp"
15+
android:paddingBottom="0dp"
16+
android:scaleType="center"
17+
android:src="@drawable/revanced_yt_download_button" />
18+
</merge>

0 commit comments

Comments
 (0)