diff --git a/.github/workflows/backport-pr.yml b/.github/workflows/backport-pr.yml index de46ca7c730..1e30740640e 100644 --- a/.github/workflows/backport-pr.yml +++ b/.github/workflows/backport-pr.yml @@ -22,7 +22,7 @@ jobs: github.event.comment.author_association == 'MEMBER' ) steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Get backport metadata # the target branch is the first argument after `/backport` env: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d42c5a0b4a2..cb8fbc12a36 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,7 +38,7 @@ jobs: steps: - uses: actions/checkout@v6 - - uses: gradle/actions/wrapper-validation@v4 + - uses: gradle/actions/wrapper-validation@v5 - name: create and checkout branch # push events already checked out the branch diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e6175cf2a6a..5b7153ee210 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -3,6 +3,8 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ +import com.android.build.api.dsl.ApplicationExtension + plugins { alias(libs.plugins.android.application) alias(libs.plugins.jetbrains.kotlin.android) @@ -32,7 +34,7 @@ kotlin { } } -android { +configure { compileSdk = 36 namespace = "org.schabi.newpipe" @@ -42,9 +44,9 @@ android { minSdk = 21 targetSdk = 35 - versionCode = System.getProperty("versionCodeOverride")?.toInt() ?: 1008 + versionCode = System.getProperty("versionCodeOverride")?.toInt() ?: 1009 - versionName = "0.28.3" + versionName = "0.28.4" System.getProperty("versionNameSuffix")?.let { versionNameSuffix = it } testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" @@ -77,19 +79,18 @@ android { resValue("string", "app_name", "NewPipe $suffix") } isMinifyEnabled = true - isShrinkResources = false // disabled to fix F-Droid"s reproducible build - proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") + isShrinkResources = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) } } lint { - checkReleaseBuilds = false - // Or, if you prefer, you can continue to check for errors in release builds, - // but continue the build even when errors are found: + lintConfig = file("lint.xml") + // Continue the debug build even when errors are found abortOnError = false - // suppress false warning ("Resource IDs will be non-final in Android Gradle Plugin version - // 5.0, avoid using them in switch case statements"), which affects only library projects - disable += "NonConstantResourceId" } compileOptions { @@ -100,7 +101,7 @@ android { sourceSets { getByName("androidTest") { - assets.srcDir("$projectDir/schemas") + assets.directories += "$projectDir/schemas" } } @@ -111,6 +112,7 @@ android { buildFeatures { viewBinding = true buildConfig = true + resValues = true } packaging { @@ -270,7 +272,8 @@ dependencies { implementation(libs.lisawray.groupie.viewbinding) // Image loading - implementation(libs.squareup.picasso) + implementation(libs.coil.compose) + implementation(libs.coil.network.okhttp) // Markdown library for Android implementation(libs.noties.markwon.core) diff --git a/app/lint.xml b/app/lint.xml new file mode 100644 index 00000000000..9497c22ca4f --- /dev/null +++ b/app/lint.xml @@ -0,0 +1,10 @@ + + + + + + + diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 8bcef3fbddd..3f31fc98b2b 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -39,3 +39,8 @@ ## For some reason NotificationModeConfigFragment wasn't kept (only referenced in a preference xml) -keep class org.schabi.newpipe.settings.notifications.** { *; } + +# Prevent R8 from stripping or renaming Protobuf internal fields +-keepclassmembers class * extends com.google.protobuf.GeneratedMessageLite { + ; +} diff --git a/app/src/main/java/org/schabi/newpipe/App.java b/app/src/main/java/org/schabi/newpipe/App.java deleted file mode 100644 index cf41aad46cd..00000000000 --- a/app/src/main/java/org/schabi/newpipe/App.java +++ /dev/null @@ -1,285 +0,0 @@ -package org.schabi.newpipe; - -import android.app.Application; -import android.content.Context; -import android.content.SharedPreferences; -import android.util.Log; - -import androidx.annotation.NonNull; -import androidx.core.app.NotificationChannelCompat; -import androidx.core.app.NotificationManagerCompat; -import androidx.preference.PreferenceManager; - -import com.jakewharton.processphoenix.ProcessPhoenix; - -import org.acra.ACRA; -import org.acra.config.CoreConfigurationBuilder; -import org.schabi.newpipe.error.ReCaptchaActivity; -import org.schabi.newpipe.extractor.NewPipe; -import org.schabi.newpipe.extractor.downloader.Downloader; -import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor; -import org.schabi.newpipe.ktx.ExceptionUtils; -import org.schabi.newpipe.settings.NewPipeSettings; -import org.schabi.newpipe.util.BridgeStateSaverInitializer; -import org.schabi.newpipe.util.Localization; -import org.schabi.newpipe.util.ServiceHelper; -import org.schabi.newpipe.util.StateSaver; -import org.schabi.newpipe.util.image.ImageStrategy; -import org.schabi.newpipe.util.image.PicassoHelper; -import org.schabi.newpipe.util.image.PreferredImageQuality; -import org.schabi.newpipe.util.potoken.PoTokenProviderImpl; - -import java.io.IOException; -import java.io.InterruptedIOException; -import java.net.SocketException; -import java.util.List; -import java.util.Objects; - -import io.reactivex.rxjava3.exceptions.CompositeException; -import io.reactivex.rxjava3.exceptions.MissingBackpressureException; -import io.reactivex.rxjava3.exceptions.OnErrorNotImplementedException; -import io.reactivex.rxjava3.exceptions.UndeliverableException; -import io.reactivex.rxjava3.functions.Consumer; -import io.reactivex.rxjava3.plugins.RxJavaPlugins; - -/* - * Copyright (C) Hans-Christoph Steiner 2016 - * App.java is part of NewPipe. - * - * NewPipe is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * NewPipe is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with NewPipe. If not, see . - */ - -public class App extends Application { - public static final String PACKAGE_NAME = BuildConfig.APPLICATION_ID; - private static final String TAG = App.class.toString(); - - private boolean isFirstRun = false; - private boolean notificationsRequested = false; - - private static App app; - - @NonNull - public static App getApp() { - return app; - } - - public boolean getNotificationsRequested() { - return notificationsRequested; - } - - public void setNotificationsRequested() { - notificationsRequested = true; - } - - @Override - protected void attachBaseContext(final Context base) { - super.attachBaseContext(base); - initACRA(); - } - - @Override - public void onCreate() { - super.onCreate(); - - app = this; - - if (ProcessPhoenix.isPhoenixProcess(this)) { - Log.i(TAG, "This is a phoenix process! " - + "Aborting initialization of App[onCreate]"); - return; - } - - // check if the last used preference version is set - // to determine whether this is the first app run - final int lastUsedPrefVersion = PreferenceManager.getDefaultSharedPreferences(this) - .getInt(getString(R.string.last_used_preferences_version), -1); - isFirstRun = lastUsedPrefVersion == -1; - - // Initialize settings first because other initializations can use its values - NewPipeSettings.initSettings(this); - - NewPipe.init(getDownloader(), - Localization.getPreferredLocalization(this), - Localization.getPreferredContentCountry(this)); - Localization.initPrettyTime(Localization.resolvePrettyTime()); - - BridgeStateSaverInitializer.init(this); - StateSaver.init(this); - initNotificationChannels(); - - ServiceHelper.initServices(this); - - // Initialize image loader - final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - PicassoHelper.init(this); - ImageStrategy.setPreferredImageQuality(PreferredImageQuality.fromPreferenceKey(this, - prefs.getString(getString(R.string.image_quality_key), - getString(R.string.image_quality_default)))); - PicassoHelper.setIndicatorsEnabled(MainActivity.DEBUG - && prefs.getBoolean(getString(R.string.show_image_indicators_key), false)); - - configureRxJavaErrorHandler(); - - YoutubeStreamExtractor.setPoTokenProvider(PoTokenProviderImpl.INSTANCE); - } - - @Override - public void onTerminate() { - super.onTerminate(); - PicassoHelper.terminate(); - } - - protected Downloader getDownloader() { - final DownloaderImpl downloader = DownloaderImpl.init(null); - setCookiesToDownloader(downloader); - return downloader; - } - - protected void setCookiesToDownloader(final DownloaderImpl downloader) { - final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences( - getApplicationContext()); - final String key = getApplicationContext().getString(R.string.recaptcha_cookies_key); - downloader.setCookie(ReCaptchaActivity.RECAPTCHA_COOKIES_KEY, prefs.getString(key, null)); - downloader.updateYoutubeRestrictedModeCookies(getApplicationContext()); - } - - private void configureRxJavaErrorHandler() { - // https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#error-handling - RxJavaPlugins.setErrorHandler(new Consumer() { - @Override - public void accept(@NonNull final Throwable throwable) { - Log.e(TAG, "RxJavaPlugins.ErrorHandler called with -> : " - + "throwable = [" + throwable.getClass().getName() + "]"); - - final Throwable actualThrowable; - if (throwable instanceof UndeliverableException) { - // As UndeliverableException is a wrapper, - // get the cause of it to get the "real" exception - actualThrowable = Objects.requireNonNull(throwable.getCause()); - } else { - actualThrowable = throwable; - } - - final List errors; - if (actualThrowable instanceof CompositeException) { - errors = ((CompositeException) actualThrowable).getExceptions(); - } else { - errors = List.of(actualThrowable); - } - - for (final Throwable error : errors) { - if (isThrowableIgnored(error)) { - return; - } - if (isThrowableCritical(error)) { - reportException(error); - return; - } - } - - // Out-of-lifecycle exceptions should only be reported if a debug user wishes so, - // When exception is not reported, log it - if (isDisposedRxExceptionsReported()) { - reportException(actualThrowable); - } else { - Log.e(TAG, "RxJavaPlugin: Undeliverable Exception received: ", actualThrowable); - } - } - - private boolean isThrowableIgnored(@NonNull final Throwable throwable) { - // Don't crash the application over a simple network problem - return ExceptionUtils.hasAssignableCause(throwable, - // network api cancellation - IOException.class, SocketException.class, - // blocking code disposed - InterruptedException.class, InterruptedIOException.class); - } - - private boolean isThrowableCritical(@NonNull final Throwable throwable) { - // Though these exceptions cannot be ignored - return ExceptionUtils.hasAssignableCause(throwable, - NullPointerException.class, IllegalArgumentException.class, // bug in app - OnErrorNotImplementedException.class, MissingBackpressureException.class, - IllegalStateException.class); // bug in operator - } - - private void reportException(@NonNull final Throwable throwable) { - // Throw uncaught exception that will trigger the report system - Thread.currentThread().getUncaughtExceptionHandler() - .uncaughtException(Thread.currentThread(), throwable); - } - }); - } - - /** - * Called in {@link #attachBaseContext(Context)} after calling the {@code super} method. - * Should be overridden if MultiDex is enabled, since it has to be initialized before ACRA. - */ - protected void initACRA() { - if (ACRA.isACRASenderServiceProcess()) { - return; - } - - final CoreConfigurationBuilder acraConfig = new CoreConfigurationBuilder() - .withBuildConfigClass(BuildConfig.class); - ACRA.init(this, acraConfig); - } - - private void initNotificationChannels() { - // Keep the importance below DEFAULT to avoid making noise on every notification update for - // the main and update channels - final List notificationChannelCompats = List.of( - new NotificationChannelCompat.Builder(getString(R.string.notification_channel_id), - NotificationManagerCompat.IMPORTANCE_LOW) - .setName(getString(R.string.notification_channel_name)) - .setDescription(getString(R.string.notification_channel_description)) - .build(), - new NotificationChannelCompat - .Builder(getString(R.string.app_update_notification_channel_id), - NotificationManagerCompat.IMPORTANCE_LOW) - .setName(getString(R.string.app_update_notification_channel_name)) - .setDescription( - getString(R.string.app_update_notification_channel_description)) - .build(), - new NotificationChannelCompat.Builder(getString(R.string.hash_channel_id), - NotificationManagerCompat.IMPORTANCE_HIGH) - .setName(getString(R.string.hash_channel_name)) - .setDescription(getString(R.string.hash_channel_description)) - .build(), - new NotificationChannelCompat.Builder(getString(R.string.error_report_channel_id), - NotificationManagerCompat.IMPORTANCE_LOW) - .setName(getString(R.string.error_report_channel_name)) - .setDescription(getString(R.string.error_report_channel_description)) - .build(), - new NotificationChannelCompat - .Builder(getString(R.string.streams_notification_channel_id), - NotificationManagerCompat.IMPORTANCE_DEFAULT) - .setName(getString(R.string.streams_notification_channel_name)) - .setDescription( - getString(R.string.streams_notification_channel_description)) - .build() - ); - - final NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); - notificationManager.createNotificationChannelsCompat(notificationChannelCompats); - } - - protected boolean isDisposedRxExceptionsReported() { - return false; - } - - public boolean isFirstRun() { - return isFirstRun; - } -} diff --git a/app/src/main/java/org/schabi/newpipe/App.kt b/app/src/main/java/org/schabi/newpipe/App.kt new file mode 100644 index 00000000000..3ca259528ac --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/App.kt @@ -0,0 +1,293 @@ +package org.schabi.newpipe + +import android.app.ActivityManager +import android.app.Application +import android.content.Context +import android.util.Log +import androidx.core.app.NotificationChannelCompat +import androidx.core.app.NotificationManagerCompat +import androidx.core.content.getSystemService +import androidx.preference.PreferenceManager +import coil3.ImageLoader +import coil3.SingletonImageLoader +import coil3.network.okhttp.OkHttpNetworkFetcherFactory +import coil3.request.allowRgb565 +import coil3.request.crossfade +import coil3.util.DebugLogger +import com.jakewharton.processphoenix.ProcessPhoenix +import io.reactivex.rxjava3.exceptions.CompositeException +import io.reactivex.rxjava3.exceptions.MissingBackpressureException +import io.reactivex.rxjava3.exceptions.OnErrorNotImplementedException +import io.reactivex.rxjava3.exceptions.UndeliverableException +import io.reactivex.rxjava3.functions.Consumer +import io.reactivex.rxjava3.plugins.RxJavaPlugins +import java.io.IOException +import java.io.InterruptedIOException +import java.net.SocketException +import org.acra.ACRA.init +import org.acra.ACRA.isACRASenderServiceProcess +import org.acra.config.CoreConfigurationBuilder +import org.schabi.newpipe.error.ReCaptchaActivity +import org.schabi.newpipe.extractor.NewPipe +import org.schabi.newpipe.extractor.downloader.Downloader +import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor +import org.schabi.newpipe.ktx.hasAssignableCause +import org.schabi.newpipe.settings.NewPipeSettings +import org.schabi.newpipe.util.BridgeStateSaverInitializer +import org.schabi.newpipe.util.Localization +import org.schabi.newpipe.util.ServiceHelper +import org.schabi.newpipe.util.StateSaver +import org.schabi.newpipe.util.image.ImageStrategy +import org.schabi.newpipe.util.image.PreferredImageQuality +import org.schabi.newpipe.util.potoken.PoTokenProviderImpl + +/* + * Copyright (C) Hans-Christoph Steiner 2016 + * App.kt is part of NewPipe. + * + * NewPipe is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * NewPipe is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with NewPipe. If not, see . + */ +open class App : + Application(), + SingletonImageLoader.Factory { + var isFirstRun = false + private set + var notificationsRequested = false + private set + + fun setNotificationsRequested() { + notificationsRequested = true + } + + override fun attachBaseContext(base: Context?) { + super.attachBaseContext(base) + initACRA() + } + + override fun onCreate() { + super.onCreate() + + instance = this + + if (ProcessPhoenix.isPhoenixProcess(this)) { + Log.i(TAG, "This is a phoenix process! Aborting initialization of App[onCreate]") + return + } + + // check if the last used preference version is set + // to determine whether this is the first app run + val lastUsedPrefVersion = + PreferenceManager + .getDefaultSharedPreferences(this) + .getInt(getString(R.string.last_used_preferences_version), -1) + isFirstRun = lastUsedPrefVersion == -1 + + // Initialize settings first because other initializations can use its values + NewPipeSettings.initSettings(this) + + NewPipe.init( + getDownloader(), + Localization.getPreferredLocalization(this), + Localization.getPreferredContentCountry(this) + ) + Localization.initPrettyTime(Localization.resolvePrettyTime()) + + BridgeStateSaverInitializer.init(this) + StateSaver.init(this) + initNotificationChannels() + + ServiceHelper.initServices(this) + + // Initialize image loader + val prefs = PreferenceManager.getDefaultSharedPreferences(this) + ImageStrategy.setPreferredImageQuality( + PreferredImageQuality.fromPreferenceKey( + this, + prefs.getString( + getString(R.string.image_quality_key), + getString(R.string.image_quality_default) + ) + ) + ) + + configureRxJavaErrorHandler() + + YoutubeStreamExtractor.setPoTokenProvider(PoTokenProviderImpl) + } + + override fun newImageLoader(context: Context): ImageLoader = ImageLoader + .Builder(this) + .logger(if (BuildConfig.DEBUG) DebugLogger() else null) + .allowRgb565(getSystemService()!!.isLowRamDevice) + .crossfade(true) + .components { + add(OkHttpNetworkFetcherFactory(callFactory = DownloaderImpl.getInstance().client)) + }.build() + + protected open fun getDownloader(): Downloader { + val downloader = DownloaderImpl.init(null) + setCookiesToDownloader(downloader) + return downloader + } + + protected fun setCookiesToDownloader(downloader: DownloaderImpl) { + val prefs = PreferenceManager.getDefaultSharedPreferences(this) + val key = getString(R.string.recaptcha_cookies_key) + downloader.setCookie(ReCaptchaActivity.RECAPTCHA_COOKIES_KEY, prefs.getString(key, null)) + downloader.updateYoutubeRestrictedModeCookies(this) + } + + private fun configureRxJavaErrorHandler() { + // https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#error-handling + RxJavaPlugins.setErrorHandler( + object : Consumer { + override fun accept(throwable: Throwable) { + Log.e(TAG, "RxJavaPlugins.ErrorHandler called with -> : throwable = [${throwable.javaClass.getName()}]") + + // As UndeliverableException is a wrapper, + // get the cause of it to get the "real" exception + val actualThrowable = (throwable as? UndeliverableException)?.cause ?: throwable + + val errors = (actualThrowable as? CompositeException)?.exceptions ?: listOf(actualThrowable) + + for (error in errors) { + if (isThrowableIgnored(error)) { + return + } + if (isThrowableCritical(error)) { + reportException(error) + return + } + } + + // Out-of-lifecycle exceptions should only be reported if a debug user wishes so, + // When exception is not reported, log it + if (isDisposedRxExceptionsReported()) { + reportException(actualThrowable) + } else { + Log.e(TAG, "RxJavaPlugin: Undeliverable Exception received: ", actualThrowable) + } + } + + fun isThrowableIgnored(throwable: Throwable): Boolean { + // Don't crash the application over a simple network problem + return throwable // network api cancellation + .hasAssignableCause( + IOException::class.java, + SocketException::class.java, // blocking code disposed + InterruptedException::class.java, + InterruptedIOException::class.java + ) + } + + fun isThrowableCritical(throwable: Throwable): Boolean { + // Though these exceptions cannot be ignored + return throwable + .hasAssignableCause( + // bug in app + NullPointerException::class.java, + IllegalArgumentException::class.java, + OnErrorNotImplementedException::class.java, + MissingBackpressureException::class.java, + // bug in operator + IllegalStateException::class.java + ) + } + + fun reportException(throwable: Throwable) { + // Throw uncaught exception that will trigger the report system + Thread + .currentThread() + .uncaughtExceptionHandler + .uncaughtException(Thread.currentThread(), throwable) + } + } + ) + } + + /** + * Called in [.attachBaseContext] after calling the `super` method. + * Should be overridden if MultiDex is enabled, since it has to be initialized before ACRA. + */ + protected fun initACRA() { + if (isACRASenderServiceProcess()) { + return + } + + val acraConfig = + CoreConfigurationBuilder() + .withBuildConfigClass(BuildConfig::class.java) + init(this, acraConfig) + } + + private fun initNotificationChannels() { + // Keep the importance below DEFAULT to avoid making noise on every notification update for + // the main and update channels + val mainChannel = + NotificationChannelCompat + .Builder( + getString(R.string.notification_channel_id), + NotificationManagerCompat.IMPORTANCE_LOW + ).setName(getString(R.string.notification_channel_name)) + .setDescription(getString(R.string.notification_channel_description)) + .build() + val appUpdateChannel = + NotificationChannelCompat + .Builder( + getString(R.string.app_update_notification_channel_id), + NotificationManagerCompat.IMPORTANCE_LOW + ).setName(getString(R.string.app_update_notification_channel_name)) + .setDescription(getString(R.string.app_update_notification_channel_description)) + .build() + val hashChannel = + NotificationChannelCompat + .Builder( + getString(R.string.hash_channel_id), + NotificationManagerCompat.IMPORTANCE_HIGH + ).setName(getString(R.string.hash_channel_name)) + .setDescription(getString(R.string.hash_channel_description)) + .build() + val errorReportChannel = + NotificationChannelCompat + .Builder( + getString(R.string.error_report_channel_id), + NotificationManagerCompat.IMPORTANCE_LOW + ).setName(getString(R.string.error_report_channel_name)) + .setDescription(getString(R.string.error_report_channel_description)) + .build() + val newStreamChannel = + NotificationChannelCompat + .Builder( + getString(R.string.streams_notification_channel_id), + NotificationManagerCompat.IMPORTANCE_DEFAULT + ).setName(getString(R.string.streams_notification_channel_name)) + .setDescription(getString(R.string.streams_notification_channel_description)) + .build() + + val channels = listOf(mainChannel, appUpdateChannel, hashChannel, errorReportChannel, newStreamChannel) + + NotificationManagerCompat.from(this).createNotificationChannelsCompat(channels) + } + + protected open fun isDisposedRxExceptionsReported(): Boolean = false + + companion object { + const val PACKAGE_NAME: String = BuildConfig.APPLICATION_ID + private val TAG = App::class.java.toString() + + @JvmStatic + lateinit var instance: App + private set + } +} diff --git a/app/src/main/java/org/schabi/newpipe/DownloaderImpl.java b/app/src/main/java/org/schabi/newpipe/DownloaderImpl.java index 041e913968d..74a2cab5176 100644 --- a/app/src/main/java/org/schabi/newpipe/DownloaderImpl.java +++ b/app/src/main/java/org/schabi/newpipe/DownloaderImpl.java @@ -48,6 +48,11 @@ private DownloaderImpl(final OkHttpClient.Builder builder) { this.mCookies = new HashMap<>(); } + @NonNull + public OkHttpClient getClient() { + return client; + } + /** * It's recommended to call exactly once in the entire lifetime of the application. * diff --git a/app/src/main/java/org/schabi/newpipe/ExitActivity.java b/app/src/main/java/org/schabi/newpipe/ExitActivity.java deleted file mode 100644 index bd1351f0c1f..00000000000 --- a/app/src/main/java/org/schabi/newpipe/ExitActivity.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.schabi.newpipe; - -import android.annotation.SuppressLint; -import android.app.Activity; -import android.content.Intent; -import android.os.Bundle; - -import org.schabi.newpipe.util.NavigationHelper; - -/* - * Copyright (C) Hans-Christoph Steiner 2016 - * ExitActivity.java is part of NewPipe. - * - * NewPipe is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * NewPipe is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with NewPipe. If not, see . - */ - -public class ExitActivity extends Activity { - - public static void exitAndRemoveFromRecentApps(final Activity activity) { - final Intent intent = new Intent(activity, ExitActivity.class); - - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK - | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS - | Intent.FLAG_ACTIVITY_CLEAR_TASK - | Intent.FLAG_ACTIVITY_NO_ANIMATION); - - activity.startActivity(intent); - } - - @SuppressLint("NewApi") - @Override - protected void onCreate(final Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - finishAndRemoveTask(); - - NavigationHelper.restartApp(this); - } -} diff --git a/app/src/main/java/org/schabi/newpipe/ExitActivity.kt b/app/src/main/java/org/schabi/newpipe/ExitActivity.kt new file mode 100644 index 00000000000..cc9f448b70b --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/ExitActivity.kt @@ -0,0 +1,36 @@ +/* + * SPDX-FileCopyrightText: 2016-2026 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe + +import android.annotation.SuppressLint +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import org.schabi.newpipe.util.NavigationHelper + +class ExitActivity : Activity() { + @SuppressLint("NewApi") + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + finishAndRemoveTask() + NavigationHelper.restartApp(this) + } + + companion object { + @JvmStatic + fun exitAndRemoveFromRecentApps(activity: Activity) { + val intent = Intent(activity, ExitActivity::class.java) + intent.addFlags( + Intent.FLAG_ACTIVITY_NEW_TASK + or Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS + or Intent.FLAG_ACTIVITY_CLEAR_TASK + or Intent.FLAG_ACTIVITY_NO_ANIMATION + ) + + activity.startActivity(intent) + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java index 8dac39682fc..00f1a62afb6 100644 --- a/app/src/main/java/org/schabi/newpipe/MainActivity.java +++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java @@ -20,6 +20,7 @@ package org.schabi.newpipe; +import android.app.AlertDialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -96,6 +97,8 @@ import org.schabi.newpipe.util.external_communication.ShareUtils; import org.schabi.newpipe.views.FocusOverlayView; +import java.time.Instant; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -191,11 +194,17 @@ protected void onCreate(final Bundle savedInstanceState) { NotificationWorker.initialize(this); } if (!UpdateSettingsFragment.wasUserAskedForConsent(this) - && !App.getApp().isFirstRun() + && !App.getInstance().isFirstRun() && ReleaseVersionUtil.INSTANCE.isReleaseApk()) { UpdateSettingsFragment.askForConsentToUpdateChecks(this); } + // ReleaseVersionUtil.INSTANCE.isReleaseApk() will be true only for main official build + // We want every release build (nightly, nightly-refactor) to show the popup + if (!DEBUG) { + showKeepAndroidDialog(); + } + MigrationManager.showUserInfoIfPresent(this); } @@ -203,7 +212,7 @@ protected void onCreate(final Bundle savedInstanceState) { protected void onPostCreate(final Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); - final App app = App.getApp(); + final App app = App.getInstance(); if (sharedPreferences.getBoolean(app.getString(R.string.update_app_key), false) && sharedPreferences @@ -309,25 +318,21 @@ private void addDrawerMenuForCurrentService() throws ExtractionException { } private boolean drawerItemSelected(final MenuItem item) { - switch (item.getGroupId()) { - case R.id.menu_services_group: - changeService(item); - break; - case R.id.menu_tabs_group: - tabSelected(item); - break; - case R.id.menu_kiosks_group: - try { - kioskSelected(item); - } catch (final Exception e) { - ErrorUtil.showUiErrorSnackbar(this, "Selecting drawer kiosk", e); - } - break; - case R.id.menu_options_about_group: - optionsAboutSelected(item); - break; - default: - return false; + final int groupId = item.getGroupId(); + if (groupId == R.id.menu_services_group) { + changeService(item); + } else if (groupId == R.id.menu_tabs_group) { + tabSelected(item); + } else if (groupId == R.id.menu_kiosks_group) { + try { + kioskSelected(item); + } catch (final Exception e) { + ErrorUtil.showUiErrorSnackbar(this, "Selecting drawer kiosk", e); + } + } else if (groupId == R.id.menu_options_about_group) { + optionsAboutSelected(item); + } else { + return false; } mainBinding.getRoot().closeDrawers(); @@ -977,4 +982,57 @@ private boolean bottomSheetHiddenOrCollapsed() { || sheetState == BottomSheetBehavior.STATE_COLLAPSED; } + private void showKeepAndroidDialog() { + final var prefs = PreferenceManager.getDefaultSharedPreferences(this); + + final var now = Instant.now(); + final var kaoLastCheck = Instant.ofEpochMilli(prefs.getLong( + getString(R.string.kao_last_checked_key), + 0 + )); + + final var supportedLannguages = List.of("fr", "de", "ca", "es", "id", "it", "pl", + "pt", "cs", "sk", "fa", "ar", "tr", "el", "th", "ru", "uk", "ko", "zh", "ja"); + final var locale = Localization.getAppLocale(); + final String kaoBaseUrl = "https://keepandroidopen.org/"; + final String kaoURI; + if (supportedLannguages.contains(locale.getLanguage())) { + if ("zh".equals(locale.getLanguage())) { + kaoURI = kaoBaseUrl + ("TW".equals(locale.getCountry()) ? "zh-TW" : "zh-CN"); + } else { + kaoURI = kaoBaseUrl + locale.getLanguage(); + } + } else { + kaoURI = kaoBaseUrl; + } + final var solutionURI = + "https://github.com/woheller69/FreeDroidWarn?tab=readme-ov-file#solutions"; + + if (kaoLastCheck.plus(30, ChronoUnit.DAYS).isBefore(now)) { + final var dialog = new AlertDialog.Builder(this) + .setTitle("Keep Android Open") + .setCancelable(false) + .setMessage(this.getString(R.string.kao_dialog_warning)) + .setPositiveButton(this.getString(android.R.string.ok), (d, w) -> { + prefs.edit() + .putLong( + getString(R.string.kao_last_checked_key), + now.toEpochMilli() + ) + .apply(); + }) + .setNeutralButton(this.getString(R.string.kao_solution), null) + .setNegativeButton(this.getString(R.string.kao_dialog_more_info), null) + .show(); + + // If we use setNeutralButton and etc. dialog will close after pressing the buttons, + // but we want it to close only when positive button is pressed + dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener(v -> + ShareUtils.openUrlInBrowser(this, kaoURI) + ); + dialog.getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener(v -> + ShareUtils.openUrlInBrowser(this, solutionURI) + ); + } + } } diff --git a/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt b/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt index fb48d3f7055..4cdcc6c691a 100644 --- a/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt +++ b/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt @@ -82,7 +82,9 @@ class NewVersionWorker( ) val notificationManager = NotificationManagerCompat.from(applicationContext) - notificationManager.notify(2000, notificationBuilder.build()) + if (notificationManager.areNotificationsEnabled()) { + notificationManager.notify(2000, notificationBuilder.build()) + } } @Throws(IOException::class, ReCaptchaException::class) diff --git a/app/src/main/java/org/schabi/newpipe/QueueItemMenuUtil.java b/app/src/main/java/org/schabi/newpipe/QueueItemMenuUtil.java index e6177f6a358..3eeb912c851 100644 --- a/app/src/main/java/org/schabi/newpipe/QueueItemMenuUtil.java +++ b/app/src/main/java/org/schabi/newpipe/QueueItemMenuUtil.java @@ -41,50 +41,50 @@ public static void openPopupMenu(final PlayQueue playQueue, } popupMenu.setOnMenuItemClickListener(menuItem -> { - switch (menuItem.getItemId()) { - case R.id.menu_item_remove: - final int index = playQueue.indexOf(item); - playQueue.remove(index); - return true; - case R.id.menu_item_details: - // playQueue is null since we don't want any queue change - NavigationHelper.openVideoDetail(context, item.getServiceId(), - item.getUrl(), item.getTitle(), null, - false); - return true; - case R.id.menu_item_append_playlist: - PlaylistDialog.createCorrespondingDialog( - context, - List.of(new StreamEntity(item)), - dialog -> dialog.show( - fragmentManager, - "QueueItemMenuUtil@append_playlist" - ) - ); + final int itemId = menuItem.getItemId(); + if (itemId == R.id.menu_item_remove) { + final int index = playQueue.indexOf(item); + playQueue.remove(index); + return true; + } else if (itemId == R.id.menu_item_details) { + // playQueue is null since we don't want any queue change + NavigationHelper.openVideoDetail(context, item.getServiceId(), + item.getUrl(), item.getTitle(), null, + false); + return true; + } else if (itemId == R.id.menu_item_append_playlist) { + PlaylistDialog.createCorrespondingDialog( + context, + List.of(new StreamEntity(item)), + dialog -> dialog.show( + fragmentManager, + "QueueItemMenuUtil@append_playlist" + ) + ); - return true; - case R.id.menu_item_channel_details: - SparseItemUtil.fetchUploaderUrlIfSparse(context, item.getServiceId(), - item.getUrl(), item.getUploaderUrl(), - // An intent must be used here. - // Opening with FragmentManager transactions is not working, - // as PlayQueueActivity doesn't use fragments. - uploaderUrl -> NavigationHelper.openChannelFragmentUsingIntent( - context, item.getServiceId(), uploaderUrl, item.getUploader() - )); - return true; - case R.id.menu_item_share: - shareText(context, item.getTitle(), item.getUrl(), - item.getThumbnails()); - return true; - case R.id.menu_item_download: - fetchStreamInfoAndSaveToDatabase(context, item.getServiceId(), item.getUrl(), - info -> { - final DownloadDialog downloadDialog = new DownloadDialog(context, - info); - downloadDialog.show(fragmentManager, "downloadDialog"); - }); - return true; + return true; + } else if (itemId == R.id.menu_item_channel_details) { + SparseItemUtil.fetchUploaderUrlIfSparse(context, item.getServiceId(), + item.getUrl(), item.getUploaderUrl(), + // An intent must be used here. + // Opening with FragmentManager transactions is not working, + // as PlayQueueActivity doesn't use fragments. + uploaderUrl -> NavigationHelper.openChannelFragmentUsingIntent( + context, item.getServiceId(), uploaderUrl, item.getUploader() + )); + return true; + } else if (itemId == R.id.menu_item_share) { + shareText(context, item.getTitle(), item.getUrl(), + item.getThumbnails()); + return true; + } else if (itemId == R.id.menu_item_download) { + fetchStreamInfoAndSaveToDatabase(context, item.getServiceId(), item.getUrl(), + info -> { + final DownloadDialog downloadDialog = new DownloadDialog(context, + info); + downloadDialog.show(fragmentManager, "downloadDialog"); + }); + return true; } return false; }); diff --git a/app/src/main/java/org/schabi/newpipe/RouterActivity.java b/app/src/main/java/org/schabi/newpipe/RouterActivity.java index d85fdf7de0b..2997f937f4c 100644 --- a/app/src/main/java/org/schabi/newpipe/RouterActivity.java +++ b/app/src/main/java/org/schabi/newpipe/RouterActivity.java @@ -343,8 +343,7 @@ protected void onSuccess() { return; } - final List capabilities = - currentService.getServiceInfo().getMediaCapabilities(); + final var capabilities = currentService.getServiceInfo().getMediaCapabilities(); // Check if the service supports the choice if ((isVideoPlayerSelected && capabilities.contains(VIDEO)) @@ -528,8 +527,7 @@ private List getChoicesForService(final StreamingService serv final List returnedItems = new ArrayList<>(); returnedItems.add(showInfo); // Always present - final List capabilities = - service.getServiceInfo().getMediaCapabilities(); + final var capabilities = service.getServiceInfo().getMediaCapabilities(); if (linkType == LinkType.STREAM || linkType == LinkType.PLAYLIST) { if (capabilities.contains(VIDEO)) { diff --git a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt index cfb504200f1..0cdf4029cca 100644 --- a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt +++ b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt @@ -92,7 +92,7 @@ class AboutActivity : AppCompatActivity() { return when (position) { posAbout -> AboutFragment() posLicense -> LicenseFragment.newInstance(SOFTWARE_COMPONENTS) - else -> throw IllegalArgumentException("Unknown position for ViewPager2") + else -> error("Unknown position for ViewPager2") } } @@ -105,7 +105,7 @@ class AboutActivity : AppCompatActivity() { return when (position) { posAbout -> R.string.tab_about posLicense -> R.string.tab_licenses - else -> throw IllegalArgumentException("Unknown position for ViewPager2") + else -> error("Unknown position for ViewPager2") } } } @@ -207,10 +207,10 @@ class AboutActivity : AppCompatActivity() { StandardLicenses.APACHE2 ), SoftwareComponent( - "Picasso", - "2013", - "Square, Inc.", - "https://square.github.io/picasso/", + "Coil", + "2023", + "Coil Contributors", + "https://coil-kt.github.io/coil/", StandardLicenses.APACHE2 ), SoftwareComponent( @@ -254,6 +254,13 @@ class AboutActivity : AppCompatActivity() { "ByteHamster", "https://github.com/ByteHamster/SearchPreference", StandardLicenses.MIT + ), + SoftwareComponent( + "FreeDroidWarn", + "2026", + "woheller69", + "https://github.com/woheller69/FreeDroidWarn", + StandardLicenses.APACHE2 ) ) } diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.kt index 82162e1e4ad..254fa425aa4 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.kt +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.kt @@ -62,11 +62,7 @@ data class PlaylistRemoteEntity( orderingName = playlistInfo.name, url = playlistInfo.url, thumbnailUrl = ImageStrategy.imageListToDbUrl( - if (playlistInfo.thumbnails.isEmpty()) { - playlistInfo.uploaderAvatars - } else { - playlistInfo.thumbnails - } + playlistInfo.thumbnails.ifEmpty { playlistInfo.uploaderAvatars } ), uploader = playlistInfo.uploaderName, streamCount = playlistInfo.streamCount diff --git a/app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamDAO.kt b/app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamDAO.kt index a6ab2c6cc77..86ba262f5d7 100644 --- a/app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamDAO.kt @@ -87,7 +87,7 @@ abstract class StreamDAO : BasicDAO { private fun compareAndUpdateStream(newerStream: StreamEntity) { val existentMinimalStream = getMinimalStreamForCompare(newerStream.serviceId, newerStream.url) - ?: throw IllegalStateException("Stream cannot be null just after insertion.") + ?: error("Stream cannot be null just after insertion.") newerStream.uid = existentMinimalStream.uid if (!StreamTypeUtil.isLiveStream(newerStream.streamType)) { diff --git a/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionDAO.kt b/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionDAO.kt index e6fdcbf70ec..72bdbcf5cc7 100644 --- a/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionDAO.kt @@ -100,7 +100,7 @@ abstract class SubscriptionDAO : BasicDAO { entity.uid = uidFromInsert } else { val subscriptionIdFromDb = getSubscriptionIdInternal(entity.serviceId, entity.url!!) - ?: throw IllegalStateException("Subscription cannot be null just after insertion.") + ?: error("Subscription cannot be null just after insertion.") entity.uid = subscriptionIdFromDb update(entity) diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java index 741bda24633..178fcefe16f 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java @@ -16,6 +16,7 @@ import android.provider.Settings; import android.util.Log; import android.view.LayoutInflater; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; @@ -31,7 +32,6 @@ import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.view.menu.ActionMenuItemView; import androidx.appcompat.widget.Toolbar; import androidx.collection.SparseArrayCompat; import androidx.documentfile.provider.DocumentFile; @@ -113,7 +113,7 @@ public class DownloadDialog extends DialogFragment private StoredDirectoryHelper mainStorageAudio = null; private StoredDirectoryHelper mainStorageVideo = null; private DownloadManager downloadManager = null; - private ActionMenuItemView okButton = null; + private MenuItem okButton = null; private Context context = null; private boolean askForSavePath; @@ -344,7 +344,7 @@ private void initToolbar(final Toolbar toolbar) { toolbar.setNavigationOnClickListener(v -> dismiss()); toolbar.setNavigationContentDescription(R.string.cancel); - okButton = toolbar.findViewById(R.id.okay); + okButton = toolbar.getMenu().findItem(R.id.okay); okButton.setEnabled(false); // disable until the download service connection is done toolbar.setOnMenuItemClickListener(item -> { @@ -558,17 +558,13 @@ public void onCheckedChanged(final RadioGroup group, @IdRes final int checkedId) } boolean flag = true; - switch (checkedId) { - case R.id.audio_button: - setupAudioSpinner(); - break; - case R.id.video_button: - setupVideoSpinner(); - break; - case R.id.subtitle_button: - setupSubtitleSpinner(); - flag = false; - break; + if (checkedId == R.id.audio_button) { + setupAudioSpinner(); + } else if (checkedId == R.id.video_button) { + setupVideoSpinner(); + } else if (checkedId == R.id.subtitle_button) { + setupSubtitleSpinner(); + flag = false; } dialogBinding.threads.setEnabled(flag); @@ -585,29 +581,26 @@ public void onItemSelected(final AdapterView parent, + "position = [" + position + "], id = [" + id + "]"); } - switch (parent.getId()) { - case R.id.quality_spinner: - switch (dialogBinding.videoAudioGroup.getCheckedRadioButtonId()) { - case R.id.video_button: - selectedVideoIndex = position; - onVideoStreamSelected(); - break; - case R.id.subtitle_button: - selectedSubtitleIndex = position; - break; - } - onItemSelectedSetFileName(); - break; - case R.id.audio_track_spinner: - final boolean trackChanged = selectedAudioTrackIndex != position; - selectedAudioTrackIndex = position; - if (trackChanged) { - updateSecondaryStreams(); - fetchStreamsSize(); - } - break; - case R.id.audio_stream_spinner: - selectedAudioIndex = position; + final int parentId = parent.getId(); + if (parentId == R.id.quality_spinner) { + final int checkedRadioButtonId = dialogBinding.videoAudioGroup + .getCheckedRadioButtonId(); + if (checkedRadioButtonId == R.id.video_button) { + selectedVideoIndex = position; + onVideoStreamSelected(); + } else if (checkedRadioButtonId == R.id.subtitle_button) { + selectedSubtitleIndex = position; + } + onItemSelectedSetFileName(); + } else if (parentId == R.id.audio_track_spinner) { + final boolean trackChanged = selectedAudioTrackIndex != position; + selectedAudioTrackIndex = position; + if (trackChanged) { + updateSecondaryStreams(); + fetchStreamsSize(); + } + } else if (parentId == R.id.audio_stream_spinner) { + selectedAudioIndex = position; } } @@ -622,23 +615,20 @@ private void onItemSelectedSetFileName() { || prevFileName.startsWith(getString(R.string.caption_file_name, fileName, ""))) { // only update the file name field if it was not edited by the user - switch (dialogBinding.videoAudioGroup.getCheckedRadioButtonId()) { - case R.id.audio_button: - case R.id.video_button: - if (!prevFileName.equals(fileName)) { - // since the user might have switched between audio and video, the correct - // text might already be in place, so avoid resetting the cursor position - dialogBinding.fileName.setText(fileName); - } - break; - - case R.id.subtitle_button: - final String setSubtitleLanguageCode = subtitleStreamsAdapter - .getItem(selectedSubtitleIndex).getLanguageTag(); - // this will reset the cursor position, which is bad UX, but it can't be avoided - dialogBinding.fileName.setText(getString( - R.string.caption_file_name, fileName, setSubtitleLanguageCode)); - break; + final int radioButtonId = dialogBinding.videoAudioGroup + .getCheckedRadioButtonId(); + if (radioButtonId == R.id.audio_button || radioButtonId == R.id.video_button) { + if (!prevFileName.equals(fileName)) { + // since the user might have switched between audio and video, the correct + // text might already be in place, so avoid resetting the cursor position + dialogBinding.fileName.setText(fileName); + } + } else if (radioButtonId == R.id.subtitle_button) { + final String setSubtitleLanguageCode = subtitleStreamsAdapter + .getItem(selectedSubtitleIndex).getLanguageTag(); + // this will reset the cursor position, which is bad UX, but it can't be avoided + dialogBinding.fileName.setText(getString( + R.string.caption_file_name, fileName, setSubtitleLanguageCode)); } } } @@ -770,47 +760,44 @@ private void prepareSelectedDownload() { filenameTmp = getNameEditText().concat("."); - switch (dialogBinding.videoAudioGroup.getCheckedRadioButtonId()) { - case R.id.audio_button: - selectedMediaType = getString(R.string.last_download_type_audio_key); - mainStorage = mainStorageAudio; - format = audioStreamsAdapter.getItem(selectedAudioIndex).getFormat(); - size = getWrappedAudioStreams().getSizeInBytes(selectedAudioIndex); - if (format == MediaFormat.WEBMA_OPUS) { - mimeTmp = "audio/ogg"; - filenameTmp += "opus"; - } else if (format != null) { - mimeTmp = format.mimeType; - filenameTmp += format.getSuffix(); - } - break; - case R.id.video_button: - selectedMediaType = getString(R.string.last_download_type_video_key); - mainStorage = mainStorageVideo; - format = videoStreamsAdapter.getItem(selectedVideoIndex).getFormat(); - size = wrappedVideoStreams.getSizeInBytes(selectedVideoIndex); - if (format != null) { - mimeTmp = format.mimeType; - filenameTmp += format.getSuffix(); - } - break; - case R.id.subtitle_button: - selectedMediaType = getString(R.string.last_download_type_subtitle_key); - mainStorage = mainStorageVideo; // subtitle & video files go together - format = subtitleStreamsAdapter.getItem(selectedSubtitleIndex).getFormat(); - size = wrappedSubtitleStreams.getSizeInBytes(selectedSubtitleIndex); - if (format != null) { - mimeTmp = format.mimeType; - } + final int checkedRadioButtonId = dialogBinding.videoAudioGroup.getCheckedRadioButtonId(); + if (checkedRadioButtonId == R.id.audio_button) { + selectedMediaType = getString(R.string.last_download_type_audio_key); + mainStorage = mainStorageAudio; + format = audioStreamsAdapter.getItem(selectedAudioIndex).getFormat(); + size = getWrappedAudioStreams().getSizeInBytes(selectedAudioIndex); + if (format == MediaFormat.WEBMA_OPUS) { + mimeTmp = "audio/ogg"; + filenameTmp += "opus"; + } else if (format != null) { + mimeTmp = format.mimeType; + filenameTmp += format.getSuffix(); + } + } else if (checkedRadioButtonId == R.id.video_button) { + selectedMediaType = getString(R.string.last_download_type_video_key); + mainStorage = mainStorageVideo; + format = videoStreamsAdapter.getItem(selectedVideoIndex).getFormat(); + size = wrappedVideoStreams.getSizeInBytes(selectedVideoIndex); + if (format != null) { + mimeTmp = format.mimeType; + filenameTmp += format.getSuffix(); + } + } else if (checkedRadioButtonId == R.id.subtitle_button) { + selectedMediaType = getString(R.string.last_download_type_subtitle_key); + mainStorage = mainStorageVideo; // subtitle & video files go together + format = subtitleStreamsAdapter.getItem(selectedSubtitleIndex).getFormat(); + size = wrappedSubtitleStreams.getSizeInBytes(selectedSubtitleIndex); + if (format != null) { + mimeTmp = format.mimeType; + } - if (format == MediaFormat.TTML) { - filenameTmp += MediaFormat.SRT.getSuffix(); - } else if (format != null) { - filenameTmp += format.getSuffix(); - } - break; - default: - throw new RuntimeException("No stream selected"); + if (format == MediaFormat.TTML) { + filenameTmp += MediaFormat.SRT.getSuffix(); + } else if (format != null) { + filenameTmp += format.getSuffix(); + } + } else { + throw new RuntimeException("No stream selected"); } if (!askForSavePath && (mainStorage == null @@ -1057,59 +1044,56 @@ private void continueSelectedDownload(@NonNull final StoredFileHelper storage) { long nearLength = 0; // more download logic: select muxer, subtitle converter, etc. - switch (dialogBinding.videoAudioGroup.getCheckedRadioButtonId()) { - case R.id.audio_button: - kind = 'a'; - selectedStream = audioStreamsAdapter.getItem(selectedAudioIndex); - - if (selectedStream.getFormat() == MediaFormat.M4A) { - psName = Postprocessing.ALGORITHM_M4A_NO_DASH; - } else if (selectedStream.getFormat() == MediaFormat.WEBMA_OPUS) { - psName = Postprocessing.ALGORITHM_OGG_FROM_WEBM_DEMUXER; - } - break; - case R.id.video_button: - kind = 'v'; - selectedStream = videoStreamsAdapter.getItem(selectedVideoIndex); + final int checkedRadioButtonId = dialogBinding.videoAudioGroup.getCheckedRadioButtonId(); + if (checkedRadioButtonId == R.id.audio_button) { + kind = 'a'; + selectedStream = audioStreamsAdapter.getItem(selectedAudioIndex); + + if (selectedStream.getFormat() == MediaFormat.M4A) { + psName = Postprocessing.ALGORITHM_M4A_NO_DASH; + } else if (selectedStream.getFormat() == MediaFormat.WEBMA_OPUS) { + psName = Postprocessing.ALGORITHM_OGG_FROM_WEBM_DEMUXER; + } + } else if (checkedRadioButtonId == R.id.video_button) { + kind = 'v'; + selectedStream = videoStreamsAdapter.getItem(selectedVideoIndex); - final SecondaryStreamHelper secondary = videoStreamsAdapter - .getAllSecondary() - .get(wrappedVideoStreams.getStreamsList().indexOf(selectedStream)); + final SecondaryStreamHelper secondary = videoStreamsAdapter + .getAllSecondary() + .get(wrappedVideoStreams.getStreamsList().indexOf(selectedStream)); - if (secondary != null) { - secondaryStream = secondary.getStream(); + if (secondary != null) { + secondaryStream = secondary.getStream(); - if (selectedStream.getFormat() == MediaFormat.MPEG_4) { - psName = Postprocessing.ALGORITHM_MP4_FROM_DASH_MUXER; - } else { - psName = Postprocessing.ALGORITHM_WEBM_MUXER; - } + if (selectedStream.getFormat() == MediaFormat.MPEG_4) { + psName = Postprocessing.ALGORITHM_MP4_FROM_DASH_MUXER; + } else { + psName = Postprocessing.ALGORITHM_WEBM_MUXER; + } - final long videoSize = wrappedVideoStreams.getSizeInBytes( - (VideoStream) selectedStream); + final long videoSize = wrappedVideoStreams.getSizeInBytes( + (VideoStream) selectedStream); - // set nearLength, only, if both sizes are fetched or known. This probably - // does not work on slow networks but is later updated in the downloader - if (secondary.getSizeInBytes() > 0 && videoSize > 0) { - nearLength = secondary.getSizeInBytes() + videoSize; - } + // set nearLength, only, if both sizes are fetched or known. This probably + // does not work on slow networks but is later updated in the downloader + if (secondary.getSizeInBytes() > 0 && videoSize > 0) { + nearLength = secondary.getSizeInBytes() + videoSize; } - break; - case R.id.subtitle_button: - threads = 1; // use unique thread for subtitles due small file size - kind = 's'; - selectedStream = subtitleStreamsAdapter.getItem(selectedSubtitleIndex); - - if (selectedStream.getFormat() == MediaFormat.TTML) { - psName = Postprocessing.ALGORITHM_TTML_CONVERTER; - psArgs = new String[] { - selectedStream.getFormat().getSuffix(), - "false" // ignore empty frames - }; - } - break; - default: - return; + } + } else if (checkedRadioButtonId == R.id.subtitle_button) { + threads = 1; // use unique thread for subtitles due small file size + kind = 's'; + selectedStream = subtitleStreamsAdapter.getItem(selectedSubtitleIndex); + + if (selectedStream.getFormat() == MediaFormat.TTML) { + psName = Postprocessing.ALGORITHM_TTML_CONVERTER; + psArgs = new String[]{ + selectedStream.getFormat().getSuffix(), + "false" // ignore empty frames + }; + } + } else { + return; } if (secondaryStream == null) { diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorActivity.java b/app/src/main/java/org/schabi/newpipe/error/ErrorActivity.java deleted file mode 100644 index 160dcca4df4..00000000000 --- a/app/src/main/java/org/schabi/newpipe/error/ErrorActivity.java +++ /dev/null @@ -1,324 +0,0 @@ -package org.schabi.newpipe.error; - -import android.content.Context; -import android.content.Intent; -import android.net.Uri; -import android.os.Build; -import android.os.Bundle; -import android.util.Log; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; - -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.app.AppCompatActivity; -import androidx.core.content.IntentCompat; - -import com.grack.nanojson.JsonWriter; - -import org.schabi.newpipe.BuildConfig; -import org.schabi.newpipe.R; -import org.schabi.newpipe.databinding.ActivityErrorBinding; -import org.schabi.newpipe.util.Localization; -import org.schabi.newpipe.util.ThemeHelper; -import org.schabi.newpipe.util.external_communication.ShareUtils; - -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.util.Arrays; -import java.util.stream.Collectors; - -/* - * Created by Christian Schabesberger on 24.10.15. - * - * Copyright (C) Christian Schabesberger 2016 - * ErrorActivity.java is part of NewPipe. - * - * NewPipe is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * < - * NewPipe is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * < - * You should have received a copy of the GNU General Public License - * along with NewPipe. If not, see . - */ - -/** - * This activity is used to show error details and allow reporting them in various ways. Use {@link - * ErrorUtil#openActivity(Context, ErrorInfo)} to correctly open this activity. - */ -public class ErrorActivity extends AppCompatActivity { - // LOG TAGS - public static final String TAG = ErrorActivity.class.toString(); - // BUNDLE TAGS - public static final String ERROR_INFO = "error_info"; - - public static final String ERROR_EMAIL_ADDRESS = "crashreport@newpipe.schabi.org"; - public static final String ERROR_EMAIL_SUBJECT = "Exception in "; - - public static final String ERROR_GITHUB_ISSUE_URL = - "https://github.com/TeamNewPipe/NewPipe/issues"; - - private ErrorInfo errorInfo; - private String currentTimeStamp; - - private ActivityErrorBinding activityErrorBinding; - - - //////////////////////////////////////////////////////////////////////// - // Activity lifecycle - //////////////////////////////////////////////////////////////////////// - - @Override - protected void onCreate(final Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - ThemeHelper.setDayNightMode(this); - ThemeHelper.setTheme(this); - - activityErrorBinding = ActivityErrorBinding.inflate(getLayoutInflater()); - setContentView(activityErrorBinding.getRoot()); - - final Intent intent = getIntent(); - - setSupportActionBar(activityErrorBinding.toolbarLayout.toolbar); - - final ActionBar actionBar = getSupportActionBar(); - if (actionBar != null) { - actionBar.setDisplayHomeAsUpEnabled(true); - actionBar.setTitle(R.string.error_report_title); - actionBar.setDisplayShowTitleEnabled(true); - } - - errorInfo = IntentCompat.getParcelableExtra(intent, ERROR_INFO, ErrorInfo.class); - - // important add guru meditation - addGuruMeditation(); - // print current time, as zoned ISO8601 timestamp - final ZonedDateTime now = ZonedDateTime.now(); - currentTimeStamp = now.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME); - - activityErrorBinding.errorReportEmailButton.setOnClickListener(v -> - openPrivacyPolicyDialog(this, "EMAIL")); - - activityErrorBinding.errorReportCopyButton.setOnClickListener(v -> - ShareUtils.copyToClipboard(this, buildMarkdown())); - - activityErrorBinding.errorReportGitHubButton.setOnClickListener(v -> - openPrivacyPolicyDialog(this, "GITHUB")); - - // normal bugreport - buildInfo(errorInfo); - activityErrorBinding.errorMessageView.setText(errorInfo.getMessage(this)); - activityErrorBinding.errorView.setText(formErrorText(errorInfo.getStackTraces())); - - // print stack trace once again for debugging: - for (final String e : errorInfo.getStackTraces()) { - Log.e(TAG, e); - } - } - - @Override - public boolean onCreateOptionsMenu(final Menu menu) { - final MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.error_menu, menu); - return true; - } - - @Override - public boolean onOptionsItemSelected(final MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - onBackPressed(); - return true; - case R.id.menu_item_share_error: - ShareUtils.shareText(getApplicationContext(), - getString(R.string.error_report_title), buildJson()); - return true; - default: - return false; - } - } - - private void openPrivacyPolicyDialog(final Context context, final String action) { - new AlertDialog.Builder(context) - .setIcon(android.R.drawable.ic_dialog_alert) - .setTitle(R.string.privacy_policy_title) - .setMessage(R.string.start_accept_privacy_policy) - .setCancelable(false) - .setNeutralButton(R.string.read_privacy_policy, (dialog, which) -> - ShareUtils.openUrlInApp(context, - context.getString(R.string.privacy_policy_url))) - .setPositiveButton(R.string.accept, (dialog, which) -> { - if (action.equals("EMAIL")) { // send on email - final Intent i = new Intent(Intent.ACTION_SENDTO) - .setData(Uri.parse("mailto:")) // only email apps should handle this - .putExtra(Intent.EXTRA_EMAIL, new String[]{ERROR_EMAIL_ADDRESS}) - .putExtra(Intent.EXTRA_SUBJECT, ERROR_EMAIL_SUBJECT - + getString(R.string.app_name) + " " - + BuildConfig.VERSION_NAME) - .putExtra(Intent.EXTRA_TEXT, buildJson()); - ShareUtils.openIntentInApp(context, i); - } else if (action.equals("GITHUB")) { // open the NewPipe issue page on GitHub - ShareUtils.openUrlInApp(this, ERROR_GITHUB_ISSUE_URL); - } - }) - .setNegativeButton(R.string.decline, null) - .show(); - } - - private String formErrorText(final String[] el) { - final String separator = "-------------------------------------"; - return Arrays.stream(el) - .collect(Collectors.joining(separator + "\n", separator + "\n", separator)); - } - - private void buildInfo(final ErrorInfo info) { - String text = ""; - - activityErrorBinding.errorInfoLabelsView.setText(getString(R.string.info_labels) - .replace("\\n", "\n")); - - text += getUserActionString(info.getUserAction()) + "\n" - + info.getRequest() + "\n" - + getContentLanguageString() + "\n" - + getContentCountryString() + "\n" - + getAppLanguage() + "\n" - + info.getServiceName() + "\n" - + currentTimeStamp + "\n" - + getPackageName() + "\n" - + BuildConfig.VERSION_NAME + "\n" - + getOsString(); - - activityErrorBinding.errorInfosView.setText(text); - } - - private String buildJson() { - try { - return JsonWriter.string() - .object() - .value("user_action", getUserActionString(errorInfo.getUserAction())) - .value("request", errorInfo.getRequest()) - .value("content_language", getContentLanguageString()) - .value("content_country", getContentCountryString()) - .value("app_language", getAppLanguage()) - .value("service", errorInfo.getServiceName()) - .value("package", getPackageName()) - .value("version", BuildConfig.VERSION_NAME) - .value("os", getOsString()) - .value("time", currentTimeStamp) - .array("exceptions", Arrays.asList(errorInfo.getStackTraces())) - .value("user_comment", activityErrorBinding.errorCommentBox.getText() - .toString()) - .end() - .done(); - } catch (final Throwable e) { - Log.e(TAG, "Error while erroring: Could not build json"); - e.printStackTrace(); - } - - return ""; - } - - private String buildMarkdown() { - try { - final StringBuilder htmlErrorReport = new StringBuilder(); - - final String userComment = activityErrorBinding.errorCommentBox.getText().toString(); - if (!userComment.isEmpty()) { - htmlErrorReport.append(userComment).append("\n"); - } - - // basic error info - htmlErrorReport - .append("## Exception") - .append("\n* __User Action:__ ") - .append(getUserActionString(errorInfo.getUserAction())) - .append("\n* __Request:__ ").append(errorInfo.getRequest()) - .append("\n* __Content Country:__ ").append(getContentCountryString()) - .append("\n* __Content Language:__ ").append(getContentLanguageString()) - .append("\n* __App Language:__ ").append(getAppLanguage()) - .append("\n* __Service:__ ").append(errorInfo.getServiceName()) - .append("\n* __Timestamp:__ ").append(currentTimeStamp) - .append("\n* __Package:__ ").append(getPackageName()) - .append("\n* __Service:__ ").append(errorInfo.getServiceName()) - .append("\n* __Version:__ ").append(BuildConfig.VERSION_NAME) - .append("\n* __OS:__ ").append(getOsString()).append("\n"); - - - // Collapse all logs to a single paragraph when there are more than one - // to keep the GitHub issue clean. - if (errorInfo.getStackTraces().length > 1) { - htmlErrorReport - .append("
Exceptions (") - .append(errorInfo.getStackTraces().length) - .append(")

\n"); - } - - // add the logs - for (int i = 0; i < errorInfo.getStackTraces().length; i++) { - htmlErrorReport.append("

Crash log "); - if (errorInfo.getStackTraces().length > 1) { - htmlErrorReport.append(i + 1); - } - htmlErrorReport.append("") - .append("

\n") - .append("\n```\n").append(errorInfo.getStackTraces()[i]).append("\n```\n") - .append("

\n"); - } - - // make sure to close everything - if (errorInfo.getStackTraces().length > 1) { - htmlErrorReport.append("

\n"); - } - htmlErrorReport.append("
\n"); - return htmlErrorReport.toString(); - } catch (final Throwable e) { - Log.e(TAG, "Error while erroring: Could not build markdown"); - e.printStackTrace(); - return ""; - } - } - - private String getUserActionString(final UserAction userAction) { - if (userAction == null) { - return "Your description is in another castle."; - } else { - return userAction.getMessage(); - } - } - - private String getContentCountryString() { - return Localization.getPreferredContentCountry(this).getCountryCode(); - } - - private String getContentLanguageString() { - return Localization.getPreferredLocalization(this).getLocalizationCode(); - } - - private String getAppLanguage() { - return Localization.getAppLocale().toString(); - } - - private String getOsString() { - final String osBase = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M - ? Build.VERSION.BASE_OS : "Android"; - return System.getProperty("os.name") - + " " + (osBase.isEmpty() ? "Android" : osBase) - + " " + Build.VERSION.RELEASE - + " - " + Build.VERSION.SDK_INT; - } - - private void addGuruMeditation() { - //just an easter egg - String text = activityErrorBinding.errorSorryView.getText().toString(); - text += "\n" + getString(R.string.guru_meditation); - activityErrorBinding.errorSorryView.setText(text); - } -} diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorActivity.kt b/app/src/main/java/org/schabi/newpipe/error/ErrorActivity.kt new file mode 100644 index 00000000000..c68a2cfd1e1 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/error/ErrorActivity.kt @@ -0,0 +1,282 @@ +/* + * SPDX-FileCopyrightText: 2015-2026 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.error + +import android.content.Context +import android.content.Intent +import android.os.Build +import android.os.Bundle +import android.util.Log +import android.view.Menu +import android.view.MenuItem +import androidx.appcompat.app.AlertDialog +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.IntentCompat +import androidx.core.net.toUri +import com.grack.nanojson.JsonWriter +import java.time.ZonedDateTime +import java.time.format.DateTimeFormatter +import org.schabi.newpipe.BuildConfig +import org.schabi.newpipe.R +import org.schabi.newpipe.databinding.ActivityErrorBinding +import org.schabi.newpipe.util.Localization +import org.schabi.newpipe.util.ThemeHelper +import org.schabi.newpipe.util.external_communication.ShareUtils +import org.schabi.newpipe.util.text.setTextWithLinks + +/** + * This activity is used to show error details and allow reporting them in various ways. + * Use [ErrorUtil.openActivity] to correctly open this activity. + */ +class ErrorActivity : AppCompatActivity() { + private lateinit var errorInfo: ErrorInfo + private lateinit var currentTimeStamp: String + + private lateinit var binding: ActivityErrorBinding + + private val contentCountryString: String + get() = Localization.getPreferredContentCountry(this).countryCode + + private val contentLanguageString: String + get() = Localization.getPreferredLocalization(this).localizationCode + + private val appLanguage: String + get() = Localization.getAppLocale().toString() + + private val osString: String + get() { + val name = System.getProperty("os.name")!! + val osBase = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + Build.VERSION.BASE_OS.ifEmpty { "Android" } + } else { + "Android" + } + return "$name $osBase ${Build.VERSION.RELEASE} - ${Build.VERSION.SDK_INT}" + } + + private val errorEmailSubject: String + get() = "$ERROR_EMAIL_SUBJECT ${getString(R.string.app_name)} ${BuildConfig.VERSION_NAME}" + + // ///////////////////////////////////////////////////////////////////// + // Activity lifecycle + // ///////////////////////////////////////////////////////////////////// + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + ThemeHelper.setDayNightMode(this) + ThemeHelper.setTheme(this) + + binding = ActivityErrorBinding.inflate(layoutInflater) + setContentView(binding.getRoot()) + + setSupportActionBar(binding.toolbarLayout.toolbar) + supportActionBar?.apply { + setDisplayHomeAsUpEnabled(true) + setTitle(R.string.error_report_title) + setDisplayShowTitleEnabled(true) + } + + errorInfo = IntentCompat.getParcelableExtra(intent, ERROR_INFO, ErrorInfo::class.java)!! + + // important add guru meditation + addGuruMeditation() + // print current time, as zoned ISO8601 timestamp + currentTimeStamp = ZonedDateTime.now().format(DateTimeFormatter.ISO_OFFSET_DATE_TIME) + + binding.errorReportEmailButton.setOnClickListener { _ -> + openPrivacyPolicyDialog(this, "EMAIL") + } + + binding.errorReportCopyButton.setOnClickListener { _ -> + ShareUtils.copyToClipboard(this, buildMarkdown()) + } + + binding.errorReportGitHubButton.setOnClickListener { _ -> + openPrivacyPolicyDialog(this, "GITHUB") + } + + // normal bugreport + buildInfo(errorInfo) + binding.errorMessageView.setTextWithLinks(errorInfo.getMessage(this)) + binding.errorView.text = formErrorText(errorInfo.stackTraces) + + // print stack trace once again for debugging: + errorInfo.stackTraces.forEach { Log.e(TAG, it) } + } + + override fun onCreateOptionsMenu(menu: Menu): Boolean { + menuInflater.inflate(R.menu.error_menu, menu) + return true + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + return when (item.itemId) { + android.R.id.home -> { + onBackPressed() + true + } + + R.id.menu_item_share_error -> { + ShareUtils.shareText( + applicationContext, + getString(R.string.error_report_title), + buildJson() + ) + true + } + + else -> false + } + } + + private fun openPrivacyPolicyDialog(context: Context, action: String) { + AlertDialog.Builder(context) + .setIcon(android.R.drawable.ic_dialog_alert) + .setTitle(R.string.privacy_policy_title) + .setMessage(R.string.start_accept_privacy_policy) + .setCancelable(false) + .setNeutralButton(R.string.read_privacy_policy) { _, _ -> + ShareUtils.openUrlInApp(context, context.getString(R.string.privacy_policy_url)) + } + .setPositiveButton(R.string.accept) { _, _ -> + if (action == "EMAIL") { // send on email + val intent = Intent(Intent.ACTION_SENDTO) + .setData("mailto:".toUri()) // only email apps should handle this + .putExtra(Intent.EXTRA_EMAIL, arrayOf(ERROR_EMAIL_ADDRESS)) + .putExtra(Intent.EXTRA_SUBJECT, errorEmailSubject) + .putExtra(Intent.EXTRA_TEXT, buildJson()) + ShareUtils.openIntentInApp(context, intent) + } else if (action == "GITHUB") { // open the NewPipe issue page on GitHub + ShareUtils.openUrlInApp(this, ERROR_GITHUB_ISSUE_URL) + } + } + .setNegativeButton(R.string.decline, null) + .show() + } + + private fun formErrorText(stacktrace: Array): String { + val separator = "-------------------------------------" + return stacktrace.joinToString(separator + "\n", separator + "\n", separator) + } + + private fun buildInfo(info: ErrorInfo) { + binding.errorInfoLabelsView.text = getString(R.string.info_labels) + + val text = info.userAction.message + "\n" + + info.request + "\n" + + contentLanguageString + "\n" + + contentCountryString + "\n" + + appLanguage + "\n" + + info.getServiceName() + "\n" + + currentTimeStamp + "\n" + + packageName + "\n" + + BuildConfig.VERSION_NAME + "\n" + + osString + + binding.errorInfosView.text = text + } + + private fun buildJson(): String { + try { + return JsonWriter.string() + .`object`() + .value("user_action", errorInfo.userAction.message) + .value("request", errorInfo.request) + .value("content_language", contentLanguageString) + .value("content_country", contentCountryString) + .value("app_language", appLanguage) + .value("service", errorInfo.getServiceName()) + .value("package", packageName) + .value("version", BuildConfig.VERSION_NAME) + .value("os", osString) + .value("time", currentTimeStamp) + .array("exceptions", errorInfo.stackTraces.toList()) + .value("user_comment", binding.errorCommentBox.getText().toString()) + .end() + .done() + } catch (exception: Exception) { + Log.e(TAG, "Error while erroring: Could not build json", exception) + } + + return "" + } + + private fun buildMarkdown(): String { + try { + return buildString(1024) { + val userComment = binding.errorCommentBox.text.toString() + if (userComment.isNotEmpty()) { + appendLine(userComment) + } + + // basic error info + appendLine("## Exception") + appendLine("* __User Action:__ ${errorInfo.userAction.message}") + appendLine("* __Request:__ ${errorInfo.request}") + appendLine("* __Content Country:__ $contentCountryString") + appendLine("* __Content Language:__ $contentLanguageString") + appendLine("* __App Language:__ $appLanguage") + appendLine("* __Service:__ ${errorInfo.getServiceName()}") + appendLine("* __Timestamp:__ $currentTimeStamp") + appendLine("* __Package:__ $packageName") + appendLine("* __Service:__ ${errorInfo.getServiceName()}") + appendLine("* __Version:__ ${BuildConfig.VERSION_NAME}") + appendLine("* __OS:__ $osString") + + // Collapse all logs to a single paragraph when there are more than one + // to keep the GitHub issue clean. + if (errorInfo.stackTraces.size > 1) { + append("
Exceptions (") + append(errorInfo.stackTraces.size) + append(")

\n") + } + + // add the logs + errorInfo.stackTraces.forEachIndexed { index, stacktrace -> + append("

Crash log ") + if (errorInfo.stackTraces.size > 1) { + append(index + 1) + } + append("") + append("

\n") + append("\n```\n${stacktrace}\n```\n") + append("

\n") + } + + // make sure to close everything + if (errorInfo.stackTraces.size > 1) { + append("

\n") + } + + append("
\n") + } + } catch (exception: Exception) { + Log.e(TAG, "Error while erroring: Could not build markdown", exception) + return "" + } + } + + private fun addGuruMeditation() { + // just an easter egg + var text = binding.errorSorryView.text.toString() + text += "\n" + getString(R.string.guru_meditation) + binding.errorSorryView.text = text + } + + companion object { + // LOG TAGS + private val TAG = ErrorActivity::class.java.toString() + + // BUNDLE TAGS + const val ERROR_INFO = "error_info" + + private const val ERROR_EMAIL_ADDRESS = "crashreport@newpipe.schabi.org" + private const val ERROR_EMAIL_SUBJECT = "Exception in " + + private const val ERROR_GITHUB_ISSUE_URL = "https://github.com/TeamNewPipe/NewPipe/issues" + } +} diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt b/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt index cd48fb2984b..82f7d84bf45 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt +++ b/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt @@ -29,6 +29,7 @@ import org.schabi.newpipe.extractor.exceptions.YoutubeMusicPremiumContentExcepti import org.schabi.newpipe.ktx.isNetworkRelated import org.schabi.newpipe.player.mediasource.FailedMediaSource import org.schabi.newpipe.player.resolver.PlaybackResolver +import org.schabi.newpipe.util.text.getText /** * 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( return getServiceName(serviceId) } - fun getMessage(context: Context): String { - return message.getString(context) + fun getMessage(context: Context): CharSequence { + return message.getText(context) } companion object { @@ -146,20 +147,23 @@ class ErrorInfo private constructor( private val stringRes: Int, private vararg val formatArgs: String ) : Parcelable { - fun getString(context: Context): String { + fun getText(context: Context): CharSequence { + // Ensure locale aware context via ContextCompat.getContextForLanguage() (just in case context is not AppCompatActivity) + val ctx = ContextCompat.getContextForLanguage(context) return if (formatArgs.isEmpty()) { - // use ContextCompat.getString() just in case context is not AppCompatActivity - ContextCompat.getString(context, stringRes) + ctx.getText(stringRes) } else { // ContextCompat.getString() with formatArgs does not exist, so we just // replicate its source code but with formatArgs - ContextCompat.getContextForLanguage(context).getString(stringRes, *formatArgs) + ctx.resources.getText(stringRes, *formatArgs) } } } const val SERVICE_NONE = "" + const val YOUTUBE_IP_BAN_FAQ_URL = "https://newpipe.net/FAQ/#ip-banned-youtube" + private fun getServiceName(serviceId: Int?) = // not using getNameOfServiceById since we want to accept a nullable serviceId and we // want to default to SERVICE_NONE ServiceList.all().firstOrNull { it.serviceId == serviceId }?.serviceInfo?.name @@ -247,7 +251,11 @@ class ErrorInfo private constructor( ErrorMessage(R.string.youtube_music_premium_content) throwable is SignInConfirmNotBotException -> - ErrorMessage(R.string.sign_in_confirm_not_bot_error, getServiceName(serviceId)) + ErrorMessage( + R.string.sign_in_confirm_not_bot_error, + getServiceName(serviceId), + YOUTUBE_IP_BAN_FAQ_URL + ) throwable is ContentNotAvailableException -> ErrorMessage(R.string.content_not_available) diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt b/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt index 023d13e9d8d..8136c78d813 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt +++ b/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt @@ -16,6 +16,7 @@ import org.schabi.newpipe.MainActivity import org.schabi.newpipe.R import org.schabi.newpipe.ktx.animate import org.schabi.newpipe.util.external_communication.ShareUtils +import org.schabi.newpipe.util.text.setTextWithLinks class ErrorPanelHelper( private val fragment: Fragment, @@ -64,7 +65,7 @@ class ErrorPanelHelper( fun showError(errorInfo: ErrorInfo) { ensureDefaultVisibility() - errorTextView.text = errorInfo.getMessage(context) + errorTextView.setTextWithLinks(errorInfo.getMessage(context)) if (errorInfo.recaptchaUrl != null) { showAndSetErrorButtonAction(R.string.recaptcha_solve) { @@ -109,7 +110,7 @@ class ErrorPanelHelper( fun showTextError(errorString: String) { ensureDefaultVisibility() - errorTextView.text = errorString + errorTextView.setTextWithLinks(errorString) setRootVisible() } diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt b/app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt index 7facb5d8566..0fa302623b5 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt +++ b/app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt @@ -134,8 +134,11 @@ class ErrorUtil { ) ) - NotificationManagerCompat.from(context) - .notify(ERROR_REPORT_NOTIFICATION_ID, notificationBuilder.build()) + val notificationManager = NotificationManagerCompat.from(context) + if (notificationManager.areNotificationsEnabled()) { + notificationManager + .notify(ERROR_REPORT_NOTIFICATION_ID, notificationBuilder.build()) + } ContextCompat.getMainExecutor(context).execute { // since the notification is silent, also show a toast, otherwise the user is confused diff --git a/app/src/main/java/org/schabi/newpipe/error/ReCaptchaActivity.java b/app/src/main/java/org/schabi/newpipe/error/ReCaptchaActivity.java index 51a0ff1e632..811671039c9 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ReCaptchaActivity.java +++ b/app/src/main/java/org/schabi/newpipe/error/ReCaptchaActivity.java @@ -126,6 +126,7 @@ public boolean onCreateOptionsMenu(final Menu menu) { } @Override + @SuppressLint("MissingSuperCall") // saveCookiesAndFinish method handles back navigation public void onBackPressed() { saveCookiesAndFinish(); } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index ef9fa1137ff..da76a4b15b2 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -118,7 +118,7 @@ import org.schabi.newpipe.util.ThemeHelper; import org.schabi.newpipe.util.external_communication.KoreUtils; import org.schabi.newpipe.util.external_communication.ShareUtils; -import org.schabi.newpipe.util.image.PicassoHelper; +import org.schabi.newpipe.util.image.CoilHelper; import java.util.ArrayList; import java.util.Iterator; @@ -129,6 +129,7 @@ import java.util.concurrent.TimeUnit; import java.util.function.Consumer; +import coil3.util.CoilUtils; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.disposables.CompositeDisposable; import io.reactivex.rxjava3.disposables.Disposable; @@ -160,8 +161,6 @@ public final class VideoDetailFragment private static final String DESCRIPTION_TAB_TAG = "DESCRIPTION TAB"; private static final String EMPTY_TAB_TAG = "EMPTY TAB"; - private static final String PICASSO_VIDEO_DETAILS_TAG = "PICASSO_VIDEO_DETAILS_TAG"; - // tabs private boolean showComments; private boolean showRelatedItems; @@ -646,6 +645,12 @@ protected void initViews(final View rootView, final Bundle savedInstanceState) { protected void initListeners() { super.initListeners(); + // Workaround for #5600 + // Forcefully catch click events uncaught by children because otherwise + // they will be caught by underlying view and "click through" will happen + binding.getRoot().setOnClickListener(v -> { }); + binding.getRoot().setOnLongClickListener(v -> true); + setOnClickListeners(); setOnLongClickListeners(); @@ -1493,7 +1498,10 @@ public void showLoading() { } } - PicassoHelper.cancelTag(PICASSO_VIDEO_DETAILS_TAG); + CoilUtils.dispose(binding.detailThumbnailImageView); + CoilUtils.dispose(binding.detailSubChannelThumbnailView); + CoilUtils.dispose(binding.overlayThumbnail); + CoilUtils.dispose(binding.detailUploaderThumbnailView); binding.detailThumbnailImageView.setImageBitmap(null); binding.detailSubChannelThumbnailView.setImageBitmap(null); } @@ -1584,8 +1592,8 @@ public void handleResult(@NonNull final StreamInfo info) { binding.detailSecondaryControlPanel.setVisibility(View.GONE); checkUpdateProgressInfo(info); - PicassoHelper.loadDetailsThumbnail(info.getThumbnails()).tag(PICASSO_VIDEO_DETAILS_TAG) - .into(binding.detailThumbnailImageView); + CoilHelper.INSTANCE.loadDetailsThumbnail(binding.detailThumbnailImageView, + info.getThumbnails()); showMetaInfoInTextView(info.getMetaInfo(), binding.detailMetaInfoTextView, binding.detailMetaInfoSeparator, disposables); @@ -1635,8 +1643,8 @@ private void displayUploaderAsSubChannel(final StreamInfo info) { binding.detailUploaderTextView.setVisibility(View.GONE); } - PicassoHelper.loadAvatar(info.getUploaderAvatars()).tag(PICASSO_VIDEO_DETAILS_TAG) - .into(binding.detailSubChannelThumbnailView); + CoilHelper.INSTANCE.loadAvatar(binding.detailSubChannelThumbnailView, + info.getUploaderAvatars()); binding.detailSubChannelThumbnailView.setVisibility(View.VISIBLE); binding.detailUploaderThumbnailView.setVisibility(View.GONE); } @@ -1667,11 +1675,11 @@ private void displayBothUploaderAndSubChannel(final StreamInfo info) { binding.detailUploaderTextView.setVisibility(View.GONE); } - PicassoHelper.loadAvatar(info.getSubChannelAvatars()).tag(PICASSO_VIDEO_DETAILS_TAG) - .into(binding.detailSubChannelThumbnailView); + CoilHelper.INSTANCE.loadAvatar(binding.detailSubChannelThumbnailView, + info.getSubChannelAvatars()); binding.detailSubChannelThumbnailView.setVisibility(View.VISIBLE); - PicassoHelper.loadAvatar(info.getUploaderAvatars()).tag(PICASSO_VIDEO_DETAILS_TAG) - .into(binding.detailUploaderThumbnailView); + CoilHelper.INSTANCE.loadAvatar(binding.detailUploaderThumbnailView, + info.getUploaderAvatars()); binding.detailUploaderThumbnailView.setVisibility(View.VISIBLE); } @@ -1899,7 +1907,11 @@ public void onFullscreenStateChanged(final boolean fullscreen) { } if (binding.relatedItemsLayout != null) { - binding.relatedItemsLayout.setVisibility(fullscreen ? View.GONE : View.VISIBLE); + if (showRelatedItems) { + binding.relatedItemsLayout.setVisibility(fullscreen ? View.GONE : View.VISIBLE); + } else { + binding.relatedItemsLayout.setVisibility(View.GONE); + } } scrollToTop(); @@ -2429,8 +2441,7 @@ private void updateOverlayData(@Nullable final String overlayTitle, binding.overlayTitleTextView.setText(isEmpty(overlayTitle) ? "" : overlayTitle); binding.overlayChannelTextView.setText(isEmpty(uploader) ? "" : uploader); binding.overlayThumbnail.setImageDrawable(null); - PicassoHelper.loadDetailsThumbnail(thumbnails).tag(PICASSO_VIDEO_DETAILS_TAG) - .into(binding.overlayThumbnail); + CoilHelper.INSTANCE.loadDetailsThumbnail(binding.overlayThumbnail, thumbnails); } private void setOverlayPlayPauseImage(final boolean playerIsPlaying) { diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java index d75d14b4ada..97481f25b3d 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java @@ -53,13 +53,14 @@ import org.schabi.newpipe.util.StateSaver; import org.schabi.newpipe.util.ThemeHelper; import org.schabi.newpipe.util.external_communication.ShareUtils; +import org.schabi.newpipe.util.image.CoilHelper; import org.schabi.newpipe.util.image.ImageStrategy; -import org.schabi.newpipe.util.image.PicassoHelper; import java.util.List; import java.util.Queue; import java.util.concurrent.TimeUnit; +import coil3.util.CoilUtils; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.core.Observable; import io.reactivex.rxjava3.disposables.CompositeDisposable; @@ -73,7 +74,6 @@ public class ChannelFragment extends BaseStateFragment implements StateSaver.WriteRead { private static final int BUTTON_DEBOUNCE_INTERVAL = 100; - private static final String PICASSO_CHANNEL_TAG = "PICASSO_CHANNEL_TAG"; @State protected int serviceId = Constants.NO_SERVICE_ID; @@ -160,34 +160,29 @@ public void onPrepareMenu(@NonNull final Menu menu) { @Override public boolean onMenuItemSelected(@NonNull final MenuItem item) { - switch (item.getItemId()) { - case R.id.menu_item_notify: - final boolean value = !item.isChecked(); - item.setEnabled(false); - setNotify(value); - break; - case R.id.action_settings: - NavigationHelper.openSettings(requireContext()); - break; - case R.id.menu_item_rss: - if (currentInfo != null) { - ShareUtils.openUrlInApp(requireContext(), currentInfo.getFeedUrl()); - } - break; - case R.id.menu_item_openInBrowser: - if (currentInfo != null) { - ShareUtils.openUrlInBrowser(requireContext(), - currentInfo.getOriginalUrl()); - } - break; - case R.id.menu_item_share: - if (currentInfo != null) { - ShareUtils.shareText(requireContext(), name, - currentInfo.getOriginalUrl(), currentInfo.getAvatars()); - } - break; - default: - return false; + final int itemId = item.getItemId(); + if (itemId == R.id.menu_item_notify) { + final boolean value = !item.isChecked(); + item.setEnabled(false); + setNotify(value); + } else if (itemId == R.id.action_settings) { + NavigationHelper.openSettings(requireContext()); + } else if (itemId == R.id.menu_item_rss) { + if (currentInfo != null) { + ShareUtils.openUrlInApp(requireContext(), currentInfo.getFeedUrl()); + } + } else if (itemId == R.id.menu_item_openInBrowser) { + if (currentInfo != null) { + ShareUtils.openUrlInBrowser(requireContext(), + currentInfo.getOriginalUrl()); + } + } else if (itemId == R.id.menu_item_share) { + if (currentInfo != null) { + ShareUtils.shareText(requireContext(), name, + currentInfo.getOriginalUrl(), currentInfo.getAvatars()); + } + } else { + return false; } return true; } @@ -583,7 +578,9 @@ private void runWorker(final boolean forceLoad) { @Override public void showLoading() { super.showLoading(); - PicassoHelper.cancelTag(PICASSO_CHANNEL_TAG); + CoilUtils.dispose(binding.channelAvatarView); + CoilUtils.dispose(binding.channelBannerImage); + CoilUtils.dispose(binding.subChannelAvatarView); animate(binding.channelSubscribeButton, false, 100); } @@ -594,17 +591,15 @@ public void handleResult(@NonNull final ChannelInfo result) { setInitialData(result.getServiceId(), result.getOriginalUrl(), result.getName()); if (ImageStrategy.shouldLoadImages() && !result.getBanners().isEmpty()) { - PicassoHelper.loadBanner(result.getBanners()).tag(PICASSO_CHANNEL_TAG) - .into(binding.channelBannerImage); + CoilHelper.INSTANCE.loadBanner(binding.channelBannerImage, result.getBanners()); } else { // do not waste space for the banner, if the user disabled images or there is not one binding.channelBannerImage.setImageDrawable(null); } - PicassoHelper.loadAvatar(result.getAvatars()).tag(PICASSO_CHANNEL_TAG) - .into(binding.channelAvatarView); - PicassoHelper.loadAvatar(result.getParentChannelAvatars()).tag(PICASSO_CHANNEL_TAG) - .into(binding.subChannelAvatarView); + CoilHelper.INSTANCE.loadAvatar(binding.channelAvatarView, result.getAvatars()); + CoilHelper.INSTANCE.loadAvatar(binding.subChannelAvatarView, + result.getParentChannelAvatars()); binding.channelTitleView.setText(result.getName()); binding.channelSubscriberView.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentRepliesFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentRepliesFragment.java index ce52c029dd2..ed7dd5a8c1f 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentRepliesFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentRepliesFragment.java @@ -25,8 +25,8 @@ import org.schabi.newpipe.util.ExtractorHelper; import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.NavigationHelper; +import org.schabi.newpipe.util.image.CoilHelper; import org.schabi.newpipe.util.image.ImageStrategy; -import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.text.TextLinkifier; import org.schabi.newpipe.util.text.LongPressLinkMovementMethod; @@ -84,7 +84,7 @@ protected Supplier getListHeaderSupplier() { final CommentsInfoItem item = commentsInfoItem; // load the author avatar - PicassoHelper.loadAvatar(item.getUploaderAvatars()).into(binding.authorAvatar); + CoilHelper.INSTANCE.loadAvatar(binding.authorAvatar, item.getUploaderAvatars()); binding.authorAvatar.setVisibility(ImageStrategy.shouldLoadImages() ? View.VISIBLE : View.GONE); diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java index 6410fb9ee75..8f0c3ac98e6 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java @@ -53,7 +53,7 @@ import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.PlayButtonHelper; import org.schabi.newpipe.util.external_communication.ShareUtils; -import org.schabi.newpipe.util.image.PicassoHelper; +import org.schabi.newpipe.util.image.CoilHelper; import org.schabi.newpipe.util.text.TextEllipsizer; import java.util.ArrayList; @@ -62,6 +62,7 @@ import java.util.function.Supplier; import java.util.stream.Collectors; +import coil3.util.CoilUtils; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.core.Flowable; import io.reactivex.rxjava3.core.Single; @@ -71,8 +72,6 @@ public class PlaylistFragment extends BaseListInfoFragment implements PlaylistControlViewHolder { - private static final String PICASSO_PLAYLIST_TAG = "PICASSO_PLAYLIST_TAG"; - private CompositeDisposable disposables; private Subscription bookmarkReactor; private AtomicBoolean isBookmarkButtonReady; @@ -232,35 +231,30 @@ protected Single loadResult(final boolean forceLoad) { @Override public boolean onOptionsItemSelected(final MenuItem item) { - switch (item.getItemId()) { - case R.id.action_settings: - NavigationHelper.openSettings(requireContext()); - break; - case R.id.menu_item_openInBrowser: - ShareUtils.openUrlInBrowser(requireContext(), url); - break; - case R.id.menu_item_share: - ShareUtils.shareText(requireContext(), name, url, - currentInfo == null ? List.of() : currentInfo.getThumbnails()); - break; - case R.id.menu_item_bookmark: - onBookmarkClicked(); - break; - case R.id.menu_item_append_playlist: - if (currentInfo != null) { - disposables.add(PlaylistDialog.createCorrespondingDialog( - getContext(), - getPlayQueue() - .getStreams() - .stream() - .map(StreamEntity::new) - .collect(Collectors.toList()), - dialog -> dialog.show(getFM(), TAG) - )); - } - break; - default: - return super.onOptionsItemSelected(item); + final int itemId = item.getItemId(); + if (itemId == R.id.action_settings) { + NavigationHelper.openSettings(requireContext()); + } else if (itemId == R.id.menu_item_openInBrowser) { + ShareUtils.openUrlInBrowser(requireContext(), url); + } else if (itemId == R.id.menu_item_share) { + ShareUtils.shareText(requireContext(), name, url, + currentInfo == null ? List.of() : currentInfo.getThumbnails()); + } else if (itemId == R.id.menu_item_bookmark) { + onBookmarkClicked(); + } else if (itemId == R.id.menu_item_append_playlist) { + if (currentInfo != null) { + disposables.add(PlaylistDialog.createCorrespondingDialog( + getContext(), + getPlayQueue() + .getStreams() + .stream() + .map(StreamEntity::new) + .collect(Collectors.toList()), + dialog -> dialog.show(getFM(), TAG) + )); + } + } else { + return super.onOptionsItemSelected(item); } return true; } @@ -276,7 +270,7 @@ public void showLoading() { animate(headerBinding.getRoot(), false, 200); animateHideRecyclerViewAllowingScrolling(itemsList); - PicassoHelper.cancelTag(PICASSO_PLAYLIST_TAG); + CoilUtils.dispose(headerBinding.uploaderAvatarView); animate(headerBinding.uploaderLayout, false, 200); } @@ -327,8 +321,8 @@ public void handleResult(@NonNull final PlaylistInfo result) { R.drawable.ic_radio) ); } else { - PicassoHelper.loadAvatar(result.getUploaderAvatars()).tag(PICASSO_PLAYLIST_TAG) - .into(headerBinding.uploaderAvatarView); + CoilHelper.INSTANCE.loadAvatar(headerBinding.uploaderAvatarView, + result.getUploaderAvatars()); } streamCount = result.getStreamCount(); diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java index 8cb5f649734..5c0d7d321fd 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java @@ -1009,7 +1009,11 @@ public void handleSuggestions(@NonNull final List suggestions) { Log.d(TAG, "handleSuggestions() called with: suggestions = [" + suggestions + "]"); } suggestionListAdapter.submitList(suggestions, - () -> searchBinding.suggestionsList.scrollToPosition(0)); + () -> { + if (searchBinding != null) { + searchBinding.suggestionsList.scrollToPosition(0); + } + }); if (suggestionsPanelVisible && isErrorPanelVisible()) { hideLoading(); diff --git a/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.java b/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.java deleted file mode 100644 index d959c63277c..00000000000 --- a/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.java +++ /dev/null @@ -1,131 +0,0 @@ -package org.schabi.newpipe.info_list; - -import android.content.Context; -import android.view.View; -import android.view.ViewGroup; - -import androidx.annotation.NonNull; - -import org.schabi.newpipe.extractor.InfoItem; -import org.schabi.newpipe.extractor.channel.ChannelInfoItem; -import org.schabi.newpipe.extractor.comments.CommentsInfoItem; -import org.schabi.newpipe.extractor.playlist.PlaylistInfoItem; -import org.schabi.newpipe.extractor.stream.StreamInfoItem; -import org.schabi.newpipe.info_list.holder.ChannelInfoItemHolder; -import org.schabi.newpipe.info_list.holder.ChannelMiniInfoItemHolder; -import org.schabi.newpipe.info_list.holder.CommentInfoItemHolder; -import org.schabi.newpipe.info_list.holder.InfoItemHolder; -import org.schabi.newpipe.info_list.holder.PlaylistInfoItemHolder; -import org.schabi.newpipe.info_list.holder.PlaylistMiniInfoItemHolder; -import org.schabi.newpipe.info_list.holder.StreamInfoItemHolder; -import org.schabi.newpipe.info_list.holder.StreamMiniInfoItemHolder; -import org.schabi.newpipe.local.history.HistoryRecordManager; -import org.schabi.newpipe.util.OnClickGesture; - -/* - * Created by Christian Schabesberger on 26.09.16. - *

- * Copyright (C) Christian Schabesberger 2016 - * InfoItemBuilder.java is part of NewPipe. - *

- *

- * NewPipe is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - *

- *

- * NewPipe is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - *

- *

- * You should have received a copy of the GNU General Public License - * along with NewPipe. If not, see . - *

- */ - -public class InfoItemBuilder { - private final Context context; - - private OnClickGesture onStreamSelectedListener; - private OnClickGesture onChannelSelectedListener; - private OnClickGesture onPlaylistSelectedListener; - private OnClickGesture onCommentsSelectedListener; - - public InfoItemBuilder(final Context context) { - this.context = context; - } - - public View buildView(@NonNull final ViewGroup parent, @NonNull final InfoItem infoItem, - final HistoryRecordManager historyRecordManager) { - return buildView(parent, infoItem, historyRecordManager, false); - } - - public View buildView(@NonNull final ViewGroup parent, @NonNull final InfoItem infoItem, - final HistoryRecordManager historyRecordManager, - final boolean useMiniVariant) { - final InfoItemHolder holder = - holderFromInfoType(parent, infoItem.getInfoType(), useMiniVariant); - holder.updateFromItem(infoItem, historyRecordManager); - return holder.itemView; - } - - private InfoItemHolder holderFromInfoType(@NonNull final ViewGroup parent, - @NonNull final InfoItem.InfoType infoType, - final boolean useMiniVariant) { - switch (infoType) { - case STREAM: - return useMiniVariant ? new StreamMiniInfoItemHolder(this, parent) - : new StreamInfoItemHolder(this, parent); - case CHANNEL: - return useMiniVariant ? new ChannelMiniInfoItemHolder(this, parent) - : new ChannelInfoItemHolder(this, parent); - case PLAYLIST: - return useMiniVariant ? new PlaylistMiniInfoItemHolder(this, parent) - : new PlaylistInfoItemHolder(this, parent); - case COMMENT: - return new CommentInfoItemHolder(this, parent); - default: - throw new RuntimeException("InfoType not expected = " + infoType.name()); - } - } - - public Context getContext() { - return context; - } - - public OnClickGesture getOnStreamSelectedListener() { - return onStreamSelectedListener; - } - - public void setOnStreamSelectedListener(final OnClickGesture listener) { - this.onStreamSelectedListener = listener; - } - - public OnClickGesture getOnChannelSelectedListener() { - return onChannelSelectedListener; - } - - public void setOnChannelSelectedListener(final OnClickGesture listener) { - this.onChannelSelectedListener = listener; - } - - public OnClickGesture getOnPlaylistSelectedListener() { - return onPlaylistSelectedListener; - } - - public void setOnPlaylistSelectedListener(final OnClickGesture listener) { - this.onPlaylistSelectedListener = listener; - } - - public OnClickGesture getOnCommentsSelectedListener() { - return onCommentsSelectedListener; - } - - public void setOnCommentsSelectedListener( - final OnClickGesture onCommentsSelectedListener) { - this.onCommentsSelectedListener = onCommentsSelectedListener; - } -} diff --git a/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.kt b/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.kt new file mode 100644 index 00000000000..cf674180e72 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.kt @@ -0,0 +1,20 @@ +/* + * SPDX-FileCopyrightText: 2016-2026 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.info_list + +import android.content.Context +import org.schabi.newpipe.extractor.channel.ChannelInfoItem +import org.schabi.newpipe.extractor.comments.CommentsInfoItem +import org.schabi.newpipe.extractor.playlist.PlaylistInfoItem +import org.schabi.newpipe.extractor.stream.StreamInfoItem +import org.schabi.newpipe.util.OnClickGesture + +class InfoItemBuilder(val context: Context) { + var onStreamSelectedListener: OnClickGesture? = null + var onChannelSelectedListener: OnClickGesture? = null + var onPlaylistSelectedListener: OnClickGesture? = null + var onCommentsSelectedListener: OnClickGesture? = null +} diff --git a/app/src/main/java/org/schabi/newpipe/info_list/StreamSegmentItem.kt b/app/src/main/java/org/schabi/newpipe/info_list/StreamSegmentItem.kt index a7ca3bd68ea..7276051e86b 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/StreamSegmentItem.kt +++ b/app/src/main/java/org/schabi/newpipe/info_list/StreamSegmentItem.kt @@ -1,19 +1,18 @@ package org.schabi.newpipe.info_list import android.view.View -import android.widget.ImageView -import android.widget.TextView -import com.xwray.groupie.GroupieViewHolder -import com.xwray.groupie.Item +import com.xwray.groupie.viewbinding.BindableItem +import com.xwray.groupie.viewbinding.GroupieViewHolder import org.schabi.newpipe.R +import org.schabi.newpipe.databinding.ItemStreamSegmentBinding import org.schabi.newpipe.extractor.stream.StreamSegment import org.schabi.newpipe.util.Localization -import org.schabi.newpipe.util.image.PicassoHelper +import org.schabi.newpipe.util.image.CoilHelper class StreamSegmentItem( private val item: StreamSegment, private val onClick: StreamSegmentAdapter.StreamSegmentListener -) : Item() { +) : BindableItem() { companion object { const val PAYLOAD_SELECT = 1 @@ -21,34 +20,35 @@ class StreamSegmentItem( var isSelected = false - override fun bind(viewHolder: GroupieViewHolder, position: Int) { - item.previewUrl?.let { - PicassoHelper.loadThumbnail(it) - .into(viewHolder.root.findViewById(R.id.previewImage)) - } - viewHolder.root.findViewById(R.id.textViewTitle).text = item.title + override fun bind(viewBinding: ItemStreamSegmentBinding, position: Int) { + CoilHelper.loadThumbnail(viewBinding.previewImage, item.previewUrl) + viewBinding.textViewTitle.text = item.title if (item.channelName == null) { - viewHolder.root.findViewById(R.id.textViewChannel).visibility = View.GONE + viewBinding.textViewChannel.visibility = View.GONE // When the channel name is displayed there is less space // and thus the segment title needs to be only one line height. // But when there is no channel name displayed, the title can be two lines long. // The default maxLines value is set to 1 to display all elements in the AS preview, - viewHolder.root.findViewById(R.id.textViewTitle).maxLines = 2 + viewBinding.textViewTitle.maxLines = 2 } else { - viewHolder.root.findViewById(R.id.textViewChannel).text = item.channelName - viewHolder.root.findViewById(R.id.textViewChannel).visibility = View.VISIBLE + viewBinding.textViewChannel.text = item.channelName + viewBinding.textViewChannel.visibility = View.VISIBLE } - viewHolder.root.findViewById(R.id.textViewStartSeconds).text = + viewBinding.textViewStartSeconds.text = Localization.getDurationString(item.startTimeSeconds.toLong()) - viewHolder.root.setOnClickListener { onClick.onItemClick(this, item.startTimeSeconds) } - viewHolder.root.setOnLongClickListener { + viewBinding.root.setOnClickListener { onClick.onItemClick(this, item.startTimeSeconds) } + viewBinding.root.setOnLongClickListener { onClick.onItemLongClick(this, item.startTimeSeconds) true } - viewHolder.root.isSelected = isSelected + viewBinding.root.isSelected = isSelected } - override fun bind(viewHolder: GroupieViewHolder, position: Int, payloads: MutableList) { + override fun bind( + viewHolder: GroupieViewHolder, + position: Int, + payloads: MutableList + ) { if (payloads.contains(PAYLOAD_SELECT)) { viewHolder.root.isSelected = isSelected return @@ -57,4 +57,6 @@ class StreamSegmentItem( } override fun getLayout() = R.layout.item_stream_segment + + override fun initializeViewBinding(view: View) = ItemStreamSegmentBinding.bind(view) } diff --git a/app/src/main/java/org/schabi/newpipe/info_list/dialog/InfoItemDialog.java b/app/src/main/java/org/schabi/newpipe/info_list/dialog/InfoItemDialog.java index 0c69557bfd8..dcf01e1905e 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/dialog/InfoItemDialog.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/dialog/InfoItemDialog.java @@ -346,7 +346,7 @@ public InfoItemDialog create() { public static void reportErrorDuringInitialization(final Throwable throwable, final InfoItem item) { - ErrorUtil.showSnackbar(App.getApp().getBaseContext(), new ErrorInfo( + ErrorUtil.showSnackbar(App.getInstance().getBaseContext(), new ErrorInfo( throwable, UserAction.OPEN_INFO_ITEM_DIALOG, "none", diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelMiniInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelMiniInfoItemHolder.java index 7afc05c6c25..92a5054e130 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelMiniInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelMiniInfoItemHolder.java @@ -13,8 +13,8 @@ import org.schabi.newpipe.extractor.utils.Utils; import org.schabi.newpipe.info_list.InfoItemBuilder; import org.schabi.newpipe.local.history.HistoryRecordManager; -import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.Localization; +import org.schabi.newpipe.util.image.CoilHelper; public class ChannelMiniInfoItemHolder extends InfoItemHolder { private final ImageView itemThumbnailView; @@ -56,7 +56,7 @@ public void updateFromItem(final InfoItem infoItem, itemAdditionalDetailView.setText(getDetailLine(item)); } - PicassoHelper.loadAvatar(item.getThumbnails()).into(itemThumbnailView); + CoilHelper.INSTANCE.loadAvatar(itemThumbnailView, item.getThumbnails()); itemView.setOnClickListener(view -> { if (itemBuilder.getOnChannelSelectedListener() != null) { diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentInfoItemHolder.java index a19831cc7e6..5dee128ebf7 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentInfoItemHolder.java @@ -27,8 +27,8 @@ import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.external_communication.ShareUtils; +import org.schabi.newpipe.util.image.CoilHelper; import org.schabi.newpipe.util.image.ImageStrategy; -import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.text.TextEllipsizer; public class CommentInfoItemHolder extends InfoItemHolder { @@ -82,14 +82,12 @@ public CommentInfoItemHolder(final InfoItemBuilder infoItemBuilder, @Override public void updateFromItem(final InfoItem infoItem, final HistoryRecordManager historyRecordManager) { - if (!(infoItem instanceof CommentsInfoItem)) { + if (!(infoItem instanceof CommentsInfoItem item)) { return; } - final CommentsInfoItem item = (CommentsInfoItem) infoItem; - // load the author avatar - PicassoHelper.loadAvatar(item.getUploaderAvatars()).into(itemThumbnailView); + CoilHelper.INSTANCE.loadAvatar(itemThumbnailView, item.getUploaderAvatars()); if (ImageStrategy.shouldLoadImages()) { itemThumbnailView.setVisibility(View.VISIBLE); itemRoot.setPadding(commentVerticalPadding, commentVerticalPadding, diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistMiniInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistMiniInfoItemHolder.java index c9216d9a9e5..b7949318d58 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistMiniInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistMiniInfoItemHolder.java @@ -9,8 +9,8 @@ import org.schabi.newpipe.extractor.playlist.PlaylistInfoItem; import org.schabi.newpipe.info_list.InfoItemBuilder; import org.schabi.newpipe.local.history.HistoryRecordManager; -import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.Localization; +import org.schabi.newpipe.util.image.CoilHelper; public class PlaylistMiniInfoItemHolder extends InfoItemHolder { public final ImageView itemThumbnailView; @@ -46,7 +46,7 @@ public void updateFromItem(final InfoItem infoItem, .localizeStreamCountMini(itemStreamCountView.getContext(), item.getStreamCount())); itemUploaderView.setText(item.getUploaderName()); - PicassoHelper.loadPlaylistThumbnail(item.getThumbnails()).into(itemThumbnailView); + CoilHelper.INSTANCE.loadPlaylistThumbnail(itemThumbnailView, item.getThumbnails()); itemView.setOnClickListener(view -> { if (itemBuilder.getOnPlaylistSelectedListener() != null) { diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamMiniInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamMiniInfoItemHolder.java index 01f3be6b328..32fa8bf608b 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamMiniInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamMiniInfoItemHolder.java @@ -16,8 +16,8 @@ import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.util.DependentPreferenceHelper; import org.schabi.newpipe.util.Localization; -import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.StreamTypeUtil; +import org.schabi.newpipe.util.image.CoilHelper; import org.schabi.newpipe.views.AnimatedProgressBar; import java.util.concurrent.TimeUnit; @@ -87,7 +87,7 @@ public void updateFromItem(final InfoItem infoItem, } // Default thumbnail is shown on error, while loading and if the url is empty - PicassoHelper.loadThumbnail(item.getThumbnails()).into(itemThumbnailView); + CoilHelper.INSTANCE.loadThumbnail(itemThumbnailView, item.getThumbnails()); itemView.setOnClickListener(view -> { if (itemBuilder.getOnStreamSelectedListener() != null) { diff --git a/app/src/main/java/org/schabi/newpipe/ktx/Bitmap.kt b/app/src/main/java/org/schabi/newpipe/ktx/Bitmap.kt new file mode 100644 index 00000000000..140351b0d6c --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/ktx/Bitmap.kt @@ -0,0 +1,13 @@ +package org.schabi.newpipe.ktx + +import android.graphics.Bitmap +import android.graphics.Rect +import androidx.core.graphics.BitmapCompat + +@Suppress("NOTHING_TO_INLINE") +inline fun Bitmap.scale( + width: Int, + height: Int, + srcRect: Rect? = null, + scaleInLinearSpace: Boolean = true +) = BitmapCompat.createScaledBitmap(this, width, height, srcRect, scaleInLinearSpace) diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt index ac076f1b8d6..89b89a80001 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt @@ -255,7 +255,7 @@ class FeedFragment : BaseStateFragment() { viewModel.getShowFutureItemsFromPreferences() ) - AlertDialog.Builder(context!!) + AlertDialog.Builder(requireContext()) .setTitle(R.string.feed_hide_streams_title) .setMultiChoiceItems(dialogItems, checkedDialogItems) { _, which, isChecked -> checkedDialogItems[which] = isChecked diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt index 7e781b30f7d..19adf6eaada 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt @@ -129,8 +129,7 @@ class FeedViewModel( fun setSaveShowPlayedItems(showPlayedItems: Boolean) { this.showPlayedItems.onNext(showPlayedItems) PreferenceManager.getDefaultSharedPreferences(application).edit { - this.putBoolean(application.getString(R.string.feed_show_watched_items_key), showPlayedItems) - this.apply() + putBoolean(application.getString(R.string.feed_show_watched_items_key), showPlayedItems) } } @@ -139,8 +138,7 @@ class FeedViewModel( fun setSaveShowPartiallyPlayedItems(showPartiallyPlayedItems: Boolean) { this.showPartiallyPlayedItems.onNext(showPartiallyPlayedItems) PreferenceManager.getDefaultSharedPreferences(application).edit { - this.putBoolean(application.getString(R.string.feed_show_partially_watched_items_key), showPartiallyPlayedItems) - this.apply() + putBoolean(application.getString(R.string.feed_show_partially_watched_items_key), showPartiallyPlayedItems) } } @@ -149,8 +147,7 @@ class FeedViewModel( fun setSaveShowFutureItems(showFutureItems: Boolean) { this.showFutureItems.onNext(showFutureItems) PreferenceManager.getDefaultSharedPreferences(application).edit { - this.putBoolean(application.getString(R.string.feed_show_future_items_key), showFutureItems) - this.apply() + putBoolean(application.getString(R.string.feed_show_future_items_key), showFutureItems) } } @@ -169,7 +166,7 @@ class FeedViewModel( fun getFactory(context: Context, groupId: Long) = viewModelFactory { initializer { FeedViewModel( - App.getApp(), + App.instance, groupId, // Read initial value from preferences getShowPlayedItemsFromPreferences(context.applicationContext), diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/item/StreamItem.kt b/app/src/main/java/org/schabi/newpipe/local/feed/item/StreamItem.kt index e367961f12c..258a67a4cc6 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/item/StreamItem.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/item/StreamItem.kt @@ -21,7 +21,7 @@ import org.schabi.newpipe.extractor.stream.StreamType.POST_LIVE_STREAM import org.schabi.newpipe.extractor.stream.StreamType.VIDEO_STREAM import org.schabi.newpipe.util.Localization import org.schabi.newpipe.util.StreamTypeUtil -import org.schabi.newpipe.util.image.PicassoHelper +import org.schabi.newpipe.util.image.CoilHelper data class StreamItem( val streamWithState: StreamWithState, @@ -101,7 +101,7 @@ data class StreamItem( viewBinding.itemProgressView.visibility = View.GONE } - PicassoHelper.loadThumbnail(stream.thumbnailUrl).into(viewBinding.itemThumbnailView) + CoilHelper.loadThumbnail(viewBinding.itemThumbnailView, stream.thumbnailUrl) if (itemVersion != ItemVersion.MINI) { viewBinding.itemAdditionalDetails.text = diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt index d2d16a75587..11be80f2a1f 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt @@ -6,7 +6,6 @@ import android.app.PendingIntent import android.content.Context import android.content.Intent import android.graphics.Bitmap -import android.graphics.drawable.Drawable import android.net.Uri import android.os.Build import android.provider.Settings @@ -17,20 +16,17 @@ import androidx.core.content.ContextCompat import androidx.core.content.getSystemService import androidx.core.net.toUri import androidx.preference.PreferenceManager -import com.squareup.picasso.Picasso -import com.squareup.picasso.Target import org.schabi.newpipe.R import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.local.feed.service.FeedUpdateInfo import org.schabi.newpipe.util.NavigationHelper -import org.schabi.newpipe.util.image.PicassoHelper +import org.schabi.newpipe.util.image.CoilHelper /** * Helper for everything related to show notifications about new streams to the user. */ class NotificationHelper(val context: Context) { private val manager = NotificationManagerCompat.from(context) - private val iconLoadingTargets = ArrayList() /** * Show notifications for new streams from a single channel. The individual notifications are @@ -71,69 +67,42 @@ class NotificationHelper(val context: Context) { summaryBuilder.setStyle(style) // open the channel page when clicking on the summary notification + val intent = NavigationHelper + .getChannelIntent(context, data.serviceId, data.url) + .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) summaryBuilder.setContentIntent( - PendingIntentCompat.getActivity( - context, - data.pseudoId, - NavigationHelper - .getChannelIntent(context, data.serviceId, data.url) - .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK), - 0, - false - ) + PendingIntentCompat.getActivity(context, data.pseudoId, intent, 0, false) ) - // a Target is like a listener for image loading events - val target = object : Target { - override fun onBitmapLoaded(bitmap: Bitmap, from: Picasso.LoadedFrom) { - // set channel icon only if there is actually one (for Android versions < 7.0) - summaryBuilder.setLargeIcon(bitmap) - - // Show individual stream notifications, set channel icon only if there is actually - // one - showStreamNotifications(newStreams, data.serviceId, data.url, bitmap) - // Show summary notification - manager.notify(data.pseudoId, summaryBuilder.build()) - - iconLoadingTargets.remove(this) // allow it to be garbage-collected - } - - override fun onBitmapFailed(e: Exception, errorDrawable: Drawable) { - // Show individual stream notifications - showStreamNotifications(newStreams, data.serviceId, data.url, null) - // Show summary notification - manager.notify(data.pseudoId, summaryBuilder.build()) - iconLoadingTargets.remove(this) // allow it to be garbage-collected - } + val avatarIcon = + CoilHelper.loadBitmapBlocking(context, data.avatarUrl, R.drawable.ic_newpipe_triangle_white) + summaryBuilder.setLargeIcon(avatarIcon) - override fun onPrepareLoad(placeHolderDrawable: Drawable) { - // Nothing to do - } + // Show individual stream notifications, set channel icon only if there is actually one + showStreamNotifications(newStreams, data.serviceId, avatarIcon) + // Show summary notification + if (manager.areNotificationsEnabled()) { + manager.notify(data.pseudoId, summaryBuilder.build()) } - - // add the target to the list to hold a strong reference and prevent it from being garbage - // collected, since Picasso only holds weak references to targets - iconLoadingTargets.add(target) - - PicassoHelper.loadNotificationIcon(data.avatarUrl).into(target) } private fun showStreamNotifications( newStreams: List, serviceId: Int, - channelUrl: String, channelIcon: Bitmap? ) { - for (stream in newStreams) { - val notification = createStreamNotification(stream, serviceId, channelUrl, channelIcon) - manager.notify(stream.url.hashCode(), notification) + if (manager.areNotificationsEnabled()) { + newStreams.forEach { stream -> + val notification = + createStreamNotification(stream, serviceId, channelIcon) + manager.notify(stream.url.hashCode(), notification) + } } } private fun createStreamNotification( item: StreamInfoItem, serviceId: Int, - channelUrl: String, channelIcon: Bitmap? ): Notification { return NotificationCompat.Builder( @@ -144,7 +113,7 @@ class NotificationHelper(val context: Context) { .setLargeIcon(channelIcon) .setContentTitle(item.name) .setContentText(item.uploaderName) - .setGroup(channelUrl) + .setGroup(item.uploaderUrl) .setColor(ContextCompat.getColor(context, R.color.ic_launcher_background)) .setColorized(true) .setAutoCancel(true) diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt index 3090a92d4c2..1e1bdcf16ec 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt @@ -111,7 +111,8 @@ class FeedLoadManager(private val context: Context) { broadcastProgress() } .observeOn(Schedulers.io()) - .flatMap { Flowable.fromIterable(it) } + // Randomize user subscription ordering to attempt to resist fingerprinting + .flatMap { Flowable.fromIterable(it.shuffled()) } .takeWhile { !cancelSignal.get() } .doOnNext { subscriptionEntity -> // throttle YouTube extractions once every BATCH_SIZE to avoid being rate limited diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt index 48ad5df94c9..bd128b3bc3f 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt @@ -185,7 +185,9 @@ class FeedLoadService : Service() { } } - notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build()) + if (notificationManager.areNotificationsEnabled()) { + notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build()) + } } // ///////////////////////////////////////////////////////////////////////// diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java index 528275d75d6..518fb3553a6 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java @@ -8,8 +8,8 @@ import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry; import org.schabi.newpipe.local.LocalItemBuilder; import org.schabi.newpipe.local.history.HistoryRecordManager; -import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.Localization; +import org.schabi.newpipe.util.image.CoilHelper; import java.time.format.DateTimeFormatter; @@ -30,17 +30,16 @@ public LocalPlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final Vie public void updateFromItem(final LocalItem localItem, final HistoryRecordManager historyRecordManager, final DateTimeFormatter dateTimeFormatter) { - if (!(localItem instanceof PlaylistMetadataEntry)) { + if (!(localItem instanceof PlaylistMetadataEntry item)) { return; } - final PlaylistMetadataEntry item = (PlaylistMetadataEntry) localItem; itemTitleView.setText(item.getOrderingName()); itemStreamCountView.setText(Localization.localizeStreamCountMini( itemStreamCountView.getContext(), item.getStreamCount())); itemUploaderView.setVisibility(View.INVISIBLE); - PicassoHelper.loadPlaylistThumbnail(item.getThumbnailUrl()).into(itemThumbnailView); + CoilHelper.INSTANCE.loadPlaylistThumbnail(itemThumbnailView, item.getThumbnailUrl()); if (item instanceof PlaylistDuplicatesEntry && ((PlaylistDuplicatesEntry) item).getTimesStreamIsContained() > 0) { diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamItemHolder.java index 89a714fd7f6..7dc71bfb4ac 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamItemHolder.java @@ -16,8 +16,8 @@ import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.util.DependentPreferenceHelper; import org.schabi.newpipe.util.Localization; -import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.ServiceHelper; +import org.schabi.newpipe.util.image.CoilHelper; import org.schabi.newpipe.views.AnimatedProgressBar; import java.time.format.DateTimeFormatter; @@ -83,8 +83,8 @@ public void updateFromItem(final LocalItem localItem, } // Default thumbnail is shown on error, while loading and if the url is empty - PicassoHelper.loadThumbnail(item.getStreamEntity().getThumbnailUrl()) - .into(itemThumbnailView); + CoilHelper.INSTANCE.loadThumbnail(itemThumbnailView, + item.getStreamEntity().getThumbnailUrl()); itemView.setOnClickListener(view -> { if (itemBuilder.getOnItemSelectedListener() != null) { diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamItemHolder.java index 150a35eb59c..f26a76ad9f7 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamItemHolder.java @@ -16,8 +16,8 @@ import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.util.DependentPreferenceHelper; import org.schabi.newpipe.util.Localization; -import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.ServiceHelper; +import org.schabi.newpipe.util.image.CoilHelper; import org.schabi.newpipe.views.AnimatedProgressBar; import java.time.format.DateTimeFormatter; @@ -117,8 +117,8 @@ public void updateFromItem(final LocalItem localItem, } // Default thumbnail is shown on error, while loading and if the url is empty - PicassoHelper.loadThumbnail(item.getStreamEntity().getThumbnailUrl()) - .into(itemThumbnailView); + CoilHelper.INSTANCE.loadThumbnail(itemThumbnailView, + item.getStreamEntity().getThumbnailUrl()); itemView.setOnClickListener(view -> { if (itemBuilder.getOnItemSelectedListener() != null) { diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java index 3a339aec878..1eb97a59e53 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java @@ -8,8 +8,8 @@ import org.schabi.newpipe.local.LocalItemBuilder; import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.util.Localization; -import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.ServiceHelper; +import org.schabi.newpipe.util.image.CoilHelper; import java.time.format.DateTimeFormatter; @@ -29,10 +29,9 @@ public RemotePlaylistItemHolder(final LocalItemBuilder infoItemBuilder, public void updateFromItem(final LocalItem localItem, final HistoryRecordManager historyRecordManager, final DateTimeFormatter dateTimeFormatter) { - if (!(localItem instanceof PlaylistRemoteEntity)) { + if (!(localItem instanceof PlaylistRemoteEntity item)) { return; } - final PlaylistRemoteEntity item = (PlaylistRemoteEntity) localItem; itemTitleView.setText(item.getOrderingName()); itemStreamCountView.setText(Localization.localizeStreamCountMini( @@ -45,7 +44,7 @@ public void updateFromItem(final LocalItem localItem, itemUploaderView.setText(ServiceHelper.getNameOfServiceById(item.getServiceId())); } - PicassoHelper.loadPlaylistThumbnail(item.getThumbnailUrl()).into(itemThumbnailView); + CoilHelper.INSTANCE.loadPlaylistThumbnail(itemThumbnailView, item.getThumbnailUrl()); super.updateFromItem(localItem, historyRecordManager, dateTimeFormatter); } diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt index ab856278f7e..b0ccaa3c5ad 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt @@ -327,7 +327,7 @@ class FeedGroupDialog : DialogFragment(), BackPressable { groupIcon = feedGroupEntity?.icon groupSortOrder = feedGroupEntity?.sortOrder ?: -1 - val feedGroupIcon = if (selectedIcon == null) icon else selectedIcon!! + val feedGroupIcon = selectedIcon ?: icon feedGroupCreateBinding.iconPreview.setImageResource(feedGroupIcon.getDrawableRes()) if (feedGroupCreateBinding.groupNameInput.text.isNullOrBlank()) { @@ -506,7 +506,7 @@ class FeedGroupDialog : DialogFragment(), BackPressable { private fun hideKeyboardSearch() { inputMethodManager.hideSoftInputFromWindow( searchLayoutBinding.toolbarSearchEditText.windowToken, - InputMethodManager.RESULT_UNCHANGED_SHOWN + InputMethodManager.HIDE_NOT_ALWAYS ) searchLayoutBinding.toolbarSearchEditText.clearFocus() } @@ -523,7 +523,7 @@ class FeedGroupDialog : DialogFragment(), BackPressable { private fun hideKeyboard() { inputMethodManager.hideSoftInputFromWindow( feedGroupCreateBinding.groupNameInput.windowToken, - InputMethodManager.RESULT_UNCHANGED_SHOWN + InputMethodManager.HIDE_NOT_ALWAYS ) feedGroupCreateBinding.groupNameInput.clearFocus() } diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/item/ChannelItem.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/item/ChannelItem.kt index 7946de69385..7687a7d6de8 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/item/ChannelItem.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/item/ChannelItem.kt @@ -9,7 +9,7 @@ import org.schabi.newpipe.R import org.schabi.newpipe.extractor.channel.ChannelInfoItem import org.schabi.newpipe.util.Localization import org.schabi.newpipe.util.OnClickGesture -import org.schabi.newpipe.util.image.PicassoHelper +import org.schabi.newpipe.util.image.CoilHelper class ChannelItem( private val infoItem: ChannelInfoItem, @@ -39,7 +39,7 @@ class ChannelItem( itemChannelDescriptionView.text = infoItem.description } - PicassoHelper.loadAvatar(infoItem.thumbnails).into(itemThumbnailView) + CoilHelper.loadAvatar(itemThumbnailView, infoItem.thumbnails) gesturesListener?.run { viewHolder.root.setOnClickListener { selected(infoItem) } diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/item/PickerSubscriptionItem.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/item/PickerSubscriptionItem.kt index 3a4c6e41b99..da35447e38d 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/item/PickerSubscriptionItem.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/item/PickerSubscriptionItem.kt @@ -10,7 +10,7 @@ import org.schabi.newpipe.database.subscription.SubscriptionEntity import org.schabi.newpipe.databinding.PickerSubscriptionItemBinding import org.schabi.newpipe.ktx.AnimationType import org.schabi.newpipe.ktx.animate -import org.schabi.newpipe.util.image.PicassoHelper +import org.schabi.newpipe.util.image.CoilHelper data class PickerSubscriptionItem( val subscriptionEntity: SubscriptionEntity, @@ -21,7 +21,7 @@ data class PickerSubscriptionItem( override fun getSpanSize(spanCount: Int, position: Int): Int = 1 override fun bind(viewBinding: PickerSubscriptionItemBinding, position: Int) { - PicassoHelper.loadAvatar(subscriptionEntity.avatarUrl).into(viewBinding.thumbnailView) + CoilHelper.loadAvatar(viewBinding.thumbnailView, subscriptionEntity.avatarUrl) viewBinding.titleView.text = subscriptionEntity.name viewBinding.selectedHighlight.isVisible = isSelected } diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/services/BaseImportExportService.java b/app/src/main/java/org/schabi/newpipe/local/subscription/services/BaseImportExportService.java index b7c11b1605d..850409e2558 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/services/BaseImportExportService.java +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/services/BaseImportExportService.java @@ -144,7 +144,9 @@ protected void updateNotification(final String text) { notificationBuilder.setContentText(text); } - notificationManager.notify(getNotificationId(), notificationBuilder.build()); + if (notificationManager.areNotificationsEnabled()) { + notificationManager.notify(getNotificationId(), notificationBuilder.build()); + } } protected void stopService() { @@ -174,7 +176,10 @@ protected void postErrorResult(final String title, final String text) { .setContentTitle(title) .setStyle(new NotificationCompat.BigTextStyle().bigText(textOrEmpty)) .setContentText(textOrEmpty); - notificationManager.notify(getNotificationId(), notificationBuilder.build()); + + if (notificationManager.areNotificationsEnabled()) { + notificationManager.notify(getNotificationId(), notificationBuilder.build()); + } } protected NotificationCompat.Builder createNotification() { diff --git a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java index 06b33f86189..b6bb84ec6c7 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java @@ -127,39 +127,39 @@ public boolean onPrepareOptionsMenu(final Menu m) { @Override public boolean onOptionsItemSelected(final MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - finish(); - return true; - case R.id.action_settings: - NavigationHelper.openSettings(this); - return true; - case R.id.action_append_playlist: - PlaylistDialog.showForPlayQueue(player, getSupportFragmentManager()); - return true; - case R.id.action_playback_speed: - openPlaybackParameterDialog(); - return true; - case R.id.action_mute: - player.toggleMute(); - return true; - case R.id.action_system_audio: - startActivity(new Intent(Settings.ACTION_SOUND_SETTINGS)); - return true; - case R.id.action_switch_main: - this.player.setRecovery(); - NavigationHelper.playOnMainPlayer(this, player.getPlayQueue(), true); - return true; - case R.id.action_switch_popup: - if (PermissionHelper.isPopupEnabledElseAsk(this)) { - this.player.setRecovery(); - NavigationHelper.playOnPopupPlayer(this, player.getPlayQueue(), true); - } - return true; - case R.id.action_switch_background: + final int itemId = item.getItemId(); + if (itemId == android.R.id.home) { + finish(); + return true; + } else if (itemId == R.id.action_settings) { + NavigationHelper.openSettings(this); + return true; + } else if (itemId == R.id.action_append_playlist) { + PlaylistDialog.showForPlayQueue(player, getSupportFragmentManager()); + return true; + } else if (itemId == R.id.action_playback_speed) { + openPlaybackParameterDialog(); + return true; + } else if (itemId == R.id.action_mute) { + player.toggleMute(); + return true; + } else if (itemId == R.id.action_system_audio) { + startActivity(new Intent(Settings.ACTION_SOUND_SETTINGS)); + return true; + } else if (itemId == R.id.action_switch_main) { + this.player.setRecovery(); + NavigationHelper.playOnMainPlayer(this, player.getPlayQueue(), true); + return true; + } else if (itemId == R.id.action_switch_popup) { + if (PermissionHelper.isPopupEnabledElseAsk(this)) { this.player.setRecovery(); - NavigationHelper.playOnBackgroundPlayer(this, player.getPlayQueue(), true); - return true; + NavigationHelper.playOnPopupPlayer(this, player.getPlayQueue(), true); + } + return true; + } else if (itemId == R.id.action_switch_background) { + this.player.setRecovery(); + NavigationHelper.playOnBackgroundPlayer(this, player.getPlayQueue(), true); + return true; } if (item.getGroupId() == MENU_ID_AUDIO_TRACK) { diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index b07b15a4585..159ecbd6efc 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -46,13 +46,14 @@ import static org.schabi.newpipe.util.ListHelper.getResolutionIndex; import static java.util.concurrent.TimeUnit.MILLISECONDS; +import static coil3.Image_androidKt.toBitmap; + import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.graphics.Bitmap; -import android.graphics.drawable.Drawable; import android.media.AudioManager; import android.support.v4.media.session.MediaSessionCompat; import android.util.Log; @@ -80,8 +81,6 @@ import com.google.android.exoplayer2.trackselection.MappingTrackSelector; import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; import com.google.android.exoplayer2.video.VideoSize; -import com.squareup.picasso.Picasso; -import com.squareup.picasso.Target; import org.schabi.newpipe.MainActivity; import org.schabi.newpipe.R; @@ -126,13 +125,14 @@ import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.SerializedCache; import org.schabi.newpipe.util.StreamTypeUtil; -import org.schabi.newpipe.util.image.PicassoHelper; +import org.schabi.newpipe.util.image.CoilHelper; import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.stream.IntStream; +import coil3.target.Target; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.core.Observable; import io.reactivex.rxjava3.core.Single; @@ -181,7 +181,6 @@ public final class Player implements PlaybackListener, Listener { //////////////////////////////////////////////////////////////////////////*/ public static final int RENDERER_UNAVAILABLE = -1; - private static final String PICASSO_PLAYER_THUMBNAIL_TAG = "PICASSO_PLAYER_THUMBNAIL_TAG"; /*////////////////////////////////////////////////////////////////////////// // Playback @@ -200,6 +199,8 @@ public final class Player implements PlaybackListener, Listener { private MediaItemTag currentMetadata; @Nullable private Bitmap currentThumbnail; + @Nullable + private coil3.request.Disposable thumbnailDisposable; /*////////////////////////////////////////////////////////////////////////// // Player @@ -255,12 +256,6 @@ public final class Player implements PlaybackListener, Listener { @NonNull private final CompositeDisposable streamItemDisposable = new CompositeDisposable(); - // This is the only listener we need for thumbnail loading, since there is always at most only - // one thumbnail being loaded at a time. This field is also here to maintain a strong reference, - // which would otherwise be garbage collected since Picasso holds weak references to targets. - @NonNull - private final Target currentThumbnailTarget; - /*////////////////////////////////////////////////////////////////////////// // Utils //////////////////////////////////////////////////////////////////////////*/ @@ -314,8 +309,6 @@ public Player(@NonNull final PlayerService service, videoResolver = new VideoPlaybackResolver(context, dataSource, getQualityResolver()); audioResolver = new AudioPlaybackResolver(context, dataSource); - currentThumbnailTarget = getCurrentThumbnailTarget(); - // The UIs added here should always be present. They will be initialized when the player // reaches the initialization step. Make sure the media session ui is before the // notification ui in the UIs list, since the notification depends on the media session in @@ -704,7 +697,6 @@ public void destroy() { databaseUpdateDisposable.clear(); progressUpdateDisposable.set(null); streamItemDisposable.clear(); - cancelLoadingCurrentThumbnail(); UIs.destroyAll(Object.class); // destroy every UI: obviously every UI extends Object } @@ -884,67 +876,58 @@ private void unregisterBroadcastReceiver() { //////////////////////////////////////////////////////////////////////////*/ //region Thumbnail loading - private Target getCurrentThumbnailTarget() { - // a Picasso target is just a listener for thumbnail loading events - return new Target() { - @Override - public void onBitmapLoaded(final Bitmap bitmap, final Picasso.LoadedFrom from) { - if (DEBUG) { - Log.d(TAG, "Thumbnail - onBitmapLoaded() called with: bitmap = [" + bitmap - + " -> " + bitmap.getWidth() + "x" + bitmap.getHeight() + "], from = [" - + from + "]"); - } - // there is a new thumbnail, so e.g. the end screen thumbnail needs to change, too. - onThumbnailLoaded(bitmap); - } - - @Override - public void onBitmapFailed(final Exception e, final Drawable errorDrawable) { - Log.e(TAG, "Thumbnail - onBitmapFailed() called", e); - // there is a new thumbnail, so e.g. the end screen thumbnail needs to change, too. - onThumbnailLoaded(null); - } - - @Override - public void onPrepareLoad(final Drawable placeHolderDrawable) { - if (DEBUG) { - Log.d(TAG, "Thumbnail - onPrepareLoad() called"); - } - } - }; - } - private void loadCurrentThumbnail(final List thumbnails) { if (DEBUG) { Log.d(TAG, "Thumbnail - loadCurrentThumbnail() called with thumbnails = [" + thumbnails.size() + "]"); } - // first cancel any previous loading - cancelLoadingCurrentThumbnail(); + // Cancel any ongoing image loading + if (thumbnailDisposable != null) { + thumbnailDisposable.dispose(); + } // Unset currentThumbnail, since it is now outdated. This ensures it is not used in media - // session metadata while the new thumbnail is being loaded by Picasso. + // session metadata while the new thumbnail is being loaded by Coil. onThumbnailLoaded(null); if (thumbnails.isEmpty()) { return; } // scale down the notification thumbnail for performance - PicassoHelper.loadScaledDownThumbnail(context, thumbnails) - .tag(PICASSO_PLAYER_THUMBNAIL_TAG) - .into(currentThumbnailTarget); - } + final var thumbnailTarget = new Target() { + @Override + public void onError(@Nullable final coil3.Image error) { + Log.e(TAG, "Thumbnail - onError() called"); + // there is a new thumbnail, so e.g. the end screen thumbnail needs to change, too. + onThumbnailLoaded(null); + } + + @Override + public void onStart(@Nullable final coil3.Image placeholder) { + if (DEBUG) { + Log.d(TAG, "Thumbnail - onStart() called"); + } + } - private void cancelLoadingCurrentThumbnail() { - // cancel the Picasso job associated with the player thumbnail, if any - PicassoHelper.cancelTag(PICASSO_PLAYER_THUMBNAIL_TAG); + @Override + public void onSuccess(@NonNull final coil3.Image result) { + if (DEBUG) { + Log.d(TAG, "Thumbnail - onSuccess() called with: drawable = [" + result + "]"); + } + // there is a new thumbnail, so e.g. the end screen thumbnail needs to change, too. + onThumbnailLoaded(toBitmap(result)); + } + }; + thumbnailDisposable = CoilHelper.INSTANCE + .loadScaledDownThumbnail(context, thumbnails, thumbnailTarget); } + private void onThumbnailLoaded(@Nullable final Bitmap bitmap) { // Avoid useless thumbnail updates, if the thumbnail has not actually changed. Based on the // thumbnail loading code, this if would be skipped only when both bitmaps are `null`, since - // onThumbnailLoaded won't be called twice with the same nonnull bitmap by Picasso's target. + // onThumbnailLoaded won't be called twice with the same nonnull bitmap by Coil's target. if (currentThumbnail != bitmap) { currentThumbnail = bitmap; UIs.call(playerUi -> playerUi.onThumbnailLoaded(bitmap)); diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/BasePlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/BasePlayerGestureListener.kt index 8682adc4369..52175a3bf59 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/BasePlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/BasePlayerGestureListener.kt @@ -47,6 +47,9 @@ abstract class BasePlayerGestureListener( startMultiDoubleTap(event) } else if (portion === DisplayPortion.MIDDLE) { player.playPause() + if (player.isPlaying) { + playerUi.hideControls(0, 0) + } } } diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java index 0f9579352a5..25844f79935 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java @@ -49,12 +49,12 @@ import java.text.NumberFormat; import java.util.ArrayList; import java.util.Collections; -import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Objects; import java.util.Set; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; public final class PlayerHelper { private static final FormattersProvider FORMATTERS_PROVIDER = new FormattersProvider(); @@ -87,11 +87,11 @@ public static void resetFormat() { } @NonNull - public static String getTimeString(final int milliSeconds) { - final int seconds = (milliSeconds % 60000) / 1000; - final int minutes = (milliSeconds % 3600000) / 60000; - final int hours = (milliSeconds % 86400000) / 3600000; - final int days = (milliSeconds % (86400000 * 7)) / 86400000; + public static String getTimeString(final long milliSeconds) { + final long seconds = (milliSeconds % 60000) / 1000; + final long minutes = (milliSeconds % 3600000) / 60000; + final long hours = (milliSeconds % 86400000) / 3600000; + final long days = (milliSeconds % (86400000 * 7)) / 86400000; final Formatters formatters = FORMATTERS_PROVIDER.formatters(); if (days > 0) { @@ -174,10 +174,9 @@ public static String resizeTypeOf(@NonNull final Context context, @Nullable public static PlayQueue autoQueueOf(@NonNull final StreamInfo info, @NonNull final List existingItems) { - final Set urls = new HashSet<>(existingItems.size()); - for (final PlayQueueItem item : existingItems) { - urls.add(item.getUrl()); - } + final Set urls = existingItems.stream() + .map(PlayQueueItem::getUrl) + .collect(Collectors.toUnmodifiableSet()); final List relatedItems = info.getRelatedItems(); if (Utils.isNullOrEmpty(relatedItems)) { diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHolder.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHolder.java index 9edfc804a75..daae6d54e01 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHolder.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHolder.java @@ -117,7 +117,7 @@ public void setListener(@Nullable final PlayerServiceExtendedEventListener newLi // helper to handle context in common place as using the same // context to bind/unbind a service is crucial private Context getCommonContext() { - return App.getApp(); + return App.getInstance(); } public void startService(final boolean playAfterConnect, diff --git a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserCommon.kt b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserCommon.kt index 12d69a163a0..fb879bd7ca2 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserCommon.kt +++ b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserCommon.kt @@ -22,7 +22,7 @@ internal fun infoItemTypeToString(type: InfoType): String { InfoType.STREAM -> ID_STREAM InfoType.PLAYLIST -> ID_PLAYLIST InfoType.CHANNEL -> ID_CHANNEL - else -> throw IllegalStateException("Unexpected value: $type") + else -> error("Unexpected value: $type") } } @@ -31,7 +31,7 @@ internal fun infoItemTypeFromString(type: String): InfoType { ID_STREAM -> InfoType.STREAM ID_PLAYLIST -> InfoType.PLAYLIST ID_CHANNEL -> InfoType.CHANNEL - else -> throw IllegalStateException("Unexpected value: $type") + else -> error("Unexpected value: $type") } } diff --git a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserPlaybackPreparer.kt b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserPlaybackPreparer.kt index 890c83cfa8e..c0a2f966818 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserPlaybackPreparer.kt +++ b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserPlaybackPreparer.kt @@ -49,7 +49,7 @@ import org.schabi.newpipe.util.NavigationHelper */ class MediaBrowserPlaybackPreparer( private val context: Context, - private val setMediaSessionError: BiConsumer, // error string, error code + private val setMediaSessionError: BiConsumer, // error string, error code private val clearMediaSessionError: Runnable, private val onPrepare: Consumer ) : PlaybackPreparer { @@ -118,7 +118,7 @@ class MediaBrowserPlaybackPreparer( private fun onPrepareError(throwable: Throwable) { setMediaSessionError.accept( - ErrorInfo.getMessage(throwable, null, null).getString(context), + ErrorInfo.getMessage(throwable, null, null).getText(context), PlaybackStateCompat.ERROR_CODE_APP_ERROR ) } diff --git a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/PackageValidator.kt b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/PackageValidator.kt index 05c94e990b5..619fa600a93 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/PackageValidator.kt +++ b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/PackageValidator.kt @@ -82,11 +82,11 @@ internal class PackageValidator(context: Context) { // Build the caller info for the rest of the checks here. val callerPackageInfo = buildCallerInfo(callingPackage) - ?: throw IllegalStateException("Caller wasn't found in the system?") + ?: error("Caller wasn't found in the system?") // Verify that things aren't ... broken. (This test should always pass.) - if (callerPackageInfo.uid != callingUid) { - throw IllegalStateException("Caller's package UID doesn't match caller's actual UID?") + check(callerPackageInfo.uid == callingUid) { + "Caller's package UID doesn't match caller's actual UID?" } val callerSignature = callerPackageInfo.signature @@ -202,7 +202,7 @@ internal class PackageValidator(context: Context) { */ private fun getSystemSignature(): String = getPackageInfo(ANDROID_PLATFORM)?.let { platformInfo -> getSignature(platformInfo) - } ?: throw IllegalStateException("Platform signature not found") + } ?: error("Platform signature not found") /** * Creates a SHA-256 signature given a certificate byte array. diff --git a/app/src/main/java/org/schabi/newpipe/player/notification/NotificationUtil.java b/app/src/main/java/org/schabi/newpipe/player/notification/NotificationUtil.java index 9b9c47b0e85..be98abb7a2e 100644 --- a/app/src/main/java/org/schabi/newpipe/player/notification/NotificationUtil.java +++ b/app/src/main/java/org/schabi/newpipe/player/notification/NotificationUtil.java @@ -72,7 +72,9 @@ public synchronized void createNotificationIfNeededAndUpdate(final boolean force notificationBuilder = createNotification(); } updateNotification(); - notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build()); + if (notificationManager.areNotificationsEnabled()) { + notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build()); + } } public synchronized void updateThumbnail() { @@ -84,7 +86,9 @@ public synchronized void updateThumbnail() { } setLargeIcon(notificationBuilder); - notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build()); + if (notificationManager.areNotificationsEnabled()) { + notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build()); + } } } diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItemBuilder.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItemBuilder.java index 066f92c2607..8994aef79df 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItemBuilder.java +++ b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItemBuilder.java @@ -6,8 +6,8 @@ import android.view.View; import org.schabi.newpipe.util.Localization; -import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.ServiceHelper; +import org.schabi.newpipe.util.image.CoilHelper; public class PlayQueueItemBuilder { private static final String TAG = PlayQueueItemBuilder.class.toString(); @@ -33,7 +33,7 @@ public void buildStreamInfoItem(final PlayQueueItemHolder holder, final PlayQueu holder.itemDurationView.setVisibility(View.GONE); } - PicassoHelper.loadThumbnail(item.getThumbnails()).into(holder.itemThumbnailView); + CoilHelper.INSTANCE.loadThumbnail(holder.itemThumbnailView, item.getThumbnails()); holder.itemRoot.setOnClickListener(view -> { if (onItemClickListener != null) { diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/SinglePlayQueue.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/SinglePlayQueue.java index f13d7924d0f..a072369d658 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/SinglePlayQueue.java +++ b/app/src/main/java/org/schabi/newpipe/player/playqueue/SinglePlayQueue.java @@ -5,8 +5,8 @@ import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.StreamInfoItem; -import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; public final class SinglePlayQueue extends PlayQueue { public SinglePlayQueue(final StreamInfoItem item) { @@ -29,11 +29,7 @@ public SinglePlayQueue(@NonNull final List items, final int inde } private static List playQueueItemsOf(@NonNull final List items) { - final List playQueueItems = new ArrayList<>(items.size()); - for (final StreamInfoItem item : items) { - playQueueItems.add(new PlayQueueItem(item)); - } - return playQueueItems; + return items.stream().map(PlayQueueItem::new).collect(Collectors.toList()); } @Override diff --git a/app/src/main/java/org/schabi/newpipe/player/seekbarpreview/SeekbarPreviewThumbnailHolder.java b/app/src/main/java/org/schabi/newpipe/player/seekbarpreview/SeekbarPreviewThumbnailHolder.java index 09c61b8b35a..d9e25fe8b92 100644 --- a/app/src/main/java/org/schabi/newpipe/player/seekbarpreview/SeekbarPreviewThumbnailHolder.java +++ b/app/src/main/java/org/schabi/newpipe/player/seekbarpreview/SeekbarPreviewThumbnailHolder.java @@ -13,8 +13,9 @@ import com.google.common.base.Stopwatch; +import org.schabi.newpipe.App; import org.schabi.newpipe.extractor.stream.Frameset; -import org.schabi.newpipe.util.image.PicassoHelper; +import org.schabi.newpipe.util.image.CoilHelper; import java.util.Comparator; import java.util.List; @@ -207,8 +208,8 @@ private Bitmap getBitMapFrom(final String url) { Log.d(TAG, "Downloading bitmap for seekbarPreview from '" + url + "'"); // Gets the bitmap within the timeout of 15 seconds imposed by default by OkHttpClient - // Ensure that your are not running on the main-Thread this will otherwise hang - final Bitmap bitmap = PicassoHelper.loadSeekbarThumbnailPreview(url).get(); + // Ensure that you are not running on the main thread, otherwise this will hang + final var bitmap = CoilHelper.INSTANCE.loadBitmapBlocking(App.getInstance(), url); if (sw != null) { Log.d(TAG, "Download of bitmap for seekbarPreview from '" + url + "' took " diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java index 86888178285..4d85dc95057 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java @@ -77,6 +77,7 @@ import java.util.List; import java.util.Objects; import java.util.Optional; +import java.util.stream.Collectors; public final class MainPlayerUi extends VideoPlayerUi implements View.OnLayoutChangeListener { private static final String TAG = MainPlayerUi.class.getSimpleName(); @@ -749,13 +750,13 @@ public void onItemLongClick(@NonNull final StreamSegmentItem item, final int sec } private int getNearestStreamSegmentPosition(final long playbackPosition) { - int nearestPosition = 0; final List segments = player.getCurrentStreamInfo() .map(StreamInfo::getStreamSegments) .orElse(Collections.emptyList()); - for (int i = 0; i < segments.size(); i++) { - if (segments.get(i).getStartTimeSeconds() * 1000L > playbackPosition) { + int nearestPosition = 0; + for (final var segment : segments) { + if (segment.getStartTimeSeconds() * 1000L > playbackPosition) { break; } nearestPosition++; @@ -816,22 +817,13 @@ private void updateQueueTime(final int currentTime) { } final int currentStream = playQueue.getIndex(); - int before = 0; - int after = 0; - final List streams = playQueue.getStreams(); - final int nStreams = streams.size(); - for (int i = 0; i < nStreams; i++) { - if (i < currentStream) { - before += streams.get(i).getDuration(); - } else { - after += streams.get(i).getDuration(); - } - } + final long before = streams.subList(0, currentStream).stream() + .collect(Collectors.summingLong(PlayQueueItem::getDuration)) * 1000; - before *= 1000; - after *= 1000; + final long after = streams.subList(currentStream, streams.size()).stream() + .collect(Collectors.summingLong(PlayQueueItem::getDuration)) * 1000; binding.itemsListHeaderDuration.setText( String.format("%s/%s", diff --git a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java index b855f7c38aa..85ee9785313 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java @@ -19,12 +19,12 @@ import org.schabi.newpipe.player.helper.PlayerHelper; import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.image.ImageStrategy; -import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.image.PreferredImageQuality; -import java.io.IOException; import java.util.Locale; +import coil3.SingletonImageLoader; + public class ContentSettingsFragment extends BasePreferenceFragment { private String youtubeRestrictedModeEnabledKey; @@ -74,14 +74,12 @@ private void setupImageQualityPref() { (preference, newValue) -> { ImageStrategy.setPreferredImageQuality(PreferredImageQuality .fromPreferenceKey(requireContext(), (String) newValue)); - try { - PicassoHelper.clearCache(preference.getContext()); - Toast.makeText(preference.getContext(), - R.string.thumbnail_cache_wipe_complete_notice, Toast.LENGTH_SHORT) + final var loader = SingletonImageLoader.get(preference.getContext()); + loader.getMemoryCache().clear(); + loader.getDiskCache().clear(); + Toast.makeText(preference.getContext(), + R.string.thumbnail_cache_wipe_complete_notice, Toast.LENGTH_SHORT) .show(); - } catch (final IOException e) { - Log.e(TAG, "Unable to clear Picasso cache", e); - } return true; }); } diff --git a/app/src/main/java/org/schabi/newpipe/settings/DebugSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/DebugSettingsFragment.java index 82f2f5bb632..229de7005c3 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/DebugSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/DebugSettingsFragment.java @@ -10,7 +10,6 @@ import org.schabi.newpipe.error.ErrorUtil; import org.schabi.newpipe.error.UserAction; import org.schabi.newpipe.local.feed.notifications.NotificationWorker; -import org.schabi.newpipe.util.image.PicassoHelper; import java.util.Optional; @@ -25,8 +24,6 @@ public void onCreatePreferences(final Bundle savedInstanceState, final String ro requirePreference(R.string.allow_heap_dumping_key); final Preference showMemoryLeaksPreference = requirePreference(R.string.show_memory_leaks_key); - final Preference showImageIndicatorsPreference = - requirePreference(R.string.show_image_indicators_key); final Preference checkNewStreamsPreference = requirePreference(R.string.check_new_streams_key); final Preference crashTheAppPreference = @@ -54,11 +51,6 @@ public void onCreatePreferences(final Bundle savedInstanceState, final String ro showMemoryLeaksPreference.setSummary(R.string.leak_canary_not_available); } - showImageIndicatorsPreference.setOnPreferenceChangeListener((preference, newValue) -> { - PicassoHelper.setIndicatorsEnabled((Boolean) newValue); - return true; - }); - checkNewStreamsPreference.setOnPreferenceClickListener(preference -> { NotificationWorker.runNow(preference.getContext()); return true; diff --git a/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java b/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java index 7cb1564b386..3cc29afee2f 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java +++ b/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java @@ -157,7 +157,7 @@ private static void disableMediaTunnelingIfNecessary(@NonNull final Context cont prefs.getInt(disabledTunnelingAutomaticallyKey, -1) == 0 && !prefs.getBoolean(disabledTunnelingKey, false); - if (App.getApp().isFirstRun() + if (App.getInstance().isFirstRun() || (wasDeviceBlacklistUpdated && !wasMediaTunnelingEnabledByUser)) { setMediaTunneling(context); } diff --git a/app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java b/app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java index 18e0816bbde..25d6b3a0f6e 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java @@ -19,8 +19,8 @@ import org.schabi.newpipe.database.subscription.SubscriptionEntity; import org.schabi.newpipe.error.ErrorUtil; import org.schabi.newpipe.local.subscription.SubscriptionManager; -import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.ThemeHelper; +import org.schabi.newpipe.util.image.CoilHelper; import java.util.List; import java.util.Vector; @@ -190,7 +190,7 @@ public void onBindViewHolder(final SelectChannelItemHolder holder, final int pos final SubscriptionEntity entry = subscriptions.get(position); holder.titleView.setText(entry.getName()); holder.view.setOnClickListener(view -> clickedItem(position)); - PicassoHelper.loadAvatar(entry.getAvatarUrl()).into(holder.thumbnailView); + CoilHelper.INSTANCE.loadAvatar(holder.thumbnailView, entry.getAvatarUrl()); } @Override diff --git a/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java index 880cbb282ea..ea475cb4f5e 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java @@ -27,7 +27,7 @@ import org.schabi.newpipe.error.UserAction; import org.schabi.newpipe.local.playlist.LocalPlaylistManager; import org.schabi.newpipe.local.playlist.RemotePlaylistManager; -import org.schabi.newpipe.util.image.PicassoHelper; +import org.schabi.newpipe.util.image.CoilHelper; import java.util.List; import java.util.Vector; @@ -154,21 +154,17 @@ public void onBindViewHolder(@NonNull final SelectPlaylistItemHolder holder, final int position) { final PlaylistLocalItem selectedItem = playlists.get(position); - if (selectedItem instanceof PlaylistMetadataEntry) { - final PlaylistMetadataEntry entry = ((PlaylistMetadataEntry) selectedItem); - + if (selectedItem instanceof PlaylistMetadataEntry entry) { holder.titleView.setText(entry.getOrderingName()); holder.view.setOnClickListener(view -> clickedItem(position)); - PicassoHelper.loadPlaylistThumbnail(entry.getThumbnailUrl()) - .into(holder.thumbnailView); - - } else if (selectedItem instanceof PlaylistRemoteEntity) { - final PlaylistRemoteEntity entry = ((PlaylistRemoteEntity) selectedItem); + CoilHelper.INSTANCE.loadPlaylistThumbnail(holder.thumbnailView, + entry.getThumbnailUrl()); + } else if (selectedItem instanceof PlaylistRemoteEntity entry) { holder.titleView.setText(entry.getOrderingName()); holder.view.setOnClickListener(view -> clickedItem(position)); - PicassoHelper.loadPlaylistThumbnail(entry.getThumbnailUrl()) - .into(holder.thumbnailView); + CoilHelper.INSTANCE.loadPlaylistThumbnail(holder.thumbnailView, + entry.getThumbnailUrl()); } } diff --git a/app/src/main/java/org/schabi/newpipe/settings/export/PreferencesObjectInputStream.java b/app/src/main/java/org/schabi/newpipe/settings/export/PreferencesObjectInputStream.java deleted file mode 100644 index 0d11b0b61c8..00000000000 --- a/app/src/main/java/org/schabi/newpipe/settings/export/PreferencesObjectInputStream.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.schabi.newpipe.settings.export; - -import java.io.IOException; -import java.io.InputStream; -import java.io.ObjectInputStream; -import java.io.ObjectStreamClass; -import java.util.Set; - -/** - * An {@link ObjectInputStream} that only allows preferences-related types to be deserialized, to - * prevent injections. The only allowed types are: all primitive types, all boxed primitive types, - * null, strings. HashMap, HashSet and arrays of previously defined types are also allowed. Sources: - * - * cmu.edu - * , - * - * OWASP cheatsheet - * , - * - * Apache's {@code ValidatingObjectInputStream} - * - */ -public class PreferencesObjectInputStream extends ObjectInputStream { - - /** - * Primitive types, strings and other built-in types do not pass through resolveClass() but - * instead have a custom encoding; see - * - * official docs. - */ - private static final Set CLASS_WHITELIST = Set.of( - "java.lang.Boolean", - "java.lang.Byte", - "java.lang.Character", - "java.lang.Short", - "java.lang.Integer", - "java.lang.Long", - "java.lang.Float", - "java.lang.Double", - "java.lang.Void", - "java.util.HashMap", - "java.util.HashSet" - ); - - public PreferencesObjectInputStream(final InputStream in) throws IOException { - super(in); - } - - @Override - protected Class resolveClass(final ObjectStreamClass desc) - throws ClassNotFoundException, IOException { - if (CLASS_WHITELIST.contains(desc.getName())) { - return super.resolveClass(desc); - } else { - throw new ClassNotFoundException("Class not allowed: " + desc.getName()); - } - } -} diff --git a/app/src/main/java/org/schabi/newpipe/settings/export/PreferencesObjectInputStream.kt b/app/src/main/java/org/schabi/newpipe/settings/export/PreferencesObjectInputStream.kt new file mode 100644 index 00000000000..5f564a7a4d3 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/export/PreferencesObjectInputStream.kt @@ -0,0 +1,52 @@ +/* + * SPDX-FileCopyrightText: 2024-2026 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.settings.export + +import java.io.IOException +import java.io.InputStream +import java.io.ObjectInputStream +import java.io.ObjectStreamClass + +/** + * An [ObjectInputStream] that only allows preferences-related types to be deserialized, to + * prevent injections. The only allowed types are: all primitive types, all boxed primitive types, + * null, strings. HashMap, HashSet and arrays of previously defined types are also allowed. Sources: + * [cmu.edu](https://wiki.sei.cmu.edu/confluence/display/java/SER00-J.+Enable+serialization+compatibility+during+class+evolution) * , + * [OWASP cheatsheet](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html#harden-your-own-javaioobjectinputstream) * , + * [Apache's `ValidatingObjectInputStream`](https://commons.apache.org/proper/commons-io/apidocs/src-html/org/apache/commons/io/serialization/ValidatingObjectInputStream.html#line-118) * + */ +class PreferencesObjectInputStream(stream: InputStream) : ObjectInputStream(stream) { + @Throws(ClassNotFoundException::class, IOException::class) + override fun resolveClass(desc: ObjectStreamClass): Class<*> { + if (desc.name in CLASS_WHITELIST) { + return super.resolveClass(desc) + } else { + throw ClassNotFoundException("Class not allowed: $desc.name") + } + } + + companion object { + /** + * Primitive types, strings and other built-in types do not pass through resolveClass() but + * instead have a custom encoding; see + * [ + * official docs](https://docs.oracle.com/javase/6/docs/platform/serialization/spec/protocol.html#10152). + */ + private val CLASS_WHITELIST = setOf( + "java.lang.Boolean", + "java.lang.Byte", + "java.lang.Character", + "java.lang.Short", + "java.lang.Integer", + "java.lang.Long", + "java.lang.Float", + "java.lang.Double", + "java.lang.Void", + "java.util.HashMap", + "java.util.HashSet" + ) + } +} diff --git a/app/src/main/java/org/schabi/newpipe/settings/migration/SettingMigrations.java b/app/src/main/java/org/schabi/newpipe/settings/migration/SettingMigrations.java index 67944075dc2..92520ec7ece 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/migration/SettingMigrations.java +++ b/app/src/main/java/org/schabi/newpipe/settings/migration/SettingMigrations.java @@ -251,7 +251,7 @@ static void runMigrationsIfNeeded(@NonNull final Context context) { final int lastPrefVersion = sp.getInt(lastPrefVersionKey, 0); // no migration to run, already up to date - if (App.getApp().isFirstRun()) { + if (App.getInstance().isFirstRun()) { sp.edit().putInt(lastPrefVersionKey, VERSION).apply(); return; } else if (lastPrefVersion == VERSION) { diff --git a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchItem.kt b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchItem.kt index 750e40eae03..82bbe7b232a 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchItem.kt +++ b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchItem.kt @@ -26,14 +26,13 @@ data class PreferenceSearchItem( val breadcrumbs: String, @XmlRes val searchIndexItemResId: Int ) { + val allRelevantSearchFields: List + get() = listOf(title, summary, entries, breadcrumbs) + fun hasData(): Boolean { return !key.isEmpty() && !title.isEmpty() } - fun getAllRelevantSearchFields(): MutableList { - return mutableListOf(title, summary, entries, breadcrumbs) - } - override fun toString(): String { return "PreferenceItem: $title $summary $key" } diff --git a/app/src/main/java/org/schabi/newpipe/settings/tabs/TabsJsonHelper.java b/app/src/main/java/org/schabi/newpipe/settings/tabs/TabsJsonHelper.java index 30676477c65..c42348be052 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/tabs/TabsJsonHelper.java +++ b/app/src/main/java/org/schabi/newpipe/settings/tabs/TabsJsonHelper.java @@ -9,8 +9,9 @@ import com.grack.nanojson.JsonStringWriter; import com.grack.nanojson.JsonWriter; -import java.util.ArrayList; import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; /** * Class to get a JSON representation of a list of tabs, and the other way around. @@ -44,39 +45,25 @@ public static List getTabsFromJson(@Nullable final String tabsJson) return getDefaultTabs(); } - final List returnTabs = new ArrayList<>(); - - final JsonObject outerJsonObject; try { - outerJsonObject = JsonParser.object().from(tabsJson); + final JsonObject outerJsonObject = JsonParser.object().from(tabsJson); if (!outerJsonObject.has(JSON_TABS_ARRAY_KEY)) { throw new InvalidJsonException("JSON doesn't contain \"" + JSON_TABS_ARRAY_KEY + "\" array"); } - final JsonArray tabsArray = outerJsonObject.getArray(JSON_TABS_ARRAY_KEY); - - for (final Object o : tabsArray) { - if (!(o instanceof JsonObject)) { - continue; - } + final JsonArray tabsArray = outerJsonObject.getArray(JSON_TABS_ARRAY_KEY, null); - final Tab tab = Tab.from((JsonObject) o); + final var returnTabs = tabsArray.streamAsJsonObjects() + .map(Tab::from) + .filter(Objects::nonNull) + .collect(Collectors.toUnmodifiableList()); - if (tab != null) { - returnTabs.add(tab); - } - } + return returnTabs.isEmpty() ? getDefaultTabs() : returnTabs; } catch (final JsonParserException e) { throw new InvalidJsonException(e); } - - if (returnTabs.isEmpty()) { - return getDefaultTabs(); - } - - return returnTabs; } /** diff --git a/app/src/main/java/org/schabi/newpipe/util/DependentPreferenceHelper.java b/app/src/main/java/org/schabi/newpipe/util/DependentPreferenceHelper.java deleted file mode 100644 index 9591beddb3c..00000000000 --- a/app/src/main/java/org/schabi/newpipe/util/DependentPreferenceHelper.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.schabi.newpipe.util; - -import android.content.Context; -import android.content.SharedPreferences; - -import androidx.preference.PreferenceManager; - -import org.schabi.newpipe.R; - -/** - * For preferences with dependencies and multiple use case, - * this class can be used to reduce the lines of code. - */ -public final class DependentPreferenceHelper { - - private DependentPreferenceHelper() { - // no instance - } - - /** - * Option `Resume playback` depends on `Watch history`, this method can be used to retrieve if - * `Resume playback` and its dependencies are all enabled. - * - * @param context the Android context - * @return returns true if `Resume playback` and `Watch history` are both enabled - */ - public static boolean getResumePlaybackEnabled(final Context context) { - final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - - return prefs.getBoolean(context.getString( - R.string.enable_watch_history_key), true) - && prefs.getBoolean(context.getString( - R.string.enable_playback_resume_key), true); - } - - /** - * Option `Position in lists` depends on `Watch history`, this method can be used to retrieve if - * `Position in lists` and its dependencies are all enabled. - * - * @param context the Android context - * @return returns true if `Positions in lists` and `Watch history` are both enabled - */ - public static boolean getPositionsInListsEnabled(final Context context) { - final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - - return prefs.getBoolean(context.getString( - R.string.enable_watch_history_key), true) - && prefs.getBoolean(context.getString( - R.string.enable_playback_state_lists_key), true); - } -} diff --git a/app/src/main/java/org/schabi/newpipe/util/DependentPreferenceHelper.kt b/app/src/main/java/org/schabi/newpipe/util/DependentPreferenceHelper.kt new file mode 100644 index 00000000000..8e73a94f20b --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/DependentPreferenceHelper.kt @@ -0,0 +1,46 @@ +/* + * SPDX-FileCopyrightText: 2023-2026 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.util + +import android.content.Context +import androidx.preference.PreferenceManager +import org.schabi.newpipe.R + +/** + * For preferences with dependencies and multiple use case, + * this class can be used to reduce the lines of code. + */ +object DependentPreferenceHelper { + /** + * Option `Resume playback` depends on `Watch history`, this method can be used to retrieve if + * `Resume playback` and its dependencies are all enabled. + * + * @param context the Android context + * @return returns true if `Resume playback` and `Watch history` are both enabled + */ + @JvmStatic + fun getResumePlaybackEnabled(context: Context): Boolean { + val prefs = PreferenceManager.getDefaultSharedPreferences(context) + + return prefs.getBoolean(context.getString(R.string.enable_watch_history_key), true) && + prefs.getBoolean(context.getString(R.string.enable_playback_resume_key), true) + } + + /** + * Option `Position in lists` depends on `Watch history`, this method can be used to retrieve if + * `Position in lists` and its dependencies are all enabled. + * + * @param context the Android context + * @return returns true if `Positions in lists` and `Watch history` are both enabled + */ + @JvmStatic + fun getPositionsInListsEnabled(context: Context): Boolean { + val prefs = PreferenceManager.getDefaultSharedPreferences(context) + + return prefs.getBoolean(context.getString(R.string.enable_watch_history_key), true) && + prefs.getBoolean(context.getString(R.string.enable_playback_state_lists_key), true) + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java b/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java index 9eb9fab37b1..83152a36d84 100644 --- a/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java +++ b/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java @@ -131,7 +131,7 @@ public static boolean isFireTv() { } isFireTV = - App.getApp().getPackageManager().hasSystemFeature(AMAZON_FEATURE_FIRE_TV); + App.getInstance().getPackageManager().hasSystemFeature(AMAZON_FEATURE_FIRE_TV); return isFireTV; } @@ -140,7 +140,7 @@ public static boolean isTv(final Context context) { return isTV; } - final PackageManager pm = App.getApp().getPackageManager(); + final PackageManager pm = App.getInstance().getPackageManager(); // from doc: https://developer.android.com/training/tv/start/hardware.html#runtime-check boolean isTv = ContextCompat.getSystemService(context, UiModeManager.class) diff --git a/app/src/main/java/org/schabi/newpipe/util/KeyboardUtil.java b/app/src/main/java/org/schabi/newpipe/util/KeyboardUtil.java index a709dc32ecf..679f3e042f8 100644 --- a/app/src/main/java/org/schabi/newpipe/util/KeyboardUtil.java +++ b/app/src/main/java/org/schabi/newpipe/util/KeyboardUtil.java @@ -48,7 +48,7 @@ public static void hideKeyboard(final Activity activity, final EditText editText final InputMethodManager imm = ContextCompat.getSystemService(activity, InputMethodManager.class); imm.hideSoftInputFromWindow(editText.getWindowToken(), - InputMethodManager.RESULT_UNCHANGED_SHOWN); + InputMethodManager.HIDE_NOT_ALWAYS); editText.clearFocus(); } diff --git a/app/src/main/java/org/schabi/newpipe/util/Localization.java b/app/src/main/java/org/schabi/newpipe/util/Localization.java index 49e27d1082e..23dd6b2c761 100644 --- a/app/src/main/java/org/schabi/newpipe/util/Localization.java +++ b/app/src/main/java/org/schabi/newpipe/util/Localization.java @@ -426,12 +426,24 @@ private static double round(final double value, final int scale) { return new BigDecimal(value).setScale(scale, RoundingMode.HALF_UP).doubleValue(); } + /** + * A wrapper around {@code context.getResources().getQuantityString()} with some safeguard. + * + * @param context the Android context + * @param pluralId the ID of the plural resource + * @param zeroCaseStringId the resource ID of the string to use in case {@code count=0}, + * or 0 if the plural resource should be used in the zero case too + * @param count the number that should be used to pick the correct plural form + * @param formattedCount the formatting parameter to substitute inside the plural resource, + * ideally just {@code count} converted to string + * @return the formatted string with the correct pluralization + */ private static String getQuantity(@NonNull final Context context, @PluralsRes final int pluralId, @StringRes final int zeroCaseStringId, final long count, final String formattedCount) { - if (count == 0) { + if (count == 0 && zeroCaseStringId != 0) { return context.getString(zeroCaseStringId); } diff --git a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java index f702c5bd52e..bfdf6a02cdf 100644 --- a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java @@ -501,6 +501,7 @@ public static void openCommentAuthorIfPresent(@NonNull final FragmentActivity ac public static void openCommentRepliesFragment(@NonNull final FragmentActivity activity, @NonNull final CommentsInfoItem comment) { + closeCommentRepliesFragments(activity); defaultTransaction(activity.getSupportFragmentManager()) .replace(R.id.fragment_holder, new CommentRepliesFragment(comment), CommentRepliesFragment.TAG) @@ -508,6 +509,41 @@ public static void openCommentRepliesFragment(@NonNull final FragmentActivity ac .commit(); } + /** + * Closes all open {@link CommentRepliesFragment}s in {@code activity}, + * including those that are not at the top of the back stack. + * This is needed to prevent multiple open CommentRepliesFragments + * Ideally there should only be one since we remove existing before opening a new one. + * @param activity the activity in which to close the CommentRepliesFragments + */ + public static void closeCommentRepliesFragments(@NonNull final FragmentActivity activity) { + final FragmentManager fm = activity.getSupportFragmentManager(); + + // Remove all existing fragment instances tagged as CommentRepliesFragment + final FragmentTransaction tx = defaultTransaction(fm); + boolean removed = false; + for (final Fragment fragment : fm.getFragments()) { + if (fragment != null && CommentRepliesFragment.TAG.equals(fragment.getTag())) { + tx.remove(fragment); + removed = true; + } + } + if (removed) { + tx.commit(); + } + + // Only pop back stack entries named CommentRepliesFragment.TAG if they are at the top. + while (fm.getBackStackEntryCount() > 0 + && CommentRepliesFragment.TAG.equals( + fm.getBackStackEntryAt(fm.getBackStackEntryCount() - 1).getName() + ) + ) { + fm.popBackStackImmediate(CommentRepliesFragment.TAG, + FragmentManager.POP_BACK_STACK_INCLUSIVE); + } + + } + public static void openPlaylistFragment(final FragmentManager fragmentManager, final int serviceId, final String url, @NonNull final String name) { diff --git a/app/src/main/java/org/schabi/newpipe/util/NewPipeTextViewHelper.java b/app/src/main/java/org/schabi/newpipe/util/NewPipeTextViewHelper.java deleted file mode 100644 index cf1a9a03ad9..00000000000 --- a/app/src/main/java/org/schabi/newpipe/util/NewPipeTextViewHelper.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.schabi.newpipe.util; - -import android.content.Context; -import android.text.Selection; -import android.text.Spannable; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import org.schabi.newpipe.util.external_communication.ShareUtils; -import org.schabi.newpipe.views.NewPipeEditText; -import org.schabi.newpipe.views.NewPipeTextView; - -public final class NewPipeTextViewHelper { - private NewPipeTextViewHelper() { - } - - /** - * Share the selected text of {@link NewPipeTextView NewPipeTextViews} and - * {@link NewPipeEditText NewPipeEditTexts} with - * {@link ShareUtils#shareText(Context, String, String)}. - * - *

- * This allows EMUI users to get the Android share sheet instead of the EMUI share sheet when - * using the {@code Share} command of the popup menu which appears when selecting text. - *

- * - * @param textView the {@link TextView} on which sharing the selected text. It should be a - * {@link NewPipeTextView} or a {@link NewPipeEditText} (even if - * {@link TextView standard TextViews} are supported). - */ - public static void shareSelectedTextWithShareUtils(@NonNull final TextView textView) { - final CharSequence textViewText = textView.getText(); - shareSelectedTextIfNotNullAndNotEmpty(textView, getSelectedText(textView, textViewText)); - if (textViewText instanceof Spannable) { - Selection.setSelection((Spannable) textViewText, textView.getSelectionEnd()); - } - } - - @Nullable - private static CharSequence getSelectedText(@NonNull final TextView textView, - @Nullable final CharSequence text) { - if (!textView.hasSelection() || text == null) { - return null; - } - - final int start = textView.getSelectionStart(); - final int end = textView.getSelectionEnd(); - return String.valueOf(start > end ? text.subSequence(end, start) - : text.subSequence(start, end)); - } - - private static void shareSelectedTextIfNotNullAndNotEmpty( - @NonNull final TextView textView, - @Nullable final CharSequence selectedText) { - if (selectedText != null && selectedText.length() != 0) { - ShareUtils.shareText(textView.getContext(), "", selectedText.toString()); - } - } -} diff --git a/app/src/main/java/org/schabi/newpipe/util/NewPipeTextViewHelper.kt b/app/src/main/java/org/schabi/newpipe/util/NewPipeTextViewHelper.kt new file mode 100644 index 00000000000..159791813b5 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/NewPipeTextViewHelper.kt @@ -0,0 +1,60 @@ +/* + * SPDX-FileCopyrightText: 2021-2026 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.util + +import android.text.Selection +import android.text.Spannable +import android.widget.TextView +import org.schabi.newpipe.util.external_communication.ShareUtils + +object NewPipeTextViewHelper { + /** + * Share the selected text of [NewPipeTextViews][org.schabi.newpipe.views.NewPipeTextView] and + * [NewPipeEditTexts][org.schabi.newpipe.views.NewPipeEditText] with + * [ShareUtils.shareText]. + * + * + * + * This allows EMUI users to get the Android share sheet instead of the EMUI share sheet when + * using the `Share` command of the popup menu which appears when selecting text. + * + * + * @param textView the [TextView] on which sharing the selected text. It should be a + * [org.schabi.newpipe.views.NewPipeTextView] or a [org.schabi.newpipe.views.NewPipeEditText] + * (even if [standard TextViews][TextView] are supported). + */ + @JvmStatic + fun shareSelectedTextWithShareUtils(textView: TextView) { + val textViewText = textView.getText() + shareSelectedTextIfNotNullAndNotEmpty(textView, getSelectedText(textView, textViewText)) + if (textViewText is Spannable) { + Selection.setSelection(textViewText, textView.selectionEnd) + } + } + + private fun getSelectedText(textView: TextView, text: CharSequence?): CharSequence? { + if (!textView.hasSelection() || text == null) { + return null + } + + val start = textView.selectionStart + val end = textView.selectionEnd + return if (start > end) { + text.subSequence(end, start) + } else { + text.subSequence(start, end) + } + } + + private fun shareSelectedTextIfNotNullAndNotEmpty( + textView: TextView, + selectedText: CharSequence? + ) { + if (!selectedText.isNullOrEmpty()) { + ShareUtils.shareText(textView.context, "", selectedText.toString()) + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/PeertubeHelper.java b/app/src/main/java/org/schabi/newpipe/util/PeertubeHelper.java deleted file mode 100644 index 34f99d26252..00000000000 --- a/app/src/main/java/org/schabi/newpipe/util/PeertubeHelper.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.schabi.newpipe.util; - -import android.content.Context; -import android.content.SharedPreferences; - -import androidx.preference.PreferenceManager; - -import com.grack.nanojson.JsonArray; -import com.grack.nanojson.JsonObject; -import com.grack.nanojson.JsonParser; -import com.grack.nanojson.JsonParserException; -import com.grack.nanojson.JsonStringWriter; -import com.grack.nanojson.JsonWriter; - -import org.schabi.newpipe.R; -import org.schabi.newpipe.extractor.ServiceList; -import org.schabi.newpipe.extractor.services.peertube.PeertubeInstance; - -import java.util.ArrayList; -import java.util.List; - -public final class PeertubeHelper { - private PeertubeHelper() { } - - public static List getInstanceList(final Context context) { - final SharedPreferences sharedPreferences = PreferenceManager - .getDefaultSharedPreferences(context); - final String savedInstanceListKey = context.getString(R.string.peertube_instance_list_key); - final String savedJson = sharedPreferences.getString(savedInstanceListKey, null); - if (null == savedJson) { - return List.of(getCurrentInstance()); - } - - try { - final JsonArray array = JsonParser.object().from(savedJson).getArray("instances"); - final List result = new ArrayList<>(); - for (final Object o : array) { - if (o instanceof JsonObject) { - final JsonObject instance = (JsonObject) o; - final String name = instance.getString("name"); - final String url = instance.getString("url"); - result.add(new PeertubeInstance(url, name)); - } - } - return result; - } catch (final JsonParserException e) { - return List.of(getCurrentInstance()); - } - } - - public static PeertubeInstance selectInstance(final PeertubeInstance instance, - final Context context) { - final SharedPreferences sharedPreferences = PreferenceManager - .getDefaultSharedPreferences(context); - final String selectedInstanceKey = - context.getString(R.string.peertube_selected_instance_key); - final JsonStringWriter jsonWriter = JsonWriter.string().object(); - jsonWriter.value("name", instance.getName()); - jsonWriter.value("url", instance.getUrl()); - final String jsonToSave = jsonWriter.end().done(); - sharedPreferences.edit().putString(selectedInstanceKey, jsonToSave).apply(); - ServiceList.PeerTube.setInstance(instance); - return instance; - } - - public static PeertubeInstance getCurrentInstance() { - return ServiceList.PeerTube.getInstance(); - } -} diff --git a/app/src/main/java/org/schabi/newpipe/util/PeertubeHelper.kt b/app/src/main/java/org/schabi/newpipe/util/PeertubeHelper.kt new file mode 100644 index 00000000000..9cf3c1e73d9 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/PeertubeHelper.kt @@ -0,0 +1,52 @@ +/* + * SPDX-FileCopyrightText: 2019-2026 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.util + +import android.content.Context +import androidx.core.content.edit +import androidx.preference.PreferenceManager +import com.grack.nanojson.JsonObject +import com.grack.nanojson.JsonParser +import com.grack.nanojson.JsonWriter +import org.schabi.newpipe.R +import org.schabi.newpipe.extractor.ServiceList +import org.schabi.newpipe.extractor.services.peertube.PeertubeInstance + +object PeertubeHelper { + + @JvmStatic + val currentInstance: PeertubeInstance + get() = ServiceList.PeerTube.instance + + @JvmStatic + fun getInstanceList(context: Context): List { + val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) + val savedInstanceListKey = context.getString(R.string.peertube_instance_list_key) + val savedJson = sharedPreferences.getString(savedInstanceListKey, null) + ?: return listOf(currentInstance) + + return runCatching { + JsonParser.`object`().from(savedJson).getArray("instances") + .filterIsInstance() + .map { PeertubeInstance(it.getString("url"), it.getString("name")) } + }.getOrDefault(listOf(currentInstance)) + } + + @JvmStatic + fun selectInstance(instance: PeertubeInstance, context: Context): PeertubeInstance { + val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) + val selectedInstanceKey = context.getString(R.string.peertube_selected_instance_key) + + val jsonWriter = JsonWriter.string().`object`() + jsonWriter.value("name", instance.name) + jsonWriter.value("url", instance.url) + val jsonToSave = jsonWriter.end().done() + + sharedPreferences.edit { putString(selectedInstanceKey, jsonToSave) } + ServiceList.PeerTube.instance = instance + return instance + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/PermissionHelper.java b/app/src/main/java/org/schabi/newpipe/util/PermissionHelper.java index 969d787d74d..2defbdc5b24 100644 --- a/app/src/main/java/org/schabi/newpipe/util/PermissionHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/PermissionHelper.java @@ -90,10 +90,10 @@ public static boolean checkPostNotificationsPermission(final Activity activity, && ContextCompat.checkSelfPermission(activity, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { - if (!App.getApp().getNotificationsRequested()) { + if (!App.getInstance().getNotificationsRequested()) { ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.POST_NOTIFICATIONS}, requestCode); - App.getApp().setNotificationsRequested(); + App.getInstance().setNotificationsRequested(); return false; } } diff --git a/app/src/main/java/org/schabi/newpipe/util/PlayButtonHelper.java b/app/src/main/java/org/schabi/newpipe/util/PlayButtonHelper.java deleted file mode 100644 index 655ea7092f2..00000000000 --- a/app/src/main/java/org/schabi/newpipe/util/PlayButtonHelper.java +++ /dev/null @@ -1,94 +0,0 @@ -package org.schabi.newpipe.util; - -import android.content.Context; -import android.widget.Toast; - -import androidx.annotation.NonNull; -import androidx.appcompat.app.AppCompatActivity; -import androidx.preference.PreferenceManager; - -import org.schabi.newpipe.R; -import org.schabi.newpipe.databinding.PlaylistControlBinding; -import org.schabi.newpipe.fragments.list.playlist.PlaylistControlViewHolder; -import org.schabi.newpipe.player.PlayerType; - -/** - * Utility class for play buttons and their respective click listeners. - */ -public final class PlayButtonHelper { - - private PlayButtonHelper() { - // utility class - } - - /** - * Initialize {@link android.view.View.OnClickListener OnClickListener} - * and {@link android.view.View.OnLongClickListener OnLongClickListener} for playlist control - * buttons defined in {@link R.layout#playlist_control}. - * - * @param activity The activity to use for the {@link android.widget.Toast Toast}. - * @param playlistControlBinding The binding of the - * {@link R.layout#playlist_control playlist control layout}. - * @param fragment The fragment to get the play queue from. - */ - public static void initPlaylistControlClickListener( - @NonNull final AppCompatActivity activity, - @NonNull final PlaylistControlBinding playlistControlBinding, - @NonNull final PlaylistControlViewHolder fragment) { - // click listener - playlistControlBinding.playlistCtrlPlayAllButton.setOnClickListener(view -> { - NavigationHelper.playOnMainPlayer(activity, fragment.getPlayQueue()); - showHoldToAppendToastIfNeeded(activity); - }); - playlistControlBinding.playlistCtrlPlayPopupButton.setOnClickListener(view -> { - NavigationHelper.playOnPopupPlayer(activity, fragment.getPlayQueue(), false); - showHoldToAppendToastIfNeeded(activity); - }); - playlistControlBinding.playlistCtrlPlayBgButton.setOnClickListener(view -> { - NavigationHelper.playOnBackgroundPlayer(activity, fragment.getPlayQueue(), false); - showHoldToAppendToastIfNeeded(activity); - }); - - // long click listener - playlistControlBinding.playlistCtrlPlayAllButton.setOnLongClickListener(view -> { - NavigationHelper.enqueueOnPlayer(activity, fragment.getPlayQueue(), PlayerType.MAIN); - return true; - }); - playlistControlBinding.playlistCtrlPlayPopupButton.setOnLongClickListener(view -> { - NavigationHelper.enqueueOnPlayer(activity, fragment.getPlayQueue(), PlayerType.POPUP); - return true; - }); - playlistControlBinding.playlistCtrlPlayBgButton.setOnLongClickListener(view -> { - NavigationHelper.enqueueOnPlayer(activity, fragment.getPlayQueue(), PlayerType.AUDIO); - return true; - }); - } - - /** - * Show the "hold to append" toast if the corresponding preference is enabled. - * - * @param context The context to show the toast. - */ - private static void showHoldToAppendToastIfNeeded(@NonNull final Context context) { - if (shouldShowHoldToAppendTip(context)) { - Toast.makeText(context, R.string.hold_to_append, Toast.LENGTH_SHORT).show(); - } - - } - - /** - * Check if the "hold to append" toast should be shown. - * - *

- * The tip is shown if the corresponding preference is enabled. - * This is the default behaviour. - *

- * - * @param context The context to get the preference. - * @return {@code true} if the tip should be shown, {@code false} otherwise. - */ - public static boolean shouldShowHoldToAppendTip(@NonNull final Context context) { - return PreferenceManager.getDefaultSharedPreferences(context) - .getBoolean(context.getString(R.string.show_hold_to_append_key), true); - } -} diff --git a/app/src/main/java/org/schabi/newpipe/util/PlayButtonHelper.kt b/app/src/main/java/org/schabi/newpipe/util/PlayButtonHelper.kt new file mode 100644 index 00000000000..40734ec5822 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/PlayButtonHelper.kt @@ -0,0 +1,96 @@ +/* + * SPDX-FileCopyrightText: 2023-2026 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.util + +import android.content.Context +import android.view.View +import android.view.View.OnLongClickListener +import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity +import androidx.preference.PreferenceManager +import org.schabi.newpipe.R +import org.schabi.newpipe.databinding.PlaylistControlBinding +import org.schabi.newpipe.fragments.list.playlist.PlaylistControlViewHolder +import org.schabi.newpipe.player.PlayerType + +/** + * Utility class for play buttons and their respective click listeners. + */ +object PlayButtonHelper { + /** + * Initialize [OnClickListener][View.OnClickListener] + * and [OnLongClickListener][OnLongClickListener] for playlist control + * buttons defined in [R.layout.playlist_control]. + * + * @param activity The activity to use for the [Toast][Toast]. + * @param playlistControlBinding The binding of the + * [playlist control layout][R.layout.playlist_control]. + * @param fragment The fragment to get the play queue from. + */ + @JvmStatic + fun initPlaylistControlClickListener( + activity: AppCompatActivity, + playlistControlBinding: PlaylistControlBinding, + fragment: PlaylistControlViewHolder + ) { + // click listener + playlistControlBinding.playlistCtrlPlayAllButton.setOnClickListener { + NavigationHelper.playOnMainPlayer(activity, fragment.getPlayQueue()) + showHoldToAppendToastIfNeeded(activity) + } + playlistControlBinding.playlistCtrlPlayPopupButton.setOnClickListener { + NavigationHelper.playOnPopupPlayer(activity, fragment.getPlayQueue(), false) + showHoldToAppendToastIfNeeded(activity) + } + playlistControlBinding.playlistCtrlPlayBgButton.setOnClickListener { + NavigationHelper.playOnBackgroundPlayer(activity, fragment.getPlayQueue(), false) + showHoldToAppendToastIfNeeded(activity) + } + + // long click listener + playlistControlBinding.playlistCtrlPlayAllButton.setOnLongClickListener { + NavigationHelper.enqueueOnPlayer(activity, fragment.getPlayQueue(), PlayerType.MAIN) + true + } + playlistControlBinding.playlistCtrlPlayPopupButton.setOnLongClickListener { + NavigationHelper.enqueueOnPlayer(activity, fragment.getPlayQueue(), PlayerType.POPUP) + true + } + playlistControlBinding.playlistCtrlPlayBgButton.setOnLongClickListener { + NavigationHelper.enqueueOnPlayer(activity, fragment.getPlayQueue(), PlayerType.AUDIO) + true + } + } + + /** + * Show the "hold to append" toast if the corresponding preference is enabled. + * + * @param context The context to show the toast. + */ + private fun showHoldToAppendToastIfNeeded(context: Context) { + if (shouldShowHoldToAppendTip(context)) { + Toast.makeText(context, R.string.hold_to_append, Toast.LENGTH_SHORT).show() + } + } + + /** + * Check if the "hold to append" toast should be shown. + * + * + * + * The tip is shown if the corresponding preference is enabled. + * This is the default behaviour. + * + * + * @param context The context to get the preference. + * @return `true` if the tip should be shown, `false` otherwise. + */ + @JvmStatic + fun shouldShowHoldToAppendTip(context: Context): Boolean { + return PreferenceManager.getDefaultSharedPreferences(context) + .getBoolean(context.getString(R.string.show_hold_to_append_key), true) + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/ReleaseVersionUtil.kt b/app/src/main/java/org/schabi/newpipe/util/ReleaseVersionUtil.kt index bc3849384f0..31d42d751dd 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ReleaseVersionUtil.kt +++ b/app/src/main/java/org/schabi/newpipe/util/ReleaseVersionUtil.kt @@ -21,7 +21,7 @@ object ReleaseVersionUtil { val certificates = mapOf( RELEASE_CERT_PUBLIC_KEY_SHA256.hexToByteArray() to PackageManager.CERT_INPUT_SHA256 ) - val app = App.getApp() + val app = App.instance try { PackageInfoCompat.hasSignatures(app.packageManager, app.packageName, certificates, false) } catch (e: PackageManager.NameNotFoundException) { diff --git a/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.java b/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.java deleted file mode 100644 index c712157b35b..00000000000 --- a/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.java +++ /dev/null @@ -1,213 +0,0 @@ -package org.schabi.newpipe.util; - -import static org.schabi.newpipe.extractor.ServiceList.SoundCloud; - -import android.content.Context; -import android.content.SharedPreferences; - -import androidx.annotation.DrawableRes; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.annotation.StringRes; -import androidx.preference.PreferenceManager; - -import com.grack.nanojson.JsonObject; -import com.grack.nanojson.JsonParser; -import com.grack.nanojson.JsonParserException; - -import org.schabi.newpipe.R; -import org.schabi.newpipe.extractor.NewPipe; -import org.schabi.newpipe.extractor.ServiceList; -import org.schabi.newpipe.extractor.StreamingService; -import org.schabi.newpipe.extractor.exceptions.ExtractionException; -import org.schabi.newpipe.extractor.services.peertube.PeertubeInstance; - -import java.util.Optional; -import java.util.concurrent.TimeUnit; - -public final class ServiceHelper { - private static final StreamingService DEFAULT_FALLBACK_SERVICE = ServiceList.YouTube; - - private ServiceHelper() { } - - @DrawableRes - public static int getIcon(final int serviceId) { - switch (serviceId) { - case 0: - return R.drawable.ic_smart_display; - case 1: - return R.drawable.ic_cloud; - case 2: - return R.drawable.ic_placeholder_media_ccc; - case 3: - return R.drawable.ic_placeholder_peertube; - case 4: - return R.drawable.ic_placeholder_bandcamp; - default: - return R.drawable.ic_circle; - } - } - - public static String getTranslatedFilterString(final String filter, final Context c) { - switch (filter) { - case "all": - return c.getString(R.string.all); - case "videos": - case "sepia_videos": - case "music_videos": - return c.getString(R.string.videos_string); - case "channels": - return c.getString(R.string.channels); - case "playlists": - case "music_playlists": - return c.getString(R.string.playlists); - case "tracks": - return c.getString(R.string.tracks); - case "users": - return c.getString(R.string.users); - case "conferences": - return c.getString(R.string.conferences); - case "events": - return c.getString(R.string.events); - case "music_songs": - return c.getString(R.string.songs); - case "music_albums": - return c.getString(R.string.albums); - case "music_artists": - return c.getString(R.string.artists); - default: - return filter; - } - } - - /** - * Get a resource string with instructions for importing subscriptions for each service. - * - * @param serviceId service to get the instructions for - * @return the string resource containing the instructions or -1 if the service don't support it - */ - @StringRes - public static int getImportInstructions(final int serviceId) { - switch (serviceId) { - case 0: - return R.string.import_youtube_instructions; - case 1: - return R.string.import_soundcloud_instructions; - default: - return -1; - } - } - - /** - * For services that support importing from a channel url, return a hint that will - * be used in the EditText that the user will type in his channel url. - * - * @param serviceId service to get the hint for - * @return the hint's string resource or -1 if the service don't support it - */ - @StringRes - public static int getImportInstructionsHint(final int serviceId) { - switch (serviceId) { - case 1: - return R.string.import_soundcloud_instructions_hint; - default: - return -1; - } - } - - public static int getSelectedServiceId(final Context context) { - return Optional.ofNullable(getSelectedService(context)) - .orElse(DEFAULT_FALLBACK_SERVICE) - .getServiceId(); - } - - @Nullable - public static StreamingService getSelectedService(final Context context) { - final String serviceName = PreferenceManager.getDefaultSharedPreferences(context) - .getString(context.getString(R.string.current_service_key), - context.getString(R.string.default_service_value)); - - try { - return NewPipe.getService(serviceName); - } catch (final ExtractionException e) { - return null; - } - } - - @NonNull - public static String getNameOfServiceById(final int serviceId) { - return ServiceList.all().stream() - .filter(s -> s.getServiceId() == serviceId) - .findFirst() - .map(StreamingService::getServiceInfo) - .map(StreamingService.ServiceInfo::getName) - .orElse(""); - } - - /** - * @param serviceId the id of the service - * @return the service corresponding to the provided id - * @throws java.util.NoSuchElementException if there is no service with the provided id - */ - @NonNull - public static StreamingService getServiceById(final int serviceId) { - return ServiceList.all().stream() - .filter(s -> s.getServiceId() == serviceId) - .findFirst() - .orElseThrow(); - } - - public static void setSelectedServiceId(final Context context, final int serviceId) { - String serviceName; - try { - serviceName = NewPipe.getService(serviceId).getServiceInfo().getName(); - } catch (final ExtractionException e) { - serviceName = DEFAULT_FALLBACK_SERVICE.getServiceInfo().getName(); - } - - setSelectedServicePreferences(context, serviceName); - } - - private static void setSelectedServicePreferences(final Context context, - final String serviceName) { - PreferenceManager.getDefaultSharedPreferences(context).edit(). - putString(context.getString(R.string.current_service_key), serviceName).apply(); - } - - public static long getCacheExpirationMillis(final int serviceId) { - if (serviceId == SoundCloud.getServiceId()) { - return TimeUnit.MILLISECONDS.convert(5, TimeUnit.MINUTES); - } else { - return TimeUnit.MILLISECONDS.convert(1, TimeUnit.HOURS); - } - } - - public static void initService(final Context context, final int serviceId) { - if (serviceId == ServiceList.PeerTube.getServiceId()) { - final SharedPreferences sharedPreferences = PreferenceManager - .getDefaultSharedPreferences(context); - final String json = sharedPreferences.getString(context.getString( - R.string.peertube_selected_instance_key), null); - if (null == json) { - return; - } - - final JsonObject jsonObject; - try { - jsonObject = JsonParser.object().from(json); - } catch (final JsonParserException e) { - return; - } - final String name = jsonObject.getString("name"); - final String url = jsonObject.getString("url"); - final PeertubeInstance instance = new PeertubeInstance(url, name); - ServiceList.PeerTube.setInstance(instance); - } - } - - public static void initServices(final Context context) { - for (final StreamingService s : ServiceList.all()) { - initService(context, s.getServiceId()); - } - } -} diff --git a/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.kt b/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.kt new file mode 100644 index 00000000000..4239f43e059 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.kt @@ -0,0 +1,168 @@ +/* + * SPDX-FileCopyrightText: 2018-2026 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.util + +import android.content.Context +import androidx.annotation.DrawableRes +import androidx.annotation.StringRes +import androidx.core.content.edit +import androidx.preference.PreferenceManager +import com.grack.nanojson.JsonParser +import java.util.concurrent.TimeUnit +import org.schabi.newpipe.R +import org.schabi.newpipe.extractor.NewPipe +import org.schabi.newpipe.extractor.ServiceList +import org.schabi.newpipe.extractor.StreamingService +import org.schabi.newpipe.extractor.services.peertube.PeertubeInstance +import org.schabi.newpipe.ktx.getStringSafe + +object ServiceHelper { + private val DEFAULT_FALLBACK_SERVICE: StreamingService = ServiceList.YouTube + + @JvmStatic + @DrawableRes + fun getIcon(serviceId: Int): Int { + return when (serviceId) { + 0 -> R.drawable.ic_smart_display + 1 -> R.drawable.ic_cloud + 2 -> R.drawable.ic_placeholder_media_ccc + 3 -> R.drawable.ic_placeholder_peertube + 4 -> R.drawable.ic_placeholder_bandcamp + else -> R.drawable.ic_circle + } + } + + @JvmStatic + fun getTranslatedFilterString(filter: String, context: Context): String { + return when (filter) { + "all" -> context.getString(R.string.all) + "videos", "sepia_videos", "music_videos" -> context.getString(R.string.videos_string) + "channels" -> context.getString(R.string.channels) + "playlists", "music_playlists" -> context.getString(R.string.playlists) + "tracks" -> context.getString(R.string.tracks) + "users" -> context.getString(R.string.users) + "conferences" -> context.getString(R.string.conferences) + "events" -> context.getString(R.string.events) + "music_songs" -> context.getString(R.string.songs) + "music_albums" -> context.getString(R.string.albums) + "music_artists" -> context.getString(R.string.artists) + else -> filter + } + } + + /** + * Get a resource string with instructions for importing subscriptions for each service. + * + * @param serviceId service to get the instructions for + * @return the string resource containing the instructions or -1 if the service don't support it + */ + @JvmStatic + @StringRes + fun getImportInstructions(serviceId: Int): Int { + return when (serviceId) { + 0 -> R.string.import_youtube_instructions + 1 -> R.string.import_soundcloud_instructions + else -> -1 + } + } + + /** + * For services that support importing from a channel url, return a hint that will + * be used in the EditText that the user will type in his channel url. + * + * @param serviceId service to get the hint for + * @return the hint's string resource or -1 if the service don't support it + */ + @JvmStatic + @StringRes + fun getImportInstructionsHint(serviceId: Int): Int { + return when (serviceId) { + 1 -> R.string.import_soundcloud_instructions_hint + else -> -1 + } + } + + @JvmStatic + fun getSelectedServiceId(context: Context): Int { + return (getSelectedService(context) ?: DEFAULT_FALLBACK_SERVICE).serviceId + } + + @JvmStatic + fun getSelectedService(context: Context): StreamingService? { + val serviceName: String = PreferenceManager.getDefaultSharedPreferences(context) + .getStringSafe( + context.getString(R.string.current_service_key), + context.getString(R.string.default_service_value) + ) + + return runCatching { NewPipe.getService(serviceName) }.getOrNull() + } + + @JvmStatic + fun getNameOfServiceById(serviceId: Int): String { + return ServiceList.all().stream() + .filter { it.serviceId == serviceId } + .findFirst() + .map(StreamingService::getServiceInfo) + .map(StreamingService.ServiceInfo::getName) + .orElse("") + } + + /** + * @param serviceId the id of the service + * @return the service corresponding to the provided id + * @throws java.util.NoSuchElementException if there is no service with the provided id + */ + @JvmStatic + fun getServiceById(serviceId: Int): StreamingService { + return ServiceList.all().firstNotNullOf { it.takeIf { it.serviceId == serviceId } } + } + + @JvmStatic + fun setSelectedServiceId(context: Context, serviceId: Int) { + val serviceName = runCatching { NewPipe.getService(serviceId).serviceInfo.name } + .getOrDefault(DEFAULT_FALLBACK_SERVICE.serviceInfo.name) + + setSelectedServicePreferences(context, serviceName) + } + + private fun setSelectedServicePreferences(context: Context, serviceName: String?) { + val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) + sharedPreferences.edit { putString(context.getString(R.string.current_service_key), serviceName) } + } + + @JvmStatic + fun getCacheExpirationMillis(serviceId: Int): Long { + return if (serviceId == ServiceList.SoundCloud.serviceId) { + TimeUnit.MILLISECONDS.convert(5, TimeUnit.MINUTES) + } else { + TimeUnit.MILLISECONDS.convert(1, TimeUnit.HOURS) + } + } + + fun initService(context: Context, serviceId: Int) { + if (serviceId == ServiceList.PeerTube.serviceId) { + val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) + val json = sharedPreferences.getString( + context.getString(R.string.peertube_selected_instance_key), + null + ) ?: return + + val jsonObject = runCatching { JsonParser.`object`().from(json) } + .getOrElse { return@initService } + + ServiceList.PeerTube.instance = PeertubeInstance( + jsonObject.getString("url"), + jsonObject.getString("name") + ) + } + } + + @JvmStatic + fun initServices(context: Context) { + ServiceList.all().forEach { initService(context, it.serviceId) } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/StreamTypeUtil.java b/app/src/main/java/org/schabi/newpipe/util/StreamTypeUtil.java deleted file mode 100644 index 0cc0ecf1fd3..00000000000 --- a/app/src/main/java/org/schabi/newpipe/util/StreamTypeUtil.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.schabi.newpipe.util; - -import org.schabi.newpipe.extractor.stream.StreamType; - -/** - * Utility class for {@link StreamType}. - */ -public final class StreamTypeUtil { - private StreamTypeUtil() { - // No impl pls - } - - /** - * Check if the {@link StreamType} of a stream is a livestream. - * - * @param streamType the stream type of the stream - * @return whether the stream type is {@link StreamType#AUDIO_STREAM}, - * {@link StreamType#AUDIO_LIVE_STREAM} or {@link StreamType#POST_LIVE_AUDIO_STREAM} - */ - public static boolean isAudio(final StreamType streamType) { - return streamType == StreamType.AUDIO_STREAM - || streamType == StreamType.AUDIO_LIVE_STREAM - || streamType == StreamType.POST_LIVE_AUDIO_STREAM; - } - - /** - * Check if the {@link StreamType} of a stream is a livestream. - * - * @param streamType the stream type of the stream - * @return whether the stream type is {@link StreamType#VIDEO_STREAM}, - * {@link StreamType#LIVE_STREAM} or {@link StreamType#POST_LIVE_STREAM} - */ - public static boolean isVideo(final StreamType streamType) { - return streamType == StreamType.VIDEO_STREAM - || streamType == StreamType.LIVE_STREAM - || streamType == StreamType.POST_LIVE_STREAM; - } - - /** - * Check if the {@link StreamType} of a stream is a livestream. - * - * @param streamType the stream type of the stream - * @return whether the stream type is {@link StreamType#LIVE_STREAM} or - * {@link StreamType#AUDIO_LIVE_STREAM} - */ - public static boolean isLiveStream(final StreamType streamType) { - return streamType == StreamType.LIVE_STREAM - || streamType == StreamType.AUDIO_LIVE_STREAM; - } -} diff --git a/app/src/main/java/org/schabi/newpipe/util/StreamTypeUtil.kt b/app/src/main/java/org/schabi/newpipe/util/StreamTypeUtil.kt new file mode 100644 index 00000000000..2401a4f4909 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/StreamTypeUtil.kt @@ -0,0 +1,54 @@ +/* + * SPDX-FileCopyrightText: 2021-2026 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.util + +import org.schabi.newpipe.extractor.stream.StreamType + +/** + * Utility class for [StreamType]. + */ +object StreamTypeUtil { + /** + * Check if the [StreamType] of a stream is a livestream. + * + * @param streamType the stream type of the stream + * @return whether the stream type is [StreamType.AUDIO_STREAM], + * [StreamType.AUDIO_LIVE_STREAM] or [StreamType.POST_LIVE_AUDIO_STREAM] + */ + @JvmStatic + fun isAudio(streamType: StreamType): Boolean { + return streamType == StreamType.AUDIO_STREAM || + streamType == StreamType.AUDIO_LIVE_STREAM || + streamType == StreamType.POST_LIVE_AUDIO_STREAM + } + + /** + * Check if the [StreamType] of a stream is a livestream. + * + * @param streamType the stream type of the stream + * @return whether the stream type is [StreamType.VIDEO_STREAM], + * [StreamType.LIVE_STREAM] or [StreamType.POST_LIVE_STREAM] + */ + @JvmStatic + fun isVideo(streamType: StreamType): Boolean { + return streamType == StreamType.VIDEO_STREAM || + streamType == StreamType.LIVE_STREAM || + streamType == StreamType.POST_LIVE_STREAM + } + + /** + * Check if the [StreamType] of a stream is a livestream. + * + * @param streamType the stream type of the stream + * @return whether the stream type is [StreamType.LIVE_STREAM] or + * [StreamType.AUDIO_LIVE_STREAM] + */ + @JvmStatic + fun isLiveStream(streamType: StreamType): Boolean { + return streamType == StreamType.LIVE_STREAM || + streamType == StreamType.AUDIO_LIVE_STREAM + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java b/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java index 9fe351b4b97..d563621056f 100644 --- a/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java +++ b/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java @@ -1,6 +1,7 @@ package org.schabi.newpipe.util.external_communication; import static org.schabi.newpipe.MainActivity.DEBUG; +import static coil3.Image_androidKt.toBitmap; import android.content.ActivityNotFoundException; import android.content.ClipData; @@ -9,6 +10,7 @@ import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Build; import android.text.TextUtils; @@ -25,12 +27,15 @@ import org.schabi.newpipe.RouterActivity; import org.schabi.newpipe.extractor.Image; import org.schabi.newpipe.util.image.ImageStrategy; -import org.schabi.newpipe.util.image.PicassoHelper; -import java.io.File; -import java.io.FileOutputStream; +import java.nio.file.Files; +import java.util.Collections; import java.util.List; +import coil3.SingletonImageLoader; +import coil3.disk.DiskCache; +import coil3.memory.MemoryCache; + public final class ShareUtils { private static final String TAG = ShareUtils.class.getSimpleName(); @@ -273,7 +278,7 @@ public static void shareText(@NonNull final Context context, * @param content the content to share * @param images a set of possible {@link Image}s of the subject, among which to choose with * {@link ImageStrategy#choosePreferredImage(List)} since that's likely to - * provide an image that is in Picasso's cache + * provide an image that is in Coil's cache */ public static void shareText(@NonNull final Context context, @NonNull final String title, @@ -334,11 +339,9 @@ public static void copyToClipboard(@NonNull final Context context, final String * *

* In order not to worry about network issues (timeouts, DNS issues, low connection speed, ...) - * when sharing a content, only images in the {@link com.squareup.picasso.LruCache LruCache} - * used by the Picasso library inside {@link PicassoHelper} are used as preview images. If the - * thumbnail image is not in the cache, no {@link ClipData} will be generated and {@code null} - * will be returned. - *

+ * when sharing a content, only images in the {@link MemoryCache} or {@link DiskCache} + * used by the Coil library are used as preview images. If the thumbnail image is not in the + * cache, no {@link ClipData} will be generated and {@code null} will be returned. * *

* In order to display the image in the content preview of the Android share sheet, an URI of @@ -354,12 +357,6 @@ public static void copyToClipboard(@NonNull final Context context, final String *

* *

- * This method will call {@link PicassoHelper#getImageFromCacheIfPresent(String)} to get the - * thumbnail of the content in the {@link com.squareup.picasso.LruCache LruCache} used by - * the Picasso library inside {@link PicassoHelper}. - *

- * - *

* Using the result of this method when sharing has only an effect on the system share sheet (if * OEMs didn't change Android system standard behavior) on Android API 29 and higher. *

@@ -373,33 +370,46 @@ private static ClipData generateClipDataForImagePreview( @NonNull final Context context, @NonNull final String thumbnailUrl) { try { - final Bitmap bitmap = PicassoHelper.getImageFromCacheIfPresent(thumbnailUrl); - if (bitmap == null) { - return null; - } - // Save the image in memory to the application's cache because we need a URI to the // image to generate a ClipData which will show the share sheet, and so an image file final Context applicationContext = context.getApplicationContext(); - final String appFolder = applicationContext.getCacheDir().getAbsolutePath(); - final File thumbnailPreviewFile = new File(appFolder - + "/android_share_sheet_image_preview.jpg"); + final var loader = SingletonImageLoader.get(context); + final var value = loader.getMemoryCache() + .get(new MemoryCache.Key(thumbnailUrl, Collections.emptyMap())); + + final Bitmap cachedBitmap; + if (value != null) { + cachedBitmap = toBitmap(value.getImage()); + } else { + try (var snapshot = loader.getDiskCache().openSnapshot(thumbnailUrl)) { + if (snapshot != null) { + cachedBitmap = BitmapFactory.decodeFile(snapshot.getData().toString()); + } else { + cachedBitmap = null; + } + } + } - // Any existing file will be overwritten with FileOutputStream - final FileOutputStream fileOutputStream = new FileOutputStream(thumbnailPreviewFile); - bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fileOutputStream); - fileOutputStream.close(); + if (cachedBitmap == null) { + return null; + } + + final var path = applicationContext.getCacheDir().toPath() + .resolve("android_share_sheet_image_preview.jpg"); + // Any existing file will be overwritten + try (var outputStream = Files.newOutputStream(path)) { + cachedBitmap.compress(Bitmap.CompressFormat.JPEG, 90, outputStream); + } final ClipData clipData = ClipData.newUri(applicationContext.getContentResolver(), "", - FileProvider.getUriForFile(applicationContext, - BuildConfig.APPLICATION_ID + ".provider", - thumbnailPreviewFile)); + FileProvider.getUriForFile(applicationContext, + BuildConfig.APPLICATION_ID + ".provider", + path.toFile())); if (DEBUG) { Log.d(TAG, "ClipData successfully generated for Android share sheet: " + clipData); } return clipData; - } catch (final Exception e) { Log.w(TAG, "Error when setting preview image for share sheet", e); return null; diff --git a/app/src/main/java/org/schabi/newpipe/util/image/CoilHelper.kt b/app/src/main/java/org/schabi/newpipe/util/image/CoilHelper.kt new file mode 100644 index 00000000000..bd1c57f98b1 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/image/CoilHelper.kt @@ -0,0 +1,185 @@ +package org.schabi.newpipe.util.image + +import android.content.Context +import android.graphics.Bitmap +import android.util.Log +import android.widget.ImageView +import androidx.annotation.DrawableRes +import coil3.executeBlocking +import coil3.imageLoader +import coil3.request.Disposable +import coil3.request.ImageRequest +import coil3.request.error +import coil3.request.placeholder +import coil3.request.target +import coil3.request.transformations +import coil3.size.Size +import coil3.target.Target +import coil3.toBitmap +import coil3.transform.Transformation +import kotlin.math.min +import org.schabi.newpipe.MainActivity +import org.schabi.newpipe.R +import org.schabi.newpipe.extractor.Image +import org.schabi.newpipe.ktx.scale + +object CoilHelper { + private val TAG = CoilHelper::class.java.simpleName + + @JvmOverloads + fun loadBitmapBlocking( + context: Context, + url: String?, + @DrawableRes placeholderResId: Int = 0 + ): Bitmap? = context.imageLoader + .executeBlocking(getImageRequest(context, url, placeholderResId).build()) + .image + ?.toBitmap() + + fun loadAvatar( + target: ImageView, + images: List + ) { + loadImageDefault(target, images, R.drawable.placeholder_person) + } + + fun loadAvatar( + target: ImageView, + url: String? + ) { + loadImageDefault(target, url, R.drawable.placeholder_person) + } + + fun loadThumbnail( + target: ImageView, + images: List + ) { + loadImageDefault(target, images, R.drawable.placeholder_thumbnail_video) + } + + fun loadThumbnail( + target: ImageView, + url: String? + ) { + loadImageDefault(target, url, R.drawable.placeholder_thumbnail_video) + } + + fun loadScaledDownThumbnail( + context: Context, + images: List, + target: Target + ): Disposable { + val url = ImageStrategy.choosePreferredImage(images) + val request = + getImageRequest(context, url, R.drawable.placeholder_thumbnail_video) + .target(target) + .transformations( + object : Transformation() { + override val cacheKey = "COIL_PLAYER_THUMBNAIL_TRANSFORMATION_KEY" + + override suspend fun transform( + input: Bitmap, + size: Size + ): Bitmap { + if (MainActivity.DEBUG) { + Log.d(TAG, "Thumbnail - transform() called") + } + + val notificationThumbnailWidth = + min( + context.resources.getDimension(R.dimen.player_notification_thumbnail_width), + input.width.toFloat() + ).toInt() + + var newHeight = input.height / (input.width / notificationThumbnailWidth) + val result = input.scale(notificationThumbnailWidth, newHeight) + + return if (result == input || !result.isMutable) { + // create a new mutable bitmap to prevent strange crashes on some + // devices (see #4638) + newHeight = input.height / (input.width / (notificationThumbnailWidth - 1)) + input.scale(notificationThumbnailWidth, newHeight) + } else { + result + } + } + } + ).build() + + return context.imageLoader.enqueue(request) + } + + fun loadDetailsThumbnail( + target: ImageView, + images: List + ) { + val url = ImageStrategy.choosePreferredImage(images) + loadImageDefault(target, url, R.drawable.placeholder_thumbnail_video, false) + } + + fun loadBanner( + target: ImageView, + images: List + ) { + loadImageDefault(target, images, R.drawable.placeholder_channel_banner) + } + + fun loadPlaylistThumbnail( + target: ImageView, + images: List + ) { + loadImageDefault(target, images, R.drawable.placeholder_thumbnail_playlist) + } + + fun loadPlaylistThumbnail( + target: ImageView, + url: String? + ) { + loadImageDefault(target, url, R.drawable.placeholder_thumbnail_playlist) + } + + private fun loadImageDefault( + target: ImageView, + images: List, + @DrawableRes placeholderResId: Int + ) { + loadImageDefault(target, ImageStrategy.choosePreferredImage(images), placeholderResId) + } + + private fun loadImageDefault( + target: ImageView, + url: String?, + @DrawableRes placeholderResId: Int, + showPlaceholder: Boolean = true + ) { + val request = + getImageRequest(target.context, url, placeholderResId, showPlaceholder) + .target(target) + .build() + target.context.imageLoader.enqueue(request) + } + + private fun getImageRequest( + context: Context, + url: String?, + @DrawableRes placeholderResId: Int, + showPlaceholderWhileLoading: Boolean = true + ): ImageRequest.Builder { + // if the URL was chosen with `choosePreferredImage` it will be null, but check again + // `shouldLoadImages` in case the URL was chosen with `imageListToDbUrl` (which is the case + // for URLs stored in the database) + val takenUrl = url?.takeIf { it.isNotEmpty() && ImageStrategy.shouldLoadImages() } + + return ImageRequest + .Builder(context) + .data(takenUrl) + .error(placeholderResId) + .memoryCacheKey(takenUrl) + .diskCacheKey(takenUrl) + .apply { + if (takenUrl != null || showPlaceholderWhileLoading) { + placeholder(placeholderResId) + } + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/image/PicassoHelper.java b/app/src/main/java/org/schabi/newpipe/util/image/PicassoHelper.java deleted file mode 100644 index 4b116bdf906..00000000000 --- a/app/src/main/java/org/schabi/newpipe/util/image/PicassoHelper.java +++ /dev/null @@ -1,224 +0,0 @@ -package org.schabi.newpipe.util.image; - -import static org.schabi.newpipe.MainActivity.DEBUG; -import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty; -import static org.schabi.newpipe.util.image.ImageStrategy.choosePreferredImage; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.graphics.Bitmap; -import android.util.Log; - -import androidx.annotation.DrawableRes; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.core.graphics.BitmapCompat; - -import com.squareup.picasso.Cache; -import com.squareup.picasso.LruCache; -import com.squareup.picasso.OkHttp3Downloader; -import com.squareup.picasso.Picasso; -import com.squareup.picasso.RequestCreator; -import com.squareup.picasso.Transformation; - -import org.schabi.newpipe.R; -import org.schabi.newpipe.extractor.Image; - -import java.io.File; -import java.io.IOException; -import java.util.List; -import java.util.concurrent.TimeUnit; - -import okhttp3.OkHttpClient; - -public final class PicassoHelper { - private static final String TAG = PicassoHelper.class.getSimpleName(); - private static final String PLAYER_THUMBNAIL_TRANSFORMATION_KEY = - "PICASSO_PLAYER_THUMBNAIL_TRANSFORMATION_KEY"; - - private PicassoHelper() { - } - - private static Cache picassoCache; - private static OkHttpClient picassoDownloaderClient; - - // suppress because terminate() is called in App.onTerminate(), preventing leaks - @SuppressLint("StaticFieldLeak") - private static Picasso picassoInstance; - - - public static void init(final Context context) { - picassoCache = new LruCache(10 * 1024 * 1024); - picassoDownloaderClient = new OkHttpClient.Builder() - .cache(new okhttp3.Cache(new File(context.getExternalCacheDir(), "picasso"), - 50L * 1024L * 1024L)) - // this should already be the default timeout in OkHttp3, but just to be sure... - .callTimeout(15, TimeUnit.SECONDS) - .build(); - - picassoInstance = new Picasso.Builder(context) - .memoryCache(picassoCache) // memory cache - .downloader(new OkHttp3Downloader(picassoDownloaderClient)) // disk cache - .defaultBitmapConfig(Bitmap.Config.RGB_565) - .build(); - } - - public static void terminate() { - picassoCache = null; - picassoDownloaderClient = null; - - if (picassoInstance != null) { - picassoInstance.shutdown(); - picassoInstance = null; - } - } - - public static void clearCache(final Context context) throws IOException { - picassoInstance.shutdown(); - picassoCache.clear(); // clear memory cache - final okhttp3.Cache diskCache = picassoDownloaderClient.cache(); - if (diskCache != null) { - diskCache.delete(); // clear disk cache - } - init(context); - } - - public static void cancelTag(final Object tag) { - picassoInstance.cancelTag(tag); - } - - public static void setIndicatorsEnabled(final boolean enabled) { - picassoInstance.setIndicatorsEnabled(enabled); // useful for debugging - } - - - public static RequestCreator loadAvatar(@NonNull final List images) { - return loadImageDefault(images, R.drawable.placeholder_person); - } - - public static RequestCreator loadAvatar(@Nullable final String url) { - return loadImageDefault(url, R.drawable.placeholder_person); - } - - public static RequestCreator loadThumbnail(@NonNull final List images) { - return loadImageDefault(images, R.drawable.placeholder_thumbnail_video); - } - - public static RequestCreator loadThumbnail(@Nullable final String url) { - return loadImageDefault(url, R.drawable.placeholder_thumbnail_video); - } - - public static RequestCreator loadDetailsThumbnail(@NonNull final List images) { - return loadImageDefault(choosePreferredImage(images), - R.drawable.placeholder_thumbnail_video, false); - } - - public static RequestCreator loadBanner(@NonNull final List images) { - return loadImageDefault(images, R.drawable.placeholder_channel_banner); - } - - public static RequestCreator loadPlaylistThumbnail(@NonNull final List images) { - return loadImageDefault(images, R.drawable.placeholder_thumbnail_playlist); - } - - public static RequestCreator loadPlaylistThumbnail(@Nullable final String url) { - return loadImageDefault(url, R.drawable.placeholder_thumbnail_playlist); - } - - public static RequestCreator loadSeekbarThumbnailPreview(@Nullable final String url) { - return picassoInstance.load(url); - } - - public static RequestCreator loadNotificationIcon(@Nullable final String url) { - return loadImageDefault(url, R.drawable.ic_newpipe_triangle_white); - } - - - public static RequestCreator loadScaledDownThumbnail(final Context context, - @NonNull final List images) { - // scale down the notification thumbnail for performance - return PicassoHelper.loadThumbnail(images) - .transform(new Transformation() { - @Override - public Bitmap transform(final Bitmap source) { - if (DEBUG) { - Log.d(TAG, "Thumbnail - transform() called"); - } - - final float notificationThumbnailWidth = Math.min( - context.getResources() - .getDimension(R.dimen.player_notification_thumbnail_width), - source.getWidth()); - - final Bitmap result = BitmapCompat.createScaledBitmap( - source, - (int) notificationThumbnailWidth, - (int) (source.getHeight() - / (source.getWidth() / notificationThumbnailWidth)), - null, - true); - - if (result == source || !result.isMutable()) { - // create a new mutable bitmap to prevent strange crashes on some - // devices (see #4638) - final Bitmap copied = BitmapCompat.createScaledBitmap( - source, - (int) notificationThumbnailWidth - 1, - (int) (source.getHeight() / (source.getWidth() - / (notificationThumbnailWidth - 1))), - null, - true); - source.recycle(); - return copied; - } else { - source.recycle(); - return result; - } - } - - @Override - public String key() { - return PLAYER_THUMBNAIL_TRANSFORMATION_KEY; - } - }); - } - - @Nullable - public static Bitmap getImageFromCacheIfPresent(@NonNull final String imageUrl) { - // URLs in the internal cache finish with \n so we need to add \n to image URLs - return picassoCache.get(imageUrl + "\n"); - } - - - private static RequestCreator loadImageDefault(@NonNull final List images, - @DrawableRes final int placeholderResId) { - return loadImageDefault(choosePreferredImage(images), placeholderResId); - } - - private static RequestCreator loadImageDefault(@Nullable final String url, - @DrawableRes final int placeholderResId) { - return loadImageDefault(url, placeholderResId, true); - } - - private static RequestCreator loadImageDefault(@Nullable final String url, - @DrawableRes final int placeholderResId, - final boolean showPlaceholderWhileLoading) { - // if the URL was chosen with `choosePreferredImage` it will be null, but check again - // `shouldLoadImages` in case the URL was chosen with `imageListToDbUrl` (which is the case - // for URLs stored in the database) - if (isNullOrEmpty(url) || !ImageStrategy.shouldLoadImages()) { - return picassoInstance - .load((String) null) - .placeholder(placeholderResId) // show placeholder when no image should load - .error(placeholderResId); - } else { - final RequestCreator requestCreator = picassoInstance - .load(url) - .error(placeholderResId); - if (showPlaceholderWhileLoading) { - requestCreator.placeholder(placeholderResId); - } - return requestCreator; - } - } -} diff --git a/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenProviderImpl.kt b/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenProviderImpl.kt index 12fadb68d2c..53ae04a3c82 100644 --- a/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenProviderImpl.kt +++ b/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenProviderImpl.kt @@ -78,7 +78,7 @@ object PoTokenProviderImpl : PoTokenProvider { // create a new webPoTokenGenerator webPoTokenGenerator = PoTokenWebView - .newPoTokenGenerator(App.getApp()).blockingGet() + .newPoTokenGenerator(App.instance).blockingGet() // The streaming poToken needs to be generated exactly once before generating // any other (player) tokens. diff --git a/app/src/main/java/org/schabi/newpipe/util/text/TextViewExtensions.kt b/app/src/main/java/org/schabi/newpipe/util/text/TextViewExtensions.kt new file mode 100644 index 00000000000..d2efbf5411a --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/text/TextViewExtensions.kt @@ -0,0 +1,29 @@ +package org.schabi.newpipe.util.text + +import android.content.res.Resources +import android.text.SpannableString +import android.text.method.LinkMovementMethod +import android.text.util.Linkify +import android.util.Patterns +import android.widget.TextView +import androidx.annotation.StringRes +import androidx.core.text.parseAsHtml +import androidx.core.text.toHtml +import androidx.core.text.toSpanned + +/** + * Takes in a CharSequence [text] + * and makes raw HTTP URLs and HTML anchor tags clickable + */ +fun TextView.setTextWithLinks(text: CharSequence) { + val spanned = SpannableString(text) + // Using the pattern overload of addLinks since the one with the int masks strips all spans from the text before applying new ones + Linkify.addLinks(spanned, Patterns.WEB_URL, null) + this.text = spanned + this.movementMethod = LinkMovementMethod.getInstance() +} + +/** + * Gets text from string resource with [id] while preserving styling and allowing string format value substitution of [formatArgs] + */ +fun Resources.getText(@StringRes id: Int, vararg formatArgs: Any?): CharSequence = getText(id).toSpanned().toHtml().format(*formatArgs).parseAsHtml() diff --git a/app/src/main/java/org/schabi/newpipe/views/FocusOverlayView.java b/app/src/main/java/org/schabi/newpipe/views/FocusOverlayView.java index 29c38511c2e..9e06211f23a 100644 --- a/app/src/main/java/org/schabi/newpipe/views/FocusOverlayView.java +++ b/app/src/main/java/org/schabi/newpipe/views/FocusOverlayView.java @@ -40,7 +40,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; -import androidx.appcompat.view.WindowCallbackWrapper; import org.schabi.newpipe.R; @@ -232,7 +231,7 @@ private static void setupOverlay(final Window window, final FocusOverlayView ove // Unfortunately many such forms of "scrolling" do not count as scrolling for purpose // of dispatching ViewTreeObserver callbacks, so we have to intercept them by directly // receiving keys from Window. - window.setCallback(new WindowCallbackWrapper(window.getCallback()) { + window.setCallback(new SimpleWindowCallback(window.getCallback()) { @Override public boolean dispatchKeyEvent(final KeyEvent event) { final boolean res = super.dispatchKeyEvent(event); diff --git a/app/src/main/java/org/schabi/newpipe/views/SimpleWindowCallback.kt b/app/src/main/java/org/schabi/newpipe/views/SimpleWindowCallback.kt new file mode 100644 index 00000000000..46f58d24c93 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/views/SimpleWindowCallback.kt @@ -0,0 +1,39 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.views + +import android.os.Build +import android.view.KeyEvent +import android.view.KeyboardShortcutGroup +import android.view.Menu +import android.view.Window +import androidx.annotation.RequiresApi + +/** + * Simple window callback class to allow intercepting key events + * @see FocusOverlayView.setupOverlay + */ +open class SimpleWindowCallback(private val baseCallback: Window.Callback) : + Window.Callback by baseCallback { + + override fun dispatchKeyEvent(event: KeyEvent?): Boolean { + return baseCallback.dispatchKeyEvent(event) + } + + @RequiresApi(Build.VERSION_CODES.O) + override fun onPointerCaptureChanged(hasCapture: Boolean) { + baseCallback.onPointerCaptureChanged(hasCapture) + } + + @RequiresApi(Build.VERSION_CODES.N) + override fun onProvideKeyboardShortcuts( + data: List?, + menu: Menu?, + deviceId: Int + ) { + baseCallback.onProvideKeyboardShortcuts(data, menu, deviceId) + } +} diff --git a/app/src/main/java/us/shandian/giga/get/DownloadRunnableFallback.java b/app/src/main/java/us/shandian/giga/get/DownloadRunnableFallback.java index 1d2483e7947..b79ff59c35c 100644 --- a/app/src/main/java/us/shandian/giga/get/DownloadRunnableFallback.java +++ b/app/src/main/java/us/shandian/giga/get/DownloadRunnableFallback.java @@ -21,7 +21,7 @@ * Single-threaded fallback mode */ public class DownloadRunnableFallback extends Thread { - private static final String TAG = "DownloadRunnableFallback"; + private static final String TAG = "DLRunnableFallback"; private final DownloadMission mMission; diff --git a/app/src/main/java/us/shandian/giga/get/sqlite/FinishedMissionStore.java b/app/src/main/java/us/shandian/giga/get/sqlite/FinishedMissionStore.java index 704385212ab..215a6553b2f 100644 --- a/app/src/main/java/us/shandian/giga/get/sqlite/FinishedMissionStore.java +++ b/app/src/main/java/us/shandian/giga/get/sqlite/FinishedMissionStore.java @@ -102,14 +102,23 @@ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.beginTransaction(); while (cursor.moveToNext()) { ContentValues values = new ContentValues(); - values.put(KEY_SOURCE, cursor.getString(cursor.getColumnIndex(KEY_SOURCE))); - values.put(KEY_DONE, cursor.getString(cursor.getColumnIndex(KEY_DONE))); - values.put(KEY_TIMESTAMP, cursor.getLong(cursor.getColumnIndex(KEY_TIMESTAMP))); - values.put(KEY_KIND, cursor.getString(cursor.getColumnIndex(KEY_KIND))); + values.put( + KEY_SOURCE, + cursor.getString(cursor.getColumnIndexOrThrow(KEY_SOURCE)) + ); + values.put( + KEY_DONE, + cursor.getString(cursor.getColumnIndexOrThrow(KEY_DONE)) + ); + values.put( + KEY_TIMESTAMP, + cursor.getLong(cursor.getColumnIndexOrThrow(KEY_TIMESTAMP)) + ); + values.put(KEY_KIND, cursor.getString(cursor.getColumnIndexOrThrow(KEY_KIND))); values.put(KEY_PATH, Uri.fromFile( new File( - cursor.getString(cursor.getColumnIndex(KEY_LOCATION)), - cursor.getString(cursor.getColumnIndex(KEY_NAME)) + cursor.getString(cursor.getColumnIndexOrThrow(KEY_LOCATION)), + cursor.getString(cursor.getColumnIndexOrThrow(KEY_NAME)) ) ).toString()); @@ -141,7 +150,8 @@ private ContentValues getValuesOfMission(@NonNull Mission downloadMission) { } private FinishedMission getMissionFromCursor(Cursor cursor) { - String kind = Objects.requireNonNull(cursor).getString(cursor.getColumnIndex(KEY_KIND)); + String kind = Objects.requireNonNull(cursor) + .getString(cursor.getColumnIndexOrThrow(KEY_KIND)); if (kind == null || kind.isEmpty()) kind = "?"; String path = cursor.getString(cursor.getColumnIndexOrThrow(KEY_PATH)); diff --git a/app/src/main/java/us/shandian/giga/postprocessing/TtmlConverter.java b/app/src/main/java/us/shandian/giga/postprocessing/TtmlConverter.java index 8ed0dfae5de..d723bfb4561 100644 --- a/app/src/main/java/us/shandian/giga/postprocessing/TtmlConverter.java +++ b/app/src/main/java/us/shandian/giga/postprocessing/TtmlConverter.java @@ -29,9 +29,12 @@ int process(SharpStream out, SharpStream... sources) throws IOException { try { writer.build(sources[0]); + } catch (IOException err) { + Log.e(TAG, "subtitle conversion failed due to I/O error", err); + throw err; } catch (Exception err) { - Log.e(TAG, "subtitle parse failed", err); - return err instanceof IOException ? 1 : 8; + Log.e(TAG, "subtitle conversion failed", err); + throw new IOException("TTML to SRT conversion failed", err); } return OK_RESULT; diff --git a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java index 54ae2cfa4e7..45ffcb331b8 100644 --- a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java +++ b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java @@ -632,103 +632,95 @@ private boolean handlePopupItem(@NonNull ViewHolderItem h, @NonNull MenuItem opt DownloadMission mission = h.item.mission instanceof DownloadMission ? (DownloadMission) h.item.mission : null; if (mission != null) { - switch (id) { - case R.id.start: - h.status.setText(UNDEFINED_PROGRESS); - mDownloadManager.resumeMission(mission); - return true; - case R.id.pause: - mDownloadManager.pauseMission(mission); - return true; - case R.id.error_message_view: - showError(mission); - return true; - case R.id.queue: - boolean flag = !h.queue.isChecked(); - h.queue.setChecked(flag); - mission.setEnqueued(flag); - updateProgress(h); - return true; - case R.id.retry: - if (mission.isPsRunning()) { - mission.psContinue(true); - } else { - mDownloadManager.tryRecover(mission); - if (mission.storage.isInvalid()) - mRecover.tryRecover(mission); - else - recoverMission(mission); - } - return true; - case R.id.cancel: - mission.psContinue(false); - return false; - } - } - - switch (id) { - case R.id.menu_item_share: - shareFile(h.item.mission); + if (id == R.id.start) { + h.status.setText(UNDEFINED_PROGRESS); + mDownloadManager.resumeMission(mission); return true; - case R.id.delete: - // delete the entry and the file - mDeleter.append(h.item.mission, true); - applyChanges(); - checkMasterButtonsVisibility(); + } else if (id == R.id.pause) { + mDownloadManager.pauseMission(mission); return true; - case R.id.delete_entry: - // just delete the entry - mDeleter.append(h.item.mission, false); - applyChanges(); - checkMasterButtonsVisibility(); + } else if (id == R.id.error_message_view) { + showError(mission); return true; - case R.id.md5: - case R.id.sha1: - final StoredFileHelper storage = h.item.mission.storage; - if (!storage.existsAsFile()) { - Toast.makeText(mContext, R.string.missing_file, Toast.LENGTH_SHORT).show(); - mDeleter.append(h.item.mission, true); - applyChanges(); - return true; - } - final NotificationManager notificationManager - = ContextCompat.getSystemService(mContext, NotificationManager.class); - final NotificationCompat.Builder progressNotificationBuilder - = new NotificationCompat.Builder(mContext, - mContext.getString(R.string.hash_channel_id)) - .setPriority(NotificationCompat.PRIORITY_HIGH) - .setSmallIcon(R.drawable.ic_newpipe_triangle_white) - .setContentTitle(mContext.getString(R.string.msg_calculating_hash)) - .setContentText(mContext.getString(R.string.msg_wait)) - .setProgress(0, 0, true) - .setOngoing(true); - - notificationManager.notify(HASH_NOTIFICATION_ID, progressNotificationBuilder - .build()); - compositeDisposable.add( - Observable.fromCallable(() -> Utility.checksum(storage, id)) - .subscribeOn(Schedulers.computation()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(result -> { - ShareUtils.copyToClipboard(mContext, result); - notificationManager.cancel(HASH_NOTIFICATION_ID); - }) - ); + } else if (id == R.id.queue) { + boolean flag = !h.queue.isChecked(); + h.queue.setChecked(flag); + mission.setEnqueued(flag); + updateProgress(h); return true; - case R.id.source: - /*Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(h.item.mission.source)); - mContext.startActivity(intent);*/ - try { - Intent intent = NavigationHelper.getIntentByLink(mContext, h.item.mission.source); - intent.addFlags(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP); - mContext.startActivity(intent); - } catch (Exception e) { - Log.w(TAG, "Selected item has a invalid source", e); + } else if (id == R.id.retry) { + if (mission.isPsRunning()) { + mission.psContinue(true); + } else { + mDownloadManager.tryRecover(mission); + if (mission.storage.isInvalid()) + mRecover.tryRecover(mission); + else + recoverMission(mission); } return true; - default: + } else if (id == R.id.cancel) { + mission.psContinue(false); return false; + } + } + + if (id == R.id.menu_item_share) { + shareFile(h.item.mission); + return true; + } else if (id == R.id.delete) {// delete the entry and the file + mDeleter.append(h.item.mission, true); + applyChanges(); + checkMasterButtonsVisibility(); + return true; + } else if (id == R.id.delete_entry) {// just delete the entry + mDeleter.append(h.item.mission, false); + applyChanges(); + checkMasterButtonsVisibility(); + return true; + } else if (id == R.id.md5 || id == R.id.sha1) { + final StoredFileHelper storage = h.item.mission.storage; + if (!storage.existsAsFile()) { + Toast.makeText(mContext, R.string.missing_file, Toast.LENGTH_SHORT).show(); + mDeleter.append(h.item.mission, true); + applyChanges(); + return true; + } + final NotificationManager notificationManager + = ContextCompat.getSystemService(mContext, NotificationManager.class); + final NotificationCompat.Builder progressNotificationBuilder + = new NotificationCompat.Builder(mContext, + mContext.getString(R.string.hash_channel_id)) + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setSmallIcon(R.drawable.ic_newpipe_triangle_white) + .setContentTitle(mContext.getString(R.string.msg_calculating_hash)) + .setContentText(mContext.getString(R.string.msg_wait)) + .setProgress(0, 0, true) + .setOngoing(true); + + notificationManager.notify(HASH_NOTIFICATION_ID, progressNotificationBuilder + .build()); + compositeDisposable.add( + Observable.fromCallable(() -> Utility.checksum(storage, id)) + .subscribeOn(Schedulers.computation()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(result -> { + ShareUtils.copyToClipboard(mContext, result); + notificationManager.cancel(HASH_NOTIFICATION_ID); + }) + ); + return true; + } else if (id == R.id.source) { + try { + Intent intent = NavigationHelper.getIntentByLink(mContext, h.item.mission.source); + intent.addFlags(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP); + mContext.startActivity(intent); + } catch (Exception e) { + Log.w(TAG, "Selected item has a invalid source", e); + } + return true; } + return false; } public void applyChanges() { diff --git a/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java b/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java index 690ed4a9735..ddd9ba42607 100644 --- a/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java +++ b/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java @@ -186,23 +186,24 @@ public void onPrepareOptionsMenu(Menu menu) { @Override public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.switch_mode: - mLinear = !mLinear; - updateList(); - return true; - case R.id.clear_list: - showClearDownloadHistoryPrompt(); - return true; - case R.id.start_downloads: - mBinder.getDownloadManager().startAllMissions(); - return true; - case R.id.pause_downloads: - mBinder.getDownloadManager().pauseAllMissions(false); - mAdapter.refreshMissionItems();// update items view - default: - return super.onOptionsItemSelected(item); + int itemId = item.getItemId(); + if (itemId == R.id.switch_mode) { + mLinear = !mLinear; + updateList(); + return true; + } else if (itemId == R.id.clear_list) { + showClearDownloadHistoryPrompt(); + return true; + } else if (itemId == R.id.start_downloads) { + mBinder.getDownloadManager().startAllMissions(); + return true; + } else if (itemId == R.id.pause_downloads) { + mBinder.getDownloadManager().pauseAllMissions(false); + mAdapter.refreshMissionItems();// update items view + + return super.onOptionsItemSelected(item); } + return super.onOptionsItemSelected(item); } public void showClearDownloadHistoryPrompt() { diff --git a/app/src/main/res/drawable/ic_smart_display.xml b/app/src/main/res/drawable/ic_smart_display.xml index d666a3b3739..93d73aee511 100644 --- a/app/src/main/res/drawable/ic_smart_display.xml +++ b/app/src/main/res/drawable/ic_smart_display.xml @@ -5,6 +5,6 @@ android:viewportWidth="24" android:tint="@color/defaultIconTint"> diff --git a/app/src/main/res/layout-land/activity_player_queue_control.xml b/app/src/main/res/layout-land/activity_player_queue_control.xml index a5df5e56629..ad2655380c4 100644 --- a/app/src/main/res/layout-land/activity_player_queue_control.xml +++ b/app/src/main/res/layout-land/activity_player_queue_control.xml @@ -122,8 +122,8 @@ android:focusable="true" android:scaleType="fitCenter" android:src="@drawable/exo_controls_rewind" - android:tint="?attr/colorAccent" - android:contentDescription="@string/rewind" /> + android:contentDescription="@string/rewind" + app:tint="?attr/colorAccent" /> + android:contentDescription="@string/pause" + app:tint="?attr/colorAccent" /> + android:contentDescription="@string/forward" + app:tint="?attr/colorAccent" /> + android:contentDescription="@string/notification_action_repeat" + app:tint="?attr/colorAccent" /> + android:contentDescription="@string/notification_action_shuffle" + app:tint="?attr/colorAccent" /> + app:tint="?attr/colorAccent" /> + app:tint="?attr/colorAccent" /> diff --git a/app/src/main/res/layout/comment_replies_header.xml b/app/src/main/res/layout/comment_replies_header.xml index ed5ba1a1084..f99b101f725 100644 --- a/app/src/main/res/layout/comment_replies_header.xml +++ b/app/src/main/res/layout/comment_replies_header.xml @@ -24,6 +24,8 @@ android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginEnd="8dp" + android:layout_marginTop="16dp" + app:layout_goneMarginStart="16dp" android:ellipsize="end" android:lines="1" android:textAppearance="?android:attr/textAppearanceLarge" @@ -31,22 +33,21 @@ app:layout_constraintBottom_toTopOf="@+id/uploadDate" app:layout_constraintEnd_toStartOf="@+id/thumbsUpImage" app:layout_constraintStart_toEndOf="@+id/authorAvatar" - app:layout_constraintTop_toTopOf="@+id/authorAvatar" + app:layout_constraintTop_toTopOf="parent" tools:text="@tools:sample/lorem/random" /> @@ -57,9 +58,9 @@ android:layout_marginEnd="@dimen/video_item_detail_like_margin" android:contentDescription="@string/detail_likes_img_view_description" android:src="@drawable/ic_thumb_up" - app:layout_constraintBottom_toBottomOf="@+id/authorAvatar" + app:layout_constraintBottom_toBottomOf="@+id/uploadDate" app:layout_constraintEnd_toStartOf="@+id/thumbsUpCount" - app:layout_constraintTop_toTopOf="@+id/authorAvatar" /> + app:layout_constraintTop_toTopOf="@+id/authorName" /> + app:layout_constraintTop_toTopOf="@+id/authorName" /> %s مشارك جلب البيانات الوصفية… - إظهار مؤشرات الصور انقر للتنزيل %s تعطيل الوضع السريع , @@ -381,7 +380,7 @@ القنوات لا تظهر أدخل عنوان للمثيل - ماذا:\\nطلب:\\nلغة المحتوى:\\nبلد المحتوى:\\nلغة التطبيق:\\nالخدمات:\\nتوقيت جرينتش:\\nالحزمة:\\nالإصدار:\\nOS نسخة: + ماذا:\nطلب:\nلغة المحتوى:\nبلد المحتوى:\nلغة التطبيق:\nالخدمات:\nتوقيت جرينتش:\nالحزمة:\nالإصدار:\nOS نسخة: يزيل الصوت في بعض الجودات جلب ألسنة القنوات جودة عالية (أكبر) @@ -824,7 +823,6 @@ لقد اشتركت الآن في هذه القناة بدءًا من Android 10، يتم دعم \"Storage Access Framework\" فقط إنشاء اسم فريد - أظهر أشرطة ملونة لبيكاسو أعلى الصور تشير إلى مصدرها: الأحمر للشبكة والأزرق للقرص والأخضر للذاكرة فشل الاتصال الآمن يتوفر هذا الفيديو فقط لأعضاء YouTube Music Premium، لذلك لا يمكن بثه أو تنزيله من قبل NewPipe. البث السابق diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 51a1e47cb16..fd5f91553a0 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -109,7 +109,7 @@ أبلِغ معلومات: ماذا حدث: - ماذا:\\nطلب:\\nلغة المحتوى:\\nبلد المحتوى:\\nلغة التطبيق:\\nالخدمات:\\nتوقيت جرينتش:\\nالحزمة:\\nالإصدار:\\nOS نسخة: + ماذا:\nطلب:\nلغة المحتوى:\nبلد المحتوى:\nلغة التطبيق:\nالخدمات:\nتوقيت جرينتش:\nالحزمة:\nالإصدار:\nOS نسخة: تعليقك (باللغة الإنجليزية): التفاصيل: لم يتم العثور على نتائج @@ -668,8 +668,6 @@ معاينة مصغرة على شريط التمرير وضع علامة على تمت مشاهدته أُعجب بها منشئ المحتوى - أظهر أشرطة ملونة لبيكاسو أعلى الصور تشير إلى مصدرها: الأحمر للشبكة والأزرق للقرص والأخضر للذاكرة - إظهار مؤشرات الصور اقتراحات البحث عن بعد اقتراحات البحث المحلية اسحب العناصر لإزالتها @@ -905,4 +903,7 @@ تم تلقي خطأ HTTP 403 من الخادم أثناء التشغيل، ويرجح أن يكون السبب هو حظر عنوان IP أو مشكلات في إزالة التعتيم عن عنوان URL للبث رفض %1$s تقديم البيانات، وطلب تسجيل الدخول للتأكد من أن الطالب ليس روبوتًا.\n\nربما تم حظر عنوان IP الخاص بك مؤقتًا من قبل %1$s، يمكنك الانتظار بعض الوقت أو التبديل إلى عنوان IP مختلف (على سبيل المثال عن طريق تشغيل/إيقاف تشغيل VPN، أو التبديل من WiFi إلى بيانات الهاتف المحمول). هذا المحتوى غير متاح للبلد المحدد حاليًا.\n\nقم بتغيير اختيارك من ”الإعدادات > المحتوى > البلد الافتراضي للمحتوى“. + أعلنت Google أنه ابتداءً من عام 2026/2027، ستتطلب جميع التطبيقات على الأجهزة المعتمدة من Android من المطورين تقديم معلومات هويتهم الشخصية مباشرةً إلى Google. بما أن مطوري هذا التطبيق لا يوافقون على هذا الشرط، فلن يعمل هذا التطبيق على أجهزة Android المعتمدة بعد ذلك الوقت. + تفاصيل + حل diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index ee3396bc7af..212f9198830 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -490,8 +490,6 @@ Məlumat əldə edilir… Elementlərdə orijinal, əvvəlki vaxtı göstər Yaşam dövrəsi xaricindəki xətaları bildir - Şəkil göstəricilərini göstər - Şəkillərin üzərində mənbəsini göstərən Picasso rəngli lentləri göstər: şəbəkə üçün qırmızı, disk üçün mavi və yaddaş üçün yaşıl Bəzi endirmələri dayandırmaq mümkün olmasa da, mobil dataya keçərkən faydalıdır Bağla Fayl silindiyi üçün irəliləyiş itirildi @@ -577,7 +575,7 @@ Səs Təfərrüatlar: - Nə:\\nSorğu:\\nMəzmun Dili:\\nMəzmun Ölkəsi:\\nTətbiq Dili:\\nXidmət:\\nGMT Saatı:\\nPaket:\\nVersiya:\\nƏS versiyası: + Nə:\nSorğu:\nMəzmun Dili:\nMəzmun Ölkəsi:\nTətbiq Dili:\nXidmət:\nGMT Saatı:\nPaket:\nVersiya:\nƏS versiyası: Bağışlayın, nəsə səhv oldu. Formatlanmış hesabatı köçür Server URL\'sini daxil et @@ -827,4 +825,7 @@ 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 %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ə). Bu məzmun hazırda seçilən məzmun ölkəsi üçün əlçatan deyil. \n\nSeçiminizi \"Tənzimləmələr > Məzmun > İlkin məzmun ölkəsi\"- dən dəyişin. + 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. + Təfərrüatlar + Həll olunma diff --git a/app/src/main/res/values-b+ast/strings.xml b/app/src/main/res/values-b+ast/strings.xml index c64972eb3ed..e5fb76ae116 100644 --- a/app/src/main/res/values-b+ast/strings.xml +++ b/app/src/main/res/values-b+ast/strings.xml @@ -267,7 +267,7 @@ Llimpiar los metadatos de la caché Llimpióse la caché d\'imáxenes ¿Instalar Kode\? - Qué asocedió:\\nSolicitú:\\nLlingua del conteníu:\\nPaís del conteníu:\\nLlingua de l\'aplicación:\\nServiciu:\\nHora en GMT:\\nPaquete:\\nVersión de l\'aplicación:\\nVersión del SO: + Qué asocedió:\nSolicitú:\nLlingua del conteníu:\nPaís del conteníu:\nLlingua de l\'aplicación:\nServiciu:\nHora en GMT:\nPaquete:\nVersión de l\'aplicación:\nVersión del SO: Nun s\'atopó nengún reproductor de fluxos (pues instalar VLC pa reproducilos). Amuesa una miniatura nel fondu de la pantalla de bloquéu y dientro de los avisos Amosar una miniatura diff --git a/app/src/main/res/values-b+uz+Latn/strings.xml b/app/src/main/res/values-b+uz+Latn/strings.xml index cc82ec69c91..7e737235b96 100644 --- a/app/src/main/res/values-b+uz+Latn/strings.xml +++ b/app/src/main/res/values-b+uz+Latn/strings.xml @@ -279,7 +279,7 @@ Videoni ijro etish muddati, davomiyligi: Detallar: Sizning sharhingiz (ingliz tilida): - Nima: \\n So\'rov: \\nTarkib tili: \\nTarkib mamlakati: \\nIlova tili: \\ nXizmat: \\ nGMT vaqti: \\ nPaket: \\ nVersion: \\ nOS versiyasi: + Nima: \n So\'rov: \nTarkib tili: \nTarkib mamlakati: \nIlova tili: \\ nXizmat: \\ nGMT vaqti: \\ nPaket: \\ nVersion: \\ nOS versiyasi: Nima sodir bo\'ldi: Info: Hisobot diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index e44d2ea5cbd..16c940e6c45 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -146,7 +146,7 @@ Справаздача Інфармацыя: Што адбылося: - Што:\\nЗапыт:\\nМова кантэнту:\\nКраіна кантэнту:\\nМова праграмы:\\nСэрвіс:\\nЧас GMT:\\nПакет:\\nВерсія:\\nВерсія АС: + Што:\nЗапыт:\nМова кантэнту:\nКраіна кантэнту:\nМова праграмы:\nСэрвіс:\nЧас GMT:\nПакет:\nВерсія:\nВерсія АС: Ваш каментарый (па-англійску): Падрабязнасці: Прайграць відэа, працягласць: @@ -611,8 +611,6 @@ Перайсці на вэб-сайт Каб выдаліць элемент, змахніце яго ўбок Прыбраць пастаянную мініяцюру - Паказваць на відарысах указальнікі - Паказваць на відарысах каляровыя меткі Picasso, якія абазначаюць яго крыніцу: чырвоная — сетка, сіняя — дыск, зялёная — памяць Апрацоўка стужкі… Пры кожным спампоўванні вам будзе прапанавана выбраць месца захавання Загрузка канала… diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 5d0b079433b..d809219df53 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -204,7 +204,7 @@ Изтрива историята на възпроизвежданите стриймове и позицията на възпроизвеждането Не са намерени видео стриймове Не са намерени аудио стриймове - Какво:\\nЗаявка:\\nЕзик на съдържанието:\\nДържава на съдържанието:\\nЕзик на приложението:\\nУслуга:\\nGMT Време:\\nПакет:\\nВерсия:\\nВерсия на ОС: + Какво:\nЗаявка:\nЕзик на съдържанието:\nДържава на съдържанието:\nЕзик на приложението:\nУслуга:\nGMT Време:\nПакет:\nВерсия:\nВерсия на ОС: Пренареди чрез плъзгане Начало Преименувай @@ -518,7 +518,6 @@ Това видео е с възрастова граница. \n \nВключете „%1$s“ в настройките ако искате да го пуснете. - Покажи цветни Picasso-панделки в горната част на изображенията като индикатор за техния произход (червен – от мрежата, син – от диска и червен – от паметта) Автоматична (тази на устройството) Мащабиране на миниатюрата в известието от 16:9 към 1:1 формат (възможни са изкривявания) Избете плейлист @@ -788,7 +787,6 @@ NewPipe откри грешка, докоснете, за да докладвате Няма потоци Деактивиране на медийното тунелиране - Покажи индикатори за изображения В очакване Неуспешна последваща обработка Прекъсване на мрежи с измерване @@ -834,4 +832,7 @@ HTTP грешка 403, получена от сървъра по време на възпроизвеждане, вероятно причинена от забрана на IP адреса или проблеми с деобфускацията на URL адреси за стрийминг %1$s отказа да предостави данни, като поиска вход, за да потвърди, че заявителят не е бот.\n\nВашият IP адрес може да е временно забранен от %1$s. Можете да изчакате известно време или да превключите към друг IP адрес (например като включите/изключите VPN или като превключите от WiFi към мобилни данни). Това съдържание не е налично за текущо избраната държава на съдържанието.\n\nПроменете избора си от \"Настройки > Съдържание > Държава на съдържанието по подразбиране\". + През август 2025 г. Google обяви, че от септември 2026 г. инсталирането на приложения ще изисква проверка от разработчика за всички приложения за Android на сертифицирани устройства, включително тези, инсталирани извън Play Store. Тъй като разработчиците на NewPipe не са съгласни с това изискване, NewPipe вече няма да работи на сертифицирани устройства с Android след този период. + Детайли + Решение diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml index 2b0ffe91874..0d82e434b4d 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -103,7 +103,7 @@ reCAPTCHA চ্যালেঞ্জ reCAPTCHA চ্যালেঞ্জ অনুরোধ করা হয়েছে - কি:\\nঅনুরোধ:\\nকন্টেন্ট ভাষা:\\nসার্ভিস:\\nসময়(GMT এ):\\nপ্যাকেজ:\\nসংস্করণ:\\nওএস সংস্করণ:\\nআইপি পরিসর: + কি:\nঅনুরোধ:\nকন্টেন্ট ভাষা:\nসার্ভিস:\nসময়(GMT এ):\nপ্যাকেজ:\nসংস্করণ:\nওএস সংস্করণ:\nআইপি পরিসর: স্ট্রিম ফাইল ডাউনলোড করুন তথ্য দেখাও নতুন যা কিছু diff --git a/app/src/main/res/values-bn-rIN/strings.xml b/app/src/main/res/values-bn-rIN/strings.xml index a79319ee35f..17e317dfebb 100644 --- a/app/src/main/res/values-bn-rIN/strings.xml +++ b/app/src/main/res/values-bn-rIN/strings.xml @@ -33,7 +33,7 @@ ভিডিও প্রাকদর্শন, সময়ঃ বর্ণনা: আপনার মন্তব্য (ইংরেজিতে): - কি:\\nঅনুরোধ:\\nকন্টেন্ট ভাষা:\\nকন্টেন্ট দেশ:\\nঅ্যাপ ভাষা:\\nসার্ভিস:\\nসময়(GMT এ):\\nপ্যাকেজ:\\nসংস্করণ:\\nওএস সংস্করণ: + কি:\nঅনুরোধ:\nকন্টেন্ট ভাষা:\nকন্টেন্ট দেশ:\nঅ্যাপ ভাষা:\nসার্ভিস:\nসময়(GMT এ):\nপ্যাকেজ:\nসংস্করণ:\nওএস সংস্করণ: কি হয়েছিল: তথ্য: প্রতিবেদন @@ -309,6 +309,6 @@ কিছু না হ্যাঁ না - সার্চ - খুঁজুন + সার্চ %1$s + খুঁজুন %1$s (%2$s) diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 7a4c8b3b044..0d4fbd99c06 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -114,7 +114,7 @@ ভিডিও চালাও, সময়ঃ বর্ণনা: তোমার মন্তব্য (ইংরেজিতে): - কি:\\nঅনুরোধ:\\nকন্টেন্ট ভাষা:\\nসার্ভিস:\\nসময়(GMT এ):\\nপ্যাকেজ:\\nসংস্করণ:\\nওএস সংস্করণ:\\nআইপি পরিসর: + কি:\nঅনুরোধ:\nকন্টেন্ট ভাষা:\nসার্ভিস:\nসময়(GMT এ):\nপ্যাকেজ:\nসংস্করণ:\nওএস সংস্করণ:\nআইপি পরিসর: কি হয়েছিল: তথ্য: প্রতিবেদন @@ -584,7 +584,6 @@ নতুন ধারা কম্পাঙ্ক দেখো পূর্বদর্শন রেখার মাধ্যমে প্রাকদর্শন - ছবিরূপ সূচক দেখাও দেখিও না যেকোনো নেটওয়ার্ক পরেরটা ক্রমে রাখা হয়েছে diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index ee4fc3317b0..d422dbe9111 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -268,7 +268,7 @@ Prijavi Info: Šta se dogodilo: - Šta:\\nZahtjev:\\nJezik sadržaja:\\nZemlja sadržaja:\\nJezik aplikacije:\\nUsluga:\\nVremenska oznaka:\\nPaket:\\nVerzija:\\nVerzija OS-a: + Šta:\nZahtjev:\nJezik sadržaja:\nZemlja sadržaja:\nJezik aplikacije:\nUsluga:\nVremenska oznaka:\nPaket:\nVerzija:\nVerzija OS-a: Vaš komentar (na engleskom): Detalji: Reproduciraj video, trajanje: @@ -449,8 +449,6 @@ Onemogući tuneliranje medija Onemogućite tuneliranje medija ako se pojavi crni ekran ili se prilikom reprodukcije videa pojavi prekid. Tuneliranje medija je onemogućeno prema zadanim postavkama na vašem uređaju jer je poznato da vaš model uređaja to ne podržava. - Prikaži indikatore slike - Prikažite Picasso obojene trake preko slika koje označavaju njihov izvor: crvena za mrežu, plava za disk i zelena za memoriju Prikaži \"Sruši plejer\" Prikazuje opciju pada sistema prilikom korištenja plejera Pokreni provjeru za nove tokove diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index ff12819f509..64dd7a4a959 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -268,7 +268,7 @@ Acaba de reproduir la cua (sense repetició) quan s\'hi afegeixi un vídeo relacionat Mostra l\'indicador «Mantenir per posar a la cua» Mostra un missatge d\'ajuda quan el botó de mode en segon pla o emergent estigui premut a la pàgina de detalls d\'un vídeo - Què ha passat:\\nPetició:\\nIdioma del contingut:\\nPaís del contingut:\\nLlengua de l\'aplicació:\\nServei:\\nHora GMT:\\nPaquet:\\nVersió:\\nVersió del SO: + Què ha passat:\nPetició:\nIdioma del contingut:\nPaís del contingut:\nLlengua de l\'aplicació:\nServei:\nHora GMT:\nPaquet:\nVersió:\nVersió del SO: Acció d\'obertura preferida Acció per defecte en obrir continguts — %s La supervisió de fugues de memòria pot fer que l\'aplicació deixi de respondre mentre es bolca la memòria @@ -621,7 +621,6 @@ No mostris Baixa qualitat (més petit) Alta qualitat (més gran) - Mostra indicadors de la imatge Desactiva l\'entunelament del contingut si en reproduir el vídeos la pantalla se\'n va a negre o s\'entretallen. Mostra detalls del canal No s\'ha establert una carpeta de descàrregues, selecciona la carpeta per defecte ara @@ -665,7 +664,6 @@ Comentari fixat Mostra \"Força el tancament del reproductor\" Mostra una opció de fallada quan s\'utilitza el reproductor - Mostra les cintes de color Picasso a la part superior de les imatges que indiquen la seva font: vermell per a la xarxa, blau per al disc i verd per a la memòria El LeakCanary no està disponible Comprovant freqüència Es necesita una conexió a Internet diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml index d448c111886..23baa512c84 100644 --- a/app/src/main/res/values-ckb/strings.xml +++ b/app/src/main/res/values-ckb/strings.xml @@ -12,7 +12,7 @@ \n \nبۆیە هەڵژرادن بۆ خۆت دەگەڕێتەوە: زانیاری تەواو یان خێرا.
نیوپایپ نه‌رمه‌والایه‌كی سەرچاوە کراوەیە : دەتوانیت بەکاریبهێنیت، بیخوێنیتەوە، هاوبەشی پێبکەیت ،بەرەوپێشی ببەیت. بەتایبەتی دەتوانی دابەشیبکەیتەوە یاخوود بگۆڕیت بەپێی مەرجەکانی GNU مۆڵەتنامەی گشتی وەک نه‌رمه‌واڵایه‌كی بڵاوی خۆڕایی, بەهۆی وەشانی ٣ ی مۆڵەتنامە، یان هەر وەشانێکی دوواتر. - چی:\\nداواكاری:\\nزمانی بابەت:\\nوڵاتی بابەت:\\nزمانی به‌رنامه‌:\\nخزمه‌تگوزاری:\\nGMT كات:\\nپاكێج:\\nوه‌شان:\\nOS وه‌شان: + چی:\nداواكاری:\nزمانی بابەت:\nوڵاتی بابەت:\nزمانی به‌رنامه‌:\nخزمه‌تگوزاری:\nGMT كات:\nپاكێج:\nوه‌شان:\nOS وه‌شان: پڕۆژەی نیوپایپ زانیارییە تایبەتییەکانت بە وردی دەپارێزێت. هەروەها به‌رنامه‌كه‌ هیچ زانایارییەکت بەبێ ئاگاداری تۆ بەکارنابات. \n‫سیاسەتی تایبەتی نیوپایپ بە وردی ڕوونکردنەوەت دەداتێ لەسەر ئەو زانیاریانەی وەریاندەگرێت و بەکاریاندەبات. ناتوانرێت لە بیرگەی دەرەکیدا داببەزێنرێت . شوێنی فۆڵده‌ری دابه‌زاندنەکان ڕێکبخرێتەوە؟ @@ -625,8 +625,6 @@ پیشان نەدرێت کواڵێتی نزم (بچووکتر) کواڵێتی بەرز (گەورەتر) - پیشاندانی شریتە ڕەنگکراوەکانی پیکاسۆ لەسەرووی وێنەکانەوە بۆ بەدیار خستنی سەرچاوەکانیان : سوور بۆ تۆڕ ، شین بۆ دیسک و سەوز بۆ بیرگە - پیشاندانی دیارخەرەکانی وێنە پێشنیازکراوەکانی گەڕانی ڕیمۆت پێشنیازکراوەکانی گەڕانی نێوخۆیی دیارکردن وەک بینراو diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 4c219d6d4f7..e51fa355c3f 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -81,7 +81,7 @@ Černé Kontrolní součet Určete prosím složku pro stahování později v nastavení - Co:\\nŽádost:\\nJazyk obsahu:\\nZemě obsahu:\\nJazyk aplikace:\\nSlužba:\\nČas GMT:\\nBalíček:\\nVerze:\\nVerze OS: + Co:\nŽádost:\nJazyk obsahu:\nZemě obsahu:\nJazyk aplikace:\nSlužba:\nČas GMT:\nBalíček:\nVerze:\nVerze OS: Vše Otevřít ve vyskakovacím okně Toto oprávnění je vyžadováno @@ -648,8 +648,6 @@ %s stahování dokončena %s stahováních dokončeno - Zobrazit barevné pásky Picasso na obrázcích označujících jejich zdroj: červená pro síť, modrá pro disk a zelená pro paměť - Zobrazit indikátory obrázků Vzdálené návrhy vyhledávání Lokální návrhy vyhledávání Pokud je vypnuté automatické otáčení, nespouštět video v mini přehrávači, ale přepnout se přímo do režimu celé obrazovky. Do mini přehrávače se lze i nadále dostat ukončením režimu celé obrazovky @@ -863,4 +861,7 @@ Chyba HTTP 403 obdržená od serveru během přehrávání, pravděpodobně způsobená zákazem IP adresy nebo problémy s deobfuskací streamovací adresy URL %1$s odmítl poskytnout data, žádá o přihlášení k potvrzení, že žadatel není bot.\n\nVaše IP adresa mohla být dočasně zakázána %1$s, můžete nějakou dobu počkat nebo přepnout na jinou IP adresu (například zapnutím/vypnutím VPN nebo přepnutím z WiFi na mobilní data). Tento obsah není pro aktuálně vybranou zemi obsahu dostupný.\n\nZměňte výběr v nabídce \"Nastavení > Obsah > Výchozí země obsahu\". + Společnost Google oznámila, že od roku 2026/2027 budou všechny aplikace na certifikovaných zařízeních Android vyžadovat, aby vývojář odeslal své osobní identifikační údaje přímo společnosti Google. Jelikož vývojáři této aplikace s tímto požadavkem nesouhlasí, aplikace po tomto datu přestane na certifikovaných zařízeních Android fungovat. + Podrobnosti + Řešení diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index f3a25e3b7e5..7b14885e7ee 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -317,7 +317,7 @@ Start afspilning i et popup Åbn Skuffe Luk Skuffe - Hvad:\\nForespørgsel:\\nIndholdssprog:\\nIndholdsland:\\nApp-sprog:\\nTjeneste:\\nGMT-tid:\\nPakke:\\nVersion:\\nOS-version: + Hvad:\nForespørgsel:\nIndholdssprog:\nIndholdsland:\nApp-sprog:\nTjeneste:\nGMT-tid:\nPakke:\nVersion:\nOS-version: Standardhandling ved åbning af indhold — %s Anvend som playlistens miniaturebillede Bogmærk Playliste @@ -512,7 +512,6 @@ Behandler… Det kan tage et øjeblik Vis hukommelseslækager Deaktivér medietunneling - Vis billedindikatorer Netværkskrav Alle netværk Kontrolfrekvens @@ -689,7 +688,6 @@ Ofte stillede spørgsmål Hvis du har problemer med at bruge appen, bør du tjekke disse svar på almindelige spørgsmål! Se på hjemmesiden - Vis Picasso-farvede bånd oven på billeder, der angiver deres kilde: rød for netværk, blå for disk og grøn for hukommelse Du kører den nyeste version af NewPipe Grundet ExoPlayer-begrænsninger blev søgevarigheden sat til %d sekunder Vis kun ugrupperede abonnementer diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 1b4800a8f4b..a0c7f3d4375 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -54,7 +54,7 @@ Melden Info: Dies ist passiert: - Was:\\nAnfrage:\\nSprache des Inhalts:\\nLand des Inhalts:\\nSprache der App:\\nDienst:\\nZeit (GMT):\\nPaket:\\nVersion:\\nOS-Version: + Was:\nAnfrage:\nSprache des Inhalts:\nLand des Inhalts:\nSprache der App:\nDienst:\nZeit (GMT):\nPaket:\nVersion:\nOS-Version: Details: Video Audio @@ -631,8 +631,6 @@ Aus Als gesehen markieren Vom Ersteller mit Herz versehen - Farbige Picasso-Bänder über den Bildern anzeigen, die deren Quelle angeben: rot für Netzwerk, blau für Festplatte und grün für Speicher - Bildindikatoren anzeigen Entfernte Suchvorschläge Lokale Suchvorschläge @@ -849,4 +847,7 @@ HTTP-Fehler 403 vom Server während der Wiedergabe erhalten, wahrscheinlich verursacht durch eine IP-Sperre oder Probleme beim Entschlüsseln der Streaming-URL %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). Dieser Inhalt ist für das aktuell ausgewählte Land des Inhalts nicht verfügbar.\n\nÄndere die Auswahl unter „Einstellungen > Inhalt > Bevorzugtes Land des Inhalts“. + 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. + Details + Lösung diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index ac93470bcf1..e1bf4dc040c 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -163,7 +163,7 @@ Λυπούμαστε, αυτό δεν έπρεπε να έχει συμβεί. Αναφορά μέσω ηλεκτρονικού ταχυδρομείου Συγγνώμη, κάτι πήγε στραβά. - Τι:\\nΑίτημα:\\nΓλώσσα περιεχομένου:\\nΧώρα περιεχομένου:\\nΓλώσσα εφαρμογής:\\nΥπηρεσία:\\nΏρα GMT:\\nΠακέτο:\\nΈκδοση:\\nΈκδοση λειτουργικού συστήματος: + Τι:\nΑίτημα:\nΓλώσσα περιεχομένου:\nΧώρα περιεχομένου:\nΓλώσσα εφαρμογής:\nΥπηρεσία:\nΏρα GMT:\nΠακέτο:\nΈκδοση:\nΈκδοση λειτουργικού συστήματος: Κανένα αποτέλεσμα Δεν υπάρχει τίποτα εδώ Σύρετε για ταξινόμηση @@ -628,8 +628,6 @@ Προεπισκόπηση στην μπάρα αναζήτησης Σήμανση ως αναπαραχθέν Επισημάνθηκε από τον δημιουργό - Εμφάνιση χρωματιστής κορδέλας πάνω στις εικόνες, που δείχνει την πηγή τους: κόκκινη για δίκτυο, μπλε για δίσκο και πράσινο για μνήμη - Εμφάνιση δεικτών εικόνων Προτάσεις απομακρυσμένης αναζήτησης Προτάσεις τοπικής αναζήτησης @@ -849,4 +847,7 @@ Σφάλμα HTTP 403 ελήφθη από τον διακομιστή κατά την αναπαραγωγή, πιθανώς λόγω αποκλεισμού IP ή προβλημάτων απεμπλοκής URL ροής Ο %1$s αρνήθηκε να παράσχει δεδομένα, ζητώντας σύνδεση για να επιβεβαιώσει ότι ο αιτών δεν είναι bot.\n\nΗ IP σας ενδέχεται να έχει αποκλειστεί προσωρινά από τον %1$s. Μπορείτε να περιμένετε λίγο ή να αλλάξετε IP (για παράδειγμα, ενεργοποιώντας/απενεργοποιώντας ένα VPN ή αλλάζοντας από WiFi σε δεδομένα κινητής τηλεφωνίας). Αυτό το περιεχόμενο δεν είναι διαθέσιμο για την τρέχουσα επιλεγμένη χώρα περιεχομένου.\n\nΑλλάξτε την επιλογή σας από \"Ρυθμίσεις > Περιεχόμενο > Προεπιλεγμένη χώρα περιεχομένου\". + Λεπτομέρειες + Λύση + Τον Αύγουστο του 2025, η Google ανακοίνωσε ότι από τον Σεπτέμβριο του 2026, η εγκατάσταση εφαρμογών θα απαιτεί επαλήθευση προγραμματιστή για όλες τις εφαρμογές Android σε πιστοποιημένες συσκευές, συμπεριλαμβανομένων εκείνων που είναι εγκατεστημένες εκτός του Play Store. Δεδομένου ότι οι προγραμματιστές του NewPipe δεν συμφωνούν με αυτήν την απαίτηση, το NewPipe δεν θα λειτουργεί πλέον σε πιστοποιημένες συσκευές Android μετά από αυτό το χρονικό διάστημα. diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index cc42c042660..e1b1bede2ce 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -242,7 +242,7 @@ Pardonu, eraro okazis. Pardonon, io mizokasis. Kio okazis: - Kio:\\nPeto:\\nEnhavlingvo:\\nEnhavlando:\\nAplingvo:\\nServo:\\nGMT Horo:\\nPako:\\nVersio:\\nOperaciumo versio: + Kio:\nPeto:\nEnhavlingvo:\nEnhavlando:\nAplingvo:\nServo:\nGMT Horo:\nPako:\nVersio:\nOperaciumo versio: Aŭdio Komenci Paŭzigi diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index a2ab5ca5220..43d34e91cd0 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -78,7 +78,7 @@ Copiado al portapapeles Defina una carpeta de descargas más tarde en los ajustes La interfaz de la aplicación dejó de funcionar - Qué:\\nSolicitud:\\nIdioma del contenido:\\nPaís del contenido:\\nIdioma de la aplicación:\\nServicio:\\nMarca de tiempo:\\nPaquete:\\nVersión:\\nVersión del SO: + Qué:\nSolicitud:\nIdioma del contenido:\nPaís del contenido:\nIdioma de la aplicación:\nServicio:\nMarca de tiempo:\nPaquete:\nVersión:\nVersión del SO: Negro Todo Abrir en modo emergente @@ -513,8 +513,8 @@ Canciones Este vídeo tiene restricción de edad. \n \nHabilitar \"%1$s\" en los ajustes si quieres verlo. Sí, y también vídeos vistos parcialmente - Los vídeos que ya se hayan visto luego de añadidos a la lista de reproducción, serán quitados. \n¿Estás seguro? ¡Esta acción no se puede deshacer! - ¿Quitar vídeos ya vistos? + Los vídeos que ya se hayan visto antes y después de ser añadidos a la lista de reproducción serán quitados. \n¿Estás seguro? + ¿Quitar streams ya vistos? Quitar vídeos ya vistos Por %s Creado por %s @@ -631,8 +631,6 @@ Los comentarios están deshabilitados De corazón por el creador Marcar como visto - Mostrar cintas de colores Picasso encima de las imágenes indicando su origen: rojo para la red, azul para el disco y verde para la memoria - Mostrar indicadores de imagen Sugerencias de búsqueda remota Sugerencias de búsqueda local @@ -853,4 +851,7 @@ %sMM Este contenido no está disponible para el país seleccionado actualmente.\n\nCambia tu selección en «Ajustes > Contenido > País predefinido del contenido». Para usar el reproductor emergente, seleccione %1$s en el siguiente menú de la configuración de Android y habilite %2$s. + 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. + Detalles + Solución diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 6459c05a0f9..262bacaa5a5 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -141,7 +141,7 @@ Teata Info: Mis juhtus: - Mis:\\nPäring:\\nSisu keel:\\nSisu maa:\\nRakenduse keel:\\nTeenus:\\nGMT aeg:\\nPakett:\\nVersioon:\\nOS versioon: + Mis:\nPäring:\nSisu keel:\nSisu maa:\nRakenduse keel:\nTeenus:\nGMT aeg:\nPakett:\nVersioon:\nOS versioon: Oma kommentaar (inglise keeles): Üksikasjad: Esita video, kestus: @@ -614,8 +614,6 @@ Südamlik autor Kas sinu meelest on voo laadimine aeglane? Sel juhul proovi lubada kiire laadimine (seda saad muuta seadetes või vajutades allolevat nuppu). \n \nNewPipe pakub kahte voo laadimise strateegiat: \n• Tellitud kanali täielik, kuid aeglane hankimine. \n• Teenuse spetsiaalse otspunkti kasutamine, mis on kiire, kuid tavaliselt mittetäielik. \n \nErinevus nende kahe vahel seisneb selles, et kiirel puudub tavaliselt teave, näiteks üksuse pikkus või tüüp (ei saa eristada reaalajas videoid tavalistest) ja see võib tagastada vähem üksusi. \n \nYouTube on näide teenusest, mis pakub seda kiirmeetodit oma RSS-vooga. \n \nNii et valik taandub sellele, mida eelistad: kiirus või täpne teave. Märgi vaadatuks - Näita piltide kohal Picasso värvides riba, mis märgib pildi allikat: punane tähistab võrku, sinine kohalikku andmekandjat ja roheline kohalikku mälu - Näita piltide allikat Kaugotsingu soovitused Kohaliku otsingu soovitused Üksuse eemaldamiseks viipa @@ -834,4 +832,7 @@ Esitamise ajal lisas server andmevoogu HTTP oleku 403 ning tavaliselt tähendab see, et sinu seadme IP-aadress on keelatud või voogedastuse võrguaadressi hägustamisvastastes meetmetes on viga See sisu pole saadaval hetkel kehtvas riigis.\n\nRiiki saad muuta: Seadistused > Sisu > Sisu vaikimisi riik. %1$s keeldus andmete edastamisest ning eeldab sisselogimist tuvastamaks, et tegemist pole robotiga.\n\nLisaks võib olla juhtunud, et %1$s on lisanud sinu seadme ip-aadressi ajutisse keelunimekirja. Sa võid oodata natuke aega või vahetada võrguühendus viisi (näiteks lülitades VPN sisse/välja või kasutades WiFi asemel mobiilset internetiühendust). + 2025. aasta augustis teatas Google, et alates septembrist 2026 uute rakenduste paigaldamine kõikides uutes Androidi seadmetes eeldab arendajate verifitseerimist, sealhulgas juhtudel, kui selline rakendus on paigaldatud väljastpoolt Google Play rakendustepoodi. Kuna NewPipe\'i arendajad pole sellise nõudmisega nõus, siis sellise aja saabumisel NewPipe enam ei toimi sertifitseeritud Androidi seadmetes. + Üksikasjad + Lahendus diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 1bac3b498a3..f4883546045 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -78,7 +78,7 @@ Salatu Informazioa: Zer gertatu da: - Zer:\\nEskaria:\\nEdukiaren hizkuntza:\\nEdukiaren herrialdea:\\nAplikazioaren hizkuntza:\\nZerbitzua:\\nDenbora-zigilua:\\nPaketea:\\nBertsioa:\\nSE bertsioa: + Zer:\nEskaria:\nEdukiaren hizkuntza:\nEdukiaren herrialdea:\nAplikazioaren hizkuntza:\nZerbitzua:\nDenbora-zigilua:\nPaketea:\nBertsioa:\nSE bertsioa: Zure iruzkina (Ingelesez): Xehetasunak: Bideoa @@ -494,8 +494,8 @@ Kanalaren avatarraren miniatura Erakutsi taldekatuta ez dauden harpidetzak soilik Bai, partzialki ikusitako bideoak ere bai - Dagoeneko ikusi eta gero erreprodukzio-zerrendara gehitu diren bideoak kendu egingo dira. \nJarraitu nahi duzu? Ekintza hau ezin da desegin! - Ikusitako bideoak kendu? + Dagoeneko ikusi eta gero erreprodukzio-zerrendara gehitu diren igorpenak kendu egingo dira. \nJarraitu nahi duzu? + Ikusitako igorpenak kendu? Kendu ikusitako bideoak Inoiz ez WiFi-arekin soilik @@ -616,8 +616,6 @@ Deskarga amaituta %s deskarga amaituta - Irudien gainean Picasso koloretako zintak erakutsi, jatorria adieraziz: gorria sarerako, urdina diskorako eta berdea memoriarako - Erakutsi irudi-adierazleak Urruneko bilaketa-iradokizunak Tokiko bilaketa-iradokizunak Ikusitako gisa markatu diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index cd2d1ec32ef..70ea7293880 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -275,7 +275,7 @@ نمایش راهنما هنگام فشردن پس زمینه یا دکمهٔ تصویر در تصویر در «جزییات:» ویدیو برای در صف قرار دادن، نگه دارید بازگردانی - چی:\\nدرخواست:\\nزبان محتوا:\\nکشور محتوا:\\nزبان اپ:\\nخدمت:\\nزمان GMT\\nپکیج:T:\\nنسخه:\\nنسخه‌اندروید: + چی:\nدرخواست:\nزبان محتوا:\nکشور محتوا:\nزبان اپ:\nخدمت:\nزمان GMT\nپکیج:T:\nنسخه:\nنسخه‌اندروید: چالش ری‌کپچا نیاز به چالش ری‌کپچا است این اجازه برای گشودن در حالت @@ -592,7 +592,6 @@ رنگی کردن آگاهی گشودن با نشانه به عنوان دیده شده - نمایش روبان‌های رنگی پیکاسو در بالای تصویرها کهنشانگر منبعشان است: قرمز برای شبکه ، آبی برای دیسک و سبز برای حافظه درخواست از اندروید برای سفارشی‌سازی رنگ آگاهی براساس رنگ اصلی در بندانگشتی (توجّه داشته باشید که روی همهٔ افزاره‌ها در دسترس نیست) این ویدیو محدود به سن است. \n @@ -629,7 +628,6 @@ قلب‌شده به دست ایجادگر پیشنهادهای جست‌وجوی محلّی پیشنهادهای جست‌وجوی دوردست - نمایش نشانگرهای تصویر بارگیری پایان یافت %s بارگیری پایان یافتند diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 3f66a85eb8c..ee470a3cc53 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -155,7 +155,7 @@ Haluatko poistaa tämän hakuhistoriasta? Jatka toistoa Info: - Mikä:\\nPyyntö:\\nSisällön kieli:\\nSisällön maa:\\n:Sovelluksen kieli:\\nPalvelu:\\nGMT Aika:\\nPaketti:\\nVersio:\\nOS versio: + Mikä:\nPyyntö:\nSisällön kieli:\nSisällön maa:\n:Sovelluksen kieli:\nPalvelu:\nGMT Aika:\nPaketti:\nVersio:\nOS versio: © %1$s %2$s %3$s alla Pääsivun sisältö Tyhjä sivu @@ -628,8 +628,6 @@ Latauskansiota ei vielä asetettu, valitse ensin oletuslatauskansio Kommentit poistettu käytöstä Merkitse katsotuksi - Näytä Picasso-värjätyt nauhat kuvien päällä osoittaakseen lähteen: punainen tarkoittaa verkkoa, sininen tarkoittaa levytilaa ja vihreä tarkoittaa muistia - Näytä kuvailmaisimet Etähakuehdotukset Paikalliset hakuehdotukset Lisää seuraavaksi diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index efd735bc80b..c83ce3c9990 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -86,7 +86,7 @@ Ouvrir en mode flottant Lecture en mode flottant Désactivés - Quoi :\\nRequest :\\nContent Language :\\nContent Country :\\nApp Language :\\nService :\\nGMT Time :\\nPackage :\\nVersion :\\nOS version : + Quoi :\nRequest :\nContent Language :\nContent Country :\nApp Language :\nService :\nGMT Time :\nPackage :\nVersion :\nOS version : Cette autorisation est nécessaire pour \nutiliser le mode flottant Arrière-plan @@ -640,10 +640,8 @@ Prévisualisation de la barre de progression sur la miniature Marquer comme visionné Apprécié par le créateur - Afficher les indicateurs d’image Suggestions de recherche distante Suggestions de recherche locale - Affiche les rubans colorés de Picasso au-dessus des images indiquant leur source : rouge pour le réseau, bleu pour le disque et vert pour la mémoire %1$s téléchargement supprimé %1$s téléchargements supprimés @@ -865,4 +863,7 @@ Erreur HTTP 403 reçue du serveur pendant la lecture, probablement causée par un bannissement d\'IP ou des problèmes de désobfuscation de l\'URL de streaming %1$s a refusé de fournir des données et a demandé un identifiant pour confirmer que le demandeur n\'est pas un robot.\n\nVotre adresse IP a peut-être été temporairement bannie par %1$s. Vous pouvez patienter un peu ou changer d\'adresse IP (par exemple en activant/désactivant un VPN, ou en passant du Wi-Fi aux données mobiles). Ce contenu n\'est pas disponible pour le pays actuellement sélectionné.\n\nModifiez votre sélection dans « Paramètres > Contenu > Pays par défaut ». + En août 2025, Google a annoncé qu\'à compter de septembre 2026, l\'installation d\'applications nécessiterait une vérification par le développeur pour toutes les applications Android sur les appareils certifiés, y compris celles installées en dehors du Play Store. Les développeurs de NewPipe refusant cette exigence, NewPipe ne fonctionnera plus sur les appareils Android certifiés après cette date. + Détails + Solution diff --git a/app/src/main/res/values-gd/strings.xml b/app/src/main/res/values-gd/strings.xml new file mode 100644 index 00000000000..55344e51920 --- /dev/null +++ b/app/src/main/res/values-gd/strings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 6c7fa3e3c2f..c3873c2a405 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -145,7 +145,7 @@ Informe Información: Que ocorreu: - Que: \\n Solicitar: \\n Idioma de contido: \\n País de contido: \\n Idioma do aplicativo: \\nServicio: \\n Tempo GMT: \\n Paquete: \\n Versión: \\n versión de nOS: + Que: \n Solicitar: \n Idioma de contido: \n País de contido: \n Idioma do aplicativo: \nServicio: \n Tempo GMT: \n Paquete: \n Versión: \n versión de nOS: O teu comentario (en inglés): Detalles: Reproducir o vídeo, duración: @@ -621,7 +621,6 @@ %s descargas finalizadas Miniatura na barra de busca - Mostrar indicadores de imaxe Desactive o túnel multimedia se experimentar unha pantalla en negro ou interrupcións na reprodución. Desactivar túnel multimedia Engadido á cola @@ -658,7 +657,6 @@ A partir do Android 10, só o \'Sistema de Acceso ao Almacenamento\' está soportado Procesando... Pode devagar un momento Crear unha notificación de erro - Amosar fitas coloridas de Picasso na cima das imaxes que indican a súa fonte: vermello para a rede, azul para o disco e verde para a memoria Novos elementos Predefinido do ExoPlayer Amosar \"Travar o reprodutor\" diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 24d916464a0..cfcf05e6dbe 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -73,7 +73,7 @@ דיווח מידע: מה קרה: - מה:\\nבקשה:\\nשפת התוכן:\\nמדינת התוכן:\\nשפת היישומון:\\nשירות:\\nשעון גריניץ׳:\\nחבילה:\\nגרסה:\\nגרסת מערכת ההפעלה: + מה:\nבקשה:\nשפת התוכן:\nמדינת התוכן:\nשפת היישומון:\nשירות:\nשעון גריניץ׳:\nחבילה:\nגרסה:\nגרסת מערכת ההפעלה: רישום למינוי נרשמת ביטול מינוי לערוץ @@ -648,8 +648,6 @@ תמונה מוקטנת בסרגל הנגינה סומן בלב על ידי היוצר סימון כנצפה - הצגת סרטים בסגנון פיקאסו בראש התמונות לציון המקור שלהם: אדום זה מהרשת, כחול מהכונן וירוק מהזיכרון - הצגת מחווני תמונות הצעות חיפוש מרוחקות הצעות חיפוש מקומיות diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 5c7be01b426..b01125060ab 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -114,7 +114,7 @@ रिपोर्ट करें जानकारी: क्या हुआ: - क्या:\\nअनुरोध:\\nसामग्री भाषा:\\nसामग्री देश:\\nऐप भाषा:\\nसेवा:\\nजीएमटी समय:\\nपैकेज:\\nसंस्करण:\\nOS संस्करण: + क्या:\nअनुरोध:\nसामग्री भाषा:\nसामग्री देश:\nऐप भाषा:\nसेवा:\nजीएमटी समय:\nपैकेज:\nसंस्करण:\nOS संस्करण: आपकी टिप्पणी(अंग्रेजी में): विवरण: वीडियो चलाएं, अवधि : @@ -566,7 +566,6 @@ कतारबद्ध हुआ स्ट्रीम विवरण लोड हो रहे हैं… प्रोसेस हो रहा है… कुछ समय लग सकता है - छवि संकेतक दिखाएं प्लेयर का उपयोग करते समय क्रैश विकल्प दिखाता है नई स्ट्रीमों के लिए जांच चलाएं एक त्रुटि स्नैकबार दिखाएं @@ -663,7 +662,6 @@ लीक-कैनरी उपलब्ध नहीं है एक त्रुटी हुई है, नोटीफिकेशन देखें यदि वीडियो प्लेबैक पर आप काली स्क्रीन या रुक-रुक कर वीडियो चलने का अनुभव करते हैं तो मीडिया टनलिंग को अक्षम करें। - छवियों के शीर्ष पर पिकासो रंगीन रिबन दिखाएँ जो उनके स्रोत को दर्शाता है: नेटवर्क के लिए लाल, डिस्क के लिए नीला और मेमोरी के लिए हरा त्रुटी की नोटीफिकेशन बनाएं इस डाउनलोड को पुनर्प्राप्त नहीं किया जा सकता अभी तक कोई डाउनलोड फ़ोल्डर सेट नहीं किया गया है, अब डिफ़ॉल्ट डाउनलोड फ़ोल्डर चुनें @@ -849,4 +847,7 @@ पले करते समय सर्वर से HTTP error 403 मिला, जो शायद IP बैन या स्ट्रीमिंग URL डीओबफस्केशन की दिक्कतों की वजह से हुआ है %1$s ने डेटा देने से मना कर दिया, और यह कन्फर्म करने के लिए लॉगिन मांगा कि रिक्वेस्ट करने वाला बोट नहीं है।\n\nहो सकता है कि %1$s ने आपके IP को कुछ समय के लिए बैन कर दिया हो, आप कुछ समय इंतज़ार कर सकते हैं या किसी दूसरे IP पर स्विच कर सकते हैं (जैसे VPN ऑन/ऑफ करके, या WiFi से मोबाइल डेटा पर स्विच करके)। यह कंटेंट अभी चुने गए देश के कंटेंट के लिए उपलब्ध नहीं है।\n\n\"सेटिंग्स > कंटेंट > डिफ़ॉल्ट कंटेंट देश\" से अपना चुनाव बदलें। + Google ने घोषणा की है कि 2026/2027 से, प्रमाणित Android डिवाइसों पर सभी ऐप्स के लिए डेवलपर्स को अपनी व्यक्तिगत पहचान संबंधी जानकारी सीधे Google को जमा करनी होगी। चूँकि इस ऐप के डेवलपर्स इस आवश्यकता से सहमत नहीं हैं, यह ऐप उस समय के बाद प्रमाणित Android डिवाइसों पर काम नहीं करेगा। + विवरण + समाधान diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 85a2fa3675c..28412795eb2 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -87,7 +87,7 @@ Prijavi Informacije: Što se dogodilo: - Što:\\nZahtjev:\\nJezik sadržaja:\\nZemlja sadržaja:\\nJezik aplikacije:\\nUsluga:\\nGMT vrijeme:\\nPaket:\\nVerzija:\\nVerzija OS-a: + Što:\nZahtjev:\nJezik sadržaja:\nZemlja sadržaja:\nJezik aplikacije:\nUsluga:\nGMT vrijeme:\nPaket:\nVerzija:\nVerzija OS-a: Tvoj komentar (na engleskom): Detalji: Pokreni video, trajanje: @@ -437,7 +437,7 @@ Ograniči popis preuzimanja Koristi sustavksi birač mapa (SAF) Ukloni pregledano - Ukloni pogledana videa? + Ukloniti pogledana emitiranja? %d sekunda %d sekunde @@ -510,7 +510,7 @@ Napredak je izgubljen, jer je datoteka izbrisana NewPipe se zatvorio tijekom rada s datotekom Stranica playliste - Videa koji su gledani prije i nakon dodavanja u playlistu će se ukloniti. \nStvarno ih želiš ukloniti? Ovo je nepovratna radnja! + Emitiranja koji su gledani prije i nakon dodavanja u playlistu će se ukloniti. \nStvarno ih želiš ukloniti? Još nema zabilježenih playlista Odaberi playlistu obnavljanje @@ -640,7 +640,6 @@ Sada možeš odabrati tekst u opisu. Napomena: stranica će možda treperiti i možda nećeš moći kliknuti poveznice u načinu rada za odabir teksta. Obrada u tijeku … Može malo potrajati Za ukljanjanje stavki povuci ih - Prikaži indikatore slike %s preuzimanje je gotovo %s preuzimanja su gotova @@ -649,7 +648,6 @@ Pokreni glavni player u cjeloekranskom prikazu Dodaj u popis kao sljedeći Dodano u popis kao sljedeći - Prikaži Picassove vrpce u boji na slikama koje označavaju njihov izvor: crvena za mrežu, plava za disk i zelena za memoriju Izbrisano %1$s preuzimanje Izbrisana %1$s preuzimanja diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 03f868de9b5..0fecf5fb43a 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -129,7 +129,7 @@ A külső lejátszó nem támogatja az ilyen típusú hivatkozásokat Nem található videófolyam Nem található hangfolyam - Mi:\\nKérés:\\nTartalom nyelve:\\nTartalom származási országa:\\nAlkalmazás nyelve:\\nSzolgáltatás:\\nGMT idő:\\nCsomag:\\nVerzió:\\nOperációs rendszer verzió: + Mi:\nKérés:\nTartalom nyelve:\nTartalom származási országa:\nAlkalmazás nyelve:\nSzolgáltatás:\nGMT idő:\nCsomag:\nVerzió:\nOperációs rendszer verzió: Nincs találat Közvetítési fájl letöltése Hozzáadás ehhez @@ -550,7 +550,6 @@ Az eltávolítás utáni, fragment vagy activity életcikluson kívüli, nem kézbesíthető Rx kivételek jelentésének kényszerítése Eredeti „ennyi ideje” megjelenítése az elemeken Tiltsa le a médiacsatornázást, ha fekete képernyőt vagy akadozást tapasztal videólejátszáskor. - Picasso színes szalagok megjelenítése a képek fölött, megjelölve a forrásukat: piros a hálózathoz, kék a lemezhez, zöld a memóriához Minden letöltésnél meg fogja kérdezni, hogy hova mentse el Válasszon egy példányt Hírfolyam utoljára frissítve: %s @@ -624,7 +623,6 @@ A lejátszási listához való hozzáadás előtt és után megtekintett közvetítések el lesznek távolítva.\nBiztos benne? A szolgáltatásokból származó eredeti szövegek láthatók lesznek a közvetítési elemeken Lejátszó összeomlasztása - Képjelölők megjelenítése A „Lejátszó összeomlasztása” lehetőség megjelenítése Megjeleníti az összeomlasztási lehetőséget a lejátszó használatakor Hangmagasság megtartása (torzítást okozhat) @@ -820,4 +818,7 @@ HTTP 403-as hiba érkezett a kiszolgálótól a lejátszás közben, valószínűleg IP-tiltás vagy a közvetítési hivatkozás feloldási problémák miatt %1$s visszautasította az adatok szolgáltatását, és bejelentkezést kér annak megerősítésére, hogy a kérés nem robot által érkezik.\n\nElőfordulhat, hogy az IP-címét ideiglenesen letiltotta %1$s, várhat egy keveset, vagy váltson egy másik IP-címre (például VPN be-/kikapcsolásával, vagy Wi-Fi-ről mobiladat-forgalomra váltva). Ez a tartalom a jelenleg kiválasztott tartalom országában nem elérhető.\n\nVáltoztassa meg a „Beállítások > Tartalom >Tartalom alapértelmezett országa” menüpontban. + 2025 augusztusában a Google bejelentette, hogy 2026 szeptemberétől az alkalmazások telepítéséhez fejlesztői ellenőrzésre lesz szükség a tanúsított eszközökön található összes Android-alkalmazáshoz, beleértve a Play Áruházon kívül telepített alkalmazásokat is. Mivel a NewPipe fejlesztői nem értenek egyet ezzel a követelménnyel, a NewPipe ezután nem fog működni a tanúsított Android-eszközökön. + Részletek + Megoldás diff --git a/app/src/main/res/values-hy/strings.xml b/app/src/main/res/values-hy/strings.xml index 3be44ba7304..4eaf853dfb8 100644 --- a/app/src/main/res/values-hy/strings.xml +++ b/app/src/main/res/values-hy/strings.xml @@ -16,7 +16,7 @@ Լավ Ջնջել Սկսել - Հավանում եմ + Հավանումներ Չեմ հավանում Մաքրել Հրապարակվել է %1$s @@ -228,7 +228,7 @@ Դասավորել Գամված մեկնաբանություն Հաշիվը կասեցված է - + Մասին Ալբոմներ Այո Ոչ @@ -243,4 +243,39 @@ Անհայտ Նկատի ունե՞ս «%1$s» Բարձրություն + Լուծում + Մանրամասներ + + %s պատասխան + %s պատասխաններ + + Կիսվել նվագացանկով + Առաջ տանել + Նվագել + Տևողություն + Հետ տանել + Բացել նվագացանկը + Հավանումներ + Կարճեր + Մասնակի դիտված + Ամբողչովին դիտված + Միացված + Անջատված + Բաժանորդագրվածներ + Ներքին + Անձնական + Հարցնել որտեղ ներբեռնել + Կամայական ցանցով + Նվագացանկը ստեղծվեց + Նոր նվագացանկ + Ալբոմներ + Արվեստագետներ + Նվիրել + Անտեսել + %sՀզր + %sՄլն + %sԲլն + Ազդարարել + Այդպիսի պանակ չկա + Նվագացանկեր diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 003994de256..eafd00e8d61 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -76,7 +76,7 @@ Silakan pilih folder unduhan di pengaturan Pemutar penjaliran tidak ditemukan. Pasang VLC? App/UI rusak - Apa:\\nPermintaan:\\nBahasa Konten:\\nNegara Konten:\\nBahasa Apl:\\nLayanan:\\nWaktu GMT:\\nPaket:\\nVersi:\\nVersi OS: + Apa:\nPermintaan:\nBahasa Konten:\nNegara Konten:\nBahasa Apl:\nLayanan:\nWaktu GMT:\nPaket:\nVersi:\nVersi OS: Thread Tantangan reCAPTCHA Meminta kode reCAPTCHA @@ -625,13 +625,11 @@ Disukai oleh kreator Saran pencarian lokal Saran pencarian remote - Tampilkan indikator gambar Menghapus %1$s unduhan tambahkan ke selanjutnya telah ditambahkan ke selanjutnya - Tampilkan Ribon bewarna Picasso di atas gambar yang mengindikasikan asalnya: merah untuk jaringan, biru untuk disk dan hijau untuk memori Jangan memulai memutar video di mini player, tapi nyalakan langsung di mode layar penuh, jika rotasi otomatis terkunci. Anda tetap dapat mengakses mini player dengan keluar dari layar penuh Memproses… Mungkin butuh waktu sebentar Periksa Pembaruan diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index cf3fbd8b2c6..aa8c2e72cea 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -212,7 +212,7 @@ Því miður fór eitthvað úrskeiðis. Líkar við Það sem gerðist: - Hvað:\\nBeiðni:\\nTungumál Efnis:\\nLand Efnis:\\nTungumál forrits:\\nÞjónusta:\\nGMT Tími:\\nPakki:\\nÚtgáfa:\\nÚtgáfu Stýrikerfis: + Hvað:\nBeiðni:\nTungumál efnis:\nLandsvæði efnis:\nTungumál forrits:\nÞjónusta:\nTímastimpill:\nPakki:\nÚtgáfa:\nÚtgáfa stýrikerfis: Athugasemd þín (á ensku): Engar niðurstöður Myndskeið @@ -369,7 +369,7 @@ Fjarleitar leitartillögur Halda áfram Óstudd vefslóð - Sjálfgefið efnisland + Sjálfgefið landsvæði efnis PeerTube þjónar Bæta við Sláðu inn slóð tilviks @@ -637,8 +637,6 @@ Upprunalegir textar frá þjónustu verða sýnilegir í streymisatriðum Slökkva á margmiðlagöngum Slökktu á margmiðlunargöngum (media tunneling) ef vart verður við svartan skjá eða hökt við spilun myndskeiða. - Sýna myndvísa - Sýna Picasso litaða borða ofan á myndum sem gefa til kynna uppruna þeirra: rauðan fyrir netið, bláan fyrir disk og grænan fyrir minni Sýna „Láta spilara hrynja\" Sýna valkost til að hrynja spilara Hrynja forrit @@ -817,4 +815,10 @@ Eyða færslu Aðgangi lokað\n\n%1$s gefur þessa ástæðu: %2$s Færslu eytt + Samsettur vinsældalisti YouTube fjarlægður + YouTube hætti með samsetta vinsældalistann sinn frá og með 21. júlí 2025. NewPipe skipti út sjálfgefna vinsældalistanum fyrir vinsæl streymi í beinni útsendingu.\n\nÞú getur líka valið annað vinsælt efni með því að fara í \"Stillingar > Efni > Efni aðalsíðu\". + Tók við HTTP-villu 403 frá þjóni á meðan afspilun stóð, líklega vegna útrunninar URL-slóðar streymis eða banns á IP-vistfang + Tók við HTTP-villu %1$s frá þjóni á meðan afspilun stóð + Tók við HTTP-villu 403 frá þjóni á meðan afspilun stóð, líklega vegna banns á IP-vistfang eða vandamála með afkóðun URL-slóðar streymis + Þetta efni er ekki í boði fyrir valið landsvæði efnis.\n\nBreyttu valinu með því að fara í \"Stillingar > Efni > Sjálfgefið landsvæði efnis\". diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 7955eed1514..86b9c382a9d 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -78,7 +78,7 @@ Copiato negli appunti Seleziona una cartella per i file scaricati L\'app/UI si è interrotta - Cosa:\\nRichiesta:\\nLingua contenuti:\\nPaese contenuti\\nLingua app:\\nServizio:\\nOrario GMT:\\nPacchetto:\\nVersione:\\nVersione SO: + Cosa:\nRichiesta:\nLingua contenuti:\nPaese contenuti\nLingua app:\nServizio:\nOrario GMT:\nPacchetto:\nVersione:\nVersione SO: Risoluzione reCAPTCHA Nero Tutto @@ -638,8 +638,6 @@ Commenti disattivati Apprezzato dall\'autore Segna come visto - Mostra gli indicatori colorati Picasso sopra le immagini, per indicare la loro fonte: rosso per la rete, blu per il disco e verde per la memoria - Mostra indicatori immagine Suggerimenti di ricerca remoti Suggerimenti di ricerca locali @@ -863,4 +861,7 @@ Errore HTTP 403 ricevuto dal server durante la riproduzione, probabilmente causato da un divieto dell\'IP o problemi di de-offuscamento dell\'URL in streaming %1$s ha rifiutato di fornire i dati, chiedendo un accesso per confermare che il richiedente non sia un bot.\n\nIl tuo IP potrebbe essere stato temporaneamente vietato da %1$s, puoi aspettare un po\' di tempo o passare ad un IP diverso (ad esempio accendendo/spegnendo una VPN, o passando dal WiFi ai dati mobili). Questo contenuto non è disponibile per il Paese dei contenuti attualmente selezionato.\n\nModifica la selezione da \"Impostazioni > Contenuti > Paese dei contenuti predefinito\". + Ad agosto 2025, Google ha annunciato che a partire da settembre 2026, l\'installazione di app richiederà la verifica dello sviluppatore per tutte le app Android su dispositivi certificati, compresi quelli installati al di fuori del Play Store. Poiché gli sviluppatori di NewPipe non sono d\'accordo con questo requisito, NewPipe non funzionerà più su dispositivi Android certificati dopo quel mese. + Dettagli + Soluzione diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index d78a0654710..e915bb80939 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -78,7 +78,7 @@ ダウンロード 不具合報告 アプリ(UI)がクラッシュしました - どんな問題:\\nリクエスト:\\nコンテンツ言語:\\nコンテンツ国:\\nアプリ言語:\\nサービス:\\nGMT 時間:\\nパッケージ:\\nバージョン:\\nOSバージョン: + どんな問題:\nリクエスト:\nコンテンツ言語:\nコンテンツ国:\nアプリ言語:\nサービス:\nGMT 時間:\nパッケージ:\nバージョン:\nOSバージョン: reCAPTCHA の要求 reCAPTCHA を要求しました ブラック @@ -628,8 +628,6 @@ %s 個のダウンロードが完了しました - ピカソは、画像の上に、画像の出所を識別する色彩記章を表示します: 赤はネットワーク、青はディスク、緑はメモリ - 画像に標識を表示 処理中… 少し時間がかかるかもしれません 新しいバージョンを手動で確認します アップデートを確認中… @@ -806,4 +804,8 @@ インポートされているエクスポートの設定は、NewPipe 0.27.0以降は非推奨であった脆弱な形式を使用します。 インポートされているエクスポートは信頼できる情報源からであり、将来的にはNewPipe 0.27.0かこれより新しいバージョンから得られるエクスポートのみを優先して使用します。 この脆弱な形式で設定をインポートするための対応はすぐに完全に削除され、新しいバージョンからエクスポートの設定をインポートすることは出来ません。 YouTubeの一時的なプレイリストとして共有 二次的 + Google は、2026/2027 年から、認定 Android デバイス上のすべてのアプリについて、開発者が個人の身元情報を直接 Google に提出することを必須にすると発表しました。本アプリの開発者はこの要件に同意していないため、このアプリはその時点以降、認定 Android デバイス上で動作しなくなります。 + 詳細 + 解決 + %sB diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index 61b3ee52399..4f5fc13efdf 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -37,7 +37,7 @@ ნაგულისხმევი აუდიო ფორმატი აირჩიეთ თქვენი საყვარელი PeerTube ეგზემპლარები დაკვრის დატვირთვის ინტერვალის ზომა - შეცვალეთ დატვირთვის ინტერვალის ზომა (ამჟამად %s). დაბალმა მნიშვნელობამ შეიძლება დააჩქაროს საწყისი ვიდეოს ჩატვირთვა. ცვლილებები მოითხოვს მოთამაშის გადატვირთვას + შეცვალეთ დატვირთვის ინტერვალის ზომა (ამჟამად %s). დაბალმა მნიშვნელობამ შეიძლება დააჩქაროს საწყისი ვიდეოს ჩატვირთვა. მოითხოვეთ დადასტურება რიგის გასუფთავებამდე არაზუსტი ძიება საშუალებას აძლევს მოთამაშეს უფრო სწრაფად მოიძიოს პოზიციები შემცირებული სიზუსტით. 5, 15 ან 25 წამის ძიება ამით არ მუშაობს სწრაფი წინსვლა/-გადახვევა ძიების ხანგრძლივობა @@ -100,7 +100,7 @@ არევა Ბუფერიზაცია აუდიო - ღამის თემა + მუქი თემა ღია მუქი შავი @@ -380,7 +380,6 @@ ორიგინალური ტექსტები სერვისებიდან ხილული იქნება ნაკადის ერთეულებში მედია გვირაბის გათიშვა გამორთეთ მედია გვირაბი, თუ ვიდეოს დაკვრისას შავი ეკრანი ან ჭუჭყი გაქვთ - გამოსახულების ინდიკატორების ჩვენება აჩვენე \"დამკვრელის დამსხვრევა\" აჩვენებს ავარიის ვარიანტს დამკვრელის გამოყენებისას გაუშვით შემოწმება ახალი ნაკადებისთვის @@ -604,7 +603,7 @@ გარე დამკვრელს არ აქვთ ამ ტიპის ბმულების მხარდაჭერა ფაილი არ არსებობს ან მასზე წაკითხვის ან ჩაწერის ნებართვა აკლია შენახული ჩანართების წაკითხვა ვერ მოხერხდა, ამიტომ გამოიყენეთ ნაგულისხმევი ჩანართები - რა:\\nმოითხოვეთ:\\nშემცველობის ენა:\\nშემცველობის ქვეყანა:\\nაპლიკაციის ენა:\\nსერვისი:\\nGMT დრო:\\nპაკეტი:\\nვერსია:\\nOS ვერსია: + რა:\nმოითხოვეთ:\nშემცველობის ენა:\nშემცველობის ქვეყანა:\nაპლიკაციის ენა:\nსერვისი:\nGMT დრო:\nპაკეტი:\nვერსია:\nOS ვერსია: ამტვირთველის ავატარის ესკიზი კომენტარები გამორთულია Შექმნა @@ -655,7 +654,7 @@ იკითხეთ, სად უნდა ჩამოტვირთოთ თქვენ მოგეთხოვებათ სად შეინახოთ თითოეული ჩამოტვირთვა. \n ჩართეთ სისტემის საქაღალდის ამომრჩევი (SAF), თუ გსურთ ჩამოტვირთოთ გარე SD ბარათზე - ვიდეოები, რომლებიც უყურეთ დასაკრავ სიაში დამატებამდე და მის შემდეგ, წაიშლება. \n დარწმუნებული ხართ? ამის გაუქმება შეუძლებელია! + ვიდეოები, რომლებიც უყურეთ დასაკრავ სიაში დამატებამდე და მის შემდეგ, წაიშლება. \n დარწმუნებული ხართ? NewPipe არის copyleft უფასო პროგრამული უზრუნველყოფა: თქვენ შეგიძლიათ გამოიყენოთ, შეისწავლოთ, გააზიაროთ და გააუმჯობესოთ იგი სურვილისამებრ. კონკრეტულად თქვენ შეგიძლიათ გადაანაწილოთ და/ან შეცვალოთ იგი GNU-ს ზოგადი საჯარო ლიცენზიის პირობებით, როგორც ეს გამოქვეყნებულია თავისუფალი პროგრამული უზრუნველყოფის ფონდის მიერ, ლიცენზიის მე-3 ვერსიით, ან (თქვენი სურვილისამებრ) ნებისმიერი შემდგომი ვერსიით. ავტო ცარიელი გვერდი @@ -677,7 +676,6 @@ გამოწერების იმპორტი ვერ მოხერხდა შეატყობინეთ სასიცოცხლო ციკლის შეცდომებს იძულებითი მოხსენება შეუსაბამო Rx გამონაკლისების შესახებ ფრაგმენტის ან აქტივობის სასიცოცხლო ციკლის გარეთ განკარგვის შემდეგ - აჩვენეთ პიკასოს ფერადი ლენტები სურათების თავზე, სადაც მითითებულია მათი წყარო: წითელი ქსელისთვის, ლურჯი დისკისთვის და მწვანე მეხსიერებისთვის სწრაფი კვების რეჟიმი ამაზე მეტ ინფორმაციას არ იძლევა. „%s“-ის არხის ჩატვირთვა ვერ მოხერხდა. ხელმისაწვდომია ზოგიერთ სერვისში, როგორც წესი, ბევრად უფრო სწრაფია, მაგრამ შეიძლება დააბრუნოს შეზღუდული რაოდენობის ელემენტი და ხშირად არასრული ინფორმაცია (მაგ. ხანგრძლივობის გარეშე, ელემენტის ტიპი, არ არის ლაივის სტატუსი) @@ -792,4 +790,33 @@ დაკვრის დროს სერვერიდან მიღებული HTTP შეცდომა 403, სავარაუდოდ, გამოწვეულია IP აკრძალვით ან სტრიმინგის URL-ის დებფუსკაციის პრობლემებით. %1$s-მა უარი თქვა მონაცემების მიწოდებაზე და ითხოვა შესვლა იმის დასადასტურებლად, რომ მომთხოვნი რობოტი არ არის.\n\nშესაძლოა, თქვენი IP მისამართი დროებით აიკრძალა %1$s-ის მიერ, შეგიძლიათ დაელოდოთ ცოტა ხანს ან გადახვიდეთ სხვა IP მისამართზე (მაგალითად, VPN-ის ჩართვით/გამორთვით, ან WiFi-დან მობილურ მონაცემებზე გადართვით). ეს კონტენტი ამჟამად არჩეული კონტენტის ქვეყნისთვის მიუწვდომელია.\n\nშეცვალეთ თქვენი არჩევანი „პარამეტრები > კონტენტი > ნაგულისხმევი კონტენტის ქვეყანა“-დან. + %1$s %2$s + ორიგინალი + გახმოვანებული + აღწერითი + მეორადი + ვიდეოები + ტრეკები + მოკლე ვიდეოები + ლაივი + არხები + დასაკრავი სიები + ალბომები + მოწონებები + შესახებ + არხის ჩანართები + რომელი ჩანართებია ნაჩვენები არხის გვერდებზე + დაკვრის რიგის გახსნა + სრულეკრანიან რეჟიმზე გადართვა + + %s პასუხი + %s პასუხები + + მეტის ჩვენება + ნაკლების ჩვენება + იმპორტირებული ექსპორტის პარამეტრები იყენებს დაუცველ ფორმატს, რომელიც მოძველებულია NewPipe 0.27.0 ვერსიიდან. დარწმუნდით, რომ იმპორტირებული ექსპორტი სანდო წყაროდან არის და მომავალში უპირატესობა მიანიჭეთ მხოლოდ NewPipe 0.27.0 ან უფრო ახალი ვერსიიდან მიღებული ექსპორტირებული პარამეტრების გამოყენებას. ამ დაუცველ ფორმატში პარამეტრების იმპორტის მხარდაჭერა მალე მთლიანად გაუქმდება და შემდეგ NewPipe-ის ძველი ვერსიები ვეღარ შეძლებენ ექსპორტირებული პარამეტრების იმპორტირებას ახალი ვერსიებიდან. + SoundCloud-ის ტოპ 50 გვერდი წაიშალა + SoundCloud-მა შეწყვიტა ორიგინალი ტოპ 50 ჩარტების გამოშვება. შესაბამისი ჩანართი წაიშალა თქვენი მთავარი გვერდიდან. + YouTube-ის კომბინირებული ტრენდული გვერდი წაშლილია + YouTube-მა 2025 წლის 21 ივლისიდან შეწყვიტა კომბინირებული ტრენდული გვერდის არსებობა. NewPipe-მა ნაგულისხმევი ტრენდული გვერდი ტრენდული პირდაპირი ტრანსლაციებით ჩაანაცვლა.\n\nასევე შეგიძლიათ აირჩიოთ სხვადასხვა ტრენდული გვერდები „პარამეტრები > მასალა > მთავარი გვერდის შინაარსი“-ში. diff --git a/app/src/main/res/values-kmr/strings.xml b/app/src/main/res/values-kmr/strings.xml index f8da8d1a745..f4b83eda223 100644 --- a/app/src/main/res/values-kmr/strings.xml +++ b/app/src/main/res/values-kmr/strings.xml @@ -64,7 +64,7 @@ Vîdeo, demdirêj bilîze: Hûrî: Şîroveya we (bi Îngilîzî): - Çi:\\nRequest:\\nContent Language:\\nContent Welat:\\nApp Language:\\nService:\\nGMT Dem:\\nPackage:\\nVersion:\\nOS version: + Çi:\nRequest:\nContent Language:\nContent Welat:\nApp Language:\nService:\nGMT Dem:\nPackage:\nVersion:\nOS version: Çi qewimî: Agahdarî: Nûçe diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 8eb19ade820..b94258e766c 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -113,7 +113,7 @@ 이 스트림을 재생할 수 없습니다 복구할 수 없는 플레이어 오류가 발생했습니다 플레이어 오류로부터 복구 중 - 무엇:\\n요청:\\n콘텐츠 언어:\\n콘텐츠 국가:\\n앱 언어:\\n서비스:\\nGMT 시간:\\n패키지:\\n버전:\\nOS 버전: + 무엇:\n요청:\n콘텐츠 언어:\n콘텐츠 국가:\n앱 언어:\n서비스:\nGMT 시간:\n패키지:\n버전:\nOS 버전: 결과 없음 구독할 항목을 추가하세요 구독자 없음 @@ -541,8 +541,6 @@ 미디어 터널링 비활성화 서비스의 원본 텍스트가 스트림 항목에 표시됩니다 동영상 재생 시 검은 화면이 나타나거나 끊김 현상이 발생하면 미디어 터널링을 비활성화하세요. - 이미지 표시기 표시 - 원본을 나타내는 이미지 위에 피카소 컬러 리본 표시: 네트워크는 빨간색, 디스크는 파란색, 메모리는 녹색 \"플레이어 충돌\" 표시 플레이어를 사용할 때 충돌 옵션을 표시합니다 새로운 스트림 확인 실행 @@ -835,4 +833,7 @@ 재생 중 서버에서 HTTP 403 오류를 수신했으며, 스트리밍 URL 역난독화 문제나 IP 차단 때문일 수 있습니다 %1$s에서 데이터 제공을 거부하고, 요청자가 봇이 아닌지 확인하기 위해 로그인을 요청하고 있습니다.\n\n아마 IP가 %1$s에서 임시 차단되었을 것이며, 잠시 기다리거나 다른 IP로 전환할 수 있습니다 (예를 들자면 VPN을 켜/끄거나, WiFi를 모바일 데이터로 바꾸세요). 이 콘텐츠는 현재 선택한 콘텐츠 지역에서 이용할 수 없습니다.\n\n\"설정 > 콘텐츠 > 기본 콘텐츠 국가\"에서 지역을 바꾸세요. + 2025년 8월, Google은 2026년 9월부터 인증된 기기에 앱을 설치하려면 Play 스토어 외 앱을 포함한 모든 Android 앱에 대해 개발자 인증을 받아야 한다고 발표했습니다. NewPipe 개발자는 이 요구 사항에 동의하지 않으므로, 이 이후 NewPipe는 더 이상 인증된 Android 기기에서 동작하지 않을 것입니다. + 자세히 + 해결책 diff --git a/app/src/main/res/values-ku/strings.xml b/app/src/main/res/values-ku/strings.xml index e556fcf2673..c788f252acb 100644 --- a/app/src/main/res/values-ku/strings.xml +++ b/app/src/main/res/values-ku/strings.xml @@ -328,7 +328,7 @@ گێڕانەوەی کارپێکەر بۆکاتی پێش کێشە هەمان فۆڵدەر بوونی نییە هەمان فایل/بابەت بوونی نییە - چی:\\nداواکراو:\\nناوەڕۆک:\\nلانگ:\\nخزمەتگوزاری:\\nGMT:\\nکات:\\nپاکێج:\\nوەشان:\\nوەشانی سیستەم: + چی:\nداواکراو:\nناوەڕۆک:\nلانگ:\nخزمەتگوزاری:\nGMT:\nکات:\nپاکێج:\nوەشان:\nوەشانی سیستەم: هێما ڕێگەپێدراوەکان لە فایلێکی ناویدا هێما نادروستەکان بەم بەهایە جێگۆڕکێ دەکرێن هێمای جێگۆڕین diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 70700bb5d97..d43a69fb0aa 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -74,7 +74,7 @@ Ataskaita Informacija: Kas nutiko: - Kas:\\nUžklausa:\\nTurinio Kalba:\\nTurinio Šalis:\\nProgramėlės Kalba:\\nPaslauga:\\nGMT Laikas:\\nPaketas:\\nVersija:\\nOS versija: + Kas:\nUžklausa:\nTurinio Kalba:\nTurinio Šalis:\nProgramėlės Kalba:\nPaslauga:\nGMT Laikas:\nPaketas:\nVersija:\nOS versija: Jūsų komentaras (anglų kalba): Išsami informacija: Paleisti vaizdo įrašą, trukmė: @@ -638,8 +638,6 @@ Nerodyti Širdelė nuo kurėjo Pažymėti kaip peržiūrėtą - Rodyti „Picasso“ spalvotas juosteles ant vaizdų, nurodančių jų šaltinį: raudona tinklui, mėlyna diskui ir žalia atmintis - Rodyti vaizdo indikatorius Nuotolinės paieškos pasiūlymai Vietinės paieškos pasiūlymai diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index bb41037a15e..8a3d8dc90bb 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -15,7 +15,7 @@ Popup atskaņotājs Fona atskaņotājs Sākt atskaņot ar popup - Sākt atskaņot fonā + Klausīties fonā šo Ielikts rindā Ielikt rindā Turiet, lai ieliktu atskaņošanas rindā @@ -30,7 +30,7 @@ Top 50 Nevarēja ielādēt komentārus Vai jūs vēlaties ievietot arī iestatījumus? - Šis pārrakstīt jūsu tagadējo uzstādījumu. + Pašreizējie dati tiks aizstāti. Uzmanību: Ne visas datnes varēja ievietot. Nav derīgs ZIP fails Ievietošana pabeigta @@ -47,16 +47,15 @@ Kādas cilnes rādīt galvenajā lapā Galvenā lapa Visvairāk Atskaņotais - Pēdējais Atskaņotais - Vai jūs vēlaties izdzēst šo lietu no meklēšanas vēstures\? + Pēdējais atskaņotais + Vai jūs tiešām vēlaties izdzēst šo vaicājumu no meklēšanas vēstures? Vēsture Vēsture Izlasīt licenci Newpipe ir bezmaksas programmatūra: jūs varat izmantot, izpētīt, dalīties un uzlabot to jebkurā brīdī. Tieši jūs varat kopīgot un/ vai modificēt to saskaņā ar GNU Vispārējās Publiskās Licences noteikumiem, ko publicējusi Brīvās Programmatūras Fonds, vai nu 3. licences versija, vai (pēc jūsu izvēles) jebkura vēlāka versija. NewPipe Licence Izslasīt privātuma politiku - NewPipe projekts uztver jūsu privātumu ļoti nopietni . Tāpēc lietotne nesavāc datus bez jūsu piekrišanas. -\nNewPipe privātuma politika sīki izskaidro, kādi dati tiek nosūtīti un uzglabāti, nosūtot kļūdas ziņojumu. + Datu aizsardzība ir ļoti svarīga NewPipe projektam. Tāpēc lietotne neapkopo datus bez jūsu piekrišanas.\nNewPipe konfidencialitātes politika sīki izskaidro, kādi dati tiek nosūtīti un uzglabāti, kad nosūtiet avārijas ziņojumu. NewPipe Privātuna Politika Apmeklēt NewPipe mājaslapu, lai iegūtu vairāk informācijas un ziņu. Mājaslapa @@ -69,7 +68,7 @@ Libre, viegla atskaņošana uz Android. Licences Par un BUJ - Trešo pušu Licences + Trešo pušu licences Par NewPipe Lielākā daļa īpašo rakstzīmju Burti un cipari @@ -123,7 +122,7 @@ Neviens neskatās - %s skatījumu + %s skatījumi %s skatījums %s skatījumi @@ -151,13 +150,13 @@ Atskaņot video, ilgums: Detaļas: Jūsu komentārs (Angliski): - Kas:\\nRequest:\\nContent Valoda:\\nContent Valsts:\\nApp Valoda:\\nService:\\nGMT Laiks:\\nPackage:\\nVersion:\\nOS versija: + Kas:\nRequest:\nContent Valoda:\nContent Valsts:\nApp Valoda:\nService:\nGMT Laiks:\nPackage:\nVersion:\nOS versija: Paziņojumi video apstrādes progresam Video haša paziņojums - Atcerēties pēdējo uznirstošā loga izmēru un pozīciju + Atceras pēdējo uznirstošā loga izmēru un pozīciju Atcerēties uznirstošā loga īpašības - Uznirstošā loga noklusējuma izšķirtspēja - Uznirstošs logs + Noklusējuma uznirstošā loga izšķirtspēja + Skatīt uznirstošā logā Atvērt uznirstošā logā Kas notika: Informācija: @@ -169,13 +168,13 @@ Ziņojiet pa e-pastu Piedotiet, tam nevajadzēja notikt. Dot atļauju rādīt pāri citām aplikācijām - Vai jūs vēlaties atjaunot noklusējumus\? - Atjaunot noklusējumus + Vai jūs tiešām vēlaties atjaunot noklusējuma vērtības? + Atjaunot noklusējuma vērtības Nevarēja nolasīt saglabātās cilnes, tādēļ izmanto noklusējuma Neviens video nav pieejams lejupielādei Notika kļūda: %1$s Faila nosaukums nevar būt tukšs - Fails neeksistē, vai atļauja to lasīt vai rakstīt, nav dota + Datne neeksistē vai nav dota atļauja to lasīt vai rakstīt Tāds fails/saturs neeksistē Tāda mape neeksistē Fails pārvietots vai izdzēsts @@ -195,9 +194,9 @@ Ārējā krātuve nepieejama Kļūda Meklēšanas vēsture izdzēsta - Izdzēsy visu meklēšanas vēsturi\? + Vai tiešām izdzēst visu meklēšanas vēsturi? Izdzēš meklēto vārdu vēsturi - Izdzēst skatīšanās vēsturi + Notīrīt meklēšanas vēsturi Atskaņošanas pozīcikas izdzēstas Izdzēst visas atskaņošanas pozīcijas\? Izdzēš visas atskaņošanas pozīcijas @@ -281,17 +280,7 @@ NewPipe šo saturu vēl neatbalsta. \n \nCerams, ka to atbalstīs nākamajā versijā. - Vai jūs domājat, ka plūsmas atjaunināšana ir pārāk lēna\? Ja tā, mēģiniet iespējot ātro atjaunināšanu (to var mainīt iestatījumos vai nospiežot pogu zemāk). -\n -\nNewPipe piedāvā divas plūsmas atjaunināšanas stratēģijas: -\n• Notiek visa abonēšanas kanāla iegūšana, kas ir lēna, bet pabeigta. -\n• izmantojot īpašu servisu, kas ir ātrs, bet parasti nav pilnīgs. -\n -\nAtšķirība starp abiem ir tā, ka ātrajā parasti trūkst informācijas, piemēram, video ilgums vai veids (nevar atšķirt tiešraides video no parastajiem), un tas var atgriezt mazāk vienumu. -\n -\nYouTube ir pakalpojuma piemērs, kas piedāvā šo ātro metodi ar savu RSS plūsmu. -\n -\nTātad izvēle sakrīt ar vēlamo: ātrums vai precīza informācija. + Vai jūs domājat, ka plūsmas atjaunināšana ir pārāk lēna? Ja tā, mēģiniet iespējot ātro atjaunināšanu (to var mainīt iestatījumos vai nospiežot pogu zemāk). \n \nNewPipe piedāvā divas plūsmas atjaunināšanas stratēģijas: \n• Notiek visa abonēšanas kanāla iegūšana, kas ir lēna, bet pabeigta. \n• izmantojot īpašu servisu, kas ir ātrs, bet parasti nav pilnīgs. \n \nAtšķirība starp abiem ir tā, ka ātrajā parasti trūkst informācijas, piemēram, video ilgums vai veids (nevar atšķirt tiešraides video no parastajiem), un tas var atgriezt mazāk vienumu. \n \nYouTube ir pakalpojuma piemērs, kas piedāvā šo ātro metodi ar savu RSS plūsmu. \n \nTātad izvēle sakrīt ar vēlamo: ātrums vai precīza informācija. Izslēgt ātro režīmu Ieslēgt ātro režīmu Pieejams dažos pakalpojumos, tas parasti ir daudz ātrāk, taču var atgriezt ierobežotu daudzumu informācijas un bieži arī nepilnīgu informāciju (piemēram, nav video ilguma, vienuma veida, nav tiešraides statusa) @@ -301,7 +290,7 @@ Plūsmas atjaunināšanas biežuma slieksnis Straume Rādīt tikai nepievienotus grupai abonementus - Jauna + Izveidot jaunu grupu Vai tiešām vēlaties izdzēst šo grupu? Tukšs grupas nosaukums @@ -314,7 +303,7 @@ Notiek plūsmas apstrāde … Notiek plūsmas ielāde… Nav ielādēts: %d - Plūsma pēdējoreiz atjaunināta: %s + Atjaunināta: %s Abonementu grupas Kas jauns @@ -337,10 +326,10 @@ %d sekundi %d sekundes - ExoPlayer ierobežojumu dēļ meklēšanas ilgums tika iestatīts uz %d sekundēm - Jā, un daļēji skatītos video - Video, kas skatīti pirms un pēc pievienošanas atskaņošanas sarakstam, tiks noņemti. \nVai tiešām turpināt? Šo darbību nevarēs atsaukt! - Vai tiešām noņemt skatītos video? + ExoPlayer ierobežojumu dēļ tīšanas solis tika iestatīts uz %d sekundēm + Jā, un daļēji skatītos + Tiešraides, kas iepriekš noskatītas un pēc tam pievienotas atskaņošanas sarakstam, tiks noņemtas. \nVai tiešām turpināt? + Vai tiešām noņemt skatītās tiešraides? Noņemt skatīto System default Lietotnes valoda @@ -380,7 +369,7 @@ Rādīt kļūdu Ir gaidāma lejupielāde ar šo nosaukumu Notiek lejupielāde ar šo nosaukumu - nevar pārrakstīt failu + nevar pārrakstīt datni Lejupielādēts fails ar šo nosaukumu jau pastāv Fails ar šo nosaukumu jau pastāv Pārrakstīt @@ -394,7 +383,7 @@ Darbība, pārslēdzoties uz citu lietotni no galvenā video atskaņotāja — %s Minimizēt, pārslēdzot aplikāciju Solis - Klusuma laikā patīt uz priekšu + Klusuma brīžos patīt uz priekšu Atvienot (var izraisīt traucējumus) Paturiet prātā, ka šī darbība var pieprasīt lielu datu daudzumu \n @@ -440,14 +429,13 @@ Minimizēt uz popup atskaņotāju Minimizēt uz fona atskaņotāju Nav - Rādīt paziņojumu, kad ir pieejama jauna aplikācijas versija + Rādīt paziņojumu, ja pieejama jauna lietotnes versija Atjauninājumi Ierobežots izšķirtspēju, izmantojot mobilos datus Nav ierobežojuma Nepiekrist Piekrist - Lai ievērotu Eiropas Vispārējās datu aizsardzības regulu (GDPR), mēs pievēršam jūsu uzmanību NewPipe privātuma politikai. Lūdzu, rūpīgi izlasiet to. -\nJums ir ta jāpieņem, lai nosūtītu mums kļūdas ziņojumu. + Lai ievērotu Eiropas Vispārīgo datu aizsardzības regulu (GDPR), mēs vēršam jūsu uzmanību NewPipe konfidencialitātes politikai. Lūdzu, rūpīgi izlasiet to.\nJums tā ir jāpieņem, lai nosūtītu mums kļūdas ziņojumu. Atiestatīt Tonis Temps @@ -470,40 +458,40 @@ Pielāgot Noklusējuma satura valoda Noklusējuma satura valsts - Nevarēja atpazīt saites URL. Atvērt ar citu aplikāciju\? + Nevarēja atpazīt saites URL. Vai atvērt citā lietotnē? Neatbalstīts saites URL Rādīt padomu, kad nospiežat fona vai popup pogu pie video \"Informācija:\" Rādīt \"Nospiediet, lai pievienotu\" padomu Automātiski atskaņot Lejupielādēt - Turpināt atskaņošanu pēc pārtraukumiem (piemēram, telefona zvana) + Turpina atskaņot video pēc pārtraukumiem (piemēram, telefona zvana) Turpināt atskaņošanu - Uzglabāt skatīto video vēsturi - Dzēst datus - Rādīt atskaņošanas pozīcijas indikatoru sarakstos + Uzglabā skatīto video vēsturi + Notīrīt datus + Rāda atskaņošanas pozīcijas indikatoru sarakstos Atskaņošanas pozīcija sarakstos Saglabāt pēdējo atskaņošanas pozīciju Atsākt atskaņošanu Skatīšanās vēsture Glabāt meklēšanas vēsturi lokāli (ierīces krātuvē) Meklēšanas vēsture - Izvēlieties, kādus ieteikumus rādīt, rakstot meklēšanas joslā + Atlasīt, kādus ieteikumus rādīt, ievadot vaicājumu meklēšanas joslā Meklēšanas ieteikumi - Automātiski atskaņot - Turpināt atskaņot videoklipus, automātiski pievienojot līdzīgus videoklipus - Automātiski atskaņot nākošo videoklipu - Kešatmiņas metadati notīrīti + Automātiski pievienot + Pievieno līdzīgus video atskaņošanas rindai, kad atskaņo pēdējo video, ja vien nav iespējota atkārtotā, malt uz riņķi, atskaņošana + Automātiski pievienot nākamo video + Metadatu kešatmiņa notīrīta Izdzēš visus kešatmiņā glabātos vietnes datus - Notīrīt kešatmiņas metadatus + Notīrīt kešatmiņā saglabātos metadatus Attēlu kešatmiņa notīrīta - Izslēdziet, lai paslēptu papildus informācijas laukus par video autoru, video saturu vai meklēšanas vaicājuma rezultātu + Izslēdziet, ja nevēlaties redzēt papildus informācijas laukus - video autoru, video saturu vai meklēšanas vaicājuma rezultātu Rādīt papildus informāciju Izslēdziet, ja nevēlaties redzēt video aprakstu un papildus informāciju Rādīt video aprakstu - Rādīt \'Nākošos\' un \'Līdzīgos\' videoklipus - Izslēdziet, lai paslēptu komentārus + Rādīt \'Nākamos\' un \'Līdzīgos\' video + Izslēdziet, ja vēlaties paslēpt komentārus Rādīt komentārus - Tagadējā atskaņošanas rinda tiks aizvietota + Pašreizējā atskaņošanas rinda tiks aizstāta/pārrakstīta Mainot vienu atskaņotāju uz citu, jūsu atskaņošanas rinda var tikt aizstāta/pārrakstīta Prasīt apstiprinājumu, pirms notīrīt atskaņošanas rindu Ātrās uz priekšu/atpakaļ tīšanas solis @@ -516,61 +504,61 @@ Noklusējuma video formāts Noklusējuma audio formāts Audio - Ļaut Android pielāgot paziņojuma krāsu atbilstoši galvenajai krāsai video attēlā (ņemiet vērā, ka tas nav pieejams visās ierīcēs) + Ļauj Android pielāgot paziņojuma krāsu atbilstoši galvenajai krāsai video attēlā (ņemiet vērā, ka tas nav pieejams visās ierīcēs) Kopīgot Atvērt ar Atvērt pārlūkā Atcelt Uzstādīt Netika atrasts video atskaņotājs (jūs variet uzstādīt VLC, lai to atskaņotu). - Netika atrasts video atskaņotājs. Uzstādīt VLC? + Netika atrasts video atskaņotājs. Vai uzstādīt VLC? Publicēts %1$s - Nospiediet uz meklēšanas ikonas, lai sāktu. + Nospiediet uz meklēšanas ikonas, lai atrastu vēlamo saturu. Pielāgot paziņojumu krāsu - Nekas + Neko Ielādējas Sajaukt Atkārtot - Jūs varat izvēlēties ne vairāk kā 3 darbības, kuras rādīs kompaktajā paziņojumā! - Rediģējiet katru paziņojuma darbību, pieskaroties tai. Izvēlieties trīs darbības, kuras rādīs kompaktā paziņojumā, izmantojot rūtiņas labajā pusē. + Jūs variet atlasīt ne vairāk kā 3 darbības, ko rādīt kompaktajā paziņojumā! + Rediģējiet katru zemāk redzamo paziņojuma darbību, pieskaroties tai. Atķeksējiet izvēles rūtiņas labajā pusē, lai atlasītu līdz pat trīm darbībām, kuras rādīt kompaktajā paziņojumā. Piektā darbības poga Ceturtā darbības poga Trešā darbības poga Otrā darbības poga Pirmā darbības poga - Apgriezt video attēlu, kuru rāda paziņojumā, no 16:9 uz 1:1 proporciju (iespējams, attēls būs izstiepts) - Apgriezt video attēlu uz 1:1 proporciju - Rādīt opciju atskaņot video ar Kodi mediju centru - Rādīt \"Atskaņot ar Kodi\" opciju - Uzstādīt trūkstošo Kore lietotni? - Atskaņot ar Kodi - Tikai dažas ierīcas var atskaņot 2K/4K videoklipus + Apgriež paziņojumā redzamo video sīkattēlu no 16:9 uz 1:1 malu attiecību (iespējams, attēls būs izstiepts) + Apgriezt video sīkattēlu uz 1:1 malu attiecību + Rādīt opciju atskaņot video Kodi mediju centrā + Rādīt \"Atskaņot Kodi\" opciju + Uzstādīt trūkstošo Kore, tālvadības pults, lietotni? + Atskaņot Kodi + Ne visas ierīcas var atskaņot 2K/4K izšķirtspējas video Rādīt augstākas izšķirtspējas Noklusējuma izšķirtspēja - Izvēlieties lejupielādes mapi priekš audio failiem - Lejupielādētie audio faili tiek glabāti šeit + Atlasīt lejupielādes mapi, kur glabāt audio datnes + Lejupielādētās audio datnes tiek glabātas šeit Audio lejupielādes mape - Izvēlaties lejupielādes mapi priekš video failiem + Atlasīt lejupielādes mapi, kur glabāt video datnes Lejupielādētās video datnes tiek glabātas šeit Video lejupielādes mape Pievienot - Fonā + Klausīt fonā Atlasiet cilni Saglabātie saraksti Abonementi Rādīt informāciju Abonementu nevarēja atjaunināt - Nevarēja mainīt abonementu + Abonementu nevarēja mainīt Atcelts kanāla abonements Atcelt abonementu Abonēts Abonēt Izmantot ārējo audio atskaņotāju - Noņem skaņu dažās izšķirtspējās + Dažās izšķirtspējās nav pieejami skaņas celiņi Izmantot ārējo video atskaņotāju Kopīgot ar Tiek rādīti %s rezultāti - Vai jūs domājāt \"%1$s\"\? + Varbūt jūs gribējāt meklēt \"%1$s\"? Iestatījumi Meklēt Lejupielādēt video datni @@ -612,15 +600,13 @@ Nesākt video atskaņošanu samazinātā režīmā, bet pilnekrāna režīmā, ja automātiskā rotācija ir izslēgta Izslēgt multivides tuneļošanu Izslēdziet multivides tuneļošanu, ja jums video atskaņošanas laikā parādās melns ekrāns vai aizķeršanās. - Rādīt krāsainas lentes virs attēliem, norādot to avotu: sarkana - tīkls, zila - disks, zaļa - atmiņa Ieslēgt teksta atlasīšanu video aprakstā - Lejupielādes mape vēl nav iestatīta, izvēlieties noklusējuma lejupielādes mapi + Lejupielādes mape vēl nav iestatīta, atlasiet noklusējuma lejupielādes mapi tagad Pavelciet atlasīto elementu pa kreisi vai labi, lai to aizvāktu - Lokālie meklēšanas ieteikumi - Rādīt attēlu indikatorus + Lokālos meklēšanas ieteikumus Augstas kvalitātes (lielāks) Pārbaudīt atjauninājumus - Manuāli pārbaudīt, vai ir jaunas versijas + Pašrocīgi pārbaudīt jaunas versijas pieejamību Video atskaņošanas joslas sīktēla priekšskatījums Pārbauda, vai ir atjauninājumi… Sākot ar Android 10, tikai“Krātuves Piekļuves Sistēma” ir atbalstīta @@ -637,7 +623,7 @@ Privātums Sarakstā neiekļauts Uzņēmums - Servera meklēšanas ieteikumi + Servera meklēšanas ieteikumus Atzīmēt kā noskatītu Apstrādā... Var aizņemt kādu laiku @@ -658,7 +644,7 @@ Jaunās tiešraides Radās kļūda, detalizētāku informāciju skatiet paziņojumā - %s jauna tiešraide + %s jaunas tiešraides %s jauna tiešraide %s jaunas tiešraides @@ -668,7 +654,7 @@ Kļūdas ziņojuma paziņojums Atskaņošanas ielādes intervāla lielums NewPipe radās kļūdu, pieskarieties, lai ziņotu - Kreisā žesta darbība + Kreisās puses žesta darbība Neizdevās kopēt starpliktuvē Noņemt pastāvīgo sīktēlu Pārbaudīt, vai nav jaunas tiešraides @@ -680,20 +666,20 @@ Izveidot kļūdas paziņojumu Jebkurš tīkls Jums ir jaunākā NewPipe versija - Noderīgi, piemēram, lietojot austiņas ar bojātām pogām - Atskaņos skaņu celiņu ar audio aprakstiem vājredzīgajiem, ja tāds ir pieejams - Ignorēt ierīces multimēdiju pogas + Noder, piemēram, kad lietojiet austiņas ar bojātām pogām + Atskaņos skaņas celiņu ar audio aprakstiem vājredzīgajiem, ja tāds ir pieejams + Ignorēt pieslēgtās ierīces multimēdiju pogas Izdzēst visus lejupielādētos failus\? Jaunumi kanālā Dot priekšroku oriģinālajai skaņai - Atskaņos oriģinālo skaņu celiņu neatkarīgi no valodas + Atskaņos oriģinālo skaņas celiņu neatkarīgi no iestatītās valodas Dot priekšroku skaņu celiņam ar audio aprakstu - Izvēlēties žestu kreisajai atskaņotāja ekrāna pusei - Izvēlēties žestu labajai atskaņotāja ekrāna pusei - Labējā žesta darbība - Spilgtums - Skaļums - Nekā + Atlasiet žestu atskaņotāja ekrāna kreisajai pusei + Atlasiet žestu atskaņotāja ekrāna labajai pusei + Labās puses žesta darbība + Regulēt spilgtumu + Regulēt skaļumu + Darīt neko Abonementus var ievietot vai izgūt, izmantojot 3-punktoto izvēlni augšējā labajā ekrāna stūrī Ja Jums rodas problēmas ar lietotni, noteikti apskatiet šīs atbildes bieži uzdotiem jautājumiem! Skatīt tīkla vietnē @@ -708,13 +694,13 @@ Vai vēlaties dzēst visus tiešraižu dublikātus šajā sarakstā\? Rādīt/slēpt tiešraides Ātrais režīms - Paziņot par jaunām tiešraidēm no abonementiem + Informē par jaunām abonementu tiešraidēm Procenti Pustonis Paziņojumi par jaunām tiešraidēm Pārbaužu biežums Galvenās cilnes atlasītāja pārvietošana uz apakšu - Rediģējiet katru turpmāk norādīto paziņojuma darbību, pieskaroties tai. Pirmās trīs darbības (atskaņošana/pauze, iepriekšējais un nākamais) ir iestatītas sistēmā, un tās nevar pielāgot. + Rediģējiet katru zemāk redzamo paziņojuma darbību, pieskaroties tai. Pirmās trīs darbības (atskaņot/pauze, iepriekšējais un nākamais) ir sistēmas iestatītas, un tās nevar pielāgot. Mainīt progresīvā satura ielādes intervāla lielumu (pašlaik %s). Mazāka vērtība var paātrināt to sākotnējo ielādi @@ -728,13 +714,12 @@ Par Sīkattēli Kārtot - NewPipe var automātiski pārbaudīt, vai ir jaunas versijas laiku pa laikam un paziņot jūs, kad tās ir pieejamas. -\nVai jūs gribat šo ieslēgt? + NewPipe pati var automātiski pārbaudīt jaunas versijas pieejamību laiku pa laikam un informēt jūs, kad tā ir pieejama.\nVai jūs tiešām gribiet ieslēgt šo funkciju? Netika atrasts atbilstošs failu pārvaldnieks šai darbībai. \nLūdzu instalējiet failu pārvaldnieku vai pamēģiniet atspējot \'%s\' lejuplādēšanas iestatījumos oriģinālais Nepieciešams tīkla savienojums - Atiestatīt visus iestatījumus uz to sākotnējām vērtībām + Atiestata visus iestatījumus uz to sākotnējām vērtībām Atiestatīt iestatījumus Visu iestatījumu atiestatošana atmetīs visus jūsu izvēlētos iestatījumus un restartēs aplikāciju. \n @@ -763,7 +748,7 @@ Rādīt kļūdas paziņojumu Piegādāt kanālu cilnes Cilnes, kuras piegādāt, atjaunojot jauninājumus. Šai opcijai nav nekādas iedarbības, ja kanāls tiek atjaunots ātrajā režīmā. - Multivides tuneļošana tika atspēkota pēc noklusējuma tādēļ, ka ir zināms, ka jūsu ierīces modelis to neatbalsta. + Multivides tunelēšana tika atspējota pēc noklusējuma tādēļ, ka ir zināms, ka jūsu ierīces modelis to neatbalsta. Izvēlēties kvalitāti ārējiem atskaņotājiem ExoPlayer iestatījumi Kanālu cilnes @@ -774,8 +759,8 @@ Apakškanālu avatāri Augšuplādētāju avatāri Ilgums - Attīt - Patīt + Attīt - tīt atpakaļ + Tīt uz priekšu Izvēlēties attēlu kvalitāti un vai vispār ielādēt attēlus, lai samazinātu datu un atmiņas lietojumu. Izmaiņas iztīra iekšējās atmiņas un diska attēlu kešatmiņu — %s %s atbildes @@ -839,4 +824,16 @@ Atlasiet abonementu grupu YouTube likvidēja apvienoto pašlaik populārs “Ļaut rādīt virs citām lietotnēm” + Meklēt %1$s + Meklēt %1$s (%2$s) + SoundCloud Top 50 lapa likvidēta + Vēl nav izveidota neviena abonementu grupa + Konts slēgts\n\n%1$s norāda, ka iemesls kādēļ: %2$s + Atskaņošanas laikā no servera saņemta HTTP 403 kļūda, ko, iespējams, izraisīja straumēšanas URL derīguma beigu termiņš vai IP aizliegums + Atskaņošanas laikā no servera saņemta HTTP %1$s kļūda + Atskaņošanas laikā no servera saņemta HTTP 403 kļūda, ko, iespējams, izraisīja IP aizliegums vai straumēšanas URL atšifrēšanas (deobfuskācijas) problēmas + 2025. gada augustā Google paziņoja, ka, sākot ar 2026. gada septembri, lai uzstādītu lietotnes, būs nepieciešama izstrādātāja verifikācija visām Android lietotnēm sertificētajās ierīcēs, tostarp arī tām, kuras uzstādītas ārpus Play veikala. Tā kā NewPipe izstrādātāji nepiekrīt un negrib pieņemt šo prasību, pēc šī datuma NewPipe vairs nedarbosies sertificētajās Android ierīcēs. + Detalizētāka informācija + Risinājums + SoundCloud likvidēja oriģinālos Top 50 topus. Atbilstošā cilne noņemta no jūsu galvenās lapas. diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 5ce379216a0..8931cef3d53 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -133,7 +133,7 @@ Извештај Инфо: Што се случи: - What:\\nRequest:\\nContent Language:\\nContent Country:\\nApp Language:\\nService:\\nGMT Time:\\nPackage:\\nVersion:\\nOS version: + What:\nRequest:\nContent Language:\nContent Country:\nApp Language:\nService:\nGMT Time:\nPackage:\nVersion:\nOS version: Ваш коментар (на Англиски): Детали: Емитување на видео, времетраење diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 2fce034d2f4..01380217683 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -112,7 +112,7 @@ കൂടുതൽ വിവരങ്ങൾക്കും വാർത്തകൾക്കും ന്യൂപൈപ്പിന്റെ വെബ്സൈറ്റ് സന്ദർശിക്കുക. വെബ്സൈറ്റ് തിരികെ നൽകുക - എന്താണ്:\\nഅപേക്ഷ:\\nഉള്ളടക്കത്തിന്റെ ഭാഷ:\\nഉള്ളടക്കത്തിന്റെ രാജ്യം:\\n അപ്ലിക്കേഷന്റെ ഭാഷ:\\nസേവനം:\\nGMT സമയം:\\nപാക്കേജ്:\\nപതിപ്പ്:\\nOS ന്റെ പതിപ്പ്: + എന്താണ്:\nഅപേക്ഷ:\nഉള്ളടക്കത്തിന്റെ ഭാഷ:\nഉള്ളടക്കത്തിന്റെ രാജ്യം:\n അപ്ലിക്കേഷന്റെ ഭാഷ:\nസേവനം:\nGMT സമയം:\nപാക്കേജ്:\nപതിപ്പ്:\nOS ന്റെ പതിപ്പ്: നിങ്ങൾക്ക് മികച്ച ഉപഭോക്തൃ അനുഭവം നൽകാനായി പ്രയത്‌നിക്കുന്ന ലോകമെമ്പാടുമുള്ള വൊളന്റിയർമാരാണ് ന്യൂപൈപ്പിന്റെ ശക്തി. ന്യൂപൈപ്പിനെ ഇനിയും മികവുറ്റതാക്കാൻ നിങ്ങൾക്ക് കഴിയും, നിങ്ങളുടെ സംഭാവനയിലൂടെ. സംഭാവന ചെയ്യുക ജിറ്റ്ഹബിൽ കാണുക @@ -590,7 +590,6 @@ രണ്ടാം പ്രവർത്തന ബട്ടൺ ആദ്യ പ്രവർത്തന ബട്ടൺ വീഡിയോ കാണുമ്പോൾ കറുത്ത സ്ക്രീൻ, അവ്യക്തത അനുഭവിക്കുന്നു എങ്കിൽ മീഡിയ ട്യൂൺലിങ് പ്രവർത്തനരഹിതമാക്കുക - ഉറവിടം തിരിച്ചറിയാൻ പിക്കാസോ കളർഡ് റിബൺ ചിത്രങ്ങളുടെ മുകളിൽ കാണിക്കുക: നെറ്റ്‌വർക്കിന് ചുവപ്പ്, ഡിസ്കിനു നീല, മെമ്മറിയിക്ക് പച്ച സീക്ബാർ ചെറുചിത്രം പ്രദർശനം സ്നേഹത്തോടെ സൃഷ്ടാവ് ഡിസ്ക്രിപ്ഷനിലെ ടെക്സ്റ്റ്‌ സെലക്ട്‌ ചെയ്യുവാൻ അനുവദിക്കാതെ ഇരിക്കുക @@ -624,7 +623,6 @@ കാണിക്കരുത് കുറഞ്ഞ നിലവാരം (ചെറുത് ) ഉയർന്ന നിലവാരം (വലിയത് ) - ഇമേജ് ഇൻഡിക്കേറ്ററുകൾ കാണിക്കുക മീഡിയ ട്യൂൺലിങ് പ്രവർത്തനരഹിതമാക്കുക ഡൌൺലോഡ് ഫോൾഡർ ഇത് വരെയും സെറ്റ് ചെയ്തിട്ടില്ല, സ്ഥിര ഡൌൺലോഡ് ഫോൾഡർ ഇപ്പോൾ തിരഞ്ഞെക്കുക അഭിപ്രായങ്ങൾ പ്രവർത്തനരഹിതമായിരിക്കുന്നു diff --git a/app/src/main/res/values-mr/strings.xml b/app/src/main/res/values-mr/strings.xml index 7a6b2eda429..de6cec2a0db 100644 --- a/app/src/main/res/values-mr/strings.xml +++ b/app/src/main/res/values-mr/strings.xml @@ -31,7 +31,7 @@ पॉप अप मोड मध्ये उघडा हा मेन्यू नमुना व्हिडिओ किंवा ऑडियो वेब ब्राउजर मध्ये चालवू शकतो रद्द करा - इंस्टॉल + स्थापित करा प्लेअर सापडले नाही (तुम्ही VLC player वापरून फाईल चालवू शकता). प्लेअर सापडले नाही. VLC प्लेअर इंस्टॉल करू इच्छिता का\? प्रारंभ करण्यासाठी मॅग्निफाइंग ग्लासवर टॅप करा. @@ -236,4 +236,4 @@ माहिती रांगेत आहे बंद करा - \ No newline at end of file + diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index b0039bf0cd0..bf4da344021 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -158,7 +158,7 @@ Lapor Maklumat: Apa yang berlaku: - Apa:\\nPermintaan:\\nBahasa Kandungan:\\nNegara Kandungan:\\nBahasa Aplikasi:\\nPerkhidmatan:\\nWaktu GMT:\\nPakej:\\nVersi:\\nVersi OS: + Apa:\nPermintaan:\nBahasa Kandungan:\nNegara Kandungan:\nBahasa Aplikasi:\nPerkhidmatan:\nWaktu GMT:\nPakej:\nVersi:\nVersi OS: Ulasan anda (dalam bahasa Inggeris): Butiran: Main video, tempoh masa: diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 404851e6df6..7d25bf84732 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -76,7 +76,7 @@ Trykk for detaljer Vent… Kopiert til utklippstavle - Hva:\\nForespørsel:\\nInnholdsspråk:\\nInnholdsland:\\nAppspråk:\\nTjeneste:\\nGMT-tid:\\nPakke:\\nVersjon:\\nOS-versjon: + Hva:\nForespørsel:\nInnholdsspråk:\nInnholdsland:\nAppspråk:\nTjeneste:\nGMT-tid:\nPakke:\nVersjon:\nOS-versjon: Start Definer en nedlastingsmappe senere i innstillingene reCAPTCHA-oppgave @@ -638,9 +638,7 @@ Lokale søkeforslag Marker som sett Ikke start videoer i minispilleren, men bytt til fullskjermsmodus direkte dersom auto-rotering er låst. Du har fremdeles tilgang til minispilleren ved å avslutte fullskjermsvisningen - Vis Picasso-fargede bånd på toppen av bilder for å indikere kilde: Rød for nettverk, blå for disk, og grønn for minne Hjertemerket av skaperen - Vis bildeindikatorer Dra elementer for å fjerne dem Start hovedspiller i fullskjerm Still i kø neste diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index 75e113d4e0a..06e2bacc1a4 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -163,7 +163,7 @@ रिपोर्ट जानकारी: के भयो: - के:\\nअनुरोध:\\nसामग्री भाषा: \\nसेवा:\\nGMT समय:\\nप्याकेज:\\nसंस्करण: \\nOS संस्करण: + के:\nअनुरोध:\nसामग्री भाषा: \nसेवा:\nGMT समय:\nप्याकेज:\nसंस्करण: \nOS संस्करण: तपाईंको टिप्पणी (अंग्रेजी मा): विवरण: प्ले भिडियो, अवधि: diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index 148468dd292..237e9238c94 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -134,7 +134,7 @@ Melden Info: Wat er is gebeurd: - Wat:\\nVerzoek:\\nTaal van inhoud:\\nLand:\\nTaal van applicatie:\\nDienst:\\nGMT tijd:\\nPakket:\\nVersie:\\nVersie van besturingssysteem: + Wat:\nVerzoek:\nTaal van inhoud:\nLand:\nTaal van applicatie:\nDienst:\nGMT tijd:\nPakket:\nVersie:\nVersie van besturingssysteem: Uw opmerking (in het Engels): Details: Speel video, tijd: @@ -606,7 +606,6 @@ Geen download map ingesteld, kies nu de standaard download map Niet tonen Reacties zijn uitgeschakeld - Toon afbeeldingsindicatoren Speler melding Configureer actieve stream melding Meldingen diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index c7aab3577af..2ff13b391f5 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -65,7 +65,7 @@ Downloads Foutrapport App/UI gecrasht - Wat:\\nVerzoek:\\nInhoudstaal:\\nInhoudsland:\\nApp-taal:\\nDienst:\\nGMT-tijd:\\nPakket:\\nVersie:\\nVersie van besturingssysteem: + Wat:\nVerzoek:\nInhoudstaal:\nInhoudsland:\nApp-taal:\nDienst:\nGMT-tijd:\nPakket:\nVersie:\nVersie van besturingssysteem: Starten Pauzeren Verwijderen @@ -213,7 +213,7 @@ Dit overschrijft je huidige configuratie. Streambestand downloaden Informatie tonen - Bijgehouden afspeellijsten + Afspeellijsten Toevoegen aan Versleep om de volgorde te wijzigen Aanmaken @@ -503,8 +503,8 @@ \n \nHopelijk zal dit bij een toekomstige versie ondersteund worden. Ja, en deels bekeken video\'s - Video\'s die zijn bekeken voor, en na ze werden toegevoegd aan de afspeellijst worden verwijderd. \nWeet u dit zeker? Deze actie kan niet ongedaan gemaakt worden! - Bekeken video\'s verwijderen? + Streams die zijn bekeken voor, en na ze werden toegevoegd aan de afspeellijst worden verwijderd. \nWeet u dit zeker? + Bekeken streams verwijderen? ∞ video\'s 100+ video\'s Deze video heeft een leeftijdsbeperking. @@ -626,8 +626,6 @@ Lage kwaliteit (kleiner) Hoge kwaliteit (groter) Zoekbalk miniatuurafbeelding voorbeeld - Toon Picasso-gekleurde linten bovenop afbeeldingen die hun bron aangeven: rood voor netwerk, blauw voor schijf en groen voor geheugen - Afbeeldings­indicatoren tonen Reacties zijn uitgeschakeld Zoeksuggesties op afstand Lokale zoeksuggesties diff --git a/app/src/main/res/values-nqo/strings.xml b/app/src/main/res/values-nqo/strings.xml index fb695004604..ee17b09211f 100644 --- a/app/src/main/res/values-nqo/strings.xml +++ b/app/src/main/res/values-nqo/strings.xml @@ -166,7 +166,7 @@ ߘߌ߬ߢߍ߬߸ ߞߏ߫ ߘߏ߫ ߡߊ߫ ߕߊ߬ߡߌ߲߬ ߞߏߢߊ߬. ߟߌ߬ߤߟߊ: ߡߎ߲߬ ߞߍߣߍ߲߫: - ߡߎ߲߬:\\nRequest:\\nContent Language:\\nContent Country:\\nApp Language:\\nService:\\nGMT Time:\\nPackage:\\nVersion:\\nOS version: + ߡߎ߲߬:\nRequest:\nContent Language:\nContent Country:\nApp Language:\nService:\nGMT Time:\nPackage:\nVersion:\nOS version: ߌ ߟߊ߫ ߞߊ߲߬ߞߎߡߊ (ߊ߲߬ߞߌ߬ߟߍ߬ ߞߊ߲ ߘߐ߫): ߕߐ߬ߝߍ߬ߦߊ ߟߎ߬: ߦߋߡߍ߲ߕߊ ߘߐߞߊ߬ߙߊ߲߸ ߥߎ߬ߛߎ: @@ -436,8 +436,6 @@ ߗߋߢߊߟߌ ߟߎ߬ ߞߟߏߜߍ߫ ߓߐߛߎ߲ߡߊ ߟߎ߬ ߦߌ߬ߘߊ߬ߕߐ߫ ߟߋ߬ ߟߊ߬ߖߍ߲߬ߛߍ߲߬ߠߌ߲ ߘߐ߫ ߞߋߟߋߞߋߟߋ ߟߊ߫ ߝߊߟߊ߲ߓߍߦߊ ߟߊߛߊ߬ ߞߋߟߋߞߋߟߋ ߟߊ߫ ߝߊߟߊ߲ߓߍߦߊ ߟߊߛߊ߬ ߣߴߌ ߞߊ߬ ߥߊ߲߬ߊߥߊ߲߬ ߝߌ߲ ߦߋ߫ ߥߟߊ߫ ߜߊߘߊ߲ߜߊߘߊ߲ߠߌ߲ ߦߋߡߍ߲ߕߊ ߘߏ߫ ߘߐߛߊߙߌ߫ ߕߎߡߊ - ߞߊ߬ ߖߌ߬ߦߊ߬ߓߍ߫ ߦߌ߬ߘߊ߬ߟߊ߲ ߠߎ߫ ߝߍ߲߬ߛߍ߲߫ - ߏ߬ ߦߋ߫ ߔߌߛߊߞߏ߫ ߟߊ߫ ߡߙߎߝߋ߫ ߞߟߐ߬ߡߊ ߟߎ߫ ߟߋ߬ ߝߍ߲߬ߛߍ߲߬ ߠߊ߫ ߖߌ߬ߦߊ߬ߓߍ ߟߎ߫ ߞߎ߲߬ߘߐ߫ ߞߵߊ߬ߟߎ߬ ߓߐߛߎ߲ ߦߌ߬ߘߊ߬: ߥߎߟߋ߲߬ߡߊ߲ ߦߋ߫ ߞߙߏ߬ߝߏ ߕߊ ߘߌ߫߸ ߓߊ߯ߡߊ ߦߋ߫ ߝߘߍ߬ ߜߍߟߍ߲ ߕߊ ߘߌ߫ ߊ߬ߣߌ߫ ߝߙߌߛߌߡߊ ߦߋ߫ ߦߟߌߕߏߟߊ߲ ߕߊ ߘߌ߫ ߟߊ߬ߓߐ߬ߟߌ ߦߴߌߘߐ߫… ߞߵߊ߬ ߘߊߡߌ߬ߣߊ߬ ߞߊ߲߬ߞߎߡߊ ߟߎ߬ ߟߊߛߊ߬ߣߍ߲ ߠߋ߬ diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index d15afa4fec8..57459de1093 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -340,7 +340,6 @@ ସେବାଗୁଡିକରୁ ମୂଳ ଲେଖା ଷ୍ଟ୍ରିମ୍ ଆଇଟମ୍ ଗୁଡିକରେ ଦୃଶ୍ୟମାନ ହେବ ମିଡିଆ ଟନେଲିଂକୁ ଅକ୍ଷମ କରନ୍ତୁ ଯଦି ଆପଣ ଏକ କଳା ପରଦା ଅନୁଭବ କରନ୍ତି କିମ୍ବା ଭିଡିଓ ପ୍ଲେବେକ୍ ଉପରେ ଝୁଣ୍ଟି ପଡ଼ନ୍ତି ତେବେ ମିଡିଆ ଟନେଲିଂକୁ ଅକ୍ଷମ କରନ୍ତୁ । - ଚିତ୍ରଗୁଡ଼ିକର ଉପରେ ପିକାସୋ ରଙ୍ଗୀନ ଫିତା ଦେଖାନ୍ତୁ: ସେମାନଙ୍କର ଉତ୍ସକୁ ସୂଚାଇଥାଏ: ନେଟୱାର୍କ ପାଇଁ ନାଲି, ଡିସ୍କ ପାଇଁ ନୀଳ ଏବଂ ସ୍ମୃତି ପାଇଁ ସବୁଜ ଆମଦାନି କରନ୍ତୁ ଠାରୁ ଆମଦାନୀ କରନ୍ତୁ ଆମଦାନି… @@ -461,7 +460,7 @@ ଫାଇଲ୍ ବିଦ୍ୟମାନ ନାହିଁ କିମ୍ବା ଏହାକୁ ପଢ଼ିବା କିମ୍ବା ଲେଖିବା ପାଇଁ ଅନୁମତି ଅଭାବ ଏପରି ଫୋଲ୍ଡର ନାହିଁ ସଞ୍ଚିତ ଟ୍ୟାବଗୁଡିକ ପଢ଼ି ପାରିଲା ନାହିଁ, ତେଣୁ ଡିଫଲ୍ଟଗୁଡିକ ବ୍ୟବହାର କରି - କଣ:\\nRequest:\\nContent Language:\\nContent Country:\\nApp Language:\\nService:\\nGMT Time:\\nPackage:\\nVersion:\\nOS ସଂସ୍କରଣ: + କଣ:\nRequest:\nContent Language:\nContent Country:\nApp Language:\nService:\nGMT Time:\nPackage:\nVersion:\nOS ସଂସ୍କରଣ: କୌଣସି ଫଳାଫଳ ନାହିଁ ଏଠାରେ କ୍ରିକେଟ୍ ବ୍ୟତୀତ ଆଉ କିଛି ନାହିଁ ପୁନଃଚେଷ୍ଟା କରନ୍ତୁ @@ -651,7 +650,6 @@ ଅଟୋ-ଜେନେରେଟ୍ (କୌଣସି ଅପଲୋଡର୍ ମିଳିଲା ନାହିଁ) ପୁରଣ କରନ୍ତୁ କ୍ୟାପସନ୍ - ପ୍ରତିଛବି ସୂଚକ ଦେଖାନ୍ତୁ ପ୍ଲେୟାର ବ୍ୟବହାର କରିବା ସମୟରେ ଏକ କ୍ରାସ୍ ବିକଳ୍ପ ଦେଖାଏ ନୂତନ ଷ୍ଟ୍ରିମ୍ ପାଇଁ ଯାଞ୍ଚ ଚଲାନ୍ତୁ ଆପ୍ କ୍ରାସ୍ କରନ୍ତୁ diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 2c6158355d0..cc0be8ae47f 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -140,7 +140,7 @@ ਇਤਲਾਹ ਕਰੋ ਜਾਣਕਾਰੀ: ਕੀ ਹੋਇਆ ਹੈ: - ਕੀ:\\nRequest:\\nContent ਭਾਸ਼ਾ/ਬੋਲੀ:\\nContent Country:\\nApp ਭਾਸ਼ਾ/ਬੋਲੀ:\\nService:\\nGMT ਸਮਾਂ:\\nPackage:\\nVersion:\\nOS version: + ਕੀ:\nRequest:\nContent ਭਾਸ਼ਾ/ਬੋਲੀ:\nContent Country:\nApp ਭਾਸ਼ਾ/ਬੋਲੀ:\nService:\nGMT ਸਮਾਂ:\nPackage:\nVersion:\nOS version: ਤੁਹਾਡੀ ਟਿੱਪਣੀ (ਅੰਗਰੇਜ਼ੀ ਵਿਚ): ਵੇਰਵੇ: ਵੀਡੀਓ ਚਲਾਓ, ਮਿਆਦ: @@ -602,8 +602,6 @@ ਨਿਊਪਾਈਪ ਖਾਮੀ ਤੋਂ ਪ੍ਰਭਾਵਤ ਹੋਈ ਹੈ, ਇੱਥੇ ਨੱਪ ਕੇ ਰਿਪੋਰਟ ਕਰੋ ਇੱਕ ਖਾਮੀ ਪ੍ਰਭਾਵੀ ਹੋਈ ਹੈ, ਨੋਟੀਫੀਕੇਸ਼ਨ ਵੇਖੋ ਆਈਟਮਾਂ ਨੂੰ ਇੱਕ ਪਾਸੇ ਖਿੱਚ ਕੇ ਹਟਾਓ - ਦ੍ਰਿਸ਼ ਸੂਚਕ ਵਿਖਾਓ - ਦ੍ਰਿਸ਼ਾਂ ਦੇ ਉੱਪਰ ਉਹਨਾਂ ਦੀ ਸਰੋਤ-ਪਛਾਣ ਲਈ ਪਿਕਾਸੋ ਦੇ ਰੰਗਦਾਰ ਰਿਬਨ ਵਿਖਾਓ : ਨੈੱਟਵਰਕ ਲਈ ਲਾਲ, ਡਿਸਕ ਲਈ ਨੀਲੇ ਤੇ ਮੈਮਰੀ ਲਈ ਹਰੇ ਨਵੀਂ ਸਟ੍ਰੀਮ ਦੇ ਨੋਟੀਫਿਕੇਸ਼ਨ ਪਿੰਨ ਕੀਤੀ ਟਿੱਪਣੀ ਅੱਪਡੇਟ ਦੀ ਉਪਲੱਬਧਤਾ ਪਰਖੀ ਜਾ ਰਹੀ… diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index c72e6de26e9..cf45f92fd43 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -55,7 +55,7 @@ Zgłoś Informacje: Co się stało: - Co:\\nŻądanie:\\nJęzyk treści:\\nKraj treści:\\nJęzyk aplikacji:\\nUsługa:\\nZnacznik czasu:\\nPakiet:\\nWersja:\\nWersja systemu: + Co:\nŻądanie:\nJęzyk treści:\nKraj treści:\nJęzyk aplikacji:\nUsługa:\nZnacznik czasu:\nPakiet:\nWersja:\nWersja systemu: Twój komentarz (po angielsku): Szczegóły: Odtwarzane wideo, czas trwania: @@ -643,8 +643,6 @@ Nie pokazuj Serduszko od twórcy Oznacz jako obejrzane - Pokazuj kolorowe wstążki Picasso nad obrazami wskazujące ich źródło: czerwone dla sieci, niebieskie dla dysku i zielone dla pamięci - Pokazuj wskaźniki obrazu Zdalne podpowiedzi wyszukiwania Lokalne podpowiedzi wyszukiwania @@ -872,4 +870,7 @@ Podczas odtwarzania otrzymano od serwera błąd HTTP 403, prawdopodobnie spowodowany blokadą adresu IP lub problemami z odszyfrowaniem adresu URL strumienia. %1$s odmówił dostarczenia danych, prosząc o zalogowanie się w celu potwierdzenia, że nie jest się botem.\n\nTwoje IP mogło zostać tymczasowo zablokowane przez %1$s. Możesz chwilę poczekać lub zmienić adres IP (na przykład włączając/wyłączając VPN lub przełączając się z sieci Wi-Fi na dane komórkowe). Ta treść nie jest dostępna dla aktualnie wybranego kraju treści.\n\nZmień swój wybór w „Ustawienia > Zawartość > Domyślny kraj treści”. + W sierpniu 2025 r. Google ogłosił, że od września 2026 r. instalowanie aplikacji będzie wymagać weryfikacji ich twórców w przypadku wszystkich aplikacji na Androida na certyfikowanych urządzeniach, w tym tych zainstalowanych poza sklepem Google Play. Ponieważ programiści NewPipe nie zgadzają się z tym wymogiem, NewPipie nie będzie już działać na certyfikowanych urządzeniach z Androidem po tym czasie. + Szczegóły + Rozwiązanie diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 7488e69c73b..056551d3f71 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -69,20 +69,20 @@ Vídeos baixados são salvos aqui Pasta para vídeos baixados Instalar Kore? - Toque na lupa para começar. + Toque no ícone de lupa para iniciar sua busca. Processos Por favor, defina uma pasta de download depois nas configurações - Player de vídeo não encontrado. Instalar VLC? + O player de video não foi encontrado, mas você pode instalar o VLC. Deseja fazer isso? O site não pôde ser analisado Áudio Reproduzir no Kodi Buscar Mostrar opção para reproduzir o vídeo no Kodi Usar player de áudio externo - Usar player de vídeo externo + Usar um player de vídeo alternativo Mostrar opção \"Reproduzir no Kodi\" - O que aconteceu:\\nPedido:\\nIdioma do conteúdo:\\nPaís do conteúdo:\\nIdioma do aplicativo:\\nServiço:\\nHora GMT:\\nPacote:\\nVersão:\\nVersão do SO: - Abrir no modo Popup + O que aconteceu:\nPedido:\nIdioma do conteúdo:\nPaís do conteúdo:\nIdioma do aplicativo:\nServiço:\nHora GMT:\nPacote:\nVersão:\nVersão do SO: + Reproduzir no modo flutuante Resolução padrão do Popup Mostrar resoluções mais altas Apenas alguns dispositivos suportam vídeos em 2K/4K @@ -97,7 +97,7 @@ Segundo plano Lembrar propriedades do Popup Lembrar último tamanho e posição do Popup - Remove áudio em algumas resoluções + Atenção: o áudio pode não funcionar em certas resoluções Sugestões de busca Escolha as sugestões a serem exibidas enquanto estiver buscando Melhor resolução @@ -129,7 +129,7 @@ Continuar a reprodução após interrupções (por exemplo, chamadas telefônicas) Histórico de busca Armazena o histórico de busca localmente - Histórico de exibição + Histórico de reprodução Mantenha o controle dos vídeos assistidos Histórico Histórico @@ -188,7 +188,7 @@ Retribuir Site oficial Visite o site do NewPipe para mais informações e novidades. - Player de vídeo não encontrado (você pode instalar o VLC para reproduzi-lo). + O player de vídeo não foi encontrado, mas você pode instalar o VLC para tentar reproduzi-lo. País padrão do conteúdo Sempre Apenas uma vez @@ -212,7 +212,7 @@ Nenhum arquivo ZIP válido Aviso: Não foi possível importar todos os arquivos. Isso irá sobrescrever suas configurações atuais. - Baixar arquivo + Salvar arquivo para reprodução sem internet Mostrar informação Playlists favoritas Adicionar a @@ -295,10 +295,10 @@ Fechar gaveta Legendas Mudar tamanho da legenda e estilos de plano de fundo. Requer reiniciar o aplicativo para ter efeito - Remover histórico de exibição + Remover histórico de reprodução Remove o histórico de vídeos assistidos e as posições de reprodução - Remover todo o histórico de exibição? - Histórico de exibição removido + Remover todo o histórico de reprodução? + Histórico de reprodução removido Remover histórico de buscas Remove o histórico de buscas Remover todo o histórico de buscas? @@ -518,7 +518,7 @@ \n \nAtive \"%1$s\" nas configurações se quiser vê-lo. Sim, e vídeos parcialmente assistidos - Os vídeos que foram assistidos antes e depois de terem sidos adicionados à playlist serão removidos. \nTem certeza? Esta ação não pode ser desfeita! + Os vídeos que foram assistidos antes e depois de terem sidos adicionados à playlist serão removidos. \nTem certeza? Remover vídeos assistidos? Remover assistidos Textos originais dos serviços serão visíveis nos itens de transmissão @@ -581,7 +581,7 @@ Comentários Desative para ocultar a descrição do vídeo e informações adicionais Mostrar descrição - Abrir com + Reproduzir com Nenhum aplicativo em seu dispositivo pode abrir isso O aplicativo parou Este conteúdo está disponível apenas para usuários que pagaram, portanto não pode ser transmitido ou baixado pelo NewPipe. @@ -638,7 +638,6 @@ Os comentários estão desabilitados Marcar como assistido Curtido pelo criador - Exibir fitas coloridas no topo das imagens indicando sua fonte: vermelho para rede, azul para disco e verde para memória %1$s download excluído %1$s downloads excluídos @@ -649,7 +648,6 @@ %s downloads concluídos %s downloads concluídos - Mostrar indicadores de imagem Adicionado na próxima posição da fila Enfileira a próxima Deslize os itens para remove-los @@ -863,4 +861,7 @@ Erro HTTP 403 recebido do servidor durante a reprodução, provavelmente causado por um banimento de IP ou problemas de desofuscação de URL de streaming %1$s se recusou a fornecer dados, solicitando um login para confirmar que o solicitante não é um bot.\n\nSeu IP pode ter sido temporariamente banido por %1$s. Você pode esperar um pouco ou mudar para um IP diferente (por exemplo, ativando/desativando uma VPN ou alternando de Wi-Fi para dados móveis). Este conteúdo não está disponível para o país selecionado atualmente.\n\nAltere sua seleção acessando “Configurações > Conteúdo > País padrão do conteúdo”. + Em agosto de 2025, o Google anunciou que, a partir de setembro de 2026, a instalação de aplicativos exigirá a verificação do desenvolvedor para todos os aplicativos Android em dispositivos certificados, incluindo aqueles instalados fora da Play Store. Como os desenvolvedores do NewPipe não concordam com esse requisito, o NewPipe não funcionará mais em dispositivos Android certificados após essa data. + Detalhes + Solução diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 4e9a85522be..8bee327f302 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -144,7 +144,7 @@ Eliminar ficheiros descarregados Idioma da aplicação Utilizadores - Os vídeos que tenham sido vistos antes e depois de serem adicionados à lista de reprodução serão removidos. \nTem a certeza? Esta ação não pode ser revertida! + Os vídeos que tenham sido vistos antes e após serem adicionados à lista de reprodução serão removidos. \nTem a certeza? %s a ver %s a ver @@ -202,7 +202,7 @@ Gerar nome único Ação a executar ao trocar para outra aplicação a partir do menu principal - %s Utilizar reprodutor de vídeo externo - O quê:\\nPedido:\\nIdioma do conteúdo:\\nPaís do conteúdo\\nIdioma da aplicação\\nServiço:\\nHora GMT:\\nPacote:\\nVersão:\\nSO Versão: + O quê:\nPedido:\nIdioma do conteúdo:\nPaís do conteúdo\nIdioma da aplicação\nServiço:\nHora GMT:\nPacote:\nVersão:\nSO Versão: Se tem ideias para: tradução, alterações de desenho, limpeza de código, ou alterações significativas no código fonte - todas as ajudas são bem-vindas. Quanto mais se faz, melhor ficará! Limpar dados Apenas uma vez @@ -280,7 +280,7 @@ Notificações para novas versões do NewPipe Histórico Lista - Remover vídeos visualizados? + Remover transmissões vistas? %d minuto %d minutos @@ -638,8 +638,6 @@ Ainda não foi definida uma pasta de descarregamento, escolha agora a pasta de descarregamento padrão Comentários estão desativados Marcar como visto - Mostrar fitas coloridas de Picasso em cima das imagens que indicam a sua fonte: vermelho para rede, azul para disco e verde para memória - Mostrar indicadores de imagem Sugestões de pesquisa remotas Sugestões de pesquisa locais @@ -863,4 +861,7 @@ Este conteúdo não está disponível para o país de conteúdo atualmente selecionado.\n\nAltere a sua seleção de \"Configurações > Conteúdo > País predefinido de conteúdo\". Erro HTTP 403 recebido do servidor durante a reprodução, provavelmente causado pela URL de streaming expirado ou IP banido Erro HTTP 403 recebido do servidor durante a reprodução, provavelmente causado por um bloqueio de IP ou problemas de desofuscação da URL de streaming + Em agosto de 2025, o Google anunciou que, a partir de setembro de 2026, a instalação de apps exigirá a verificação do programador para todas as apps Android em dispositivos certificados, incluindo aqueles instalados fora da Play Store. Como os programadores do NewPipe não concordam com este requisito, o NewPipe já não funcionará em dispositivos Android certificados após essa data. + Pormenores + Solução diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index e18984dc27b..a8d6ff26a82 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -78,7 +78,7 @@ Processos Descarga NewPipe Aplicação terminou em erro - O quê:\\nPedido:\\nIdioma do conteúdo:\\nPaís do conteúdo\\nIdioma da aplicação\\nServiço:\\nHora GMT:\\nPacote:\\nVersão:\\nSO Versão: + O quê:\nPedido:\nIdioma do conteúdo:\nPaís do conteúdo\nIdioma da aplicação\nServiço:\nHora GMT:\nPacote:\nVersão:\nSO Versão: Abrir no modo popup Preto Tudo @@ -517,9 +517,9 @@ Este vídeo está restringido a adultos. \n \nPara o poder ver, tem que ativar \"%1$s\" nas definições. - Os vídeos que tenham sido vistos antes e depois de serem adicionados à lista de reprodução serão removidos. \nTem a certeza? Esta ação não pode ser revertida! + Os vídeos que tenham sido vistos antes e após serem adicionados à lista de reprodução serão removidos. \nTem a certeza? Sim e também os vídeos parcialmente vistos - Remover vídeos visualizados? + Remover transmissões vistas? Remover visualizados Os textos originais dos serviços serão visíveis nos itens do vídeo Mostrar antiguidade nos itens @@ -638,8 +638,6 @@ Baixa qualidade (menor) Alta qualidade (maior) Os comentários estão desativados - Mostrar fitas coloridas de Picasso em cima das imagens que indicam a sua fonte: vermelho para rede, azul para disco e verde para memória - Mostrar indicadores de imagem Sugestões de pesquisa remotas Sugestões de pesquisa locais @@ -863,4 +861,7 @@ Este conteúdo não está disponível para o país de conteúdo atualmente selecionado.\n\nAltere a sua seleção de \"Configurações > Conteúdo > País predefinido de conteúdo\". Erro HTTP 403 recebido do servidor durante a reprodução, provavelmente causado pela URL de streaming expirado ou IP banido Erro HTTP 403 recebido do servidor durante a reprodução, provavelmente causado por um bloqueio de IP ou problemas de desofuscação da URL de streaming + Em agosto de 2025, o Google anunciou que, a partir de setembro de 2026, a instalação de apps exigirá a verificação do programador para todas as apps Android em dispositivos certificados, incluindo aqueles instalados fora da Play Store. Como os programadores do NewPipe não concordam com este requisito, o NewPipe já não funcionará em dispositivos Android certificados após essa data. + Detalhes + Solução diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index ccd1483a1e3..c5c45089474 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -91,7 +91,7 @@ Toate Dezactivat Aplicația/UI s-a oprit - Ce:\\nSolicitare:\\nLimba conținutului:\\nȚara conținutului:\\nLimba aplicației:\\nServiciu:\\nOra GMT:\\nPachet:\\nVersiune:\\nVersiune SO: + Ce:\nSolicitare:\nLimba conținutului:\nȚara conținutului:\nLimba aplicației:\nServiciu:\nOra GMT:\nPachet:\nVersiune:\nVersiune SO: Elimină sunetul audio la anumite rezoluții Fundal Pop-up @@ -654,8 +654,6 @@ Calitate scăzută (mai mică) Calitate înaltă (mai mare) Miniatură de previzualizare în bara de derulare - Afișați panglici colorate de Picasso deasupra imaginilor, indicând sursa acestora: roșu pentru rețea, albastru pentru disc și verde pentru memorie - Afișați indicatorii de imagine Dezactivați tunelarea media dacă întâmpinați un ecran negru sau blocaje la redarea video. Procesarea.. Poate dura un moment Verifică dacă există actualizări diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index b96667f93c9..5bacb22ef7c 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -87,7 +87,7 @@ Воспроизведение во всплывающем окне Очистить Всё - Что:\\nЗапрос:\\nЯзык контента:\\nСтрана контента:\\nЯзык приложения:\\nСервис:\\nВремя по Гринвичу:\\nПакет:\\nВерсия пакета:\\nВерсия ОС: + Что:\nЗапрос:\nЯзык контента:\nСтрана контента:\nЯзык приложения:\nСервис:\nВремя по Гринвичу:\nПакет:\nВерсия пакета:\nВерсия ОС: Это разрешение нужно для \nвоспроизведения в окне Открыть во всплывающем окне @@ -345,7 +345,7 @@ Сетка Автоматически Загрузка на SD-карту невозможна. Сбросить расположение папки загрузки\? - SD-карта недоступна + Внешнее хранилище недоступно Вкладки, видимые на главной странице Значения по умолчанию Восстановить значения по умолчанию\? @@ -510,7 +510,7 @@ \nКак пример, YouTube поддерживает быстрое обновление. \n \nВыбор за вами: скорость или точность. - Обновление по RSS, если доступно + Получать из выделенной ленты, когда доступно Доступно для некоторых сервисов, быстрое, может возвращать не всё содержимое канала и не содержать часть сведений (длительность, статус трансляции) Период актуальности подписок после обновления — %s Это видео имеет возрастное ограничение. @@ -526,8 +526,8 @@ Альбомы Удалить просмотренные Да, и частично просмотренные - Видео, просмотренные до или после добавления в плейлист, будут удалены. \nПродолжить? Не может быть отменено! - Удалить просмотренные видео? + Трансляции, просмотренные до или после добавления в плейлист, будут удалены. \nВы уверены? + Удалить просмотренные трансляции? Отображать сообщённое сервисом время с момента публикации Исходное время публикации Включить \"Ограниченный режим\" YouTube @@ -633,7 +633,7 @@ Ошибка загрузки подписки Открыть веб-сайт Аккаунт отключён - Начиная с Android 10 поддерживается только «Storage Access Framework» + Начиная с Android 10, поддерживается только \"Storage Access Framework\" Спрашивать, куда сохранять каждую загрузку Папка для загрузки ещё не выбрана, укажите папку для загрузки сейчас Отключить @@ -646,8 +646,6 @@ Миниатюра над полосой прокрутки Автору видео понравилось это Пометить проигранным - Picasso: указать цветом источник изображений (красный — сеть, синий — диск, зелёный — память) - Цветные метки на изображениях Серверные предложения поиска Локальные предложения поиска @@ -868,4 +866,7 @@ Во время воспроизведения получена ошибка HTTP 403 от сервера, вероятно, вызванная блокировкой IP-адреса или проблемами деобфускации URL-адреса потоковой передачи %1$s отказался предоставить данные, запросив логин для подтверждения, что запросчик не бот.\n\nВозможно, ваш IP-адрес временно заблокирован %1$s. Вы можете подождать некоторое время или переключиться на другой IP-адрес (например, включив/выключив VPN или переключившись с Wi-Fi на мобильный интернет). Этот контент недоступен для выбранной страны контента.\n\nИзмените свой выбор в разделе «Настройки > Контент > Страна контента по умолчанию». + В августе 2025 года, Google анонсировала, что с сентября 2026 года, установка приложений потребует верификации разработчика для всех Android приложений на сертифицированных устройствах, включая те, которые были установлены не через Play Store. Поскольку разработчики NewPipe не согласны с этим требованием, NewPipe перестанет работать на сертифицированных Android устройствах после этой даты. + Подробнее + Решение diff --git a/app/src/main/res/values-ryu/strings.xml b/app/src/main/res/values-ryu/strings.xml index 6b70c0c8e61..f5b40be8397 100644 --- a/app/src/main/res/values-ryu/strings.xml +++ b/app/src/main/res/values-ryu/strings.xml @@ -78,7 +78,7 @@ ダウンロード ふぐあいほうくーく アプリ(UI)やしがクラッシュさびたん - ちゃーるむんだい:\\nリクエスト:\\nコンテンツぬぎんぐ:\\nコンテンツぬくに:\\nアプリぬぎんぐ:\\nサービス:\\nGMTじかん:\\nパッケージ:\\nバージョン:\\nOSぬバージョン: + ちゃーるむんだい:\nリクエスト:\nコンテンツぬぎんぐ:\nコンテンツぬくに:\nアプリぬぎんぐ:\nサービス:\nGMTじかん:\nパッケージ:\nバージョン:\nOSぬバージョン: reCAPTCHAぬようきゅう reCAPTCHAようきゅうさびたん ブラック @@ -640,8 +640,6 @@ %sちぬダウンロードぬかんりょうさびたん %sちぬダウンロードぬかんりょうさびたん - ピカソー、がぞうぬういに、がぞうくとぅどぅくるしーきびちするしきさいきしーょうひょうじさびーん: あかーネットワーク、あおーディスク、みどぅれーメモリ - やしがぞうんかいふぃいょうしきひょうじ しーょりちゅう… くーてーんじがんがかかいんかむしりやびらん みーさるバージョンしーゅどうでぃかくにんさびーん アップデートかくにんちゅう… diff --git a/app/src/main/res/values-sat/strings.xml b/app/src/main/res/values-sat/strings.xml index 88e9cfca1f6..47ac2c53d04 100644 --- a/app/src/main/res/values-sat/strings.xml +++ b/app/src/main/res/values-sat/strings.xml @@ -209,7 +209,7 @@ ᱢᱤᱫ ᱵᱷᱩᱞ ᱦᱩᱭ ᱞᱮᱱᱟ, ᱱᱤᱴᱤᱯᱷᱤᱠᱮᱥᱚᱱ ᱧᱮᱞ ᱢᱮ GitHub ᱨᱮ ᱚᱱᱚᱞ ᱨᱤᱯᱚᱨᱴ - What:\\nRequest:\\nContent Language:\\nContent ᱫᱤᱥᱚᱢ:\\nApp Language:\\nService:\\nGMT ᱚᱠᱛᱚ:\\nPackage:\\nVersion:\\nOS version: + What:\nRequest:\nContent Language:\nContent ᱫᱤᱥᱚᱢ:\nApp Language:\nService:\nGMT ᱚᱠᱛᱚ:\nPackage:\nVersion:\nOS version: ᱟᱢᱟᱜ ᱯᱟᱹᱛᱭᱟᱹᱣ (ᱤᱝᱞᱤᱥ ᱛᱮ): ᱚᱯᱞᱚᱰᱟᱨᱟᱜ ᱟᱵᱟᱛᱟᱨ ᱛᱷᱩᱱᱤᱠᱟ ᱞᱟᱭᱠ @@ -268,7 +268,6 @@ LeakCanary ᱵᱟᱭ ᱧᱟᱢᱚᱜ ᱠᱟᱱᱟ ᱢᱮᱢᱚᱨᱤ ᱞᱤᱠᱟᱞ ᱢᱚᱱᱤᱴᱚᱨᱤᱝ ᱦᱤᱯ ᱰᱟᱢᱯᱤᱝ ᱚᱠᱛᱚ ᱨᱮ ᱮᱯᱞᱤᱠᱮᱥᱚᱱ ᱨᱟᱥᱴᱨᱤᱭ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱡᱤᱭᱚᱱ ᱪᱤᱠᱤ ᱠᱷᱚᱱ ᱵᱟᱦᱨᱮ ᱨᱮ ᱵᱷᱮᱜᱟᱨ ᱠᱚ ᱚᱱᱚᱞ ᱢᱮ - ᱱᱮᱴᱣᱟᱨᱠ ᱞᱟᱹᱜᱤᱫ red, ᱰᱤᱥᱠ ᱞᱟᱹᱜᱤᱫ blue ᱟᱨ ᱢᱮᱢᱚᱨᱤ ᱞᱟᱹᱜᱤᱫ green ᱯᱞᱮᱭᱟᱨ ᱵᱮᱵᱷᱟᱨ ᱚᱠᱛᱮ ᱨᱮ ᱠᱨᱟᱥ ᱚᱯᱥᱚᱱ ᱧᱮᱞᱚᱜ ᱠᱟᱱᱟ ᱤᱢᱯᱳᱨᱴ ᱤᱢᱯᱚᱨᱴ @@ -535,7 +534,6 @@ ᱡᱤᱱᱤᱥ ᱠᱚᱨᱮᱱᱟᱜ ᱢᱩᱞ ᱚᱠᱛᱚ ᱧᱮᱞ ᱢᱮ ᱥᱮᱵᱟ ᱠᱷᱚᱱ ᱚᱨᱡᱤᱱᱤᱭᱟᱞ ᱴᱮᱠᱥᱴ ᱠᱚ ᱥᱴᱨᱤᱢ ᱤᱴᱮᱢ ᱨᱮ ᱧᱮᱞᱚᱜᱼᱟ ᱡᱩᱫᱤ ᱟᱢ ᱵᱷᱤᱰᱤᱭᱳ ᱯᱞᱮᱭᱚᱯ ᱨᱮ ᱵᱞᱮᱠ ᱥᱠᱨᱤᱱ ᱟᱨᱵᱟᱝ ᱠᱷᱟᱹᱞᱤ ᱥᱴᱮᱴᱞᱤᱝ ᱮᱢ ᱧᱟᱢᱟ ᱮᱱᱠᱷᱟᱱ ᱢᱤᱰᱤᱭᱟ ᱴᱩᱱᱮᱞᱤᱝ ᱵᱚᱫᱚᱞ ᱢᱮ ᱾ - ᱪᱤᱛᱟᱹᱨ ᱪᱤᱱᱦᱟᱹ ᱠᱚ ᱧᱮᱞ ᱢᱮ ᱱᱟᱣᱟ ᱥᱴᱨᱤᱢ ᱞᱟᱹᱜᱤᱫ ᱪᱟᱪᱞᱟᱣ ᱢᱮ ᱢᱤᱫ error notification ᱛᱮᱭᱟᱨ ᱢᱮ ᱥᱮᱞᱮᱫ ᱮᱠᱥᱯᱳᱨᱴ ᱵᱟᱝ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ ᱠᱟᱱᱟ diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index dcaf7290e49..5f5887f5f5c 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -224,7 +224,7 @@ Esportende… B\'at bisòngiu de custu permissu pro \nabèrrere sa modalidade ventanedda - Ite:\\nRechesta:\\nLimba de su cuntenutu\\nIstadu de su cuntenutu:\\nLimba de s\'aplicatzione:\\nServìtziu:\\nOràriu GMT:\\nPachete:\\nVersione:\\nVersione SO: + Ite:\nRechesta:\nLimba de su cuntenutu\nIstadu de su cuntenutu:\nLimba de s\'aplicatzione:\nServìtziu:\nOràriu GMT:\nPachete:\nVersione:\nVersione SO: A dolu mannu b\'at àpidu carchi problema. Cronologia de chirca iscantzellada Custu vìdeu tenet unu lìmite de edade. @@ -628,8 +628,6 @@ Sos cummentos sunt disabilitados Su creadore b\'at postu unu coro Marca comente pompiadu - Ammustra sos listrones colorados de Picasso in subra de sas immàgines chi indicant sa fonte issoro: ruja pro sa retze, biaita pro su discu e birde pro sa memòria - Ammustra sos indicadores de immàgines Impòsitos de chirca remota Impòsitos de chirca locales diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index e05ab384279..f3839749754 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -78,7 +78,7 @@ Stiahnuté Hlásenie o chybe Aplikácia/UP zlyhalo - Čo:\\nPožiadavka:\\nJazyk obsahu:\\nKrajina Obsahu:\\nJazyk Aplikácie:\\nSlužba:\\nČas v GMT:\\nBalík:\\nVerzia:\\nOS: + Čo:\nPožiadavka:\nJazyk obsahu:\nKrajina Obsahu:\nJazyk Aplikácie:\nSlužba:\nČas v GMT:\nBalík:\nVerzia:\nOS: Výzva reCAPTCHA Čierna Všetko @@ -648,8 +648,6 @@ Nízka kvalita (menšie) Vysoká kvalita (väčšie) Náhľad miniatúry pri vyhľadávaní - Zobrazí farebné pásiky Picasso na obrázkoch podľa ich zdroja: červený pre sieť, modrý pre disk a zelený pre pamäť - Zobraziť indikátory obrázka Potiahnutím vymazať Komentáre sú zakázané Ak je automatické otáčanie zablokované, nespustí videá v miniprehrávači, ale prepne sa do celoobrazovkového režimu. Do miniprehrávača sa dostanete po ukončení režimu celej obrazovky @@ -864,4 +862,7 @@ Chyba HTTP 403 prijatá zo servera počas prehrávania, pravdepodobne spôsobená zákazom IP adresy alebo problémami s deobfuskáciou streamingovej URL adresy %1$s odmietol poskytnúť údaje, žiada o prihlásenie na potvrdenie, že žiadateľ nie je bot.\n\nVaša IP adresa mohla byť dočasne zakázaná %1$s, môžete nejaký čas počkať alebo prejsť na inú IP adresu (napríklad zapnutím/vypnutím VPN alebo prepnutím z WiFi na mobilné dáta). Tento obsah nie je dostupný pre aktuálne zvolenú krajinu obsahu.\n\nZmeňte výber v ponuke \"Nastavenia > Obsah > Predvolená krajina obsahu\". + V auguste 2025 spoločnosť Google oznámila, že od septembra 2026 bude inštalácia aplikácií vyžadovať overenie vývojára pre všetky aplikácie Android na certifikovaných zariadeniach, vrátane tých, ktoré sú inštalované mimo obchodu Play Store. Keďže vývojári NewPipe s touto požiadavkou nesúhlasia, NewPipe po tomto termíne nebude na certifikovaných zariadeniach Android fungovať. + Podrobnosti + Riešenie diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 8b4ba8f7bc4..ed316e93eaf 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -80,7 +80,7 @@ Program se je sesul Izziv reCAPTCHA Zahtevan izziv reCAPTCHA - Predmet:\\nZahteva:\\nJezik vsebine:\\nDržava vsebine:\\nJezik aplikacije:\\nStoritev:\\nČas v GMT:\\nPaket:\\nRazličica:\\nRazličica OS: + Predmet:\nZahteva:\nJezik vsebine:\nDržava vsebine:\nJezik aplikacije:\nStoritev:\nČas v GMT:\nPaket:\nRazličica:\nRazličica OS: Črna Vse Odpri v pojavnem načinu diff --git a/app/src/main/res/values-so/strings.xml b/app/src/main/res/values-so/strings.xml index f40df57f197..dc2a89c9c70 100644 --- a/app/src/main/res/values-so/strings.xml +++ b/app/src/main/res/values-so/strings.xml @@ -252,7 +252,7 @@ inta ka heshay Sawirka u saaran soosaareha Daar muuqaalka, intuu socdo: - Shayga:\\nCodsiga:\\nLuuqada Shayga:\\nWadanka Shayga:\\nLuuqada Appka:\\nAdeega:\\nWakhtiga oo GMT ah:\\nXidhmada:\\nTirsiga Appka:\\nTirsiga Nooca Barnaamijka: + Shayga:\nCodsiga:\nLuuqada Shayga:\nWadanka Shayga:\nLuuqada Appka:\nAdeega:\nWakhtiga oo GMT ah:\nXidhmada:\nTirsiga Appka:\nTirsiga Nooca Barnaamijka: Faahfaahin: Faalladaada (oo Ingiriis ah): Waxa dhacay: @@ -627,10 +627,12 @@ Fallooyinka waa laxidhay Kahelay soosaaraha Waan daawaday - Soo bandhig shaambado midabka Picasso leh sawirrada dushooda oo tilmaamaya isha laga keenay: guduud waa khadka, buluug waa kaydka gudaha, cagaar waa kaydka K/G - Tus tilmaamayaasha sawirka Soojeedinada raadinta banaanka Soojeedinada raadinta gudaha Cabirka soodaarida udhexeeya Jabi Daareha + Haa + Maya + Raadi %1$s + Raadi %1$s (%2$s) diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index 5a33ad77fac..398a6cf45b2 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -307,7 +307,7 @@ Luaje videon, kohëzgjatja: Detajet: Komenti juaj (në Anglisht): - Çfarë:\\nKërkesa:\\nGjuha e përmbajtjes:\\nShteti i pëmbajtjes:\\nGjuha e aplikacionit:\\nShërbimi:\\nKoha në GMT:\\nPaketa:\\nVersioni:\\nVersioni i sistemit operativ: + Çfarë:\nKërkesa:\nGjuha e përmbajtjes:\nShteti i pëmbajtjes:\nGjuha e aplikacionit:\nShërbimi:\nKoha në GMT:\nPaketa:\nVersioni:\nVersioni i sistemit operativ: Çfarë ndodhi: Informacion: Raporto diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 847b60f2f69..33126a21188 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -78,7 +78,7 @@ Преузимања Извештај о грешци Програм је отказао - Шта:\\nЗахтев:\\nЈезик садржаја:\\nДржава садржаја:\\nЈезик апликације:\\nУслуга:\\nGMT време:\\nПакет:\\nВерзија:\\nВерзија ОС-а: + Шта:\nЗахтев:\nЈезик садржаја:\nДржава садржаја:\nЈезик апликације:\nУслуга:\nGMT време:\nПакет:\nВерзија:\nВерзија ОС-а: „reCAPTCHA“ задатак Решите „reCAPTCHA“ задатак Црна @@ -638,7 +638,6 @@ Означи као одгледано Коментари су онемогућени Обрађивање… Може потрајати пар тренутака - Прикажи индикаторе слике Не покрећите видео снимке у мини-плејеру, већ директно пређите на режим целог екрана, ако је аутоматска ротација закључана. И даље можете приступити мини-плејеру тако што ћете изаћи из целог екрана Покрени главни плејер преко целог екрана Срушите плејер @@ -734,7 +733,6 @@ Обавештења за пријаву грешака Увезите или извезите праћења из менија са 3 тачке Аудио снимак - Прикажите Picasso обојене траке на врху слика које указују на њихов извор: црвена за мрежу, плава за диск и зелена за меморију Направите обавештење о грешци Проценат Користите најновију верзију NewPipe-а diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 7806044ce23..28099ef5bb1 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -104,7 +104,7 @@ Allvarligt spelarfel inträffade Återhämtar sig från spelarfel Rapportera via e-post - Vad:\\nBegäran:\\nInnehållsspråk:\\nInnehållsland:\\nApp-språk:\\nTjänst:\\nGMT-tid:\\nPaket:\\nVersion:\\nOS-version: + Vad:\nBegäran:\nInnehållsspråk:\nInnehållsland:\nApp-språk:\nTjänst:\nGMT-tid:\nPaket:\nVersion:\nOS-version: Spela video, längd: Uppladdarens avatar-miniatyrbild Inga resultat @@ -627,7 +627,6 @@ Du kan välja det natt-tema du föredrar nedan Välj det natt-tema du föredrar — %s Sökradens förhandsvisningsminiatyr - Visa bildindikatorer Lokala sökningsförslag Tog bort %1$s nedladdning @@ -645,7 +644,6 @@ Svep objekt för att ta bort dem Förslag via fjärrsökning Starta inte videor i minispelaren, utan byt till helskärmsläge direkt, om automatisk rotation är låst. Du kan fortfarande komma åt minispelaren genom att gå ut ur helskärmsläge - Visa Picasso färgade band ovanpå bilderna som anger deras källa: rött för nätverk, blått för disk och grönt för minne Sök efter uppdateringar Kolla manuellt efter nya versioner Söker efter uppdateringar… @@ -849,4 +847,7 @@ HTTP-fel 403 mottogs från servern under spelning, troligen orsakat av en IP-avstängning eller problem med deobfuskering av streaming-URL:er %1$s vägrade att tillhandahålla data och bad om en inloggning för att bekräfta att den som begärde detta inte är en bot.\n\nDin IP-adress kan ha blivit tillfälligt avstängd av %1$s. Du kan vänta en stund eller byta till en annan IP-adress (till exempel genom att slå på/av ett VPN eller genom att byta från WiFi till mobildata). Detta innehåll är inte tillgängligt för det valda innehållslandet.\n\nÄndra ditt val från \"Inställningar > Innehåll > Standardinnehållsland\". + Google har meddelat att från och med 2026/2027 kommer alla appar på certifierade Android-enheter att kräva att utvecklarna lämnar sina personliga identitetsuppgifter direkt till Google. Eftersom utvecklarna av denna app inte accepterar detta krav kommer appen inte längre att fungera på certifierade Android-enheter efter den tiden. + Detaljer + Lösning diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index b7534ccc0ea..86dd3cc4318 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -256,7 +256,7 @@ இயல்பிருப்புகளை மீட்டெடு NewPipe பிழையைச் எதிர்கொண்டது, புகாரளிக்க தட்டு புகாரளி - என்ன:\\nகோரிக்கை:\\nஉள்ளடக்க மொழி:\\nஉள்ளடக்க நாடு:\\nசெயலி மொழி:\\nசேவை:\\nGMT நேரம்:\\nசிப்பம்:\\nபதிப்பு:\\nOS பதிப்பு: + என்ன:\nகோரிக்கை:\nஉள்ளடக்க மொழி:\nஉள்ளடக்க நாடு:\nசெயலி மொழி:\nசேவை:\nGMT நேரம்:\nசிப்பம்:\nபதிப்பு:\nOS பதிப்பு: காணொளியை இயக்கு, காலவளவு: கருத்தளிப்புகள் இயக்கியைச் சிதை @@ -641,8 +641,6 @@ மீடியா சுரங்கப்பாதையை முடக்கு நீங்கள் ஒரு கருப்பு திரை அனுபவித்தால் அல்லது வீடியோ பிளேபேக்கில் திணறினால் மீடியா சுரங்கப்பாதையை முடக்கு. உங்கள் சாதனத்தில் முன்னிருப்பாக மீடியா சுரங்கப்பாதை முடக்கப்பட்டது, ஏனெனில் உங்கள் சாதன மாதிரி அதை ஆதரிக்காது என்று அறியப்படுகிறது. - பட குறிகாட்டிகளைக் காட்டு - அவற்றின் மூலத்தைக் குறிக்கும் படங்களின் மேல் பிக்காசோ வண்ண ரிப்பன்களைக் காட்டு: நெட்வொர்க்கிற்கு சிவப்பு, வட்டுக்கு நீலம் மற்றும் நினைவகத்திற்கு பச்சை \"வீரரை செயலிழக்க\" காட்டு பிளேயரைப் பயன்படுத்தும் போது செயலிழப்பு விருப்பத்தைக் காட்டுகிறது புதிய நீரோடைகளுக்கு காசோலை இயக்கவும் diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index b95e04c0cfe..a422dc99685 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -438,7 +438,6 @@ ప్లేబ్యాక్ స్పీడ్ నియంత్రణలు ఏమిలేదు మీరు బ్లాక్ స్క్రీన్ లేదా చలనచిత్రం ప్లేబ్యాక్‌లో అంతరాయాన్ని అనుభవిస్తే మీడియా టన్నెలింగ్‌ను నిలిపివేయండి - చిత్రాల మూలాన్ని సూచించే విధంగా వాటి పైభాగంలో పికాసో రంగు రిబ్బన్‌లను చూపండి: నెట్‌వర్క్ కోసం ఎరుపు, డిస్క్ కోసం నీలం మరియు మెమరీ కోసం ఆకుపచ్చ లోపం స్నాక్‌బార్‌ని చూపండి మీరు NewPipe యొక్క తాజా సంస్కరణను అమలు చేస్తున్నారు NewPipe నవీకరణ అందుబాటులో ఉంది! @@ -451,7 +450,6 @@ తక్కువ నాణ్యత (చిన్నది) చూపించవద్దు మీడియా టన్నెలింగ్‌ని నిలిపివేయండి - చిత్ర సూచికలను చూపు కొత్త స్ట్రీమ్‌ల కోసం తనిఖీని అమలు చేయండి ఎర్రర్ నోటిఫికేషన్‌ను సృష్టించండి దిగుమతి diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index aa641503b96..84590e255f3 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -55,7 +55,7 @@ Bildir Bilgi: Ne oldu: - Ne:\\nİstek:\\nİçerik Dili:\\nİçerik Ülkesi:\\nUygulama Dili:\\nHizmet:\\nGMT Zamanı:\\nPaket:\\nSürüm:\\nİşletim sistemi sürümü: + Ne:\nİstek:\nİçerik Dili:\nİçerik Ülkesi:\nUygulama Dili:\nHizmet:\nGMT Zamanı:\nPaket:\nSürüm:\nİşletim sistemi sürümü: Videoyu oynat, süre: Yükleyenin avatar küçük resmi Beğeni @@ -627,8 +627,6 @@ Yorumlar devre dışı Yaratıcısınca kalplendi İzlendi olarak işaretle - Resimlerin üzerinde kaynaklarını gösteren Picasso renkli şeritler göster: ağ için kırmızı, disk için mavi ve bellek için yeşil - Resim göstergelerini göster Uzak arama önerileri Yerel arama önerileri @@ -849,4 +847,7 @@ Oynatırken sunucudan HTTP 403 hatası alındı, IP engeli ya da akış URL’si çözme sorunları olabilir %1$s veri sağlamayı geri çevirdi, istekçinin robot olmadığını doğrulaması için oturum açmasını istiyor.\n\n%1$s, IP adresinizi geçici olarak engellemiş olabilir, bir süre bekleyebilir ya da başka IP\'ye geçebilirsiniz (örneğin VPN\'i açıp/kapatarak ya da WiFi\'den mobil veriye geçerek). Bu içerik şu anda seçili içerik ülkesinde kullanılamıyor.\n\nSeçiminizi \"Ayarlar > İçerik > Öntanımlı içerik ülkesi\"nden değiştirin. + Google, Eylül 2026\'dan itibaren sertifikalı Android cihazlardaki Play Store harici olmak üzere tüm uygulamaların, geliştiricilerin kişisel kimlik bilgilerini doğrudan Google’a göndermesini gerektireceğini duyurdu. NewPipe geliştiricileri bu zorunluluğu kabul etmediğinden, NewPipe bu tarihten sonra sertifikalı Android cihazlarda çalışmayacaktır. + Detaylar + Çözüm diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 4526ea837b1..c3595ebece1 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -170,7 +170,7 @@ Показувати підказку під час натискання фонової або спливної кнопки у відео \"Деталі:\" Сталася невиправна помилка програвача Зовнішні програвачі не підтримують такі види посилань - Що:\\nЗапит:\\nМова вмісту:\\nКраїна вмісту:\\nМова застосунку:\\nСлужба:\\nЧас GMT:\\nПакунок:\\nВерсія:\\nВерсія ОС: + Що:\nЗапит:\nМова вмісту:\nКраїна вмісту:\nМова застосунку:\nСлужба:\nЧас GMT:\nПакунок:\nВерсія:\nВерсія ОС: Мініатюрний аватар завантажувача відео Вподобані Не сподобалося @@ -491,7 +491,7 @@ Звичайний режим Швидкий режим Доступно для деяких служб, швидке, але може повертати не весь вміст каналу і часто неповну інформацію (тривалість, тип елемента, статус трансляції) - Оновлення з RSS, коли воно є + Отримувати з виділеної стрічки, коли доступно Оновлювати постійно Період актуальності підписок після поновлення — %s Поріг оновлення підписок @@ -510,8 +510,8 @@ Останнє оновлення: %s Через обмеження ExoPlayer точність перемотування становить %d секунд Так, а також частково переглянуті відео - Відео, які Ви переглядали до та після додавання в добірку, вилучатимуться. \nВи впевнені? Це незворотна дія! - Видалити переглянуті відео? + Потоки, які були переглянуті до та після додавання в добірку, будуть видалені. \nВи впевнені? + Видалити переглянуті потоки? Видалити переглянуті Створено автоматично (автора не знайдено) ∞ вiдео @@ -604,7 +604,7 @@ Обрізати мініатюру відео показувану в сповіщенні з пропорцій 16: 9 до 1:1 Вимкнення тунелювання медіаданих за наявності чорного екрана або гальмування під час відтворення відео. Вимкнути тунелювання медіа - «Фреймворк доступу до сховища» (SAF) підтримується лише починаючи з Android 10 + Починаючи з Android 10, підтримується тільки \"Storage Access Framework\" Вас питатиме, куди зберігати кожне завантаження Не вказано теки завантаження, оберіть типову теку завантаження зараз Відкрити вебсайт @@ -640,8 +640,6 @@ Мініатюра з попереднім переглядом на повзунку поступу Вподобано автором Позначити переглянутим - Показувати кольорові стрічки Пікассо поверх зображень із зазначенням їх джерела: червоний для мережі, синій для диска та зелений для пам’яті - Показати індикатори зображень Віддалені пропозиції пошуку Локальні пошукові пропозиції @@ -868,4 +866,7 @@ Під час відтворення від сервера отримано помилку HTTP 403, ймовірно, через заборону IP-адреси або проблеми з деобфускацією URL-адреси потокової передачі %1$s відмовився надати дані, запитуючи логін для підтвердження того, що запитувач не є ботом.\n\nВаша IP-адреса могла бути тимчасово заблокована %1$s. Ви можете почекати деякий час або перейти на іншу IP-адресу (наприклад, увімкнувши/вимкнувши VPN або переключившись з Wi-Fi на мобільні дані). Цей контент недоступний для вибраної країни контенту.\n\nЗмініть свій вибір у розділі \"Налаштування > Контент > Країна контенту за замовчуванням\". + У серпні 2025 року, Google анонсувала, що з вересня 2026 року, для встановлення застосунків буде потрібна верифікація розробника для всіх Android застосунків на сертифікованих пристроях, включаючи ті, що були встановлені не через Play Store. Оскільки розробники NewPipe не згодні з цією вимогою, NewPipe перестане працювати на сертифікованих Android пристроях після цієї дати. + Детальніше + Вирішення diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index bb95e2811ba..6c596b64c02 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -133,7 +133,7 @@ رپورٹ کریں معلومات: کیا ہوا: - کیا ہوا:\\nدرخواست:\\nمواد کی زبان:\\nملک:\\nایپ کی زبان:\\nسروس:\\nجی ایم ٹٰ:\\nوقت:\\nپیکیج:\\nورژن:\\nآپریٹنگ سسٹم ورزن: + کیا ہوا:\nدرخواست:\nمواد کی زبان:\nملک:\nایپ کی زبان:\nسروس:\nجی ایم ٹٰ:\nوقت:\nپیکیج:\nورژن:\nآپریٹنگ سسٹم ورزن: آپ کا تبصرہ (انگریزی میں): تفصیلات: ویڈیو چلائیں، دورانیہ: diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index cde4821fa14..e43b2f5df65 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -72,7 +72,7 @@ Báo cáo Thông tin: Chuyện gì đã xảy ra: - Loại lỗi:\\nYêu cầu:\\nNgôn ngữ của nội dung:\\nVùng miền (quốc gia) của nội dung:\\nNgôn ngữ của ứng dụng:\\nDịch vụ:\\nThời gian GMT:\\nTên gói:\\nPhiên bản:\\nPhiên bản hệ điều hành: + Loại lỗi:\nYêu cầu:\nNgôn ngữ của nội dung:\nVùng miền (quốc gia) của nội dung:\nNgôn ngữ của ứng dụng:\nDịch vụ:\nThời gian GMT:\nTên gói:\nPhiên bản:\nPhiên bản hệ điều hành: Nhận xét của bạn (bằng tiếng Anh): Chi tiết: Phát video, thời lượng: @@ -618,8 +618,6 @@ Bình luận đã bị tắt Đã được chủ kênh thả \"thính\" Đánh dấu là đã xem - Hiển thị các dải băng màu Picasso trên đầu các hình ảnh cho biết nguồn của chúng: màu đỏ cho mạng, màu lam cho đĩa và màu lục cho bộ nhớ - Hiện dấu chỉ hình ảnh Đề xuất tìm kiếm trên mạng Đề xuất tìm kiếm cục bộ diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 88b30af5ea5..53f0f1d06cd 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -146,7 +146,7 @@ 反馈 信息: 发生了什么: - 详情:\\n请求:\\n内容语言:\\n内容国家:\\n客户端语言:\\n服务:\\nGMT时间:\\n包名:\\n版本:\\n操作系统版本: + 详情:\n请求:\n内容语言:\n内容国家:\n客户端语言:\n服务:\nGMT时间:\n包名:\n版本:\n操作系统版本: 您的附加说明(请用英文): 详细信息: 播放视频,时长: @@ -618,8 +618,6 @@ 高品质(较大) 被创作者喜爱 标记为已观看 - 在图像顶部显示毕加索彩带,指示其来源:红色代表网络,蓝色代表磁盘,绿色代表内存 - 显示图像指示器 远程搜索建议 本地搜索建议 @@ -835,4 +833,7 @@ 播放时从服务器收到 HTTP 403 错误,可能因 IP 封锁或串流 URL 解密问题导致 %1$s 拒绝提供数据, 要求登录确认请求方不是机器人。\n\n你的 IP 可能已经暂时被 %1$s 封禁,你可以等待一段时间或切换到不同 IP (比如开/关 VPN, 或者从 WiFi 连接切换到移动数据)。 此内容对当前选中的内容地区不可用。\n\n要更改选择,请前往 “设置 > 内容 > 默认内容地区”。 + 2025 年 8 月,Google 宣布自 2026 年 9 月起,在已认证设备上安装所有安卓应用都需要开发者验证身份,包括在 Play 商店之外安装的应用。由于 NewPipe 开发者反对此要求,NewPipe 在此时间点后不会再在已认证设备上工作。 + 详情 + 解决方案 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index c483ca96b57..7b2ba5bb106 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -86,7 +86,7 @@ 浮面播緊 全部嘢 App/界面閃退 - 經過:\\n請求:\\n內容語言:\\n內容國家:\\nApp 語言:\\n服務:\\nGMT 時間:\\n封裝:\\n版本:\\nOS 版本: + 經過:\n請求:\n內容語言:\n內容國家:\nApp 語言:\n服務:\nGMT 時間:\n封裝:\n版本:\nOS 版本: reCAPTCHA 考驗 以浮面模式開啟 \n有呢個權限至得 @@ -662,9 +662,7 @@ 你係咪要刪除呢個谷? 淨係顯示未成谷嘅訂閱 - 啲圖都要騷 Picasso 三色碼顯示源頭:紅碼係網絡上高落嚟,藍碼係儲存喺磁碟本地,綠碼係潛伏喺記憶體中 服務原本嘅字會騷返喺串流項目上面 - 影像要推三色碼 若果播片嘅時候窒下窒下或者黑畫面,就停用多媒體隧道啦。 點樣用 Google 匯出嚟匯入 YouTube 訂閱: \n diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index f5ebc2bf8be..cca70f771d4 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -76,7 +76,7 @@ 回報 資訊: 發生了什麼事: - 發生了什麼:\\n請求:\\n內容語言:\\n內容國家:\\n應用程式語言:\\n服務:\\nGMT 時間:\\n套件:\\n版本:\\n系統版本: + 發生了什麼:\n請求:\n內容語言:\n內容國家:\n應用程式語言:\n服務:\nGMT 時間:\n套件:\n版本:\n系統版本: 您的留言 (請用英語): 詳細資訊: 影片 @@ -600,8 +600,6 @@ 拖動列縮圖預覽 被創作者加心號 標記為已觀看 - 在圖片頂部顯示畢卡索彩色絲帶,指示其來源:紅色代表網路、藍色代表磁碟、綠色代表記憶體 - 顯示圖片指示器 遠端搜尋建議 本機搜尋建議 diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index ab6e9e34517..7875c1e846c 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -10,6 +10,8 @@ saved_tabs_key + kao_last_checked + download_path download_path_audio @@ -241,7 +243,6 @@ show_memory_leaks_key allow_disposed_exceptions_key show_original_time_ago_key - show_image_indicators_key show_crash_the_player_key check_new_streams crash_the_app_key diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1a2a5b6f198..99dd1a74cdb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -271,7 +271,7 @@ Report Info: What happened: - What:\\nRequest:\\nContent Language:\\nContent Country:\\nApp Language:\\nService:\\nTimestamp:\\nPackage:\\nVersion:\\nOS version: + What:\nRequest:\nContent Language:\nContent Country:\nApp Language:\nService:\nTimestamp:\nPackage:\nVersion:\nOS version: Your comment (in English): Details: @@ -494,8 +494,6 @@ Disable media tunneling Disable media tunneling if you experience a black screen or stuttering on video playback. Media tunneling was disabled by default on your device because your device model is known to not support it. - Show image indicators - Show Picasso colored ribbons on top of images indicating their source: red for network, blue for disk and green for memory Show \"Crash the player\" Shows a crash option when using the player Run check for new streams @@ -880,6 +878,9 @@ HTTP error 403 received from server while playing, likely caused by streaming URL expiration or an IP ban HTTP error %1$s received from server while playing HTTP error 403 received from server while playing, likely caused by an IP ban or streaming URL deobfuscation issues - %1$s refused to provide data, asking for a login to confirm the requester is not a bot.\n\nYour IP might have been temporarily banned by %1$s, you can wait some time or switch to a different IP (for example by turning on/off a VPN, or by switching from WiFi to mobile data). + %1$s refused to provide data, asking for a login to confirm the requester is not a bot.\n\nYour IP might have been temporarily banned by %1$s, you can wait some time or switch to a different IP (for example by turning on/off a VPN, or by switching from WiFi to mobile data).\n\nPlease see this FAQ entry for more information. This content is not available for the currently selected content country.\n\nChange your selection from \"Settings > Content > Default content country\". + In August 2025, Google announced that as of September 2026, installing apps will require developer verification for all Android apps on certified devices, including those installed outside of the Play Store. Since the developers of NewPipe do not agree to this requirement, NewPipe will no longer work on certified Android devices after that time. + Details + Solution diff --git a/app/src/main/res/xml/debug_settings.xml b/app/src/main/res/xml/debug_settings.xml index 84bb281f31e..d97c5aa1a2b 100644 --- a/app/src/main/res/xml/debug_settings.xml +++ b/app/src/main/res/xml/debug_settings.xml @@ -34,13 +34,6 @@ app:singleLineTitle="false" app:iconSpaceReserved="false" /> - - Améliorations -
  • Rendre les liens dans les commentaires cliquables, augmenter la taille du texte
  • Rechercher en cliquant sur les liens d'horodatage dans les commentaires
  • -
  • Afficher l'onglet préféré en fonction de l'état récemment sélectionné
  • -
  • Ajouter la playlist à la file d'attente lors d'un clic long sur 'Arrière-plan' dans la fenêtre de la playlist
  • -
  • Rechercher le texte partagé lorsqu'il ne s'agit pas d'une URL
  • -
  • Ajouter "partager à l'heure actuelle" bouton au lecteur vidéo principal lecteur vidéo principal
  • -
  • Ajouter un bouton de fermeture du lecteur principal lorsque la file d'attente vidéo est terminée
  • -
  • Ajouter "jouer directement en arrière-plan" au menu longpress pour les éléments de la liste vidéo
  • -
  • Améliorer les traductions en anglais des commandes Play/Enqueue
  • -
  • Petites améliorations des performances
  • -
  • Supprimer les fichiers inutilisés
  • -
  • Mise à jour ExoPlayer à 2.9.6
  • -
  • Ajouter le support pour les liens Invidious
  • +

Corrections

-
    -
  • Défilement avec les commentaires et les flux associés désactivés
  • -
  • CheckForNewAppVersionTask qui est exécuté alors qu'il ne devrait pas l'être'
  • Importation des abonnements YouTube : ignorer ceux dont l’URL est invalide et conserver ceux dont le titre est vide
  • URL YouTube invalide : le nom de la balise signature n'est pas toujours "signature", ce qui empêche le chargement des flux.
diff --git a/fastlane/metadata/android/fr/changelogs/750.txt b/fastlane/metadata/android/fr/changelogs/750.txt index 7273ae1f01a..57da00cbc21 100644 --- a/fastlane/metadata/android/fr/changelogs/750.txt +++ b/fastlane/metadata/android/fr/changelogs/750.txt @@ -1,36 +1,10 @@ Nouveautés - -Reprise de la lecture #2288 - -• Reprise des flux là où vous les avez interrompus -Améliorations du téléchargeur #2149 - • Utilisation de Storage Access Framework pour stocker les téléchargements sur des cartes SD externes - -• Nouveau multiplexeur mp4 - • Possibilité de modifier le répertoire de téléchargement avant de lancer un téléchargement -• Respect des réseaux limités - Améliorations - • Suppression des chaînes gema #2295 - • Gestion des changements de rotation (automatique) pendant le cycle de vie de l'activité #2444 -• Harmonisation des menus accessibles par appui long #2368 - Corrections - -• Correction de l'affichage du nom de la piste de sous-titres sélectionnée #2394 - -• Correction du plantage en cas d'échec de la vérification des mises à jour de l'application (version GitHub) #2423 - • Correction du blocage des téléchargements à 99,9 % #2440 - -• Mise à jour des métadonnées de la file d'attente de lecture #2453 - -• [SoundCloud] Correction du plantage lors du chargement des playlists TeamNewPipe/NewPipeExtractor#170 - -• [YouTube] Correction de l'impossibilité d'afficher la durée paresd TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/fr/changelogs/760.txt b/fastlane/metadata/android/fr/changelogs/760.txt index e0a225fce64..4e62425d24e 100644 --- a/fastlane/metadata/android/fr/changelogs/760.txt +++ b/fastlane/metadata/android/fr/changelogs/760.txt @@ -1,43 +1,9 @@ Changements dans la version 0.17.1 -Nouveauté -• Localisation en thaïlandais - - Améliorations • Ajout de l'action "Commencer à jouer ici" dans les menus qui s'appuient longuement pour les playlists #2518 • Ajout d'un commutateur pour le sélecteur de fichiers SAF / hérité #2521 Corrections -• Correction des boutons qui disparaissent dans la vue des téléchargements lors du changement d'applications #2487 -• Correction de la position de lecture qui est enregistrée même si l'historique de visionnage est désactivé -• Correction des performances réduites causées par la position de lecture dans les vues de liste #2517 • [Extractor] Correction de ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186 • [Extractor] [YouTube] Correction de l'erreur de recherche occasionnelle lorsque les playlists sont dans les résultats TeamNewPipe/NewPipeExtractor#185 - - - -Changements dans la version 0.17.0 - -Nouveautés -Reprise de lecture #2288 -• Reprise des flux là où vous vous étiez arrêté la dernière fois -Améliorations du téléchargeur #2149 -• Utilisation du Storage Access Framework pour stocker les téléchargements sur des cartes SD externes -• Nouveau multiplexeur mp4 -• Possibilité de changer le répertoire de téléchargement avant de commencer un téléchargement -• Respect des réseaux tarifés - - -Améliorations -• Suppression des chaînes gema #2295 -• Gestion des changements de (auto)rotation pendant le cycle de vie de l'activité #2444 -• Uniformisation des menus qui s'appuient longuement #2368 - -Corrections -• Correction du nom de la piste de sous-titres sélectionnée qui ne s'affiche pas #2394 -• Ne plante pas lorsque la vérification de la mise à jour de l'application échoue (version GitHub) #2423 -• Correction des téléchargements bloqués à 99,9 % #2440 -• Mise à jour des métadonnées de la file de lecture #2453 -• [SoundCloud] Correction du plantage lors du chargement des playlists TeamNewPipe/NewPipeExtractor#170 -• [YouTube] Correction de la durée qui ne peut pas être analysée TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/fr/changelogs/800.txt b/fastlane/metadata/android/fr/changelogs/800.txt index 46fe1504e73..5f41e602609 100644 --- a/fastlane/metadata/android/fr/changelogs/800.txt +++ b/fastlane/metadata/android/fr/changelogs/800.txt @@ -1,27 +1,6 @@ -Nouveau -- Support de PeerTube sans P2P (#2201) [Beta] : - ◦ Regarder et télécharger des vidéos depuis des instances PeerTube - ◦ Ajouter des instances dans les paramètres pour accéder à l'ensemble du monde PeerTube - ◦ Il peut y avoir des problèmes avec les handshakes SSL sur Android 4.4 et 7.1 lors de l'accès à certaines instances, ce qui entraîne une erreur de réseau. - -- Téléchargeur (#2679) : - ◦ Calculer l'heure d'arrivée du téléchargement - ◦ Télécharger les opus (fichiers webm) en ogg - ◦ Récupération des liens de téléchargement expirés pour reprendre les téléchargements après une longue pause - Amélioré - Le KioskFragment est informé des changements dans le pays de contenu préféré et améliore les performances de tous les onglets principaux #2742 -- Utilisation des nouvelles implémentations Localization et Downloader de l'extracteur #2713 -- Rendre la chaîne « Default kiosk » traduisible -- Barre de navigation noire pour le thème noir #2569 Correction - Correction d'un bogue qui ne permettait pas de déplacer le lecteur popup si un autre doigt était placé pendant le déplacement du lecteur popup #2772 - Autorise les playlists sans uploader et corrige les crashs liés à ce problème #2724, TeamNewPipe/NewPipeExtractor#219 -- Activation de TLS1.1/1.2 sur les appareils Android 4.4 (API 19/KitKat) pour corriger le handshake TLS avec MediaCCC et certaines instances PeerTube #2792 -- SoundCloud] Correction de l'extraction de l'identifiant client TeamNewPipe/NewPipeExtractor#217 -- [SoundCloud] Correction de l'extraction du flux audio - -Développement -- Mise à jour d'ExoPlayer vers la version 2.10.8 #2791, #2816 -- Mise à jour de Gradle vers 3.5.1 et ajout du support Kotlin #2714 diff --git a/fastlane/metadata/android/fr/changelogs/810.txt b/fastlane/metadata/android/fr/changelogs/810.txt index 573ea9889c6..8b8b9d518ed 100644 --- a/fastlane/metadata/android/fr/changelogs/810.txt +++ b/fastlane/metadata/android/fr/changelogs/810.txt @@ -4,16 +4,6 @@ Nouveautée : Améliorations : • Ajout de la playlist locale à la file d'attente lors d'une pression longue sur le bouton arrière-plan / flottant • Possibilité de faire défiler les onglets de la page principale et les masquent lorsqu'il n'y a qu'un seul onglet -• Limite le nombre de mises à jour de la miniature des notifications avec le lecteur en arrière-plan -• Ajout d'une miniature fictive pour les playlists locales vides -• Utilisation de l'extension de fichier *.opus au lieu de *.webm et affiche « opus » pour le nom du format au lieu de « WebM Opus » dans la liste déroulante de téléchargement. -• Ajout d'un bouton pour supprimer les fichiers téléchargés ou l'historique de téléchargements dans les « Téléchargements » -• [YouTube] Ajout de la prise en charge des liens de chaînes /c/shortened_url Corrections : • Correction de plusieurs problèmes lors du partage d'une vidéo sur NewPipe et du téléchargement direct de ses flux -• Correction de l'accès du lecteur hors de son fil de création -• Correction de la pagination des résultats de recherche -• [YouTube] Correction de null résultant en une erreur NPE -• [YouTube] Correction de l'affichage des commentaires lors de l'ouverture d'une url invidio.us -• [SoundCloud] client_id mis à jour diff --git a/fastlane/metadata/android/fr/changelogs/840.txt b/fastlane/metadata/android/fr/changelogs/840.txt index 240b77824b4..a09ce98c10f 100644 --- a/fastlane/metadata/android/fr/changelogs/840.txt +++ b/fastlane/metadata/android/fr/changelogs/840.txt @@ -1,22 +1,9 @@ Nouveau • Ajout d'un sélecteur de langue pour changer la langue de l'application -• Ajout du bouton Envoyer vers Kodi au menu déroulant du lecteur • Ajout de la possibilité de copier les commentaires en appuyant longuement Amélioré -• Corriger l'activité ReCaptcha et enregistrer correctement les cookies obtenus • Suppression du menu à points au profit du tiroir et du bouton Masquer l'historique lorsque l'historique de visionnage n'est pas activé dans les paramètres -• Demander correctement l'autorisation d'affichage sur d'autres applications dans les paramètres sur Android 6 et versions ultérieures -• Renommer la playlist locale en cliquant longuement dans BookmarkFragment -• Diverses améliorations de PeerTube -• Amélioration de plusieurs chaînes sources en anglais Corrigé • Correction du redémarrage du lecteur bien qu'il soit en pause lorsque l'option « Réduire au changement d'application » est activée et que NewPipe est réduit -• Correction de la valeur de luminosité initiale pour le geste -• Correction des téléchargements de sous-titres .srt ne contenant pas tous les sauts de ligne -• Correction du téléchargement sur la carte SD qui échoue car certains appareils Android 5 ne sont pas conformes CTF -• Correction du téléchargement sur Android KitKat -• Correction du fichier vidéo .mp4 corrompu reconnu comme fichier audio -• Correction de plusieurs problèmes de localisation, y compris des codes de langue chinois erronés -• [YouTube] Les horodatages dans la description sont à nouveau cliquables diff --git a/fastlane/metadata/android/fr/changelogs/930.txt b/fastlane/metadata/android/fr/changelogs/930.txt index 4bf050a24d4..d6151d5ea4d 100644 --- a/fastlane/metadata/android/fr/changelogs/930.txt +++ b/fastlane/metadata/android/fr/changelogs/930.txt @@ -5,15 +5,8 @@ Nouveau Amélioré • Ajout de la possibilité de supprimer toutes les vidéos regardées d'une playlist locale • Afficher un message lorsque le contenu n'est pas encore pris en charge au lieu de planter -• Redimensionnement amélioré du lecteur contextuel avec des gestes de pincement -• Mettre les flux en file d'attente en appuyant longuement sur les boutons d'arrière-plan et contextuels dans la chaîne -• Gestion améliorée de la taille du titre de l'en-tête du tiroir Corrigé • Correction du paramètre de contenu restreint par âge qui ne fonctionne pas • Correction de certains types de reCAPTCHA • Correction du crash lors de l'ouverture des signets alors que la playlist est « nulle » -• Correction de la détection des exceptions liées au réseau -• Correction de la visibilité du bouton de tri de groupe dans le fragment d'abonnements - -et plus diff --git a/fastlane/metadata/android/fr/changelogs/992.txt b/fastlane/metadata/android/fr/changelogs/992.txt index dc1fad35b07..4aa8a0e67b0 100644 --- a/fastlane/metadata/android/fr/changelogs/992.txt +++ b/fastlane/metadata/android/fr/changelogs/992.txt @@ -8,10 +8,8 @@ Nouveau Amélioré • Bouton de fermeture du mini-lecteur plus grand • Réduction d'échelle des vignettes plus fluide -• Cible Android 13 (API 33) • La recherche ne met plus le lecteur en pause Corrigé • Correction de la superposition sur DeX/souris • Autoriser le lecteur d'arrière-plan sans flux audio séparés -• Divers correctifs YouTube et plus encore… diff --git a/fastlane/metadata/android/fr/changelogs/993.txt b/fastlane/metadata/android/fr/changelogs/993.txt index 9865a19acc7..875b09c9422 100644 --- a/fastlane/metadata/android/fr/changelogs/993.txt +++ b/fastlane/metadata/android/fr/changelogs/993.txt @@ -9,4 +9,3 @@ Amélioré Corrigé • Correction de l'ouverture des URL du navigateur, des téléchargements et des lecteurs externes sur Android 11+ -• Correction de l'interaction avec le plein écran nécessitant deux appuis sur MIUI diff --git a/fastlane/metadata/android/fr/changelogs/994.txt b/fastlane/metadata/android/fr/changelogs/994.txt index 35a77aa91d3..20d64ac94d0 100644 --- a/fastlane/metadata/android/fr/changelogs/994.txt +++ b/fastlane/metadata/android/fr/changelogs/994.txt @@ -8,8 +8,5 @@ Amélioré Corrigé • [YouTube] Erreurs HTTP 403 pour les flux -• Lecteur noir lors du passage au lecteur principal depuis la vue playlist • Fuite de mémoire du service de lecture • [PeerTube] Les avatars du téléchargeur et du sous-canal ont été échangés - -et plus diff --git a/fastlane/metadata/android/fr/changelogs/995.txt b/fastlane/metadata/android/fr/changelogs/995.txt index b91f83875ad..da96067efed 100644 --- a/fastlane/metadata/android/fr/changelogs/995.txt +++ b/fastlane/metadata/android/fr/changelogs/995.txt @@ -4,13 +4,10 @@ Nouveau • Obtenir les URL de toutes les images Amélioré -• Accessibilité des interfaces du lecteur • Meilleure sélection audio pour les téléchargements de vidéos uniquement • Option permettant d'inclure les noms de playlist et de vidéo dans le contenu de playlist partagé Corrigé -• [YouTube] Correction de l'obtention du nombre de likes +• [YouTube] Correction de l'obtention du nombre de like • Correction des fenêtres contextuelles et des plantages du lecteur • Sélection de mauvaises langues dans le sélecteur de langue -• Le focus audio du lecteur ne respectait pas la fonction muet -• L'ajout d'éléments de playlist ne fonctionnait parfois pas diff --git a/fastlane/metadata/android/fr/changelogs/997.txt b/fastlane/metadata/android/fr/changelogs/997.txt index b1a550577b7..4d9a7c29a49 100644 --- a/fastlane/metadata/android/fr/changelogs/997.txt +++ b/fastlane/metadata/android/fr/changelogs/997.txt @@ -2,16 +2,11 @@ Nouveau • Ajouter des réponses aux commentaires • Autoriser la réorganisation des playlists • Afficher la description et la durée de la playlist -• Autoriser la réinitialisation des paramètres Amélioré -• [Android 13+] Restaurer les actions de notification personnalisées • Demander le consentement pour la vérification des mises à jour -• Autoriser la lecture/pause des notifications pendant la mise en mémoire tampon -• Réorganiser certains paramètres +• Autoriser la lecture/pause de notifications pendant la mise en mémoire tampon Corrigé • [YouTube] Correction des commentaires qui ne se chargent pas, ainsi que d'autres correctifs et améliorations • Résoudre la vulnérabilité dans l'importation des paramètres et passer à JSON -• Divers correctifs de téléchargement -• Couper le texte de recherche diff --git a/fastlane/metadata/android/fr/changelogs/999.txt b/fastlane/metadata/android/fr/changelogs/999.txt index a2271fde60d..f7e1fd2f08c 100644 --- a/fastlane/metadata/android/fr/changelogs/999.txt +++ b/fastlane/metadata/android/fr/changelogs/999.txt @@ -1,5 +1,3 @@ -Ce correctif corrige les erreurs HTTP 403 au milieu des vidéos YouTube. - Nouveau • [SoundCloud] Ajout de la prise en charge des URL on.soundcloud.com diff --git a/fastlane/metadata/android/ja/changelogs/1001.txt b/fastlane/metadata/android/ja/changelogs/1001.txt new file mode 100644 index 00000000000..4f89e86bcda --- /dev/null +++ b/fastlane/metadata/android/ja/changelogs/1001.txt @@ -0,0 +1,6 @@ +改善策 +・Android 13以降ではプレーヤーの通知設定の変更を常に許可してください + +修正済 +・データベース/登録チャンネルのエクスポートで既存のファイルが切り捨てられず、エクスポートが破損する可能性がある問題を修正 +・タイムスタンプをクリックするとプレーヤーが最初から再開される問題を修正 diff --git a/fastlane/metadata/android/ja/changelogs/1002.txt b/fastlane/metadata/android/ja/changelogs/1002.txt new file mode 100644 index 00000000000..78cf732a692 --- /dev/null +++ b/fastlane/metadata/android/ja/changelogs/1002.txt @@ -0,0 +1,4 @@ +YouTubeでストリームが再生されない問題を修正しました。 + +このリリースでは、YouTubeの動画の詳細が読み込まれないという最も深刻なエラーのみを修正しています。 +他にも問題があることを認識しており、近日中に別のリリースで解決する予定です。 diff --git a/fastlane/metadata/android/ka/changelogs/1005.txt b/fastlane/metadata/android/ka/changelogs/1005.txt index e08f2639fb2..dd1ccba43b6 100644 --- a/fastlane/metadata/android/ka/changelogs/1005.txt +++ b/fastlane/metadata/android/ka/changelogs/1005.txt @@ -3,13 +3,15 @@ • არხების ჯგუფების მთავარი ეკრანის ჩანართებად დაყენების დაშვება • [YouTube] გაზიარება, როგორც დროებითი დასაკრავი სია • [SoundCloud] მოწონებების არხის ჩანართი + გაუმჯობესებულია • უკეთესი მინიშნებები ძიების ზოლში • ჩამოტვირთვის თარიღის ჩვენება ჩამოტვირთვებში • Android 13-ის თითოეული აპლიკაციის ენის გამოყენება + .გამოსწორებულია • გამოსწორდა ტექსტის ფერების დარღვევა ბნელ რეჟიმში • [YouTube] გამოსწორდა დასაკრავი სიების 100-ზე მეტი ერთეულს არ აჩვენებს • [YouTube] გამოსწორდა დაკარგული რეკომენდებული ვიდეოები -• გამოსწორდა ისტორიის სიის ხედში ავარიების გამოსწორება +• გამოსწორდა ისტორიის სიის ხედში ავარიები • გამოსწორდა დროის ნიშნულები კომენტარების პასუხებში diff --git a/fastlane/metadata/android/ka/changelogs/1006.txt b/fastlane/metadata/android/ka/changelogs/1006.txt new file mode 100644 index 00000000000..800c0e86aba --- /dev/null +++ b/fastlane/metadata/android/ka/changelogs/1006.txt @@ -0,0 +1,27 @@ +# გაუმჯობესებული + +დროის ნიშნულებზე დაწკაპუნებისას მიმდინარე დამკვრელის შენარჩუნება + +შესაძლებლობის შემთხვევაში, შეეცადეთ აღადგინოთ ჩამოტვირთვის მომლოდინე მისიები + +დაემატა ჩამოტვირთვის წაშლის ვარიანტი ფაილის წაშლის გარეშე + +გადაფარვის ნებართვა: Android > R-ისთვის განმარტებითი დიალოგის ჩვენება + +მხარდაჭერა on.soundcloud ბმულის გახსნისთვის + +ბევრი მცირე გაუმჯობესება და ოპტიმიზაცია + +# გამოსწორებულია + + გასწორდა მოკლე რაოდენობის ფორმატირება Android-ის 7-ზე დაბალი ვერსიებისთვის + + გასწორდა მოჩვენებითი შეტყობინებებები + + გასწორდა SRT სუბტიტრების ფაილები + +გამოსწორებულია უამრავი ავარია + +# განვითარება + +შიდა კოდის მოდერნიზაცია diff --git a/fastlane/metadata/android/ka/changelogs/1008.txt b/fastlane/metadata/android/ka/changelogs/1008.txt new file mode 100644 index 00000000000..2a96e080046 --- /dev/null +++ b/fastlane/metadata/android/ka/changelogs/1008.txt @@ -0,0 +1,7 @@ +∙ ბოლო დაკვრის პოზიციაზე სტრიმინგის განახლების პრობლემა გამოსწორდა + +∙ [YouTube] დაემატა მეტი არხის URL ფორმატების მხარდაჭერა + +∙ [YouTube] დაემატა მეტი ვიდეო მეტაინფო ფორმატების მხარდაჭერა + +∙ განახლდა თარგმანები diff --git a/fastlane/metadata/android/lv/changelogs/1001.txt b/fastlane/metadata/android/lv/changelogs/1001.txt index 4525874fdcf..39fab6e790e 100644 --- a/fastlane/metadata/android/lv/changelogs/1001.txt +++ b/fastlane/metadata/android/lv/changelogs/1001.txt @@ -1,6 +1,6 @@ Uzlabojumi -• Vienmēr atļauj nomainīt atskaņotāja paziņojumu iestatījumus uz ierīcēm ar Android 13+ +• Vienmēr atļauj nomainīt atskaņotāja paziņojumu iestatījumus uz Android 13+ ierīcēm Salabots -• Datubāzes/abonementu izgūšana vairs neapcērp iepriekš eksistējošo datni, kas, iespējams, izraisīja bojātu datni +• Datubāzes/abonementu izgūšana vairs neapcērp iepriekš eksistējošo datni, kas, iespējams, radīja bojātu datni • Novērsta atskaņotāja atsākšana no paša sākuma, kad noklikšķina uz laika zīmoga diff --git a/fastlane/metadata/android/lv/changelogs/64.txt b/fastlane/metadata/android/lv/changelogs/64.txt index 9a362aa95a3..fc5d297642c 100644 --- a/fastlane/metadata/android/lv/changelogs/64.txt +++ b/fastlane/metadata/android/lv/changelogs/64.txt @@ -5,4 +5,4 @@ - pievienots (darbojošs) multimediju sesijas atbalsts #1433 ### Salabots -- Salabota lietotnes nobrukšana, kad atvēra Lejupielādes (labojums pieejams relīzes laidienos) #1441 +- Salabota lietotnes nobrukšana, kad atvēra Lejupielādes (labojums pieejams izlaiduma laidienos) #1441 diff --git a/fastlane/metadata/android/lv/changelogs/770.txt b/fastlane/metadata/android/lv/changelogs/770.txt index a46cda84a83..b4b97028058 100644 --- a/fastlane/metadata/android/lv/changelogs/770.txt +++ b/fastlane/metadata/android/lv/changelogs/770.txt @@ -1,4 +1,4 @@ Izmaiņas 0.17.2 versijā Salabots -• Novērsta problēma, ka videoklips bija nepieejams +• Novērsta problēma, ka video bija nepieejams diff --git a/fastlane/metadata/android/lv/changelogs/850.txt b/fastlane/metadata/android/lv/changelogs/850.txt index 20c79661b88..cc8e048ac76 100644 --- a/fastlane/metadata/android/lv/changelogs/850.txt +++ b/fastlane/metadata/android/lv/changelogs/850.txt @@ -1 +1 @@ -Šī versijas relīze iekļauj atjaunināto YouTube vietnes versiju. Vecās vietnes versijas atbalsts tiks pārtraukta martā, un tāpēc jums ir nepieciešams atjaunināt NewPipe. +Šis versijas izlaidums iekļauj atjaunināto YouTube vietnes versiju. Vecās vietnes versijas pieejamība tiks pārtraukta martā, un tāpēc jums ir nepieciešams atjaunināt NewPipe. diff --git a/fastlane/metadata/android/lv/changelogs/910.txt b/fastlane/metadata/android/lv/changelogs/910.txt index 8e7b9d2273a..06eecc81ac7 100644 --- a/fastlane/metadata/android/lv/changelogs/910.txt +++ b/fastlane/metadata/android/lv/changelogs/910.txt @@ -1 +1 @@ -Salabota datu bāzes migrācija, kas retos gadījumos neļāva NewPipe palaisties. +Salabota datubāzes migrācija, kas retos gadījumos neļāva NewPipe palaisties. diff --git a/fastlane/metadata/android/lv/changelogs/950.txt b/fastlane/metadata/android/lv/changelogs/950.txt index f9a82fe2028..699bd8a4632 100644 --- a/fastlane/metadata/android/lv/changelogs/950.txt +++ b/fastlane/metadata/android/lv/changelogs/950.txt @@ -1,4 +1,4 @@ -Šajā versijā ir veikti tikai trīs nelieli labojumi: +Šajā versijā veikti tikai trīs nelieli labojumi: • Salabota piekļuve krātuvei Android 10+ operētājsistēmās • Salabota kiosku atvēršana -• Salabota ilguma noteikšana ilgiem videoklipiem +• Salabota ilguma noteikšana ilgiem video diff --git a/fastlane/metadata/android/lv/changelogs/956.txt b/fastlane/metadata/android/lv/changelogs/956.txt new file mode 100644 index 00000000000..eafb4c727d4 --- /dev/null +++ b/fastlane/metadata/android/lv/changelogs/956.txt @@ -0,0 +1 @@ +[YouTube] Novērsta lietotnes avarēšana pie jebkuras video ielādes diff --git a/fastlane/metadata/android/lv/changelogs/982.txt b/fastlane/metadata/android/lv/changelogs/982.txt new file mode 100644 index 00000000000..a775fd35b71 --- /dev/null +++ b/fastlane/metadata/android/lv/changelogs/982.txt @@ -0,0 +1 @@ +Novērsta problēma, kuras dēļ YouTube nevarēja atskaņot nevienu straumi. diff --git a/fastlane/metadata/android/lv/changelogs/985.txt b/fastlane/metadata/android/lv/changelogs/985.txt new file mode 100644 index 00000000000..0ad24abc45f --- /dev/null +++ b/fastlane/metadata/android/lv/changelogs/985.txt @@ -0,0 +1 @@ +Novērsta problēma, kuras dēļ YouTube nevarēja atskaņot nevienu straumi diff --git a/fastlane/metadata/android/lv/changelogs/989.txt b/fastlane/metadata/android/lv/changelogs/989.txt index f680eced4f0..c131df9e4e6 100644 --- a/fastlane/metadata/android/lv/changelogs/989.txt +++ b/fastlane/metadata/android/lv/changelogs/989.txt @@ -1,3 +1,3 @@ -• [YouTube] Novērsta bezgalīgā video ielāde pie jebkuru video atskaņošanu -• [YouTube] Novērsta dažu videoklipu lēnā ielāde (straumēšanas ierobežošanas problēma) +• [YouTube] Novērsta bezgalīgi ilgā video ielāde pie jebkuru video atskaņošanu +• [YouTube] Novērsta dažu video lēnā ielāde (straumēšanas ierobežošanas problēma) • Atjaunināta jsoup bibliotēka uz 1.15.3 versiju, kas ietver drošības labojumus diff --git a/fastlane/metadata/android/lv/changelogs/998.txt b/fastlane/metadata/android/lv/changelogs/998.txt index 79e4f31629d..f69425343e7 100644 --- a/fastlane/metadata/android/lv/changelogs/998.txt +++ b/fastlane/metadata/android/lv/changelogs/998.txt @@ -1,4 +1,4 @@ Salabota YouTube nespēja atskaņot jebkādu straumi HTTP 403 kļūdu dēļ. Nejaušas HTTP 403 kļūdas YouTube video skatīšanās laikā vēl nav novērstas. -Konkrētā problēma tiks atrisināta nākamajā labojumfailu laidienā, cik drīz vien iespējams. +Konkrētā problēma tiks atrisināta cik drīz vien iespējama nākamajā labojumfailu izlaidumā. diff --git a/fastlane/metadata/android/nl/changelogs/1000.txt b/fastlane/metadata/android/nl/changelogs/1000.txt new file mode 100644 index 00000000000..91c136da5f1 --- /dev/null +++ b/fastlane/metadata/android/nl/changelogs/1000.txt @@ -0,0 +1,13 @@ +Verbeterd: +• Maak de beschrijving van de afspeellijst klikbaar om meer/minder content te tonen +• [PeerTube] Verwerk `subscribeto.me`-instantiekoppelingen automatisch +• Begin alleen met het afspelen van één item in het geschiedenisscherm +Opgelost: + +• Herstel de zichtbaarheid van de RSS-knop +• Herstel crashes van de zoekbalkvoorvertoning +• Herstel het afspelen van een item zonder miniatuur +• Herstel het afsluiten van het downloaddialoogvenster voordat het verschijnt +• Herstel de pop-up van de lijst met gerelateerde items enqueue +• Herstel de volgorde in het dialoogvenster Toevoegen aan afspeellijst +• Pas de lay-out van het bladwijzeritem van de afspeellijst aan diff --git a/fastlane/metadata/android/nl/changelogs/1002.txt b/fastlane/metadata/android/nl/changelogs/1002.txt index 9bd8adf8693..b31d08284d9 100644 --- a/fastlane/metadata/android/nl/changelogs/1002.txt +++ b/fastlane/metadata/android/nl/changelogs/1002.txt @@ -1 +1 @@ -YouTube speelt geen stream af opgelost +YouTube speelt geen stream af opgelost. diff --git a/fastlane/metadata/android/nl/changelogs/1003.txt b/fastlane/metadata/android/nl/changelogs/1003.txt index 9bd8adf8693..9f1814388c8 100644 --- a/fastlane/metadata/android/nl/changelogs/1003.txt +++ b/fastlane/metadata/android/nl/changelogs/1003.txt @@ -1 +1,6 @@ -YouTube speelt geen stream af opgelost +Dit is een hotfix-release die YouTube-fouten verhelpt: +• [YouTube] Probleem opgelost waarbij geen video-informatie werd geladen, HTTP 403-fouten tijdens het afspelen van video's werden verholpen en de weergave van sommige video's met leeftijdsbeperking werd hersteld +• Probleem opgelost waarbij de ondertitelgrootte niet werd aangepast +• Probleem opgelost waarbij informatie twee keer werd gedownload bij het openen van een stream +• [Soundcloud] Niet-afspeelbare DRM-beveiligde streams verwijderd +• Vertalingen bijgewerkt diff --git a/fastlane/metadata/android/nl/changelogs/1004.txt b/fastlane/metadata/android/nl/changelogs/1004.txt index 9bd8adf8693..f03db87b7c5 100644 --- a/fastlane/metadata/android/nl/changelogs/1004.txt +++ b/fastlane/metadata/android/nl/changelogs/1004.txt @@ -1 +1,3 @@ -YouTube speelt geen stream af opgelost +Deze release verhelpt het probleem dat YouTube alleen een 360p-stream aanbiedt. + +Houd er rekening mee dat de oplossing in deze versie waarschijnlijk tijdelijk is en dat op de lange termijn het SABR-videoprotocol geïmplementeerd moet worden. De leden van TeamNewPipe hebben het momenteel echter erg druk, dus alle hulp is van harte welkom! https://github.com/TeamNewPipe/NewPipe/issues/12248 diff --git a/fastlane/metadata/android/nl/changelogs/1007.txt b/fastlane/metadata/android/nl/changelogs/1007.txt index 9bd8adf8693..95c723500dc 100644 --- a/fastlane/metadata/android/nl/changelogs/1007.txt +++ b/fastlane/metadata/android/nl/changelogs/1007.txt @@ -1 +1,11 @@ -YouTube speelt geen stream af opgelost +Deze hotfix verhelpt de foutmelding "Inhoud niet beschikbaar": YouTube-video's kunnen nu weer worden afgespeeld! + +Het lost ook een aantal bugs op die in versie 0.28.1 zijn geïntroduceerd: +• Playlist-items konden alleen naar aangrenzende posities worden gesleept +• Titel/opmerkingen flikkerden tussen de huidige en vorige video +• De optie "Start de hoofdspeler in volledig scherm" werkte niet + +Andere verbeteringen: +• [YouTube] Het is weer mogelijk om livestreams tot 4 uur terug te spoelen +• Livestreamvideo's worden niet geladen wanneer ze op de achtergrond worden afgespeeld +• Nieuwe gebruikersinterface voor "Verwijder bekeken" diff --git a/fastlane/metadata/android/nl/changelogs/64.txt b/fastlane/metadata/android/nl/changelogs/64.txt index dd457279c15..dbed1653706 100644 --- a/fastlane/metadata/android/nl/changelogs/64.txt +++ b/fastlane/metadata/android/nl/changelogs/64.txt @@ -1,5 +1,5 @@ ### Verbeteringen -- Mogelijkheid toegevoegd om de videokwaliteit te beperken bij het gebruik van mobiele data. #1339 +- Mogelijkheid toegevoegd om de videokwaliteit te beperken bij het gebruik van mobiele data. #1339 - Helderheid voor de sessie onthouden #1442 - Downloadprestaties voor zwakkere CPU's verbeterd #1431 - (werkende) ondersteuning voor mediasessie toegevoegd #1433 diff --git a/fastlane/metadata/android/nl/changelogs/930.txt b/fastlane/metadata/android/nl/changelogs/930.txt index 853bfa5de2f..9be06db77cd 100644 --- a/fastlane/metadata/android/nl/changelogs/930.txt +++ b/fastlane/metadata/android/nl/changelogs/930.txt @@ -10,7 +10,7 @@ Nieuw • Verbeterde formaatverwerking van de titel van de ladekoptekst Opgelost - • instelling voor inhoud met leeftijdsbeperking werkt niet opgelost + • instelling voor inhoud met leeftijdsbeperking werkt niet opgelost • Bepaalde soorten reCAPTCHA's opgelost • Crash opgelost bij het openen van bladwijzers terwijl de afspeellijst 'null' is • Vaste detectie van netwerkgerelateerde uitzonderingen diff --git a/fastlane/metadata/android/nl/changelogs/952.txt b/fastlane/metadata/android/nl/changelogs/952.txt index 3ff60109a60..5dba7daed7c 100644 --- a/fastlane/metadata/android/nl/changelogs/952.txt +++ b/fastlane/metadata/android/nl/changelogs/952.txt @@ -1,7 +1,7 @@ Verbeterd -• Automatisch afspelen is beschikbaar voor alle services (in plaats van alleen voor YouTube) +• Auto-afspelen is beschikbaar voor alle services (in plaats van alleen voor YouTube) -Aangepast -• Vaste gerelateerde streams door de nieuwe voortzettingen van YouTube te ondersteunen -• YouTube-video's met leeftijdsbeperking -• [Android TV] Opgeloste overlay met focusaccenten +Opgelost +• Gerelateerde streams opgelost door YouTube's nieuwe voortzettingen te steunen +• Leeftijdsbeperkte YouTube videos opgelost +• [Android TV] Aanhoudende focusmarkeringlaag opgelost diff --git a/fastlane/metadata/android/nl/changelogs/953.txt b/fastlane/metadata/android/nl/changelogs/953.txt index 8f7f8b89a36..7454c3ddce4 100644 --- a/fastlane/metadata/android/nl/changelogs/953.txt +++ b/fastlane/metadata/android/nl/changelogs/953.txt @@ -1 +1 @@ -Herstel de extractie van de decoderingsfunctie van YouTube. +Extractie van YouTube's decryptiefunctie opgelost. diff --git a/fastlane/metadata/android/nl/changelogs/998.txt b/fastlane/metadata/android/nl/changelogs/998.txt index 9bd8adf8693..fca4440dd4e 100644 --- a/fastlane/metadata/android/nl/changelogs/998.txt +++ b/fastlane/metadata/android/nl/changelogs/998.txt @@ -1 +1,4 @@ -YouTube speelt geen stream af opgelost +Het probleem dat YouTube geen streams afspeelde vanwege HTTP 403-fouten is opgelost. + +Incidentele HTTP 403-fouten midden in een YouTube-video zijn nog niet verholpen. +Dit probleem zal zo snel mogelijk in een volgende hotfix-release worden aangepakt. diff --git a/fastlane/metadata/android/pl/changelogs/1009.txt b/fastlane/metadata/android/pl/changelogs/1009.txt new file mode 100644 index 00000000000..7f99742a73d --- /dev/null +++ b/fastlane/metadata/android/pl/changelogs/1009.txt @@ -0,0 +1,14 @@ +Ważne +- Dodano informację i wezwanie do działania w ramach kampanii Keep Android Open: https://www.keepandroidopen.org/ + +Ulepszone +- [Kanał] Losowa kolejność aktualizacji nieaktualnych subskrypcji +- Nienakładanie się stron komentarzy +- Nieprzekazywanie naciśnięć do przesłoniętych widoków przy naciskaniu strony szczegółów wideo + +Naprawione +- Układ nagłówka odpowiedzi na komentarze bez awatara +- Wiele poprawek UI związanych z odtwarzaczem +- [SoundCloud] Strumienie z długimi ID + +i wiele innych! diff --git a/fastlane/metadata/android/pl/changelogs/996.txt b/fastlane/metadata/android/pl/changelogs/996.txt new file mode 100644 index 00000000000..51b21ce58ba --- /dev/null +++ b/fastlane/metadata/android/pl/changelogs/996.txt @@ -0,0 +1,2 @@ +Naprawiono NullPointerException podczas otwierania kanału / konferencji na media.ccc.de. +Grinch próbował zepsuć nasz prezent świąteczny, który został przygotowany dla Ciebie, ale to naprawiliśmy. diff --git a/fastlane/metadata/android/pt-BR/changelogs/1000.txt b/fastlane/metadata/android/pt-BR/changelogs/1000.txt index 7f89cd9b2c5..6a884f9672e 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/1000.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/1000.txt @@ -1,13 +1,13 @@ -Melhorado -• Torne a descrição da lista de reprodução clicável para mostrar mais / menos conteudo -• [PeerTube] Gerênciar links de instâncias `subscribeto.me` automaticamente -• Começar a reprodução apenas de um item na tela de histórico +Improved +• Make playlist description clickable to show more / less content +• [PeerTube] Handle `subscribeto.me` instance links automatically +• Only start playing single item in history screen -Corrigido -• Corrigir visibilidade do botão RSS -• Corrigir falhas na pré-visualização da barra de busca -• Corrigir erro ao adicionar item sem miniatura à playlist -• Corrigir erro ao sair da caixa de diálogo de descarregar antes de ela aparecer -• Corrigir itens relacionados ao pop-up de colocar na fila -• Corrigir a ordem no diálogo de adicionar à lista de reprodução -• Ajustar o layout do item de marcador de lista de reprodução +Fixed +• Fix RSS button visibility +• Fix seekbar preview crashes +• Fix playlisting a thumbnail-less item +• Fix exiting the download dialog before it appears +• Fix related items list enqueue popup +• Fix order in add to playlist dialog +• Adjust the playlist bookmark item layout diff --git a/fastlane/metadata/android/pt-BR/changelogs/1002.txt b/fastlane/metadata/android/pt-BR/changelogs/1002.txt index 59fc6a5cdb0..7879b39dbcb 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/1002.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/1002.txt @@ -1 +1,4 @@ -Corrigido YouTube não reproduzir qualquer transmissão +Corrigido o problema do YouTube não reproduzir nenhum vídeo. + +Esta versão corrige apenas o erro mais urgente que impede o carregamento de detalhes dos vídeos do YouTube. +Estamos cientes de que existem outros problemas e, em breve, lançaremos uma versão separada para resolvê-los. diff --git a/fastlane/metadata/android/pt-BR/changelogs/1003.txt b/fastlane/metadata/android/pt-BR/changelogs/1003.txt index 59fc6a5cdb0..3cad38acfea 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/1003.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/1003.txt @@ -1 +1,6 @@ -Corrigido YouTube não reproduzir qualquer transmissão +Esta é uma versão de correção que corrige erros do YouTube: +• [YouTube] Corrige o não carregamento de informações de vídeo, corrige erros HTTP 403 durante a reprodução de vídeos e restaura a reprodução de alguns vídeos com restrição de idade +• Corrige o tamanho das legendas que não era alterado +• Corrige o download de informações duas vezes ao abrir uma transmissão. +• [Soundcloud] Remove transmissões protegidas por DRM que não podem ser reproduzidas +• Traduções atualizadas diff --git a/fastlane/metadata/android/pt-BR/changelogs/1004.txt b/fastlane/metadata/android/pt-BR/changelogs/1004.txt index 59fc6a5cdb0..a2c33d8ed1a 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/1004.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/1004.txt @@ -1 +1,3 @@ -Corrigido YouTube não reproduzir qualquer transmissão +Esta versão corrige o problema do YouTube fornecer apenas uma transmissão de 360p. + +Observe que a solução empregada nesta versão é provavelmente temporária e, a longo prazo, o protocolo de vídeo SABR precisa ser implementado, mas os membros da TeamNewPipe estão ocupados no momento, portanto, qualquer ajuda será muito bem-vinda! https://github.com/TeamNewPipe/NewPipe/issues/12248 diff --git a/fastlane/metadata/android/pt-BR/changelogs/1005.txt b/fastlane/metadata/android/pt-BR/changelogs/1005.txt index 3ef1f3e2e0f..2bfdfca0e0a 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/1005.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/1005.txt @@ -1,17 +1,17 @@ New -• Suporte adicionado para Android Auto -• Permitir configuração de grupos de feed como abas da tela principal -• [YouTube] Compartilhe como playlist temporária -• [SoundCloud] Aba de curtidas do canal +• Add support for Android Auto +• Allow setting feed groups as main screen tabs +• [YouTube] Share as temporary playlist +• [SoundCloud] Likes channel tab -Melhorado -• Melhor sugestão na barra de busca -• Mostra data do download em Downloads -• Usar idioma por aplicativo no Android 13 +Improved +• Better search bar hints +• Show download date in Downloads +• Use Android 13 per-app language -Consertado -• Texto no modo escuro consertado -• [YouTube] Conserta playlists não carregando mais do que 100 itens -• [YouTube] Conserta videos recomendados faltando -• Conserta lista de visualização do histórico -• Conserta registro de tempo na resposta de comentários +Fixed +• Fix broken text colors in dark mode +• [YouTube] Fix playlists not loading more than 100 items +• [YouTube] Fix missing recommended videos +• Fix crashes in History list view +• Fix timestamps in comment replies diff --git a/fastlane/metadata/android/pt-BR/changelogs/1006.txt b/fastlane/metadata/android/pt-BR/changelogs/1006.txt new file mode 100644 index 00000000000..90fd823f93f --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/1006.txt @@ -0,0 +1,16 @@ +# Melhorias +Mantém o player ao tocar nas minutagens do vídeo. +Recupera downloads pendentes quando possível. +Limpa a lista de downloads sem excluir o arquivo permanentemente. +Aviso de Permissão de Sobreposição (Android R+). +Suporte a links do SoundCloud. +Pequenas melhorias e otimizações. + +# Correções +Formato de contagem para Android < 7. +Notificações confusas ou incoerentes. +Ajustes em legendas SRT. +Correção de fechamentos bruscos (crashes). + +# Desenvolvimento +Modernização do código interno. diff --git a/fastlane/metadata/android/pt-BR/changelogs/1007.txt b/fastlane/metadata/android/pt-BR/changelogs/1007.txt index 59fc6a5cdb0..d3bd98aeafe 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/1007.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/1007.txt @@ -1 +1,11 @@ -Corrigido YouTube não reproduzir qualquer transmissão +This hotfix release fixes the "Content not available" error: YouTube videos can now be played again! + +It also fixes a few bugs introduced in 0.28.1: +• Playlist items dragging to only neighbor positions +• Title/comments flickering between current and previous video +• "Start main player in fullscreen" option not working + +Other improvements: +• [YouTube] Allow rewinding livestreams up to 4 hours again +• Don't load livestream video when playing in background +• New UI for "Remove watched" diff --git a/fastlane/metadata/android/pt-BR/changelogs/1008.txt b/fastlane/metadata/android/pt-BR/changelogs/1008.txt new file mode 100644 index 00000000000..ef7d70a9b56 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/1008.txt @@ -0,0 +1,4 @@ +∙ Corrigido o retomar de streams na última posição de reprodução +∙ [YouTube] Adicionado suporte a mais formatos de URL de canal +∙ [YouTube] Adicionado suporte a mais formatos de metadados de vídeo +∙ Traduções atualizadas diff --git a/fastlane/metadata/android/pt-BR/changelogs/65.txt b/fastlane/metadata/android/pt-BR/changelogs/65.txt index bd7a638f68e..ed37e78e5cc 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/65.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/65.txt @@ -1,26 +1 @@ -### Melhorias - -- Desabilitar a animação do ícone do burgermenu #1486 -- Desfazer a eliminação de descarregamentos #1472 -- Opção de descarregamento no menu de partilha #1498 -- Opção de partilha adicionada ao menu de toque longo #1454 -- Minimize o jogador principal na saída #1354 -- Atualização da versão da biblioteca e correção de cópia de segurança da base de dados #1510 -- ExoPlayer 2.8.2 Atualização #1392 - - Retrabalhado a caixa de diálogo de controlo de velocidade de reprodução para suportar diferentes tamanhos de etapa para uma mudança de velocidade mais rápida. - - Adicionado uma alternância para avanço rápido durante silêncios no controle de velocidade de reprodução. Isso deve ser útil para audiolivros e certos gêneros musicais, e pode trazer uma experiência verdadeiramente perfeita (e pode quebrar uma música com muitos silêncios =\\) - - Resolução de fonte de média ré fatorada para permitir a passagem de metadados junto com a média internamente no reprodutor, em vez de fazê-lo manualmente. Agora temos uma única fonte de metadados e está disponível diretamente quando a reprodução é iniciada. - - Correção de metadados de listas de reprodução remotas que não são atualizadas quando novos metadados estão disponíveis quando o fragmento da lista de reprodução é aberta. - - Várias correções de interface do utilizador : #1383, controles de notificação do reprodutor em segundo plano agora sempre brancos, mais fácil de desligar o reprodutor pop-up por meio de arremesso -- Use novo extrator com arquitetura ré fatorada para multisserviço - -### Correções - -- Corrigir #1440 Layout de informações de vídeo quebrado #1491 -- Ver correção de histórico #1497 - - #1495, atualizando os metadados (miniatura, título e contagem de vídeos) assim que o usuário acessar a lista de reprodução. - - #1475, registando uma visualização na base de dados quando o utilizador inicia um vídeo no reprodutor externo no fragmento de detalhes. -- Correção de tempo limite de criação em caso de modo pop-up. #1463 (Corrigido #640) -- Correção do reprodutor de vídeo principal #1509 - [#1412] Corrigido o modo de repetição causando NPE do reprodutor quando uma nova intenção é recebida enquanto a atividade do reprodutor está em segundo plano. - - Corrigida a minimização de reprodutor para pop-up não destrói o reprodutor quando a permissão de pop-up não é concedida. +A tradução não deve exceder o comprimento. diff --git a/fastlane/metadata/android/pt-BR/changelogs/66.txt b/fastlane/metadata/android/pt-BR/changelogs/66.txt index ed84a27599e..30c20b0e8cb 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/66.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/66.txt @@ -1,33 +1,33 @@ -# Changelog de v0.13.7 +# Changelog of v0.13.7 -### Fixo -- Fixar questões de filtro de ordenação da v0.13.6 +### Fixed +- Fix sort filter issues of v0.13.6 -# Mudança do v0.13.6 +# Changelog of v0.13.6 -### Melhorias +### Improvements -- Desactivar animação de ícones de burgermenu #1486 -- anular a eliminação dos downloads #1472 -- Opção de download no menu de partilha #1498 -- Adicionada a opção de partilha no menu de toque longo #1454 -- Minimizar o jogador principal na saída #1354 -- Actualização da versão da biblioteca e correcção da cópia de segurança da base de dados #1510 -- ExoPlayer 2.8.2 Actualização #1392 - - Reformulou o diálogo de controlo de velocidade de reprodução para suportar diferentes tamanhos de passos para uma mudança de velocidade mais rápida. - - Adicionada uma alternância para avançar rapidamente durante os silêncios no controlo de velocidade de reprodução. Isto deve ser útil para audiolivros e certos géneros musicais, e pode trazer uma verdadeira experiência sem falhas (e pode quebrar uma canção com muitos silêncios =\i1). - - A resolução da fonte dos meios de comunicação foi refeita para permitir a passagem de metadados ao lado dos meios de comunicação internamente no leitor, em vez de o fazer manualmente. Agora temos uma única fonte de metadados e está directamente disponível quando a reprodução começa. - - Fixados os metadados da lista de reprodução remota que não são actualizados quando novos metadados estão disponíveis quando o fragmento da lista de reprodução é aberto. - - Várias correcções UI: #1383, a notificação do leitor de fundo controla agora sempre branco, mais fácil de desligar o leitor de pop-ups através do fling -- Usar novo extractor com arquitectura refacturada para multiserviços +- Disable burgermenu icon animation #1486 +- undo delete of downloads #1472 +- Download option in share menu #1498 +- Added share option to long tap menu #1454 +- Minimize main player on exit #1354 +- Library version update and database backup fix #1510 +- ExoPlayer 2.8.2 Update #1392 + - Reworked the playback speed control dialog to support different step sizes for faster speed change. + - Added a toggle to fast-forward during silences in playback speed control. This should be helpful for audiobooks and certain music genres, and can bring a true seamless experience (and can break a song with lots of silences =\\). + - Refactored media source resolution to allow passing metadata alongside media internally in the player, rather than doing so manually. Now we have a single source of metadata and is directly available when playback starts. + - Fixed remote playlist metadata not updating when new metadata is available when playlist fragment is opened. + - Various UI fixes: #1383, background player notification controls now always white, easier to shutdown popup player through flinging +- Use new extractor with refactored architecture for multiservice -### Correcções +### Fixes -- Reparação #1440 Layout de Informação de Vídeo Partido #1491 -- Ver histórico correcção #1497 - - #1495, actualizando os metadados (miniatura, título e contagem de vídeo) assim que o utilizador aceda à lista de reprodução. - - #1475, através do registo de uma vista na base de dados quando o utilizador inicia um vídeo no leitor externo sobre fragmento de detalhe. -- Fixar tempo limite de creen em caso de modo popup. #1463 (Fixado #640) -- Correcção principal do leitor de vídeo #1509 - - [#1412] Modo de repetição fixo causando NPE do jogador quando novas intenções são recebidas enquanto a actividade do jogador está em segundo plano. - - Fixa a minimização do jogador a popup não destrói o jogador quando não é concedida permissão de popup. +- Fix #1440 Broken Video Info Layout #1491 +- View history fix #1497 + - #1495, by updating the metadata (thumbnail, title and video count) as soon as the user access the playlist. + - #1475, by registering a view in the database when the user starts a video on external player on detail fragment. +- Fix creen timeout in case of popup mode. #1463 (Fixed #640) +- Main video player fix #1509 + - [#1412] Fixed repeat mode causing player NPE when new intent is received while player activity is in background. + - Fixed minimizing player to popup does not destroy player when popup permission is not granted. diff --git a/fastlane/metadata/android/pt-BR/changelogs/68.txt b/fastlane/metadata/android/pt-BR/changelogs/68.txt index 1e6c42e01d2..238b1e0b18c 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/68.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/68.txt @@ -1,31 +1,31 @@ -# mudanças da v0.14.1 +# changes of v0.14.1 -### fixo -- Fixo falhou em desencriptar a url de vídeo #1659 -- Ligação de descrição fixa não extraída bem #1657 +### Fixed +- Fixed failed to decrypt video url #1659 +- Fixed description link not extract well #1657 -# mudanças de v0.14.0 +# changes of v0.14.0 -### Novo -- Novo desenho de gaveta #1461 -- Nova página inicial personalizável #1461 +### New +- New Drawer design #1461 +- New customizable front page #1461 -### Melhorias -- Controlos por gestos retrabalhados #1604 -- Nova forma de fechar o leitor de popup #1597 +### Improvements +- Reworked Gesture controls #1604 +- New way to close the popup player #1597 -### Fixa -- Corrigir erro quando a contagem de assinaturas não está disponível. Fecha #1649. - - Mostrar "Contagem de subscritores não disponível" nesses casos -- Consertar NPE quando uma lista de reprodução do YouTube está vazia -- Correcção rápida para os quiosques em SoundCloud -- Refactor e correcção de bugs #1623 - - Resultado de pesquisa cíclica reparada #1562 - - Barra de procura fixa não estática - - Os vídeos do YT Premium não estão bloqueados correctamente - - Vídeos Fixos por vezes não carregados (devido à análise do DASH) - - Corrigir ligações na descrição vídeo - - Mostrar aviso quando alguém tenta descarregar para sdcard externo - - nada de excepção mostrado dispara o relatório - - thumbnail não mostrado no leitor de fundo para andróide 8.1 [ver aqui](https://github.com/TeamNewPipe/NewPipe/issues/943) -- Correcção do registo do receptor de radiodifusão. Fecha #1641. +### Fixed +- Fix error when subscription count is not available. Closes #1649. + - Show "Subscriber count not available" in those cases +- Fix NPE when a YouTube playlist is empty +- Quick fix for the kiosks in SoundCloud +- Refactor and bugfix #1623 + - Fix Cyclic search result #1562 + - Fix Seek bar not statically lay outed + - Fix YT Premium video are not blocked correctly + - Fix Videos sometimes not loading (due to DASH parsing) + - Fix links in video description + - Show warning when someone tries to download to external sdcard + - fix nothing shown exception triggers report + - thumbnail not shown in background player for android 8.1 [see here](https://github.com/TeamNewPipe/NewPipe/issues/943) +- Fix registering of broadcast receiver. Closes #1641. diff --git a/fastlane/metadata/android/pt-BR/changelogs/69.txt b/fastlane/metadata/android/pt-BR/changelogs/69.txt index fa7d5d85cda..c8262d1b0d7 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/69.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/69.txt @@ -1,19 +1,19 @@ -#### Novo -- Eliminação de longa duração e partilha de subscrições #1516 -- Tabela UI e esquema de lista de grelha #1617 +### New +- Long-tap delete and share in subscriptions #1516 +- Tablet UI and grid list layout #1617 -### Melhorias -- armazenar e recarregar a última relação de aspeto utilizada #1748 -- Ativar a disposição linear na atividade de Downloads com nomes de vídeo completos #1771 -- Apagar e partilhar subscrições diretamente do separador de subscrições #1516 -- Enqueuing agora ativa a reprodução de vídeo se a fila de reprodução já tiver terminado #1783 -- Configurações separadas para os gestos de volume e luminosidade #1644 -- Adicionar apoio à Localização #1792 +### Improvements +- store and reload the last used aspect ratio #1748 +- Enable linear layout in Downloads activity with full video names #1771 +- Delete and share subscriptions directly from within the subscriptions tab #1516 +- Enqueuing now triggers video playing if the play queue has already ended #1783 +- Separate settings for volume and brightness gestures #1644 +- Add support for Localization #1792 -### Correções -- Fixar a análise do tempo para . formato, para que NewPipe possa ser usado na Finlândia -- Contagem fixa de assinaturas -- Adicionar permissão de serviço em primeiro plano para dispositivos API 28+ #1830 +### Fixes +- Fix time parsing for . format, so NewPipe can be used in Finland +- Fix subscription count +- Add foreground service permission for API 28+ devices #1830 -### Bugs conhecidos -- O estado de reprodução não pode ser guardado no Android P +### Known Bugs +- Playback state can not be saved on Android P diff --git a/fastlane/metadata/android/pt-BR/changelogs/70.txt b/fastlane/metadata/android/pt-BR/changelogs/70.txt index 61de40666ef..ad87a4409c5 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/70.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/70.txt @@ -1,25 +1,25 @@ -Atenção: esta versão é provavelmente um bugfest, tal como a última. No entanto, devido ao desligamento total desde o 17. uma versão quebrada é melhor do que nenhuma versão. Certo? ¯\_(ツ)_/¯ +ATTENTION: This version probably is a bugfest, just like the last one. However due to the full shutdown since the 17. a broken version is better then no version. Right? ¯\_(ツ)_/¯ -### Melhoria -* os arquivos baixados agora podem ser abertos com um clique #1879 -* suporte drop para android 4.1-4.3 #1884 -* remover jogador antigo #1884 -* remova os fluxos da fila de reprodução atual passando-os para a direita #1915 -* remova o fluxo enfileirado automático quando um novo fluxo é enfileirado manualmente # 1878 -* Pós-processamento para downloads e implementar recursos ausentes #1759 por @ kapodamy - * Infra-estruturas de pós-processamento - * Tratamento adequado de erros "infraestrutura" (para downloader) - * Fila em vez de vários downloads - * Mover transferências pendentes serializadas (`.arquivos giga`) para dados do aplicativo - * Implementar nova tentativa máxima de download - * Pausa adequada para o download de vários segmentos - * Parar downloads quando swicthing à rede móvel (nunca funciona, ver ponto 2) - * Salve a contagem de threads para os próximos downloads - * Muitas incoerências corrigidas +### Improvements +* downloaded files can now be opened with one click #1879 +* drop support for android 4.1 - 4.3 #1884 +* remove old player #1884 +* remove streams from current play queue by swiping them to the right #1915 +* remove auto queued stream when a new stream is enqueued manually #1878 +* Postprocessing for downloads and implement missing features #1759 by @kapodamy + * Post-processing infrastructure + * Proper error handling "infrastructure" (for downloader) + * Queue instead of multiple downloads + * Move serialized pending downloads (`.giga` files) to app data + * Implement max download retry + * Proper multi-thread download pausing + * Stop downloads when swicthing to mobile network (never works, see 2nd point) + * Save the thread count for next downloads + * A lot of incoherences fixed -### Corrigido -* Corrigir falha com resolução padrão definida como a melhor e limitada resolução de dados móveis #1835 -* falha do jogador pop-up corrigida #1874 -* NPE ao tentar abrir o jogador de fundo #1901 -* Correção para inserir novos fluxos quando o enfileiramento automático está habilitado #1878 -* Corrigido o problema decypering shuttown +### Fixed +* Fix crash with default resolution set to best and limited mobile data resolution #1835 +* pop-up player crash fixed #1874 +* NPE when trying to open background player #1901 +* Fix for inserting new streams when auto queuing is enabled #1878 +* Fixed the decypering shuttown issue diff --git a/fastlane/metadata/android/pt-BR/changelogs/71.txt b/fastlane/metadata/android/pt-BR/changelogs/71.txt index fb525ccccca..5facfc05f3a 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/71.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/71.txt @@ -1,10 +1,10 @@ -### Melhoria -* Adicionar notificação de atualização do aplicativo para compilação do GitHub (#1608 por @ krtkush) -* Várias melhorias para o downloader(# 1944 por @kapodamy): - * * adicione ícones brancos ausentes e use o modo hardcore para alterar as cores dos ícones - * verifique se o iterador foi inicializado (correções #2031) - * * permitir novas tentativas de downloads com erro "Falha no pós-processamento" no novo mixer - * novo muxer MPEG - 4 que fixa fluxos de vídeo e áudio não síncronos (#2039) +### Improvements +* Add app update notification for GitHub build (#1608 by @krtkush) +* Various improvements to the downloader (#1944 by @kapodamy): + * add missing white icons and use hardcored way for change the icon colors + * check if the iterator is initialized (fixes #2031) + * allow retry downloads with "post-processing failed" error in the new muxer + * new MPEG-4 muxer fixing non-synchronous video and audio streams (#2039) -### Corrigido -* * As transmissões ao vivo do YouTube param de ser reproduzidas após um curto período de tempo(# 1996 por @username) +### Fixed +* YouTube live streams stop playing after a short time (#1996 by @yausername) diff --git a/fastlane/metadata/android/pt-BR/changelogs/740.txt b/fastlane/metadata/android/pt-BR/changelogs/740.txt index d591eda53e0..c795978a894 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/740.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/740.txt @@ -1,23 +1,23 @@ -< H4 > melhorias< / h4> -< ul> -< li>tornar os links nos comentários clicáveis, aumentar o tamanho do texto< / li> -< li>procurar ao clicar em links de carimbo de data/hora nos comentários< / li> -< li>mostrar a guia preferida com base no estado selecionado recentemente< / li> -< li>adicionar lista de reprodução à fila ao clicar longamente em & # 39;fundo& # 39; na janela da lista de reprodução< / li> -< li>procurar texto partilhado quando não é um URL< / li> -< li>adicionar o botão"Partilhar no momento atual & quot; ao leitor de vídeo principal< / li> -< li>adicionar botão fechar ao leitor principal quando terminar a fila de vídeo< / li> -< li>Adicionar & quot;Reproduzir diretamente em segundo plano & quot; ao menu longpress para itens da lista de vídeos< / li> -< li>melhorar as traduções em Inglês para comandos Play / Enqueue< / li> -< li>pequenas melhorias de desempenho< / li> -< li>remover ficheiros não utilizados < / li> -< li>Atualizar o ExoPlayer para 2.9.6< / li> -< li>adicionar suporte para links ofensivos< / li> -< / ul> -

fixo < /h4> -< ul> -< li>rolagem fixa com comentários e fluxos relacionados desativados < / li> -< li>Corrigido CheckForNewAppVersionTask sendo executado quando deveria & # 39; t< / li> -< li>importação de assinatura fixa do youtube: ignore aqueles com url inválido e mantenha aqueles com título vazio< / li> -< li>corrigir URL inválido do YouTube: o nome da marca de assinatura nem sempre é "Assinatura", impedindo o carregamento de fluxos< / li> -< / ul> +

Improvements

+
    +
  • make links in comments clickable, increase text size
  • +
  • seek on clicking timestamp links in comments
  • +
  • show preferred tab based on recently selected state
  • +
  • add playlist to queue when long clicking on 'Background' in playlist window
  • +
  • search for shared text when it is not an URL
  • +
  • add "share at current time" button to the main video player
  • +
  • add close button to main player when video queue is finished
  • +
  • add "Play directly in Background" to longpress menu for video list items
  • +
  • improve English translations for Play/Enqueue commands
  • +
  • small performance improvements
  • +
  • remove unused files
  • +
  • update ExoPlayer to 2.9.6
  • +
  • add support for Invidious links
  • +
+

Fixed

+
    +
  • fixed scroll w/ comments and related streams disabled
  • +
  • fixed CheckForNewAppVersionTask being executed when it shouldn't
  • +
  • fixed youtube subscription import: ignore ones with invalid url and keep ones with empty title
  • +
  • fix invalid YouTube url: signature tag name is not always "signature" preventing streams from loading
  • +
diff --git a/fastlane/metadata/android/pt-BR/changelogs/750.txt b/fastlane/metadata/android/pt-BR/changelogs/750.txt index 25f0c1dbfdc..39b77f7c346 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/750.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/750.txt @@ -1,22 +1,22 @@ -Novo -Resumo da reprodução #2288 -* Retomar fluxos onde parou da última vez -Melhorias Do Downloader #2149 -* Use o Storage Access Framework para armazenar downloads em cartões SD externos -* Novo MP4 muxer -* Opcionalmente, altere o diretório de download antes de iniciar um download -* Respeitar as redes de medição +New +Playback resume #2288 +• Resume streams where you stopped last time +Downloader Enhancements #2149 +• Use Storage Access Framework to store downloads on external SD-cards +• New mp4 muxer +• Optionally change the download directory before starting a download +• Respect metered networks -Melhorado -* Cordas gema removidas #2295 -* Lidar com mudanças de rotação (automática) durante o ciclo de vida da atividade #2444 -* Tornar os menus de pressão longa consistentes #2368 +Improved +• Removed gema strings #2295 +• Handle (auto)rotation changes during activity lifecycle #2444 +• Make long-press menus consistent #2368 -Corrigido -* Corrigido o nome da faixa de legenda selecionada não sendo mostrado #2394 -• Não trave quando a verificação da atualização do aplicativo falhar (versão do GitHub) #2423 -* Downloads fixos presos em 99,9% #2440 -* Atualizar meta dados da fila de reprodução #2453 -* [*[SoundCloud] corrigida a falha ao carregar listas de reprodução Team New Pipe / New Pipe Extractor#170 -* [*[YouTube] A duração fixa não pode ser analisada Team New Pipe / New Pipe Extractor#177 +Fixed +• Fixed selected subtitle track name not being shown #2394 +• Do not crash when check for app update fails (GitHub version) #2423 +• Fixed downloads stuck at 99.9% #2440 +• Update play queue metadata #2453 +• [SoundCloud] Fixed crash when loading playlists TeamNewPipe/NewPipeExtractor#170 +• [YouTube] Fixed duration can not be paresd TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/pt-BR/changelogs/760.txt b/fastlane/metadata/android/pt-BR/changelogs/760.txt index 113a92615f7..6e000f6d9f0 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/760.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/760.txt @@ -1,43 +1,43 @@ -Alterações em 0.17.1 +Changes in 0.17.1 -Novo -* Localização tailandesa +New +• Thai localization -Melhorado -* Adicionar começar a jogar aqui ação em menus de longo imprensa para playlists novamente #2518 -* Adicionar interruptor para SAF / legacy file picker #2521 +Improved +• Add start playing here action in long-press menus for playlists again #2518 +• Add switch for SAF / legacy file picker #2521 -Corrigido -* Corrigir botões desaparecendo na visualização de downloads ao alternar aplicativos #2487 -* Corrigir a posição de reprodução é armazenada, embora o histórico de exibição esteja desativado -* Corrigir desempenho reduzido causado pela posição de reprodução em visualizações de lista #2517 -* [Extractor] Corrigir ReCaptchaActivity # 2527, TeamNewPipe / NewPipeExtractor#186 -* [Extractor] [YouTube] Corrigir Erro de pesquisa casual quando as listas de reprodução estão nos resultados TeamNewPipe / NewPipeExtractor#185 +Fixed +• Fix disappearing buttons in downloads view when switching apps #2487 +• Fix playback position is stored although watch history is disabled +• Fix reduced performance caused by playback position in list views #2517 +• [Extractor] Fix ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186 +• [Extractor] [YouTube] Fix casual search error when playlists are in results TeamNewPipe/NewPipeExtractor#185 -Alterações em 0.17.0 +Changes in 0.17.0 -Novo -Resumo da reprodução #2288 -* Retomar fluxos onde parou da última vez -Melhorias Do Downloader #2149 -* Use o Storage Access Framework para armazenar downloads em cartões SD externos -* Novo MP4 muxer -* Opcionalmente, altere o diretório de download antes de iniciar um download -* Respeitar as redes de medição +New +Playback resume #2288 +• Resume streams where you stopped last time +Downloader Enhancements #2149 +• Use Storage Access Framework to store downloads on external SD-cards +• New mp4 muxer +• Optionally change the download directory before starting a download +• Respect metered networks -Melhorado -* Cordas gema removidas #2295 -* Lidar com mudanças de rotação (automática) durante o ciclo de vida da atividade #2444 -* Tornar os menus de pressão longa consistentes #2368 +Improved +• Removed gema strings #2295 +• Handle (auto)rotation changes during activity lifecycle #2444 +• Make long-press menus consistent #2368 -Corrigido -* Corrigido o nome da faixa de legenda selecionada não sendo mostrado #2394 -• Não trave quando a verificação da atualização do aplicativo falhar (versão do GitHub) #2423 -* Downloads fixos presos em 99,9% #2440 -* Atualizar metadados da fila de reprodução #2453 -* [SoundCloud] corrigida a falha ao carregar listas de reprodução TeamNewPipe / NewPipeExtractor#170 -* [YouTube] duração fixa não pode ser Paresd TeamNewPipe / NewPipeExtractor#177 +Fixed +• Fixed selected subtitle track name not being shown #2394 +• Do not crash when check for app update fails (GitHub version) #2423 +• Fixed downloads stuck at 99.9% #2440 +• Update play queue metadata #2453 +• [SoundCloud] Fixed crash when loading playlists TeamNewPipe/NewPipeExtractor#170 +• [YouTube] Fixed duration can not be paresd TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/pt-BR/changelogs/780.txt b/fastlane/metadata/android/pt-BR/changelogs/780.txt index 61392c0df56..9100d7335f0 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/780.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/780.txt @@ -1,12 +1,12 @@ -Alterações em 0.17.3 +Changes in 0.17.3 -Melhorado -- Adicionada opção para limpar estados de reprodução #2550 -- Mostrar diretórios ocultos no seletor de ficheiros #2591 -- URLs de apoio de instâncias `invidio.us` a serem abertas com NewPipe #2488 -- Adicionar suporte para `music.youtube.com` URLs TeamNewPipe/NewPipeExtractor#194 +Improved +• Added option to clear playback states #2550 +• Show hidden directories in the file picker #2591 +• Support URLs from `invidio.us` instances to be opened with NewPipe #2488 +• Add support for `music.youtube.com` URLs TeamNewPipe/NewPipeExtractor#194 -Corrigido -- [YouTube] Fixo 'java.lang.IllegalArgumentException #192 -- [YouTube] Fluxos fixos ao vivo não funcionam TeamNewPipe/NewPipeExtractor#195 -- Resolvido problema de desempenho em torta de android ao descarregar um fluxo #2592 +Fixed +• [YouTube] Fixed 'java.lang.IllegalArgumentException #192 +• [YouTube] Fixed live streams not working TeamNewPipe/NewPipeExtractor#195 +• Fixed performance problem in android pie when downloading a stream #2592 diff --git a/fastlane/metadata/android/pt-BR/changelogs/790.txt b/fastlane/metadata/android/pt-BR/changelogs/790.txt index f1b3a2dd98c..ec77b2acb0d 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/790.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/790.txt @@ -1,14 +1,14 @@ -Melhorado -- Adicionar mais títulos para melhorar a acessibilidade para os cegos #2655 -- Tornar a linguagem da pasta de download mais consistente e menos ambígua #2637 +Improved +• Add more titles to improve accessibility for blind people #2655 +• Make language of download folder setting more consistent and less ambiguous #2637 -Fixa -- Verificar se o último byte no bloco é descarregado #2646 -- Rolagem fixa em fragmento de detalhe de vídeo #2672 -- Remover a dupla pesquisa de animações de caixa transparente para uma #2695 -- Fixar extracção client_id #2745 +Fixed +• Check if last byte in the block is downloaded #2646 +• Fixed scrolling in video detail fragment #2672 +• Remove double search clear box animations to one #2695 +• [SoundCloud] Fix client_id extraction #2745 -Desenvolvimento -- Adicionar dependências em falta herdadas de NewPipeExtractor em NewPipe #2535 -- Migrar para AndroidX #2685 -- Actualização para ExoPlayer 2.10.6 #2697, #2736 +Development +• Add missing dependencies inherited from NewPipeExtractor into NewPipe #2535 +• Migrate to AndroidX #2685 +• Update to ExoPlayer 2.10.6 #2697, #2736 diff --git a/fastlane/metadata/android/pt-BR/changelogs/800.txt b/fastlane/metadata/android/pt-BR/changelogs/800.txt index 1b6ec1a4c7c..332b5c9946d 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/800.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/800.txt @@ -1,27 +1,27 @@ -Novo -- Suporte PeerTube sem P2P (#2201) [Beta]: - ◦ Ver e descarregar vídeos de instâncias do PeerTube - ◦ Adicionar instâncias nas definições para aceder ao mundo completo do PeerTube - ◦ Pode haver problemas com apertos de mão SSL no Android 4.4 e 7.1 quando o acesso a certos casos resulta num erro de rede. +New +• PeerTube support without P2P (#2201) [Beta]: + ◦ Watch and download videos from PeerTube instances + ◦ Add instances in the settings to access the complete PeerTube world + ◦ There might be problems with SSL handshakes on Android 4.4 and 7.1 when accessing certain instances resulting in a network error. -- Downloader (#2679): - ◦ Calcular ETA de descarregamento - ◦ Descarregar opus (ficheiros webm) como ogg - ◦ Recuperar ligações expiradas para retomar os downloads após uma longa pausa +• Downloader (#2679): + ◦ Calculate download ETA + ◦ Download opus (webm files) as ogg + ◦ Recover expired download links to resume downloads after a long pause -Melhorado -- Tornar o KioskFragment consciente das mudanças no país de conteúdo preferido e melhorar o desempenho de todos os separadores principais #2742 -- Utilizar novas implementações de Localização e Downloader do extractor #2713 -- Tornar o fio "Quiosque por defeito" traduzível -- Barra de navegação preta para o tema preto #2569 +Improved +• Make the KioskFragment aware of changes in the preferred content country and improve performance of all main tabs #2742 +• Use new Localization and Downloader implementations from extractor #2713 +• Make "Default kiosk" string translatable +• Black navigation bar for black theme #2569 -Fixa -- Corrigido um bug que não podia mover o leitor de popup se outro dedo fosse colocado enquanto se movia o leitor de popup #2772 -- Permitir listas de reprodução sem um carregador e corrigir falhas relacionadas com este problema #2724, TeamNewPipe/NewPipeExtractor#219 -- Habilitação de TLS1.1/1.2 em dispositivos Android 4.4 (API 19/KitKat) para corrigir o aperto de mão de TLS com MediaCCC e algumas instâncias PeerTube #2792 -- [SoundCloud] Equipa fixa de extracção client_idNewPipe/NewPipeExtractor#217 -- Fixar a extracção do fluxo de áudio +Fixed +• Fixed a bug that could not move the popup player if another finger was placed while moving the popup player #2772 +• Allow playlists missing an uploader and fix crashes related to this problem #2724, TeamNewPipe/NewPipeExtractor#219 +• Enabling TLS1.1/1.2 on Android 4.4 devices (API 19/KitKat) to fix TLS handshake with MediaCCC and some PeerTube instances #2792 +• [SoundCloud] Fixed client_id extraction TeamNewPipe/NewPipeExtractor#217 +• [SoundCloud] Fix audio stream extraction -Desenvolvimento -- Atualizar ExoPlayer para 2.10.8 #2791, #2816 -- Atualizar o Gradle para 3.5.1 e adicionar o suporte Kotlin #2714 +Development +• Update ExoPlayer to 2.10.8 #2791, #2816 +• Update Gradle to 3.5.1 and add Kotlin support #2714 diff --git a/fastlane/metadata/android/pt-BR/changelogs/810.txt b/fastlane/metadata/android/pt-BR/changelogs/810.txt index 3cb60e434ae..c75855fd18a 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/810.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/810.txt @@ -1,19 +1,19 @@ -Novo -- Mostrar a miniatura do vídeo no ecrã de bloqueio ao tocar em fundo +New +• Show video thumbnail on the lock screen when playing in the background -Melhorado -- Adicionar lista de reprodução local à fila de espera ao premir durante muito tempo no botão de fundo / popup -- Faça com que os separadores da página principal possam ser deslocados e escondidos quando só existe um único separador -- Quantidade limite de actualizações de miniaturas de notificação no leitor de fundo -- Adicionar miniatura de miniatura para listas de reprodução locais vazias -- Use a extensão de ficheiro *.opus em vez de *.webm e mostre "opus" na etiqueta de formato em vez de "WebM Opus" no menu pendente de download -- Adicionar botão para apagar ficheiros descarregados ou histórico de descarregamentos em "Downloads -- [YouTube] Adicionar suporte a /c/shortened_url channel links +Improved +• Add local playlist to queue when long pressing on background / popup button +• Make main page tabs scrollable and hide when there is only a single tab +• Limit amount of notification thumbnail updates in background player +• Add dummy thumbnail for empty local playlists +• Use *.opus file extension instead of *.webm and show "opus" in format label instead of "WebM Opus" in the download dropdown +• Add button to delete downloaded files or download history in "Downloads" +• [YouTube] Add support to /c/shortened_url channel links -Fixa -- Corrigido múltiplos problemas ao partilhar um vídeo para NewPipe e descarregar diretamente os seus fluxos -- Acesso fixo do jogador fora do seu fio de criação -- Paginação fixa de resultados de pesquisa -- Ligar nulo fixo causando NPE -- [YouTube] Comentários de visualização fixos ao abrir uma url invidio.us -- ClientCloud] Client_id actualizado +Fixed +• Fixed multiple issues when sharing a video to NewPipe and downloading its streams directly +• Fixed player access out of its creation thread +• Fixed search result paging +• [YouTube] Fixed switching on null causing NPE +• [YouTube] Fixed viewing comments when opening an invidio.us url +• [SoundCloud] Updated client_id diff --git a/fastlane/metadata/android/pt-BR/changelogs/840.txt b/fastlane/metadata/android/pt-BR/changelogs/840.txt index 4ee1d8ab395..95dc80844c8 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/840.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/840.txt @@ -1,22 +1,22 @@ -Novo -- Adicionado o seletor de língua para alterar a língua da aplicação -- Adicionado enviar para o botão Kodi ao menu desmontável do leitor -- Capacidade adicional de copiar comentários sobre imprensa longa +New +• Added language selector to change the app language +• Added send to Kodi button to player collapsible menu +• Added ability to copy comments on long press -Melhorado -- Fixar a actividade ReCaptcha e guardar corretamente os cookies obtidos -- Removido o ponto-menu a favor da gaveta e botão esconder histórico quando o histórico do relógio não está ativado nas definições -- Pedir permissão de visualização sobre outras aplicações em definições corretamente no Android 6 e posteriores -- Renomear playlist local através de um clique longo em BookmarkFragment -- Vários melhoramentos do PeerTube -- Melhorou várias cadeias de caracteres em inglês +Improved +• Fix ReCaptcha activity and correctly save obtained cookies +• Removed dot-menu in favour of drawer and hide history button when watch history is not enabled in settings +• Ask for display over other apps permission in settings correctly on Android 6 and later +• Rename local playlist by long-clicking in BookmarkFragment +• Various PeerTube improvements +• Improved several English source strings -Fixa -- Jogador fixo a recomeçar, embora seja pausado quando a opção "minimizar no comutador da aplicação" é ativada e o NewPipe é minimizado -- Fixar o valor de brilho inicial para o gesto -- Downloads de subtítulos .srt fixos contendo nem todas as quebras de linha -- Corrigido o download para cartão SD falhando porque alguns dispositivos Android 5 não são compatíveis com CTF -- Descarregamento fixo no Android KitKat -- Ficheiro fixo de vídeo corrupto .mp4 sendo reconhecido como ficheiro de áudio -- Resolvidos problemas de localização múltipla, incluindo códigos de língua chinesa errados -- Os carimbos temporais em descrição podem ser clicados novamente +Fixed +• Fixed player starting again although it is paused when option "minimize on app switch" enabled and NewPipe is minimized +• Fix initial brightness value for gesture +• Fixed .srt subtitle downloads containing not all line breaks +• Fixed download to SD card failing because some Android 5 devices are not CTF compliant +• Fixed downloading on Android KitKat +• Fixed corrupt video .mp4 file being recognized as audio file +• Fixed multiple localization problems, including wrong Chinese language codes +• [YouTube] Timestamps in description are clickable again diff --git a/fastlane/metadata/android/pt-BR/changelogs/850.txt b/fastlane/metadata/android/pt-BR/changelogs/850.txt index d5e7f5dbafb..b3219d7ccd9 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/850.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/850.txt @@ -1 +1 @@ -Neste lançamento, a versão do site do YouTube FOI foi atualizada. A versão Antiga do site será interrompida EM março, portanto, é obrigado a atualizar o NewPipe. +Nesta atualização, a versão do site do YouTube foi atualizada. A versão antiga do site será descontinuada em março e, portanto, você deverá atualizar o NewPipe. diff --git a/fastlane/metadata/android/pt-BR/changelogs/930.txt b/fastlane/metadata/android/pt-BR/changelogs/930.txt index 1ded9e8870f..b23b01ea8ce 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/930.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/930.txt @@ -1,19 +1,19 @@ -Novo -- Pesquisa no YouTube Música -- Suporte básico de TV Android +New +• Search on YouTube Music +• Basic Android TV support -Melhorado -- Adicionada a capacidade de remover todos os vídeos vistos de uma lista de reprodução local -- Mostrar mensagem quando o conteúdo ainda não é suportado, em vez de se chocar -- Reprodutor popup melhorado redimensionado com gestos de beliscão -- Enqueue streams em fundo e botões de popup no canal -- Melhor manuseamento do tamanho do título do cabeçalho da gaveta +Improved +• Added the ability to remove all watched videos from a local playlist +• Show message when content isn't supported yet instead of crashing +• Improved popup player resize with pinch gestures +• Enqueue streams on long press on background and popup buttons in channel +• Improved size handling of the drawer header title -Fixa -- Definição de conteúdo com restrição de idade fixa não funciona -- Fixação de certos tipos de reCAPTCHAs -- Corrigido o crash ao abrir marcadores enquanto a lista de reprodução é "nula". -- Deteção fixa de exceções relacionadas com a rede -- Visibilidade fixa do botão de ordenação do grupo no fragmento de subscrições +Fixed +• Fixed age restricted content setting not working +• Fixed certain kinds of reCAPTCHAs +• Fixed crash when opening bookmarks while playlist is `null` +• Fixed detection of network related exceptions +• Fixed visibility of group sort button in the subscriptions fragment -e mais +and more diff --git a/fastlane/metadata/android/pt-BR/changelogs/954.txt b/fastlane/metadata/android/pt-BR/changelogs/954.txt index cd131c16256..0ba384b5764 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/954.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/954.txt @@ -1,7 +1,7 @@ -• Novo recurso: veja vídeos na página de detalhes, deslize para baixo para minimizar o vídeo -• Notificações MediaStyle: ações personalizáveis em notificações, melhorias de desempenho -• redimensionamento básico ao usar NewPipe como aplicativo de computador -• diálogo com opções abertas se URL não for suportado -• Melhor experiência de sugestão de pesquisa quando não pode ser buscada +• Novidade: toque mídia na página de detalhes e deslize para baixo para minimizar o reprodutor. +• Notificações de mídia: ações personalizáveis nas e melhorias de desempenho +• Redimensionar ao usar o NewPipe como aplicativo de computador +• Diálogo com opções extras se a URL não for suportada +• Melhor experiência de sugestão de pesquisa quando ocorrer erro de interpretação do servidor • Maior qualidade do vídeo padrão para 720p60 no reprodutor interno e 480p no Pop-up -• correções de falhas e mais (?) +• Correções de falhas etc diff --git a/fastlane/metadata/android/pt-BR/changelogs/964.txt b/fastlane/metadata/android/pt-BR/changelogs/964.txt index f2742607441..1238eb87691 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/964.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/964.txt @@ -1,8 +1,8 @@ -• Suporte para capítulos adicionado nos controles do player -• [PeerTube] Busca Sépia adicionada -• Botão de compartilhamento adicionado novamente na visualização de detalhes do vídeo e descrição da transmissão movida para o layout de abas -• Desativação da restauração do brilho se o gesto de brilho estiver desativado -• Item de lista adicionado para reproduzir vídeo no Kodi -• Travamento corrigido quando nenhum navegador padrão está definido em alguns dispositivos e diálogos de compartilhamento aprimorados -• Alternar reprodução/pausa com o botão de espaço físico no player em tela cheia -• [media.ccc.de] Diversas correções e melhorias +• Added support for chapters in player controls +• [PeerTube] Added Sepia search +• Re-added share button in video detail view and moved stream description into the tab layout +• Disable restoring brightness if brightness gesture is disabled +• Added list item to play video on kodi +• Fixed crash when no default browser is set on some devices and improve share dialogs +• Toggle play/pause with hardware space button in fullscreen player +• [media.ccc.de] Various fixes and improvements diff --git a/fastlane/metadata/android/pt-BR/changelogs/966.txt b/fastlane/metadata/android/pt-BR/changelogs/966.txt index 13722dc3463..b7fdc182fa4 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/966.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/966.txt @@ -1,14 +1,14 @@ -Novo: -- Acrescentado um novo serviço: Bandcamp +New: +• Add a new service: Bandcamp -Melhorado: -- Adicionada uma opção para que a aplicação siga o tema do dispositivo -- Previne alguns travamentos mostrando um painel de erros melhorado -- Mostra mais informações sobre as causas da indisponibilidade do conteúdo -- A tecla de espaço de hardware ativa play/pausa -- Mostra "Download iniciado" +Improved: +• Add an option to have the app follow the device theme +• Prevent some crashes by showing an improved error panel +• Show more information on why content in unavailable +• Hardware space button triggers play/pause +• Show "Download started" toast -Resolvido: -- Miniaturas muito pequenas em detalhes de vídeo enquanto se reproduz em fundo -- Corrige título vazio em tocador minimizado -- O último modo de redimensionamento do tamanho não estava sendo restaurado corretamente +Fixed: +• Fix very small thumbnail in video details while playing in the background +• Fix empty title in minimized player +• Fix last resize mode not being restored correctly diff --git a/fastlane/metadata/android/pt-BR/changelogs/968.txt b/fastlane/metadata/android/pt-BR/changelogs/968.txt new file mode 100644 index 00000000000..0e2026fad0a --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/968.txt @@ -0,0 +1,9 @@ +# Melhorias +* Detalhes do canal adicionados ao menu de toque longo. +* Agora é possível renomear playlists diretamente pela interface. +* Permite pausar o vídeo mesmo durante o carregamento (buffering). +* Refinamentos e polimento no tema claro. +# Correções +* Correção de fontes sobrepostas ao usar tamanhos de letra maiores. +* Correção da ausência de vídeo nos aparelhos Formuler e Zephier. +* Correção de diversos erros de fechamento (crashes). diff --git a/fastlane/metadata/android/pt-BR/changelogs/969.txt b/fastlane/metadata/android/pt-BR/changelogs/969.txt new file mode 100644 index 00000000000..ab881f8d30d --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/969.txt @@ -0,0 +1,10 @@ +# Melhorias +Instalação em armazenamento externo (SD). +[Bandcamp] Exibe os 3 primeiros comentários. +Aviso de download aparece apenas ao iniciar. +Sem cookies reCaptcha desnecessários. +[Player] Melhor cache e fluidez. +Correções +[Player] Início automático corrigido. +Fecha avisos antigos ao excluir downloads. +Erro ao excluir item inexistente corrigido. diff --git a/fastlane/metadata/android/pt-BR/changelogs/971.txt b/fastlane/metadata/android/pt-BR/changelogs/971.txt new file mode 100644 index 00000000000..6683d26ec18 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/971.txt @@ -0,0 +1,3 @@ +Correção rápida +• Aumentado o buffer para reprodução após rebuffer +• Corrigido travamento em tablets e TVs ao clicar no ícone da fila de reprodução no player diff --git a/fastlane/metadata/android/pt-BR/changelogs/973.txt b/fastlane/metadata/android/pt-BR/changelogs/973.txt new file mode 100644 index 00000000000..7c052c5e0fe --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/973.txt @@ -0,0 +1,4 @@ +Correção rápida +• Corrigidos miniaturas e títulos sendo cortados no layout em grade, devido a um cálculo errado de quantos vídeos cabem em uma linha +• Corrigido diálogo de download desaparecendo sem fazer nada se aberto pelo menu de compartilhamento +• Atualizada uma biblioteca relacionada à abertura de atividades externas, como o seletor de arquivos do Storage Access Framework diff --git a/fastlane/metadata/android/pt-BR/changelogs/974.txt b/fastlane/metadata/android/pt-BR/changelogs/974.txt new file mode 100644 index 00000000000..a5c24f0cc2a --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/974.txt @@ -0,0 +1,5 @@ +Correção rápida +• Corrigidos problemas de buffer causados pelo throttling do YouTube +• Corrigida extração de comentários do YouTube e travamentos com comentários desativados +• Corrigida a busca de músicas no YouTube +• Corrigidas transmissões ao vivo no PeerTube diff --git a/fastlane/metadata/android/pt-BR/changelogs/976.txt b/fastlane/metadata/android/pt-BR/changelogs/976.txt new file mode 100644 index 00000000000..8560f3f1a40 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/976.txt @@ -0,0 +1,9 @@ +• Foi adicionada a opção de abrir o reprodutor em tela cheia sem clicar novamente. +• Você pode escolher quais sugestões de pesquisa exibir. +• Tema escuro e tela de abertura com preto AMOLED. +• Arquivos incompatíveis aparecem como cinza. +• Importação de inscrições do YouTube corrigida. +• O botão de repetir o vídeo exige apenas um toque. +• Sessão de áudio fecha corretamente. +• [Android TV] Saltos na barra de pesquisa pelo controle remoto corrigidos. +Confira as alterações na aba de links abaixo. diff --git a/fastlane/metadata/android/pt-BR/changelogs/995.txt b/fastlane/metadata/android/pt-BR/changelogs/995.txt index 943b842b0b5..45f55c2fff9 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/995.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/995.txt @@ -1,14 +1,16 @@ -Novidades -• Suporta abas de canal -• Seleção da qualidade da imagem -• Obtém os URL para todas as imagens +New +• Support channel tabs +• Select image quality +• Get URLs to all images -Melhorias -• Acessibilidade das interfaces do reprodutor -• Pode adicionar nome da lista de reprodução e de vídeo para compartilhamento do conteúdo -• Melhorias internas (?) e atualizações de dependências +Improved +• Accessibility of player interfaces +• Better audio selection for video-only downloads +• Option to include playlist and video names to shared playlist content -Corrigido -• Seleção de idiomas errados ao selecionar -• O foco do áudio do reprodutor não respeitava o mudo -• Adicionar itens para listas de reprodução não funcionava em casos específicos +Fixed +• [YouTube] Fix getting like count +• Fix player not responding popups and crashes +• Selection of wrong languages in language picker +• Player audio focus was not respecting mute +• Playlist item addition occasionally not working diff --git a/fastlane/metadata/android/pt-BR/changelogs/998.txt b/fastlane/metadata/android/pt-BR/changelogs/998.txt index 59fc6a5cdb0..65e30eb4501 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/998.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/998.txt @@ -1 +1,4 @@ -Corrigido YouTube não reproduzir qualquer transmissão +Corrigido o YouTube por não reproduzir nenhum vídeo devido a erros HTTP 403. + +Erros HTTP 403 ocasionais no meio de um vídeo do YouTube ainda não foram corrigidos. +Esse problema será resolvido em outra versão de hotfix assim que possível. diff --git a/fastlane/metadata/android/pt-BR/changelogs/999.txt b/fastlane/metadata/android/pt-BR/changelogs/999.txt index 59fc6a5cdb0..b2dac8187ac 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/999.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/999.txt @@ -1 +1,12 @@ -Corrigido YouTube não reproduzir qualquer transmissão +Esta versão de correção corrige erros HTTP 403 no meio dos vídeos do YouTube. + +Novo +• [SoundCloud] Adicionado suporte para URLs on.soundcloud.com + +Melhorado +• [Bandcamp] Exibição de informações adicionais no quiosque de rádio + +Corrigido +• [YouTube] Correção de erros HTTP 403 ocasionais no início ou no meio dos vídeos +• [YouTube] Extração de avatar e banner de mais tipos de cabeçalhos de canal +• [Bandcamp] Correção de vários bugs e uso exclusivo de HTTPS diff --git a/fastlane/metadata/android/sk/changelogs/1008.txt b/fastlane/metadata/android/sk/changelogs/1008.txt new file mode 100644 index 00000000000..fd5ebc93cc3 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/1008.txt @@ -0,0 +1,4 @@ +Opravené obnovenie streamov na poslednej pozícii prehrávania. +∙ [YouTube] Pridaná podpora pre viac formátov URL kanálov. +∙ [YouTube] Pridaná podpora pre viac formátov metainformácií videí. +∙ Aktualizované preklady diff --git a/fastlane/metadata/android/sk/changelogs/1009.txt b/fastlane/metadata/android/sk/changelogs/1009.txt new file mode 100644 index 00000000000..de262999430 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/1009.txt @@ -0,0 +1,14 @@ +Dôležité +Pridané informácie a výzva k akcii v rámci kampane Keep Android Open: https://www.keepandroidopen.org/ + +Vylepšené +[Feed] Prehodenie poradia, v ktorom sa aktualizujú neaktuálne odbery +Nehromadenie stránok s komentármi +Pri kliknutí na stránku s podrobnosťami o videu sa neprenášajú udalosti kliknutia do podkladových zobrazení + +Opravené +Rozloženie záhlavia odpovedí na komentáre bez avataru +Viacero opráv používateľského rozhrania súvisiacich s prehrávačom +[SoundCloud] Oprava streamov s dlhými ID + +a ďalšie opravy a vylepšenia! diff --git a/fastlane/metadata/android/sq/changelogs/1000.txt b/fastlane/metadata/android/sq/changelogs/1000.txt new file mode 100644 index 00000000000..1aaab653947 --- /dev/null +++ b/fastlane/metadata/android/sq/changelogs/1000.txt @@ -0,0 +1,12 @@ +Përmirësuar +• Bëni përshkrimin e listës së luajtjes të klikueshme për të treguar më shumë / më pak përmbajtje +• [PeerTube] Trajtoni lidhjet e shembujve`subscribeto.me` automatikisht +• Filloni vetëm të luani një artikull të vetëm në ekranin e historisë +Rregulluar +• U rregulla dukshmëria e butonit RS +• U rregulluan përplasjet e shikimit të shiritit +• U rregullua lista e luajtjes së një artikulli më pak tablotë +• U rregullua dalja nga dialogu i shkarkimit para se të shfaqet +• U rregulla shfaqja e radhës së listës së artikujve të lidhur +•U rregullua rendi në shtimin e dialogut të listës së luajtjes +• U rregullua paraqitja e artikullit të faqerojtësve të listës së luajtjes diff --git a/fastlane/metadata/android/sq/full_description.txt b/fastlane/metadata/android/sq/full_description.txt new file mode 100644 index 00000000000..04a94e97d47 --- /dev/null +++ b/fastlane/metadata/android/sq/full_description.txt @@ -0,0 +1 @@ +NewPipe nuk përdor ndonjë bibliotekë kornizash të Google, ose API të YouTube. Ajo vetëm analizon faqen e internetit në mënyrë që të fitojë informacionin që i nevojitet. Prandaj, ky aplikacion mund të përdoret në pajisje pa instaluar Shërbimet e google. Gjithashtu, nuk keni nevojë për një llogari në YouTube për të përdorur NewPipe, dhe është FLOSS diff --git a/fastlane/metadata/android/sv/changelogs/1008.txt b/fastlane/metadata/android/sv/changelogs/1008.txt new file mode 100644 index 00000000000..2008602f5c7 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/1008.txt @@ -0,0 +1,4 @@ +∙ Åtgärdade återupptagning av strömmar vid senaste uppspelningsposition +∙ [YouTube] Lade till stöd för fler kanal-URL-format +∙ [YouTube] Lade till stöd för fler videometainfo-format +∙ Uppdaterade översättningar diff --git a/fastlane/metadata/android/ta/changelogs/1000.txt b/fastlane/metadata/android/ta/changelogs/1000.txt index 43842685fa5..5377ef633d2 100644 --- a/fastlane/metadata/android/ta/changelogs/1000.txt +++ b/fastlane/metadata/android/ta/changelogs/1000.txt @@ -1,13 +1,13 @@ -மேம்படுத்தப்பட்டது - / மேலும் / குறைவான உள்ளடக்கத்தைக் காட்ட பிளேலிச்ட் விளக்கத்தைச் சொடுக்கு செய்யவும் - • [PEERTUBE] `charbisto.me` உதாரணமாக இணைப்புகளைத் தானாகவே கையாளவும் - The வரலாற்றுத் திரையில் ஒற்றை உருப்படியை மட்டுமே இயக்கத் தொடங்குங்கள் +மேம்படுத்தப்பட்டது +• அதிகமான / குறைவான உள்ளடக்கத்தைக் காட்ட, பிளேலிச்ட் விளக்கத்தை சொடுக்கு செய்யக்கூடியதாக மாற்றவும் +• [PeerTube] தானாகவே `subscribeto.me` நிகழ்வு இணைப்புகளைக் கையாளவும் +• வரலாற்றுத் திரையில் ஒற்றை உருப்படியை மட்டும் இயக்கத் தொடங்குங்கள் - சரி - RS RSS பொத்தான் தெரிவுநிலையை சரிசெய்யவும் - See gaekbar முன்னோட்ட செயலிழப்புகளை சரிசெய்யவும் - Play ஒரு சிறுபடம் இல்லாத உருப்படியைப் பிளேலிச்டிங் சரிசெய்யவும் - The பதிவிறக்க உரையாடல் தோன்றுவதற்கு முன்பு வெளியேறுவதை சரிசெய்யவும் - Tied தொடர்புடைய உருப்படிகளைச் சரிசெய்யவும் பட்டியல் enqueue பாப்அப் - Plale பிளேலிச்ட் உரையாடலில் கூட்டு இல் ஆர்டரை சரிசெய்யவும் - Plale பிளேலிச்ட் புத்தகக்குறி உருப்படி தளவமைப்பை சரிசெய்யவும் +சரி செய்யப்பட்டது +• RSS பொத்தான் தெரிவுநிலையை சரிசெய்யவும் +• சீக்பார் முன்னோட்ட செயலிழப்புகளை சரிசெய்யவும் +• சிறுபடம் இல்லாத உருப்படியை பிளேலிச்ட் செய்வதை சரிசெய்யவும் +• பதிவிறக்க உரையாடல் தோன்றும் முன் அதிலிருந்து வெளியேறுவதைச் சரிசெய்யவும் +• தொடர்புடைய உருப்படிகளின் பட்டியல் என்கியூ பாப்அப்பை சரிசெய்யவும் +• பிளேலிச்ட் உரையாடலில் சேர்க்கும் வரிசையை சரிசெய்யவும் +• பிளேலிச்ட் புத்தகக்குறி உருப்படி தளவமைப்பைச் சரிசெய்யவும் diff --git a/fastlane/metadata/android/ta/changelogs/1005.txt b/fastlane/metadata/android/ta/changelogs/1005.txt new file mode 100644 index 00000000000..2d3b17a1938 --- /dev/null +++ b/fastlane/metadata/android/ta/changelogs/1005.txt @@ -0,0 +1,17 @@ +புதியது +• ஆண்ட்ராய்டு Autoக்கான ஆதரவைச் சேர்க்கவும் +• ஊட்ட குழுக்களை முதன்மையான திரை தாவல்களாக அமைக்க அனுமதிக்கவும் +• [YouTube] தற்காலிக பிளேலிச்ட்டாகப் பகிரவும் +• [SoundCloud] சேனல் தாவலை விரும்புகிறது + +மேம்படுத்தப்பட்டது +• சிறந்த தேடல் பட்டி குறிப்புகள் +• பதிவிறக்கங்களில் பதிவிறக்க தேதியைக் காட்டு +• ஒவ்வொரு ஆப்ச் மொழிக்கும் ஆண்ட்ராய்டு 13ஐப் பயன்படுத்தவும் + +சரி செய்யப்பட்டது +• உடைந்த உரை வண்ணங்களை இருண்ட பயன்முறையில் சரிசெய்யவும் +• [YouTube] 100 உருப்படிகளுக்கு மேல் ஏற்றப்படாமல் இருக்கும் பிளேலிச்ட்களை சரிசெய்யவும் +• [YouTube] விடுபட்ட பரிந்துரைக்கப்பட்ட வீடியோக்களை சரிசெய்யவும் +• வரலாறு பட்டியல் காட்சியில் சிதைவுகளைச் சரிசெய்யவும் +• கருத்து பதில்களில் நேர முத்திரைகளை சரிசெய்யவும் diff --git a/fastlane/metadata/android/ta/changelogs/1006.txt b/fastlane/metadata/android/ta/changelogs/1006.txt new file mode 100644 index 00000000000..98d1b4756d6 --- /dev/null +++ b/fastlane/metadata/android/ta/changelogs/1006.txt @@ -0,0 +1,16 @@ +# மேம்படுத்தப்பட்டது +நேர முத்திரைகளைக் சொடுக்கு செய்யும் போது தற்போதைய பிளேயரை வைத்திருங்கள் +முடிந்தால், நிலுவையிலுள்ள பதிவிறக்கப் பணிகளை மீட்டெடுக்க முயற்சிக்கவும் +கோப்பை நீக்காமல் பதிவிறக்கத்தை நீக்க விருப்பத்தைச் சேர்க்கவும் +மேலடுக்கு அனுமதி: Android > R க்கான விளக்க உரையாடலைக் காண்பி +உதவி on.soundcloud இணைப்பு திறப்பு +நிறைய சிறிய மேம்பாடுகள் மற்றும் மேம்படுத்தல்கள் + +# சரி செய்யப்பட்டது +7க்குக் கீழே உள்ள ஆண்ட்ராய்டு பதிப்புகளுக்கான குறுகிய எண்ணிக்கை வடிவமைப்பைச் சரிசெய்யவும் +பேய் அறிவிப்புகளை சரிசெய்யவும் +SRT வசனக் கோப்புகளுக்கான திருத்தங்கள் +நிலையான டன் விபத்துக்கள் + +#வளர்ச்சி +உள் குறியீடு நவீனமயமாக்கல் diff --git a/fastlane/metadata/android/ta/changelogs/1008.txt b/fastlane/metadata/android/ta/changelogs/1008.txt new file mode 100644 index 00000000000..e25981458f8 --- /dev/null +++ b/fastlane/metadata/android/ta/changelogs/1008.txt @@ -0,0 +1,4 @@ +∙ கடைசி பிளேபேக் நிலையில் நிலையான ரெச்யூமிங் ச்ட்ரீம்கள் +∙ [YouTube] மேலும் சேனல் முகவரி வடிவங்களுக்கான உதவி சேர்க்கப்பட்டது +∙ [YouTube] மேலும் வீடியோ metainfo வடிவங்களுக்கான உதவி சேர்க்கப்பட்டது +∙ புதுப்பிக்கப்பட்ட மொழிபெயர்ப்புகள் diff --git a/fastlane/metadata/android/ta/changelogs/1009.txt b/fastlane/metadata/android/ta/changelogs/1009.txt new file mode 100644 index 00000000000..da35a071b5f --- /dev/null +++ b/fastlane/metadata/android/ta/changelogs/1009.txt @@ -0,0 +1,14 @@ +முக்கியமானது +Keep ஆண்ட்ராய்டு திற பிரச்சாரத்திற்கான செய்தி மற்றும் நடவடிக்கைக்கான அழைப்பு சேர்க்கப்பட்டது: https://www.keepandroidopen.org/ + +மேம்படுத்தப்பட்டது +[Feed] ஆர்டர் காலாவதியான சந்தாக்கள் புதுப்பிக்கப்பட்டதை மாற்றவும் +கருத்துப் பக்கங்களை அடுக்க வேண்டாம் +வீடியோ விவரம் பக்கத்தில் சொடுக்கு செய்யும் போது, சொடுக்கு நிகழ்வுகளை அடிப்படை பார்வைகளுக்கு அனுப்ப வேண்டாம் + +சரி செய்யப்பட்டது +அவதார் படம் இல்லாமல் தலைப்பு தளவமைப்பை கருத்து பதிலளிக்கிறது +பல பிளேயர் தொடர்பான இடைமுகம் திருத்தங்கள் +[SoundCloud] நீண்ட ஐடிகளுடன் ச்ட்ரீம்களை சரிசெய்யவும் + +மேலும் திருத்தங்கள் மற்றும் மேம்பாடுகள்! diff --git a/fastlane/metadata/android/ta/changelogs/65.txt b/fastlane/metadata/android/ta/changelogs/65.txt index 05fd375e6ed..ebea2e29d37 100644 --- a/fastlane/metadata/android/ta/changelogs/65.txt +++ b/fastlane/metadata/android/ta/changelogs/65.txt @@ -1,26 +1,26 @@ -### மேம்பாடுகள் +### மேம்பாடுகள் -- பர்கர்மெனு ஐகான் அனிமேஷன் முடக்கு #1486 -- பதிவிறக்கங்கள் நீக்க #1472 செயல்தவிர்க்கவும் -- பங்கு மெனுவில் விருப்பத்தைப் பதிவிறக்கவும் #1498 -- நீண்ட குழாய் மெனு # 1454 பங்கு விருப்பத்தை சேர்க்கப்பட்டது -- வெளியேறும் #1354 இல் முக்கிய வீரரைக் குறைக்கவும் -- நூலக பதிப்பு மேம்படுத்தல் மற்றும் தரவுத்தள காப்பு திருத்தம் #1510 -- ExoPlayer 2.8.2 மேம்படுத்தல் #1392 - - வேகமான வேக மாற்றத்திற்கான வெவ்வேறு படி அளவுகளை ஆதரிக்க பின்னணி வேகக் கட்டுப்பாட்டு உரையாடலை மறுவேலை செய்தது. - - பின்னணி வேக கட்டுப்பாடு மௌனங்கள் போது வேகமாக முன்னோக்கி ஒரு நிலைமாற்றி சேர்க்கப்பட்டது. இது ஆடியோபுக்குகள் மற்றும் சில இசை வகைகளுக்கு உதவியாக இருக்க வேண்டும், மேலும் உண்மையான தடையற்ற அனுபவத்தைக் கொண்டுவர முடியும் (மேலும் நிறைய மௌனங்களுடன் ஒரு பாடலை உடைக்க முடியும் =). - - மெட்டாடேட்டாவை கைமுறையாக செய்வதை விட, பிளேயரில் உள்நாட்டில் மீடியாவுடன் மெட்டாடேட்டாவை அனுப்ப அனுமதிக்க மறுசீரமைக்கப்பட்ட ஊடக மூல தீர்மானம். இப்போது எங்களிடம் மெட்டாடேட்டாவின் ஒற்றை ஆதாரம் உள்ளது மற்றும் பிளேபேக் தொடங்கும் போது நேரடியாக கிடைக்கும். - - நிலையான தொலை பிளேலிஸ்ட் மெட்டாடேட்டா பிளேலிஸ்ட் துண்டு திறக்கப்படும் போது புதிய மெட்டாடேட்டா கிடைக்கும் போது புதுப்பிக்கப்படவில்லை. - - பல்வேறு UI திருத்தங்கள்: #1383, பின்னணி பிளேயர் அறிவிப்பு கட்டுப்பாடுகள் இப்போது எப்போதும் வெள்ளை, எளிதாக ஃப்ளிங்கிங் மூலம் பாப்அப் பிளேயர் மூட எளிதாக -- மல்டிசர்வீஸிற்கான மறுசீரமைக்கப்பட்ட கட்டமைப்புடன் புதிய பிரித்தெடுத்தலைப் பயன்படுத்தவும் +- பர்கர்மெனு படவுரு அனிமேசனை முடக்கு #1486 +- பதிவிறக்கங்களின் நீக்குதலை செயல்தவிர்க்கவும் #1472 +- சேர் பட்டியல் #1498 இல் பதிவிறக்க விருப்பம் +- நீண்ட தட்டு பட்டியல் #1454 இல் பகிர்வு விருப்பம் சேர்க்கப்பட்டது +- வெளியேறும் #1354 இல் முதன்மையான வீரரைக் குறைக்கவும் +- நூலக பதிப்பு புதுப்பித்தல் மற்றும் தரவுத்தள காப்புப்பிரதி திருத்தம் #1510 +- ExoPlayer 2.8.2 மேம்படுத்தல் #1392 +- வேகமான வேக மாற்றத்திற்காக வெவ்வேறு படி அளவுகளை ஆதரிக்க, பிளேபேக் வேகக் கட்டுப்பாட்டு உரையாடலை மீண்டும் உருவாக்கியது. +- பிளேபேக் வேகக் கட்டுப்பாட்டில் நிசப்தத்தின் போது வேகமாக முன்னோக்கிச் செல்வதற்கான நிலைமாற்றம் சேர்க்கப்பட்டது. இது ஆடியோபுக்குகள் மற்றும் சில இசை வகைகளுக்கு உதவியாக இருக்க வேண்டும், மேலும் ஒரு உண்மையான தடையற்ற அனுபவத்தைக் கொண்டு வர முடியும் (மேலும் நிறைய அமைதியுடன் ஒரு பாடலை உடைக்க முடியும் =\\). +- மீடியா மூலத் தெளிவுத்திறன் மறுவடிவமைக்கப்பட்ட மீடியாவை கைமுறையாகச் செய்வதை விட, பிளேயரில் உள்ள மீடியாவுடன் சேர்த்து அனுப்ப அனுமதிக்கிறது. இப்போது எங்களிடம் மெட்டாடேட்டாவின் ஒற்றை சான்று உள்ளது மற்றும் பிளேபேக் தொடங்கும் போது நேரடியாகக் கிடைக்கும். +- பிளேலிச்ட் துண்டு திறக்கப்படும்போது புதிய மேனிலை தரவு கிடைக்கும்போது நிலையான ரிமோட் பிளேலிச்ட் மேனிலை தரவு புதுப்பிக்கப்படாது. +- பல்வேறு இடைமுகம் திருத்தங்கள்: #1383, பின்னணி பிளேயர் அறிவிப்புக் கட்டுப்பாடுகள் இப்போது எப்போதும் வெண்மையாக இருக்கும், மேல்தோன்றல் பிளேயரை ஃபிலிங் செய்வதன் மூலம் மூடுவது எளிது +- பல சேவைகளுக்கு மறுசீரமைக்கப்பட்ட கட்டமைப்புடன் புதிய பிரித்தெடுக்கும் கருவியைப் பயன்படுத்தவும் -### திருத்தங்கள் +### திருத்தங்கள் -- #1440 உடைந்த வீடியோ தகவல் தளவமைப்பு #1491 சரி -- வரலாறு திருத்தம் #1497 பார்க்க - - #1495, பயனர் பிளேலிஸ்ட்டை அணுகியவுடன் மெட்டாடேட்டாவை (சிறுபடம், தலைப்பு மற்றும் வீடியோ எண்ணிக்கை) புதுப்பிப்பதன் மூலம். - - #1475, பயனர் விவரம் துண்டு வெளிப்புற பிளேயர் ஒரு வீடியோ தொடங்கும் போது தரவுத்தளத்தில் ஒரு பார்வை பதிவு மூலம். -- பாப்அப் பயன்முறையில் க்ரீன் டைம்அவுட்டை சரிசெய்யவும். #1463 (நிலையான #640) -- முக்கிய வீடியோ பிளேயர் திருத்தம் #1509 - - [#1412] பிளேயர் செயல்பாடு பின்னணியில் இருக்கும்போது புதிய நோக்கம் பெறும்போது பிளேயர் NPE ஐ ஏற்படுத்தும் நிலையான மீண்டும் பயன்முறை. - - பாப்அப் செய்ய நிலையான வீரர் குறைக்க பாப்அப் அனுமதி வழங்கப்படாதபோது வீரர் அழிக்க முடியாது. +- சரி #1440 உடைந்த வீடியோ செய்தி தளவமைப்பு #1491 +- சரித்திர சரித்திரத்தைக் காண்க #1497 +- #1495, பயனர் பிளேலிச்ட்டை அணுகியவுடன் மெட்டாடேட்டாவை (சிறுபடம், தலைப்பு மற்றும் வீடியோ எண்ணிக்கை) புதுப்பித்தல். +- #1475, விவரத் துண்டில் வெளிப்புற பிளேயரில் பயனர் வீடியோவைத் தொடங்கும் போது தரவுத்தளத்தில் பார்வையைப் பதிவு செய்வதன் மூலம். +- மேல்தோன்றல் பயன்முறையில் திரையின் காலக்கெடுவை சரிசெய்யவும். #1463 (நிலையான #640) +- முதன்மை வீடியோ பிளேயர் திருத்தம் #1509 +- [#1412] பிளேயர் செயல்பாடு பின்னணியில் இருக்கும்போது புதிய எண்ணம் பெறப்படும்போது பிளேயர் NPEயை ஏற்படுத்தும் நிலையான ரிப்பீட் பயன்முறை. +- மேல்தோன்றல் இசைவு வழங்கப்படாதபோது பிளேயரை பாப்அப்பிற்குக் குறைப்பது நிலையானது பிளேயரை அழிக்காது. diff --git a/fastlane/metadata/android/ta/changelogs/66.txt b/fastlane/metadata/android/ta/changelogs/66.txt index ba6cfae1cd8..b3076700d77 100644 --- a/fastlane/metadata/android/ta/changelogs/66.txt +++ b/fastlane/metadata/android/ta/changelogs/66.txt @@ -1,21 +1,33 @@ -# v0.13.7 இன் சேஞ்ச் +v0.13.7 இன் # சேஞ்ச்லாக் -### சரி செய்யப்பட்டது -- v0.13.6 வரிசை வடிகட்டி சிக்கல்களை சரிசெய்யவும் +### சரி செய்யப்பட்டது +- v0.13.6 இன் வரிசை வடிகட்டி சிக்கல்களை சரிசெய்யவும் -# v0.13.6 இன் சேஞ்ச் +# சேஞ்ச்லாக் இன் v0.13.6 -### மேம்பாடுகள் +### மேம்பாடுகள் -- பர்கர்மெனு ஐகான் அனிமேஷன் முடக்கு #1486 -- பதிவிறக்கங்கள் நீக்க #1472 செயல்தவிர்க்கவும் -- பங்கு மெனுவில் விருப்பத்தைப் பதிவிறக்கவும் #1498 -- நீண்ட குழாய் மெனு # 1454 பங்கு விருப்பத்தை சேர்க்கப்பட்டது -- வெளியேறும் #1354 இல் முக்கிய வீரரைக் குறைக்கவும் -- நூலக பதிப்பு மேம்படுத்தல் மற்றும் தரவுத்தள காப்பு திருத்தம் #1510 +- பர்கர்மெனு படவுரு அனிமேசனை முடக்கு #1486 +- பதிவிறக்கங்களின் நீக்குதலை செயல்தவிர்க்கவும் #1472 +- சேர் பட்டியல் #1498 இல் பதிவிறக்க விருப்பம் +- நீண்ட தட்டு பட்டியல் #1454 இல் பகிர்வு விருப்பம் சேர்க்கப்பட்டது +- வெளியேறும் #1354 இல் முதன்மையான வீரரைக் குறைக்கவும் +- நூலக பதிப்பு புதுப்பித்தல் மற்றும் தரவுத்தள காப்புப்பிரதி திருத்தம் #1510 +- ExoPlayer 2.8.2 மேம்படுத்தல் #1392 +- வேகமான வேக மாற்றத்திற்காக வெவ்வேறு படி அளவுகளை ஆதரிக்க, பிளேபேக் வேகக் கட்டுப்பாட்டு உரையாடலை மீண்டும் உருவாக்கியது. +- பிளேபேக் வேகக் கட்டுப்பாட்டில் நிசப்தத்தின் போது வேகமாக முன்னோக்கிச் செல்வதற்கான நிலைமாற்றம் சேர்க்கப்பட்டது. இது ஆடியோபுக்குகள் மற்றும் சில இசை வகைகளுக்கு உதவியாக இருக்க வேண்டும், மேலும் ஒரு உண்மையான தடையற்ற அனுபவத்தைக் கொண்டு வர முடியும் (மேலும் நிறைய அமைதியுடன் ஒரு பாடலை உடைக்க முடியும் =\\). +- மீடியா மூலத் தெளிவுத்திறன் மறுவடிவமைக்கப்பட்ட மீடியாவை கைமுறையாகச் செய்வதை விட, பிளேயரில் உள்ள மீடியாவுடன் சேர்த்து அனுப்ப அனுமதிக்கிறது. இப்போது எங்களிடம் மெட்டாடேட்டாவின் ஒற்றை சான்று உள்ளது மற்றும் பிளேபேக் தொடங்கும் போது நேரடியாகக் கிடைக்கும். +- பிளேலிச்ட் துண்டு திறக்கப்படும்போது புதிய மேனிலை தரவு கிடைக்கும்போது நிலையான ரிமோட் பிளேலிச்ட் மேனிலை தரவு புதுப்பிக்கப்படாது. +- பல்வேறு இடைமுகம் திருத்தங்கள்: #1383, பின்னணி பிளேயர் அறிவிப்புக் கட்டுப்பாடுகள் இப்போது எப்போதும் வெண்மையாக இருக்கும், மேல்தோன்றல் பிளேயரை ஃபிலிங் செய்வதன் மூலம் மூடுவது எளிது +- பல சேவைகளுக்கு மறுசீரமைக்கப்பட்ட கட்டமைப்புடன் புதிய பிரித்தெடுக்கும் கருவியைப் பயன்படுத்தவும் -- ExoPlayer 2.8.2 மேம்படுத்தல் #1392 - - வேகமான வேக மாற்றத்திற்கான வெவ்வேறு படி அளவுகளை ஆதரிக்க பின்னணி வேகக் கட்டுப்பாட்டு உரையாடலை மறுவேலை செய்தது. - - பின்னணி வேக கட்டுப்பாடு மௌனங்கள் போது வேகமாக முன்னோக்கி ஒரு நிலைமாற்றி சேர்க்கப்பட்டது. இது ஆடியோபுக்குகள் மற்றும் சில இசை வகைகளுக்கு உதவியாக இருக்க வேண்டும், மேலும் உண்மையான தடையற்ற அனுபவத்தைக் கொண்டுவர முடியும் (மேலும் நிறைய மௌனங்களுடன் ஒரு பாடலை உடைக்க முடியும் =). - - மெட்டாடேட்டாவை கைமுறையாக செய்வதை விட, பிளேயரில் உள்நாட்டில் மீடியாவுடன் மெட்டாடேட்டாவை அனுப்ப அனுமதிக்க மறுசீரமைக்கப்பட்ட ஊடக மூல தீர்மானம். இப்போது எங்களிடம் மெட்டாடேட்டாவின் ஒற்றை ஆதாரம் உள்ளது மற்றும் பிளேபேக் தொடங்கும் போது நேரடியாக கிடைக்கும். - - நிலையான தொலை பிளேலிஸ்ட் மெட்டாடேட்டா இல்லை +### திருத்தங்கள் + +- சரி #1440 உடைந்த வீடியோ செய்தி தளவமைப்பு #1491 +- சரித்திர சரித்திரத்தைக் காண்க #1497 +- #1495, பயனர் பிளேலிச்ட்டை அணுகியவுடன் மெட்டாடேட்டாவை (சிறுபடம், தலைப்பு மற்றும் வீடியோ எண்ணிக்கை) புதுப்பித்தல். +- #1475, விவரத் துண்டில் வெளிப்புற பிளேயரில் பயனர் வீடியோவைத் தொடங்கும் போது தரவுத்தளத்தில் பார்வையைப் பதிவு செய்வதன் மூலம். +- மேல்தோன்றல் பயன்முறையில் திரையின் காலக்கெடுவை சரிசெய்யவும். #1463 (நிலையான #640) +- முதன்மை வீடியோ பிளேயர் திருத்தம் #1509 +- [#1412] பிளேயர் செயல்பாடு பின்னணியில் இருக்கும்போது புதிய எண்ணம் பெறப்படும்போது பிளேயர் NPEயை ஏற்படுத்தும் நிலையான ரிப்பீட் பயன்முறை. +- மேல்தோன்றல் இசைவு வழங்கப்படாதபோது பிளேயரை பாப்அப்பிற்குக் குறைப்பது நிலையானது பிளேயரை அழிக்காது. diff --git a/fastlane/metadata/android/ta/changelogs/68.txt b/fastlane/metadata/android/ta/changelogs/68.txt index 9bada1861d0..1d0b6ca1a09 100644 --- a/fastlane/metadata/android/ta/changelogs/68.txt +++ b/fastlane/metadata/android/ta/changelogs/68.txt @@ -1,31 +1,31 @@ -# v0.14.1 மாற்றங்கள் +v0.14.1 இன் # மாற்றங்கள் -### சரி செய்யப்பட்டது -- வீடியோ url #1659 மறைகுறியாக்க சரி தோல்வி -- நிலையான விளக்கம் இணைப்பு நன்றாக பிரித்தெடுக்க இல்லை #1657 +### சரி செய்யப்பட்டது +- வீடியோ முகவரி #1659 ஐ மறைகுறியாக்குவதில் தோல்வி சரி செய்யப்பட்டது +- நிலையான விளக்கம் இணைப்பு நன்றாக பிரித்தெடுக்கப்படவில்லை #1657 -# v0.14.0 மாற்றங்கள் +v0.14.0 இன் # மாற்றங்கள் -### புதியது -- புதிய அலமாரியின் வடிவமைப்பு #1461 -- புதிய வாடிக்கையாளர்களின் முன் பக்கம் #1461 +### புதியது +- புதிய டிராயர் வடிவமைப்பு #1461 +- புதிய தனிப்பயனாக்கக்கூடிய முதல் பக்கம் #1461 -### மேம்பாடுகள் +### மேம்பாடுகள் - மறுவேலை செய்யப்பட்ட சைகை கட்டுப்பாடுகள் #1604 -- பாப்அப் பிளேயர் #1597 மூட புதிய வழி +- மேல்தோன்றல் பிளேயரை மூடுவதற்கான புதிய வழி #1597 - -### சரி செய்யப்பட்டது -- சந்தா எண்ணிக்கை கிடைக்காதபோது பிழையை சரிசெய்யவும். #1649 ஐ மூடுகிறது. - - அந்த சந்தர்ப்பங்களில் "சந்தாதாரர் எண்ணிக்கை கிடைக்கவில்லை" என்பதைக் காட்டு -- YouTube பிளேலிஸ்ட் காலியாக இருக்கும்போது NPE ஐ சரிசெய்யவும் -- SoundCloud இல் கியோஸ்க்குகளுக்கான விரைவான திருத்தம் -- Refactor மற்றும் பிழைத்திருத்தம் #1623 - - சுழற்சி தேடல் விளைவாக #1562 சரி - - சரி சீக் பட்டி நிலையாக இடப்படவில்லை - - YT பிரீமியம் வீடியோ சரியாக தடுக்கப்படவில்லை என்பதை சரிசெய்யவும் - - சில நேரங்களில் ஏற்றப்படாத வீடியோக்களை சரிசெய்யவும் (DASH பாகுபடுத்தல் காரணமாக) - - வீடியோ விளக்கத்தில் இணைப்புகளை சரிசெய்யவும் - - யாராவது வெளிப்புற SDCARD க்கு பதிவிறக்க முயற்சிக்கும்போது எச்சரிக்கையைக் காட்டு - - எதுவும் காட்டப்படவில்லை விதிவிலக்கு தூண்டுதல்கள் அறிக்கை சரி - - சிறு அண்ட்ராய்டு பின்னணி பிளேயர் காட்டப்படவில்லை 8.1 [இங்கே பார்க்கவும்](https://github.com/TeamNewPip +### சரி செய்யப்பட்டது +- சந்தா எண்ணிக்கை கிடைக்காதபோது பிழையை சரிசெய்யவும். மூடுகிறது #1649. +- அந்த சந்தர்ப்பங்களில் "சந்தாதாரர் எண்ணிக்கை கிடைக்கவில்லை" என்பதைக் காட்டு +- YouTube பிளேலிச்ட் காலியாக இருக்கும்போது NPEஐ சரிசெய்யவும் +- SoundCloud இல் உள்ள கியோச்க்குகளை விரைவாக சரிசெய்தல் +- ரீஃபாக்டர் மற்றும் பிழைத்திருத்தம் #1623 +- சுழற்சி தேடல் முடிவை சரிசெய்யவும் #1562 +- ஃபிக்ச் சீக் பட்டி நிலையானதாக இல்லை +- ஃபிக்ச் YT காப்பீடு வீடியோ சரியாகத் தடுக்கப்படவில்லை +- சில நேரங்களில் ஏற்றப்படாமல் இருக்கும் வீடியோக்களை சரிசெய்யவும் (DASH பாகுபடுத்தல் காரணமாக) +- வீடியோ விளக்கத்தில் இணைப்புகளை சரிசெய்யவும் +- வெளிப்புற sdcard க்கு யாராவது பதிவிறக்க முயற்சிக்கும்போது எச்சரிக்கையைக் காட்டு +- எதுவும் காட்டப்படாத விதிவிலக்கு தூண்டுதல் அறிக்கையை சரிசெய்யவும் +- ஆண்ட்ராய்டு 8.1க்கான பின்னணி பிளேயரில் சிறுபடம் காட்டப்படவில்லை [இங்கே பார்க்கவும்](https://github.com/TeamNewPipe/NewPipe/issues/943) +- ஒளிபரப்பு பெறுநரின் பதிவை சரிசெய்தல். மூடுகிறது #1641. diff --git a/fastlane/metadata/android/ta/changelogs/69.txt b/fastlane/metadata/android/ta/changelogs/69.txt index 0c2c47e48cf..e5e5ab606d7 100644 --- a/fastlane/metadata/android/ta/changelogs/69.txt +++ b/fastlane/metadata/android/ta/changelogs/69.txt @@ -1,19 +1,19 @@ -### புதியது - - சந்தாக்களில் #1516 இல் நீண்ட-தட்டுதல் நீக்கவும் பகிரவும் - - டேப்லெட் யுஐ மற்றும் கட்டம் பட்டியல் தளவமைப்பு #1617 +### புதியது +- நீண்ட நேரம் நீக்கு மற்றும் சந்தாக்கள் #1516 இல் பகிரவும் +- டேப்லெட் இடைமுகம் மற்றும் கட்டம் பட்டியல் தளவமைப்பு #1617 - ### மேம்பாடுகள் - - கடைசியாக பயன்படுத்தப்பட்ட விகித விகிதத்தை #1748 சேமித்து மீண்டும் ஏற்றவும் - - முழு வீடியோ பெயர்களுடன் பதிவிறக்கங்களின் செயல்பாட்டில் நேரியல் தளவமைப்பை இயக்கவும் #1771 - - சந்தாக்கள் தாவல் #1516 க்குள் இருந்து நேரடியாக சந்தாக்களை நீக்கி பகிரவும் - - நாடக வரிசை ஏற்கனவே #1783 முடிந்துவிட்டால், இப்போது வீடியோ விளையாடுவதைத் தூண்டுகிறது - - தொகுதி மற்றும் ஒளி சைகைகளுக்கான தனி அமைப்புகள் #1644 - - உள்ளூர்மயமாக்கலுக்கான ஆதரவைச் சேர்க்கவும் #1792 +### மேம்பாடுகள் +- கடைசியாகப் பயன்படுத்திய #1748 விகிதத்தை சேமித்து மீண்டும் ஏற்றவும் +- முழு வீடியோ பெயர்கள் #1771 உடன் பதிவிறக்கங்கள் செயல்பாட்டில் நேரியல் தளவமைப்பை இயக்கவும் +- சந்தாக்கள் தாவல் #1516 இலிருந்து நேரடியாக சந்தாக்களை நீக்கி பகிரவும் +- ப்ளே வரிசை ஏற்கனவே #1783 முடிவடைந்திருந்தால், இப்போது வரிசைப்படுத்துவது வீடியோவை இயக்கத் தூண்டுகிறது +- தொகுதி மற்றும் பிரகாச சைகைகளுக்கான தனி அமைப்புகள் #1644 +- உள்ளூர்மயமாக்கல் #1792க்கான ஆதரவைச் சேர்க்கவும் - ### திருத்தங்கள் - - நேர பாகுபடுத்தும் நேரத்தை சரிசெய்யவும். வடிவம், எனவே புதிய பக்கத்தை பின்லாந்தில் பயன்படுத்தலாம் - - சந்தா எண்ணிக்கையை சரிசெய்யவும் - - பநிஇ 28+ சாதனங்களுக்கான முன் பணி அனுமதியை #1830 சேர்க்கவும் +### திருத்தங்கள் +- க்கு நேரம் பாகுபடுத்துதல். வடிவம், எனவே நியூபைப்பை ஃபின்லாந்தில் பயன்படுத்தலாம் +- சந்தா எண்ணிக்கையை சரிசெய்யவும் +- பநிஇ 28+ சாதனங்களுக்கு முன்புற பணி அனுமதியைச் சேர்க்கவும் #1830 - ### அறியப்பட்ட பிழைகள் - - அண்ட்ராய்டு பி இல் பிளேபேக் நிலையை சேமிக்க முடியாது +### தெரிந்த பிழைகள் +- பிளேபேக் நிலையை Android P இல் சேமிக்க முடியாது diff --git a/fastlane/metadata/android/ta/changelogs/70.txt b/fastlane/metadata/android/ta/changelogs/70.txt index a314d7ac9de..747ee2f1622 100644 --- a/fastlane/metadata/android/ta/changelogs/70.txt +++ b/fastlane/metadata/android/ta/changelogs/70.txt @@ -1,25 +1,25 @@ -கவனம்: இந்த பதிப்பு கடைசியாக இருப்பதைப் போலவே ஒரு பிழைத்திருத்தமாகும். இருப்பினும் 17 முதல் முழு பணிநிறுத்தம் காரணமாக. உடைந்த பதிப்பு சிறந்தது, பின்னர் பதிப்பு இல்லை. சரி? ¯ \ _ (ツ) _/ +கவனம்: கடந்த பதிப்பைப் போலவே இந்தப் பதிப்பும் ஒரு பக்ஃபெச்டாக இருக்கலாம். எனினும் 17 முதல் முழு பணிநிறுத்தம் காரணமாக. உடைந்த பதிப்பு சிறந்த பதிப்பு இல்லை. சரியா? ¯\_(ツ)_/¯ - ### மேம்பாடுகள் - * பதிவிறக்கம் செய்யப்பட்ட கோப்புகளை இப்போது ஒரு சொடுக்கு #1879 உடன் திறக்கலாம் - * ஆண்ட்ராய்டு 4.1 - 4.3 #1884 க்கான ஆதரவை கைவிடவும் - * பழைய பிளேயரை அகற்று #1884 - * தற்போதைய நாடக வரிசையில் இருந்து ச்ட்ரீம்களை வலதுபுறமாக ச்வைப் செய்வதன் மூலம் அகற்றவும் #1915 - * ஒரு புதிய ச்ட்ரீம் கைமுறையாக #1878 - * பதிவிறக்கங்களுக்கான போச்ட்ரோசெசிங் மற்றும் காணாமல் போன அம்சங்களை செயல்படுத்துதல் #1759 bykapodamy - * பிந்தைய செயலாக்க உள்கட்டமைப்பு - * சரியான பிழை "உள்கட்டமைப்பு" (பதிவிறக்கத்திற்கு) - * பல பதிவிறக்கங்களுக்கு பதிலாக வரிசை - * பயன்பாட்டு தரவுக்கு சீரியலைச் நிலுவையில் உள்ள பதிவிறக்கங்களை (`.கிகா` கோப்புகள்) நகர்த்தவும் - * அதிகபட்ச பதிவிறக்க மீண்டும் முயற்சிக்கவும் - * சரியான மல்டி-த்ரெட் பதிவிறக்கம் இடைநிறுத்தம் - * மொபைல் நெட்வொர்க்கிற்கு மாறும்போது பதிவிறக்கங்களை நிறுத்துங்கள் (ஒருபோதும் செயல்படாது, 2 வது புள்ளியைப் பார்க்கவும்) - * அடுத்த பதிவிறக்கங்களுக்கான நூல் எண்ணிக்கையைச் சேமிக்கவும் - * நிறைய முரண்பாடுகள் சரி செய்யப்பட்டன +### மேம்பாடுகள் +பதிவிறக்கம் செய்யப்பட்ட கோப்புகளை இப்போது ஒரே கிளிக்கில் திறக்கலாம் #1879 +* ஆண்ட்ராய்டு 4.1 - 4.3 #1884க்கான ஆதரவை கைவிடவும் +* பழைய பிளேயரை அகற்றவும் #1884 +* ச்ட்ரீம்களை வலது #1915 க்கு ச்வைப் செய்வதன் மூலம் தற்போதைய பிளே வரிசையிலிருந்து அகற்றவும் +* ஒரு புதிய ச்ட்ரீம் கைமுறையாக #1878 வரிசைப்படுத்தப்படும் போது தானாக வரிசைப்படுத்தப்பட்ட ச்ட்ரீமை அகற்றவும் +* பதிவிறக்கங்களுக்கான பின்செயலாக்குதல் மற்றும் @kapodamy ஆல் விடுபட்ட நற்பொருத்தங்கள் #1759 செயல்படுத்துதல் +* செயலாக்கத்திற்குப் பின் உள்கட்டமைப்பு +* சரியான பிழை கையாளுதல் "உள்கட்டமைப்பு" (பதிவிறக்குபவருக்கு) +* பல பதிவிறக்கங்களுக்குப் பதிலாக வரிசை +* வரிசைப்படுத்தப்பட்ட நிலுவையிலுள்ள பதிவிறக்கங்களை (`.giga` கோப்புகள்) பயன்பாட்டுத் தரவுக்கு நகர்த்தவும் +* அதிகபட்ச பதிவிறக்க மறு முயற்சியை செயல்படுத்தவும் +* முறையான பல நூல் பதிவிறக்கம் இடைநிறுத்தம் +* மொபைல் நெட்வொர்க்கிற்கு மாறும்போது பதிவிறக்கங்களை நிறுத்துங்கள் (ஒருபோதும் வேலை செய்யாது, 2வது புள்ளியைப் பார்க்கவும்) +* அடுத்த பதிவிறக்கங்களுக்கு நூல் எண்ணிக்கையைச் சேமிக்கவும் +* பல முரண்பாடுகள் சரி செய்யப்பட்டன - ### சரி செய்யப்பட்டது - * இயல்புநிலை தெளிவுத்திறனுடன் செயலிழப்பை சரிசெய்யவும் சிறந்த மற்றும் வரையறுக்கப்பட்ட மொபைல் தரவு தீர்மானம் #1835 - * பாப்-அப் பிளேயர் செயலிழப்பு சரி #1874 - * பின்னணி பிளேயரைத் திறக்க முயற்சிக்கும்போது NPE #1901 - * ஆட்டோ வரிசை இயக்கப்பட்டிருக்கும் போது புதிய ச்ட்ரீம்களைச் செருகுவதை சரிசெய்யவும் #1878 - * டெசிபரிங் சட்டவுன் சிக்கல் சரி செய்யப்பட்டது +### சரி செய்யப்பட்டது +* சிறந்த மற்றும் வரையறுக்கப்பட்ட மொபைல் டேட்டா தெளிவுத்திறன் #1835க்கு அமைக்கப்பட்ட இயல்புநிலை தெளிவுத்திறனுடன் செயலிழப்பை சரிசெய்யவும் +* பாப்-அப் பிளேயர் செயலிழப்பு சரி செய்யப்பட்டது #1874 +* NPE பின்னணி பிளேயர் #1901 ஐ திறக்க முயற்சிக்கும்போது +* தானாக வரிசைப்படுத்துதல் #1878 இயக்கப்பட்டிருக்கும் போது புதிய ச்ட்ரீம்களைச் செருகுவதை சரிசெய்யவும் +* டிசைப்பரிங் சட்டவுன் சிக்கல் சரி செய்யப்பட்டது diff --git a/fastlane/metadata/android/ta/changelogs/71.txt b/fastlane/metadata/android/ta/changelogs/71.txt index 278cb41c070..4c677d3a087 100644 --- a/fastlane/metadata/android/ta/changelogs/71.txt +++ b/fastlane/metadata/android/ta/changelogs/71.txt @@ -1,10 +1,10 @@ -### மேம்பாடுகள் - * அறிவிலிமையம் பில்டிற்கான பயன்பாட்டு புதுப்பிப்பு அறிவிப்பை சேர்க்கவும் (#1608 bykrtkush) - * பதிவிறக்கத்தின் பல்வேறு மேம்பாடுகள் (#1944 bykapodamy): - * காணாமல் போன வெள்ளை ஐகான்களைச் சேர்த்து, படவுரு வண்ணங்களை மாற்ற ஆர்ட்கோர்டு வழியைப் பயன்படுத்தவும் - * ஐடரேட்டர் துவக்கப்பட்டதா என்பதை சரிபார்க்கவும் (திருத்தங்கள் #2031) - * புதிய மக்சரில் "பிந்தைய செயலாக்க தோல்வியுற்ற" பிழையுடன் மீண்டும் பதிவிறக்கங்களை மீண்டும் எடுக்க அனுமதிக்கவும் - * புதிய MPEG-4 மக்சர் ஒத்திசைவு அல்லாத வீடியோ மற்றும் ஆடியோ ச்ட்ரீம்களை சரிசெய்கிறது (#2039) +### மேம்பாடுகள் +* GitHub உருவாக்கத்திற்கான பயன்பாட்டு புதுப்பிப்பு அறிவிப்பைச் சேர்க்கவும் (#1608 by @krtkush) +* டவுன்லோடருக்கு பல்வேறு மேம்பாடுகள் (#1944 by @kapodamy): +* விடுபட்ட வெள்ளை ஐகான்களைச் சேர்த்து, படவுரு வண்ணங்களை மாற்ற ஆர்ட்கோர்டு வழியைப் பயன்படுத்தவும் +* இடிரேட்டர் துவக்கப்பட்டதா என சரிபார்க்கவும் (சரிசெய்தல் #2031) +* புதிய muxer இல் "பிந்தைய செயலாக்கம் தோல்வியடைந்தது" பிழையுடன் மீண்டும் பதிவிறக்கங்களை அனுமதிக்கவும் +* புதிய MPEG-4 muxer ஒத்திசைவற்ற வீடியோ மற்றும் ஆடியோ ச்ட்ரீம்களை சரிசெய்கிறது (#2039) - ### சரி செய்யப்பட்டது - * யூடியூப் லைவ் ச்ட்ரீம்கள் குறுகிய காலத்திற்குப் பிறகு விளையாடுவதை நிறுத்துகின்றன (#1996 @yausername) +### சரி செய்யப்பட்டது +* YouTube லைவ் ச்ட்ரீம்கள் சிறிது நேரத்திற்குப் பிறகு இயங்குவதை நிறுத்துகின்றன (#1996 by @yausername) diff --git a/fastlane/metadata/android/ta/changelogs/740.txt b/fastlane/metadata/android/ta/changelogs/740.txt index f3c18d5bc57..ce8085728e7 100644 --- a/fastlane/metadata/android/ta/changelogs/740.txt +++ b/fastlane/metadata/android/ta/changelogs/740.txt @@ -1,23 +1,23 @@ -

மேம்பாடுகள்

-
    -
  • கருத்துக்களில் இணைப்புகளை சொடுக்கு செய்யக்கூடியது, உரை அளவை அதிகரிக்கவும்
  • -
  • கருத்துகளில் நேர முத்திரை இணைப்புகளைக் சொடுக்கு செய்வதைத் தேடுங்கள்
  • -
  • அண்மைக் காலத்தில் தேர்ந்தெடுக்கப்பட்ட நிலையின் அடிப்படையில் விருப்பமான தாவலைக் காட்டு
  • -
  • ' பின்னணி ' பிளேலிச்ட் சாளரத்தில்
  • -
  • பகிரப்பட்ட உரையை முகவரி இல்லாதபோது தேடுங்கள்
  • -
  • சேர் & quot; தற்போதைய நேரத்தில் பகிரவும் & quot; முதன்மையான வீடியோ பிளேயருக்கு பொத்தான்
  • -
  • வீடியோ வரிசை முடிந்ததும் முதன்மையான பிளேயருக்கு மூடு பொத்தானைச் சேர்க்கவும்
  • -
  • & quot; பின்னணியில் நேரடியாக விளையாடுங்கள் & quot; வீடியோ பட்டியல் உருப்படிகளுக்கான லாங் பிரச் மெனுவுக்கு
  • -
  • விளையாட்டு/enqueue கட்டளைகளுக்கான ஆங்கில மொழிபெயர்ப்புகளை மேம்படுத்தவும்
  • -
  • சிறிய செயல்திறன் மேம்பாடுகள்
  • -
  • பயன்படுத்தப்படாத கோப்புகளை அகற்று
  • -
  • எக்சோப்ளேயரை 2.9.6 க்கு புதுப்பிக்கவும்
  • -
  • வன்கவர்வு இணைப்புகளுக்கு ஆதரவைச் சேர்க்கவும்
  • -
-

சரி செய்யப்பட்டது

-
    -
  • நிலையான சுருள் w/ கருத்துகள் மற்றும் தொடர்புடைய ச்ட்ரீம்கள் முடக்கப்பட்டன -
  • நிலையான CheckFornewAppversionTask அது செய்யப்படும்போது செயல்படுத்தப்படும் ' t
  • -
  • நிலையான YouTube சந்தா இறக்குமதி: தவறான முகவரி உடன் புறக்கணித்து, வெற்று தலைப்பைக் கொண்டு வைக்கவும்
  • -
  • தவறான YouTube முகவரி ஐ சரிசெய்யவும்: கையொப்பம் குறிச்சொல் பெயர் எப்போதும் ச்ட்ரீம்களை ஏற்றுவதைத் தடுக்கும் "கையொப்பம்"
  • -
+

மேம்பாடுகள்

+
    +
  • கருத்துகளில் இணைப்புகளைக் சொடுக்கு செய்யக்கூடியதாக ஆக்குங்கள், உரை அளவை அதிகரிக்கவும்
  • +
  • கருத்துகளில் நேரமுத்திரை இணைப்புகளைக் சொடுக்கு செய்வதைத் தேடுங்கள்
  • +
  • சமீபத்தில் தேர்ந்தெடுக்கப்பட்ட மாநிலத்தின் அடிப்படையில் விருப்பமான தாவலைக் காட்டு
  • +'பின்னணி' பிளேலிச்ட் சாளரத்தில் +
  • பகிர்ந்த உரை முகவரி இல்லாவிடில் தேடவும்
  • +
  • சேர் "தற்போதைய நேரத்தில் பகிர்" முக்கிய வீடியோ பிளேயருக்கான பொத்தான்
  • +
  • வீடியோ வரிசை முடிந்ததும் மெயின் பிளேயருக்கு மூடு பட்டனைச் சேர்க்கவும்
  • +
  • சேர் "பின்னணியில் நேரடியாக விளையாடு" வீடியோ பட்டியல் உருப்படிகளுக்கான மெனுவை நீண்ட அழுத்தவும்
  • +
  • Play/Enqueue கட்டளைகளுக்கான ஆங்கில மொழிபெயர்ப்புகளை மேம்படுத்தவும்
  • +
  • சிறிய செயல்திறன் மேம்பாடுகள்
  • +
  • பயன்படுத்தாத கோப்புகளை அகற்று
  • +
  • ExoPlayerஐ 2.9.6க்கு புதுப்பிக்கவும்
  • +
  • Invidious இணைப்புகளுக்கான ஆதரவைச் சேர்க்கவும்
  • +
+

நிலையானது

+
    +
  • நிலையான ச்க்ரோல் w/ கருத்துகள் மற்றும் தொடர்புடைய ச்ட்ரீம்கள் முடக்கப்பட்டன
  • +
  • நிச்சயமான CheckForNewAppVersionTask செயல்படாத போது செயல்படுத்தப்படுகிறது
  • +
  • நிலையான யூடியூப் சந்தா இறக்குமதி: தவறான முகவரி உள்ளவற்றைப் புறக்கணித்து, வெற்று தலைப்பில் உள்ளவற்றை வைத்திருங்கள்
  • +
  • தவறான YouTube முகவரி ஐ சரிசெய்யவும்: கையொப்ப குறிச்சொல் பெயர் எப்போதும் ச்ட்ரீம்களை ஏற்றுவதைத் தடுக்கும் "கையொப்பம்" அல்ல
  • +
diff --git a/fastlane/metadata/android/ta/changelogs/750.txt b/fastlane/metadata/android/ta/changelogs/750.txt index 08631498c46..f975f7b71f3 100644 --- a/fastlane/metadata/android/ta/changelogs/750.txt +++ b/fastlane/metadata/android/ta/changelogs/750.txt @@ -1,22 +1,22 @@ -புதியது - பிளேபேக் விண்ணப்பம் #2288 - Last கடைசியாக நீங்கள் நிறுத்திய இடத்தில் நீரோடைகளை மீண்டும் தொடங்குங்கள் - பதிவிறக்க மேம்பாடுகள் #2149 - St வெளிப்புற எச்டி-கார்டுகளில் பதிவிறக்கங்களை சேமிக்க சேமிப்பக அணுகல் கட்டமைப்பைப் பயன்படுத்தவும் - Mp புதிய எம்பி 4 மக்சர் - பதிவிறக்கம் பதிவிறக்கத்தைத் தொடங்குவதற்கு முன் பதிவிறக்க கோப்பகத்தை விருப்பமாக மாற்றவும் - Meade மீட்டெடுக்கப்பட்ட நெட்வொர்க்குகளை மரியாதை +புதியது +பிளேபேக் ரெச்யூம் #2288 +• கடைசியாக நீங்கள் நிறுத்திய ச்ட்ரீம்களை மீண்டும் தொடங்கவும் +டவுன்லோடர் மேம்பாடுகள் #2149 +• வெளிப்புற SD கார்டுகளில் பதிவிறக்கங்களைச் சேமிக்க சேமிப்பக அணுகல் கட்டமைப்பைப் பயன்படுத்தவும் +• புதிய mp4 muxer +• பதிவிறக்கத்தைத் தொடங்கும் முன் பதிவிறக்க கோப்பகத்தை விருப்பமாக மாற்றவும் +• மீட்டர் நெட்வொர்க்குகளை மதிக்கவும் - மேம்படுத்தப்பட்டது - • அகற்றப்பட்ட செமா சரங்கள் #2295 - Life செயல்பாட்டு வாழ்க்கை சுழற்சி #2444 இன் போது கையாளுதல் (ஆட்டோ) சுழற்சி மாற்றங்கள் - Long நீண்ட அழுத்த மெனுக்களை சீரானதாக மாற்றவும் #2368 +மேம்படுத்தப்பட்டது +• நீக்கப்பட்ட செமா சரங்கள் #2295 +• செயல்பாட்டு வாழ்க்கைச் சுழற்சியின் போது (தானியங்கு) சுழற்சி மாற்றங்களைக் கையாளவும் #2444 +• நீண்ட அழுத்த மெனுக்களை சீரான #2368 ஆக்குங்கள் - சரி - • நிலையான தேர்ந்தெடுக்கப்பட்ட வசன பாதை பெயர் காண்பிக்கப்படவில்லை #2394 - பயன்பாடு பயன்பாட்டு புதுப்பிப்பு தோல்வியுற்றால் செயலிழக்க வேண்டாம் (கிதுப் பதிப்பு) #2423 - • நிலையான பதிவிறக்கங்கள் 99.9% #2440 இல் சிக்கியுள்ளன - Play ப்ளே வரிசை மேனிலை தரவு #2453 ஐப் புதுப்பிக்கவும் - • [சவுண்ட்க்ளூட்] பிளேலிச்ட்கள் டீம்நியூபைப்/நியூபிபீக்ச்ட்ராக்டர்#170 ஐ ஏற்றும்போது நிலையான செயலிழப்பு - • [YouTube] நிலையான கால அளவு paresd teamnewpipe/newPipeextractor#177 ஆக இருக்க முடியாது +சரி செய்யப்பட்டது +• நிலையான தேர்ந்தெடுக்கப்பட்ட வசன டிராக் பெயர் #2394 காட்டப்படவில்லை +• ஆப்ச் புதுப்பிப்பு தோல்வியுற்றால் செயலிழக்க வேண்டாம் (GitHub பதிப்பு) #2423 +• நிலையான பதிவிறக்கங்கள் 99.9% #2440 இல் சிக்கியுள்ளன +• பிளே வரிசை மேனிலை தரவு #2453ஐப் புதுப்பிக்கவும் +• [SoundCloud] பிளேலிச்ட்களை ஏற்றும்போது நிலையான செயலிழப்பு TeamNewPipe/NewPipeExtractor#170 +• [YouTube] நிலையான கால அளவு TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/ta/changelogs/760.txt b/fastlane/metadata/android/ta/changelogs/760.txt index b2252d1795b..2ef083c0066 100644 --- a/fastlane/metadata/android/ta/changelogs/760.txt +++ b/fastlane/metadata/android/ta/changelogs/760.txt @@ -1,43 +1,43 @@ -0.17.1 இல் மாற்றங்கள் +0.17.1 இல் மாற்றங்கள் - புதியது - • தாய் உள்ளூர்மயமாக்கல் +புதியது +• தாய் உள்ளூர்மயமாக்கல் - மேம்படுத்தப்பட்டது - The பிளேலிச்ட்களுக்கான லாங்-பிரச் மெனுக்களில் மீண்டும் விளையாடத் தொடங்குங்கள் #2518 - SAF SAF / மரபு கோப்பு பிக்கர் #2521 க்கு சுவிட்சைச் சேர்க்கவும் +மேம்படுத்தப்பட்டது +• பிளேலிச்ட்களுக்கான நீண்ட அழுத்த மெனுக்களில் மீண்டும் விளையாடத் தொடங்கும் செயலைச் சேர்க்கவும் #2518 +• SAF / மரபு கோப்பு தேர்வி #2521க்கான சுவிட்சைச் சேர்க்கவும் - சரி - இடு பயன்பாடுகளை மாற்றும்போது பதிவிறக்கங்களில் காணாமல் போகும் பொத்தான்களை சரிசெய்யவும் #2487 - Watch வாட்ச் வரலாறு முடக்கப்பட்டிருந்தாலும் பிளேபேக் நிலை சேமிக்கப்படுகிறது - Tiews பட்டியல் காட்சிகள் #2517 இல் பிளேபேக் நிலையால் ஏற்படும் குறைக்கப்பட்ட செயல்திறனை சரிசெய்யவும் - • [பிரித்தெடுத்தல்] recaptchaactivity #2527, TeamNewPipe/NewPipeextractor #186 ஐ சரிசெய்யவும் - • [பிரித்தெடுத்தல்] [YouTube] பிளேலிச்ட்கள் முடிவுகளில் இருக்கும்போது சாதாரண தேடல் பிழையை சரிசெய்யவும் teamnewpipe/newPipeextractor#185 +சரி செய்யப்பட்டது +• பயன்பாடுகள் #2487 ஐ மாற்றும்போது பதிவிறக்கங்கள் பார்வையில் மறைந்து வரும் பொத்தான்களை சரிசெய்யவும் +• பார்வை வரலாறு முடக்கப்பட்டிருந்தாலும், ஃபிக்ச் பிளேபேக் நிலை சேமிக்கப்படும் +• பட்டியல் காட்சிகள் #2517 இல் பிளேபேக் நிலை காரணமாக குறைக்கப்பட்ட செயல்திறனை சரிசெய்யவும் +• [எக்ச்ட்ராக்டர்] ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186 +• [எக்ச்ட்ராக்டர்] [YouTube] பிளேலிச்ட்கள் முடிவுகளில் இருக்கும்போது சாதாரண தேடல் பிழையை சரிசெய்யவும் TeamNewPipe/NewPipeExtractor#185 - 0.17.0 இல் மாற்றங்கள் +0.17.0 இல் மாற்றங்கள் - புதியது - பிளேபேக் விண்ணப்பம் #2288 - Last கடைசியாக நீங்கள் நிறுத்திய இடத்தில் நீரோடைகளை மீண்டும் தொடங்குங்கள் - பதிவிறக்க மேம்பாடுகள் #2149 - St வெளிப்புற எச்டி-கார்டுகளில் பதிவிறக்கங்களை சேமிக்க சேமிப்பக அணுகல் கட்டமைப்பைப் பயன்படுத்தவும் - Mp புதிய எம்பி 4 மக்சர் - பதிவிறக்கம் பதிவிறக்கத்தைத் தொடங்குவதற்கு முன் பதிவிறக்க கோப்பகத்தை விருப்பமாக மாற்றவும் - Meade மீட்டெடுக்கப்பட்ட நெட்வொர்க்குகளை மரியாதை +புதியது +பிளேபேக் ரெச்யூம் #2288 +• கடைசியாக நீங்கள் நிறுத்திய ச்ட்ரீம்களை மீண்டும் தொடங்கவும் +டவுன்லோடர் மேம்பாடுகள் #2149 +• வெளிப்புற SD கார்டுகளில் பதிவிறக்கங்களைச் சேமிக்க சேமிப்பக அணுகல் கட்டமைப்பைப் பயன்படுத்தவும் +• புதிய mp4 muxer +• பதிவிறக்கத்தைத் தொடங்கும் முன் பதிவிறக்க கோப்பகத்தை விருப்பமாக மாற்றவும் +• மீட்டர் நெட்வொர்க்குகளை மதிக்கவும் - மேம்படுத்தப்பட்டது - • அகற்றப்பட்ட செமா சரங்கள் #2295 - Life செயல்பாட்டு வாழ்க்கை சுழற்சி #2444 இன் போது கையாளுதல் (ஆட்டோ) சுழற்சி மாற்றங்கள் - Long நீண்ட அழுத்த மெனுக்களை சீரானதாக மாற்றவும் #2368 +மேம்படுத்தப்பட்டது +• நீக்கப்பட்ட செமா சரங்கள் #2295 +• செயல்பாட்டு வாழ்க்கைச் சுழற்சியின் போது (தானியங்கு) சுழற்சி மாற்றங்களைக் கையாளவும் #2444 +• நீண்ட அழுத்த மெனுக்களை சீரான #2368 ஆக்குங்கள் - சரி - • நிலையான தேர்ந்தெடுக்கப்பட்ட வசன பாதை பெயர் காண்பிக்கப்படவில்லை #2394 - பயன்பாடு பயன்பாட்டு புதுப்பிப்பு தோல்வியுற்றால் செயலிழக்க வேண்டாம் (கிதுப் பதிப்பு) #2423 - • நிலையான பதிவிறக்கங்கள் 99.9% #2440 இல் சிக்கியுள்ளன - Play ப்ளே வரிசை மேனிலை தரவு #2453 ஐப் புதுப்பிக்கவும் - • [சவுண்ட்க்ளூட்] பிளேலிச்ட்கள் டீம்நியூபைப்/நியூபிபீக்ச்ட்ராக்டர்#170 ஐ ஏற்றும்போது நிலையான செயலிழப்பு - • [YouTube] நிலையான கால அளவு paresd teamnewpipe/newPipeextractor#177 ஆக இருக்க முடியாது +சரி செய்யப்பட்டது +• நிலையான தேர்ந்தெடுக்கப்பட்ட வசன டிராக் பெயர் #2394 காட்டப்படவில்லை +• ஆப்ச் புதுப்பிப்பு தோல்வியுற்றால் செயலிழக்க வேண்டாம் (GitHub பதிப்பு) #2423 +• நிலையான பதிவிறக்கங்கள் 99.9% #2440 இல் சிக்கியுள்ளன +• பிளே வரிசை மேனிலை தரவு #2453ஐப் புதுப்பிக்கவும் +• [SoundCloud] பிளேலிச்ட்களை ஏற்றும்போது நிலையான செயலிழப்பு TeamNewPipe/NewPipeExtractor#170 +• [YouTube] நிலையான கால அளவு TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/ta/changelogs/780.txt b/fastlane/metadata/android/ta/changelogs/780.txt index 7d6d57a1c61..56e6bcfe720 100644 --- a/fastlane/metadata/android/ta/changelogs/780.txt +++ b/fastlane/metadata/android/ta/changelogs/780.txt @@ -1,12 +1,12 @@ -0.17.3 இல் மாற்றங்கள் +0.17.3 இல் மாற்றங்கள் - மேம்படுத்தப்பட்டது - The பிளேபேக் நிலைகளை அழிக்க விருப்பம் சேர்க்கப்பட்டது #2550 - The கோப்பு பிக்கர் #2591 இல் மறைக்கப்பட்ட கோப்பகங்களைக் காட்டு - புதிய NewPipe #2488 உடன் திறக்கப்பட வேண்டிய `invidio.us` நிகழ்வுகளிலிருந்து முகவரி களை ஆதரிக்கவும் - `Music.youtube.com` urls teamnewpipe/newPipeextractor#194 க்கான ஆதரவைச் சேர்க்கவும் +மேம்படுத்தப்பட்டது +• பிளேபேக் நிலைகளை அழிக்க விருப்பம் சேர்க்கப்பட்டது #2550 +• கோப்பு தேர்வி #2591 இல் மறைக்கப்பட்ட கோப்பகங்களைக் காட்டு +• NewPipe #2488 உடன் திறக்கப்பட வேண்டிய `invidio.us` நிகழ்வுகளின் உதவி URLகள் +• `music.youtube.com` URLகளுக்கான ஆதரவைச் சேர்க்கவும் TeamNewPipe/NewPipeExtractor#194 - சரி - • [YouTube] நிலையான 'java.lang.ilegalargumentexception #192 - • [YouTube] நிலையான நேரடி ச்ட்ரீம்கள் டீம்நியூபைப்/நியூபிபீக்ச்ட்ராக்டர்#195 வேலை செய்யாது - And ஆண்ட்ராய்டு பை ஒரு ச்ட்ரீம் பதிவிறக்கும்போது நிலையான செயல்திறன் சிக்கல் #2592 +சரி செய்யப்பட்டது +• [YouTube] நிலையான 'java.lang.IllegalArgumentException #192 +• [YouTube] நிலையான நேரடி ச்ட்ரீம்கள் வேலை செய்யவில்லை TeamNewPipe/NewPipeExtractor#195 +• ச்ட்ரீம் #2592 ஐப் பதிவிறக்கும் போது ஆண்ட்ராய்டு பையில் செயல்திறன் சிக்கல் சரி செய்யப்பட்டது diff --git a/fastlane/metadata/android/ta/changelogs/790.txt b/fastlane/metadata/android/ta/changelogs/790.txt index 1c9236d44a9..20ddb787cc7 100644 --- a/fastlane/metadata/android/ta/changelogs/790.txt +++ b/fastlane/metadata/android/ta/changelogs/790.txt @@ -1,14 +1,14 @@ -மேம்படுத்தப்பட்டது - Bland பார்வையற்றவர்களுக்கான அணுகலை மேம்படுத்த கூடுதல் தலைப்புகளைச் சேர்க்கவும் #2655 - பதிவிறக்கம் பதிவிறக்க கோப்புறையின் மொழியை மிகவும் சீரானதாகவும், தெளிவற்றதாகவும் மாற்றவும் #2637 +மேம்படுத்தப்பட்டது +• பார்வையற்றவர்களுக்கான அணுகலை மேம்படுத்த மேலும் தலைப்புகளைச் சேர்க்கவும் #2655 +• பதிவிறக்க கோப்புறை அமைப்பை மிகவும் சீரானதாகவும் தெளிவற்றதாகவும் மாற்றவும் #2637 - சரி - The தொகுதியில் கடைசி பைட் பதிவிறக்கம் செய்யப்பட்டதா என்று சரிபார்க்கவும் #2646 - ஒளிதோற்றம் வீடியோ விவரம் துண்டு #2672 இல் நிலையான ச்க்ரோலிங் - Teark இரட்டை தேடல் தெளிவான பெட்டி அனிமேசன்களை ஒரு #2695 க்கு அகற்று - • [சவுண்ட்க்ளூட்] கிளையன்ட்_ஐடி பிரித்தெடுத்தல் #2745 ஐ சரிசெய்யவும் +சரி செய்யப்பட்டது +• பிளாக்கில் கடைசி பைட் #2646 பதிவிறக்கம் செய்யப்பட்டுள்ளதா எனச் சரிபார்க்கவும் +• வீடியோ விவரத் துண்டு #2672 இல் ச்க்ரோலிங் சரி செய்யப்பட்டது +• இரட்டை தேடல் தெளிவான பெட்டி அனிமேசன்களை #2695 க்கு அகற்றவும் +• [SoundCloud] கிளையன்ட்_ஐடி பிரித்தெடுத்தலை சரிசெய்யவும் #2745 - வளர்ச்சி - புதிய நியூபிபீக்ச்ட்ராக்டரிடமிருந்து பெறப்பட்ட காணாமல் போன சார்புகளை நியூபைப் #2535 இல் சேர்க்கவும் - And Androidx #2685 க்கு இடம்பெயர்வு - Ex எக்சோப்ளேயருக்கு புதுப்பிப்பு 2.10.6 #2697, #2736 +வளர்ச்சி +• NewPipeExtractor இலிருந்து பெறப்பட்ட விடுபட்ட சார்புகளை NewPipe #2535 இல் சேர்க்கவும் +• AndroidX #2685க்கு மாற்றவும் +• ExoPlayer 2.10.6 #2697, #2736 க்கு புதுப்பிக்கவும் diff --git a/fastlane/metadata/android/ta/changelogs/800.txt b/fastlane/metadata/android/ta/changelogs/800.txt index 9108f0dea96..e67680227ca 100644 --- a/fastlane/metadata/android/ta/changelogs/800.txt +++ b/fastlane/metadata/android/ta/changelogs/800.txt @@ -1,27 +1,27 @@ -புதியது - P பி 2 பி (#2201) இல்லாமல் PEERTUBE உதவி [பீட்டா]: - ஒப்பி Peertube நிகழ்வுகளிலிருந்து வீடியோக்களைப் பார்த்து பதிவிறக்கவும் - Per முழுமையான PEERTUBE உலகத்தை அணுக அமைப்புகளில் நிகழ்வுகளைச் சேர்க்கவும் - And ஆண்ட்ராய்டு 4.4 மற்றும் 7.1 இல் எச்எச்எல் ஏண்ட்சேக்குகளில் சிக்கல்கள் இருக்கலாம், இதன் விளைவாக பிணைய பிழையின் விளைவாக சில நிகழ்வுகளை அணுகலாம். +புதியது +• P2P இல்லாமல் PeerTube உதவி (#2201) [பீட்டா]: +◦ PeerTube நிகழ்வுகளில் இருந்து வீடியோக்களைப் பார்க்கவும் பதிவிறக்கவும் +◦ முழுமையான PeerTube உலகத்தை அணுக அமைப்புகளில் நிகழ்வுகளைச் சேர்க்கவும் +◦ ஆண்ட்ராய்டு 4.4 மற்றும் 7.1 இல் SSL ஏண்ட்சேக்குகளில் சிக்கல்கள் இருக்கலாம், சில நிகழ்வுகளை அணுகும்போது பிணையப் பிழை ஏற்படலாம். - • பதிவிறக்குபவர் (#2679): - பதிவிறக்கம் பதிவிறக்க ETA ஐக் கணக்கிடுங்கள் - OP OGG ஆக OPUS (WEBM கோப்புகள்) பதிவிறக்கவும் - Pac நீண்ட இடைநிறுத்தத்திற்குப் பிறகு பதிவிறக்கங்களை மீண்டும் தொடங்குவதற்கான காலாவதியான பதிவிறக்க இணைப்புகளை மீட்டெடுக்கவும் +• பதிவிறக்குபவர் (#2679): +◦ பதிவிறக்க ETAஐக் கணக்கிடவும் +◦ ஓபசை (வெப்எம் கோப்புகள்) ogg ஆகப் பதிவிறக்கவும் +◦ நீண்ட இடைநிறுத்தத்திற்குப் பிறகு பதிவிறக்கங்களை மீண்டும் தொடங்க, காலாவதியான பதிவிறக்க இணைப்புகளை மீட்டெடுக்கவும் - மேம்படுத்தப்பட்டது - Contase விருப்பமான உள்ளடக்க நாட்டில் ஏற்படும் மாற்றங்கள் குறித்து கியோச்கிராக்மென்ட்டை அறிந்து கொள்ளுங்கள் மற்றும் அனைத்து முக்கிய தாவல்களின் செயல்திறனை மேம்படுத்தவும் #2742 - Tract பிரித்தெடுத்தல் #2713 இலிருந்து புதிய உள்ளூர்மயமாக்கல் மற்றும் பதிவிறக்க செயலாக்கங்களைப் பயன்படுத்தவும் - • "இயல்புநிலை கியோச்க்" சரத்தை மொழிபெயர்க்கக்கூடியதாக மாற்றவும் - • கருப்பு கருப்பொருள் #2569 க்கான கருப்பு வழிசெலுத்தல் பட்டி +மேம்படுத்தப்பட்டது +• விருப்பமான உள்ளடக்க நாட்டில் ஏற்படும் மாற்றங்கள் குறித்து கியோச்க் ஃபிராக்மென்ட்டுக்கு தெரியப்படுத்தவும் மற்றும் அனைத்து முக்கிய தாவல்களின் செயல்திறனை மேம்படுத்தவும் #2742 +• எக்ச்ட்ராக்டர் #2713 இலிருந்து புதிய உள்ளூர்மயமாக்கல் மற்றும் டவுன்லோடர் செயலாக்கங்களைப் பயன்படுத்தவும் +• "இயல்புநிலை கியோச்க்" சரத்தை மொழிபெயர்க்கலாம் +• கருப்பு கருப்பொருள் #2569க்கான கருப்பு வழிசெலுத்தல் பட்டி - சரி - Pop பாப்அப் பிளேயரை நகர்த்தும்போது பாப்அப் பிளேயரை நகர்த்த முடியாத ஒரு பிழை சரி செய்யப்பட்டது, பாப்அப் பிளேயரை நகர்த்தும்போது #2772 - Allial ஒரு பதிவேற்றியைக் காணாமல் பிளேலிச்ட்களை அனுமதிக்கவும், இந்த சிக்கல் தொடர்பான செயலிழப்புகளை சரிசெய்யவும் #2724, டீம்நியூபைப்/நியூபிபீக்ச்ட்ராக்டர் #219 - And ஆண்ட்ராய்டு 4.4 சாதனங்களில் (API 19/KITKAT) TLS1.1/1.2 ஐ இயக்குதல் TLS ஏண்ட்சேக்கை MEDIACCC மற்றும் சில PEERTUBE நிகழ்வுகள் #2792 - • [சவுண்ட்க்ளூட்] நிலையான கிளையண்ட்_ஐடி பிரித்தெடுத்தல் டீம்நியூபைப்/நியூபிபீக்ச்ட்ராக்டர்#217 - • [சவுண்ட்க்ளூட்] ஆடியோ ச்ட்ரீம் பிரித்தெடுத்தலை சரிசெய்யவும் +சரி செய்யப்பட்டது +• மேல்தோன்றல் பிளேயரை நகர்த்தும்போது மற்றொரு விரலை வைத்தால் மேல்தோன்றல் பிளேயரை நகர்த்த முடியாத பிழை சரி செய்யப்பட்டது #2772 +• பதிவேற்றியவரைக் காணாத பிளேலிச்ட்களை அனுமதிக்கவும் மேலும் இந்தச் சிக்கல் தொடர்பான செயலிழப்புகளைச் சரிசெய்யவும் #2724, TeamNewPipe/NewPipeExtractor#219 +• MediaCCC மற்றும் சில PeerTube நிகழ்வுகளுடன் TLS ஏண்ட்சேக்கை சரிசெய்ய Android 4.4 சாதனங்களில் (API 19/KitKat) TLS1.1/1.2 ஐ இயக்குகிறது #2792 +• [SoundCloud] நிலையான கிளையன்ட்_ஐடி பிரித்தெடுத்தல் TeamNewPipe/NewPipeExtractor#217 +• [SoundCloud] ஆடியோ ச்ட்ரீம் பிரித்தெடுத்தலை சரிசெய்யவும் - வளர்ச்சி - Ex எக்சோப்ளேயரை 2.10.8 #2791, #2816 க்கு புதுப்பிக்கவும் - • கிரேடில் 3.5.1 ஆகப் புதுப்பித்து, கோட்லின் உதவி #2714 ஐச் சேர்க்கவும் +வளர்ச்சி +• ExoPlayer ஐ 2.10.8 #2791, #2816 க்கு புதுப்பிக்கவும் +• Gradleஐ 3.5.1க்கு புதுப்பித்து, Kotlin ஆதரவைச் சேர்க்கவும் #2714 diff --git a/fastlane/metadata/android/ta/changelogs/810.txt b/fastlane/metadata/android/ta/changelogs/810.txt index b4a697b6e7b..205cc5b8e7d 100644 --- a/fastlane/metadata/android/ta/changelogs/810.txt +++ b/fastlane/metadata/android/ta/changelogs/810.txt @@ -1,19 +1,19 @@ -புதியது - The பின்னணியில் விளையாடும்போது பூட்டுத் திரையில் வீடியோ சிறுபடத்தைக் காட்டுங்கள் +புதியது +• பின்னணியில் விளையாடும்போது பூட்டுத் திரையில் வீடியோ சிறுபடத்தைக் காட்டு - மேம்படுத்தப்பட்டது - Fact பின்னணி / பாப்அப் பொத்தானை நீண்ட நேரம் அழுத்தும்போது வரிசைப்படுத்த உள்ளக பிளேலிச்ட்டைச் சேர்க்கவும் - Page முதன்மையான பக்க தாவல்களை உருட்டலாம் மற்றும் ஒரு தாவல் மட்டுமே இருக்கும்போது மறைக்கவும் - Player பின்னணி பிளேயரில் அறிவிப்பு சிறு புதுப்பிப்புகளின் அளவைக் கட்டுப்படுத்துங்கள் - Local வெற்று உள்ளக பிளேலிச்ட்களுக்கு போலி சிறு உருவத்தைச் சேர்க்கவும் - *. - Dopstion பதிவிறக்கம் செய்யப்பட்ட கோப்புகளை நீக்க பொத்தானைச் சேர்க்கவும் அல்லது வரலாற்றை "பதிவிறக்கங்களில்" பதிவிறக்கவும் - • [YouTube] /c /groldened_url சேனல் இணைப்புகளுக்கு ஆதரவைச் சேர்க்கவும் +மேம்படுத்தப்பட்டது +• பின்னணி / மேல்தோன்றல் பட்டனை நீண்ட நேரம் அழுத்தும் போது உள்ளக பிளேலிச்ட்டை வரிசையில் சேர்க்கவும் +• முதன்மையான பக்க தாவல்களை ச்க்ரோல் செய்யக்கூடியதாக மாற்றவும் மற்றும் ஒரே ஒரு தாவல் இருக்கும் போது மறைக்கவும் +• பின்னணி பிளேயரில் அறிவிப்பு சிறுபட புதுப்பிப்புகளின் வரம்பு +• காலியான உள்ளக பிளேலிச்ட்களுக்கு போலி சிறுபடத்தைச் சேர்க்கவும் +• *.webm க்குப் பதிலாக *.opus கோப்பு நீட்டிப்பைப் பயன்படுத்தவும், பதிவிறக்க கீழ்தோன்றும் இடத்தில் "WebM Opus" என்பதற்குப் பதிலாக வடிவமைப்பு லேபிளில் "opus" என்பதைக் காட்டவும் +• "பதிவிறக்கங்களில்" பதிவிறக்கப்பட்ட கோப்புகள் அல்லது பதிவிறக்க வரலாற்றை நீக்க பொத்தானைச் சேர்க்கவும் +• [YouTube] /c/shortened_url சேனல் இணைப்புகளுக்கு ஆதரவைச் சேர்க்கவும் - சரி - புழம்பு நியூ பைப்பிற்கு ஒரு வீடியோவைப் பகிர்ந்துகொண்டு அதன் ச்ட்ரீம்களை நேரடியாக பதிவிறக்கும் போது பல சிக்கல்கள் சரி செய்யப்பட்டன - • நிலையான பிளேயர் அதன் உருவாக்கும் நூலில் இருந்து அணுகல் - • நிலையான தேடல் முடிவு பேசிங் - • [YouTube] NPE ஐ ஏற்படுத்தும் பூச்யத்தில் நிலையான மாறுதல் - • [YouTube] ஒரு Invidio.us முகவரி ஐத் திறக்கும்போது நிலையான பார்வை கருத்துகள் - • [சவுண்ட்க்ளூட்] புதுப்பிக்கப்பட்ட கிளையண்ட்_ஐடி +சரி செய்யப்பட்டது +• நியூபைப்பில் வீடியோவைப் பகிரும்போதும் அதன் ச்ட்ரீம்களை நேரடியாகப் பதிவிறக்கும்போதும் பல சிக்கல்கள் சரி செய்யப்பட்டன +• அதன் உருவாக்கத் தொடரிலிருந்து நிலையான பிளேயர் அணுகல் +• நிலையான தேடல் முடிவு பக்கமாக்கல் +• [YouTube] NPE க்கு காரணமான பூச்யத்தில் மாறுதல் நிலையானது +• [YouTube] invidio.us urlஐத் திறக்கும்போது கருத்துகளைப் பார்ப்பது நிலையானது +• [SoundCloud] updated client_id diff --git a/fastlane/metadata/android/ta/changelogs/840.txt b/fastlane/metadata/android/ta/changelogs/840.txt index 44eed054d94..50f999f871f 100644 --- a/fastlane/metadata/android/ta/changelogs/840.txt +++ b/fastlane/metadata/android/ta/changelogs/840.txt @@ -1,22 +1,22 @@ -புதியது - பயன்பாடு பயன்பாட்டு மொழியை மாற்ற மொழி தேர்வாளரைச் சேர்த்தது - Mally பிளேயர் மடக்கக்கூடிய மெனுவுக்கு கோடி பொத்தானை அனுப்பவும் - Press நீண்ட பத்திரிகையில் கருத்துகளை நகலெடுக்கும் திறன் சேர்க்கப்பட்டது +புதியது +• பயன்பாட்டு மொழியை மாற்ற, மொழி தேர்வி சேர்க்கப்பட்டது +• பிளேயர் மடிக்கக்கூடிய பட்டியலில் 'கோடிக்கு அனுப்பு' பட்டன் சேர்க்கப்பட்டது +• நீண்ட அழுத்தத்தில் கருத்துகளை நகலெடுக்கும் திறன் சேர்க்கப்பட்டது - மேம்படுத்தப்பட்டது - Rececaptaca செயல்பாட்டை சரிசெய்து, பெறப்பட்ட குக்கீகளை சரியாக சேமிக்கவும் - பெறுநர் டி டாட்-மெனுவை அலமாரிக்கு ஆதரவாக மற்றும் மறைக்க வரலாறு பொத்தானை அமைப்புகளில் வாட்ச் வரலாறு இயக்கப்படாதபோது - And ஆண்ட்ராய்டு 6 மற்றும் அதற்குப் பிறகு அமைப்புகளில் மற்ற பயன்பாடுகளின் இசைவு மீது காட்சி கேட்கவும் - Bouk புக்மார்க்கெட் பிராக்மென்ட்டில் நீண்ட காலமாக சொடுக்கு செய்வதன் மூலம் உள்ளக பிளேலிச்ட்டை மறுபெயரிடுங்கள் - Per பல்வேறு PEERTUBE மேம்பாடுகள் - • பல ஆங்கில மூல சரங்களை மேம்படுத்தியது +மேம்படுத்தப்பட்டது +• ReCaptcha செயல்பாட்டைச் சரிசெய்து, பெறப்பட்ட குக்கீகளை சரியாகச் சேமிக்கவும் +• டிராயருக்கு ஆதரவாக புள்ளி-மெனு அகற்றப்பட்டது மற்றும் அமைப்புகளில் பார்வை வரலாறு இயக்கப்படாதபோது வரலாற்றை மறைக்கும் பட்டன் +• ஆண்ட்ராய்டு 6 மற்றும் அதற்குப் பிந்தைய பதிப்பில் உள்ள அமைப்புகளில், பிற ஆப்சைக் காட்ட இசைவு கேட்கவும் +• புத்தகக்குறி ஃபிராக்மென்ட்டில் நீண்ட நேரம் சொடுக்கு செய்வதன் மூலம் உள்ளக பிளேலிச்ட்டின் பெயரை மாற்றவும் +• பல்வேறு PeerTube மேம்பாடுகள் +• பல ஆங்கில மூல சரங்கள் மேம்படுத்தப்பட்டது - சரி - • நிலையான பிளேயர் மீண்டும் தொடங்குகிறது, இருப்பினும் இது "பயன்பாட்டு சுவிட்சைக் குறைத்தல்" இயக்கப்பட்டிருக்கும்போது, புதிய அளவைக் குறைக்கும்போது அது இடைநிறுத்தப்படுகிறது - The சைகைக்கு ஆரம்ப பிரகாச மதிப்பை சரிசெய்யவும் - • நிலையான .SRT வசன பதிவிறக்கங்கள் அனைத்து வரி இடைவெளிகளும் இல்லை - And சில ஆண்ட்ராய்டு 5 சாதனங்கள் CTF இணக்கமானவை அல்ல என்பதால் SD கார்டுக்கு நிலையான பதிவிறக்கம் தோல்வியடைகிறது - And ஆண்ட்ராய்டு Kitkat இல் நிலையான பதிவிறக்குதல் - • நிலையான ஊழல் வீடியோ .mp4 கோப்பு ஆடியோ கோப்பாக அங்கீகரிக்கப்பட்டுள்ளது - சீன மொழி குறியீடுகள் உட்பட பல உள்ளூர்மயமாக்கல் சிக்கல்கள் நிலையானவை - • [YouTube] விளக்கத்தில் உள்ள நேர முத்திரைகள் மீண்டும் சொடுக்கு செய்யக்கூடியவை +சரி செய்யப்பட்டது +• ஃபிக்ச்டு பிளேயர் மீண்டும் தொடங்கும், இருப்பினும் "மினிமைச் ஆன் ஆப் ஆப் ச்விட்ச்" விருப்பம் இயக்கப்பட்டு, நியூபைப் சிறிதாக்கப்பட்டால் அது இடைநிறுத்தப்பட்டது. +• சைகைக்கான ஆரம்ப பிரகாச மதிப்பை சரிசெய்யவும் +• நிலையான .srt வசனப் பதிவிறக்கங்கள் அனைத்து வரி முறிவுகளையும் கொண்டிருக்கவில்லை +• சில Android 5 சாதனங்கள் CTF இணங்காததால் SD கார்டில் நிலையான பதிவிறக்கம் தோல்வியடைந்தது +• ஆண்ட்ராய்டு KitKat இல் பதிவிறக்குவது நிலையானது +• நிலையான சிதைந்த வீடியோ .mp4 கோப்பு ஆடியோ கோப்பாக அங்கீகரிக்கப்படுகிறது +• தவறான சீன மொழி குறியீடுகள் உட்பட பல உள்ளூர்மயமாக்கல் சிக்கல்கள் சரி செய்யப்பட்டன +• [YouTube] விளக்கத்தில் உள்ள நேர முத்திரைகள் மீண்டும் சொடுக்கு செய்யலாம் diff --git a/fastlane/metadata/android/ta/changelogs/900.txt b/fastlane/metadata/android/ta/changelogs/900.txt index 5cd4788ddc6..d2e534eec47 100644 --- a/fastlane/metadata/android/ta/changelogs/900.txt +++ b/fastlane/metadata/android/ta/changelogs/900.txt @@ -1,14 +1,14 @@ -புதியது - • சந்தா குழுக்கள் மற்றும் வரிசைப்படுத்தப்பட்ட ஊட்டங்கள் - • வீரர்களில் முடக்கு பொத்தான் +புதியது +• சந்தா குழுக்கள் மற்றும் வரிசைப்படுத்தப்பட்ட ஊட்டங்கள் +• பிளேயர்களில் முடக்கு பொத்தான் - மேம்படுத்தப்பட்டது - Music இசை.youtube.com மற்றும் media.ccc.de இணைப்புகளை நியூபைப்பில் திறக்க அனுமதிக்கவும் - Settements தோற்றத்திலிருந்து உள்ளடக்கத்திற்கு இரண்டு அமைப்புகளை இடமாற்றம் செய்யுங்கள் - Seecediveditional 5, 15, 25 நொடி தேடு விருப்பங்களை மறைக்கவும். +மேம்படுத்தப்பட்டது +• NewPipe இல் music.youtube.com மற்றும் media.ccc.de இணைப்புகளைத் திறக்க அனுமதிக்கவும் +• தோற்றத்தில் இருந்து உள்ளடக்கத்திற்கு இரண்டு அமைப்புகளை மாற்றவும் +• inexact search இயக்கப்பட்டிருந்தால், 5, 15, 25 second தேடல் விருப்பங்களை மறை - சரி - விரலிடைத் தோல் சில வெப்எம் வீடியோக்கள் தேட முடியாது - And ஆண்ட்ராய்டில் தரவுத்தள காப்புப்பிரதி ப - பதிவிறக்கம் செய்யப்பட்ட கோப்பைப் பகிரும்போது செயலிழப்பு - You டன் யூடியூப் பிரித்தெடுத்தல் சிக்கல் மற்றும் பல ... +சரி செய்யப்பட்டது +• சில WebM வீடியோக்களை தேட முடியாது +• ஆண்ட்ராய்டு P இல் தரவுத்தள காப்புப்பிரதி +• பதிவிறக்கம் செய்யப்பட்ட கோப்பைப் பகிரும்போது செயலிழக்கும் +• டன் YouTube பிரித்தெடுத்தல் சிக்கல் மற்றும் பல ... diff --git a/fastlane/metadata/android/ta/changelogs/930.txt b/fastlane/metadata/android/ta/changelogs/930.txt index 7635500bd87..5cb7a842579 100644 --- a/fastlane/metadata/android/ta/changelogs/930.txt +++ b/fastlane/metadata/android/ta/changelogs/930.txt @@ -1,19 +1,19 @@ -புதியது - You யூடியூப் இசையில் தேடுங்கள் - And அடிப்படை ஆண்ட்ராய்டு டிவி ஆதரவு +புதியது +• YouTube Music இல் தேடவும் +• அடிப்படை ஆண்ட்ராய்டு TV உதவி - மேம்படுத்தப்பட்டது - அனைத்தும் உள்ளக பிளேலிச்ட்டிலிருந்து பார்த்த அனைத்து வீடியோக்களையும் அகற்றும் திறனைச் சேர்த்தது - Contence விபத்துக்கு பதிலாக உள்ளடக்கம் இன்னும் ஆதரிக்கப்படாதபோது செய்தியைக் காட்டு - Pop மேம்பட்ட பாப்அப் பிளேயர் பிஞ்ச் சைகைகளுடன் மறுஅளவிடுகிறது - Sananment சேனலில் பின்னணி மற்றும் பாப்அப் பொத்தான்களில் நீண்ட அழுத்தத்தில் உள்ள ச்ட்ரீம்கள் - Tra டிராயர் தலைப்பு தலைப்பின் மேம்பட்ட அளவு கையாளுதல் +மேம்படுத்தப்பட்டது +• உள்ளக பிளேலிச்ட்டில் இருந்து பார்த்த அனைத்து வீடியோக்களையும் அகற்றும் திறன் சேர்க்கப்பட்டது +• செயலிழப்பதற்குப் பதிலாக உள்ளடக்கம் இன்னும் ஆதரிக்கப்படாதபோது செய்தியைக் காட்டு +• பிஞ்ச் சைகைகள் மூலம் மேம்படுத்தப்பட்ட மேல்தோன்றல் பிளேயர் அளவு +• சேனலில் பின்னணி மற்றும் மேல்தோன்றல் பொத்தான்களில் நீண்ட நேரம் அழுத்தினால் ச்ட்ரீம்களை என்கியூவில் வைக்கவும் +• டிராயர் எடர் தலைப்பின் மேம்படுத்தப்பட்ட அளவு கையாளுதல் - சரி - Age நிலையான அகவை தடைசெய்யப்பட்ட உள்ளடக்க அமைப்பு செயல்படவில்லை - • சில வகையான ரெக்காப்டாக்கள் சரி செய்யப்பட்டன - B புக்மார்க்குகளைத் திறக்கும்போது நிலையான செயலிழப்பு பிளேலிச்ட் `NULL` - பிணையம் பிணையம் தொடர்பான விதிவிலக்குகளின் நிலையான கண்டறிதல் - Sub சந்தாக்கள் துண்டில் குழு வரிசை பொத்தானின் நிலையான தெரிவுநிலை +சரி செய்யப்பட்டது +• நிர்ணயிக்கப்பட்ட அகவை வரம்பிடப்பட்ட உள்ளடக்க அமைப்பு வேலை செய்யவில்லை +• குறிப்பிட்ட வகையான reCAPTCHAகள் சரி செய்யப்பட்டன +• பிளேலிச்ட் `பூச்யமாக' இருக்கும் போது புக்மார்க்குகளைத் திறக்கும்போது நிலையான செயலிழப்பு +• பிணையம் தொடர்பான விதிவிலக்குகளை நிலையான கண்டறிதல் +• சந்தாத் துண்டில் குழு வரிசை பட்டனின் நிலையான தெரிவுநிலை - மேலும் +மேலும் diff --git a/fastlane/metadata/android/ta/changelogs/940.txt b/fastlane/metadata/android/ta/changelogs/940.txt index 738a70d1b71..cea749c098c 100644 --- a/fastlane/metadata/android/ta/changelogs/940.txt +++ b/fastlane/metadata/android/ta/changelogs/940.txt @@ -1,16 +1,16 @@ -புதியது - Chound சவுண்ட்க்ளூட் கருத்துகளுக்கான ஆதரவைச் சேர்க்கவும் - You யூடியூப் தடைசெய்யப்பட்ட பயன்முறை அமைப்பைச் சேர்க்கவும் - The Peretube பெற்றோர் சேனல் விவரங்களைக் காட்டு +புதியது +• SoundCloud கருத்துகளுக்கான ஆதரவைச் சேர்க்கவும் +• YouTube கட்டுப்படுத்தப்பட்ட பயன்முறை அமைப்பைச் சேர்க்கவும் +• PeerTube பெற்றோர் சேனல் விவரங்களைக் காட்டு - மேம்படுத்தப்பட்டது - Surects உதவி சேவைகளுக்கு மட்டுமே கோர் பொத்தானைக் காட்டு - Navigational வழிசெலுத்தல் பார் அல்லது ச்டேட்டச்பாரில் தொடங்கும் பிளேயர் சைகைகள் - Retry பணி வண்ணத்தின் அடிப்படையில் மீண்டும் மீண்டும் மாற்றவும் மற்றும் குழுசேர் பொத்தான்கள் பின்னணி வண்ணம் +மேம்படுத்தப்பட்டது +• ஆதரிக்கப்படும் சேவைகளுக்கு மட்டும் கோர் பட்டனைக் காட்டு +• NavigationBar அல்லது StatusBar இல் தொடங்கும் பிளேயர் சைகைகளைத் தடுக்கவும் +• பணி நிறத்தின் அடிப்படையில் மீண்டும் முயற்சிக்கவும் & குழுசேரவும் பொத்தான்களின் பின்னணி நிறத்தை மாற்றவும் - சரி - The பதிவிறக்கம் உரையாடல் முடக்கம் சரிசெய்யவும் - • உலாவி பொத்தானைத் திறக்கவும் இப்போது உலாவியில் உண்மையில் திறக்கிறது - வீடியோக்களைத் திறப்பதில் விபத்தை சரிசெய்யவும், "இந்த ச்ட்ரீமை இயக்க முடியவில்லை" +சரி செய்யப்பட்டது +• பதிவிறக்க உரையாடல் முடக்கத்தை சரிசெய்யவும் +• உலாவியில் திற பொத்தான் இப்போது உண்மையில் உலாவியில் திறக்கும் +• வீடியோக்களைத் திறப்பதில் ஏற்படும் செயலிழப்பு மற்றும் "இந்த ச்ட்ரீமை இயக்க முடியவில்லை" - மேலும் +மேலும் diff --git a/fastlane/metadata/android/ta/changelogs/951.txt b/fastlane/metadata/android/ta/changelogs/951.txt index 5059ce78a94..edb9c6c74a7 100644 --- a/fastlane/metadata/android/ta/changelogs/951.txt +++ b/fastlane/metadata/android/ta/changelogs/951.txt @@ -1,17 +1,17 @@ -புதியது - குழு ஊட்டக் குழு உரையாடலில் சந்தா தேர்வாளருக்கான தேடலைச் சேர்க்கவும் - குழு குழுவாகக் காட்ட ஊட்டக் குழு உரையாடலில் வடிகட்டியைச் சேர்க்கவும் - Page முதன்மையான பக்கத்தில் பிளேலிச்ட் தாவலைச் சேர்க்கவும் - Pact பின்னணி/பாப்-அப் பிளேயர் வரிசையில் வேகமாக முன்னோக்கி/முன்னாடி - தேடல் தேடல் ஆலோசனையைக் காண்பி: நீங்கள் சொல்வது மற்றும் முடிவைக் காட்டினீர்களா? +புதியது +• ஊட்டக் குழு உரையாடலில் சந்தா தேர்விக்கான தேடலைச் சேர்க்கவும் +• தொகுக்கப்படாத சந்தாக்களை மட்டும் காட்ட ஊட்டக் குழு உரையாடலில் வடிப்பானைச் சேர்க்கவும் +• முதன்மைப் பக்கத்தில் பிளேலிச்ட் தாவலைச் சேர்க்கவும் +• பின்னணி/பாப்-அப் பிளேயர் வரிசையில் வேகமாக முன்னோக்கி/ரீவைண்ட் +• தேடல் பரிந்துரையைக் காட்டு: அதற்கான முடிவைக் காட்டுகிறீர்களா? - மேம்படுத்தப்பட்டது - Application மக்சட் கோப்புகளில் பயன்பாட்டு மெட்டாடேட்டாவை எழுதுவதை விடுங்கள் - தோல்வியுற்ற நீரோடைகளை வரிசையில் இருந்து அகற்ற வேண்டாம் - பெறுநர் கருவிப்பட்டி வண்ணத்துடன் பொருந்தக்கூடிய நிலை பட்டி வண்ணத்தைப் புதுப்பிக்கவும் +மேம்படுத்தப்பட்டது +• கலவையான கோப்புகளில் பயன்பாட்டு மெட்டாடேட்டாவை எழுதுவதை கைவிடவும் +• தோல்வியுற்ற ச்ட்ரீம்களை வரிசையில் இருந்து அகற்ற வேண்டாம் +• கருவிப்பட்டியின் நிறத்துடன் பொருந்த, நிலைப் பட்டியின் நிறத்தைப் புதுப்பிக்கவும் - சரி - • மிதக்கும் புள்ளி ஒட்டுமொத்த பிழைகள் காரணமாக நிலையான ஆடியோ/வீடியோ டிசின்க் - • [PEERTUBE] நீக்கப்பட்ட கருத்துகளைக் கையாளவும் +சரி செய்யப்பட்டது +• ஃப்ளோட்டிங் பாயின்ட் க்யூமுலேட்டிவ் பிழைகளால் ஏற்படும் நிலையான ஆடியோ/வீடியோ ஒத்திசைவு +• [PeerTube] நீக்கப்பட்ட கருத்துகளைக் கையாளவும் - மேலும் +மேலும் diff --git a/fastlane/metadata/android/ta/changelogs/954.txt b/fastlane/metadata/android/ta/changelogs/954.txt index 5943b457e34..c902e7a5b89 100644 --- a/fastlane/metadata/android/ta/changelogs/954.txt +++ b/fastlane/metadata/android/ta/changelogs/954.txt @@ -1,9 +1,9 @@ -Applic புதிய பயன்பாட்டு பணிப்பாய்வு: விவரம் பக்கத்தில் வீடியோக்களை இயக்கவும், பிளேயரைக் குறைக்க ச்வைப் செய்யவும் - • மீடியாச்டைல் அறிவிப்புகள்: அறிவிப்புகள், செயல்திறன் மேம்பாடுகள் ஆகியவற்றில் தனிப்பயனாக்கக்கூடிய செயல்கள் - பூச்சி டெச்க்டாப் பயன்பாடாக நியூபிப்பைப் பயன்படுத்தும் போது அடிப்படை மறுஅளவிடுதல் +• புதிய பயன்பாட்டுப் பணிப்பாய்வு: விவரப் பக்கத்தில் வீடியோக்களை இயக்கவும், பிளேயரைக் குறைக்க கீழே ச்வைப் செய்யவும் +• MediaStyle அறிவிப்புகள்: அறிவிப்புகளில் தனிப்பயனாக்கக்கூடிய செயல்கள், செயல்திறன் மேம்பாடுகள் +• டெச்க்டாப் பயன்பாடாக NewPipe ஐப் பயன்படுத்தும் போது அடிப்படை மறுஅளவிடுதல் - ஆதரிக்கப்படாத முகவரி சிற்றுண்டி விசயத்தில் திறந்த விருப்பங்களுடன் உரையாடலைக் காட்டு - Re தொலைதூரங்களை பெற முடியாதபோது தேடல் பரிந்துரை அனுபவத்தை மேம்படுத்தவும் - இயல்புநிலை இயல்புநிலை வீடியோ தகுதி 720p60 (பயன்பாட்டில் உள்ள பிளேயர்) மற்றும் 480p (பாப்-அப் பிளேயர்) ஆக அதிகரித்தது +• ஆதரிக்கப்படாத URL டோச்ட்டின் போது திறந்த விருப்பங்களுடன் உரையாடலைக் காட்டு +• தொலைவில் உள்ளவற்றைப் பெற முடியாதபோது, தேடல் பரிந்துரை அனுபவத்தை மேம்படுத்தவும் +• இயல்புநிலை வீடியோ தகுதி 720p60 (இன்-ஆப் பிளேயர்) மற்றும் 480p (பாப்-அப் பிளேயர்) ஆக அதிகரிக்கப்பட்டது - • டன் பிழை திருத்தங்கள் மற்றும் பல +• பல பிழை திருத்தங்கள் மற்றும் பல diff --git a/fastlane/metadata/android/ta/changelogs/957.txt b/fastlane/metadata/android/ta/changelogs/957.txt index 3b4c1ea7e2b..c9e57658dd9 100644 --- a/fastlane/metadata/android/ta/changelogs/957.txt +++ b/fastlane/metadata/android/ta/changelogs/957.txt @@ -1,10 +1,10 @@ -என் குறிப்பிட்ட enqueue செயல்களை ஒன்றில் ஒன்றிணைக்கவும் - Player வீரரை மூடி இரண்டு விரல் சைகை - Rec ரெகாப்ட்சா குக்கீகளை அழிக்க அனுமதிக்கவும் - அறிவிப்பை வண்ணமயமாக்காத விருப்பம் - புதிய நியூபைப் மற்றும் பிற முரண்பாடுகளைப் பகிரும்போது எல்லையற்ற இடையக, தரமற்ற நடத்தை ஆகியவற்றை சரிசெய்ய வீடியோ விவரங்கள் எவ்வாறு திறக்கப்படுகின்றன என்பதை மேம்படுத்தவும் - You யூடியூப் வீடியோக்களை விரைவுபடுத்தி, அகவை தடைசெய்யப்பட்டவற்றை சரிசெய்யவும் - Ford வேகமான முன்னோக்கி/முன்னோடிகளில் செயலிழப்பை சரிசெய்யவும் - Promang சிறு உருவங்களை இழுப்பதன் மூலம் பட்டியல்களை மறுசீரமைக்க வேண்டாம் - Pop எப்போதும் பாப்அப் பண்புகளை நினைவில் கொள்ளுங்கள் - Sandandali மொழியைச் சேர்க்கவும் +• குறிப்பிட்ட வரிசை செயல்களை ஒன்றாக இணைக்கவும் +• பிளேயரை மூட இரண்டு விரல் சைகை +• reCAPTCHA குக்கீகளை அழிக்க அனுமதிக்கவும் +• அறிவிப்பை வண்ணமாக்காத விருப்பம் +• நியூபைப்பில் பகிரும் போது எல்லையற்ற பஃபரிங், தரமற்ற நடத்தை மற்றும் பிற முரண்பாடுகளை சரிசெய்ய வீடியோ விவரங்கள் எவ்வாறு திறக்கப்படுகின்றன என்பதை மேம்படுத்தவும் +• YouTube வீடியோக்களை விரைவுபடுத்துங்கள் மற்றும் அகவை வரம்புக்குட்பட்டவற்றை சரிசெய்யவும் +• வேகமாக முன்னோக்கி/முன்னோக்கிச் செல்லும் போது செயலிழப்பை சரிசெய்யவும் +• சிறுபடங்களை இழுத்து பட்டியல்களை மறுசீரமைக்க வேண்டாம் +• மேல்தோன்றல் பண்புகளை எப்போதும் நினைவில் கொள்ளுங்கள் +• சந்தாலி மொழியைச் சேர்க்கவும் diff --git a/fastlane/metadata/android/ta/changelogs/958.txt b/fastlane/metadata/android/ta/changelogs/958.txt index 6d9b9e041ea..71f673627f9 100644 --- a/fastlane/metadata/android/ta/changelogs/958.txt +++ b/fastlane/metadata/android/ta/changelogs/958.txt @@ -1,15 +1,15 @@ -புதிய மற்றும் மேம்பட்ட: - The பூட்டுத் திரையில் சிறுபடத்தை மறைக்க மீண்டும் சேர்க்கப்பட்ட விருப்பம் - தீவனம் தீவனத்தை புதுப்பிக்க இழுக்கவும் - Lical உள்ளக பட்டியல்களைப் பெறும்போது மேம்பட்ட செயல்திறன் +புதியது மற்றும் மேம்படுத்தப்பட்டது: +• பூட்டுத் திரையில் சிறுபடத்தை மறைக்க விருப்பம் மீண்டும் சேர்க்கப்பட்டது +• ஊட்டத்தைப் புதுப்பிக்க இழுக்கவும் +• உள்ளக பட்டியல்களைப் பெறும்போது மேம்படுத்தப்பட்ட செயல்திறன் - சரி: - Bipe நியூபைப் ராமில் இருந்து அகற்றப்பட்ட பிறகு அதைத் தொடங்கும்போது நிலையான செயலிழப்பு - இணைய இணைப்பு இல்லாதபோது தொடக்கத்தில் நிலையான செயலிழப்பு - • நிலையான மரியாதைக்குரிய பிரகாசம்- மற்றும் தொகுதி-குறிப்பிட்ட அமைப்புகள் - • [YouTube] நிலையான நீண்ட பிளேலிச்ட்கள் +சரி செய்யப்பட்டது: +• RAM இலிருந்து அகற்றப்பட்ட பிறகு NewPipe ஐத் தொடங்கும் போது நிலையான செயலிழப்பு +• இணைய இணைப்பு இல்லாதபோது தொடக்கத்தில் நிலையான செயலிழப்பு +• ஒளி மற்றும் வால்யூம் சைகை அமைப்புகளைப் பொறுத்து சரி செய்யப்பட்டது +• [YouTube] நிலையான நீண்ட பிளேலிச்ட்கள் - மற்றவை: - • குறியீடு தூய்மைப்படுத்தல் மற்றும் பல உள் மேம்பாடுகள் - • சார்பு புதுப்பிப்புகள் - • மொழிபெயர்ப்பு புதுப்பிப்புகள் +மற்றவை: +• குறியீடு தூய்மை மற்றும் பல உள் மேம்பாடுகள் +• சார்பு மேம்படுத்தல்கள் +• மொழிபெயர்ப்பு புதுப்பிப்புகள் diff --git a/fastlane/metadata/android/ta/changelogs/964.txt b/fastlane/metadata/android/ta/changelogs/964.txt index da068f948e8..be6de6f0615 100644 --- a/fastlane/metadata/android/ta/changelogs/964.txt +++ b/fastlane/metadata/android/ta/changelogs/964.txt @@ -1,8 +1,8 @@ -Player பிளேயர் கட்டுப்பாடுகளில் அத்தியாயங்களுக்கான உதவி சேர்க்கப்பட்டது - • [PEERTUBE] செபியா தேடலைச் சேர்த்தது - Wideed வீடியோ விவரம் பார்வையில் மீண்டும் சேர்க்கப்பட்ட பகிர்வு பொத்தானை மற்றும் ச்ட்ரீம் விளக்கத்தை தாவல் தளவமைப்பில் நகர்த்தியது - • ஒளி சைகை முடக்கப்பட்டிருந்தால் பிரகாசத்தை மீட்டெடுப்பதை முடக்கு - கோடியில் வீடியோவை இயக்க பட்டியல் உருப்படியைச் சேர்த்தது - Star சில சாதனங்களில் இயல்புநிலை உலாவி அமைக்கப்படும்போது நிலையான செயலிழப்பு மற்றும் பங்கு உரையாடல்களை மேம்படுத்தவும் - Full முழு அளவிலான பிளேயரில் வன்பொருள் விண்வெளி பொத்தானைக் கொண்டு நாடகம்/இடைநிறுத்துங்கள் - • [Media.ccc.de] பல்வேறு திருத்தங்கள் மற்றும் மேம்பாடுகள் +• பிளேயர் கட்டுப்பாடுகளில் அத்தியாயங்களுக்கான உதவி சேர்க்கப்பட்டது +• [PeerTube] Sepia தேடல் சேர்க்கப்பட்டது +• வீடியோ விவரக் காட்சியில் பகிர்வு பொத்தான் மீண்டும் சேர்க்கப்பட்டு, தாவல் தளவமைப்பிற்கு ச்ட்ரீம் விளக்கம் நகர்த்தப்பட்டது +• ஒளி சைகை முடக்கப்பட்டிருந்தால், பிரகாசத்தை மீட்டெடுப்பதை முடக்கவும் +• கோடியில் வீடியோவை இயக்க பட்டியல் உருப்படி சேர்க்கப்பட்டது +• சில சாதனங்களில் இயல்புநிலை உலாவி அமைக்கப்படாதபோது நிலையான செயலிழப்பு மற்றும் பகிர்வு உரையாடல்களை மேம்படுத்தலாம் +• முழுத்திரை பிளேயரில் ஆர்டுவேர் ச்பேச் பட்டன் மூலம் பிளே/இடைநிறுத்தத்தை நிலைமாற்று +• [media.ccc.de] பல்வேறு திருத்தங்கள் மற்றும் மேம்பாடுகள் diff --git a/fastlane/metadata/android/ta/changelogs/966.txt b/fastlane/metadata/android/ta/changelogs/966.txt index e7f22ff4411..6e1ca232244 100644 --- a/fastlane/metadata/android/ta/changelogs/966.txt +++ b/fastlane/metadata/android/ta/changelogs/966.txt @@ -1,14 +1,14 @@ -புதியது: - பணி ஒரு புதிய சேவையைச் சேர்க்கவும்: பேண்ட்கேம்ப் +புதிய: +• புதிய சேவையைச் சேர்க்கவும்: Bandcamp - மேம்படுத்தப்பட்டது: - பயன்பாடு பயன்பாட்டைப் பெற ஒரு விருப்பத்தைச் சேர்க்கவும் சாதனத்தின் கருப்பொருளைப் பின்தொடரவும் - Ever மேம்பட்ட பிழை பேனலைக் காண்பிப்பதன் மூலம் சில செயலிழப்புகளைத் தடுக்கவும் - Contentance கிடைக்காத உள்ளடக்கம் ஏன் பற்றிய கூடுதல் தகவலைக் காட்டுங்கள் - • வன்பொருள் விண்வெளி பொத்தான் விளையாட்டு/இடைநிறுத்தத்தைத் தூண்டுகிறது - பெறுநர் சிற்றுண்டி "பதிவிறக்கம்" சிற்றுண்டியைக் காட்டு +மேம்படுத்தப்பட்டது: +• சாதனத்தின் கருப்பொருளை ஆப்சைப் பின்பற்றுவதற்கான விருப்பத்தைச் சேர்க்கவும் +• மேம்படுத்தப்பட்ட பிழை பேனலைக் காண்பிப்பதன் மூலம் சில செயலிழப்புகளைத் தடுக்கவும் +• உள்ளடக்கம் ஏன் கிடைக்கவில்லை என்பது பற்றிய கூடுதல் தகவலைக் காட்டு +• ஆர்டுவேர் ச்பேச் பட்டன் பிளே/இடைநிறுத்தத்தை தூண்டுகிறது +• "பதிவிறக்கம் தொடங்கியது" டோச்ட்டைக் காட்டு - சரி: - The பின்னணியில் விளையாடும்போது வீடியோ விவரங்களில் மிகச் சிறிய சிறுபடத்தை சரிசெய்யவும் - The குறைக்கப்பட்ட பிளேயரில் வெற்று தலைப்பை சரிசெய்யவும் - Rest கடைசி மறுசீரமைப்பு பயன்முறையை சரியாக மீட்டெடுக்கவில்லை +சரி செய்யப்பட்டது: +• பின்னணியில் விளையாடும் போது வீடியோ விவரங்களில் மிகச் சிறிய சிறுபடத்தைச் சரிசெய்யவும் +• குறைக்கப்பட்ட பிளேயரில் வெற்று தலைப்பை சரிசெய்யவும் +• சரியாக மீட்டெடுக்கப்படாத கடைசி மறுஅளவிடுதல் பயன்முறையைச் சரிசெய்யவும் diff --git a/fastlane/metadata/android/ta/changelogs/969.txt b/fastlane/metadata/android/ta/changelogs/969.txt index 93e0a695db2..e1496df7c16 100644 --- a/fastlane/metadata/android/ta/changelogs/969.txt +++ b/fastlane/metadata/android/ta/changelogs/969.txt @@ -1,8 +1,8 @@ -Storage வெளிப்புற சேமிப்பகத்தில் நிறுவலை அனுமதிக்கவும் - • [பேண்ட்கேம்ப்] முதல் மூன்று கருத்துகளை ச்ட்ரீமில் காண்பிப்பதற்கான ஆதரவைச் சேர்த்தது - பதிவிறக்கம் பதிவிறக்கம் தொடங்கும் போது 'பதிவிறக்கம் தொடங்கியது' சிற்றுண்டியைக் காட்டுங்கள் - Cook குக்கீ சேமிக்கப்படாதபோது ரெக்காப்ட்சா குக்கீயை அமைக்க வேண்டாம் - • [பிளேயர்] கேச் செயல்திறனை மேம்படுத்தவும் - • [பிளேயர்] நிலையான பிளேயர் தானாகவே விளையாடுவதில்லை - பதிவிறக்கம் பதிவிறக்கங்களை நீக்கும்போது முந்தைய சிற்றுண்டிகளை நிராகரிக்கவும் - • பட்டியலில் இல்லாத பொருளை நீக்க முயற்சித்தது +• வெளிப்புற சேமிப்பகத்தில் நிறுவலை அனுமதிக்கவும் +• [Bandcamp] ச்ட்ரீமில் முதல் மூன்று கருத்துகளைக் காண்பிப்பதற்கான உதவி சேர்க்கப்பட்டது +• பதிவிறக்கம் தொடங்கும் போது 'பதிவிறக்கம் தொடங்கியது' டோச்ட்டை மட்டும் காட்டவும் +• குக்கீகள் சேமிக்கப்படாதபோது reCaptcha குக்கீயை அமைக்க வேண்டாம் +• [பிளேயர்] கேச் செயல்திறனை மேம்படுத்தவும் +• [பிளேயர்] நிலையான பிளேயர் தானாகவே விளையாடுவதில்லை +• பதிவிறக்கங்களை நீக்கும் போது முந்தைய ச்நாக்பார்களை நிராகரிக்கவும் +• பட்டியலில் இல்லாத பொருளை நீக்க முயற்சிப்பது சரி செய்யப்பட்டது diff --git a/fastlane/metadata/android/ta/changelogs/970.txt b/fastlane/metadata/android/ta/changelogs/970.txt index 6db5c681014..c3b3e414742 100644 --- a/fastlane/metadata/android/ta/changelogs/970.txt +++ b/fastlane/metadata/android/ta/changelogs/970.txt @@ -1,11 +1,11 @@ -புதியது - Met உள்ளடக்க மெட்டாடேட்டாவைக் காண்பி (குறிச்சொற்கள், வகைகள், உரிமம், ...) விளக்கத்திற்கு கீழே - (தொலைநிலை (உள்ளூர் அல்லாத) பிளேலிச்ட்களில் "சேனல் விவரங்களைக் காட்டு" விருப்பத்தை சேர்த்தது - Lang நீண்ட அழுத்த பட்டியலில் "உலாவியில் திறக்கவும்" விருப்பத்தை சேர்க்கவும் +புதியது +• விளக்கத்திற்குக் கீழே உள்ளடக்க மெட்டாடேட்டாவை (குறிச்சொற்கள், வகைகள், உரிமம், ...) காட்டு +• ரிமோட் (உள்ளூர் அல்லாத) பிளேலிச்ட்களில் "சேனல் விவரங்களைக் காட்டு" விருப்பம் சேர்க்கப்பட்டது +• பட்டியலில் "உலாவியில் திற" விருப்பம் சேர்க்கப்பட்டது - சரி - ஒளிதோற்றம் வீடியோ விவரம் பக்கத்தில் நிலையான சுழற்சி செயலிழப்பு - • நிலையான "கோடி உடன் விளையாடுங்கள்" பொத்தானை பிளேயரில் எப்போதும் கோரை நிறுவத் தூண்டுகிறது - • நிலையான மற்றும் மேம்படுத்தப்பட்ட அமைப்பு இறக்குமதி மற்றும் ஏற்றுமதி பாதைகள் - • [YouTube] எண்ணிக்கை போன்ற நிலையான கருத்து - மேலும் பல +சரி செய்யப்பட்டது +• வீடியோ விவரம் பக்கத்தில் நிலையான சுழற்சி செயலிழப்பு +• பிளேயரில் நிலையான "கோடியுடன் விளையாடு" பொத்தான் எப்போதும் கோரை நிறுவும்படி கேட்கும் +• நிலையான மற்றும் மேம்படுத்தப்பட்ட அமைப்பு இறக்குமதி மற்றும் ஏற்றுமதி பாதைகள் +• [YouTube] எண்ணிக்கை போன்ற நிலையான கருத்து +மேலும் பல diff --git a/fastlane/metadata/android/ta/changelogs/972.txt b/fastlane/metadata/android/ta/changelogs/972.txt index e89986f6a99..30f6ef86f44 100644 --- a/fastlane/metadata/android/ta/changelogs/972.txt +++ b/fastlane/metadata/android/ta/changelogs/972.txt @@ -1,14 +1,14 @@ -புதியது - நேர முத்திரைகள் மற்றும் ஏச்டேக்குகளை விளக்கத்தில் அங்கீகரிக்கவும் - கையேடு டேப்லெட் பயன்முறை அமைப்பு சேர்க்கப்பட்டது - ஒரு ஊட்டத்தில் விளையாடிய பொருட்களை மறைக்கும் திறன் சேர்க்கப்பட்டது +புதியது +விளக்கத்தில் நேர முத்திரைகள் மற்றும் ஏச்டேக்குகளை அங்கீகரிக்கவும் +கைமுறை டேப்லெட் பயன்முறை அமைப்பு சேர்க்கப்பட்டது +விளையாடிய பொருட்களை ஊட்டத்தில் மறைக்கும் திறன் சேர்க்கப்பட்டது - மேம்படுத்தப்பட்டது - சேமிப்பக அணுகல் கட்டமைப்பை சரியாக ஆதரிக்கவும் - கிடைக்காத மற்றும் நிறுத்தப்பட்ட சேனல்களின் சிறந்த பிழை - ஆண்ட்ராய்டு 10+ பயனர்களுக்கான ஆண்ட்ராய்டு பகிர்வு தாள் இப்போது உள்ளடக்க தலைப்பைக் காட்டுகிறது. - புதுப்பிக்கப்பட்ட நிகழ்வுகள் மற்றும் குழாய் இணைப்புகளை ஆதரிக்கின்றன. +மேம்படுத்தப்பட்டது +சேமிப்பக அணுகல் கட்டமைப்பை சரியாக ஆதரிக்கவும் +கிடைக்காத மற்றும் நிறுத்தப்பட்ட சேனல்களின் சிறந்த பிழை கையாளுதல் +Android 10+ பயனர்களுக்கான ஆண்ட்ராய்டு பகிர்வுத் தாள் இப்போது உள்ளடக்கத் தலைப்பைக் காட்டுகிறது. +இன்வைடியச் நிகழ்வுகள் மற்றும் உதவி பைப் இணைப்புகள் புதுப்பிக்கப்பட்டன. - சரி - [YouTube] அகவை தடைசெய்யப்பட்ட உள்ளடக்கம் - தேர்வு உரையாடலைத் திறக்கும்போது கசிந்த சாளர விதிவிலக்கைத் தடுக்கவும் +சரி செய்யப்பட்டது +[YouTube] அகவை வரம்பிடப்பட்ட உள்ளடக்கம் +தேர்வு உரையாடலைத் திறக்கும்போது கசிந்த சாளர விதிவிலக்கைத் தடுக்கவும் diff --git a/fastlane/metadata/android/ta/changelogs/975.txt b/fastlane/metadata/android/ta/changelogs/975.txt index 30cef49657a..fa19c8dbc61 100644 --- a/fastlane/metadata/android/ta/changelogs/975.txt +++ b/fastlane/metadata/android/ta/changelogs/975.txt @@ -1,17 +1,17 @@ -புதியது - Sting தேடும் போது சிறு முன்னோட்டத்தைக் காட்டு - Abable ஊனமுற்ற கருத்துகளைக் கண்டறிதல் - தீவனம் பார்த்தபடி தீவன உருப்படியைக் குறிக்க அனுமதிக்கவும் - The கருத்து இதயங்களைக் காட்டு +புதியது +• தேடும் போது சிறுபட மாதிரிக்காட்சியைக் காட்டு +• முடக்கப்பட்ட கருத்துகளைக் கண்டறியவும் +• ஊட்டப் பொருளைப் பார்த்ததாகக் குறிக்க அனுமதிக்கவும் +• கருத்து இதயங்களைக் காட்டு - மேம்படுத்தப்பட்டது - Met மேனிலை தரவு மற்றும் குறிச்சொற்கள் தளவமைப்பை மேம்படுத்தவும் - உ இடைமுகம் கூறுகளுக்கு பணி வண்ணத்தைப் பயன்படுத்துங்கள் +மேம்படுத்தப்பட்டது +• மேனிலை தரவு மற்றும் குறிச்சொற்களின் தளவமைப்பை மேம்படுத்தவும் +• இடைமுகம் கூறுகளுக்கு பணி வண்ணத்தைப் பயன்படுத்துங்கள் - சரி - Min மினி பிளேயரில் சிறு உருவத்தை சரிசெய்யவும் - The நகல் வரிசை உருப்படிகளில் முடிவற்ற இடையகத்தை சரிசெய்யவும் - Player சில பிளேயர் சுழற்சி மற்றும் வேகமாக மூடுவது போன்ற திருத்தங்கள் - • பின்னணியில் ஏற்றப்பட்ட மீதமுள்ள ரெக்காப்ட்சாவை சரிசெய்யவும் - தீவனம் ஊட்டத்தை புதுப்பிக்கும்போது கிளிக்குகளை முடக்கு - பதிவிறக்கம் சில பதிவிறக்க செயலிழப்புகளை சரிசெய்யவும் +சரி செய்யப்பட்டது +• மினி பிளேயரில் சிறுபடத்தை சரிசெய்யவும் +• நகல் வரிசை உருப்படிகளில் முடிவற்ற இடையகத்தை சரிசெய்யவும் +• சுழற்சி மற்றும் வேகமாக மூடுவது போன்ற சில பிளேயர் திருத்தங்கள் +• பின்னணியில் மீதமுள்ள ReCAPTCHA ஐ சரிசெய்யவும் +• ஊட்டத்தைப் புதுப்பிக்கும்போது கிளிக்குகளை முடக்கவும் +• சில டவுன்லோடர் செயலிழப்புகளை சரிசெய்யவும் diff --git a/fastlane/metadata/android/ta/changelogs/976.txt b/fastlane/metadata/android/ta/changelogs/976.txt index fa27c4036f9..d6644fea812 100644 --- a/fastlane/metadata/android/ta/changelogs/976.txt +++ b/fastlane/metadata/android/ta/changelogs/976.txt @@ -1,10 +1,10 @@ -Full முழு திரையில் நேரடியாக பிளேயரைத் திறக்க விருப்பம் சேர்க்கப்பட்டது - தேடல் எந்த வகையான தேடல் பரிந்துரைகளைக் காட்ட வேண்டும் என்பதைத் தேர்ந்தெடுக்க அனுமதிக்கவும் - • இருண்ட கருப்பொருள் இப்போது இருண்ட + இருண்ட ச்பிளாச் திரை சேர்க்கப்பட்டது - Un தேவையற்ற கோப்புகளை சாம்பல் நிறமாக்குவதற்கு மேம்படுத்தப்பட்ட கோப்பு பிக்கர் - You நிலையான இறக்குமதி YouTube சந்தாக்கள் - • ச்ட்ரீம் மீண்டும் இயக்க மீண்டும் மறுதொடக்கம் பொத்தானைத் தட்டவும் தேவைப்படுகிறது - Auldion நிலையான இறுதி ஆடியோ அமர்வு - • [Android TV] DPAD ஐப் பயன்படுத்தும் போது நிலையான நீண்ட சீக்பார் தாவல்கள் +• பிளேயரை முழுத்திரையில் நேரடியாகத் திறக்க விருப்பம் சேர்க்கப்பட்டது +• எந்த வகையான தேடல் பரிந்துரைகளைக் காட்ட வேண்டும் என்பதைத் தேர்ந்தெடுக்க அனுமதிக்கவும் +• டார்க் கருப்பொருள் இப்போது டார்க் + டார்க் ச்பிளாச் திரை சேர்க்கப்பட்டது +• தேவையற்ற கோப்புகளை சாம்பல் நிறமாக்க மேம்படுத்தப்பட்ட கோப்பு தேர்வி +• YouTube சந்தாக்களை இறக்குமதி செய்வது சரி செய்யப்பட்டது +• ச்ட்ரீமை மீண்டும் இயக்க, ரீப்ளே பட்டனை மீண்டும் தட்ட வேண்டும் +• நிலையான நிறைவு ஆடியோ அமர்வு +• [Android TV] DPad ஐப் பயன்படுத்தும் போது நிலையான நீண்ட சீக்பார் சம்ப்கள் - மேலும் மாற்றங்களைக் காண, கீழேயுள்ள இணைப்புகள் தாவலில் இருந்து சேஞ்ச்லாக் (மற்றும் வலைப்பதிவு இடுகை) காண்க. +மேலும் மாற்றங்களைப் பார்க்க, கீழே உள்ள இணைப்புகள் தாவலில் இருந்து சேஞ்ச்லாக் (மற்றும் வலைப்பதிவு இடுகை) பார்க்கவும். diff --git a/fastlane/metadata/android/ta/changelogs/977.txt b/fastlane/metadata/android/ta/changelogs/977.txt index 9c4aba10fdf..3cc1a787329 100644 --- a/fastlane/metadata/android/ta/changelogs/977.txt +++ b/fastlane/metadata/android/ta/changelogs/977.txt @@ -1,10 +1,10 @@ -Press நீண்ட அழுத்த பட்டியலில் "அடுத்து விளையாடுங்கள்" பொத்தானைச் சேர்த்துள்ளார் - You நோக்கம் வடிப்பானில் யூடியூப் சார்ட்ச் பாதை முன்னொட்டு சேர்க்கப்பட்டது - • நிலையான அமைப்புகள் இறக்குமதி - The வரிசை திரையில் பிளேயர் பொத்தான்களுடன் ச்வாப் சீக்பார் நிலையை மாற்றவும் - Metiase மீடியாசெசன் மேனேசர் தொடர்பான பல்வேறு திருத்தங்கள் - Videed வீடியோ முடிவுக்குப் பிறகு நிலையான சீக்பார் முடிக்கப்படவில்லை - Re ரியல் டெக்டிவியில் மீடியா சுரங்கப்பாதை - • விரிவாக்கப்பட்ட குறைக்கப்பட்ட பிளேயர் பொத்தான்கள் சொடுக்கு செய்யக்கூடிய பகுதி +• நீண்ட அழுத்த பட்டியலில் "அடுத்து விளையாடு" பொத்தான் சேர்க்கப்பட்டது +• யூடியூப் சார்ட்ச் பாதை முன்னொட்டு இன்டென்ட் ஃபில்டரில் சேர்க்கப்பட்டது +• நிலையான அமைப்புகள் இறக்குமதி +• வரிசை திரையில் பிளேயர் பட்டன்களுடன் சீக்பார் நிலையை மாற்றவும் +• MediasessionManager தொடர்பான பல்வேறு திருத்தங்கள் +• வீடியோ முடிந்த பிறகு நிலையான சீக்பார் முடிக்கப்படவில்லை +• RealtekATV இல் முடக்கப்பட்ட மீடியா டன்னலிங் +• விரிவாக்கப்பட்ட குறைக்கப்பட்ட பிளேயர் பொத்தான்கள் சொடுக்கு செய்யக்கூடிய பகுதி - மேலும் மாற்றங்களைக் காண, கீழேயுள்ள இணைப்புகள் தாவலில் இருந்து சேஞ்ச்லாக் (மற்றும் வலைப்பதிவு இடுகை) காண்க. +மேலும் மாற்றங்களைப் பார்க்க, கீழே உள்ள இணைப்புகள் தாவலில் இருந்து சேஞ்ச்லாக் (மற்றும் வலைப்பதிவு இடுகை) பார்க்கவும். diff --git a/fastlane/metadata/android/ta/changelogs/980.txt b/fastlane/metadata/android/ta/changelogs/980.txt index 3c5d3864746..482d345f4e9 100644 --- a/fastlane/metadata/android/ta/changelogs/980.txt +++ b/fastlane/metadata/android/ta/changelogs/980.txt @@ -1,13 +1,13 @@ -புதியது - Men மெனுவைப் பகிர "பிளேலிச்ட்டில் சேர்" விருப்பத்தை சேர்க்கப்பட்டது - 2 Y2U.BE மற்றும் PEERTUBE குறுகிய இணைப்புகளுக்கான உதவி சேர்க்கப்பட்டது +புதியது +• மெனுவைப் பகிர "பிளேலிச்ட்டில் சேர்" விருப்பம் சேர்க்கப்பட்டது +• y2u.be மற்றும் PeerTube குறுகிய இணைப்புகளுக்கான உதவி சேர்க்கப்பட்டது - மேம்படுத்தப்பட்டது - Flaple பிளேபேக்-ச்பீட்-கட்டுப்பாடுகள் மிகவும் கச்சிதமானவை - • ஃபீட் இப்போது புதிய உருப்படிகளை எடுத்துக்காட்டுகிறது - • "பார்த்த உருப்படிகளைக் காட்டு" விருப்பம் இப்போது சேமிக்கப்படுகிறது +மேம்படுத்தப்பட்டது +• பிளேபேக்-வேக-கட்டுப்பாடுகள் மிகவும் கச்சிதமானவை +• தீவனம் இப்போது புதிய உருப்படிகளை முன்னிலைப்படுத்துகிறது +• ஊட்டத்தில் "பார்த்த பொருட்களைக் காட்டு" விருப்பம் இப்போது சேமிக்கப்பட்டது - சரி - You நிலையான YouTube லைக்குகள் மற்றும் பிரித்தெடுத்தல் ஆகியவற்றை விரும்புகிறது - The பின்னணியில் இருந்து திரும்பிய பிறகு நிலையான தானியங்கி மறுபதிப்பு - மேலும் பல +சரி செய்யப்பட்டது +• நிலையான YouTube விருப்பு வெறுப்புகள் பிரித்தெடுத்தல் +• பின்புலத்தில் இருந்து திரும்பிய பிறகு, தானியங்கி ரீப்ளே சரி செய்யப்பட்டது +மேலும் பல diff --git a/fastlane/metadata/android/ta/changelogs/983.txt b/fastlane/metadata/android/ta/changelogs/983.txt index e6093309609..46f1a6e3589 100644 --- a/fastlane/metadata/android/ta/changelogs/983.txt +++ b/fastlane/metadata/android/ta/changelogs/983.txt @@ -1,9 +1,9 @@ -புதிய இரட்டை-தட்டு-க்கு-தேடு இடைமுகம் மற்றும் நடத்தை சேர்க்கவும் - அமைப்புகளைத் தேடச் செய்யுங்கள் - பின் செய்யப்பட்ட கருத்துகளை முன்னிலைப்படுத்தவும் - FSFE இன் PEERTUBE நிகழ்வுக்கு திறந்த-பயன்பாட்டுடன் திறந்த நிலையில் சேர்க்கவும் - பிழை அறிவிப்புகளைச் சேர்க்கவும் - பிளேயர் மாற்றத்தில் முதல் வரிசை உருப்படியின் மறுபயன்பாட்டை சரிசெய்யவும் - தோல்வியுற்றதற்கு முன் லைவ்ச்ட்ரீம்களின் போது இடையகப்படுத்தும்போது அதிக நேரம் காத்திருங்கள் - உள்ளக தேடல் முடிவுகளின் வரிசையை சரிசெய்யவும் - விளையாட்டு வரிசையில் வெற்று உருப்படி புலங்களை சரிசெய்யவும் +புதிய இருமுறை தட்டுவதன் மூலம் தேடும் இடைமுகம் மற்றும் நடத்தையைச் சேர்க்கவும் +தேடக்கூடிய அமைப்புகளை உருவாக்கவும் +பின் செய்யப்பட்ட கருத்துகளை முன்னிலைப்படுத்தவும் +FSFE இன் PeerTube நிகழ்விற்கு திறந்த பயன்பாட்டு ஆதரவைச் சேர்க்கவும் +பிழை அறிவிப்புகளைச் சேர்க்கவும் +பிளேயரை மாற்றும்போது முதல் வரிசை உருப்படியை மீண்டும் இயக்குவதை சரிசெய்யவும் +லைவ்ச்ட்ரீம்களின் போது இடையீடு செய்யும் போது, தோல்வியடையும் முன் அதிக நேரம் காத்திருக்கவும் +உள்ளக தேடல் முடிவுகளின் வரிசையை சரிசெய்யவும் +விளையாட்டு வரிசையில் வெற்று உருப்படி புலங்களை சரிசெய்யவும் diff --git a/fastlane/metadata/android/ta/changelogs/984.txt b/fastlane/metadata/android/ta/changelogs/984.txt index f05c88884c4..86f73d14056 100644 --- a/fastlane/metadata/android/ta/changelogs/984.txt +++ b/fastlane/metadata/android/ta/changelogs/984.txt @@ -1,7 +1,7 @@ -முழு திரையையும் நிரப்பவும், டேப்லெட்டுகள் மற்றும் டிவிகளில் ச்க்ரோலிங் சரிசெய்யவும் போதுமான ஆரம்ப உருப்படிகளை பட்டியல்களில் ஏற்றவும் - பட்டியல்கள் மூலம் ச்க்ரோலிங் செய்யும் போது சீரற்ற செயலிழப்புகளை சரிசெய்யவும் - கணினி இடைமுகம் இன் கீழ் பிளேயர் விரைவாக மேலடுக்கு வளைவைத் தேடுங்கள் - மல்டி சாளரத்தில் விளையாடும்போது கட்அவுட்களில் மாற்றங்களை மாற்றவும், சில தொலைபேசிகளில் தவறாக இடம்பிடித்த வீரர் பின்னடைவை ஏற்படுத்துகிறது - CompileSDK ஐ 30 முதல் 31 வரை அதிகரிக்கவும் - பிழை அறிக்கையிடல் நூலகத்தைப் புதுப்பிக்கவும் - பிளேயரில் சில குறியீட்டை மறுபரிசீலனை செய்யுங்கள் +முழுத் திரையையும் நிரப்பவும், டேப்லெட்டுகள் மற்றும் டிவிகளில் ச்க்ரோலிங் செய்வதை சரிசெய்யவும் போதுமான ஆரம்ப உருப்படிகளை பட்டியல்களில் ஏற்றவும் +பட்டியல்கள் மூலம் ச்க்ரோலிங் செய்யும் போது சீரற்ற செயலிழப்புகளை சரிசெய்யவும் +பிளேயர் ஃபாச்ட் சீக் ஓவர்லே ஆர்க் சிச்டம் யுஐயின் கீழ் செல்ல வேண்டும் +மல்டி விண்டோவில் விளையாடும் போது கட்அவுட்களுக்கு மாற்றங்களை மாற்றவும், இதனால் சில ஃபோன்களில் பிளேயரின் தவறான பின்னடைவு ஏற்படுகிறது +compileSdk ஐ 30 இலிருந்து 31 ஆக அதிகரிக்கவும் +பிழை அறிக்கையிடல் நூலகத்தைப் புதுப்பிக்கவும் +பிளேயரில் சில குறியீட்டை மறுவடிவமைக்கவும் diff --git a/fastlane/metadata/android/ta/changelogs/986.txt b/fastlane/metadata/android/ta/changelogs/986.txt index 0ab07442f9b..8b73c2dfa2b 100644 --- a/fastlane/metadata/android/ta/changelogs/986.txt +++ b/fastlane/metadata/android/ta/changelogs/986.txt @@ -1,16 +1,16 @@ -புதியது - Streams புதிய ச்ட்ரீம்களுக்கான அறிவிப்புகள் - Procetion பின்னணி மற்றும் வீடியோ பிளேயர்களுக்கு இடையில் தடையற்ற மாற்றம் - சே செமிடோன்களால் சுருதியை மாற்றவும் - Player முக்கிய பிளேயர் வரிசையை பிளேலிச்ட்டில் சேர்க்கவும் +புதியது +• புதிய ச்ட்ரீம்களுக்கான அறிவிப்புகள் +• பின்னணி மற்றும் வீடியோ பிளேயர்களுக்கு இடையே தடையற்ற மாற்றம் +• செமிடோன்கள் மூலம் சுருதியை மாற்றவும் +• பிளேலிச்ட்டில் முதன்மையான பிளேயர் வரிசையைச் சேர்க்கவும் - மேம்படுத்தப்பட்டது - விரைவு வேகம்/சுருதி படி அளவை நினைவில் கொள்ளுங்கள் - ஒளிதோற்றம் வீடியோ பிளேயரில் ஆரம்ப நீண்ட இடையகத்தைத் தணித்தல் - And ஆண்ட்ராய்டு டிவிக்கு பிளேயர் இடைமுகம் ஐ மேம்படுத்தவும் - பதிவிறக்கம் செய்யப்பட்ட அனைத்து கோப்புகளையும் நீக்குவதற்கு முன் உறுதிப்படுத்தவும் +மேம்படுத்தப்பட்டது +• வேகம்/சுருதி படி அளவை நினைவில் கொள்ளுங்கள் +• வீடியோ பிளேயரில் ஆரம்ப நீண்ட இடையகத்தைத் தணிக்கவும் +• ஆண்ட்ராய்டு TVக்கான பிளேயர் UIஐ மேம்படுத்தவும் +• பதிவிறக்கம் செய்யப்பட்ட அனைத்து கோப்புகளையும் நீக்கும் முன் உறுதிப்படுத்தவும் - சரி - ஊடகம் மீடியா பொத்தானை சரிசெய்யவும் பிளேயர் கட்டுப்பாடுகளை மறைக்கவில்லை - Player பிளேயர் வகை மாற்றத்தில் பிளேபேக் மீட்டமைப்பை சரிசெய்யவும் - Plale பிளேலிச்ட் உரையாடலை சுழற்றுவதை சரிசெய்யவும் +சரி செய்யப்பட்டது +• பிளேயர் கட்டுப்பாடுகளை மறைக்காத மீடியா பொத்தான்களை சரிசெய்யவும் +• பிளேயரின் வகை மாற்றத்தில் பிளேபேக் மீட்டமைப்பை சரிசெய்யவும் +• பிளேலிச்ட் உரையாடலைச் சுழற்றுவதைச் சரிசெய்யவும் diff --git a/fastlane/metadata/android/ta/changelogs/987.txt b/fastlane/metadata/android/ta/changelogs/987.txt index bad021dc255..9506125e33a 100644 --- a/fastlane/metadata/android/ta/changelogs/987.txt +++ b/fastlane/metadata/android/ta/changelogs/987.txt @@ -1,12 +1,12 @@ -புதியது - Provelive முற்போக்கான HTTP ஐத் தவிர வேறு உதவி விநியோக முறைகள்: வேகமான பின்னணி ஏற்றுதல் நேரம், PEERTUBE மற்றும் SoundCloud க்கான திருத்தங்கள், அண்மைக் காலத்தில் முடிவடைந்த யூடியூப் லைவ்ச்ட்ரீம்களின் பின்னணி - ரிமோட் பிளேலிச்ட்டை உள்ளக ஒன்றில் சேர்க்க பொத்தானைச் சேர்க்கவும் - And ஆண்ட்ராய்டு 10+ பகிர்வு தாளில் பட முன்னோட்டம் +புதியது +• முற்போக்கான HTTPயைத் தவிர வேறு டெலிவரி முறைகள்: வேகமான பிளேபேக் ஏற்றுதல் நேரம், PeerTube மற்றும் SoundCloudக்கான திருத்தங்கள், அண்மைக் காலத்தில் முடிவடைந்த YouTube லைவ்ச்ட்ரீம்களின் பிளேபேக் +• உள்ளக ஒன்றில் ரிமோட் பிளேலிச்ட்டைச் சேர்க்க பொத்தானைச் சேர்க்கவும் +• ஆண்ட்ராய்டு 10+ பகிர்வு தாளில் பட முன்னோட்டம் - மேம்படுத்தப்பட்டது - Flaple பிளேபேக் அளவுருக்கள் உரையாடலை மேம்படுத்தவும் - The சந்தா இறக்குமதி/ஏற்றுமதி பொத்தான்களை மூன்று-டாட் மெனுவுக்கு நகர்த்தவும் +மேம்படுத்தப்பட்டது +• பிளேபேக் அளவுருக்கள் உரையாடலை மேம்படுத்தவும் +• சந்தா இறக்குமதி/ஏற்றுமதி பொத்தான்களை மூன்று-புள்ளி மெனுவிற்கு நகர்த்தவும் - சரி - Plale பிளேலிச்ட்டில் இருந்து முழுமையாகப் பார்த்த வீடியோக்களை அகற்றுவதை சரிசெய்யவும் - இடை, சராசரி பகிர்வு பட்டியல் கருப்பொருள் மற்றும் "பிளேலிச்ட்டில் சேர்" உள்ளீட்டை சரிசெய்யவும் +சரி செய்யப்பட்டது +• பிளேலிச்ட்டில் இருந்து முழுமையாகப் பார்த்த வீடியோக்களை அகற்றுவதைச் சரிசெய்யவும் +• பகிர்வு பட்டியல் கருப்பொருள் மற்றும் "பிளேலிச்ட்டில் சேர்" உள்ளீட்டைச் சரிசெய்தல் diff --git a/fastlane/metadata/android/ta/changelogs/990.txt b/fastlane/metadata/android/ta/changelogs/990.txt index 089a2717dbe..52c6bd0e8b8 100644 --- a/fastlane/metadata/android/ta/changelogs/990.txt +++ b/fastlane/metadata/android/ta/changelogs/990.txt @@ -1,15 +1,15 @@ -இந்த வெளியீடு ஆண்ட்ராய்டு 4.4 KITKAT க்கான ஆதரவைக் குறைக்கிறது, இப்போது குறைந்தபட்ச பதிப்பு ஆண்ட்ராய்டு 5 Lollipop! +இந்த வெளியீடு ஆண்ட்ராய்டு 4.4 KitKat க்கான ஆதரவைக் குறைக்கிறது, இப்போது குறைந்தபட்ச பதிப்பு ஆண்ட்ராய்டு 5 Lollipop! - புதியது - Long நீண்ட அழுத்த மெனுவிலிருந்து பதிவிறக்கவும் - Voor எதிர்கால வீடியோக்களை தீவனத்தில் மறைக்கவும் - Lal உள்ளக பிளேலிச்ட்களைப் பகிரவும் +புதியது +• நீண்ட அழுத்த மெனுவிலிருந்து பதிவிறக்கவும் +• எதிர்கால வீடியோக்களை ஊட்டத்தில் மறைக்கவும் +• உள்ளக பிளேலிச்ட்களைப் பகிரவும் - மேம்படுத்தப்பட்டது - Play பிளேயர் குறியீட்டை சிறிய கூறுகளாக மாற்றியமைத்தல்: குறைவான ரேம் பயன்படுத்தப்பட்டது, குறைவான பிழைகள் - Prum சிறுபடங்களின் அளவிலான பயன்முறையை மேம்படுத்தவும் - • வெக்டர்-ஐச் பட ஒதுக்கிடங்கள் +மேம்படுத்தப்பட்டது +• பிளேயர் குறியீட்டை சிறிய கூறுகளாக மாற்றவும்: குறைவான ரேம் பயன்படுத்தப்பட்டது, குறைவான பிழைகள் +• சிறுபடங்களின் அளவு பயன்முறையை மேம்படுத்தவும் +• வெக்டார்-ஐச் பட பிளேச்ஓல்டர்கள் - சரி - Player பிளேயர் அறிவிப்புடன் பல்வேறு சிக்கல்களை சரிசெய்யவும்: காலாவதியான/காணாமல் போன ஊடகத் செய்தி, சிதைந்த சிறுபடம் - 1/4 திரையைப் பயன்படுத்தி முழுத்திரை சரிசெய்யவும் +சரி செய்யப்பட்டது +• பிளேயர் அறிவிப்பில் உள்ள பல்வேறு சிக்கல்களைச் சரிசெய்யவும்: காலாவதியான/காணாமல் போன மீடியா செய்தி, சிதைந்த சிறுபடம் +• 1/4 திரையைப் பயன்படுத்தி முழுத்திரையை சரிசெய்யவும் diff --git a/fastlane/metadata/android/ta/changelogs/991.txt b/fastlane/metadata/android/ta/changelogs/991.txt index bab6d806e4e..6e4a24723c8 100644 --- a/fastlane/metadata/android/ta/changelogs/991.txt +++ b/fastlane/metadata/android/ta/changelogs/991.txt @@ -1,13 +1,13 @@ -புதியது - Banel பிழை பேனலில் "உலாவியில் திறக்க" பொத்தானைச் சேர்க்கவும் - Carges சேனல் குழுக்களை பட்டியலாகக் காண்பிக்க விருப்பத்தைச் சேர்க்கவும் - Time [YouTube] நேர முத்திரை முகவரி ஐப் பகிர்ந்து கொள்ள ச்ட்ரீம் பிரிவுகளில் நீண்ட சொடுக்கு செய்யவும் - Min மினி பிளேயரில் பிளே வரிசை பொத்தானைச் சேர்க்கவும் +புதியது +• பிழை பேனலில் "உலாவியில் திற" பொத்தானைச் சேர்க்கவும் +• சேனல் குழுக்களை பட்டியலாகக் காண்பிக்க விருப்பத்தைச் சேர்க்கவும் +• [YouTube] நேர முத்திரை URLஐப் பகிர, ச்ட்ரீம் பிரிவுகளில் நீண்ட சொடுக்கு செய்யவும் +• மினி பிளேயரில் பிளே வரிசை பொத்தானைச் சேர்க்கவும் - மேம்படுத்தப்பட்டது - Ic ஐச்லாந்திய உள்ளூர்மயமாக்கலைச் சேர்த்து, பல மொழிபெயர்ப்புகளைப் புதுப்பித்தது - • பல உள் மேம்பாடுகள் +மேம்படுத்தப்பட்டது +• ஐச்லாண்டிக் உள்ளூர்மயமாக்கலைச் சேர்க்கவும் மற்றும் பல பிற மொழிபெயர்ப்புகளைப் புதுப்பிக்கவும் +• பல உள் மேம்பாடுகள் - சரி - The பல விபத்துக்களை சரிசெய்யவும் - • [YouTube] சில நாடுகளில் சேனல்கள், அர்ப்பணிப்பு அல்லாத தீவனம் மற்றும் பணித்தொகுப்பு பின்னணி சிக்கல்களை சரிசெய்யவும் +சரி செய்யப்பட்டது +• பல செயலிழப்புகளைச் சரிசெய்யவும் +• [YouTube] சில நாடுகளில் ஏற்றப்படும் சேனல்கள், பிரத்யேகமற்ற ஊட்டம் மற்றும் தீர்விற்கான பின்னணி சிக்கல்களை சரிசெய்யவும் diff --git a/fastlane/metadata/android/ta/changelogs/992.txt b/fastlane/metadata/android/ta/changelogs/992.txt index 482d4bcf54a..d2c02d1d36e 100644 --- a/fastlane/metadata/android/ta/changelogs/992.txt +++ b/fastlane/metadata/android/ta/changelogs/992.txt @@ -1,17 +1,17 @@ -புதியது - ஒளிதோற்றம் வீடியோ விவரங்களில் சந்தாதாரர் எண்ணிக்கை - The வரிசையிலிருந்து பதிவிறக்கவும் - • நிரந்தரமாக ஒரு பிளேலிச்ட் சிறுபடத்தை அமைக்கவும் - • நீண்ட அழுத்த ஏச்டேக்குகள் மற்றும் இணைப்புகள் - பார்வை அட்டை பார்வை பயன்முறை +புதியது +• வீடியோ விவரங்களில் சந்தாதாரர் எண்ணிக்கை +• வரிசையில் இருந்து பதிவிறக்கவும் +• பிளேலிச்ட் சிறுபடத்தை நிரந்தரமாக அமைக்கவும் +• ஏச்டேக்குகள் மற்றும் இணைப்புகளை நீண்ட நேரம் அழுத்தவும் +• அட்டை பார்வை முறை - மேம்படுத்தப்பட்டது - Ming பெரிய மினி-பிளேயர் மூடு பொத்தான் - • மென்மையான சிறுபடம் கீழ்நோக்கி - And இலக்கு ஆண்ட்ராய்டு 13 (API 33) - • தேடுவது இனி வீரரை இடைநிறுத்தாது +மேம்படுத்தப்பட்டது +• பெரிய மினி பிளேயர் மூடும் பொத்தான் +• மென்மையான சிறுபடம் குறைத்தல் +• இலக்கு ஆண்ட்ராய்டு 13 (API 33) +• தேடுவது இனி வீரர் இடைநிறுத்தப்படாது - சரி - Tex டெக்ச்/மவுசில் மேலடுக்கை சரிசெய்யவும் - Adio தனி ஆடியோ ச்ட்ரீம்கள் இல்லாத பின்னணி பிளேயரை அனுமதிக்கவும் - You பல்வேறு யூடியூப் திருத்தங்கள் மற்றும் பல… +சரி செய்யப்பட்டது +• DeX/mouse மீது மேலடுக்கை சரிசெய்யவும் +• தனி ஆடியோ ச்ட்ரீம்கள் இல்லாமல் பின்னணி பிளேயரை அனுமதிக்கவும் +• பல்வேறு YouTube திருத்தங்கள் மற்றும் பல… diff --git a/fastlane/metadata/android/ta/changelogs/993.txt b/fastlane/metadata/android/ta/changelogs/993.txt index cafc30ad152..165d547c8fa 100644 --- a/fastlane/metadata/android/ta/changelogs/993.txt +++ b/fastlane/metadata/android/ta/changelogs/993.txt @@ -1,12 +1,12 @@ -புதியது - Play பிளேலிச்ட் நகல்களைச் சேர்க்கும்போது எச்சரிக்கையைச் சேர்க்கவும், அவற்றை அகற்ற பொத்தானைச் சேர்க்கவும் - Ward வன்பொருள் பொத்தான்களை புறக்கணிக்க அனுமதிக்கவும் - Fient ஓரளவு பார்த்த வீடியோக்களை தீவனத்தில் மறைக்க அனுமதிக்கவும் +புதியது +• பிளேலிச்ட் நகல்களைச் சேர்க்கும்போது எச்சரிக்கையைச் சேர்க்கவும், அவற்றை அகற்ற பொத்தானைச் சேர்க்கவும் +• வன்பொருள் பொத்தான்களைப் புறக்கணிப்பதை அனுமதிக்கவும் +• ஊட்டத்தில் ஓரளவு பார்த்த வீடியோக்களை மறைக்க அனுமதிக்கவும் - மேம்படுத்தப்பட்டது - Scree பெரிய திரைகளில் மேலும் கட்டம் நெடுவரிசைகளைப் பயன்படுத்தவும் - Sigsters அமைப்புகளுடன் முன்னேற்ற குறிகாட்டிகளை ஒத்துப்போகச் செய்யுங்கள் +மேம்படுத்தப்பட்டது +• பெரிய திரைகளில் அதிக கட்ட நெடுவரிசைகளைப் பயன்படுத்தவும் +• முன்னேற்றக் குறிகாட்டிகளை அமைப்புகளுடன் ஒத்துப்போகச் செய்யவும் - சரி - ஆண்ட்ராய்டு ஆண்ட்ராய்டு 11+ இல் உலாவி முகவரி கள், பதிவிறக்கங்கள் மற்றும் வெளிப்புற பிளேயர்களைத் திறப்பதை சரிசெய்யவும் - Mi மியுய் மீது இரண்டு தட்டுகள் தேவைப்படும் முழுத்திரை மூலம் தொடர்புகொள்வதை சரிசெய்யவும் +சரி செய்யப்பட்டது +• ஆண்ட்ராய்டு 11+ இல் திறக்கும் உலாவி URLகள், பதிவிறக்கங்கள் மற்றும் வெளிப்புற பிளேயர்களைச் சரிசெய்யவும் +• MIUI இல் இரண்டு தட்டுகள் தேவைப்படும் முழுத்திரையுடன் தொடர்புகொள்வதை சரிசெய்யவும் diff --git a/fastlane/metadata/android/ta/changelogs/994.txt b/fastlane/metadata/android/ta/changelogs/994.txt index b68d3db8525..4c4930ffcaa 100644 --- a/fastlane/metadata/android/ta/changelogs/994.txt +++ b/fastlane/metadata/android/ta/changelogs/994.txt @@ -1,15 +1,15 @@ -புதியது - Adio பல ஆடியோ தடங்கள்/மொழிகளை ஆதரிக்கவும் - The திரையின் எந்த பக்கத்திலும் தொகுதி மற்றும் ஒளி சைகைகளை அமைப்பதை அனுமதிக்கவும் - The திரையின் அடிப்பகுதியில் முதன்மையான பாடல்களைக் காண்பிப்பதற்கான ஆதரவு +புதியது +• பல ஆடியோ டிராக்குகள்/மொழிகளை ஆதரிக்கவும் +• திரையின் எந்தப் பக்கத்திலும் ஒலியளவு மற்றும் பிரகாச சைகைகளை அமைக்க அனுமதிக்கவும் +• திரையின் அடிப்பகுதியில் முதன்மையான தாவல்களைக் காண்பிப்பதற்கான உதவி - மேம்படுத்தப்பட்டது - • [பேண்ட்கேம்ப்] ஊதியச் சுவருக்குப் பின்னால் தடங்களைக் கையாளவும் +மேம்படுத்தப்பட்டது +• [பேண்ட்கேம்ப்] பே சுவரின் பின்னால் டிராக்குகளைக் கையாளவும் - சரி - • [YouTube] ச்ட்ரீம்களுக்கான 403 HTTP பிழைகள் - Play பிளேலிச்ட் பார்வையில் இருந்து முதன்மையான பிளேயருக்கு மாறும்போது கருப்பு பிளேயர் - பணி பிளேயர் பணி நினைவக கசிவு - • [PEERTUBE] பதிவேற்றியவர் மற்றும் துணைப்பிரிவு அவதாரங்கள் மாற்றப்பட்டன +சரி செய்யப்பட்டது +• [YouTube] ச்ட்ரீம்களுக்கான 403 HTTP பிழைகள் +• பிளேலிச்ட் பார்வையில் இருந்து மெயின் பிளேயருக்கு மாறும்போது பிளாக் பிளேயர் +• பிளேயர் பணி நினைவகம் கசிவு +• [PeerTube] பதிவேற்றி மற்றும் துணை சேனல் அவதாரங்கள் மாற்றப்பட்டன - மேலும் +மேலும் diff --git a/fastlane/metadata/android/ta/changelogs/995.txt b/fastlane/metadata/android/ta/changelogs/995.txt index 321e1144093..587a75c59c6 100644 --- a/fastlane/metadata/android/ta/changelogs/995.txt +++ b/fastlane/metadata/android/ta/changelogs/995.txt @@ -1,16 +1,16 @@ -புதியது - வாய்க்கால் சேனல் தாவல்களை ஆதரிக்கவும் - • படத் தரத்தைத் தேர்ந்தெடுக்கவும் - அனைத்தும் அனைத்து படங்களுக்கும் முகவரி களைப் பெறுங்கள் +புதியது +• உதவி சேனல் தாவல்கள் +• படத்தின் தரத்தைத் தேர்ந்தெடுக்கவும் +• அனைத்து படங்களுக்கும் URLகளைப் பெறுங்கள் - மேம்படுத்தப்பட்டது - Player பிளேயர் இடைமுகங்களின் அணுகல் - ஒளிதோற்றம் வீடியோ-மட்டும் பதிவிறக்கங்களுக்கான சிறந்த ஆடியோ தேர்வு - Play பிளேலிச்ட் மற்றும் வீடியோ பெயர்களை பகிரப்பட்ட பிளேலிச்ட் உள்ளடக்கத்தில் சேர்க்க விருப்பம் +மேம்படுத்தப்பட்டது +• பிளேயர் இடைமுகங்களின் அணுகல் +• வீடியோ மட்டும் பதிவிறக்கம் செய்ய சிறந்த ஆடியோ தேர்வு +• பகிரப்பட்ட பிளேலிச்ட் உள்ளடக்கத்தில் பிளேலிச்ட் மற்றும் வீடியோ பெயர்களைச் சேர்ப்பதற்கான விருப்பம் - சரி - • [YouTube] எண்ணிக்கை போல - Pop பாப்அப்கள் மற்றும் செயலிழப்புகளுக்கு பதிலளிக்காத பிளேயரை சரிசெய்யவும் - Pill மொழி பிக்கரில் தவறான மொழிகளைத் தேர்ந்தெடுப்பது - • பிளேயர் ஆடியோ கவனம் ஊமையை மதிக்கவில்லை - • பிளேலிச்ட் உருப்படி கூடுதலாக எப்போதாவது வேலை செய்யவில்லை +சரி செய்யப்பட்டது +• [YouTube] லைக் எண்ணிக்கையை சரிசெய்தல் +• பாப்அப்கள் மற்றும் செயலிழப்புகளுக்கு பதிலளிக்காத பிளேயரை சரிசெய்யவும் +• மொழித் தேர்வில் தவறான மொழிகளின் தேர்வு +• பிளேயர் ஆடியோ கவனம் முடக்கத்தை மதிக்கவில்லை +• பிளேலிச்ட் உருப்படி சேர்த்தல் எப்போதாவது வேலை செய்யாது diff --git a/fastlane/metadata/android/ta/changelogs/997.txt b/fastlane/metadata/android/ta/changelogs/997.txt index a85000d8498..9ba9cd46277 100644 --- a/fastlane/metadata/android/ta/changelogs/997.txt +++ b/fastlane/metadata/android/ta/changelogs/997.txt @@ -1,17 +1,17 @@ -புதியது - கருத்து கருத்து பதில்களைச் சேர்க்கவும் - Blay பிளேலிச்ட்களை மறுவரிசைப்படுத்த அனுமதிக்கவும் - Play பிளேலிச்ட் விளக்கம் மற்றும் கால அளவைக் காட்டு - Settets அமைப்புகளை மீட்டமைக்க அனுமதிக்கவும் +புதியது +• கருத்து பதில்களைச் சேர்க்கவும் +• பிளேலிச்ட்களை மறுவரிசைப்படுத்த அனுமதிக்கவும் +• பிளேலிச்ட் விளக்கம் மற்றும் கால அளவைக் காட்டு +• அமைப்புகளை மீட்டமைக்க அனுமதிக்கவும் - மேம்படுத்தப்பட்டது - • [Android 13+] தனிப்பயன் அறிவிப்பு செயல்களை மீட்டெடுங்கள் - புதுப்பிப்பு புதுப்பிப்பு சோதனைக்கு ஒப்புதல் கோருங்கள் - • பஃபர் செய்யும் போது அறிவிப்பு நாடகம்/இடைநிறுத்தத்தை அனுமதிக்கவும் - Settents சில அமைப்புகளை மறுவரிசைப்படுத்தவும் +மேம்படுத்தப்பட்டது +• [Android 13+] தனிப்பயன் அறிவிப்பு செயல்களை மீட்டெடுக்கவும் +• புதுப்பிப்பு சரிபார்ப்புக்கு ஒப்புதல் கோரவும் +• இடையகத்தின் போது அறிவிப்பை இயக்க/இடைநிறுத்த அனுமதிக்கவும் +• சில அமைப்புகளை மறுவரிசைப்படுத்தவும் - சரி - • [YouTube] கருத்துக்களை ஏற்றாத கருத்துக்கள், மற்றும் பிற திருத்தங்கள் மற்றும் மேம்பாடுகள் - Settrimation அமைப்புகள் இறக்குமதியில் பாதிப்பைத் தீர்க்கவும், சாதொபொகு க்கு மாறவும் - பதிவிறக்கம் பல்வேறு பதிவிறக்க திருத்தங்கள் - தேடல் உரையை ஒழுங்கமைக்கவும் +சரி செய்யப்பட்டது +• [YouTube] கருத்துகள் ஏற்றப்படாமல் இருப்பதை சரிசெய்தல், மேலும் பிற திருத்தங்கள் மற்றும் மேம்பாடுகள் +• அமைப்புகள் இறக்குமதியில் உள்ள பாதிப்பைத் தீர்த்து, JSONக்கு மாறவும் +• பல்வேறு பதிவிறக்க திருத்தங்கள் +• தேடல் உரையை ஒழுங்கமைக்கவும் diff --git a/fastlane/metadata/android/ta/changelogs/999.txt b/fastlane/metadata/android/ta/changelogs/999.txt index ea8e7f6d02e..f588170c7a5 100644 --- a/fastlane/metadata/android/ta/changelogs/999.txt +++ b/fastlane/metadata/android/ta/changelogs/999.txt @@ -1,12 +1,12 @@ -இந்த ஆட்ஃபிக்ச் வெளியீடு YouTube வீடியோக்களின் நடுவில் HTTP 403 பிழைகளை சரிசெய்கிறது. +இந்த ஆட்ஃபிக்ச் வெளியீடு YouTube வீடியோக்களின் நடுவில் HTTP 403 பிழைகளை சரிசெய்கிறது. - புதியது - • [SoundCloud] on.soundcloud.com முகவரி களுக்கு ஆதரவைச் சேர்க்கவும் +புதியது +• [SoundCloud] on.soundcloud.com URLகளுக்கான ஆதரவைச் சேர்க்கவும் - மேம்படுத்தப்பட்டது - • [பேண்ட்கேம்ப்] ரேடியோ கியோச்கில் கூடுதல் தகவலைக் காட்டுங்கள் +மேம்படுத்தப்பட்டது +• [பேண்ட்கேம்ப்] ரேடியோ கியோச்கில் கூடுதல் தகவலைக் காட்டு - சரி - • [YouTube] அவ்வப்போது HTTP 403 பிழைகளை ஆரம்பத்தில் அல்லது வீடியோக்களின் நடுவில் சரிசெய்யவும் - • [YouTube] மேலும் சேனல் தலைப்பு வகைகளிலிருந்து அவதார் மற்றும் பேனரை பிரித்தெடுக்கவும் - • [பேண்ட்கேம்ப்] பல்வேறு பிழைகளை சரிசெய்து எப்போதும் https ஐப் பயன்படுத்துங்கள் +சரி செய்யப்பட்டது +• [YouTube] வீடியோக்களின் தொடக்கத்திலோ அல்லது நடுவிலோ அவ்வப்போது HTTP 403 பிழைகளைச் சரிசெய்யவும் +• [YouTube] அதிக சேனல் தலைப்பு வகைகளிலிருந்து அவதார் மற்றும் பேனரைப் பிரித்தெடுக்கவும் +• [Bandcamp] பல்வேறு பிழைகளை சரிசெய்து எப்போதும் HTTPS ஐப் பயன்படுத்தவும் diff --git a/fastlane/metadata/android/tr/changelogs/995.txt b/fastlane/metadata/android/tr/changelogs/995.txt new file mode 100644 index 00000000000..edfd248fdcb --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/995.txt @@ -0,0 +1,16 @@ +Yeni +• Kanal sekmeleri desteği +• Resim kalite seçme özelliği +• Tüm resimlerin URL'lerini alma özelliği + +İyileştirmeler +• Oynatıcı arayüzlerinin erişilebilirliği +• Yalnızca video indirmeleri için daha iyi ses seçimi +• Paylaşılan oynatma listesi içeriğine oynatma listesi ve video adlarını ekleme seçeneği + +Düzeltilenler +• [YouTube] Beğeni sayısını alma sorunu düzeltildi +• Oynatıcının yanıt vermemesi ve çökmesi sorunu düzeltildi +• Dil seçicide yanlış dil seçimi sorunu düzeltildi +• Oynatıcı ses odaklı modda, sessize alma özelliğini dikkate almıyordu +• Oynatma listesi öğesi ekleme özelliği bazen çalışmıyordu diff --git a/fastlane/metadata/android/vi/changelogs/1000.txt b/fastlane/metadata/android/vi/changelogs/1000.txt index e812a4feadc..bc376259043 100644 --- a/fastlane/metadata/android/vi/changelogs/1000.txt +++ b/fastlane/metadata/android/vi/changelogs/1000.txt @@ -1,13 +1,13 @@ -Những cải thiện -• Làm cho mô tả của danh sách phát có thể nhấp vào để hiển thị nhiều / ít nội dung hơn -• [PeerTube] Tự động xử lý các liên kết như 'subscribeto.me' -• Chỉ bắt đầu phát một mục trong màn hình lịch sử +Cải thiện +• Chạm mô tả danh sách phát để xem thêm / thu gọn +• [PeerTube] Tự xử lý liên kết `subscribeto.me` +• Chỉ phát một mục trong màn hình lịch sử -Đã sửa các lỗi trước đó -• Sửa lỗi khả năng hiển thị nút RSS -• Khắc phục sự cố xem trước thanh tìm kiếm -• Sửa danh sách phát một mục không có hình xem trước -• Sửa lỗi việc thoát khỏi hộp thoại tải xuống trước khi nó xuất hiện -• Sửa cửa sổ bật lên cho danh sách các mục liên quan khi xếp hàng. -• Sửa thứ tự trong hộp thoại được thêm vào danh sách phát -• Đã điều chỉnh bố cục của mục đánh dấu trong danh sách phát +Đã sửa +• Hiển thị nút RSS +• Crash xem trước thanh tua +• Tạo danh sách phát với mục không có thumbnail +• Thoát hộp thoại "Tải xuống" trước khi hiển thị +• Popup thêm mục liên quan vào hàng chờ +• Thứ tự trong hộp thoại "Thêm vào danh sách phát" +• Bố cục mục đánh dấu danh sách phát diff --git a/fastlane/metadata/android/vi/changelogs/1003.txt b/fastlane/metadata/android/vi/changelogs/1003.txt index 3f32949c507..982a79efc98 100644 --- a/fastlane/metadata/android/vi/changelogs/1003.txt +++ b/fastlane/metadata/android/vi/changelogs/1003.txt @@ -1,4 +1,6 @@ -Đã sửa lỗi YouTube không phát bất kỳ luồng nào. - -Bản phát hành này chỉ giải quyết lỗi cấp bách nhất khiến video YouTube không tải thông tin chi tiết về video. -Chúng tôi biết có những vấn đề khác và chúng tôi sẽ sớm đưa ra một bản phát hành riêng để giải quyết những vấn đề đó. +Đây là bản vá khẩn sửa lỗi YouTube: +• [YouTube] Sửa lỗi không tải thông tin video, lỗi HTTP 403 khi phát và khôi phục phát một số video giới hạn độ tuổi +• Cỡ chữ phụ đề không thay đổi +• Tải thông tin hai lần khi mở stream +• [SoundCloud] Loại bỏ stream DRM không thể phát +• Cập nhật bản dịch diff --git a/fastlane/metadata/android/vi/changelogs/1005.txt b/fastlane/metadata/android/vi/changelogs/1005.txt index 7eeb567b77e..86a38a38d5b 100644 --- a/fastlane/metadata/android/vi/changelogs/1005.txt +++ b/fastlane/metadata/android/vi/changelogs/1005.txt @@ -1,17 +1,17 @@ Mới -• Hỗ trợ cho Android Auto -• Cho phép đặt nhóm nguồn cấp dữ liệu làm tab màn hình chính -• [YouTube] Chia sẻ dưới dạng danh sách phát tạm thời -• [SoundCloud] Tab kênh thích +• Hỗ trợ Android Auto +• Cho phép đặt nhóm feed làm tab màn hình chính +• [YouTube] Chia sẻ dạng danh sách phát tạm thời +• [SoundCloud] Tab kênh đã thích Cải thiện -• Gợi ý thanh tìm kiếm tốt hơn -• Hiển thị ngày tải xuống trong mục Tải xuống -• Sử dụng cài đặt ngôn ngữ cho từng ứng dụng (Android 13+) +• Gợi ý thanh tìm kiếm rõ hơn +• Hiển thị ngày tải trong Tải xuống +• Dùng ngôn ngữ riêng cho ứng dụng (Android 13) Đã sửa -• Màu chữ bị hỏng ở chế độ tối -• [YouTube] Danh sách phát không tải được hơn 100 mục -• [YouTube] Thiếu video được đề xuất -• Sập trong Lịch sử -• Dấu thời gian trong phần trả lời bình luận +• Màu chữ lỗi trong chế độ tối +• [YouTube] Playlist không tải quá 100 mục +• [YouTube] Thiếu video đề xuất +• Crash trong danh sách Lịch sử +• Timestamp trong phản hồi bình luận diff --git a/fastlane/metadata/android/vi/changelogs/1006.txt b/fastlane/metadata/android/vi/changelogs/1006.txt new file mode 100644 index 00000000000..baf2ab52bc8 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/1006.txt @@ -0,0 +1,16 @@ +Cải thiện +• Giữ trình phát hiện tại khi nhấn timestamp +• Thử khôi phục các tác vụ tải xuống đang chờ +• Tùy chọn xóa bản tải mà không xóa tệp +• Quyền Overlay: hiển thị hộp thoại giải thích (Android > R) +• Hỗ trợ mở liên kết on.soundcloud +• Nhiều cải thiện và tối ưu nhỏ + +Đã sửa +• Định dạng số rút gọn cho Android < 7 +• Thông báo "ma" +• Lỗi phụ đề SRT +• Nhiều crash + +Phát triển +• Hiện đại hóa mã nội bộ diff --git a/fastlane/metadata/android/vi/changelogs/1007.txt b/fastlane/metadata/android/vi/changelogs/1007.txt index d2086b62c1f..6265fcf52f1 100644 --- a/fastlane/metadata/android/vi/changelogs/1007.txt +++ b/fastlane/metadata/android/vi/changelogs/1007.txt @@ -1 +1,11 @@ -Đã sửa lỗi YouTube không phát bất kỳ luồng nào +Bản vá khẩn sửa lỗi "Nội dung không khả dụng": video YouTube đã phát lại bình thường. + +Cũng sửa một số lỗi từ 0.28.1: +• Kéo mục trong playlist chỉ sang được vị trí liền kề +• Tiêu đề/bình luận nhấp nháy giữa video hiện tại và trước đó +• Tùy chọn "Mở trình phát chính toàn màn hình" không hoạt động + +Cải thiện khác: +• [YouTube] Có thể tua lại livestream tối đa 4 giờ +• Không tải video livestream khi phát nền +• Giao diện mới cho "Xóa đã xem" diff --git a/fastlane/metadata/android/vi/changelogs/1008.txt b/fastlane/metadata/android/vi/changelogs/1008.txt new file mode 100644 index 00000000000..ee92a2384ee --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/1008.txt @@ -0,0 +1,4 @@ +• Đã sửa lỗi phát lại livestreams tại điểm phát cuối +• [Youtube] hỗ trợ thêm nhiều dạng URL kênh +• [Youtube] hỗ trợ thêm nhiều format cho video metainfo +• Đã cải thiện các bản dịch diff --git a/fastlane/metadata/android/vi/changelogs/1009.txt b/fastlane/metadata/android/vi/changelogs/1009.txt new file mode 100644 index 00000000000..f47bddcd7f2 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/1009.txt @@ -0,0 +1,13 @@ +Quan trọng +Đã bổ sung thông tin kêu gọi hành động cho chiến dịch Keep Android Open: https://www.keepandroidopen.org/ + +Đã cải thiện +[Feed] Cập nhật các đăng ký cũ theo thứ tự ngẫu nhiên +Các trang bình luận không còn chồng lên nhau +Không truyền sự kiện nhấn xuống view bên dưới trên trang chi tiết video + +Đã sửa +Lỗi không hiện ảnh avatar ở phần comment +Những lỗi liên quan đến UI của phần trình phát +[SoundCloud] các luồng phát có ID dài +Và nhiều sửa lỗi, cải thiện khác diff --git a/fastlane/metadata/android/zh-Hans/changelogs/1007.txt b/fastlane/metadata/android/zh-Hans/changelogs/1007.txt index 8a5424c9e02..285ca3827e3 100644 --- a/fastlane/metadata/android/zh-Hans/changelogs/1007.txt +++ b/fastlane/metadata/android/zh-Hans/changelogs/1007.txt @@ -1 +1,11 @@ -修复YouTube无法播放任何视频 +这个热修复版本修复了“内容不可用”错误:又能播放 YouTube 视频了! + +还修复了几个 0.28.1 版本引入的故障: +• 播放列表项只拖动到相邻位置 +• 标题、评论在当前和上一个视频之间闪烁 +• “全屏模式启动主播放器”选项不工作 + +其他改进: +• [YouTube] 再次允许将直播倒退最多 4 小时 +• 后台播放时不加载直播视频 +• “删除已观看”的新用户界面 diff --git a/fastlane/metadata/android/zh-Hans/changelogs/1008.txt b/fastlane/metadata/android/zh-Hans/changelogs/1008.txt new file mode 100644 index 00000000000..7ba4bfab4a6 --- /dev/null +++ b/fastlane/metadata/android/zh-Hans/changelogs/1008.txt @@ -0,0 +1,4 @@ +∙ 修复了在上次播放位置继续播放音视频流的问题 +∙ [YouTube] 支持更多频道 URL 格式 +∙ [YouTube] 支持更多视频元信息格式 +∙ 更新翻译 diff --git a/fastlane/metadata/android/zh-Hans/changelogs/1009.txt b/fastlane/metadata/android/zh-Hans/changelogs/1009.txt new file mode 100644 index 00000000000..1d3fc413a5f --- /dev/null +++ b/fastlane/metadata/android/zh-Hans/changelogs/1009.txt @@ -0,0 +1,14 @@ +新增 +Keep Android Open 运动的重要信息及采取行动的请求:https://www.keepandroidopen.org/ + +改进 +[Feed] 打乱过期订阅更新顺序 +不堆叠评论页 +单击视频详情页时不把单击事件传递到底层视图。 + +修复 +评论回复标题布局没有头像图 +多个播放器相关 UI 修复 +[SoundCloud] 修福长 ID 音频流 + +以及更多修复和改进! diff --git a/fastlane/metadata/android/zh-Hans/changelogs/972.txt b/fastlane/metadata/android/zh-Hans/changelogs/972.txt index b7c28ef8303..90cb8714921 100644 --- a/fastlane/metadata/android/zh-Hans/changelogs/972.txt +++ b/fastlane/metadata/android/zh-Hans/changelogs/972.txt @@ -1,12 +1,14 @@ 新增 在简介文本中识别时间戳和井号标签 增加手动开启平板模式的设置选项 -允许在订阅中隐藏已播放项目 +允许在订阅源中隐藏已播放项目 + 改进 正确支持存储访问框架 (SAF) 改进不可用和已删号的频道的错误处理 对于Android 10+用户的分享页面现在支持显示内容标题 更新 Invidious 实例 (instances) 并支持 Piped 链接 + 修复 [YouTube]年龄限制内容 打开选择对话框时防止窗口内存泄露异常 diff --git a/gradle.properties b/gradle.properties index 01e1aa01fce..1a8297ddf87 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,3 @@ -android.enableJetifier=false -android.nonFinalResIds=false -android.nonTransitiveRClass=true android.useAndroidX=true org.gradle.jvmargs=-Xmx2048M --add-opens jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED systemProp.file.encoding=utf-8 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a4ec884eb22..225943eeb3d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,12 +7,13 @@ acra = "5.13.1" agp = "8.13.2" appcompat = "1.7.1" -assertj = "3.27.6" +assertj = "3.27.7" autoservice-google = "1.1.1" autoservice-zacsweers = "1.2.0" bridge = "v2.0.2" cardview = "1.0.0" -checkstyle = "13.0.0" +checkstyle = "13.2.0" +coil = "3.3.0" constraintlayout = "2.2.1" core = "1.17.0" desugar = "2.1.5" @@ -23,8 +24,8 @@ groupie = "2.10.1" jsoup = "1.22.1" junit = "4.13.2" junit-ext = "1.3.0" -kotlin = "2.2.21" -ksp = "2.3.4" +kotlin = "2.3.10" +ksp = "2.3.6" ktlint = "1.8.0" leakcanary = "2.14" lifecycle = "2.9.4" # Newer versions require minSdk >= 23 @@ -35,8 +36,6 @@ media = "1.7.1" mockitoCore = "5.21.0" okhttp = "5.3.2" phoenix = "3.0.0" -#noinspection NewerVersionAvailable,GradleDependency --> 2.8 is the last version, not 2.71828! -picasso = "2.8" preference = "1.2.1" prettytime = "5.0.8.Final" recyclerview = "1.4.0" @@ -59,7 +58,7 @@ teamnewpipe-nanojson = "e9d656ddb49a412a5a0a5d5ef20ca7ef09549996" # the corresponding commit hash, since JitPack sometimes deletes artifacts. # If there’s already a git hash, just add more of it to the end (or remove a letter) # to cause jitpack to regenerate the artifact. -teamnewpipe-newpipe-extractor = "v0.25.2" +teamnewpipe-newpipe-extractor = "v0.26.0" viewpager2 = "1.1.0" webkit = "1.14.0" # Newer versions require minSdk >= 23 work = "2.10.5" # Newer versions require minSdk >= 23 @@ -91,6 +90,8 @@ androidx-webkit = { module = "androidx.webkit:webkit", version.ref = "webkit" } androidx-work-runtime = { module = "androidx.work:work-runtime", version.ref = "work" } androidx-work-rxjava3 = { module = "androidx.work:work-rxjava3", version.ref = "work" } assertj-core = { module = "org.assertj:assertj-core", version.ref = "assertj" } +coil-compose = { module = "io.coil-kt.coil3:coil-compose", version.ref = "coil" } +coil-network-okhttp = { module = "io.coil-kt.coil3:coil-network-okhttp", version.ref = "coil" } evernote-statesaver-compiler = { module = "com.evernote:android-state-processor", version.ref = "statesaver" } evernote-statesaver-core = { module = "com.evernote:android-state", version.ref = "statesaver" } facebook-stetho-core = { module = "com.facebook.stetho:stetho", version.ref = "stetho" } @@ -127,7 +128,6 @@ squareup-leakcanary-core = { module = "com.squareup.leakcanary:leakcanary-androi squareup-leakcanary-plumber = { module = "com.squareup.leakcanary:plumber-android", version.ref = "leakcanary" } squareup-leakcanary-watcher = { module = "com.squareup.leakcanary:leakcanary-object-watcher-android", version.ref = "leakcanary" } squareup-okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" } -squareup-picasso = { module = "com.squareup.picasso:picasso", version.ref = "picasso" } zacsweers-autoservice-compiler = { module = "dev.zacsweers.autoservice:auto-service-ksp", version.ref = "autoservice-zacsweers" } [plugins] diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 44ae9537e91..41465649341 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=0d585f69da091fc5b2beced877feab55a3064d43b8a1d46aeb07996b0915e0e0 -distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.0-bin.zip +distributionSha256Sum=b266d5ff6b90eada6dc3b20cb090e3731302e553a27c5d3e4df1f0d76beaff06 +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME