Skip to content

Commit 7c72104

Browse files
Merge branch 'TeamNewPipe:dev' into work/fix/13057
2 parents 3acafe7 + 79767f9 commit 7c72104

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

98 files changed

+1052
-762
lines changed

app/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ configure<ApplicationExtension> {
4444
minSdk = 21
4545
targetSdk = 35
4646

47-
versionCode = System.getProperty("versionCodeOverride")?.toInt() ?: 1008
47+
versionCode = System.getProperty("versionCodeOverride")?.toInt() ?: 1009
4848

49-
versionName = "0.28.3"
49+
versionName = "0.28.4"
5050
System.getProperty("versionNameSuffix")?.let { versionNameSuffix = it }
5151

5252
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"

app/src/main/java/org/schabi/newpipe/error/ErrorActivity.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import org.schabi.newpipe.databinding.ActivityErrorBinding
2525
import org.schabi.newpipe.util.Localization
2626
import org.schabi.newpipe.util.ThemeHelper
2727
import org.schabi.newpipe.util.external_communication.ShareUtils
28+
import org.schabi.newpipe.util.text.setTextWithLinks
2829

2930
/**
3031
* This activity is used to show error details and allow reporting them in various ways.
@@ -100,7 +101,7 @@ class ErrorActivity : AppCompatActivity() {
100101

101102
// normal bugreport
102103
buildInfo(errorInfo)
103-
binding.errorMessageView.text = errorInfo.getMessage(this)
104+
binding.errorMessageView.setTextWithLinks(errorInfo.getMessage(this))
104105
binding.errorView.text = formErrorText(errorInfo.stackTraces)
105106

106107
// print stack trace once again for debugging:

app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import org.schabi.newpipe.extractor.exceptions.YoutubeMusicPremiumContentExcepti
2929
import org.schabi.newpipe.ktx.isNetworkRelated
3030
import org.schabi.newpipe.player.mediasource.FailedMediaSource
3131
import org.schabi.newpipe.player.resolver.PlaybackResolver
32+
import org.schabi.newpipe.util.text.getText
3233

3334
/**
3435
* An error has occurred in the app. This class contains plain old parcelable data that can be used
@@ -135,8 +136,8 @@ class ErrorInfo private constructor(
135136
return getServiceName(serviceId)
136137
}
137138

138-
fun getMessage(context: Context): String {
139-
return message.getString(context)
139+
fun getMessage(context: Context): CharSequence {
140+
return message.getText(context)
140141
}
141142

142143
companion object {
@@ -146,20 +147,23 @@ class ErrorInfo private constructor(
146147
private val stringRes: Int,
147148
private vararg val formatArgs: String
148149
) : Parcelable {
149-
fun getString(context: Context): String {
150+
fun getText(context: Context): CharSequence {
151+
// Ensure locale aware context via ContextCompat.getContextForLanguage() (just in case context is not AppCompatActivity)
152+
val ctx = ContextCompat.getContextForLanguage(context)
150153
return if (formatArgs.isEmpty()) {
151-
// use ContextCompat.getString() just in case context is not AppCompatActivity
152-
ContextCompat.getString(context, stringRes)
154+
ctx.getText(stringRes)
153155
} else {
154156
// ContextCompat.getString() with formatArgs does not exist, so we just
155157
// replicate its source code but with formatArgs
156-
ContextCompat.getContextForLanguage(context).getString(stringRes, *formatArgs)
158+
ctx.resources.getText(stringRes, *formatArgs)
157159
}
158160
}
159161
}
160162

161163
const val SERVICE_NONE = "<unknown_service>"
162164

165+
const val YOUTUBE_IP_BAN_FAQ_URL = "https://newpipe.net/FAQ/#ip-banned-youtube"
166+
163167
private fun getServiceName(serviceId: Int?) = // not using getNameOfServiceById since we want to accept a nullable serviceId and we
164168
// want to default to SERVICE_NONE
165169
ServiceList.all().firstOrNull { it.serviceId == serviceId }?.serviceInfo?.name
@@ -247,7 +251,11 @@ class ErrorInfo private constructor(
247251
ErrorMessage(R.string.youtube_music_premium_content)
248252

249253
throwable is SignInConfirmNotBotException ->
250-
ErrorMessage(R.string.sign_in_confirm_not_bot_error, getServiceName(serviceId))
254+
ErrorMessage(
255+
R.string.sign_in_confirm_not_bot_error,
256+
getServiceName(serviceId),
257+
YOUTUBE_IP_BAN_FAQ_URL
258+
)
251259

252260
throwable is ContentNotAvailableException ->
253261
ErrorMessage(R.string.content_not_available)

app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import org.schabi.newpipe.MainActivity
1616
import org.schabi.newpipe.R
1717
import org.schabi.newpipe.ktx.animate
1818
import org.schabi.newpipe.util.external_communication.ShareUtils
19+
import org.schabi.newpipe.util.text.setTextWithLinks
1920

2021
class ErrorPanelHelper(
2122
private val fragment: Fragment,
@@ -64,7 +65,7 @@ class ErrorPanelHelper(
6465

6566
fun showError(errorInfo: ErrorInfo) {
6667
ensureDefaultVisibility()
67-
errorTextView.text = errorInfo.getMessage(context)
68+
errorTextView.setTextWithLinks(errorInfo.getMessage(context))
6869

6970
if (errorInfo.recaptchaUrl != null) {
7071
showAndSetErrorButtonAction(R.string.recaptcha_solve) {
@@ -109,7 +110,7 @@ class ErrorPanelHelper(
109110
fun showTextError(errorString: String) {
110111
ensureDefaultVisibility()
111112

112-
errorTextView.text = errorString
113+
errorTextView.setTextWithLinks(errorString)
113114

114115
setRootVisible()
115116
}

app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserPlaybackPreparer.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ import org.schabi.newpipe.util.NavigationHelper
4949
*/
5050
class MediaBrowserPlaybackPreparer(
5151
private val context: Context,
52-
private val setMediaSessionError: BiConsumer<String, Int>, // error string, error code
52+
private val setMediaSessionError: BiConsumer<CharSequence, Int>, // error string, error code
5353
private val clearMediaSessionError: Runnable,
5454
private val onPrepare: Consumer<Boolean>
5555
) : PlaybackPreparer {
@@ -118,7 +118,7 @@ class MediaBrowserPlaybackPreparer(
118118

119119
private fun onPrepareError(throwable: Throwable) {
120120
setMediaSessionError.accept(
121-
ErrorInfo.getMessage(throwable, null, null).getString(context),
121+
ErrorInfo.getMessage(throwable, null, null).getText(context),
122122
PlaybackStateCompat.ERROR_CODE_APP_ERROR
123123
)
124124
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package org.schabi.newpipe.util.text
2+
3+
import android.content.res.Resources
4+
import android.text.SpannableString
5+
import android.text.method.LinkMovementMethod
6+
import android.text.util.Linkify
7+
import android.util.Patterns
8+
import android.widget.TextView
9+
import androidx.annotation.StringRes
10+
import androidx.core.text.parseAsHtml
11+
import androidx.core.text.toHtml
12+
import androidx.core.text.toSpanned
13+
14+
/**
15+
* Takes in a CharSequence [text]
16+
* and makes raw HTTP URLs and HTML anchor tags clickable
17+
*/
18+
fun TextView.setTextWithLinks(text: CharSequence) {
19+
val spanned = SpannableString(text)
20+
// Using the pattern overload of addLinks since the one with the int masks strips all spans from the text before applying new ones
21+
Linkify.addLinks(spanned, Patterns.WEB_URL, null)
22+
this.text = spanned
23+
this.movementMethod = LinkMovementMethod.getInstance()
24+
}
25+
26+
/**
27+
* Gets text from string resource with [id] while preserving styling and allowing string format value substitution of [formatArgs]
28+
*/
29+
fun Resources.getText(@StringRes id: Int, vararg formatArgs: Any?): CharSequence = getText(id).toSpanned().toHtml().format(*formatArgs).parseAsHtml()

app/src/main/res/values-az/strings.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -825,4 +825,7 @@
825825
<string name="youtube_player_http_403">HTTP xətası 403 oynadarkən serverdən alındı, ehtimal ki, IP qadağası və ya yayım URL-nin deobfuscation problemləri ilə bağlıdır</string>
826826
<string name="sign_in_confirm_not_bot_error">%1$s sorğuçunun bot olmadığını təsdiqləmək üçün giriş tələb edərək data təmin etməkdən imtina etdi.\n\nIP-niz %1$s tərəfindən müvəqqəti şəkildə qadağan oluna bilər, bir müddət gözləyə və ya başqa IP-yə keçə bilərsiniz (məsələn, VPN-i açıb/qapatmaqla və ya WiFi-dan mobil dataya keçməklə).</string>
827827
<string name="unsupported_content_in_country">Bu məzmun hazırda seçilən məzmun ölkəsi üçün əlçatan deyil. \n\nSeçiminizi \"Tənzimləmələr &gt; Məzmun &gt; İlkin məzmun ölkəsi\"- dən dəyişin.</string>
828+
<string name="kao_dialog_warning">2025 avqustunda, Google 2026-cı ilin sentyabrından etibarən tətbiqlərin quraşdırılması Play Store xaricində quraşdırılanlar daxil olmaqla, sertifikatlaşdırılan cihazlardakı bütün Android tətbiqləri üçün tərtibatçı təsdiqlənməsini tələb edəcək deyə bəyan etdi. NewPipe tərtibatçıları bu tələblə razılaşmadığı üçün NewPipe bu vaxtdan sonra artıq sertifikatlaşdırılan Android cihazlarında işləməyəcək.</string>
829+
<string name="kao_dialog_more_info">Təfərrüatlar</string>
830+
<string name="kao_solution">Həll olunma</string>
828831
</resources>

app/src/main/res/values-bg/strings.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -832,4 +832,7 @@
832832
<string name="youtube_player_http_403">HTTP грешка 403, получена от сървъра по време на възпроизвеждане, вероятно причинена от забрана на IP адреса или проблеми с деобфускацията на URL адреси за стрийминг</string>
833833
<string name="sign_in_confirm_not_bot_error">%1$s отказа да предостави данни, като поиска вход, за да потвърди, че заявителят не е бот.\n\nВашият IP адрес може да е временно забранен от %1$s. Можете да изчакате известно време или да превключите към друг IP адрес (например като включите/изключите VPN или като превключите от WiFi към мобилни данни).</string>
834834
<string name="unsupported_content_in_country">Това съдържание не е налично за текущо избраната държава на съдържанието.\n\nПроменете избора си от \"Настройки &gt; Съдържание &gt; Държава на съдържанието по подразбиране\".</string>
835+
<string name="kao_dialog_warning">През август 2025 г. Google обяви, че от септември 2026 г. инсталирането на приложения ще изисква проверка от разработчика за всички приложения за Android на сертифицирани устройства, включително тези, инсталирани извън Play Store. Тъй като разработчиците на NewPipe не са съгласни с това изискване, NewPipe вече няма да работи на сертифицирани устройства с Android след този период.</string>
836+
<string name="kao_dialog_more_info">Детайли</string>
837+
<string name="kao_solution">Решение</string>
835838
</resources>

app/src/main/res/values-de/strings.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -847,7 +847,7 @@
847847
<string name="youtube_player_http_403">HTTP-Fehler 403 vom Server während der Wiedergabe erhalten, wahrscheinlich verursacht durch eine IP-Sperre oder Probleme beim Entschlüsseln der Streaming-URL</string>
848848
<string name="sign_in_confirm_not_bot_error">%1$s hat die Datenbereitstellung verweigert und verlangt eine Anmeldung, um zu bestätigen, dass es sich bei dem Anfragenden nicht um einen Bot handelt.\n\nDeine IP-Adresse wurde möglicherweise vorübergehend von %1$s gesperrt. Du kannst einige Zeit warten oder zu einer anderen IP-Adresse wechseln (z. B. durch Ein- und Ausschalten eines VPNs oder durch Wechseln von WLAN zu mobilen Daten).</string>
849849
<string name="unsupported_content_in_country">Dieser Inhalt ist für das aktuell ausgewählte Land des Inhalts nicht verfügbar.\n\nÄndere die Auswahl unter „Einstellungen &gt; Inhalt &gt; Bevorzugtes Land des Inhalts“.</string>
850-
<string name="kao_dialog_warning">Google hat angekündigt, dass ab 2026/2027 alle Apps auf zertifizierten Android-Geräten nur noch funktionieren, wenn die Entwickler ihre persönlichen Identitätsdaten direkt an Google übermitteln. Da die Entwickler dieser App dieser Anforderung nicht zustimmen, wird diese App ab diesem Zeitpunkt auf zertifizierten Android-Geräten nicht mehr funktionieren.</string>
850+
<string name="kao_dialog_warning">Im August 2025 gab Google bekannt, dass ab September 2026 für die Installation von Apps eine Entwicklerüberprüfung für alle Android-Apps auf zertifizierten Geräten erforderlich sein wird, einschließlich derjenigen, die außerhalb des Play Store installiert wurden. Da die Entwickler von NewPipe dieser Forderung nicht nachkommen, wird NewPipe nach diesem Zeitpunkt auf zertifizierten Android-Geräten nicht mehr funktionieren.</string>
851851
<string name="kao_dialog_more_info">Details</string>
852852
<string name="kao_solution">Lösung</string>
853853
</resources>

app/src/main/res/values-es/strings.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -851,7 +851,7 @@
851851
<string name="short_billion">%sMM</string>
852852
<string name="unsupported_content_in_country">Este contenido no está disponible para el país seleccionado actualmente.\n\nCambia tu selección en «Ajustes &gt; Contenido &gt; País predefinido del contenido».</string>
853853
<string name="permission_display_over_apps_message">Para usar el reproductor emergente, seleccione %1$s en el siguiente menú de la configuración de Android y habilite %2$s.</string>
854-
<string name="kao_dialog_warning">Google ha anunciado que, a partir de 2026/2027, todas las aplicaciones en dispositivos Android certificados requerirán que los desarrolladores envíen sus datos personales de identidad directamente a Google. Como los desarrolladores de esta aplicación no están de acuerdo con este requisito, la aplicación dejará de funcionar en dispositivos Android certificados después de esa fecha.</string>
854+
<string name="kao_dialog_warning">En Agosto de 2025, Google ha anunciado que, a partir de 2026/2027, todas las aplicaciones en dispositivos Android certificados requerirán que los desarrolladores envíen sus datos personales de identidad directamente a Google. Como los desarrolladores de NewPipe no están de acuerdo con este requisito, la aplicación dejará de funcionar en dispositivos Android certificados después de esa fecha.</string>
855855
<string name="kao_dialog_more_info">Detalles</string>
856856
<string name="kao_solution">Solución</string>
857857
</resources>

0 commit comments

Comments
 (0)