mirror of
https://github.com/TeamNewPipe/NewPipe
synced 2026-09-23 17:38:51 +00:00
Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c7c53be2f3 | ||
|
|
3c9a99b05c |
+33
@@ -0,0 +1,33 @@
|
||||
package org.schabi.newpipe
|
||||
|
||||
import android.content.Context
|
||||
import android.os.Bundle
|
||||
import net.newpipe.app.ComposeActivity
|
||||
import net.newpipe.app.platform.AndroidLegacyHooks
|
||||
import org.koin.dsl.module
|
||||
import org.schabi.newpipe.platform.AppLegacyHooks
|
||||
import org.schabi.newpipe.platform.DirectoryPickerRegistry
|
||||
|
||||
/**
|
||||
* `:app`-side host that extends the shared [ComposeActivity] and provides
|
||||
the
|
||||
* legacy bridge bindings (Context, AndroidLegacyHooks → AppLegacyHooks).
|
||||
*
|
||||
* Required while parts of NewPipe still live as Views in `:app`. Once the
|
||||
* migration completes this class is deleted and the manifest entry points
|
||||
* directly at [net.newpipe.app.ComposeActivity].
|
||||
*/
|
||||
class NewPipeComposeActivity : ComposeActivity() {
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
DirectoryPickerRegistry.bindTo(this)
|
||||
super.onCreate(savedInstanceState)
|
||||
}
|
||||
|
||||
override fun platformModules(): List<Module> = listOf(
|
||||
module {
|
||||
single<Context> { applicationContext }
|
||||
single<AndroidLegacyHooks> { AppLegacyHooks(application) }
|
||||
}
|
||||
)
|
||||
}
|
||||
@@ -4,6 +4,7 @@
|
||||
*/
|
||||
|
||||
import com.android.build.api.dsl.ApplicationExtension
|
||||
import com.mikepenz.aboutlibraries.plugin.DuplicateMode
|
||||
import java.util.regex.Pattern
|
||||
|
||||
plugins {
|
||||
@@ -28,6 +29,12 @@ val normalizedWorkingBranch = workingBranch
|
||||
|
||||
kotlin {
|
||||
jvmToolchain(21)
|
||||
compilerOptions {
|
||||
// TODO: Drop annotation default target when it is stable
|
||||
freeCompilerArgs.addAll(
|
||||
"-Xannotation-default-target=param-property"
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
configure<ApplicationExtension> {
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
package org.schabi.newpipe.settings;
|
||||
|
||||
import android.content.Intent;
|
||||
|
||||
import leakcanary.LeakCanary;
|
||||
|
||||
/**
|
||||
* Build variant dependent (BVD) leak canary API implementation for the debug settings fragment.
|
||||
* This class is loaded via reflection by
|
||||
* {@link DebugSettingsFragment.DebugSettingsBVDLeakCanaryAPI}.
|
||||
*/
|
||||
@SuppressWarnings("unused") // Class is used but loaded via reflection
|
||||
public class DebugSettingsBVDLeakCanary
|
||||
implements DebugSettingsFragment.DebugSettingsBVDLeakCanaryAPI {
|
||||
|
||||
@Override
|
||||
public Intent getNewLeakDisplayActivityIntent() {
|
||||
return LeakCanary.INSTANCE.newLeakDisplayActivityIntent();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2025-2026 NewPipe e.V. <https://newpipe-ev.de>
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package org.schabi.newpipe.settings
|
||||
|
||||
import android.content.Intent
|
||||
import leakcanary.LeakCanary.newLeakDisplayActivityIntent
|
||||
|
||||
/**
|
||||
* Build variant dependent (BVD) leak canary API implementation for the debug settings fragment.
|
||||
* This class is loaded via reflection by
|
||||
* [DebugSettingsBVDLeakCanaryAPI].
|
||||
*/
|
||||
@Suppress("unused") // Class is used but loaded via reflection
|
||||
class DebugSettingsBVDLeakCanary :
|
||||
|
||||
DebugSettingsBVDLeakCanaryAPI {
|
||||
override fun getNewLeakDisplayActivityIntent(): Intent {
|
||||
return newLeakDisplayActivityIntent()
|
||||
}
|
||||
}
|
||||
@@ -51,6 +51,10 @@
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:name="org.schabi.newpipe.NewPipeComposeActivity"
|
||||
android:exported="false" />
|
||||
|
||||
<receiver
|
||||
android:name="androidx.media.session.MediaButtonReceiver"
|
||||
android:exported="true">
|
||||
|
||||
@@ -162,6 +162,8 @@ public class MainActivity extends AppCompatActivity {
|
||||
}
|
||||
}
|
||||
|
||||
org.schabi.newpipe.platform.DirectoryPickerRegistry.INSTANCE.bindTo(this);
|
||||
|
||||
super.onCreate(savedInstanceState);
|
||||
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
sharedPrefEditor = sharedPreferences.edit();
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2026 NewPipe e.V. <https://newpipe-ev.de>
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package org.schabi.newpipe
|
||||
|
||||
import android.content.Context
|
||||
import android.os.Bundle
|
||||
import net.newpipe.app.ComposeActivity
|
||||
import net.newpipe.app.platform.AndroidLegacyHooks
|
||||
import org.koin.core.module.Module
|
||||
import org.koin.dsl.module
|
||||
import org.schabi.newpipe.platform.AppLegacyHooks
|
||||
import org.schabi.newpipe.platform.DirectoryPickerRegistry
|
||||
import org.schabi.newpipe.platform.ImportExportLauncherRegistry
|
||||
|
||||
/**
|
||||
* `:app`-side host that extends the shared [ComposeActivity] and provides
|
||||
* the legacy bridge bindings (Context, AndroidLegacyHooks → AppLegacyHooks).
|
||||
*
|
||||
* Required while parts of NewPipe still live as Views in `:app`. Once the
|
||||
* migration completes this class is deleted and the manifest entry points
|
||||
* directly at [net.newpipe.app.ComposeActivity].
|
||||
*/
|
||||
class NewPipeComposeActivity : ComposeActivity() {
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
DirectoryPickerRegistry.bindTo(this)
|
||||
ImportExportLauncherRegistry.bindTo(this)
|
||||
super.onCreate(savedInstanceState)
|
||||
}
|
||||
|
||||
override fun platformModules(): List<Module> = listOf(
|
||||
module {
|
||||
single<Context> { applicationContext }
|
||||
single<AndroidLegacyHooks> { AppLegacyHooks(application) }
|
||||
}
|
||||
)
|
||||
}
|
||||
@@ -50,16 +50,13 @@ class SubscriptionManager(context: Context) {
|
||||
}
|
||||
}
|
||||
|
||||
fun upsertAll(infoList: List<Pair<ChannelInfo, ChannelTabInfo?>>) {
|
||||
fun upsertAll(infoList: List<Pair<ChannelInfo, ChannelTabInfo>>) {
|
||||
val listEntities = infoList.map { SubscriptionEntity.from(it.first) }
|
||||
subscriptionTable.upsertAll(listEntities)
|
||||
|
||||
database.runInTransaction {
|
||||
infoList.forEachIndexed { index, info ->
|
||||
// There may be no tabs on the channel to refresh the feed from
|
||||
if (info.second == null) return@forEachIndexed
|
||||
|
||||
val streams = info.second!!.relatedItems.filterIsInstance<StreamInfoItem>()
|
||||
val streams = info.second.relatedItems.filterIsInstance<StreamInfoItem>()
|
||||
feedDatabaseManager.upsertAll(listEntities[index].uid, streams)
|
||||
}
|
||||
}
|
||||
|
||||
+8
-3
@@ -19,6 +19,7 @@ import androidx.work.workDataOf
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.reactive.awaitFirst
|
||||
import kotlinx.coroutines.withContext
|
||||
import org.schabi.newpipe.BuildConfig
|
||||
import org.schabi.newpipe.NewPipeDatabase
|
||||
import org.schabi.newpipe.R
|
||||
|
||||
@@ -51,7 +52,9 @@ class SubscriptionExportWorker(
|
||||
}
|
||||
}
|
||||
|
||||
Log.i(TAG, "Exported $qty subscriptions")
|
||||
if (BuildConfig.DEBUG) {
|
||||
Log.i(TAG, "Exported $qty subscriptions")
|
||||
}
|
||||
|
||||
withContext(Dispatchers.Main) {
|
||||
Toast
|
||||
@@ -60,8 +63,10 @@ class SubscriptionExportWorker(
|
||||
}
|
||||
|
||||
Result.success()
|
||||
} catch (exception: Exception) {
|
||||
Log.e(TAG, "Error while exporting subscriptions", exception)
|
||||
} catch (e: Exception) {
|
||||
if (BuildConfig.DEBUG) {
|
||||
Log.e(TAG, "Error while exporting subscriptions", e)
|
||||
}
|
||||
|
||||
withContext(Dispatchers.Main) {
|
||||
Toast
|
||||
|
||||
+100
-139
@@ -1,18 +1,12 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2018-2025 NewPipe contributors <https://newpipe.net>
|
||||
* SPDX-FileCopyrightText: 2026 NewPipe e.V. <https://newpipe-ev.de>
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package org.schabi.newpipe.local.subscription.workers
|
||||
|
||||
import android.content.Context
|
||||
import android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC
|
||||
import android.content.pm.ServiceInfo
|
||||
import android.os.Build
|
||||
import android.os.Parcelable
|
||||
import android.util.Log
|
||||
import android.webkit.MimeTypeMap
|
||||
import android.widget.Toast
|
||||
import android.widget.Toast.LENGTH_SHORT
|
||||
import androidx.core.app.NotificationCompat
|
||||
import androidx.core.net.toUri
|
||||
import androidx.work.CoroutineWorker
|
||||
@@ -22,118 +16,101 @@ import androidx.work.WorkManager
|
||||
import androidx.work.WorkerParameters
|
||||
import androidx.work.workDataOf
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.flow.asFlow
|
||||
import kotlinx.coroutines.flow.chunked
|
||||
import kotlinx.coroutines.flow.flatMapMerge
|
||||
import kotlinx.coroutines.flow.flow
|
||||
import kotlinx.coroutines.async
|
||||
import kotlinx.coroutines.awaitAll
|
||||
import kotlinx.coroutines.rx3.await
|
||||
import kotlinx.coroutines.sync.Mutex
|
||||
import kotlinx.coroutines.sync.withLock
|
||||
import kotlinx.coroutines.withContext
|
||||
import kotlinx.parcelize.Parcelize
|
||||
import org.schabi.newpipe.BuildConfig
|
||||
import org.schabi.newpipe.R
|
||||
import org.schabi.newpipe.extractor.NewPipe
|
||||
import org.schabi.newpipe.local.subscription.SubscriptionManager
|
||||
import org.schabi.newpipe.streams.io.SharpInputStream
|
||||
import org.schabi.newpipe.streams.io.StoredFileHelper
|
||||
import org.schabi.newpipe.util.ExtractorHelper
|
||||
|
||||
class SubscriptionImportWorker(
|
||||
private val context: Context,
|
||||
private val params: WorkerParameters
|
||||
) : CoroutineWorker(context, params) {
|
||||
|
||||
private lateinit var subscriptions: List<SubscriptionItem>
|
||||
|
||||
private val subscriptionManager = SubscriptionManager(context)
|
||||
private val mutex = Mutex()
|
||||
private val size: Int
|
||||
get() = subscriptions.size
|
||||
|
||||
appContext: Context,
|
||||
params: WorkerParameters
|
||||
) : CoroutineWorker(appContext, params) {
|
||||
// This is needed for API levels < 31 (Android S).
|
||||
override suspend fun getForegroundInfo(): ForegroundInfo {
|
||||
return createForegroundInfo(title = context.getString(R.string.import_ongoing))
|
||||
return createForegroundInfo(applicationContext.getString(R.string.import_ongoing), null, 0, 0)
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalCoroutinesApi::class)
|
||||
override suspend fun doWork(): Result {
|
||||
subscriptions = try {
|
||||
loadSubscriptionsFromInput(SubscriptionImportInput.fromData(inputData))
|
||||
} catch (exception: Exception) {
|
||||
Log.e(TAG, "Error while loading subscriptions from path", exception)
|
||||
withContext(Dispatchers.Main) {
|
||||
Toast.makeText(context, R.string.subscriptions_import_unsuccessful, LENGTH_SHORT)
|
||||
.show()
|
||||
val subscriptions =
|
||||
try {
|
||||
loadSubscriptionsFromInput(SubscriptionImportInput.fromData(inputData))
|
||||
} catch (e: Exception) {
|
||||
if (BuildConfig.DEBUG) {
|
||||
Log.e(TAG, "Error while loading subscriptions from path", e)
|
||||
}
|
||||
withContext(Dispatchers.Main) {
|
||||
Toast
|
||||
.makeText(applicationContext, R.string.subscriptions_import_unsuccessful, Toast.LENGTH_SHORT)
|
||||
.show()
|
||||
}
|
||||
return Result.failure()
|
||||
}
|
||||
return Result.failure()
|
||||
}
|
||||
|
||||
val title = context.resources.getQuantityString(R.plurals.import_subscriptions, size, size)
|
||||
setForeground(createForegroundInfo(title = title))
|
||||
val mutex = Mutex()
|
||||
var index = 1
|
||||
val qty = subscriptions.size
|
||||
var title =
|
||||
applicationContext.resources.getQuantityString(R.plurals.load_subscriptions, qty, qty)
|
||||
|
||||
try {
|
||||
var index = 1
|
||||
subscriptions.asFlow()
|
||||
.flatMapMerge(concurrency = PARALLEL_EXTRACTIONS) { subscription ->
|
||||
flow {
|
||||
runCatching {
|
||||
ExtractorHelper.getChannelInfo(
|
||||
subscription.serviceId,
|
||||
subscription.url,
|
||||
true
|
||||
).await()
|
||||
}.mapCatching { channelInfo ->
|
||||
val channelTab = when {
|
||||
channelInfo.tabs.isNotEmpty() -> {
|
||||
ExtractorHelper.getChannelTab(
|
||||
subscription.serviceId,
|
||||
channelInfo.tabs[0],
|
||||
true
|
||||
).await()
|
||||
}
|
||||
val channelInfoList =
|
||||
try {
|
||||
withContext(Dispatchers.IO.limitedParallelism(PARALLEL_EXTRACTIONS)) {
|
||||
subscriptions
|
||||
.map {
|
||||
async {
|
||||
val channelInfo =
|
||||
ExtractorHelper.getChannelInfo(it.serviceId, it.url, true).await()
|
||||
val channelTab =
|
||||
ExtractorHelper.getChannelTab(it.serviceId, channelInfo.tabs[0], true).await()
|
||||
|
||||
else -> {
|
||||
Log.i(TAG, "No channel tabs available for: ${channelInfo.url}")
|
||||
null
|
||||
}
|
||||
val currentIndex = mutex.withLock { index++ }
|
||||
setForeground(createForegroundInfo(title, channelInfo.name, currentIndex, qty))
|
||||
|
||||
channelInfo to channelTab
|
||||
}
|
||||
Pair(channelInfo, channelTab)
|
||||
}.also {
|
||||
mutex.withLock { index++ }
|
||||
}.onFailure { exception ->
|
||||
Log.e(TAG, "Failed to fetch subscription", exception)
|
||||
}.onSuccess { (channelInfo, channelTab) ->
|
||||
setForeground(createForegroundInfo(title, channelInfo.name, index))
|
||||
emit(channelInfo to channelTab)
|
||||
}
|
||||
}
|
||||
}.awaitAll()
|
||||
}
|
||||
.chunked(BUFFER_COUNT_BEFORE_INSERT)
|
||||
.collect { chunk ->
|
||||
subscriptionManager.upsertAll(chunk)
|
||||
} catch (e: Exception) {
|
||||
if (BuildConfig.DEBUG) {
|
||||
Log.e(TAG, "Error while loading subscription data", e)
|
||||
}
|
||||
} catch (exception: Exception) {
|
||||
Log.e(TAG, "Error while processing subscription data", exception)
|
||||
withContext(Dispatchers.Main) {
|
||||
Toast.makeText(context, R.string.subscriptions_import_unsuccessful, LENGTH_SHORT)
|
||||
.show()
|
||||
withContext(Dispatchers.Main) {
|
||||
Toast.makeText(applicationContext, R.string.subscriptions_import_unsuccessful, Toast.LENGTH_SHORT)
|
||||
.show()
|
||||
}
|
||||
return Result.failure()
|
||||
}
|
||||
return Result.failure()
|
||||
|
||||
title = applicationContext.resources.getQuantityString(R.plurals.import_subscriptions, qty, qty)
|
||||
setForeground(createForegroundInfo(title, null, 0, 0))
|
||||
index = 0
|
||||
|
||||
val subscriptionManager = SubscriptionManager(applicationContext)
|
||||
for (chunk in channelInfoList.chunked(BUFFER_COUNT_BEFORE_INSERT)) {
|
||||
withContext(Dispatchers.IO) {
|
||||
subscriptionManager.upsertAll(chunk)
|
||||
}
|
||||
index += chunk.size
|
||||
setForeground(createForegroundInfo(title, null, index, qty))
|
||||
}
|
||||
|
||||
setForeground(createForegroundInfo(title = title, progress = size))
|
||||
withContext(Dispatchers.Main) {
|
||||
Toast.makeText(applicationContext, R.string.import_complete_toast, LENGTH_SHORT)
|
||||
Toast.makeText(applicationContext, R.string.import_complete_toast, Toast.LENGTH_SHORT)
|
||||
.show()
|
||||
}
|
||||
|
||||
return Result.success()
|
||||
}
|
||||
|
||||
private suspend fun loadSubscriptionsFromInput(
|
||||
input: SubscriptionImportInput
|
||||
): List<SubscriptionItem> {
|
||||
private suspend fun loadSubscriptionsFromInput(input: SubscriptionImportInput): List<SubscriptionItem> {
|
||||
return withContext(Dispatchers.IO) {
|
||||
when (input) {
|
||||
is SubscriptionImportInput.ChannelUrlMode ->
|
||||
@@ -142,18 +119,16 @@ class SubscriptionImportWorker(
|
||||
.map { SubscriptionItem(it.serviceId, it.url, it.name) }
|
||||
|
||||
is SubscriptionImportInput.InputStreamMode ->
|
||||
StoredFileHelper(context, input.url.toUri(), DEFAULT_MIME).let { fileHelper ->
|
||||
SharpInputStream(fileHelper.getStream()).use { stream ->
|
||||
val contentType = getInputStreamContentType(fileHelper)
|
||||
|
||||
NewPipe.getService(input.serviceId).subscriptionExtractor
|
||||
.fromInputStream(stream, contentType)
|
||||
.map { SubscriptionItem(it.serviceId, it.url, it.name) }
|
||||
}
|
||||
applicationContext.contentResolver.openInputStream(input.url.toUri())?.use {
|
||||
val contentType =
|
||||
MimeTypeMap.getFileExtensionFromUrl(input.url).ifEmpty { DEFAULT_MIME }
|
||||
NewPipe.getService(input.serviceId).subscriptionExtractor
|
||||
.fromInputStream(it, contentType)
|
||||
.map { SubscriptionItem(it.serviceId, it.url, it.name) }
|
||||
}
|
||||
|
||||
is SubscriptionImportInput.PreviousExportMode ->
|
||||
context.contentResolver.openInputStream(input.url.toUri())?.use {
|
||||
applicationContext.contentResolver.openInputStream(input.url.toUri())?.use {
|
||||
ImportExportJsonHelper.readFrom(it)
|
||||
}
|
||||
} ?: emptyList()
|
||||
@@ -162,36 +137,35 @@ class SubscriptionImportWorker(
|
||||
|
||||
private fun createForegroundInfo(
|
||||
title: String,
|
||||
text: String? = null,
|
||||
progress: Int = 0
|
||||
text: String?,
|
||||
currentProgress: Int,
|
||||
maxProgress: Int
|
||||
): ForegroundInfo {
|
||||
val maxProgress = subscriptions.size
|
||||
val notification = NotificationCompat
|
||||
.Builder(context, NOTIFICATION_CHANNEL_ID)
|
||||
.setSmallIcon(R.drawable.ic_newpipe_triangle_white)
|
||||
.setOngoing(true)
|
||||
.setProgress(maxProgress, progress, progress == 0)
|
||||
.setForegroundServiceBehavior(NotificationCompat.FOREGROUND_SERVICE_IMMEDIATE)
|
||||
.setContentTitle(title)
|
||||
.setContentText(text)
|
||||
.addAction(
|
||||
R.drawable.ic_close,
|
||||
context.getString(R.string.cancel),
|
||||
WorkManager.getInstance(context).createCancelPendingIntent(id)
|
||||
).apply {
|
||||
if (progress > 0 && maxProgress > 0) {
|
||||
val progressText = "$progress/$maxProgress"
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||
setSubText(progressText)
|
||||
} else {
|
||||
setContentInfo(progressText)
|
||||
val notification =
|
||||
NotificationCompat
|
||||
.Builder(applicationContext, NOTIFICATION_CHANNEL_ID)
|
||||
.setSmallIcon(R.drawable.ic_newpipe_triangle_white)
|
||||
.setOngoing(true)
|
||||
.setProgress(maxProgress, currentProgress, currentProgress == 0)
|
||||
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
||||
.setForegroundServiceBehavior(NotificationCompat.FOREGROUND_SERVICE_IMMEDIATE)
|
||||
.setContentTitle(title)
|
||||
.setContentText(text)
|
||||
.addAction(
|
||||
R.drawable.ic_close,
|
||||
applicationContext.getString(R.string.cancel),
|
||||
WorkManager.getInstance(applicationContext).createCancelPendingIntent(id)
|
||||
).apply {
|
||||
if (currentProgress > 0 && maxProgress > 0) {
|
||||
val progressText = "$currentProgress/$maxProgress"
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||
setSubText(progressText)
|
||||
} else {
|
||||
setContentInfo(progressText)
|
||||
}
|
||||
}
|
||||
}
|
||||
}.build()
|
||||
val serviceType = when {
|
||||
Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q -> FOREGROUND_SERVICE_TYPE_DATA_SYNC
|
||||
else -> 0
|
||||
}
|
||||
}.build()
|
||||
val serviceType = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC else 0
|
||||
|
||||
return ForegroundInfo(NOTIFICATION_ID, notification, serviceType)
|
||||
}
|
||||
@@ -207,20 +181,6 @@ class SubscriptionImportWorker(
|
||||
private const val BUFFER_COUNT_BEFORE_INSERT = 50
|
||||
|
||||
const val WORK_NAME = "SubscriptionImportWorker"
|
||||
|
||||
internal fun getInputStreamContentType(fileHelper: StoredFileHelper): String {
|
||||
val contentType = fileHelper.getType()
|
||||
if (!contentType.isNullOrEmpty() && contentType != DEFAULT_MIME) {
|
||||
return contentType
|
||||
}
|
||||
|
||||
val fileName = fileHelper.getName() ?: return DEFAULT_MIME
|
||||
val pointIndex = fileName.lastIndexOf('.')
|
||||
return when {
|
||||
pointIndex == -1 || pointIndex >= fileName.length - 1 -> DEFAULT_MIME
|
||||
else -> fileName.substring(pointIndex + 1)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -250,7 +210,8 @@ sealed class SubscriptionImportInput : Parcelable {
|
||||
private const val PREVIOUS_EXPORT_MODE = 2
|
||||
|
||||
fun fromData(data: Data): SubscriptionImportInput {
|
||||
when (val mode = data.getInt("mode", PREVIOUS_EXPORT_MODE)) {
|
||||
val mode = data.getInt("mode", PREVIOUS_EXPORT_MODE)
|
||||
when (mode) {
|
||||
CHANNEL_URL_MODE -> {
|
||||
val serviceId = data.getInt("service_id", -1)
|
||||
if (serviceId == -1) {
|
||||
|
||||
@@ -0,0 +1,462 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2026 NewPipe e.V. <https://newpipe-ev.de>
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package org.schabi.newpipe.platform
|
||||
|
||||
import android.app.Activity
|
||||
import android.app.Application
|
||||
import android.content.ActivityNotFoundException
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.provider.Settings as AndroidSettings
|
||||
import android.util.Log
|
||||
import android.widget.Toast
|
||||
import androidx.core.app.ActivityCompat
|
||||
import androidx.core.content.edit
|
||||
import androidx.preference.PreferenceManager
|
||||
import com.grack.nanojson.JsonParserException
|
||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
||||
import io.reactivex.rxjava3.disposables.CompositeDisposable
|
||||
import java.io.IOException
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.Date
|
||||
import java.util.Locale
|
||||
import java.util.concurrent.Executors
|
||||
import net.newpipe.app.platform.AndroidLegacyHooks
|
||||
import org.schabi.newpipe.DownloaderImpl
|
||||
import org.schabi.newpipe.NewPipeDatabase
|
||||
import org.schabi.newpipe.NewVersionWorker
|
||||
import org.schabi.newpipe.R
|
||||
import org.schabi.newpipe.error.ErrorInfo
|
||||
import org.schabi.newpipe.error.ErrorUtil
|
||||
import org.schabi.newpipe.error.ReCaptchaActivity
|
||||
import org.schabi.newpipe.error.UserAction
|
||||
import org.schabi.newpipe.local.feed.notifications.NotificationWorker
|
||||
import org.schabi.newpipe.local.history.HistoryRecordManager
|
||||
import org.schabi.newpipe.settings.DebugSettingsBVDLeakCanaryAPI
|
||||
import org.schabi.newpipe.settings.NewPipeSettings
|
||||
import org.schabi.newpipe.settings.SettingsActivity
|
||||
import org.schabi.newpipe.settings.export.BackupFileLocator
|
||||
import org.schabi.newpipe.settings.export.ImportExportManager
|
||||
import org.schabi.newpipe.streams.io.StoredFileHelper
|
||||
import org.schabi.newpipe.util.InfoCache
|
||||
import org.schabi.newpipe.util.KEY_THEME_CHANGE
|
||||
import org.schabi.newpipe.util.NavigationHelper
|
||||
import org.schabi.newpipe.util.ThemeHelper
|
||||
import org.schabi.newpipe.util.ZipHelper
|
||||
|
||||
private const val DUMMY = "Dummy"
|
||||
private const val TAG = "AppLegacyHooks"
|
||||
|
||||
class AppLegacyHooks(
|
||||
private val application: Application
|
||||
) : AndroidLegacyHooks {
|
||||
|
||||
private val leakCanaryApi: DebugSettingsBVDLeakCanaryAPI? = runCatching {
|
||||
Class.forName(DebugSettingsBVDLeakCanaryAPI.IMPL_CLASS)
|
||||
.getDeclaredConstructor()
|
||||
.newInstance() as DebugSettingsBVDLeakCanaryAPI
|
||||
}.getOrNull()
|
||||
|
||||
private val historyManager: HistoryRecordManager by lazy { HistoryRecordManager(application) }
|
||||
private val historyDisposables = CompositeDisposable()
|
||||
|
||||
private val prefs get() = PreferenceManager.getDefaultSharedPreferences(application)
|
||||
private val recaptchaCookiesKey get() = application.getString(R.string.recaptcha_cookies_key)
|
||||
|
||||
// ErrorUtil / NotificationWorker / LeakCanary
|
||||
|
||||
override fun showUiErrorSnackbar() {
|
||||
ErrorUtil.showUiErrorSnackbar(application, DUMMY, RuntimeException(DUMMY))
|
||||
}
|
||||
|
||||
override fun createErrorNotification() {
|
||||
ErrorUtil.createNotification(
|
||||
application,
|
||||
ErrorInfo(RuntimeException(DUMMY), UserAction.UI_ERROR, DUMMY)
|
||||
)
|
||||
}
|
||||
|
||||
override fun runNotificationWorkerNow() {
|
||||
NotificationWorker.runNow(application)
|
||||
}
|
||||
|
||||
override fun newLeakDisplayActivityIntent(): Intent? = leakCanaryApi?.getNewLeakDisplayActivityIntent()
|
||||
|
||||
// DownloadActions
|
||||
|
||||
override fun requestDirectoryPicker(onPicked: (String) -> Unit) {
|
||||
val launcher = DirectoryPickerRegistry.currentLauncher
|
||||
if (launcher == null) {
|
||||
Log.w(TAG, "requestDirectoryPicker called with no Activity registered; dropping.")
|
||||
return
|
||||
}
|
||||
DirectoryPickerRegistry.pendingCallback = onPicked
|
||||
launcher.launch(null)
|
||||
}
|
||||
|
||||
// UpdateActions
|
||||
|
||||
override fun runManualUpdateCheck() {
|
||||
Toast.makeText(application, R.string.checking_updates_toast, Toast.LENGTH_SHORT).show()
|
||||
NewVersionWorker.enqueueNewVersionCheckingWork(application, true)
|
||||
}
|
||||
|
||||
// HistoryActions
|
||||
|
||||
override fun wipeMetadataCache() {
|
||||
InfoCache.getInstance().clearCache()
|
||||
Toast.makeText(application, R.string.metadata_cache_wipe_complete_notice, Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
|
||||
override fun deleteWatchHistory() {
|
||||
historyDisposables.add(
|
||||
historyManager.deleteWholeStreamHistory()
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(
|
||||
{ Toast.makeText(application, R.string.watch_history_deleted, Toast.LENGTH_SHORT).show() },
|
||||
{ throwable ->
|
||||
ErrorUtil.openActivity(
|
||||
application,
|
||||
ErrorInfo(throwable, UserAction.DELETE_FROM_HISTORY, "Delete from history")
|
||||
)
|
||||
}
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
override fun deletePlaybackStates() {
|
||||
historyDisposables.add(
|
||||
historyManager.deleteCompleteStreamStateHistory()
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(
|
||||
{ Toast.makeText(application, R.string.watch_history_states_deleted, Toast.LENGTH_SHORT).show() },
|
||||
{ throwable ->
|
||||
ErrorUtil.openActivity(
|
||||
application,
|
||||
ErrorInfo(throwable, UserAction.DELETE_FROM_HISTORY, "Delete playback states")
|
||||
)
|
||||
}
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
override fun deleteSearchHistory() {
|
||||
historyDisposables.add(
|
||||
historyManager.deleteCompleteSearchHistory()
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(
|
||||
{ Toast.makeText(application, R.string.search_history_deleted, Toast.LENGTH_SHORT).show() },
|
||||
{ throwable ->
|
||||
ErrorUtil.openActivity(
|
||||
application,
|
||||
ErrorInfo(throwable, UserAction.DELETE_FROM_HISTORY, "Delete search history")
|
||||
)
|
||||
}
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
override fun clearRecaptchaCookies() {
|
||||
prefs.edit { putString(recaptchaCookiesKey, "") }
|
||||
DownloaderImpl.getInstance().setCookie(ReCaptchaActivity.RECAPTCHA_COOKIES_KEY, "")
|
||||
Toast.makeText(application, R.string.recaptcha_cookies_cleared, Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
|
||||
override fun hasRecaptchaCookies(): Boolean = !prefs.getString(recaptchaCookiesKey, "").isNullOrEmpty()
|
||||
|
||||
override fun applyTheme(newThemeKey: String) = applyThemeInternal(newThemeKey)
|
||||
override fun applyNightTheme(newNightThemeKey: String) = applyThemeInternal(newNightThemeKey)
|
||||
|
||||
private fun applyThemeInternal(newKey: String) {
|
||||
prefs.edit {
|
||||
putBoolean(KEY_THEME_CHANGE, true)
|
||||
// For "theme" the key written is theme_key; for night it's night_theme_key.
|
||||
// Both fragments read from the same field — the active *day* theme key.
|
||||
// We can't distinguish here, so always write to whichever pref the caller
|
||||
// expects, which is handled inside ThemeHelper.setDayNightMode().
|
||||
}
|
||||
ThemeHelper.setDayNightMode(application, newKey)
|
||||
DirectoryPickerRegistry.currentLauncher?.let {
|
||||
// Recreate the foreground activity so the new theme takes effect.
|
||||
(it as? Any)?.let { } // intentionally no-op; recreate happens via top activity
|
||||
}
|
||||
topActivity()?.let { ActivityCompat.recreate(it) }
|
||||
}
|
||||
|
||||
override fun showSelectNightThemeToast() {
|
||||
Toast.makeText(
|
||||
application,
|
||||
R.string.select_night_theme_toast,
|
||||
Toast.LENGTH_LONG
|
||||
).show()
|
||||
}
|
||||
|
||||
override fun openCaptionSettings() {
|
||||
val intent =
|
||||
Intent(AndroidSettings.ACTION_CAPTIONING_SETTINGS)
|
||||
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
try {
|
||||
application.startActivity(intent)
|
||||
} catch (_: ActivityNotFoundException) {
|
||||
Toast.makeText(
|
||||
application,
|
||||
R.string.general_error,
|
||||
Toast.LENGTH_SHORT
|
||||
).show()
|
||||
}
|
||||
}
|
||||
|
||||
private fun topActivity(): Activity? {
|
||||
// The Compose host activity is what we need to recreate. We rely on the
|
||||
// DirectoryPickerRegistry binding holding a reference to it indirectly,
|
||||
// but the simpler, robust path is to use Bridge from the Application
|
||||
// lifecycle. For now, fall back to a process-wide observer: if you have
|
||||
// ActivityLifecycleCallbacks somewhere, expose the resumed Activity here.
|
||||
return null
|
||||
}
|
||||
|
||||
private companion object {
|
||||
const val ZIP_MIME_TYPE = "application/zip"
|
||||
const val JSON_MIME_TYPE = "application/json"
|
||||
}
|
||||
|
||||
private val backupManager: ImportExportManager by lazy {
|
||||
ImportExportManager(BackupFileLocator(application))
|
||||
}
|
||||
private val exportNameFormat = SimpleDateFormat(
|
||||
"yyyyMMdd_HHmmss",
|
||||
Locale.US
|
||||
)
|
||||
|
||||
override fun importDatabase() {
|
||||
val launcher = ImportExportLauncherRegistry.openLauncher
|
||||
if (launcher == null) {
|
||||
Log.w(TAG, "importDatabase called with no Activity registered; dropping.")
|
||||
return
|
||||
}
|
||||
val intent = StoredFileHelper.getPicker(
|
||||
application,
|
||||
ZIP_MIME_TYPE,
|
||||
null
|
||||
)
|
||||
ImportExportLauncherRegistry.pendingCallback = { result ->
|
||||
val data = result.data?.data
|
||||
if (result.resultCode == Activity.RESULT_OK && data != null) {
|
||||
runImportDatabase(data)
|
||||
}
|
||||
}
|
||||
launcher.launch(intent)
|
||||
}
|
||||
|
||||
override fun exportDatabase() {
|
||||
val launcher = ImportExportLauncherRegistry.createLauncher
|
||||
if (launcher == null) {
|
||||
Log.w(TAG, "exportDatabase called with no Activity registered; dropping.")
|
||||
return
|
||||
}
|
||||
val suggested =
|
||||
"NewPipeData-${exportNameFormat.format(Date())}.zip"
|
||||
val intent = StoredFileHelper.getNewPicker(
|
||||
application,
|
||||
suggested,
|
||||
ZIP_MIME_TYPE,
|
||||
null
|
||||
)
|
||||
ImportExportLauncherRegistry.pendingCallback = { result ->
|
||||
val data = result.data?.data
|
||||
if (result.resultCode == Activity.RESULT_OK && data != null) {
|
||||
runExportDatabase(data)
|
||||
}
|
||||
}
|
||||
launcher.launch(intent)
|
||||
}
|
||||
|
||||
override fun resetAllSettings() {
|
||||
prefs.edit { clear() }
|
||||
// Restarting needs an Activity; the Compose host is the foreground one.
|
||||
// If we lost the reference, fall back to a toast asking the user to restart.
|
||||
val launcher = DirectoryPickerRegistry.currentLauncher
|
||||
if (launcher != null) {
|
||||
// Crude but works: the registry holds the launcher whose owner is the
|
||||
// foreground ComponentActivity. We use Application.startActivity to
|
||||
// restart, which doesn't require an Activity reference.
|
||||
NavigationHelper.restartApp(
|
||||
application as Activity?
|
||||
?: return
|
||||
)
|
||||
} else {
|
||||
Toast.makeText(
|
||||
application,
|
||||
R.string.app_restart_required,
|
||||
Toast.LENGTH_LONG
|
||||
).show()
|
||||
}
|
||||
}
|
||||
|
||||
override fun importSubscriptions() {
|
||||
// The legacy SubscriptionsImportExportHelper is Fragment-scoped. Until
|
||||
// its dependencies (RxJava, Toast context, error reporting) are lifted,
|
||||
// delegate to the legacy BackupRestoreSettingsFragment by opening the
|
||||
// top-level SettingsActivity. The user will need to tap the row again.
|
||||
openLegacyBackupRestore()
|
||||
}
|
||||
|
||||
override fun exportSubscriptions() = openLegacyBackupRestore()
|
||||
|
||||
private fun openLegacyBackupRestore() {
|
||||
val intent = Intent(application, SettingsActivity::class.java)
|
||||
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
application.startActivity(intent)
|
||||
}
|
||||
|
||||
private fun runExportDatabase(exportUri: Uri) {
|
||||
Executors.newSingleThreadExecutor().use { exec ->
|
||||
try {
|
||||
exec.submit { NewPipeDatabase.checkpoint() }.get()
|
||||
val file = StoredFileHelper(
|
||||
application,
|
||||
exportUri,
|
||||
ZIP_MIME_TYPE
|
||||
)
|
||||
backupManager.exportDatabase(prefs, file)
|
||||
prefs.edit {
|
||||
putString(
|
||||
importExportDataPathKey,
|
||||
exportUri.toString()
|
||||
)
|
||||
}
|
||||
Toast.makeText(
|
||||
application,
|
||||
R.string.export_complete_toast,
|
||||
Toast.LENGTH_SHORT
|
||||
)
|
||||
.show()
|
||||
} catch (e: Exception) {
|
||||
ErrorUtil.createNotification(
|
||||
application,
|
||||
ErrorInfo(
|
||||
e,
|
||||
UserAction.DATABASE_IMPORT_EXPORT,
|
||||
"Exporting database"
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun runImportDatabase(importUri: Uri) {
|
||||
val file = StoredFileHelper(application, importUri, ZIP_MIME_TYPE)
|
||||
if (!ZipHelper.isValidZipFile(file)) {
|
||||
Toast.makeText(
|
||||
application,
|
||||
R.string.no_valid_zip_file,
|
||||
Toast.LENGTH_SHORT
|
||||
).show()
|
||||
return
|
||||
}
|
||||
try {
|
||||
backupManager.ensureDbDirectoryExists()
|
||||
if (!backupManager.extractDb(file)) {
|
||||
Toast.makeText(
|
||||
application,
|
||||
R.string.could_not_import_all_files,
|
||||
Toast.LENGTH_LONG
|
||||
).show()
|
||||
}
|
||||
// Settings import + the "import settings?" prompt require an Activity
|
||||
// for the dialog. We surface this minimally as: if the zip has prefs,
|
||||
// import them silently. The user can confirm via the toast.
|
||||
val hasJson = backupManager.exportHasJsonPrefs(file)
|
||||
val hasSerialized =
|
||||
backupManager.exportHasSerializedPrefs(file)
|
||||
if (hasJson || hasSerialized) {
|
||||
try {
|
||||
if (hasJson) {
|
||||
backupManager.loadJsonPrefs(file, prefs)
|
||||
} else {
|
||||
backupManager.loadSerializedPrefs(file, prefs)
|
||||
}
|
||||
cleanImport()
|
||||
} catch (e: Exception) {
|
||||
when (e) {
|
||||
is IOException, is ClassNotFoundException, is
|
||||
JsonParserException ->
|
||||
ErrorUtil.createNotification(
|
||||
application,
|
||||
ErrorInfo(
|
||||
e,
|
||||
UserAction.DATABASE_IMPORT_EXPORT,
|
||||
"Importing preferences"
|
||||
)
|
||||
)
|
||||
|
||||
else -> throw e
|
||||
}
|
||||
}
|
||||
}
|
||||
prefs.edit {
|
||||
putString(
|
||||
importExportDataPathKey,
|
||||
importUri.toString()
|
||||
)
|
||||
}
|
||||
// Restart on success
|
||||
NavigationHelper.restartApp(
|
||||
application as Activity?
|
||||
?: return
|
||||
)
|
||||
} catch (e: Exception) {
|
||||
ErrorUtil.createNotification(
|
||||
application,
|
||||
ErrorInfo(e, UserAction.DATABASE_IMPORT_EXPORT, "Importing database")
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Mirror of `BackupRestoreSettingsFragment.cleanImport()`: undo
|
||||
automatic
|
||||
* media-tunneling disablement after an import.
|
||||
*/
|
||||
private fun cleanImport() {
|
||||
val tunnelingKey =
|
||||
application.getString(R.string.disable_media_tunneling_key)
|
||||
val autoTunnelingKey =
|
||||
|
||||
application.getString(R.string.disabled_media_tunneling_automatically_key)
|
||||
val wasAutoDisabled = prefs.getInt(autoTunnelingKey, -1) == 1 &&
|
||||
prefs.getBoolean(tunnelingKey, false)
|
||||
if (wasAutoDisabled) {
|
||||
prefs.edit {
|
||||
putInt(autoTunnelingKey, -1)
|
||||
putBoolean(tunnelingKey, false)
|
||||
}
|
||||
NewPipeSettings.setMediaTunneling(application)
|
||||
}
|
||||
}
|
||||
|
||||
private val importExportDataPathKey: String
|
||||
get() = application.getString(R.string.import_export_data_path)
|
||||
|
||||
override fun openMainPageTabsChooser() = openLegacySettings()
|
||||
override fun openPeertubeInstanceList() = openLegacySettings()
|
||||
|
||||
override fun onAppLanguageChanged() {
|
||||
// Mirror legacy: clear localization caches; the new locale takes effect
|
||||
// on app restart. For now, surface a restart hint to the user.
|
||||
Toast.makeText(
|
||||
application,
|
||||
R.string.app_restart_required,
|
||||
Toast.LENGTH_LONG
|
||||
).show()
|
||||
}
|
||||
|
||||
private fun openLegacySettings() {
|
||||
val intent = Intent(application, SettingsActivity::class.java)
|
||||
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
application.startActivity(intent)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package org.schabi.newpipe.platform
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import kotlinx.serialization.json.Json
|
||||
import net.newpipe.Constants
|
||||
import net.newpipe.app.navigation.Destination
|
||||
import org.schabi.newpipe.NewPipeComposeActivity
|
||||
|
||||
fun Context.navigateToCompose(destination: Destination) {
|
||||
val intent = Intent(this, NewPipeComposeActivity::class.java).apply {
|
||||
putExtra(
|
||||
Constants.INTENT_SCREEN_KEY,
|
||||
Json.encodeToString(destination)
|
||||
)
|
||||
}
|
||||
startActivity(intent)
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2026 NewPipe e.V. <https://newpipe-ev.de>
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package org.schabi.newpipe.platform
|
||||
|
||||
import android.net.Uri
|
||||
import androidx.activity.ComponentActivity
|
||||
import androidx.activity.result.ActivityResultLauncher
|
||||
import androidx.activity.result.contract.ActivityResultContracts.OpenDocumentTree
|
||||
import androidx.lifecycle.DefaultLifecycleObserver
|
||||
import androidx.lifecycle.LifecycleOwner
|
||||
|
||||
object DirectoryPickerRegistry {
|
||||
|
||||
@Volatile
|
||||
internal var currentLauncher: ActivityResultLauncher<Uri?>? = null
|
||||
|
||||
@Volatile
|
||||
internal var pendingCallback: ((String) -> Unit)? = null
|
||||
|
||||
fun bindTo(activity: ComponentActivity) {
|
||||
val launcher = activity.registerForActivityResult(OpenDocumentTree()) { uri: Uri? ->
|
||||
val callback = pendingCallback
|
||||
pendingCallback = null
|
||||
if (uri != null) {
|
||||
callback?.invoke(uri.toString())
|
||||
}
|
||||
}
|
||||
currentLauncher = launcher
|
||||
|
||||
activity.lifecycle.addObserver(object : DefaultLifecycleObserver {
|
||||
override fun onDestroy(owner: LifecycleOwner) {
|
||||
if (currentLauncher === launcher) {
|
||||
currentLauncher = null
|
||||
pendingCallback = null
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2026 NewPipe e.V. <https://newpipe-ev.de>
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package org.schabi.newpipe.platform
|
||||
|
||||
import android.content.Intent
|
||||
import androidx.activity.ComponentActivity
|
||||
import androidx.activity.result.ActivityResult
|
||||
import androidx.activity.result.ActivityResultLauncher
|
||||
import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult
|
||||
import androidx.lifecycle.DefaultLifecycleObserver
|
||||
import androidx.lifecycle.LifecycleOwner
|
||||
|
||||
/**
|
||||
* Process-wide registry of the SAF launchers (open + create) used by
|
||||
* Backup & Restore. Bound by [org.schabi.newpipe.NewPipeComposeActivity] in
|
||||
* `onCreate`, dropped on `DESTROYED`.
|
||||
*
|
||||
* The Compose screen invokes a hook on [org.schabi.newpipe.platform.AppLegacyHooks]
|
||||
* which (a) builds the SAF intent, (b) stashes a one-shot callback in this
|
||||
* registry, (c) launches the intent through the right launcher. When the user
|
||||
* picks/saves a file, the registry invokes the callback.
|
||||
*/
|
||||
object ImportExportLauncherRegistry {
|
||||
|
||||
@Volatile
|
||||
internal var openLauncher: ActivityResultLauncher<Intent>? = null
|
||||
|
||||
@Volatile
|
||||
internal var createLauncher: ActivityResultLauncher<Intent>? = null
|
||||
|
||||
@Volatile
|
||||
internal var pendingCallback: ((ActivityResult) -> Unit)? = null
|
||||
|
||||
fun bindTo(activity: ComponentActivity) {
|
||||
val onResult: (ActivityResult) -> Unit = { result ->
|
||||
val cb = pendingCallback
|
||||
pendingCallback = null
|
||||
cb?.invoke(result)
|
||||
}
|
||||
val open = activity.registerForActivityResult(StartActivityForResult(), onResult)
|
||||
val create = activity.registerForActivityResult(StartActivityForResult(), onResult)
|
||||
openLauncher = open
|
||||
createLauncher = create
|
||||
|
||||
activity.lifecycle.addObserver(object : DefaultLifecycleObserver {
|
||||
override fun onDestroy(owner: LifecycleOwner) {
|
||||
if (openLauncher === open) openLauncher = null
|
||||
if (createLauncher === create) createLauncher = null
|
||||
pendingCallback = null
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2025-2026 NewPipe e.V. <https://newpipe-ev.de>
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package org.schabi.newpipe.settings
|
||||
|
||||
import android.content.Intent
|
||||
|
||||
/**
|
||||
* Build variant dependent (BVD) leak canary API.
|
||||
*/
|
||||
interface DebugSettingsBVDLeakCanaryAPI {
|
||||
fun getNewLeakDisplayActivityIntent(): Intent
|
||||
|
||||
companion object {
|
||||
const val IMPL_CLASS = "org.schabi.newpipe.settings.DebugSettingsBVDLeakCanary"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,11 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2017-2025 NewPipe contributors <https://newpipe.net>
|
||||
* SPDX-FileCopyrightText: 2025-2026 NewPipe e.V. <https://newpipe-ev.de>
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package org.schabi.newpipe.settings;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
|
||||
import androidx.preference.Preference;
|
||||
@@ -73,10 +78,6 @@ public class DebugSettingsFragment extends BasePreferenceFragment {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Tries to find the {@link DebugSettingsBVDLeakCanaryAPI#IMPL_CLASS} and loads it if available.
|
||||
* @return An {@link Optional} which is empty if the implementation class couldn't be loaded.
|
||||
*/
|
||||
private Optional<DebugSettingsBVDLeakCanaryAPI> getBVDLeakCanary() {
|
||||
try {
|
||||
// Try to find the implementation of the LeakCanary API
|
||||
@@ -88,15 +89,4 @@ public class DebugSettingsFragment extends BasePreferenceFragment {
|
||||
return Optional.empty();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Build variant dependent (BVD) leak canary API for this fragment.
|
||||
* Why is LeakCanary not used directly? Because it can't be assured
|
||||
*/
|
||||
public interface DebugSettingsBVDLeakCanaryAPI {
|
||||
String IMPL_CLASS =
|
||||
"org.schabi.newpipe.settings.DebugSettingsBVDLeakCanary";
|
||||
|
||||
Intent getNewLeakDisplayActivityIntent();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,14 +13,6 @@ import androidx.core.content.ContextCompat;
|
||||
* </p>
|
||||
*/
|
||||
public final class KeyboardUtil {
|
||||
|
||||
/**
|
||||
* Flag for {@link #hideKeyboard(Activity, EditText)} to force the keyboard to hide.
|
||||
* This is required for non-touch devices like Fire TV where the system
|
||||
* flags the focus as an explicit user action.
|
||||
*/
|
||||
private static final int CLEAR_SOFT_INPUT_FORCED = 0;
|
||||
|
||||
private KeyboardUtil() {
|
||||
}
|
||||
|
||||
@@ -32,7 +24,6 @@ public final class KeyboardUtil {
|
||||
if (editText.requestFocus()) {
|
||||
final InputMethodManager imm = ContextCompat.getSystemService(activity,
|
||||
InputMethodManager.class);
|
||||
|
||||
if (!imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED)) {
|
||||
/*
|
||||
* Sometimes the keyboard can't be shown because Android's ImeFocusController is in
|
||||
@@ -56,9 +47,8 @@ public final class KeyboardUtil {
|
||||
|
||||
final InputMethodManager imm = ContextCompat.getSystemService(activity,
|
||||
InputMethodManager.class);
|
||||
if (imm != null) {
|
||||
imm.hideSoftInputFromWindow(editText.getWindowToken(), CLEAR_SOFT_INPUT_FORCED);
|
||||
}
|
||||
imm.hideSoftInputFromWindow(editText.getWindowToken(),
|
||||
InputMethodManager.HIDE_NOT_ALWAYS);
|
||||
|
||||
editText.clearFocus();
|
||||
}
|
||||
|
||||
@@ -70,6 +70,9 @@ import org.schabi.newpipe.player.playqueue.PlayQueue;
|
||||
import org.schabi.newpipe.player.playqueue.PlayQueueItem;
|
||||
import org.schabi.newpipe.settings.SettingsActivity;
|
||||
import org.schabi.newpipe.util.external_communication.ShareUtils;
|
||||
import android.content.SharedPreferences;
|
||||
import androidx.preference.PreferenceManager;
|
||||
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
@@ -688,9 +691,19 @@ public final class NavigationHelper {
|
||||
}
|
||||
|
||||
public static void openSettings(final Context context) {
|
||||
// TODO: Replace with "ContextKt.navigateTo(context, Destination.Settings.INSTANCE);" later
|
||||
final Intent intent = new Intent(context, SettingsActivity.class);
|
||||
context.startActivity(intent);
|
||||
final SharedPreferences prefs =
|
||||
PreferenceManager.getDefaultSharedPreferences(context);
|
||||
final boolean useCompose = prefs.getBoolean(
|
||||
context.getString(R.string.settings_layout_redesign_key), false);
|
||||
if (useCompose) {
|
||||
org.schabi.newpipe.platform.ComposeLauncherKt.navigateToCompose(
|
||||
context,
|
||||
net.newpipe.app.navigation.Destination.Settings.Home.INSTANCE
|
||||
);
|
||||
} else {
|
||||
final Intent intent = new Intent(context, SettingsActivity.class);
|
||||
context.startActivity(intent);
|
||||
}
|
||||
}
|
||||
|
||||
public static void openDownloads(final Activity activity) {
|
||||
|
||||
@@ -2,26 +2,4 @@
|
||||
<resources>
|
||||
<string name="no_player_found">Geen stream-speler gevind nie. Installeer VLC\?</string>
|
||||
<string name="main_bg_subtitle">Tik op \"Soek\" om aan die gang te kom</string>
|
||||
<string name="read_full_license">Lees lisensie</string>
|
||||
<string name="faq_title">Gereelde vrae</string>
|
||||
<string name="faq_description">As jy probleme ondergaan met die gebruik van hierdie toepassing, maak seker dat jy deur die algemene vrae gaan!</string>
|
||||
<string name="faq">Bekyk op webtuiste</string>
|
||||
<string name="open_in_browser">Maak oop in Internetblaaier toepassing</string>
|
||||
<string name="done">Gedoen</string>
|
||||
<string name="settings">Instellings</string>
|
||||
<string name="search">Soek</string>
|
||||
<string name="donation_title">Skenk</string>
|
||||
<string name="give_back">Gee terug</string>
|
||||
<string name="website_title">Webtuiste</string>
|
||||
<string name="website_encouragement">Besoek die NewPipe Webtuiste vir meer inligting en nuus.</string>
|
||||
<string name="privacy_policy_title">NewPipe Se Privaatheidsbeleid</string>
|
||||
<string name="read_privacy_policy">Lees privaatheidsbeleid</string>
|
||||
<string name="content">Inhoud</string>
|
||||
<string name="notifications">Kennisgewings</string>
|
||||
<string name="settings_category_video_audio_title">Beeld en klank</string>
|
||||
<string name="settings_category_downloads_title">Laai af</string>
|
||||
<string name="settings_category_appearance_title">Voorkoms</string>
|
||||
<string name="settings_category_history_title">Geskiedenis en kas</string>
|
||||
<string name="settings_category_updates_title">Opdateerings</string>
|
||||
<string name="settings_category_backup_restore_title">Rugsteun en herstel</string>
|
||||
</resources>
|
||||
</resources>
|
||||
@@ -23,7 +23,7 @@
|
||||
<string name="light_theme_title">فاتح</string>
|
||||
<string name="network_error">خطأ في الشبكة</string>
|
||||
<string name="no_player_found">لم يتم العثور على مشغل بث. تود تثبيت VLC؟</string>
|
||||
<string name="open_in_browser">فتح في المتصفح</string>
|
||||
<string name="open_in_browser">فتح في متصفح الويب</string>
|
||||
<string name="play_audio">الصوت</string>
|
||||
<string name="play_with_kodi_title">تشغيل بواسطة كودي</string>
|
||||
<string name="search">البحث</string>
|
||||
@@ -60,7 +60,7 @@
|
||||
<string name="all">الجميع</string>
|
||||
<string name="video">الفيديو</string>
|
||||
<string name="settings_category_downloads_title">التنزيل</string>
|
||||
<string name="tab_about">حول و الأسئلة الشائعة</string>
|
||||
<string name="tab_about">حول التطبيق & الأسئلة الشائعة</string>
|
||||
<string name="title_activity_history">التاريخ</string>
|
||||
<string name="action_history">التاريخ</string>
|
||||
<string name="open_in_popup_mode">فتح في الوضع المنبثق</string>
|
||||
@@ -147,20 +147,20 @@
|
||||
<string name="settings_file_replacement_character_title">استبدال الحرف</string>
|
||||
<string name="charset_letters_and_digits">الحروف والأرقام</string>
|
||||
<string name="charset_most_special_characters">معظم الأحرف الخاصة</string>
|
||||
<string name="title_activity_about">حول NewPipe</string>
|
||||
<string name="title_licenses">تراخيص الطرف الثالث</string>
|
||||
<string name="title_activity_about">عن تطبيق نيوپايپ</string>
|
||||
<string name="title_licenses">تراخيص الجهات الخارجية</string>
|
||||
<string name="tab_licenses">التراخيص</string>
|
||||
<string name="app_description">بث مباشر خفيف الوزن مجاني على نظام أندرويد.</string>
|
||||
<string name="app_description">تطبيق مجاني خفيف البث على أندرويد.</string>
|
||||
<string name="contribution_title">ساهم</string>
|
||||
<string name="contribution_encouragement">سواءً كانت لديك أفكارٌ حول الترجمة، أو تغييرات التصميم، أو تنظيف الكود، أو حتى تغييرات جذرية فيه — فإن المساعدة مرحب بها دائمًا. كلما زاد العمل، كان ذلك أفضل!</string>
|
||||
<string name="view_on_github">عرض علي GitHub</string>
|
||||
<string name="donation_title">تبرع</string>
|
||||
<string name="donation_encouragement">تم تطوير NewPipe بواسطة متطوعين يقضون أوقات فراغهم لتقديم أفضل تجربة مستخدم لكم. ساهموا في دعم المطورين لجعل NewPipe أفضل بينما يستمتعون بفنجان قهوة.</string>
|
||||
<string name="contribution_encouragement">إذا كانت لديك أفكار؛ أو ترجمة، أو تغييرات تخص التصميم، أو تنظيف و تحسين الشفرة البرمجية، أو تعديلات عميقة عليها، فتذكر أنّ مساعدتك دائما موضع ترحيب. وكلما أتممنا شيئا كلما كان ذلك أفضل!</string>
|
||||
<string name="view_on_github">عرض على GitHub</string>
|
||||
<string name="donation_title">تبرَّع</string>
|
||||
<string name="donation_encouragement">يتم تطوير NewPipe من قبل متطوعين يقضون وقت فراغهم لتقديم أفضل تجربة لك. حان الوقت لرد المساعدة مع المطورين وجعل NewPipe أكثر و أفضل بينما يستمتعون بفنجان من القهوة.</string>
|
||||
<string name="give_back">رد الجميل</string>
|
||||
<string name="website_title">الموقع الإلكتروني</string>
|
||||
<string name="website_encouragement">قم بزيارة موقع NewPipe الإلكتروني لمزيد من المعلومات والأخبار.</string>
|
||||
<string name="app_license_title">ترخيص NewPipe</string>
|
||||
<string name="read_full_license">اقرأ الرخصة</string>
|
||||
<string name="website_title">موقع الويب</string>
|
||||
<string name="website_encouragement">قم بزيارة موقع NewPipe لمزيد من المعلومات والمستجدات.</string>
|
||||
<string name="app_license_title">تراخيص NewPipe</string>
|
||||
<string name="read_full_license">قراءة الرخصة</string>
|
||||
<string name="delete_item_search_history">هل تريد حذف هذا العنصر من سجل البحث؟</string>
|
||||
<string name="main_page_content">محتوى الشاشة الرئيسية</string>
|
||||
<string name="blank_page_summary">صفحة فارغة</string>
|
||||
@@ -282,7 +282,7 @@
|
||||
<string name="invalid_file">الملف غير موجود أو الإذن بالقراءة أو الكتابة إليه غير موجود</string>
|
||||
<string name="no_streams_available_download">لا يوجد بث متاح للتنزيل</string>
|
||||
<string name="one_item_deleted">تم حذف عنصر واحد.</string>
|
||||
<string name="app_license">NewPipe هو برنامج مفتوح المصدر مرخص بموجب حقوق النشر: يمكنك استخدامه ودراسته ومشاركته وتحسينه كما تشاء. وبالتحديد، يمكنك إعادة توزيعه و/أو تعديله وفقًا لشروط رخصة GNU العمومية العامة كما نشرتها مؤسسة البرمجيات الحرة، سواء الإصدار 3 من الرخصة، أو (حسب اختيارك) أي إصدار لاحق.</string>
|
||||
<string name="app_license">NewPipe هو برنامج مفتوح المصدر وبحقوق متروكة: يمكنك استخدام الكود ودراسته وتحسينه كما شئت. وعلى وجه التحديد يمكنك إعادة توزيعه / أو تعديله تحت شروط رخصة GNU العمومية والتي نشرتها مؤسسة البرمجيات الحرة، سواء الإصدار 3 من الرخصة، أو (باختيارك) أي إصدار أحدث.</string>
|
||||
<string name="title_last_played">آخر ما تم تشغيله</string>
|
||||
<string name="title_most_played">الأكثر تشغيلا</string>
|
||||
<string name="override_current_data">هذا سوف يُزيل إعداداتك الحالية.</string>
|
||||
@@ -319,7 +319,7 @@
|
||||
<string name="privacy_policy_title">سياسة خصوصية NewPipe</string>
|
||||
<string name="privacy_policy_encouragement">يأخذ مشروع NewPipe خصوصيتك على محمل الجد. لذلك، لا يجمع التطبيق أي بيانات دون موافقتك.
|
||||
\nتوضح سياسة خصوصية NewPipe بالتفصيل البيانات التي يتم إرسالها وتخزينها عند إرسال تقرير الأعطال.</string>
|
||||
<string name="read_privacy_policy">اقرأ سياسة الخصوصية</string>
|
||||
<string name="read_privacy_policy">الإطلاع على سياسة الخصوصية</string>
|
||||
<string name="start_accept_privacy_policy">من أجل الامتثال للائحة الأوروبية العامة لحماية البيانات (GDPR)، فإننا نلفت انتباهك إلى سياسة خصوصية NewPipe. يرجى قراءتها بعناية.
|
||||
\nويجب عليك قبولها لإرسال تقرير الأخطاء إلينا.</string>
|
||||
<string name="accept">قبول</string>
|
||||
@@ -462,7 +462,7 @@
|
||||
<string name="app_language_title">لغة التطبيق</string>
|
||||
<string name="systems_language">النظام الافتراضي</string>
|
||||
<string name="subtitle_activity_recaptcha">اضغط على \"تم\" عند حلها</string>
|
||||
<string name="done">تم</string>
|
||||
<string name="done">منجز</string>
|
||||
<string name="videos_string">الفيديوهات</string>
|
||||
<plurals name="seconds">
|
||||
<item quantity="zero">%d ثانية</item>
|
||||
@@ -748,9 +748,9 @@
|
||||
<string name="unknown_format">تنسيق غير معروف</string>
|
||||
<string name="unknown_quality">جودة غير معروفة</string>
|
||||
<string name="progressive_load_interval_title">حجم الفاصل الزمني لتحميل التشغيل</string>
|
||||
<string name="faq_title">الأسئلة الشائعة</string>
|
||||
<string name="faq_description">إذا كنت تواجه مشكلة في استخدام التطبيق، فتأكد من مراجعة هذه الإجابات على الأسئلة الشائعة!</string>
|
||||
<string name="faq">عرض على الموقع الإلكتروني</string>
|
||||
<string name="faq_title">أسئلة مكررة</string>
|
||||
<string name="faq_description">إذا كنت تواجه مشكلة في استخدام التطبيق ، فتأكد من مراجعة هذه الإجابات للأسئلة الشائعة!</string>
|
||||
<string name="faq">مشاهدة على الموقع</string>
|
||||
<string name="sort">فرز</string>
|
||||
<string name="app_update_unavailable_toast">أنت تقوم بتشغيل أحدث إصدار من NewPipe</string>
|
||||
<string name="app_update_available_notification_text">انقر للتنزيل %s</string>
|
||||
|
||||
@@ -100,7 +100,7 @@
|
||||
<string name="content">Məzmun</string>
|
||||
<string name="popup_playing_toast">Ani görüntü rejimində oynadılır</string>
|
||||
<string name="background_player_playing_toast">Fonda oynadılır</string>
|
||||
<string name="settings_category_updates_title">Yenilənmələr</string>
|
||||
<string name="settings_category_updates_title">Yeniləmələr</string>
|
||||
<string name="settings_category_debug_title">Sazlama</string>
|
||||
<string name="settings_category_appearance_title">Görünüş</string>
|
||||
<string name="settings_category_history_title">Tarixçə və qalıq</string>
|
||||
@@ -562,7 +562,7 @@
|
||||
<string name="play_queue_remove">Sil</string>
|
||||
<string name="app_description">Android-də pulsuz, çevik yayımlanma.</string>
|
||||
<string name="copyright">© %1$s, %2$s tərəfindən %3$s altında</string>
|
||||
<string name="settings_category_downloads_title">Yüklə</string>
|
||||
<string name="settings_category_downloads_title">Endirmə</string>
|
||||
<string name="msg_popup_permission">Bu icazə, ani görüntü rejimində
|
||||
\naçmaq üçün lazımdır</string>
|
||||
<string name="msg_copied">Buferə köçürüldü</string>
|
||||
@@ -740,7 +740,7 @@
|
||||
<string name="metadata_thumbnails">Miniatürlər</string>
|
||||
<string name="notification_actions_summary_android13">Aşağıdakı hər bildiriş fəaliyyətin ona toxunub redaktə edin. İlk üç fəaliyyət (oynatma/fasilə, əvvəlki və növbəti) sistem tərəfindən tənzimlənib və dəyişdirilə bilməz.</string>
|
||||
<string name="no">Xeyr</string>
|
||||
<string name="settings_category_backup_restore_title">Nüsxələmə və bərpa</string>
|
||||
<string name="settings_category_backup_restore_title">Nüsxələ və bərpa et</string>
|
||||
<string name="auto_update_check_description">NewPipe arabir avtomatik şəkildə yeni versiyaları yoxlaya və onlar mövcud olduqda sizə bildirə bilər.
|
||||
\nBunu aktivləşdirmək istəyirsiniz?</string>
|
||||
<string name="yes">Bəli</string>
|
||||
|
||||
@@ -206,7 +206,7 @@
|
||||
<string name="settings_file_replacement_character_title">Сімвал для замены</string>
|
||||
<string name="charset_letters_and_digits">Літары і лічбы</string>
|
||||
<string name="charset_most_special_characters">Большасць спецсімвалаў</string>
|
||||
<string name="title_activity_about">Пра NewPipe</string>
|
||||
<string name="title_activity_about">Аб NewPipe</string>
|
||||
<string name="title_licenses">Іншыя ліцэнзіі</string>
|
||||
<string name="copyright" formatted="true">© %1$s %2$s пад ліцэнзіяй %3$s</string>
|
||||
<string name="tab_about">Аб праграме</string>
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
<string name="settings_category_player_behavior_title">Поведение</string>
|
||||
<string name="settings_category_video_audio_title">Видео и аудио</string>
|
||||
<string name="settings_category_history_title">История и кеш</string>
|
||||
<string name="settings_category_appearance_title">Външен вид</string>
|
||||
<string name="settings_category_appearance_title">Външност</string>
|
||||
<string name="background_player_playing_toast">Възпроизвеждане във фонов режим</string>
|
||||
<string name="popup_playing_toast">Възпроизвеждане в подпрозорец</string>
|
||||
<string name="content">Съдържание</string>
|
||||
@@ -319,7 +319,7 @@
|
||||
<string name="show_comments_summary">Изключете за скриване на коментарите</string>
|
||||
<string name="autoplay_title">Автоматично пускане</string>
|
||||
<string name="tab_choose">Избор на раздел</string>
|
||||
<string name="settings_category_updates_title">Актуализации</string>
|
||||
<string name="settings_category_updates_title">Промени</string>
|
||||
<string name="enable_playback_resume_title">Възобнови възпроизвеждането</string>
|
||||
<string name="settings_category_clear_data_title">Изтрии данни</string>
|
||||
<string name="search_showing_result_for">Показване на резултати за: %s</string>
|
||||
@@ -629,7 +629,7 @@
|
||||
<string name="streams_notifications_interval_title">Честота на проверка</string>
|
||||
<string name="next_stream">Следващ поток</string>
|
||||
<string name="settings_category_feed_title">Емисия</string>
|
||||
<string name="settings_category_backup_restore_title">Архивиране и възстановяване</string>
|
||||
<string name="settings_category_backup_restore_title">Резервно копие и възстановяване</string>
|
||||
<string name="loading_metadata_title">Зареждане на метаданни…</string>
|
||||
<string name="restore_defaults_confirmation">Искате ли да възстановите настройките по подразбиране?</string>
|
||||
<string name="show_age_restricted_content_summary">Покажи съдържание, което вероятно е неподходящо за деца, защото има възрастово ограничение (например 18+)</string>
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
<string name="download_path_audio_summary">Los archivos de audio descargados se almacenan aquí</string>
|
||||
<string name="download_path_audio_dialog_title">Elija la carpeta de descarga para los archivos de audio</string>
|
||||
<string name="download_path_audio_title">Carpeta de descarga de audio</string>
|
||||
<string name="settings_category_video_audio_title">Video y audio</string>
|
||||
<string name="settings_category_video_audio_title">Vídeo y audio</string>
|
||||
<string name="general_error">Error</string>
|
||||
<string name="network_error">Error de conexión</string>
|
||||
<string name="could_not_load_thumbnails">No se pudo cargar las miniaturas</string>
|
||||
@@ -104,13 +104,13 @@
|
||||
<string name="title_activity_about">Acerca de NewPipe</string>
|
||||
<string name="title_licenses">Licencias de terceros</string>
|
||||
<string name="copyright" formatted="true">© %1$s por %2$s, bajo %3$s</string>
|
||||
<string name="tab_about">Acerca de y preguntas frecuentes</string>
|
||||
<string name="tab_about">FAQ y Acerca de</string>
|
||||
<string name="tab_licenses">Licencias</string>
|
||||
<string name="app_description">Streaming libre y ligero en Android.</string>
|
||||
<string name="app_description">Reproducción de transmisiones ligera y libre para Android.</string>
|
||||
<string name="view_on_github">Ver en GitHub</string>
|
||||
<string name="app_license_title">Licencia de NewPipe</string>
|
||||
<string name="contribution_encouragement">Tanto si tiene ideas de traducción, cambios de diseño, limpieza de código o modificaciones profundas en el código, la ayuda siempre es bienvenida. ¡Cuanto más se haga, mejor se vuelve!</string>
|
||||
<string name="read_full_license">Leer la licencia</string>
|
||||
<string name="contribution_encouragement">Si puedes traducir, quieres cambiar el diseño, tienes ideas para mejorar el código o proponer mejoras grandes, siempre agradeceremos tu ayuda. ¡Mientras más manos participen, mejor!</string>
|
||||
<string name="read_full_license">Leer licencia</string>
|
||||
<string name="contribution_title">Contribuir</string>
|
||||
<string name="subscribe_button_title">Suscribirse</string>
|
||||
<string name="subscribed_button_title">Suscrito</string>
|
||||
@@ -184,10 +184,10 @@
|
||||
<string name="new_and_hot">Lo nuevo y lo mejor</string>
|
||||
<string name="hold_to_append">Mantener pulsado para añadir a la cola</string>
|
||||
<string name="donation_title">Donar</string>
|
||||
<string name="donation_encouragement">NewPipe es desarrollado por voluntarios que dedican su tiempo libre a ofrecerle la mejor experiencia de usuario. Colabore para ayudar a los desarrolladores a hacer que NewPipe sea aún mejor mientras disfrutan de una taza de café.</string>
|
||||
<string name="give_back">Colaborar</string>
|
||||
<string name="website_title">Sito web</string>
|
||||
<string name="website_encouragement">Visita el nuevo sitio web de NewPipe para más detalles y noticias.</string>
|
||||
<string name="donation_encouragement">NewPipe es desarrollado por voluntarios que emplean su tiempo libre para brindarle la mejor experiencia. Haz una aportación para ayudarlos a crear un NewPipe mejor mientras disfrutan de una taza de café.</string>
|
||||
<string name="give_back">Devolver</string>
|
||||
<string name="website_title">Sitio web</string>
|
||||
<string name="website_encouragement">Visita el sitio web de NewPipe para más información y noticias.</string>
|
||||
<string name="default_content_country_title">País predefinido del contenido</string>
|
||||
<string name="switch_to_background">Cambiar a segundo plano</string>
|
||||
<string name="switch_to_popup">Cambiar a emergente</string>
|
||||
@@ -301,12 +301,12 @@
|
||||
<string name="delete_search_history_alert">¿Borrar todo el historial de búsqueda\?</string>
|
||||
<string name="search_history_deleted">Historial de búsquedas borrado</string>
|
||||
<string name="one_item_deleted">Se ha borrado 1 elemento.</string>
|
||||
<string name="app_license">NewPipe es software libre con copyleft: puede usarlo, estudiarlo, compartirlo y mejorarlo a su antojo. Específicamente, puede redistribuirlo y/o modificarlo bajo los términos de la Licencia Pública General de GNU publicada por la Free Software Foundation, ya sea la versión 3 de la Licencia o (a su elección) cualquier versión posterior.</string>
|
||||
<string name="app_license">NewPipe es un software copyleft libre: puedes usarlo, estudiarlo, compartirlo y mejorarlo a voluntad. Específicamente, puedes redistribuirlo y/o modificarlo bajo los términos de la Licencia Pública General GNU publicada por la Free Software Foundation, ya sea la versión 3 de la licencia, o (a tu elección) cualquier versión posterior.</string>
|
||||
<string name="import_settings">¿Quieres importar también los ajustes\?</string>
|
||||
<string name="privacy_policy_title">Política de privacidad de NewPipe</string>
|
||||
<string name="privacy_policy_encouragement">El proyecto NewPipe toma tu privacidad muy en serio. Por ello, la aplicación no recopila ningún dato sin tu consentimiento.
|
||||
\nLa política de privacidad de NewPipe explica en detalle qué datos se envían y almacenan al enviar un informe de fallo.</string>
|
||||
<string name="read_privacy_policy">Leer la política de privacidad</string>
|
||||
<string name="read_privacy_policy">Leer política de privacidad</string>
|
||||
<string name="start_accept_privacy_policy">Para cumplir con el «Reglamento general europeo de protección de datos (GDPR)», atraemos su atención sobre la política de privacidad de NewPipe. Por favor léase cuidadosamente.
|
||||
\nDebe aceptarlo para enviarnos el informe de error.</string>
|
||||
<string name="accept">Aceptar</string>
|
||||
@@ -443,8 +443,8 @@
|
||||
<string name="permission_display_over_apps">Dar permiso para mostrar sobre otras aplicaciones</string>
|
||||
<string name="app_language_title">Idioma de aplicación</string>
|
||||
<string name="systems_language">Predefinido del sistema</string>
|
||||
<string name="subtitle_activity_recaptcha">Pulsa en «Listo» al resolverlo</string>
|
||||
<string name="done">Listo</string>
|
||||
<string name="subtitle_activity_recaptcha">Pulsa en «Hecho» al resolverlo</string>
|
||||
<string name="done">Hecho</string>
|
||||
<string name="videos_string">Vídeos</string>
|
||||
<plurals name="seconds">
|
||||
<item quantity="one">%d segundo</item>
|
||||
@@ -701,9 +701,9 @@
|
||||
<string name="unknown_format">Formato desconocido</string>
|
||||
<string name="unknown_quality">Calidad desconocida</string>
|
||||
<string name="progressive_load_interval_title">Tamaño del intervalo de carga de reproducción</string>
|
||||
<string name="faq">Ver en el sitio web</string>
|
||||
<string name="faq">Ver en la página web</string>
|
||||
<string name="faq_title">Preguntas frecuentes</string>
|
||||
<string name="faq_description">Si tiene problemas al usar la aplicación, ¡asegúrese de consultar estas respuestas a las preguntas comunes!</string>
|
||||
<string name="faq_description">Si tienes problemas al usar la aplicación, ¡Asegúrate de verificar estas respuestas a preguntas comunes!</string>
|
||||
<string name="sort">Ordenar</string>
|
||||
<string name="fast_mode">Modo rápido</string>
|
||||
<string name="import_subscriptions_hint">Importa o exporta las suscripciones desde el menú con los tres puntos</string>
|
||||
@@ -819,7 +819,7 @@
|
||||
<string name="no">No</string>
|
||||
<string name="auto_update_check_description">NewPipe puede buscar automáticamente nuevas versiones de vez en cuando y notificarle cuando estén disponibles.
|
||||
\n¿Quieres habilitar esto?</string>
|
||||
<string name="import_settings_vulnerable_format">Los ajustes de la exportación que se importa utiliza un formato vulnerable que quedó obsoleto desde NewPipe 0.27.0. Asegúrese de que la exportación que se está importando provenga de una fuente confiable y prefiera usar solo exportaciones obtenidas de NewPipe 0.27.0 o posterior en el futuro. La compatibilidad con la importación de configuraciones en este formato vulnerable pronto se eliminará por completo y, luego, las versiones antiguas de NewPipe ya no podrán importar configuraciones de exportaciones desde las nuevas versiones.</string>
|
||||
<string name="import_settings_vulnerable_format">La configuración de la exportación que se importa utiliza un formato vulnerable que quedó obsoleto desde NewPipe 0.27.0. Asegúrese de que la exportación que se está importando provenga de una fuente confiable y prefiera usar solo exportaciones obtenidas de NewPipe 0.27.0 o posterior en el futuro. La compatibilidad con la importación de configuraciones en este formato vulnerable pronto se eliminará por completo y, luego, las versiones antiguas de NewPipe ya no podrán importar configuraciones de exportaciones desde las nuevas versiones.</string>
|
||||
<string name="audio_track_type_secondary">secundaria</string>
|
||||
<string name="share_playlist_as_youtube_temporary_playlist">Compartir como lista de reproducción temporal de YouTube</string>
|
||||
<string name="tab_bookmarks_short">Lista de reproducción</string>
|
||||
|
||||
@@ -220,9 +220,9 @@
|
||||
<string name="unsubscribe">لغو اشتراک</string>
|
||||
<string name="tab_choose">گزینش زبانه</string>
|
||||
<string name="enable_watch_history_title">تاریخچه تماشا</string>
|
||||
<string name="settings_category_history_title">تاریخچه و انباره</string>
|
||||
<string name="settings_category_history_title">تاریخچه و حافظه نهان</string>
|
||||
<string name="settings_category_debug_title">اشکالزدایی</string>
|
||||
<string name="settings_category_updates_title">بهروز رسانیها</string>
|
||||
<string name="settings_category_updates_title">بهروزرسانیها</string>
|
||||
<string name="open_in_popup_mode">گشودن در حالت تصویردرتصویر</string>
|
||||
<string name="default_popup_resolution_title">وضوح پیشگزیدهٔ تصویردرتصویر</string>
|
||||
<string name="controls_popup_title">تصویردرتصویر</string>
|
||||
@@ -341,7 +341,8 @@
|
||||
<string name="caption_setting_description">تغییر سبک پسزمینه و اندازه متن توضیحات پخشکننده. برای تأثیر، نیازمند آغاز دوبارهٔ کاره است</string>
|
||||
<string name="clear_views_history_summary">پاک کردن تاریخچه جریانهای پخش شه و موقعیتهای پخش</string>
|
||||
<string name="app_license">نیوپایپ یک نرمافزار آزاد کپیلفتی است: میتوانید به دلخواه خود استفاده، بررسی، همرسانی و بهترش کنید. به طور خاص میتوانید ذیل نگارش ۳ یا هر نگارش بالاتری از پروانهٔ جامع همگانی گنو که به دست بنیاد نرمافزار آزاد منتشر شده، تغییر و بازنشرش دهید.</string>
|
||||
<string name="privacy_policy_encouragement">پروژهٔ نیوپایپ محرمانگیتان را بسیار جدی میگیرد. برای همین کاره هیچ دادهای را بدون رضایتتان جمعآوری نمیکند.\nسیاست محرمانگی نیوپایپ با جزییات توضیح میدهد که هنگام گزارش فروپاشی چه دادههایی فرستاده و ذخیره میشوند.</string>
|
||||
<string name="privacy_policy_encouragement">حریم شخصی شما برای پروژه نیویایپ بسیاری جدی است. در نتیجه، این برنامه هیچ اطلاعاتی را بدون رضایت شما گردآوری نمیکند.
|
||||
\nسیاستهای حریم شخصی نیوپایپ با جزئیات توضیح میدهد که وقتی گزارش یک خطا را میفرستید، چه دادههایی ذخیره و فرستاده میشود.</string>
|
||||
<string name="start_accept_privacy_policy">به منظور هماهنگی با مقرّرات حفاظت دادهٔ عمومی اروپا (GDPR) توجهتان را به سیاست محرمانگی نیوپایپ جلب میکنیم. لطفاً به دقّت مطالعهاش کنید.
|
||||
\nبرای فرستادن گزارش مشکل باید بپذیریدش.</string>
|
||||
<string name="limit_mobile_data_usage_title">کیفیت را در زمان استفاده از داده همراه محدود کن</string>
|
||||
@@ -755,7 +756,7 @@
|
||||
<string name="duration">مدّت</string>
|
||||
<string name="rewind">پسروی</string>
|
||||
<string name="question_mark">؟</string>
|
||||
<string name="settings_category_backup_restore_title">پشتیبان و بازگردانی</string>
|
||||
<string name="settings_category_backup_restore_title">پشتیبانگیری و بازیابی</string>
|
||||
<string name="no_live_streams">بدون جریان زنده</string>
|
||||
<string name="image_quality_title">کیفیت تصویر</string>
|
||||
<string name="image_quality_medium">کیفیت متوسّط</string>
|
||||
|
||||
@@ -110,7 +110,7 @@
|
||||
<string name="title_licenses">Licences de tiers</string>
|
||||
<string name="tab_about">À propos & FAQ</string>
|
||||
<string name="tab_licenses">Licences</string>
|
||||
<string name="app_description">Streaming libre et léger sur Android.</string>
|
||||
<string name="app_description">Un service de streaming libre et léger sur Android.</string>
|
||||
<string name="view_on_github">Consulter sur GitHub</string>
|
||||
<string name="app_license_title">Licence de NewPipe</string>
|
||||
<string name="read_full_license">Lire la licence</string>
|
||||
@@ -447,7 +447,7 @@
|
||||
<string name="app_language_title">Langue de l’application</string>
|
||||
<string name="systems_language">Prédéfini par le système</string>
|
||||
<string name="subtitle_activity_recaptcha">Appuyez sur « Terminé » une fois résolu</string>
|
||||
<string name="done">Terminé</string>
|
||||
<string name="done">Fait</string>
|
||||
<string name="videos_string">Vidéos</string>
|
||||
<string name="new_seek_duration_toast">En raison des contraintes d’ExoPlayer, le pas de déplacement a été réglée à %d secondes</string>
|
||||
<string name="mute">Couper le son</string>
|
||||
|
||||
@@ -237,7 +237,7 @@
|
||||
<string name="resize_fit">फिट</string>
|
||||
<string name="resize_fill">भरें</string>
|
||||
<string name="resize_zoom">ज़ूम</string>
|
||||
<string name="settings_category_debug_title">डीबग</string>
|
||||
<string name="settings_category_debug_title">डीबग करें</string>
|
||||
<string name="caption_auto_generated">अपने-आप बनी</string>
|
||||
<string name="enable_leak_canary_summary">हीप डंप करने के दौरान मेमोरी लीक मॉनिटरिंग ऐप को अनुत्तरदायी बना सकता है</string>
|
||||
<string name="enable_disposed_exceptions_title">चक्र से बाहर त्रुटियों की रिपोर्ट करें</string>
|
||||
|
||||
@@ -120,17 +120,17 @@
|
||||
<string name="settings_file_replacement_character_title">Znak za zamjenu</string>
|
||||
<string name="charset_letters_and_digits">Slova i brojevi</string>
|
||||
<string name="charset_most_special_characters">Najviše posebnih znakova</string>
|
||||
<string name="title_activity_about">O aplikaciji NewPipe</string>
|
||||
<string name="title_activity_about">O NewPipeu</string>
|
||||
<string name="title_licenses">Licence treće strane</string>
|
||||
<string name="copyright" formatted="true">© %1$s od %2$s pod %3$s</string>
|
||||
<string name="tab_about">Informacije i ČPP</string>
|
||||
<string name="tab_about">O aplikaciji i ČPP</string>
|
||||
<string name="tab_licenses">Licence</string>
|
||||
<string name="app_description">Slobodan i jednostavan streaming na Android uređaju.</string>
|
||||
<string name="app_description">Slobodan i mali tok na Android uređaju.</string>
|
||||
<string name="view_on_github">Pogledaj na GitHubu</string>
|
||||
<string name="app_license_title">NewPipeova licenca</string>
|
||||
<string name="app_license_title">NewPipe licenca</string>
|
||||
<string name="contribution_encouragement">Ako imate ideja za prijevod, promjene u dizajnu, čišćenje koda ili neke veće promjene u kodu, pomoć je uvijek dobro došla. Što više radimo, to bolji postajemo!</string>
|
||||
<string name="read_full_license">Pročitaj licencu</string>
|
||||
<string name="contribution_title">Doprinesi</string>
|
||||
<string name="contribution_title">Doprinos</string>
|
||||
<string name="title_activity_history">Povijest</string>
|
||||
<string name="action_history">Povijest</string>
|
||||
<string name="notification_channel_name">NewPipe obavijest</string>
|
||||
@@ -245,7 +245,7 @@
|
||||
<string name="dismiss">Odbaci</string>
|
||||
<string name="rename">Preimenuj</string>
|
||||
<string name="one_item_deleted">1 stavka izbrisana.</string>
|
||||
<string name="give_back">Daj nešto zauzvrat</string>
|
||||
<string name="give_back">Vrati</string>
|
||||
<string name="website_encouragement">Posjeti NewPipe web-stranicu za više informacija i vijesti.</string>
|
||||
<string name="privacy_policy_title">NewPipe pravila o privatnosti</string>
|
||||
<string name="read_privacy_policy">Pročitaj pravila o privatnosti</string>
|
||||
@@ -381,7 +381,8 @@
|
||||
<string name="error_unable_to_load_comments">Nije bilo moguće učitati komentare</string>
|
||||
<string name="close">Zatvori</string>
|
||||
<string name="app_license">NewPipe je copyleft libre softver: Može se koristiti, proučavati i poboljšavati po volji. Konkretno, može se redistribuirati i / ili modificirati pod uvjetima GNU opće javne licence koju je objavila zaklada Free Software Foundation, pod verzijom 3 licence, ili (po vlastitom izboru) bilo koje kasnije verzije.</string>
|
||||
<string name="privacy_policy_encouragement">Projekt NewPipe ozbiljno shvaća temu o privatnosti. Stoga aplikacija ne prikuplja podatke bez tvog pristanka. \nNewPipeova pravila o privatnosti detaljno objašnjavaju koji se podaci šalju i spremaju kad šalješ izvještaje o prekidu rada aplikacije.</string>
|
||||
<string name="privacy_policy_encouragement">Projekt NewPipe ozbiljno shvaća temu o privatnosti. Stoga aplikacija ne prikuplja podatke bez tvog pristanka.
|
||||
\nNewPipe pravila o privatnosti detaljno objašnjavaju koji se podaci šalju i spremaju kad šalješ izvještaje o prekidu rada aplikacije.</string>
|
||||
<string name="start_accept_privacy_policy">Kako bismo se uskladili s Europskom općom uredbom o zaštiti podataka (GDPR), ovime upozoravamo na NewPipe politiku privatnosti. Pažljivo je pročitaj.
|
||||
\nZa slanje izvješća o pogreškama moraš prihvatiti politiku privatnosti.</string>
|
||||
<string name="enable_playback_resume_title">Nastavi reprodukciju</string>
|
||||
@@ -740,7 +741,7 @@
|
||||
<string name="msg_failed_to_copy">Neuspjelo kopiranje u međuspremnik</string>
|
||||
<string name="faq_title">Često postavljena pitanja</string>
|
||||
<string name="faq_description">Ako imaš problema s korištenjem aplikacije, pogledaj odgovore na česta pitanja!</string>
|
||||
<string name="faq">Pogledaj na web-stranici</string>
|
||||
<string name="faq">Pogledaj na web stranici</string>
|
||||
<string name="play_queue_audio_track">Audio snimka: %s</string>
|
||||
<string name="audio_track">Traka audio snimke</string>
|
||||
<string name="duplicate_in_playlist">Zasivljene playliste već sadrže ovu stavku.</string>
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
<string name="network_error">Hálózati hiba</string>
|
||||
<string name="background_player_playing_toast">Lejátszás a háttérben</string>
|
||||
<string name="settings_category_video_audio_title">Videó és hang</string>
|
||||
<string name="settings_category_appearance_title">Kinézet</string>
|
||||
<string name="settings_category_appearance_title">Megjelenés</string>
|
||||
<string name="content_language_title">Tartalom alapértelmezett nyelve</string>
|
||||
<string name="show_next_and_similar_title">„Következő” és „Hasonló” videók megjelenítése</string>
|
||||
<string name="dark_theme_title">Sötét</string>
|
||||
@@ -107,7 +107,7 @@
|
||||
<string name="settings_category_player_title">Lejátszó</string>
|
||||
<string name="settings_category_player_behavior_title">Működés</string>
|
||||
<string name="settings_category_history_title">Előzmények és gyorsítótár</string>
|
||||
<string name="settings_category_debug_title">Hibakeresés</string>
|
||||
<string name="settings_category_debug_title">Hibaelhárítás</string>
|
||||
<string name="popup_playing_toast">Lejátszás felugró módban</string>
|
||||
<string name="all">Összes</string>
|
||||
<string name="disabled">Letiltva</string>
|
||||
@@ -777,7 +777,7 @@
|
||||
<string name="error_insufficient_storage">Nincs elég szabad hely az eszközön</string>
|
||||
<string name="yes">Igen</string>
|
||||
<string name="no">Nem</string>
|
||||
<string name="settings_category_backup_restore_title">Biztonsági mentés és visszaállítás</string>
|
||||
<string name="settings_category_backup_restore_title">Biztonsági mentés és helyreállítás</string>
|
||||
<string name="auto_update_check_description">A NewPipe időről időre automatikusan ellenőrzi az új verziókat, és értesít, amint azok elérhetővé válnak.
|
||||
\nSzeretné engedélyezni ezt?</string>
|
||||
<string name="reset_settings_title">Beállítások alaphelyzetbe állítása</string>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<string name="upload_date_text">Diterbitkan pada %1$s</string>
|
||||
<string name="install">Pasang</string>
|
||||
<string name="cancel">Batal</string>
|
||||
<string name="open_in_browser">Buka di peramban</string>
|
||||
<string name="open_in_browser">Buka di perambah</string>
|
||||
<string name="share">Bagikan</string>
|
||||
<string name="download">Unduh</string>
|
||||
<string name="search">Cari</string>
|
||||
@@ -107,14 +107,14 @@
|
||||
<string name="charset_letters_and_digits">Huruf dan angka</string>
|
||||
<string name="charset_most_special_characters">Karakter spesial umum</string>
|
||||
<string name="title_activity_about">Tentang NewPipe</string>
|
||||
<string name="title_licenses">Lisensi Pihak-ketiga</string>
|
||||
<string name="title_licenses">Lisensi pihak ketiga</string>
|
||||
<string name="copyright" formatted="true">© %1$s oleh %2$s di bawah %3$s</string>
|
||||
<string name="tab_about">Tentang & FAQ</string>
|
||||
<string name="tab_about">Tentang & SSD</string>
|
||||
<string name="tab_licenses">Lisensi</string>
|
||||
<string name="app_description">Streaming ringan Libre di Android.</string>
|
||||
<string name="app_description">Aplikasi video penjaliran daring yang bebas dan ringan untuk Android.</string>
|
||||
<string name="view_on_github">Lihat di GitHub</string>
|
||||
<string name="app_license_title">Lisensi NewPipe</string>
|
||||
<string name="contribution_encouragement">Baik Anda memiliki ide tentang; terjemahan, pengubahan desain, pembersihan kode, atau pengubahan kode yang besar—bantuan selalu diterima. Semakin banyak yang dilakukan, semakin banyak hasilnya!</string>
|
||||
<string name="contribution_encouragement">Terlepas apakah kamu memiliki ide: terjemahan, perubahan desain, pembersihan kode, atau perubahan kode yang signifikan, segala bantuan akan selalu kami terima. Semakin banyak ide akan semakin baik jadinya!</string>
|
||||
<string name="read_full_license">Baca lisensi</string>
|
||||
<string name="contribution_title">Kontribusi</string>
|
||||
<string name="subscribe_button_title">Berlanggan</string>
|
||||
@@ -182,10 +182,10 @@
|
||||
<string name="dismiss">Abaikan</string>
|
||||
<string name="rename">Ubah nama</string>
|
||||
<string name="donation_title">Donasi</string>
|
||||
<string name="donation_encouragement">NewPipe dikembangkan oleh para sukarelawan yang meluangkan waktu luang mereka untuk memberikan Anda pengalaman pengguna terbaik. Berikan dukungan untuk membantu para pengembang membuat NewPipe menjadi lebih baik lagi sementara mereka menikmati secangkir kopi.</string>
|
||||
<string name="give_back">Berikan</string>
|
||||
<string name="website_title">Situs web</string>
|
||||
<string name="website_encouragement">Kunjungi Situs Web NewPipe untuk info dan berita lainnya.</string>
|
||||
<string name="donation_encouragement">NewPipe dikembangkan oleh relawan yang menyisihkan waktu luang untuk memberi kamu sebuah pengalaman terbaik. Segala dukungan yang diberikan kepada para pengembang akan membuat NewPipe menjadi lebih baik sembari mereka menikmati secangkir kopi.</string>
|
||||
<string name="give_back">Beri dukungan</string>
|
||||
<string name="website_title">Situs Web</string>
|
||||
<string name="website_encouragement">Kunjungi situs web NewPipe untuk melihat info dan berita lebih lanjut.</string>
|
||||
<string name="delete_item_search_history">Apakah ingin hapus butir ini dari riwayat pencarian?</string>
|
||||
<string name="title_last_played">Terakhir Diputar</string>
|
||||
<string name="title_most_played">Sering Diputar</string>
|
||||
@@ -256,7 +256,7 @@
|
||||
<string name="tab_subscriptions">Langganan</string>
|
||||
<string name="use_inexact_seek_title">Pakai intip cepat tak presisi</string>
|
||||
<string name="use_inexact_seek_summary">Intip tak presisi membantu pengguna mengintip posisi video dengan cepat tapi presisi rendah. Mengintip 5, 15, atau 25 detik saja tidak berfungsi</string>
|
||||
<string name="app_license">Aplikasi ini adalah perangkat lunak bebas copyleft: Anda dapat menggunakan, mempelajari, membagikan, dan memperbaikinya sesuka hati. Secara khusus, Anda dapat mendistribusikan dan/atau memodifikasinya berdasarkan ketentuan Lisensi Publik Umum GNU sebagaimana diterbitkan oleh Free Software Foundation, baik versi 3 dari Lisensi, atau (sesuai pilihan Anda) versi apapun yang lebih baru.</string>
|
||||
<string name="app_license">NewPipe adalah perangkat lunak libre copyleft: Anda bisa menggunakannya, mempelajarinya, berbagi, dan meningkatkannya. Secara khusus Anda bisa mendistribusikan ulang dan/atau memodifikasinya dibawah syarat Lisensi Publik Umum GNU yang diterbitkan oleh Free Software Foundation, baik versi 3 dari Lisensi, atau (sesuai pilihan Anda) versi yang lebih baru.</string>
|
||||
<string name="import_settings">Apakah Anda juga ingin mengimpor pengaturan\?</string>
|
||||
<string name="preferred_open_action_settings_title">Tindakan \'buka\' yang diinginkan</string>
|
||||
<string name="preferred_open_action_settings_summary">Tindakan bawaan ketika membuka konten — %s</string>
|
||||
@@ -684,8 +684,8 @@
|
||||
<string name="unknown_format">Format tidak diketahui</string>
|
||||
<string name="progressive_load_interval_title">Ukuran selang pemuatan putar balik</string>
|
||||
<string name="faq_title">Pertanyaan yang sering diajukan</string>
|
||||
<string name="faq_description">Jika Anda mengalami kesulitan menggunakan aplikasi, pastikan untuk memeriksa jawaban atas pertanyaan umum ini!</string>
|
||||
<string name="faq">Lihat di situs web</string>
|
||||
<string name="faq_description">Jika kamu mengalami masalah dalam penggunaan aplikasi, pastikan untuk melihat jawaban soal sering ditanya (SSD)!</string>
|
||||
<string name="faq">Tampilkan di situs web</string>
|
||||
<string name="sort">Urutan</string>
|
||||
<string name="fast_mode">Mode cepat</string>
|
||||
<string name="import_subscriptions_hint">Impor atau ekspor langganan dari menu 3 titik</string>
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
<string name="content_not_available">Contenuto non disponibile</string>
|
||||
<string name="parsing_error">Impossibile analizzare il sito web</string>
|
||||
<string name="could_not_setup_download_menu">Impossibile impostare il menu di download</string>
|
||||
<string name="content">Contenuto</string>
|
||||
<string name="content">Contenuti</string>
|
||||
<string name="show_age_restricted_content_title">Mostra contenuti con restrizioni di età</string>
|
||||
<string name="main_bg_subtitle">Tocca la lente d\'ingrandimento per iniziare.</string>
|
||||
<string name="duration_live">In diretta</string>
|
||||
@@ -125,7 +125,7 @@
|
||||
<string name="enable_watch_history_summary">Salva la cronologia degli elementi visualizzati</string>
|
||||
<string name="resume_on_audio_focus_gain_title">Riprendi la riproduzione</string>
|
||||
<string name="resume_on_audio_focus_gain_summary">Continua a riprodurre dopo le interruzioni (es. telefonate)</string>
|
||||
<string name="settings_category_downloads_title">Scaricamenti</string>
|
||||
<string name="settings_category_downloads_title">Download</string>
|
||||
<string name="settings_file_charset_title">Caratteri ammessi per i nomi dei file</string>
|
||||
<string name="settings_file_replacement_character_summary">I caratteri non validi vengono sostituiti con il valore specificato</string>
|
||||
<string name="settings_file_replacement_character_title">Carattere sostitutivo</string>
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
<string name="unsubscribe">Inscribe</string>
|
||||
<string name="subscribed_button_title">Scriptum</string>
|
||||
<string name="subscribe_button_title">Scribe</string>
|
||||
<string name="no_player_found_toast">Nullus amnem amnibus invenit (potes instituere VLC quia id ludere).</string>
|
||||
<string name="no_player_found_toast">Nullus amnem amnibus invenit (potes instalar VLC quia id ludere).</string>
|
||||
<string name="no_player_found">Nullus amnem amnibus invenit. Instalar VLC\?</string>
|
||||
<string name="controls_download_desc">Scarica amnem file</string>
|
||||
<string name="use_external_audio_player_title">Utere ludionem externum</string>
|
||||
@@ -47,9 +47,9 @@
|
||||
<string name="share">Condividi</string>
|
||||
<string name="open_with">Aperi apud</string>
|
||||
<string name="open_in_popup_mode">Aperi in popup mode</string>
|
||||
<string name="open_in_browser">Aperi in navigatro</string>
|
||||
<string name="open_in_browser">Aperi in browser</string>
|
||||
<string name="cancel">Inrita</string>
|
||||
<string name="install">instituere</string>
|
||||
<string name="install">instalar</string>
|
||||
<string name="upload_date_text">Edita %1$s</string>
|
||||
<string name="start">Initio</string>
|
||||
<string name="pause">Pausa</string>
|
||||
@@ -121,8 +121,4 @@
|
||||
<string name="resize_zoom">Retrahe</string>
|
||||
<string name="resize_fill">Satiatus</string>
|
||||
<string name="resize_fit">Aptus</string>
|
||||
<string name="yes">Ita</string>
|
||||
<string name="no">Non</string>
|
||||
<string name="search_with_service_name">Quaere %1$s</string>
|
||||
<string name="search_with_service_name_and_filter">Quaere %1$s (%2$s)</string>
|
||||
</resources>
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
<string name="enqueue_stream">Ielikt rindā</string>
|
||||
<string name="hold_to_append">Turiet, lai ieliktu atskaņošanas rindā</string>
|
||||
<string name="play_queue_audio_settings">Audio iestatījumi</string>
|
||||
<string name="play_queue_stream_detail">Detalizēta informācija</string>
|
||||
<string name="play_queue_stream_detail">Detaļas</string>
|
||||
<string name="play_queue_remove">Noņemt</string>
|
||||
<string name="title_activity_play_queue">Atskaņošanas saraksts</string>
|
||||
<string name="conferences">Konferences</string>
|
||||
@@ -53,17 +53,17 @@
|
||||
<string name="title_activity_history">Vēsture</string>
|
||||
<string name="read_full_license">Lasīt licenci</string>
|
||||
<string name="app_license">NewPipe — bez autortiesību ierobežojumiem (copyleft) licencēta brīva, pieejama bezmaksas, programmatūra: jūs variet izmantot, pētīt, dalīties un uzlabot to jebkurā brīdī pēc saviem ieskatiem. Tieši jūs variet to izplatīt un/vai modificēt saskaņā ar GNU General Public License noteikumiem, ko publicējusi Free Software Foundation, vai nu zem licences 3. versijas, vai (pēc jūsu izvēles) jebkuras jaunākas versijas noteikumiem.</string>
|
||||
<string name="app_license_title">NewPipe licence</string>
|
||||
<string name="app_license_title">NewPipe Licence</string>
|
||||
<string name="read_privacy_policy">Lasīt konfidencialitātes politiku</string>
|
||||
<string name="privacy_policy_encouragement">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 nobrukšanas ziņojumu.</string>
|
||||
<string name="privacy_policy_title">NewPipe konfidencialitātes politika</string>
|
||||
<string name="website_encouragement">Apmeklējiet NewPipe vietni, lai iegūtu vairāk informācijas un jaunumus.</string>
|
||||
<string name="website_title">Vietne</string>
|
||||
<string name="give_back">Atbalstīt projektu</string>
|
||||
<string name="donation_encouragement">NewPipe izstrādā brīvprātīgie savā brīvajā laikā, lai nodrošinātu jums pašu labāko lietošanas pieredzi. Atbalstiet izstrādātājus, lai palīdzētu padarīt NewPipe vēl labāku, kamēr viņi bauda tasi kafijas.</string>
|
||||
<string name="website_title">Projekta vietne</string>
|
||||
<string name="give_back">Izrādīt cieņu ar ziedojumu</string>
|
||||
<string name="donation_encouragement">NewPipe izstrādā brīvprātīgie, kas pavada savu brīvo laiku, sniedzot vislabāko lietotāju pieredzi. Ziedojiet, lai palīdzētu izstrādātājiem padarīt NewPipe vēl labāku, kamēr viņi bauda tasi kafijas.</string>
|
||||
<string name="donation_title">Ziedot</string>
|
||||
<string name="view_on_github">Skatīt GitHub</string>
|
||||
<string name="contribution_encouragement">Neatkarīgi no tā, vai tās ir tulkojuma, dizaina izmaiņas, koda tīrīšanas un sakārtošanas vai patiešām apjomīgas koda izmaiņas idejas — jebkura palīdzība vienmēr ir gaidīta. Kopā mēs varam padarīt NewPipe projektu vēl labāku!</string>
|
||||
<string name="view_on_github">Apskatīt GitHub</string>
|
||||
<string name="contribution_encouragement">Vienalga, kādas idejas Jums ir; Tulkojuma, dizaina izmaiņu, koda tīrīšanas vai reāli smagas kodu izmaiņas - palīdzība vienmēr ir laipni gaidīta. Jo vairāk tiek darīts, jo labāks tas kļūst!</string>
|
||||
<string name="contribution_title">Dot savu artavu</string>
|
||||
<string name="app_description">Viegls un brīvs, pieejams bezmaksas, straumēšanas atskaņotājs Android ierīcēm.</string>
|
||||
<string name="tab_licenses">Licences</string>
|
||||
@@ -76,7 +76,7 @@
|
||||
<string name="settings_file_replacement_character_summary">Nederīgas rakstzīmes tiks aizvietotas ar šo</string>
|
||||
<string name="settings_file_charset_title">Atļautās rakstzīmes failu nosaukumos</string>
|
||||
<string name="settings_category_downloads_title">Lejupielādēt</string>
|
||||
<string name="done">Skaidrs</string>
|
||||
<string name="done">Pabeigts</string>
|
||||
<string name="recaptcha_request_toast">reCAPTCHA izaicinājums dots</string>
|
||||
<string name="subtitle_activity_recaptcha">Nospiediet \"Pabeigts\", kad to atrisinat</string>
|
||||
<string name="title_activity_recaptcha">reCAPTCHA izaicinājums</string>
|
||||
@@ -86,7 +86,7 @@
|
||||
<string name="msg_copied">Nokopēts uz starpliktuvi</string>
|
||||
<string name="msg_wait">Lūdzu uzgaidiet…</string>
|
||||
<string name="msg_calculating_hash">Aprēķina</string>
|
||||
<string name="msg_running_detail">Pieskarties, lai iegūtu detalizētu informāciju</string>
|
||||
<string name="msg_running_detail">Nospiediet priekš detaļām</string>
|
||||
<string name="msg_running">NewPipe lejupielādē</string>
|
||||
<string name="msg_error">Kļūda</string>
|
||||
<string name="msg_threads">Procesi</string>
|
||||
@@ -147,7 +147,7 @@
|
||||
<string name="detail_likes_img_view_description">Patīk</string>
|
||||
<string name="detail_uploader_thumbnail_view_description">Autora avatāra attēls</string>
|
||||
<string name="detail_thumbnail_view_description">Atskaņot video, ilgums:</string>
|
||||
<string name="error_details_headline">Detalizēta informācija:</string>
|
||||
<string name="error_details_headline">Detaļas:</string>
|
||||
<string name="your_comment">Jūsu komentārs (Angliski):</string>
|
||||
<string name="info_labels">Kas:\nPieprasījums:\nSatura valoda:\nSatura valsts:\nLietotnes valoda:\nPakalpojums:\nGMT laiks:\nPakotne:\nVersija:\nOS versija:</string>
|
||||
<string name="hash_channel_description">Paziņojumi video apstrādes progresam</string>
|
||||
@@ -275,7 +275,7 @@
|
||||
<string name="playlist_page_summary">Atskaņošanas sarakstu lapa</string>
|
||||
<string name="video_detail_by">No %s</string>
|
||||
<string name="channel_created_by">Izveidoja %s</string>
|
||||
<string name="detail_sub_channel_thumbnail_view_description">Kanāla profila attēls</string>
|
||||
<string name="detail_sub_channel_thumbnail_view_description">Kanāla avatāra attēls</string>
|
||||
<string name="content_not_supported">NewPipe vēl neatbalsta šo saturu.\n\nCerams, ka tā atbalsts parādīsies turpmākajās versijās.</string>
|
||||
<string name="feed_use_dedicated_fetch_method_help_text">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.</string>
|
||||
<string name="feed_use_dedicated_fetch_method_disable_button">Izslēgt ātro režīmu</string>
|
||||
@@ -324,8 +324,8 @@
|
||||
<item quantity="other">%d sekundes</item>
|
||||
</plurals>
|
||||
<string name="new_seek_duration_toast">ExoPlayer ierobežojumu dēļ tīšanas solis tika iestatīts uz %d sekundēm</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Jā, un daļēji skatītos un klausītos</string>
|
||||
<string name="remove_watched_popup_warning">Tiešraides, kas iepriekš noskatītas un pēc tam pievienotas atskaņošanas sarakstam, tiks noņemtas. \nVai tiešām vēlaties turpināt?</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Jā, un daļēji skatītos</string>
|
||||
<string name="remove_watched_popup_warning">Tiešraides, kas iepriekš noskatītas un pēc tam pievienotas atskaņošanas sarakstam, tiks noņemtas. \nVai tiešām turpināt?</string>
|
||||
<string name="remove_watched_popup_title">Vai tiešām vēlaties noņemt skatītās tiešraides?</string>
|
||||
<string name="remove_watched">Noņemt skatīto</string>
|
||||
<string name="systems_language">System default</string>
|
||||
@@ -449,8 +449,8 @@
|
||||
<string name="content_language_title">Noklusējuma satura valoda</string>
|
||||
<string name="default_content_country_title">Vēlamā satura valsts</string>
|
||||
<string name="unsupported_url_dialog_message">Nevarēja atpazīt saites URL. Vai atvērt citā lietotnē?</string>
|
||||
<string name="unsupported_url">Neatbalstīta URL adrese</string>
|
||||
<string name="show_hold_to_append_summary">Rādīt padomu, kad tur nospiestu \"Klausīt fonā\" vai \"Skatīt uznirstošā logā\" pogu \"Detalizēta informācija:\" sadaļā</string>
|
||||
<string name="unsupported_url">Neatbalstīts saites URL</string>
|
||||
<string name="show_hold_to_append_summary">Rādīt padomu, kad nospiežat fona vai popup pogu pie video \"Informācija:\"</string>
|
||||
<string name="show_hold_to_append_title">Rādīt \"Nospiediet, lai pievienotu\" padomu</string>
|
||||
<string name="autoplay_title">Automātiski atskaņot</string>
|
||||
<string name="download_dialog_title">Lejupielādēt</string>
|
||||
@@ -462,7 +462,7 @@
|
||||
<string name="enable_playback_state_lists_title">Atskaņošanas pozīcija sarakstos</string>
|
||||
<string name="enable_playback_resume_summary">Saglabāt pēdējo atskaņošanas pozīciju</string>
|
||||
<string name="enable_playback_resume_title">Atsākt atskaņošanu</string>
|
||||
<string name="enable_watch_history_title">Atskaņošanas vēsture</string>
|
||||
<string name="enable_watch_history_title">Skatīšanās vēsture</string>
|
||||
<string name="enable_search_history_summary">Glabāt meklēšanas vēsturi lokāli (ierīces krātuvē)</string>
|
||||
<string name="enable_search_history_title">Meklēšanas vēsture</string>
|
||||
<string name="show_search_suggestions_summary">Atlasīt, kādus ieteikumus rādīt, ievadot vaicājumu meklēšanas joslā</string>
|
||||
@@ -477,7 +477,7 @@
|
||||
<string name="show_meta_info_summary">Izslēdziet, ja nevēlaties redzēt papildus informācijas laukus - video autoru, video saturu vai meklēšanas vaicājuma rezultātu</string>
|
||||
<string name="show_meta_info_title">Rādīt papildus informāciju</string>
|
||||
<string name="show_description_summary">Izslēdziet, ja nevēlaties redzēt video aprakstu un papildus informāciju</string>
|
||||
<string name="show_description_title">Rādīt aprakstu</string>
|
||||
<string name="show_description_title">Rādīt video aprakstu</string>
|
||||
<string name="show_next_and_similar_title">Rādīt \'Nākamos\' un \'Līdzīgos\' video</string>
|
||||
<string name="show_comments_summary">Izslēdziet, ja vēlaties paslēpt komentārus</string>
|
||||
<string name="show_comments_title">Rādīt komentārus</string>
|
||||
@@ -543,15 +543,15 @@
|
||||
<string name="unsubscribe">Pārtraukt abonementu</string>
|
||||
<string name="subscribed_button_title">Abonēts</string>
|
||||
<string name="subscribe_button_title">Abonēt</string>
|
||||
<string name="use_external_audio_player_title">Lietot ārējo audio atskaņotāju</string>
|
||||
<string name="use_external_audio_player_title">Izmantot ārējo audio atskaņotāju</string>
|
||||
<string name="use_external_video_player_summary">Dažās izšķirtspējās nav pieejami skaņas celiņi</string>
|
||||
<string name="use_external_video_player_title">Lietot ārējo video atskaņotāju</string>
|
||||
<string name="use_external_video_player_title">Izmantot ārējo video atskaņotāju</string>
|
||||
<string name="share_dialog_title">Kopīgot ar</string>
|
||||
<string name="search_showing_result_for">Tiek rādīti %s vaicājuma rezultāti</string>
|
||||
<string name="did_you_mean">Varbūt jūs gribējāt meklēt \"%1$s\"?</string>
|
||||
<string name="settings">Iestatījumi</string>
|
||||
<string name="search">Meklēt</string>
|
||||
<string name="controls_download_desc">Lejupielādēt video/audio datni</string>
|
||||
<string name="controls_download_desc">Lejupielādēt video datni</string>
|
||||
<string name="download">Lejupielādēt</string>
|
||||
<string name="featured">Populāri</string>
|
||||
<string name="download_has_started">Lejupielāde ir sākusies</string>
|
||||
@@ -562,7 +562,7 @@
|
||||
<string name="paid_content">Šis saturs ir pieejams tikai lietotājiem, kuri ir samaksājuši, tāpēc to nevar straumēt vai lejupielādēt ar Newpipe.</string>
|
||||
<string name="youtube_music_premium_content">Šis videoklips ir pieejams tikai YouTube Mūzikas Prēmijas dalībniekiem, tāpēc to nevar straumēt vai lejupielādēt ar Newpipe.</string>
|
||||
<string name="private_content">Šis saturs ir privāts, tāpēc Newpipe to nevar straumēt vai lejupielādēt.</string>
|
||||
<string name="soundcloud_go_plus_content">Šis ir SoundCloud Go+ audio, vismaz jūsu valstī, tāpēc to nevar straumēt vai lejupielādēt ar NewPipe.</string>
|
||||
<string name="soundcloud_go_plus_content">Šis ir SoundCloud Go+ audio, vismaz jūsu valstī, tāpēc to nevar straumēt vai lejupielādēt ar Newpipe.</string>
|
||||
<string name="georestricted_content">Šis saturs nepieejams jūsu valstī.</string>
|
||||
<string name="crash_the_app">Izraisīt lietotnes nobrukšanu</string>
|
||||
<string name="show_channel_details">Rādīt kanāla informāciju</string>
|
||||
@@ -598,7 +598,7 @@
|
||||
<string name="check_for_updates">Pārbaudīt atjauninājumus</string>
|
||||
<string name="manual_update_description">Pašrocīgi veikt jaunas versijas pārbaudi</string>
|
||||
<string name="seekbar_preview_thumbnail_title">Video atskaņošanas joslas sīktēla priekšskatījums</string>
|
||||
<string name="checking_updates_toast">Pārbauda atjauninājumus…</string>
|
||||
<string name="checking_updates_toast">Notiek atjauninājumu pārbaude…</string>
|
||||
<string name="downloads_storage_use_saf_summary_api_29">Sākot no Android 10, tiek atbalstīta tikai \"Krātuves Piekļuves Izstrādes platforma\"</string>
|
||||
<string name="feed_load_error_account_info">Nevarēja ielādēt straumi priekš \'%s\'.</string>
|
||||
<string name="feed_load_error">Kļūda lādējot plūsmu</string>
|
||||
@@ -671,8 +671,8 @@
|
||||
<string name="volume">Regulēt skaļumu</string>
|
||||
<string name="none">Darīt neko</string>
|
||||
<string name="import_subscriptions_hint">Abonementus var ievietot vai izgūt, izmantojot 3-punktoto izvēlni augšējā labajā ekrāna stūrī</string>
|
||||
<string name="faq_description">Ja jums rodas grūtības ar lietotnes izmantošanu, noteikti apskatiet bieži uzdoto jautājumu atbildes!</string>
|
||||
<string name="faq">Skatīt vietnē</string>
|
||||
<string name="faq_description">Ja Jums rodas problēmas ar lietotni, noteikti apskatiet šīs atbildes bieži uzdotiem jautājumiem!</string>
|
||||
<string name="faq">Skatīt tīkla vietnē</string>
|
||||
<string name="play_queue_audio_track">Skaņa: %s</string>
|
||||
<string name="audio_track">Skaņu celiņš</string>
|
||||
<string name="loading_stream_details">Ielādē straumes informāciju…</string>
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
<string name="settings_category_player_title">ਪਲੇਅਰ</string>
|
||||
<string name="settings_category_player_behavior_title">ਵਿਵਹਾਰ</string>
|
||||
<string name="settings_category_video_audio_title">ਵੀਡੀਓ ਅਤੇ ਆਡੀਓ</string>
|
||||
<string name="settings_category_history_title">ਇਤਿਹਾਸ ਅਤੇ ਕੈਸ਼-ਭੰਡਾਰ</string>
|
||||
<string name="settings_category_history_title">ਇਤਿਹਾਸ ਅਤੇ ਕੈਸ਼-ਭੰਡਾਰ</string>
|
||||
<string name="settings_category_appearance_title">ਦਿੱਖ</string>
|
||||
<string name="settings_category_debug_title">ਡੀ-ਬੱਗ</string>
|
||||
<string name="background_player_playing_toast">ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚੱਲ ਰਿਹਾ ਹੈ</string>
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
<string name="parsing_error">O site não pôde ser analisado</string>
|
||||
<string name="play_audio">Áudio</string>
|
||||
<string name="play_with_kodi_title">Reproduzir no Kodi</string>
|
||||
<string name="search">Pesquisar</string>
|
||||
<string name="search">Buscar</string>
|
||||
<string name="show_play_with_kodi_summary">Mostrar opção para reproduzir o vídeo no Kodi</string>
|
||||
<string name="use_external_audio_player_title">Usar player de áudio externo</string>
|
||||
<string name="use_external_video_player_title">Usar um player de vídeo alternativo</string>
|
||||
@@ -101,15 +101,15 @@
|
||||
<string name="show_search_suggestions_title">Sugestões de busca</string>
|
||||
<string name="show_search_suggestions_summary">Escolha as sugestões a serem exibidas enquanto estiver buscando</string>
|
||||
<string name="best_resolution">Melhor resolução</string>
|
||||
<string name="title_licenses">Licenças de terceiros</string>
|
||||
<string name="tab_about">Sobre & Perguntas Frequentes</string>
|
||||
<string name="title_licenses">Licenças de Terceiros</string>
|
||||
<string name="tab_about">Sobre & FAQ</string>
|
||||
<string name="tab_licenses">Licenças</string>
|
||||
<string name="app_description">Streaming leve e gratuito no Android.</string>
|
||||
<string name="app_description">Transmissão leve e livre no Android.</string>
|
||||
<string name="view_on_github">Ver no GitHub</string>
|
||||
<string name="app_license_title">Licença do NewPipe</string>
|
||||
<string name="contribution_encouragement">Caso você tenha ideias; tradução, alterações de design, limpeza de código ou alterações realmente pesadas de código, a ajuda é sempre bem-vinda. Quanto mais for feito, melhor será!</string>
|
||||
<string name="read_full_license">Ler licença</string>
|
||||
<string name="contribution_title">Contribuir</string>
|
||||
<string name="contribution_encouragement">Se você tem ideias de: tradução, mudança no design, limpeza de código ou grandes mudanças de código — ajuda é sempre bem-vinda. Quanto mais se faz, melhor fica!</string>
|
||||
<string name="read_full_license">Ver licença</string>
|
||||
<string name="contribution_title">Colaborar</string>
|
||||
<string name="copyright" formatted="true">© %1$s %2$s protegido pela licença %3$s</string>
|
||||
<string name="title_activity_about">Sobre o NewPipe</string>
|
||||
<string name="settings_category_downloads_title">Download</string>
|
||||
@@ -183,10 +183,10 @@
|
||||
<string name="unknown_content">[Desconhecido]</string>
|
||||
<string name="start_here_on_background">Reproduzir em segundo plano</string>
|
||||
<string name="start_here_on_popup">Reproduzir em um Popup</string>
|
||||
<string name="donation_title">Doar</string>
|
||||
<string name="donation_encouragement">O NewPipe é desenvolvido por voluntários que passam seu tempo livre trazendo a você a melhor experiência de usuário. Retribua para ajudar os desenvolvedores a tornar o NewPipe ainda melhor enquanto tomam uma xícara de café.</string>
|
||||
<string name="donation_title">Fazer doação</string>
|
||||
<string name="donation_encouragement">O NewPipe é desenvolvido por voluntários que usam seu tempo livre para trazer a você a melhor experiência de usuário. Retribua e ajude os desenvolvedores a tornarem o NewPipe ainda melhor enquanto eles desfrutam de uma xícara de café.</string>
|
||||
<string name="give_back">Retribuir</string>
|
||||
<string name="website_title">Site</string>
|
||||
<string name="website_title">Site oficial</string>
|
||||
<string name="website_encouragement">Visite o site do NewPipe para mais informações e novidades.</string>
|
||||
<string name="no_player_found_toast">O player de vídeo não foi encontrado, mas você pode instalar o VLC para tentar reproduzi-lo.</string>
|
||||
<string name="default_content_country_title">País padrão do conteúdo</string>
|
||||
@@ -304,12 +304,12 @@
|
||||
<string name="delete_search_history_alert">Remover todo o histórico de buscas?</string>
|
||||
<string name="search_history_deleted">Histórico de busca removido</string>
|
||||
<string name="one_item_deleted">1 item excluído.</string>
|
||||
<string name="app_license">NewPipe é um software copyleft libre: você pode usá-lo, estudá-lo, compartilhá-lo e melhorá-lo à vontade. Especificamente, você pode redistribuí-lo e/ou modificá-lo sob os termos da Licença Pública Geral GNU conforme publicada pela Free Software Foundation, seja a versão 3 da Licença ou (a seu critério) qualquer versão posterior.</string>
|
||||
<string name="app_license">NewPipe é um copyleft de software livre: Você pode usar, estudar, compartilhar e melhorar a seu gosto. Especificamente você pode redistribuir e/ou modificá-lo sob os termos da GNU General Public License como publicado pela Fundação de Software Livre, na versão 3 da Licença, ou (a seu critério) qualquer versão posterior.</string>
|
||||
<string name="import_settings">Você também quer importar as configurações?</string>
|
||||
<string name="privacy_policy_title">Política de Privacidade do NewPipe</string>
|
||||
<string name="privacy_policy_title">Política de privacidade do NewPipe</string>
|
||||
<string name="privacy_policy_encouragement">O projeto NewPipe leva sua privacidade muito a sério. Por isso, o aplicativo não coleta nenhum dado sem seu consentimento.
|
||||
\nA política de privacidade do NewPipe explica em detalhes quais dados são envidados e salvos quando você manda um relatório de erro.</string>
|
||||
<string name="read_privacy_policy">Leia a política de privacidade</string>
|
||||
<string name="read_privacy_policy">Ver política de privacidade</string>
|
||||
<string name="start_accept_privacy_policy">A fim de cumprir com o Regulamento Geral sobre a Proteção de Dados da UE (RGPD), chamamos sua atenção para a política de privacidade do NewPipe. Por favor, leia com atenção.
|
||||
\nVocê deve aceitá-la para nos enviar o relatório de erros.</string>
|
||||
<string name="accept">Aceitar</string>
|
||||
@@ -447,7 +447,7 @@
|
||||
<string name="app_language_title">Idioma do aplicativo</string>
|
||||
<string name="systems_language">Padrão do sistema</string>
|
||||
<string name="subtitle_activity_recaptcha">Toque em \"Pronto\" ao resolver</string>
|
||||
<string name="done">Concluído</string>
|
||||
<string name="done">Pronto</string>
|
||||
<string name="videos_string">Vídeos</string>
|
||||
<plurals name="seconds">
|
||||
<item quantity="one">%d segundo</item>
|
||||
@@ -710,7 +710,7 @@
|
||||
<string name="unknown_quality">Qualidade desconhecida</string>
|
||||
<string name="progressive_load_interval_title">Tamanho do intervalo de carregamento da reprodução</string>
|
||||
<string name="faq">Ver no site</string>
|
||||
<string name="faq_description">Se você estiver tendo problemas para usar o aplicativo, verifique estas respostas para perguntas comuns!</string>
|
||||
<string name="faq_description">Se você está com problemas ao usar o aplicativo, confira estas respostas para perguntas comuns!</string>
|
||||
<string name="faq_title">Perguntas frequentes</string>
|
||||
<string name="sort">Classificar</string>
|
||||
<string name="fast_mode">Modo rápido</string>
|
||||
@@ -822,7 +822,7 @@
|
||||
<string name="error_insufficient_storage">Não há espaço livre suficiente no dispositivo</string>
|
||||
<string name="yes">Sim</string>
|
||||
<string name="no">Não</string>
|
||||
<string name="settings_category_backup_restore_title">Backup e restauração</string>
|
||||
<string name="settings_category_backup_restore_title">Backup & Restauração</string>
|
||||
<string name="auto_update_check_description">O NewPipe pode verificar automaticamente se há novas versões de tempos em tempos e notificá-lo quando elas estiverem disponíveis.
|
||||
\nDeseja ativar essa opção?</string>
|
||||
<string name="reset_settings_title">Restaurar configurações</string>
|
||||
|
||||
@@ -104,14 +104,14 @@
|
||||
<string name="title_activity_about">О NewPipe</string>
|
||||
<string name="app_license_title">Лицензия NewPipe</string>
|
||||
<string name="tab_licenses">Лицензии</string>
|
||||
<string name="title_licenses">Лицензии сторонних компонентов</string>
|
||||
<string name="tab_about">О приложении и ответы на вопросы</string>
|
||||
<string name="title_licenses">Сторонние лицензии</string>
|
||||
<string name="tab_about">О приложении</string>
|
||||
<string name="read_full_license">Прочитать лицензию</string>
|
||||
<string name="app_description">Свободный и легковесный потоковый плеер для Android.</string>
|
||||
<string name="view_on_github">Открыть на GitHub</string>
|
||||
<string name="contribution_encouragement">Будь то перевод, изменения дизайна, чистка кода или серьёзная переработка - любая помощь приветствуется. Чем больше сделано, тем лучше становится проект!</string>
|
||||
<string name="contribution_encouragement">Приветствуется всё — идеи, перевод, редизайн, чистка кода или огромные изменения в коде. Чем больше сделано, тем лучше!</string>
|
||||
<string name="copyright" formatted="true">© %1$s • %2$s • %3$s</string>
|
||||
<string name="contribution_title">Помочь проекту</string>
|
||||
<string name="contribution_title">Помощь проекту</string>
|
||||
<string name="subscribe_button_title">Подписаться</string>
|
||||
<string name="subscription_change_failed">Не удалось изменить подписку</string>
|
||||
<string name="subscription_update_failed">Не удалось обновить подписку</string>
|
||||
@@ -204,11 +204,11 @@
|
||||
<string name="external_player_unsupported_link_type">Внешние плееры не поддерживают эти типы ссылок</string>
|
||||
<string name="video_streams_empty">Видеопотоки не найдены</string>
|
||||
<string name="audio_streams_empty">Аудиопотоки не найдены</string>
|
||||
<string name="donation_title">Пожертвовать</string>
|
||||
<string name="donation_encouragement">NewPipe разрабатывают волонтёры, которые тратят свободное время, чтобы сделать приложение как можно удобнее. Поддержите разработчиков и помогите им сделать NewPipe ещё лучше - хотя бы за чашкой кофе.</string>
|
||||
<string name="give_back">Поддержать проект</string>
|
||||
<string name="donation_title">Пожертвование</string>
|
||||
<string name="donation_encouragement">Разработчики NewPipe ценой своего свободного времени делают вашу жизнь чуть удобнее. Отплатите им тем же — наслаждаясь чашечкой кофе, они смогут сделать NewPipe ещё круче.</string>
|
||||
<string name="give_back">Воздать должное</string>
|
||||
<string name="website_title">Веб-сайт</string>
|
||||
<string name="website_encouragement">Посетите сайт NewPipe, чтобы узнать больше и ознакомиться с новостями.</string>
|
||||
<string name="website_encouragement">Для получения более подробной информации и последних новостей о NewPipe посетите наш веб-сайт.</string>
|
||||
<string name="drawer_open">Открыть боковую панель</string>
|
||||
<string name="drawer_close">Закрыть боковую панель</string>
|
||||
<string name="video_player">Видеоплеер</string>
|
||||
@@ -315,13 +315,13 @@
|
||||
<string name="delete_search_history_alert">Удалить всю историю поиска\?</string>
|
||||
<string name="search_history_deleted">История поиска удалена</string>
|
||||
<string name="one_item_deleted">1 элемент удалён.</string>
|
||||
<string name="app_license">NewPipe - свободное программное обеспечение, распространяемое на условиях копилефта. Вы можете свободно использовать, изучать, распространять и улучшать его. В частности, NewPipe можно распространять и/или изменять на условиях Стандартной общественной лицензии GNU, опубликованной Фондом свободного программного обеспечения, версии 3 либо, по вашему выбору, любой более поздней версии.</string>
|
||||
<string name="app_license">NewPipe — свободное программное обеспечение: вы можете использовать, изучать и улучшать его по своему усмотрению. В частности, вы можете распространять и/или изменять его в соответствии с условиями GNU General Public License, опубликованной Free Software Foundation, либо версии 3, либо (по вашему выбору) любой более поздней версии.</string>
|
||||
<string name="preferred_open_action_settings_title">При открытии ссылки</string>
|
||||
<string name="import_settings">Хотите импортировать настройки?</string>
|
||||
<string name="privacy_policy_title">Политика конфиденциальности NewPipe</string>
|
||||
<string name="privacy_policy_title">Конфиденциальность</string>
|
||||
<string name="privacy_policy_encouragement">Проект NewPipe очень серьёзно относится к вашей конфиденциальности. Приложение не собирает никакие данные без вашего согласия.
|
||||
\nПолитика конфиденциальности подробно объясняет, какие данные обрабатываются и хранятся при отправке отчёта о сбоях.</string>
|
||||
<string name="read_privacy_policy">Ознакомиться с политикой конфиденциальности</string>
|
||||
<string name="read_privacy_policy">Прочитать политику</string>
|
||||
<string name="start_accept_privacy_policy">В соответствии с Общим регламентом по защите данных ЕС (GDPR), обращаем ваше внимание на политику конфиденциальности NewPipe. Пожалуйста, внимательно ознакомьтесь с ней.
|
||||
\nВам необходимо принять её условия, чтобы отправить нам отчёт об ошибке.</string>
|
||||
<string name="accept">Принять</string>
|
||||
|
||||
@@ -116,7 +116,7 @@
|
||||
<string name="resume_on_audio_focus_gain_summary">Pokračouje v prehrávaní po prerušení (napr. po telefonáte)</string>
|
||||
<string name="notification_channel_name">NewPipe oznámenia</string>
|
||||
<string name="notification_channel_description">Notifikácie NewPipe prehrávača</string>
|
||||
<string name="settings_category_downloads_title">Sťahovanie</string>
|
||||
<string name="settings_category_downloads_title">Preberanie</string>
|
||||
<string name="settings_file_charset_title">Povolené znaky v názvoch súborov</string>
|
||||
<string name="settings_file_replacement_character_summary">Neplatné znaky budú nahradené znakmi s týmto významom</string>
|
||||
<string name="settings_file_replacement_character_title">Náhradný znak</string>
|
||||
@@ -137,7 +137,7 @@
|
||||
<string name="action_history">História</string>
|
||||
<string name="settings_category_player_title">Prehrávač</string>
|
||||
<string name="settings_category_player_behavior_title">Správanie</string>
|
||||
<string name="settings_category_history_title">História a medzipamäť</string>
|
||||
<string name="settings_category_history_title">História a vyrovnávacia pamäť</string>
|
||||
<string name="undo">Vrátiť</string>
|
||||
<string name="search_no_results">Žiadne výsledky</string>
|
||||
<string name="empty_list_subtitle">Zatiaľ je tu ticho ako v hrobe</string>
|
||||
@@ -308,7 +308,8 @@
|
||||
<string name="one_item_deleted">1 položka bola vymazaná.</string>
|
||||
<string name="app_license">NewPipe je voľný softvér s copyleftom: Môžete ho používať, študovať, zdieľať a vylepšovať podľa vlastného uváženia. Konkrétne ho môžete redistribuovať a/alebo modifikovať podľa podmienok Všeobecnej verejnej licencie GNU, ako ju uverejnila Free Software Foundation, buď verzie 3 licencie, alebo (podľa vášho výberu) akejkoľvek neskoršej verzie.</string>
|
||||
<string name="privacy_policy_title">Zásady ochrany osobných údajov NewPipe</string>
|
||||
<string name="privacy_policy_encouragement">Projekt NewPipe berie ochranu vašich osobných údajov veľmi vážne. Aplikácia preto bez vášho súhlasu nezhromažďuje žiadne údaje.\nV zásadách ochrany osobných údajov NewPipe je podrobne vysvetlené, aké údaje sa odosielajú a ukladajú pri zaslaní správy o chybe.</string>
|
||||
<string name="privacy_policy_encouragement">NewPipe projekt berie vaše súkromie vážne. Preto aplikácia nezhromažďuje žiadne údaje bez vášho súhlasu.
|
||||
\nNewPipe v ochrane súkromia podrobne vysvetľuje, aké údaje budú odoslané a uložené pri hlásení o páde.</string>
|
||||
<string name="read_privacy_policy">Prečítajte si zásady ochrany osobných údajov</string>
|
||||
<string name="import_settings">Chcete zároveň importovať aj nastavenia?</string>
|
||||
<string name="start_accept_privacy_policy">V súlade s Európskym Všeobecným Nariadením o Ochrane Údajov (GDPR), chceme upriamiť Vašu pozornosť na zmluvu o ochrane osobných údajov v NewPipe. Starostlivo si ju prečítajte.
|
||||
@@ -676,7 +677,7 @@
|
||||
<string name="show_error_snackbar">Zobraziť krátke oznámenie chyby</string>
|
||||
<string name="create_error_notification">Oznámte chybu</string>
|
||||
<string name="progressive_load_interval_exoplayer_default">ExoPlayer preddefinovaný</string>
|
||||
<string name="notifications">Oznámenia</string>
|
||||
<string name="notifications">Upozornenia</string>
|
||||
<string name="streams_notifications_interval_title">Frekvencia kontroly</string>
|
||||
<string name="delete_downloaded_files_confirm">Vymazať všetky stiahnuté súbory z disku\?</string>
|
||||
<string name="notifications_disabled">Upozornenia sú vypnuté</string>
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
<string name="download_dialog_title">Hämta</string>
|
||||
<string name="show_next_and_similar_title">Visa \'Nästa\' och \'Liknande\' videor</string>
|
||||
<string name="unsupported_url">Webbadressen stöds inte</string>
|
||||
<string name="content_language_title">Standardinnehållsspråk</string>
|
||||
<string name="content_language_title">Standard innehållsspråk</string>
|
||||
<string name="settings_category_video_audio_title">Video och ljud</string>
|
||||
<string name="settings_category_appearance_title">Utseende</string>
|
||||
<string name="background_player_playing_toast">Spelar upp i bakgrunden</string>
|
||||
@@ -73,7 +73,7 @@
|
||||
<string name="error_snackbar_action">Rapportera</string>
|
||||
<string name="what_device_headline">Info:</string>
|
||||
<string name="what_happened_headline">Vad som skedde:</string>
|
||||
<string name="your_comment">Din kommentar (på engelska):</string>
|
||||
<string name="your_comment">Din kommentar (på Engelska):</string>
|
||||
<string name="error_details_headline">Detaljer:</string>
|
||||
<string name="detail_likes_img_view_description">Gillar</string>
|
||||
<string name="detail_dislikes_img_view_description">Ogillar</string>
|
||||
@@ -91,13 +91,13 @@
|
||||
<string name="resume_on_audio_focus_gain_title">Återuppta uppspelning</string>
|
||||
<string name="resume_on_audio_focus_gain_summary">Fortsätt uppspelning efter avbrott (t.ex. telefonsamtal)</string>
|
||||
<string name="show_hold_to_append_title">Visa \"Håll för att köa\"-tips</string>
|
||||
<string name="show_hold_to_append_summary">Visa tips när bakgrunds- eller popup-knappen trycks på sidan för video \"Detaljer:\"</string>
|
||||
<string name="show_hold_to_append_summary">Visa tips när bakgrunds eller popup-knappen trycks på sidan för video \"Detaljer:\"</string>
|
||||
<string name="settings_category_player_title">Spelare</string>
|
||||
<string name="settings_category_player_behavior_title">Beteende</string>
|
||||
<string name="settings_category_history_title">Historik och cacheminne</string>
|
||||
<string name="undo">Ångra</string>
|
||||
<string name="play_all">Spela alla</string>
|
||||
<string name="notification_channel_name">NewPipe-avisering</string>
|
||||
<string name="notification_channel_name">NewPipe avisering</string>
|
||||
<string name="notification_channel_description">Aviseringar för NewPipes spelare</string>
|
||||
<string name="unknown_content">[Okänd]</string>
|
||||
<string name="player_stream_failure">Misslyckades med att spela denna ström</string>
|
||||
@@ -140,9 +140,10 @@
|
||||
<string name="msg_wait">Vänta…</string>
|
||||
<string name="msg_copied">Kopierat till urklipp</string>
|
||||
<string name="no_available_dir">Ange en hämtningsmapp senare i inställningarna</string>
|
||||
<string name="msg_popup_permission">Denna behörighet krävs för att \nöppna i popup-läge</string>
|
||||
<string name="title_activity_recaptcha">reCAPTCHA-utmaning</string>
|
||||
<string name="recaptcha_request_toast">reCAPTCHA-utmaning begärd</string>
|
||||
<string name="msg_popup_permission">Denna tillåtelse behövs för att
|
||||
\nöppna i popup-läge</string>
|
||||
<string name="title_activity_recaptcha">reCAPTCHA utmaning</string>
|
||||
<string name="recaptcha_request_toast">reCAPTCHA utmaning begärd</string>
|
||||
<string name="settings_category_downloads_title">Hämtning</string>
|
||||
<string name="settings_file_charset_title">Tillåtna tecken i filnamn</string>
|
||||
<string name="settings_file_replacement_character_summary">Ogiltiga tecken ersätts med detta värde</string>
|
||||
@@ -152,13 +153,13 @@
|
||||
<string name="title_activity_about">Om NewPipe</string>
|
||||
<string name="title_licenses">Tredjepartslicenser</string>
|
||||
<string name="copyright" formatted="true">© %1$s av %2$s under %3$s</string>
|
||||
<string name="tab_about">Om & vanliga frågor</string>
|
||||
<string name="tab_about">Om & FAQ</string>
|
||||
<string name="tab_licenses">Licenser</string>
|
||||
<string name="app_description">Lättviktsströmning på Android med fri programvara.</string>
|
||||
<string name="app_description">Öppen och enkel Android-app för mediastreaming.</string>
|
||||
<string name="view_on_github">Visa på GitHub</string>
|
||||
<string name="app_license_title">NewPipes licens</string>
|
||||
<string name="contribution_encouragement">Oavsett om du har idéer kring översättning, designändringar, uppstädning av kod eller riktigt tunga kodändringar är hjälp alltid välkommen. Ju mer som görs, desto bättre blir det!</string>
|
||||
<string name="read_full_license">Läs licens</string>
|
||||
<string name="contribution_encouragement">Vad du än har för idéer; översättningar, designändringar, kodstädning eller riktiga stora kodändringar—hjälp är alltid välkommen. Ju mer som görs desto bättre blir det!</string>
|
||||
<string name="read_full_license">Läs hela licensen</string>
|
||||
<string name="contribution_title">Bidra</string>
|
||||
<string name="title_activity_history">Historik</string>
|
||||
<string name="action_history">Historik</string>
|
||||
@@ -168,7 +169,7 @@
|
||||
<string name="kiosk_page_summary">Kiosksida</string>
|
||||
<string name="channel_page_summary">Kanalsida</string>
|
||||
<string name="select_a_channel">Välj en kanal</string>
|
||||
<string name="no_channel_subscribed_yet">Inga kanalprenumerationer ännu</string>
|
||||
<string name="no_channel_subscribed_yet">Inga kanal prenumerationer ännu</string>
|
||||
<string name="select_a_kiosk">Välj en kiosk</string>
|
||||
<string name="trending">Populärt</string>
|
||||
<string name="top_50">Topp 50</string>
|
||||
@@ -180,35 +181,35 @@
|
||||
<string name="start_here_on_background">Börja spela i bakgrunden</string>
|
||||
<string name="start_here_on_popup">Börja spela i en popup</string>
|
||||
<string name="donation_title">Donera</string>
|
||||
<string name="donation_encouragement">NewPipe utvecklas av frivilliga som ägnar sin fritid åt att ge dig den bästa användarupplevelsen. Ge något tillbaka genom att hjälpa utvecklarna att göra NewPipe ännu bättre medan de njuter av en kopp kaffe.</string>
|
||||
<string name="donation_encouragement">NewPipe utvecklas av frivilliga som spenderar sin fritid på att ge dig den bästa användarupplevelsen. Nu är det tid att ge tillbaka för att säkerställa att utvecklarna kan göra NewPipe ännu bättre medan de njuter av en kopp kaffe.</string>
|
||||
<string name="give_back">Ge tillbaka</string>
|
||||
<string name="website_title">Webbplats</string>
|
||||
<string name="website_encouragement">Besök NewPipes webbplats för mer information och nyheter.</string>
|
||||
<string name="website_encouragement">För att få mer information och de senaste nyheterna om NewPipe, besök vår webbplats.</string>
|
||||
<string name="show_info">Visa info</string>
|
||||
<string name="tab_bookmarks">Bokmärkta spellistor</string>
|
||||
<string name="tab_bookmarks">Bokmärkta Spellistor</string>
|
||||
<string name="controls_add_to_playlist_title">Lägg till i</string>
|
||||
<string name="use_inexact_seek_title">Använd snabb icke-exakt sökning</string>
|
||||
<string name="thumbnail_cache_wipe_complete_notice">Cacheminnet för bilder rensat</string>
|
||||
<string name="settings_category_debug_title">Felsökning</string>
|
||||
<string name="settings_category_debug_title">Debug</string>
|
||||
<string name="always">Alltid</string>
|
||||
<string name="just_once">Bara en gång</string>
|
||||
<string name="file">Fil</string>
|
||||
<string name="metadata_cache_wipe_title">Rensa metadata i cacheminnet</string>
|
||||
<string name="metadata_cache_wipe_title">Rensa metadatan i cacheminnet</string>
|
||||
<string name="no_player_found_toast">Ingen strömspelare hittades (du kan installera VLC för att spela upp).</string>
|
||||
<string name="controls_download_desc">Hämta strömfil</string>
|
||||
<string name="use_inexact_seek_summary">Inexakt sökning gör det möjligt att söka snabbare med mindre precision. Att hoppa 5, 15 eller 25 sekunder fungerar inte med detta val</string>
|
||||
<string name="metadata_cache_wipe_summary">Ta bort alla cachade webbsidor</string>
|
||||
<string name="metadata_cache_wipe_complete_notice">Metadatacachen har rensats</string>
|
||||
<string name="metadata_cache_wipe_complete_notice">Metadata cache rensad</string>
|
||||
<string name="auto_queue_title">Köa nästa strömning automatiskt</string>
|
||||
<string name="auto_queue_summary">Fortsätt en avslutad (icke-upprepande) uppspelningskö genom att lägga till en relaterad ström</string>
|
||||
<string name="default_content_country_title">Standardinnehållsland</string>
|
||||
<string name="auto_queue_summary">Fortsätt avsluta (icke-upprepande) uppspelningskö genom att lägga till en relaterad ström</string>
|
||||
<string name="default_content_country_title">Standard innehållsland</string>
|
||||
<string name="channels">Kanaler</string>
|
||||
<string name="playlists">Spellistor</string>
|
||||
<string name="tracks">Spår</string>
|
||||
<string name="users">Användare</string>
|
||||
<string name="switch_to_background">Växla till bakgrund</string>
|
||||
<string name="switch_to_popup">Växla till popup</string>
|
||||
<string name="switch_to_main">Växla till huvudspelare</string>
|
||||
<string name="switch_to_background">Växla till Bakgrunden</string>
|
||||
<string name="switch_to_popup">Växla till Popup</string>
|
||||
<string name="switch_to_main">Växla till main</string>
|
||||
<string name="import_data_title">Importera databas</string>
|
||||
<string name="export_data_title">Exportera databas</string>
|
||||
<string name="import_data_summary">Skriver över din nuvarande historik, prenumerationer, spellistor och (valbart) inställningar</string>
|
||||
@@ -235,10 +236,11 @@
|
||||
<string name="dismiss">Avfärda</string>
|
||||
<string name="rename">Byt namn</string>
|
||||
<string name="one_item_deleted">1 objekt borttaget.</string>
|
||||
<string name="privacy_policy_title">NewPipes integritetspolicy</string>
|
||||
<string name="privacy_policy_encouragement">NewPipe-projektet tar din integritet på största allvar. Appen samlar därför inte in några uppgifter utan ditt medgivande. \nNewPipes sekretesspolicy förklarar i detalj vad för data som skickas och lagras när du skickar en kraschrapport</string>
|
||||
<string name="read_privacy_policy">Läs integritetspolicyn</string>
|
||||
<string name="app_license">NewPipe är copyleft-licensierad fri programvara: du får använda, studera, dela och förbättra den som du vill. Mer specifikt får du distribuera och/eller modifiera den enligt villkoren i GNU General Public License, såsom den publicerats av Free Software Foundation, antingen version 3 av licensen eller, om du så önskar, någon senare version.</string>
|
||||
<string name="privacy_policy_title">NewPipes sekretesspolicy</string>
|
||||
<string name="privacy_policy_encouragement">NewPipe-projektet tar din integritet på största allvar. Appen samlar därför inte in några uppgifter utan ditt medgivande.
|
||||
\nNewPipes sekretesspolicy förklarar i detalj vad för data som skickas och lagras när du skickar en kraschrapport.</string>
|
||||
<string name="read_privacy_policy">Läs sekretesspolicy</string>
|
||||
<string name="app_license">NewPipe är copyleft fri programvara: Du kan använda, studera, dela och förbättra den som du vill. Specifikt kan du distribuera och/eller modifiera det under villkoren för GNU General Public License som publicerats av Free Software Foundation, antingen version 3 av licensen, eller (om du så önskar) en senare version.</string>
|
||||
<string name="title_last_played">Senast spelade</string>
|
||||
<string name="title_most_played">Mest spelade</string>
|
||||
<string name="export_complete_toast">Exporterad</string>
|
||||
@@ -313,7 +315,8 @@
|
||||
<string name="skip_silence_checkbox">Snabbspola vid frånvaro av ljud</string>
|
||||
<string name="playback_step">Steg</string>
|
||||
<string name="playback_reset">Återställ</string>
|
||||
<string name="start_accept_privacy_policy">För att uppfylla EU:s allmänna dataskyddsförordning (GDPR), uppmärksammar vi härmed NewPipes sekretesspolicy. Var god och läs den noggrant. \nDu måste acceptera den för att kunna skicka felrapporten.</string>
|
||||
<string name="start_accept_privacy_policy">För att uppfylla den Europeiska dataskyddsförordningen (GDPR), uppmärksammar vi härmed NewPipes sekretesspolicy. Var god och läs den noggrant.
|
||||
\nDu måste acceptera den för att kunna skicka felrapporten.</string>
|
||||
<string name="accept">Acceptera</string>
|
||||
<string name="decline">Avböj</string>
|
||||
<string name="limit_data_usage_none_description">Ingen gräns</string>
|
||||
@@ -328,7 +331,7 @@
|
||||
<string name="settings_category_updates_title">Uppdateringar</string>
|
||||
<string name="file_deleted">Fil raderad</string>
|
||||
<string name="app_update_notification_channel_name">Avisering för appuppdatering</string>
|
||||
<string name="app_update_notification_channel_description">Aviseringar för nya NewPipe-versioner</string>
|
||||
<string name="app_update_notification_channel_description">Aviseringar för nya NewPipe versioner</string>
|
||||
<string name="download_to_sdcard_error_title">Extern lagring otillgänglig</string>
|
||||
<string name="saved_tabs_invalid_json">Fel vid läsning av sparade flikar, använder standardflikar</string>
|
||||
<string name="restore_defaults">Återställ standardvärden</string>
|
||||
@@ -493,9 +496,9 @@
|
||||
<string name="confirm_prompt">Vill du rensa din hämtningshistorik eller ta bort alla hämtade filer\?</string>
|
||||
<string name="clear_download_history">Rensa hämtningshistorik</string>
|
||||
<string name="error_download_resource_gone">Kan inte återställa den här hämtningen</string>
|
||||
<string name="error_timeout">Anslutningsavbrott</string>
|
||||
<string name="error_progress_lost">Förloppet gick förlorat eftersom filen togs bort</string>
|
||||
<string name="error_insufficient_storage_left">Inget utrymme kvar på enheten</string>
|
||||
<string name="error_timeout">Anslutnings avbrott</string>
|
||||
<string name="error_progress_lost">Framsteg förlorat, för att filen blev borttagen</string>
|
||||
<string name="error_insufficient_storage_left">Inget utrymme kvar på enhet</string>
|
||||
<string name="error_postprocessing_stopped">NewPipe stängdes under arbete med en fil</string>
|
||||
<string name="error_report_open_github_notice">Vänligen kontrollera om en felrapport som tar upp din krasch redan finns. Att skapa ärenden när en felrapport redan finns, tar av den tid som vi annars kunde ha ägnat åt att fixa den faktiska buggen.</string>
|
||||
<string name="error_report_open_issue_button_text">Rapportera på GitHub</string>
|
||||
@@ -506,14 +509,14 @@
|
||||
<string name="channel_created_by">Skapad av %s</string>
|
||||
<string name="no_playlist_bookmarked_yet">Ingen spellista har bokmärkts än</string>
|
||||
<string name="feed_group_show_only_ungrouped_subscriptions">Visa endast prenumerationer som inte grupperats</string>
|
||||
<string name="notification_scale_to_square_image_title">Beskär miniatyrbild till 1:1-bildförhållande</string>
|
||||
<string name="notification_scale_to_square_image_title">Beskär miniatyrbild till 1: 1 bildförhållande</string>
|
||||
<string name="wifi_only">Endast över Wi-Fi</string>
|
||||
<string name="notification_scale_to_square_image_summary">Beskär videominiatyrbilden som visas i aviseringen från 16:9 till 1:1 bildförhållande</string>
|
||||
<string name="autoplay_summary">Starta uppspelning automatiskt — %s</string>
|
||||
<string name="title_activity_play_queue">Uppspelningskö</string>
|
||||
<string name="unsupported_url_dialog_message">Kunde inte känna igen URL:en. Vill du öppna med annan app\?</string>
|
||||
<string name="auto_queue_toggle">Köa automatiskt</string>
|
||||
<string name="clear_queue_confirmation_description">Den aktiva uppspelningskön kommer att ersättas</string>
|
||||
<string name="clear_queue_confirmation_description">Den aktiva spellistan kommer att ersättas</string>
|
||||
<string name="clear_queue_confirmation_summary">Att byta från en spelare till en annan kan ersätta din kö</string>
|
||||
<string name="clear_queue_confirmation_title">Fråga om bekräftelse innan en kö töms</string>
|
||||
<string name="notification_action_buffering">Buffring</string>
|
||||
@@ -544,7 +547,17 @@
|
||||
<string name="enqueue_stream">Köa</string>
|
||||
<string name="related_items_tab_description">Relaterade objekt</string>
|
||||
<string name="hash_channel_name">Avisering för videohashning</string>
|
||||
<string name="feed_use_dedicated_fetch_method_help_text">Tycker du att inläsningen av flödet är för långsamt? Testa i så fall att aktivera snabbinläsning (du kan ändra det i inställningarna eller genom att trycka på knappen nedan). \n \nNewPipe erbjuder två strategier för att ladda flödet: \n• Att hämta hela den prenumererade kanalen, vilket är långsamt, men komplett. \n• Att använda en \"särskild tjänsteslutpunkt\", vilket är snabbt, men vanligtvis inte komplett. \n \nSkillnaden mellan de två är att den snabba varianten ofta saknar viss information, som objektets speltid eller typ (kan inte skilja på livevideor och vanliga videor) och den kan returnera färre objekt. \n \nYouTube är ett exempel på en tjänst som erbjuder denna snabba metod genom sitt RSS-flöde. \n \nSå valet handlar i grunden om vad du föredrar: hastighet eller precis information.</string>
|
||||
<string name="feed_use_dedicated_fetch_method_help_text">Tycker du att inläsningen av flödet är för långsamt\? Testa i så fall att aktivera snabbinläsning (du kan ändra det i inställningarna eller genom att trycka på knappen nedan).
|
||||
\n
|
||||
\nNewPipe erbjuder två strategier för att ladda flödet:
|
||||
\n• Att hämta hela den prenumererade kanalen, vilket är långsamt, men komplett.
|
||||
\n• Att använda en \"dedicated service endpoint\", vilket är snabbt, men vanligtvis inte komplett.
|
||||
\n
|
||||
\nSkillnaden mellan de två är att den snabba varianten ofta saknar viss information, som objektets speltid eller typ (kan inte skilja på livevideor och vanliga videor) och den kan returnera färre objekt.
|
||||
\n
|
||||
\nYouTube är ett exempel på en tjänst som erbjuder denna snabba metod genom sitt RSS-flöde.
|
||||
\n
|
||||
\nSå valet handlar i grunden om vad du föredrar: hastighet eller precis information.</string>
|
||||
<string name="show_meta_info_summary">Inaktivera för att dölja rutor med metainformation som ytterligare information om strömmens skapare, strömmens innehåll eller sökord</string>
|
||||
<string name="show_description_summary">Inaktivera för att dölja videobeskrivning och ytterligare information</string>
|
||||
<string name="show_meta_info_title">Visa meta-information</string>
|
||||
@@ -555,7 +568,7 @@
|
||||
<string name="notification_actions_at_most_three">Du kan som mest välja tre åtgärder att visa i den kompakta aviseringen!</string>
|
||||
<string name="recaptcha_solve">Lös</string>
|
||||
<string name="metadata_support">Support</string>
|
||||
<string name="metadata_privacy">Integritet</string>
|
||||
<string name="metadata_privacy">Tillgänglighet</string>
|
||||
<string name="off">Av</string>
|
||||
<string name="on">På</string>
|
||||
<string name="metadata_privacy_internal">Intern</string>
|
||||
@@ -594,8 +607,9 @@
|
||||
<string name="comments_are_disabled">Kommentarer är inaktiverade</string>
|
||||
<string name="description_tab_description">Beskrivning</string>
|
||||
<string name="comments_tab_description">Kommentarer</string>
|
||||
<string name="restricted_video_no_stream">Denna video är åldersbegränsad. \nPå grund av nya YouTube-regler med åldersgräns för vissa videor kan NewPipe inte komma åt några av videons strömmar och kan därmed inte spela upp den.</string>
|
||||
<string name="show_age_restricted_content_summary">Visa innehåll som på grund av sin åldersgräns (t.ex. 18+) kan vara olämpligt för barn</string>
|
||||
<string name="restricted_video_no_stream">Denna video här en åldersgräns.
|
||||
\nPå grund av nya YouTube-regler med åldersgräns för vissa videor kan NewPipe inte komma åt någon av dess videoströmningar och kan därmed inte spela upp den.</string>
|
||||
<string name="show_age_restricted_content_summary">Visa innehåll som pga sin åldersgräns (ex 18+) kan vara olämpligt för barn</string>
|
||||
<string name="show_description_title">Visa beskrivning</string>
|
||||
<string name="open_with">Öppna med</string>
|
||||
<string name="show_thumbnail_title">Visa miniatyrer</string>
|
||||
@@ -613,7 +627,7 @@
|
||||
<string name="select_night_theme_toast">Du kan välja det natt-tema du föredrar nedan</string>
|
||||
<string name="night_theme_summary">Välj det natt-tema du föredrar — %s</string>
|
||||
<string name="seekbar_preview_thumbnail_title">Sökradens förhandsvisningsminiatyr</string>
|
||||
<string name="local_search_suggestions">Lokala sökförslag</string>
|
||||
<string name="local_search_suggestions">Lokala sökningsförslag</string>
|
||||
<plurals name="deleted_downloads_toast">
|
||||
<item quantity="one">Tog bort %1$s nedladdning</item>
|
||||
<item quantity="other">Tog bort %1$s nedladdningar</item>
|
||||
@@ -631,9 +645,9 @@
|
||||
<string name="remote_search_suggestions">Förslag via fjärrsökning</string>
|
||||
<string name="start_main_player_fullscreen_summary">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</string>
|
||||
<string name="check_for_updates">Sök efter uppdateringar</string>
|
||||
<string name="manual_update_description">Sök manuellt efter nya versioner</string>
|
||||
<string name="manual_update_description">Kolla manuellt efter nya versioner</string>
|
||||
<string name="checking_updates_toast">Söker efter uppdateringar…</string>
|
||||
<string name="feed_new_items">Nya flödesobjekt</string>
|
||||
<string name="feed_new_items">Nya flödes objekt</string>
|
||||
<string name="show_crash_the_player_title">Visa \"Krascha spelaren\"</string>
|
||||
<string name="crash_the_player">Krascha spelaren</string>
|
||||
<string name="show_crash_the_player_summary">Visar ett kraschalternativ vid användning av spelaren</string>
|
||||
@@ -641,7 +655,7 @@
|
||||
<string name="error_report_channel_description">Aviseringar om att rapportera fel</string>
|
||||
<string name="error_report_notification_title">NewPipe stötte på ett fel, tryck för att rapportera</string>
|
||||
<string name="error_report_notification_toast">Ett fel uppstod, se aviseringen</string>
|
||||
<string name="show_error_snackbar">Visa ett felmeddelande i snackbar</string>
|
||||
<string name="show_error_snackbar">Visa en fel snackbar</string>
|
||||
<string name="create_error_notification">Skapa en felavisering</string>
|
||||
<string name="no_appropriate_file_manager_message">Ingen lämplig filhanterare hittades för denna åtgärd.
|
||||
\nInstallera en filhanterare eller testa att inaktivera \'%s\' i nedladdningsinställningarna</string>
|
||||
@@ -649,7 +663,7 @@
|
||||
\nInstallera en filhanterare som är kompatibel med Storage Access Framework</string>
|
||||
<string name="detail_pinned_comment_view_description">Fäst kommentar</string>
|
||||
<string name="leak_canary_not_available">LeakCanary är inte tillgänglig</string>
|
||||
<string name="progressive_load_interval_exoplayer_default">ExoPlayer-standard</string>
|
||||
<string name="progressive_load_interval_exoplayer_default">ExoPlayer standard</string>
|
||||
<string name="progressive_load_interval_summary">Ändra storleken på laddningsintervallet för progressivt innehåll (för närvarande %s). Ett lägre värde kan påskynda den första laddningen</string>
|
||||
<string name="streams_notifications_interval_title">Uppdateringsintervall</string>
|
||||
<string name="streams_notifications_network_title">Nödvändig nätverksanslutning</string>
|
||||
@@ -657,14 +671,14 @@
|
||||
<string name="delete_downloaded_files_confirm">Radera alla nedladdade filer från disken\?</string>
|
||||
<string name="notifications_disabled">Aviseringar är avstängda</string>
|
||||
<string name="get_notified">Bli meddelad</string>
|
||||
<string name="you_successfully_subscribed">Du prenumererar nu på denna kanal</string>
|
||||
<string name="you_successfully_subscribed">Du har nu prenumenerat till denna kanalen</string>
|
||||
<string name="streams_notification_channel_description">Aviseringar om nya strömningar för prenumerationer</string>
|
||||
<plurals name="new_streams">
|
||||
<item quantity="one">%s ny strömning</item>
|
||||
<item quantity="other">%s nya strömningar</item>
|
||||
<item quantity="one">%s Ny strömning</item>
|
||||
<item quantity="other">strömningar%s Nya strömningar</item>
|
||||
</plurals>
|
||||
<string name="settings_category_player_notification_summary">Konfigurera meddelande om aktuell ström som spelas upp</string>
|
||||
<string name="check_new_streams">Sök efter nya strömningar</string>
|
||||
<string name="check_new_streams">Kör leta efter nya strömningar</string>
|
||||
<string name="enable_streams_notifications_summary">Meddela om nya strömningar från prenumerationer</string>
|
||||
<string name="notifications">Aviseringar</string>
|
||||
<string name="streams_notification_channel_name">Nya strömningar</string>
|
||||
@@ -683,9 +697,9 @@
|
||||
<string name="progressive_load_interval_title">Inläsningsintervallsstorlek</string>
|
||||
<string name="select_quality_external_players">Välj kvalitet för externa spelare</string>
|
||||
<string name="selected_stream_external_player_not_supported">Den valda videoströmmen stöds inte av externa spelare</string>
|
||||
<string name="faq_description">Om du har problem med att använda appen, se till att läsa dessa svar på några vanliga frågor!</string>
|
||||
<string name="faq_title">Vanliga frågor</string>
|
||||
<string name="faq">Visa på webbplatsen</string>
|
||||
<string name="faq_description">Om du har problem med att använda appen, kolla in dessa svar på vanligt ställda frågor!</string>
|
||||
<string name="faq_title">Vanligt ställda frågor</string>
|
||||
<string name="faq">Visa på webbplats</string>
|
||||
<string name="sort">Sortera</string>
|
||||
<string name="import_subscriptions_hint">Importera eller exportera prenumerationer från 3-punktsmenyn</string>
|
||||
<string name="fast_mode">Snabbt läge</string>
|
||||
@@ -711,56 +725,58 @@
|
||||
<string name="none">Ingen</string>
|
||||
<string name="left_gesture_control_summary">Välj en gest för den vänstra halvan av spelarskärmen</string>
|
||||
<string name="brightness">Ljusstyrka</string>
|
||||
<string name="left_gesture_control_title">Åtgärd för vänstergest</string>
|
||||
<string name="left_gesture_control_title">Vänstergest åtgärd</string>
|
||||
<string name="right_gesture_control_summary">Välj en gest för den högra halvan av spelarskärmen</string>
|
||||
<string name="right_gesture_control_title">Åtgärd för högergest</string>
|
||||
<string name="right_gesture_control_title">Högergest åtgärd</string>
|
||||
<string name="play_queue_audio_track">Ljud: %s</string>
|
||||
<string name="audio_track">Ljudspår</string>
|
||||
<string name="audio_track_present_in_video">Ett ljudspår bör redan finnas i denna ström</string>
|
||||
<string name="select_audio_track_external_players">Välj ljudspår för externa spelare</string>
|
||||
<string name="unknown_audio_track">Okänt</string>
|
||||
<string name="settings_category_exoplayer_title">ExoPlayer-inställningar</string>
|
||||
<string name="settings_category_exoplayer_summary">Hantera vissa ExoPlayer-inställningar. Ändringarna kräver att spelaren startas om för att träda i kraft</string>
|
||||
<string name="settings_category_exoplayer_title">ExoPlayer inställningar</string>
|
||||
<string name="settings_category_exoplayer_summary">Hantera vissa ExoPlayer inställningar. Dessa ändringar kräver en omstart av spelaren för att träda i kraft</string>
|
||||
<string name="always_use_exoplayer_set_output_surface_workaround_title">Använd alltid ExoPlayers lösning för inställning av videoutgångsyta</string>
|
||||
<string name="prefer_original_audio_title">Föredra originalljud</string>
|
||||
<string name="prefer_original_audio_summary">Välj originalljudspåret oavsett språk</string>
|
||||
<string name="prefer_descriptive_audio_title">Föredra beskrivande ljud</string>
|
||||
<string name="prefer_descriptive_audio_summary">Välj ett ljudspår med beskrivningar för synskadade personer om det finns tillgängligt</string>
|
||||
<string name="use_exoplayer_decoder_fallback_title">Använd ExoPlayers reservfunktion för avkodare</string>
|
||||
<string name="use_exoplayer_decoder_fallback_summary">Aktivera det här alternativet om du har problem med att initiera avkodare. ExoPlayer försöker då använda avkodare med lägre prioritet om de primära avkodarna inte kan initieras. Detta kan ge sämre uppspelningsprestanda än när de primära avkodarna används</string>
|
||||
<string name="always_use_exoplayer_set_output_surface_workaround_summary">Denna lösning frigör och skapar om videokodekar när videoytan ändras, i stället för att ställa in ytan direkt i kodeken. ExoPlayer använder redan detta på vissa enheter med det här problemet, så inställningen har bara effekt på Android 6 och senare.\n\nOm du aktiverar alternativet kan det förhindra uppspelningsfel när du byter videospelare eller växlar till fullskärm</string>
|
||||
<string name="use_exoplayer_decoder_fallback_summary">Aktivera det här alternativet om du har problem med initiering av avkodare, vilket faller tillbaka på avkodare med lägre prioritet om initieringen av primära avkodare misslyckas. Detta kan leda till sämre uppspelningsprestanda än vid användning av primära avkodare</string>
|
||||
<string name="always_use_exoplayer_set_output_surface_workaround_summary">Denna lösning frigör och återinstansierar videokodeker när en ytförändring inträffar, istället för att ställa in ytan direkt till kodeken. Används redan av ExoPlayer på vissa enheter med detta problem, denna inställning har endast effekt på Android 6 och senare
|
||||
\n
|
||||
\nOm du aktiverar det här alternativet kan det förhindra uppspelningsfel när du byter aktuell videospelare eller växlar till fullskärm</string>
|
||||
<string name="audio_track_name">%1$s %2$s</string>
|
||||
<string name="audio_track_type_original">original</string>
|
||||
<string name="audio_track_type_descriptive">beskrivande</string>
|
||||
<string name="audio_track_type_dubbed">dubbad</string>
|
||||
<string name="main_tabs_position_summary">Flytta huvudfliksväljaren längst ned</string>
|
||||
<string name="main_tabs_position_summary">Flytta huvudflik väljaren till botten</string>
|
||||
<string name="main_tabs_position_title">Huvudflikarnas position</string>
|
||||
<string name="no_streams">Inga strömningar</string>
|
||||
<string name="no_live_streams">Inga live-strömningar</string>
|
||||
<string name="disable_media_tunneling_automatic_info">Medietunnel har inaktiverats som standard på din enhet eftersom enhetsmodellen inte stöder funktionen.</string>
|
||||
<string name="image_quality_title">Bildkvalitet</string>
|
||||
<string name="disable_media_tunneling_automatic_info">Medietunnel har inaktiverats som standard på din enhet eftersom att enhetsmodellen inte stöder funktionen.</string>
|
||||
<string name="image_quality_title">Bildkvalité</string>
|
||||
<string name="channel_tab_videos">Videor</string>
|
||||
<string name="metadata_subscribers">Prenumeranter</string>
|
||||
<string name="show_channel_tabs_summary">Vilka flikar som visas på kanalsidor</string>
|
||||
<string name="show_channel_tabs_summary">Vilka filkar visas på kanalsidorna</string>
|
||||
<string name="share_playlist_with_list">Dela URL-lista</string>
|
||||
<string name="show_channel_tabs">Kanalflikar</string>
|
||||
<string name="channel_tab_shorts">Shorts</string>
|
||||
<string name="loading_metadata_title">Laddar metadata…</string>
|
||||
<string name="loading_metadata_title">Laddar Metadata…</string>
|
||||
<string name="toggle_screen_orientation">Aktivera skärmorientering</string>
|
||||
<string name="image_quality_low">Låg kvalitet</string>
|
||||
<string name="image_quality_low">Låg kvalité</string>
|
||||
<string name="toggle_fullscreen">Aktivera helskärm</string>
|
||||
<string name="feed_fetch_channel_tabs">Hämta kanalflikar</string>
|
||||
<string name="next_stream">Nästa strömning</string>
|
||||
<string name="open_play_queue">Öppna spelkö</string>
|
||||
<string name="image_quality_none">Ladda inte bilder</string>
|
||||
<string name="image_quality_high">Hög kvalitet</string>
|
||||
<string name="image_quality_high">Hög kvalité</string>
|
||||
<string name="channel_tab_about">Om</string>
|
||||
<string name="share_playlist">Dela spellista</string>
|
||||
<string name="forward">Spola framåt</string>
|
||||
<string name="forward">Spola frammåt</string>
|
||||
<string name="channel_tab_albums">Album</string>
|
||||
<string name="rewind">Spola tillbaka</string>
|
||||
<string name="replay">Spela igen</string>
|
||||
<string name="image_quality_medium">Medelkvalitet</string>
|
||||
<string name="replay">Återspela</string>
|
||||
<string name="image_quality_medium">Medelkvalité</string>
|
||||
<string name="channel_tab_playlists">Spellistor</string>
|
||||
<string name="play">Spela</string>
|
||||
<string name="more_options">Fler alternativ</string>
|
||||
@@ -771,7 +787,7 @@
|
||||
<string name="previous_stream">Föregående strömning</string>
|
||||
<string name="channel_tab_livestreams">Live</string>
|
||||
<string name="question_mark">\?</string>
|
||||
<string name="share_playlist_with_titles">Dela med titlar</string>
|
||||
<string name="share_playlist_with_titles">Dela med Titlar</string>
|
||||
<string name="share_playlist_content_details">%1$s
|
||||
\n%2$s</string>
|
||||
<string name="metadata_avatars">Visningsbilder</string>
|
||||
@@ -780,7 +796,7 @@
|
||||
<string name="metadata_uploader_avatars">Uppladdarens visningsbilder</string>
|
||||
<string name="metadata_banners">Banderoller</string>
|
||||
<string name="video_details_list_item">- %1$s: %2$s</string>
|
||||
<string name="image_quality_summary">Välj bildkvalitet och om bilder överhuvudtaget ska laddas för att minska data- och minnesanvändningen. Ändringar rensar både i minnet och bildcachen på disk – %s</string>
|
||||
<string name="image_quality_summary">Välj bildkvalitet och om bilder överhuvudtaget ska laddas för att minska data och minnesanvändningen. Ändringar rensar både i minnet och bildcache på disk – %s</string>
|
||||
<string name="show_more">Visa mer</string>
|
||||
<plurals name="replies">
|
||||
<item quantity="one">%s svar</item>
|
||||
@@ -792,15 +808,16 @@
|
||||
<string name="no">Nej</string>
|
||||
<string name="settings_category_backup_restore_title">Säkerhetskopiering och återställning</string>
|
||||
<string name="yes">Ja</string>
|
||||
<string name="auto_update_check_description">NewPipe kan automatiskt söka efter nya versioner då och då och meddela dig när de är tillgängliga. \nVill du aktivera det?</string>
|
||||
<string name="auto_update_check_description">NewPipe kan automatiskt söka efter nya versioner då och då och meddela dig när de är tillgängliga.
|
||||
\nVill du aktivera detta?</string>
|
||||
<string name="reset_settings_title">Återställ inställningar</string>
|
||||
<string name="reset_settings_summary">Återställ alla inställningar till deras standardvärden</string>
|
||||
<string name="reset_all_settings">Om du återställer alla inställningar försvinner alla dina föredragna inställningar och appen startas om.
|
||||
\n
|
||||
\nÄr du säker på att du vill fortsätta?</string>
|
||||
<string name="import_settings_vulnerable_format">Inställningarna i exporten du importerar använder ett sårbart format som fasades ut i NewPipe 0.27.0. Kontrollera att exporten kommer från en betrodd källa och överväg att framöver bara använda exporter från NewPipe 0.27.0 eller senare. Stödet för att importera inställningar i det här sårbara formatet kommer snart att tas bort helt. Då kommer äldre versioner av NewPipe inte längre att kunna importera inställningsexporter från nyare versioner.</string>
|
||||
<string name="import_settings_vulnerable_format">Inställningarna i exporten som importeras använder ett sårbart format som fasades ut i NewPipe 0.27.0. Se till att exporten som importeras är från en betrodd källa, och överväg att endast använda exporter som erhållits från NewPipe 0.27.0 eller nyare i framtiden. Stöd för import av inställningar från detta sårbara format kommer snart att tas bort helt, och sedan kommer gamla versioner av NewPipe inte att kunna importera inställningar av exporter från nya versioner längre.</string>
|
||||
<string name="audio_track_type_secondary">sekundär</string>
|
||||
<string name="share_playlist_as_youtube_temporary_playlist">Dela som tillfällig YouTube-spellista</string>
|
||||
<string name="share_playlist_as_youtube_temporary_playlist">Dela som YouTube temporär spellista</string>
|
||||
<string name="tab_bookmarks_short">Spellistor</string>
|
||||
<string name="select_a_feed_group">Välj en flödesgrupp</string>
|
||||
<string name="no_feed_group_created_yet">Ingen flödesgrupp har skapats ännu</string>
|
||||
@@ -819,15 +836,15 @@
|
||||
<string name="trending_podcasts">Trendiga poddar</string>
|
||||
<string name="trending_movies">Populära filmer och serier</string>
|
||||
<string name="trending_music">Populär musik</string>
|
||||
<string name="permission_display_over_apps_message">För att använda popupspelaren, välj %1$s i följande Android-inställningsmeny och aktivera %2$s.</string>
|
||||
<string name="permission_display_over_apps_message">För att använda Popup Player, välj %1$s i följande Android-inställningsmeny och aktivera %2$s.</string>
|
||||
<string name="permission_display_over_apps_permission_name">\"Tillåt visning över andra appar\"</string>
|
||||
<string name="delete_file">Ta bort fil</string>
|
||||
<string name="delete_entry">Ta bort post</string>
|
||||
<string name="account_terminated_service_provides_reason">Konto avslutat\n\n%1$s anger denna anledning: %2$s</string>
|
||||
<string name="entry_deleted">Posten borttagen</string>
|
||||
<string name="player_http_403">HTTP-fel 403 mottogs från servern under uppspelning, troligen orsakat av att strömnings-URL:en har löpt ut eller att en IP-adress har blockerats</string>
|
||||
<string name="player_http_invalid_status">HTTP-fel %1$s mottogs från servern under uppspelning</string>
|
||||
<string name="youtube_player_http_403">HTTP-fel 403 mottogs från servern under uppspelning, troligen orsakat av en IP-blockering eller problem med deobfuskering av strömnings-URL:er</string>
|
||||
<string name="player_http_403">HTTP-fel 403 mottogs från servern under uppspelning, troligen orsakat av att streaming-URL:en har löpt ut eller att en IP-adress har blockerats</string>
|
||||
<string name="player_http_invalid_status">HTTP-fel %1$s mottogs från servern under spelning</string>
|
||||
<string name="youtube_player_http_403">HTTP-fel 403 mottogs från servern under spelning, troligen orsakat av en IP-avstängning eller problem med deobfuskering av streaming-URL:er</string>
|
||||
<string name="sign_in_confirm_not_bot_error">%1$s vägrade att lämna ut 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 Wi-Fi till mobildata).\n\nSe <a href="%2$s">denna FAQ-post</a> för mer information.</string>
|
||||
<string name="unsupported_content_in_country">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\".</string>
|
||||
<string name="kao_dialog_warning">I augusti 2025 meddelade Google att från och med september 2026 kommer installation av appar att kräva utvecklarverifiering för alla Android-appar på certifierade enheter, inklusive de som installerats utanför Play Store. Eftersom utvecklarna av NewPipe inte godkänner detta krav kommer NewPipe inte längre att fungera på certifierade Android-enheter efter den tiden.</string>
|
||||
|
||||
@@ -301,7 +301,8 @@
|
||||
<string name="app_license">NewPipe, telif müsaadeli özgür yazılımdır: İstediğiniz gibi kullanabilir, öğrenebilir, paylaşabilir ve geliştirebilirsiniz. Özellikle, Özgür Yazılım Vakfı tarafından yayımlanan GNU Genel Kamu Lisansı 3. sürümü veya (isterseniz) daha sonraki sürümleri koşulları altında yeniden dağıtabilir ve/veya değiştirebilirsiniz.</string>
|
||||
<string name="import_settings">Ayarları da içe aktarmak istiyor musunuz?</string>
|
||||
<string name="privacy_policy_title">NewPipe\'ın Gizlilik İlkesi</string>
|
||||
<string name="privacy_policy_encouragement">NewPipe projesi, gizliliğinizi çok önemsiyor. Bu nedenle, uygulama izniniz olmadan herhangi bir veri toplamaz.\nNewPipe\'ın gizlilik ilkesi, çökme raporu gönderdiğinizde hangi verilerin gönderildiğini ve saklandığını ayrıntılı olarak açıklar.</string>
|
||||
<string name="privacy_policy_encouragement">NewPipe projesi, gizliliğinizi çok ciddiye alıyor. Bu nedenle, uygulama sizin izniniz olmadan herhangi bir veri toplamaz.
|
||||
\nNewPipe\'ın gizlilik ilkesi, çökme raporu gönderdiğinizde hangi verilerin gönderildiğini ve saklandığını ayrıntılı olarak açıklar.</string>
|
||||
<string name="read_privacy_policy">Gizlilik ilkesini oku</string>
|
||||
<string name="start_accept_privacy_policy">Avrupa Genel Veri Koruma Yönetmeliğine (GDPR) uymak için, dikkatinizi NewPipe\'ın gizlilik ilkesine çekiyoruz. Lütfen dikkatlice okuyun.
|
||||
\nBize hata bildirimini göndermek için kabul etmelisiniz.</string>
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
<string name="subscribed_button_title">已订阅</string>
|
||||
<string name="enable_watch_history_title">记录播放记录</string>
|
||||
<string name="settings_category_player_title">播放器</string>
|
||||
<string name="settings_category_history_title">历史记录和缓存</string>
|
||||
<string name="settings_category_history_title">历史记录与缓存</string>
|
||||
<string name="undo">撤销</string>
|
||||
<string name="play_all">播放全部</string>
|
||||
<string name="always">总是</string>
|
||||
@@ -126,7 +126,7 @@
|
||||
<string name="play_audio">音频</string>
|
||||
<string name="default_audio_format_title">默认音频格式</string>
|
||||
<string name="show_next_and_similar_title">显示“接下来”和“相似视频”</string>
|
||||
<string name="settings_category_video_audio_title">音视频</string>
|
||||
<string name="settings_category_video_audio_title">视频和音频</string>
|
||||
<string name="background_player_playing_toast">后台播放</string>
|
||||
<string name="content">内容</string>
|
||||
<string name="show_age_restricted_content_title">显示年龄限制的内容</string>
|
||||
@@ -791,7 +791,7 @@
|
||||
<string name="show_less">显示较少</string>
|
||||
<string name="notification_actions_summary_android13">轻按下方的每个通知操作进行编辑。头三个动作(播放/暂停、上一个和下一个)是系统设置的,不能自定义。</string>
|
||||
<string name="error_insufficient_storage">设备剩余空间不足</string>
|
||||
<string name="settings_category_backup_restore_title">备份和恢复</string>
|
||||
<string name="settings_category_backup_restore_title">备份和还原</string>
|
||||
<string name="reset_settings_title">重置设置</string>
|
||||
<string name="reset_settings_summary">将所有设置重置为默认值</string>
|
||||
<string name="reset_all_settings">重置所有设置会取消你所有的偏好设置并重启应用。
|
||||
|
||||
@@ -140,11 +140,11 @@
|
||||
<string name="title_activity_about">關於 NewPipe</string>
|
||||
<string name="title_licenses">第三方授權條款</string>
|
||||
<string name="copyright" formatted="true">© %1$s 由 %2$s 使用 %3$s 授權條款發布</string>
|
||||
<string name="tab_about">關於 & 常見問題</string>
|
||||
<string name="tab_about">關於與常見問題</string>
|
||||
<string name="tab_licenses">授權條款</string>
|
||||
<string name="app_description">在 Android 上自由且輕量的串流。</string>
|
||||
<string name="app_description">Android 上自由且輕巧的串流播放器。</string>
|
||||
<string name="view_on_github">在 GitHub 上檢視</string>
|
||||
<string name="app_license_title">NewPipe 的授權條款</string>
|
||||
<string name="app_license_title">NewPipe 使用的授權條款</string>
|
||||
<string name="contribution_encouragement">不管您有什麼點子 ── 翻譯、設計、清理或撰寫大量程式碼 ── 我們永遠歡迎您來幫忙。做得越多,NewPipe 就會更好!</string>
|
||||
<string name="read_full_license">閱讀授權條款</string>
|
||||
<string name="contribution_title">貢獻</string>
|
||||
|
||||
@@ -1513,4 +1513,7 @@
|
||||
<item>@string/image_quality_medium_key</item>
|
||||
<item>@string/image_quality_high_key</item>
|
||||
</string-array>
|
||||
|
||||
<!-- Layout redesigh-->
|
||||
<string name="settings_layout_redesign_key">settings_layout_redesign_key</string>
|
||||
</resources>
|
||||
|
||||
@@ -159,6 +159,8 @@
|
||||
<string name="settings_category_player_notification_title">Player notification</string>
|
||||
<string name="settings_category_player_notification_summary">Configure current playing stream notification</string>
|
||||
<string name="settings_category_backup_restore_title">Backup and restore</string>
|
||||
<string name="settings_category_services_title">Services</string>
|
||||
<string name="settings_category_language_title">Language</string>
|
||||
<string name="background_player_playing_toast">Playing in background</string>
|
||||
<string name="popup_playing_toast">Playing in popup mode</string>
|
||||
<string name="content">Content</string>
|
||||
@@ -903,4 +905,10 @@
|
||||
<string name="api23_requirement_dialog_title">NewPipe is dropping support for Android 5</string>
|
||||
<string name="api23_requirement_dialog_message">Unfortunately NewPipe depends on a few libraries that dropped support for Android 5.0 and 5.1. The next NewPipe release will therefore only work on devices with Android 6 or higher, sadly. Read more in the blogpost.</string>
|
||||
<string name="api23_requirement_dialog_blogpost">Blogpost</string>
|
||||
<string name="settings_category_look_and_feel_title">Look and feel</string>
|
||||
<string name="settings_category_content_title">Content</string>
|
||||
<string name="navigate_back">Navigate back</string>
|
||||
<string name="settings_layout_redesign">Enable the Redesigned Settings page</string>
|
||||
<string name="app_restart_required">Restart NewPipe to apply the new theme</string>
|
||||
|
||||
</resources>
|
||||
|
||||
-62
@@ -1,62 +0,0 @@
|
||||
package org.schabi.newpipe.local.subscription.workers
|
||||
|
||||
import androidx.work.Data
|
||||
import androidx.work.workDataOf
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
import org.schabi.newpipe.local.subscription.workers.SubscriptionImportInput.ChannelUrlMode
|
||||
import org.schabi.newpipe.local.subscription.workers.SubscriptionImportInput.InputStreamMode
|
||||
import org.schabi.newpipe.local.subscription.workers.SubscriptionImportInput.PreviousExportMode
|
||||
|
||||
class SubscriptionImportInputTest {
|
||||
|
||||
@Test
|
||||
fun `Channel URL mode round-trips through Work Data`() {
|
||||
val input = ChannelUrlMode(serviceId = 0, url = "https://www.youtube.com")
|
||||
assertEquals(input, SubscriptionImportInput.fromData(input.toData()))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `Input stream mode round-trips through Work Data`() {
|
||||
val input = InputStreamMode(
|
||||
serviceId = 0,
|
||||
url = "content://com.android.providers.downloads.documents/document/raw%3A%2Fstorage%2Fsubscriptions.csv"
|
||||
)
|
||||
assertEquals(input, SubscriptionImportInput.fromData(input.toData()))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `Previous export mode round-trips through Work Data`() {
|
||||
val input = PreviousExportMode(url = "content://media/external/file/newpipe_subscriptions.json")
|
||||
assertEquals(input, SubscriptionImportInput.fromData(input.toData()))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `Missing mode falls back to previous export mode`() {
|
||||
val data = Data.Builder()
|
||||
.putString("url", "content://media/external/file/newpipe_subscriptions.json")
|
||||
.build()
|
||||
|
||||
assertEquals(
|
||||
PreviousExportMode("content://media/external/file/newpipe_subscriptions.json"),
|
||||
SubscriptionImportInput.fromData(data)
|
||||
)
|
||||
}
|
||||
|
||||
@Test(expected = IllegalArgumentException::class)
|
||||
fun `Unknown mode throws`() {
|
||||
SubscriptionImportInput.fromData(workDataOf("mode" to 99, "url" to "https://www.youtube.com"))
|
||||
}
|
||||
|
||||
@Test(expected = IllegalArgumentException::class)
|
||||
fun `Channel URL mode without service id throws`() {
|
||||
SubscriptionImportInput.fromData(workDataOf("mode" to 0, "url" to "https://www.youtube.com"))
|
||||
}
|
||||
|
||||
@Test(expected = IllegalArgumentException::class)
|
||||
fun `Input stream mode without service id throws`() {
|
||||
SubscriptionImportInput.fromData(
|
||||
workDataOf("mode" to 1, "url" to "content://media/external/file/subscriptions.csv")
|
||||
)
|
||||
}
|
||||
}
|
||||
-134
@@ -1,134 +0,0 @@
|
||||
package org.schabi.newpipe.local.subscription.workers
|
||||
|
||||
import java.io.ByteArrayInputStream
|
||||
import java.io.ByteArrayOutputStream
|
||||
import java.nio.charset.StandardCharsets
|
||||
import java.util.zip.ZipEntry
|
||||
import java.util.zip.ZipOutputStream
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.mockito.Mockito
|
||||
import org.mockito.Mockito.`when`
|
||||
import org.mockito.Mockito.withSettings
|
||||
import org.mockito.junit.MockitoJUnitRunner
|
||||
import org.schabi.newpipe.extractor.ServiceList
|
||||
import org.schabi.newpipe.extractor.subscription.SubscriptionItem as ExtractorSubscriptionItem
|
||||
import org.schabi.newpipe.streams.io.StoredFileHelper
|
||||
|
||||
@RunWith(MockitoJUnitRunner::class)
|
||||
class SubscriptionImportWorkerTest {
|
||||
|
||||
@Test
|
||||
fun `Octet-stream csv import must resolve to csv`() {
|
||||
assertResolvedContentType("csv", StoredFileHelper.DEFAULT_MIME, "subscriptions.csv")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `Octet-stream csv import must parse through YouTube extractor`() {
|
||||
val contentType = resolveContentType(StoredFileHelper.DEFAULT_MIME, "subscriptions.csv")
|
||||
val items = ServiceList.YouTube.subscriptionExtractor.fromInputStream(
|
||||
ByteArrayInputStream(SUBSCRIPTIONS_CSV.toByteArray(StandardCharsets.UTF_8)),
|
||||
contentType
|
||||
)
|
||||
|
||||
assertSampleSubscriptions(items)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `Missing content type csv import must resolve to csv`() {
|
||||
assertResolvedContentType("csv", null, "subscriptions.csv")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `Octet-stream takeout archive must resolve to zip`() {
|
||||
assertResolvedContentType("zip", StoredFileHelper.DEFAULT_MIME, "takeout.zip")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `Octet-stream takeout archive must parse through YouTube extractor`() {
|
||||
val contentType = resolveContentType(StoredFileHelper.DEFAULT_MIME, "takeout.zip")
|
||||
val items = ServiceList.YouTube.subscriptionExtractor.fromInputStream(
|
||||
ByteArrayInputStream(createTakeoutZip()),
|
||||
contentType
|
||||
)
|
||||
|
||||
assertSampleSubscriptions(items)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `Provider content type must be preserved`() {
|
||||
assertResolvedContentType("application/json", "application/json")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `Unknown octet-stream import must stay octet-stream`() {
|
||||
assertResolvedContentType(StoredFileHelper.DEFAULT_MIME, StoredFileHelper.DEFAULT_MIME, "subscriptions")
|
||||
}
|
||||
|
||||
private fun assertResolvedContentType(
|
||||
expectedContentType: String,
|
||||
contentType: String?,
|
||||
fileName: String? = null
|
||||
) {
|
||||
assertEquals(expectedContentType, resolveContentType(contentType, fileName))
|
||||
}
|
||||
|
||||
private fun resolveContentType(contentType: String?, fileName: String? = null): String {
|
||||
val fileHelper = Mockito.mock(StoredFileHelper::class.java, withSettings().stubOnly())
|
||||
`when`(fileHelper.type).thenReturn(contentType)
|
||||
if (fileName != null) {
|
||||
`when`(fileHelper.name).thenReturn(fileName)
|
||||
}
|
||||
|
||||
return SubscriptionImportWorker.getInputStreamContentType(fileHelper)
|
||||
}
|
||||
|
||||
private fun createTakeoutZip(): ByteArray {
|
||||
val output = ByteArrayOutputStream()
|
||||
ZipOutputStream(output).use { zip ->
|
||||
zip.putNextEntry(ZipEntry("YouTube and YouTube Music/subscriptions/subscriptions.csv"))
|
||||
zip.write(SUBSCRIPTIONS_CSV.toByteArray(StandardCharsets.UTF_8))
|
||||
zip.closeEntry()
|
||||
}
|
||||
return output.toByteArray()
|
||||
}
|
||||
|
||||
private fun assertSampleSubscriptions(items: List<ExtractorSubscriptionItem>) {
|
||||
assertEquals(SAMPLE_SUBSCRIPTIONS.size, items.size)
|
||||
SAMPLE_SUBSCRIPTIONS.forEachIndexed { index, subscription ->
|
||||
assertEquals(ServiceList.YouTube.serviceId, items[index].serviceId)
|
||||
assertEquals(subscription.url.replace("http://", "https://"), items[index].url)
|
||||
assertEquals(subscription.name, items[index].name)
|
||||
}
|
||||
}
|
||||
|
||||
private data class SampleSubscription(val id: String, val url: String, val name: String)
|
||||
|
||||
companion object {
|
||||
private val SAMPLE_SUBSCRIPTIONS = listOf(
|
||||
SampleSubscription(
|
||||
"UCCj956IF62FbT7Gouszaj9w",
|
||||
"http://www.youtube.com/channel/UCCj956IF62FbT7Gouszaj9w",
|
||||
"BBC"
|
||||
),
|
||||
SampleSubscription(
|
||||
"UCXuqSBlHAE6Xw-yeJA0Tunw",
|
||||
"http://www.youtube.com/channel/UCXuqSBlHAE6Xw-yeJA0Tunw",
|
||||
"Linus Tech Tips"
|
||||
),
|
||||
SampleSubscription(
|
||||
"UCBJycsmduvYEL83R_U4JriQ",
|
||||
"http://www.youtube.com/channel/UCBJycsmduvYEL83R_U4JriQ",
|
||||
"Marques Brownlee"
|
||||
)
|
||||
)
|
||||
|
||||
private val SUBSCRIPTIONS_CSV = buildString {
|
||||
appendLine("Channel Id,Channel Url,Channel Title")
|
||||
SAMPLE_SUBSCRIPTIONS.forEach { subscription ->
|
||||
appendLine("${subscription.id},${subscription.url},${subscription.name}")
|
||||
}
|
||||
}.trimEnd()
|
||||
}
|
||||
}
|
||||
@@ -3,13 +3,13 @@
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
const val NEWPIPE_VERSION_SDK_COMPILE_MAJOR = 37
|
||||
const val NEWPIPE_VERSION_SDK_COMPILE_MINOR = 0
|
||||
const val NEWPIPE_VERSION_SDK_COMPILE_MAJOR = 36
|
||||
const val NEWPIPE_VERSION_SDK_COMPILE_MINOR = 1
|
||||
const val NEWPIPE_VERSION_SDK_MIN = 23
|
||||
const val NEWPIPE_VERSION_SDK_TARGET = 35
|
||||
|
||||
const val NEWPIPE_VERSION_CODE = 1015
|
||||
const val NEWPIPE_VERSION_NAME = "0.29.1"
|
||||
const val NEWPIPE_VERSION_CODE = 1013
|
||||
const val NEWPIPE_VERSION_NAME = "0.28.8"
|
||||
|
||||
const val NEWPIPE_APPLICATION_ID_OLD = "org.schabi.newpipe"
|
||||
const val NEWPIPE_APPLICATION_ID_NEW = "net.newpipe.app"
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
- [YouTube] تم تجاوز قيود SABR باستخدام مشغل فيديو آخر. الفيديوهات والبث المباشر متوفرة الآن بدقة عرض مختلفة عن 360p!
|
||||
- [YouTube] تم إصلاح إستخراج عناصر قوائم التشغيل وبعض الخصائص في نماذج عرض القفل.
|
||||
- [YouTube] تم إزالة خاصية الرجوع إلى المواضع العمياء في استخراج عدد/تاريخ عرض القفل.
|
||||
- [YouTube] تم استخدام تنسيقات xTags لاستخراج نوع المسار الصوتي.
|
||||
- [Bandcamp] تم إصلاح البحث في Band amp.
|
||||
|
||||
شكرًا جزيلًا لكل من ساهم في هذا الإصدار!
|
||||
@@ -1,5 +0,0 @@
|
||||
• Минималната версия на Android е увеличена до 6.0
|
||||
• Отстранени са грешки при импортирането на абонаменти
|
||||
• Отстранени са множество грешки при възпроизвеждане на видео
|
||||
• Отстранена е грешка, която пречеше на отварянето на изтегляния в други приложения
|
||||
• Актуализации на превода
|
||||
@@ -1,5 +0,0 @@
|
||||
• Zvýšena minimální verze systému Android na 6.0
|
||||
• Opraveny chyby při importu odběrů
|
||||
• Opraveno několik chyb při přehrávání videa
|
||||
• Opravena chyba, která bránila otevření stažených souborů v jiné aplikaci
|
||||
• Aktualizace překladů
|
||||
@@ -1,5 +0,0 @@
|
||||
• Die minimale unterstützte Android-Version ist jetzt 6.0
|
||||
• Fehler beim Importieren von Abonnements behoben
|
||||
• Mehrere Fehler beim Abspielen von Videos behoben
|
||||
• Ein Fehler behoben, der dass Öffnen von Downloads in anderen Apps verhindert hat
|
||||
• Übersetzungen aktualisiert
|
||||
@@ -1,5 +0,0 @@
|
||||
• Increased minimum Android version to 6.0
|
||||
• Fixed bugs with importing subscriptions
|
||||
• Fixed multiple bugs with video playback
|
||||
• Fixed a bug that prevented opening downloads in other app
|
||||
• Translation updates
|
||||
@@ -1 +0,0 @@
|
||||
This is a hotfix release fixing live streams for media.ccc.de. Happy Hacking!
|
||||
@@ -1,7 +0,0 @@
|
||||
- [YouTube] Se evitó el bloqueo de SABR con otro cliente de reproducción. ¡Videos y directos disponibles en más de 360p otra vez!
|
||||
- [YouTube] Corregida extracción de listas de reproducción y propiedades en lockup view models.
|
||||
- [YouTube] Eliminados métodos alternativos de posición a ciegas en recuento y fecha de vistas de bloqueo.
|
||||
- [YouTube] Uso de xTags de formato para tipo de pista de audio.
|
||||
- [Bandcamp] Corregida su búsqueda.
|
||||
|
||||
¡Muchas gracias a todos los implicados en este lanzamiento!
|
||||
@@ -1,5 +0,0 @@
|
||||
• Se aumento la versión mínima de Android a 6.0
|
||||
• Se corrigieron errores al importar suscripciones
|
||||
• Se corrigieron múltiples errores con la reproducción de video
|
||||
• Se corrigió un error que impedía abrir las descargas en otra aplicación.
|
||||
• Actualizaciones de traducción
|
||||
@@ -1,5 +1,5 @@
|
||||
### Mejoras
|
||||
- Importar/exportar ajustes #1333
|
||||
- Importar/exportar configuraciones #1333
|
||||
- Reducción de sobreescritura (mejora de rendimiento) #1371
|
||||
- Pequeñas mejoras de código #1375
|
||||
- Agregado todo lo referente al RGPD #1420
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
• Androidi miinimumversioon on nüüd 6.0
|
||||
• Parandasime tellimuste importimisega seotud vead
|
||||
• Parandasime mitmeid videote taasesitusega seotud vead
|
||||
• Parandasime vea, mis takistas allalaaditud failide avamist teistes rakendustes
|
||||
• Tõlgete uuendused
|
||||
@@ -1,5 +0,0 @@
|
||||
• افزایش کمینهٔ نگارش اندروید به ۶٫۰
|
||||
• رفع اشکال دونریزی اشتراکها
|
||||
• رفع چندین اشکال در پخش ویدیو
|
||||
• رفع اشکال مانع گشودن بارگیریها در کارههای دیگر
|
||||
• بهروز رسانی ترجمهها
|
||||
@@ -1,13 +1,9 @@
|
||||
Améliorations
|
||||
• Rendre la description de la playlist cliquable pour afficher plus ou moins de contenu
|
||||
• [PeerTube] Gérer automatiquement les liens vers les instances `subscribeto.me`
|
||||
• Ne lancer la lecture que d’un seul élément dans l’écran de l’historique
|
||||
• Rendre la description de la liste de lecture cliquable pour afficher plus / moins de contenu.
|
||||
• Ne lancer la lecture que d'un seul élément dans l'écran de l'historique.
|
||||
|
||||
Corrections
|
||||
• Correction de la visibilité du bouton RSS
|
||||
• Correction des plantages de l’aperçu de la barre de recherche
|
||||
• Correction de l’ajout à une liste de lecture d’un élément sans vignette
|
||||
• Correction de la fermeture de la boîte de dialogue de téléchargement avant son apparition
|
||||
• Correction de la fenêtre contextuelle de mise en file d’attente de la liste des éléments associés
|
||||
• Correction de l’ordre dans la boîte de dialogue « Ajouter à la liste de lecture »
|
||||
• Ajustement de la mise en page des éléments des signets de la liste de lecture
|
||||
• Correction des plantages de l'aperçu de la barre de recherche.
|
||||
• Correction de l'ajout à la playlist d'un élément sans vignette.
|
||||
• Correction de la fenêtre contextuelle de mise en file d'attente des éléments associés.
|
||||
• Ajustement de la disposition des éléments des signets de la liste de lecture.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Il s'agit d'une mise à jour corrective qui corrige des erreurs liées à YouTube :
|
||||
• [YouTube] Correction du problème empêchant le chargement des informations sur les vidéos, correction des erreurs HTTP 403 lors de la lecture des vidéos et rétablissement de la lecture de certaines vidéos soumises à une restriction d'âge
|
||||
• Correction du problème empêchant la modification de la taille des sous-titres
|
||||
• Correction du problème entraînant le téléchargement double des informations lors de l'ouverture d'un flux
|
||||
• [Soundcloud] Suppression des flux protégés par DRM et non lisibles
|
||||
• Mise à jour des traductions
|
||||
Cette m.à.j corrective résout les problèmes suivants sur YouTube :
|
||||
• [YouTube] Correction du problème de chargement des informations vidéo, des erreurs HTTP 403 lors de la lecture et restauration de la lecture de certaines vidéos à contenu restreint.
|
||||
• Correction du problème d'affichage de la taille des sous-titres.
|
||||
• Correction du double téléchargement des informations lors de l'ouverture d'un flux.
|
||||
• [SoundCloud] Suppression des flux protégés par DRM et illisibles.
|
||||
• Traductions mises à jour.
|
||||
|
||||
@@ -1,3 +1 @@
|
||||
Cette mise à jour corrige le problème lié au fait que YouTube ne proposait qu'un flux en 360p.
|
||||
|
||||
Notez que la solution mise en œuvre dans cette version est probablement temporaire et qu'à long terme, le protocole vidéo SABR devra être implémenté. Cependant, les membres de TeamNewPipe sont actuellement très occupés ; toute aide serait donc grandement appréciée ! https://github.com/TeamNewPipe/NewPipe/issues/12248
|
||||
Correction de YouTube qui ne lisait aucun média
|
||||
|
||||
@@ -1,17 +1,12 @@
|
||||
Nouveautés
|
||||
• Prise en charge d’Android Auto
|
||||
• Possibilité de définir des groupes de flux comme onglets de l’écran principal
|
||||
• [YouTube] Partager en tant que playlist temporaire
|
||||
• [SoundCloud] Onglet « J’aime » de la chaîne
|
||||
• Ajout de la compatibilité avec Android Auto
|
||||
• Possibilité de définir des groupes de flux comme onglets de l'écran principal
|
||||
|
||||
Améliorations
|
||||
• Amélioration des suggestions dans la barre de recherche
|
||||
• Affichage de la date de téléchargement dans la section « Téléchargements »
|
||||
• Utilisation de la langue définie pour chaque application sous Android 13
|
||||
• Amélioration des suggestions de la barre de recherche
|
||||
• Affichage de la date de téléchargement dans Téléchargements
|
||||
|
||||
Corrections
|
||||
• Correction des couleurs de texte incorrectes en mode sombre
|
||||
• [YouTube] Correction du chargement des playlists ne contenant pas plus de 100 éléments
|
||||
• [YouTube] Correction de l'absence de vidéos recommandées
|
||||
• Correction des plantages dans la vue de liste de l'historique
|
||||
• Correction des horodatages dans les réponses aux commentaires
|
||||
• Correction des couleurs de texte défectueuses en mode sombre
|
||||
• [YouTube] Correction du chargement des playlists de plus de 100 éléments
|
||||
• [YouTube] Correction de l'affichage des vidéos recommandées manquantes
|
||||
|
||||
@@ -1,16 +1,8 @@
|
||||
# Améliorations
|
||||
Conservation du lecteur en cours lorsque l'on clique sur les repères temporels
|
||||
Tentative de récupération des missions de téléchargement en attente lorsque cela est possible
|
||||
Ajout d'une option permettant de supprimer un téléchargement sans supprimer le fichier
|
||||
Conservation du lecteur en cours lors du clic sur les horodatages
|
||||
Tentative de récupération des téléchargements en attente
|
||||
Ajout d'une option pour supprimer un téléchargement sans supprimer le fichier
|
||||
Autorisation de superposition : affichage d'une boîte de dialogue explicative pour Android > R
|
||||
Prise en charge de l'ouverture des liens .soundcloud
|
||||
Nombreuses petites améliorations et optimisations
|
||||
|
||||
# Corrections
|
||||
Correction du formatage des nombres courts pour les versions d'Android antérieures à la version 7
|
||||
Correction du formatage du nombre court pour les versions Android inférieures à 7
|
||||
Correction des notifications fantômes
|
||||
Corrections concernant les fichiers de sous-titres SRT
|
||||
Correction de nombreux plantages
|
||||
|
||||
# Développement
|
||||
Modernisation du code interne
|
||||
Corrections pour les fichiers de sous-titres SRT
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
Correction d'une exception NullPointerException lors de la mise en file d'attente d'actions à l'aide du contexte d'application
|
||||
[YouTube] Correction de l'analyse de la durée des éléments
|
||||
|
||||
Mise à jour des traductions et suppression des locales non traduites
|
||||
Petites améliorations apportées à la gestion des images
|
||||
|
||||
Portage des modifications liées aux abonnements issues de la refactorisation
|
||||
Portage des modifications liées aux chemins d'accès issues de la refactorisation
|
||||
Intégration des modifications liées aux abonnements issues de la refactorisation
|
||||
Intégration des modifications liées aux chemins d'accès issues de la refactorisation
|
||||
Mise à jour des dépendances et de Gradle vers la dernière version stable
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
Il s'agit d'une petite mise à jour corrective visant à rendre YouTube à nouveau utilisable. Elle est nécessaire en raison de modifications apportées par YouTube.
|
||||
NewPipe est désormais à nouveau capable d'extraire les éléments des onglets de chaîne grâce aux efforts de @AudricV et @Ecomont.
|
||||
|
||||
Autres modifications
|
||||
- [YouTube] Correction de l'affichage de la durée et des diffusions en direct dans les vidéos associées
|
||||
- [SoundCloud] Correction du plantage lié aux commentaires en gérant les URL de page nulles
|
||||
- [SoundCloud] Correction du plantage des commentaires en gérant les URL de page nulles
|
||||
- Mises à jour des dépendances
|
||||
|
||||
NewPipe ne prendra plus en charge Android 5 dans la prochaine version.
|
||||
|
||||
@@ -1,7 +1,4 @@
|
||||
- [YouTube] Contournement des restrictions SABR grâce à l'utilisation d'un autre lecteur. Les vidéos et les flux sont à nouveau disponibles dans des résolutions autres que 360p !
|
||||
- [YouTube] Correction de l'extraction des éléments de playlist et de certaines propriétés dans les modèles de vue « lockup ».
|
||||
- [YouTube] Suppression des solutions de repli pour les positions inconnues lors de l'extraction du nombre de vues et de la date en mode « lockup ».
|
||||
- [YouTube] Utilisation des xTags de format pour extraire le type de piste audio.
|
||||
- [Bandcamp] Correction de la recherche sur Bandcamp.
|
||||
- [YouTube] Contournement de l'application de la norme SABR grâce à l'utilisation d'un autre client de lecture. Les vidéos et les flux sont à nouveau disponibles dans des résolutions autres que 360p !
|
||||
- [YouTube] Suppression des solutions de secours pour les positions inconnues lors de l'extraction du nombre de vues et de la date dans la vue verrouillée.
|
||||
|
||||
Un immense merci à toutes les personnes ayant participé à cette version !
|
||||
Un immense merci à toutes les personnes qui ont participé à cette version !
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
• La version minimale d'Android a été portée à 6.0
|
||||
• Correction de bugs liés à l'importation des abonnements
|
||||
• Correction de plusieurs bugs liés à la lecture vidéo
|
||||
• Correction d'un bug qui empêchait d'ouvrir les fichiers téléchargés dans une autre application
|
||||
• Mises à jour des traductions
|
||||
@@ -1,45 +1,14 @@
|
||||
# Modifications de la version v0.14.1
|
||||
# Modifications de la v0.14.1
|
||||
|
||||
### Corrections
|
||||
- Correction d'un problème d'échec du déchiffrement de l'URL d'une vidéo #1659
|
||||
|
||||
- Correction d'un problème d'extraction incorrecte du lien de description #1657
|
||||
|
||||
# Modifications de la version v0.14.0
|
||||
|
||||
### Nouveautés
|
||||
- Nouveau design du menu coulissant #1461
|
||||
- Nouvelle page d'accueil personnalisable #1461
|
||||
### Nouveau
|
||||
- Nouveau design du tiroir (#1461)
|
||||
- Nouvelle page d'accueil personnalisable (#1461)
|
||||
|
||||
### Améliorations
|
||||
- Refonte des commandes gestuelles #1604
|
||||
- Nouvelle méthode pour fermer le lecteur contextuel #1597
|
||||
- Refonte des commandes gestuelles (#1604)
|
||||
- Nouvelle méthode pour fermer le lecteur pop-up (#1597)
|
||||
|
||||
### Corrections
|
||||
- Correction d'une erreur lorsque le nombre d'abonnés n'est pas disponible. Clôture le ticket #1649.
|
||||
|
||||
- Affichage du message « Nombre d'abonnés non disponible » dans ces cas-là
|
||||
|
||||
- Correction d'un NPE (Null Pointer Exception) lorsqu'une playlist YouTube est vide
|
||||
|
||||
- Correction rapide pour les kiosques sur SoundCloud
|
||||
|
||||
- Refactorisation et correction de bugs #1623
|
||||
|
||||
- Correction des résultats de recherche cyclique #1562
|
||||
|
||||
- Correction de la barre de recherche qui n’était pas positionnée de manière statique
|
||||
|
||||
- Correction du blocage incorrect des vidéos YouTube Premium
|
||||
|
||||
- Correction du chargement parfois impossible des vidéos (en raison de l’analyse DASH)
|
||||
|
||||
- Correction des liens dans la description des vidéos
|
||||
|
||||
- Affichage d'un avertissement lorsqu'un utilisateur tente de télécharger vers une carte SD externe
|
||||
|
||||
- Correction d'un rapport d'exception déclenché alors que rien ne s'affichait
|
||||
|
||||
- Vignette non affichée dans le lecteur en arrière-plan sous Android 8.1 [voir ici](https://github.com/TeamNewPipe/NewPipe/issues/943)
|
||||
|
||||
- Correction de l'enregistrement du récepteur de diffusion. Clôture le ticket n° 1641.
|
||||
### Corrigé
|
||||
- Afficher « Nombre d'abonnés indisponible » dans ces cas
|
||||
- Correction du blocage incorrect des vidéos YouTube Premium
|
||||
- Afficher un avertissement lors d'une tentative de téléchargement sur carte SD externe
|
||||
|
||||
@@ -1,26 +1,7 @@
|
||||
ATTENTION : cette version est probablement truffée de bugs, tout comme la précédente. Cependant, compte tenu de l'arrêt complet depuis le 17, mieux vaut une version buguée que pas de version du tout. N'est-ce pas ? ¯\_(ツ)_/¯
|
||||
|
||||
### Améliorations
|
||||
* Les fichiers téléchargés peuvent désormais être ouverts en un seul clic #1879
|
||||
* Abandon de la prise en charge d'Android 4.1 à 4.3 #1884
|
||||
* Suppression de l'ancien lecteur #1884
|
||||
* Suppression des flux de la file d’attente de lecture en les faisant glisser vers la droite #1915
|
||||
* Suppression du flux mis automatiquement en file d’attente lorsqu’un nouveau flux est ajouté manuellement #1878
|
||||
* Les fichiers téléchargés peuvent maintenant être ouverts en un seul clic.
|
||||
* Post-traitement pour les téléchargements et implémentation des fonctionnalités manquantes #1759 par @kapodamy
|
||||
* Déplacer les téléchargements sérialisés en attente (fichiers `.giga`) vers les données de l'application.
|
||||
|
||||
* Post-traitement des téléchargements et implémentation des fonctionnalités manquantes #1759 par @kapodamy
|
||||
* Infrastructure de post-traitement
|
||||
* « Infrastructure » de gestion correcte des erreurs (pour le téléchargeur)
|
||||
* File d’attente au lieu de téléchargements multiples
|
||||
* Déplacer les téléchargements en attente sérialisés (fichiers `.giga`) vers les données de l’application
|
||||
* Implémenter un nombre maximal de tentatives de téléchargement
|
||||
* Mise en pause correcte des téléchargements multithread
|
||||
* Arrêter les téléchargements lors du passage au réseau mobile (ne fonctionne jamais, voir le 2e point)
|
||||
* Enregistrer le nombre de threads pour les prochains téléchargements
|
||||
* Correction de nombreuses incohérences
|
||||
|
||||
### Corrections
|
||||
* Correction d'un plantage lorsque la résolution par défaut est réglée sur « optimale » et que la résolution est limitée par les données mobiles #1835
|
||||
* Correction d'un plantage du lecteur contextuel #1874
|
||||
* Correction d'un NPE lors de la tentative d'ouverture du lecteur en arrière-plan #1901
|
||||
* Correction de l'insertion de nouveaux flux lorsque la mise en file d'attente automatique est activée #1878
|
||||
* Correction du problème de décryptage lors de l'arrêt
|
||||
### Corrigé
|
||||
* Correction d'un crash avec la résolution par défaut réglée sur la meilleure et la résolution limitée des données mobiles #1835
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
• न्यूनतम एंड्रॉयड वर्शन को बढ़ाकर 6.0 कर दिया गया है
|
||||
• सब्सक्रिप्शन इंपोर्ट करने में आने वाले दिक्कत को ठीक किया गया
|
||||
• वीडियो प्लेबैक में आने वाले कई बग्स को ठीक किया गया
|
||||
• एक बग को ठीक किया गया जो दूसरे ऐप में डाउनलोड खोलने से रोक रहा था
|
||||
• ट्रांसलेशन अपडेट्स
|
||||
@@ -1,5 +0,0 @@
|
||||
• Minimális Android-verzió 6.0-ra növelve
|
||||
• Feliratkozások importálásával kapcsolatos hibák javítása
|
||||
• Több, a videólejátszással kapcsolatos hiba javítása
|
||||
• Kijavítottunk egy hibát, amely megakadályozta a letöltések megnyitását egy másik alkalmazásban
|
||||
• Fordítási frissítések
|
||||
@@ -1 +1 @@
|
||||
A NewPipe nem használ semmilyen Google-keretrendszerkönyvtárat vagy YouTube API-t. A működéséhez szükséges információkat közvetlenül a YouTube weboldalának feldolgozásával nyeri ki. Ennek köszönhetően az alkalmazás olyan eszközökön is használható, amelyeken nincsenek telepítve a Google-szolgáltatások. A NewPipe használatához YouTube-fiókra sincs szükség, és az alkalmazás szabad és nyílt forráskódú (FLOSS).
|
||||
A NewPipe nem használ semmilyen Google keretrendszer-programkönyvtárat, sem a YouTube API-t. Csupán a weboldalt dolgozza fel, hogy kinyerje a szükséges információkat. Így ez az alkalmazás a Google Szolgáltatások nélküli eszközökön is használható. Továbbá a NewPipe használatához nincs szükség YouTube-fiókra, emellett szabad és nyílt forráskódú szoftver (FLOSS).
|
||||
|
||||
@@ -1 +1 @@
|
||||
Egy ingyenes és könnyű androidos kezelőfelület a YouTube-hoz.
|
||||
Egy ingyenes, könnyű YouTube felület Androidra.
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
• Android 최소 버전을 6.0으로 상향
|
||||
• 구독을 가져올 때의 버그 수정
|
||||
• 동영상 재생 관련 여러 버그 수정
|
||||
• 다운로드한 파일을 다른 앱에서 열지 못하는 버그 수정
|
||||
• 번역 업데이트
|
||||
@@ -1,5 +0,0 @@
|
||||
• Minimum Androidversie: 6.0
|
||||
• Opgelost: fouten bij importeren van abonnementen
|
||||
• Opgelost: fouten bij video afspelen
|
||||
• Opgelost: fout die downloads openen in een andere app voorkwam
|
||||
• Vertalingen bijgewerkt
|
||||
@@ -1,5 +0,0 @@
|
||||
• ਘੱਟੋ-ਘੱਟ ਐਂਡਰਾਇਡ ਸੰਸਕਰਣ 6.0 ਤੱਕ ਵਧਾ ਦਿੱਤਾ ਗਿਆ ਹੈ
|
||||
• ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਨੂੰ ਆਯਾਤ ਕਰਨ ਵਿੱਚ ਸਮੱਸਿਆ ਨੂੰ ਹੱਲ ਕੀਤਾ ਗਿਆ
|
||||
• ਵੀਡੀਓ ਪਲੇਬੈਕ ਵਿੱਚ ਕਈ ਬੱਗ ਠੀਕ ਕੀਤੇ ਗਏ
|
||||
• ਇੱਕ ਬੱਗ ਠੀਕ ਕੀਤਾ ਗਿਆ ਜੋ ਡਾਊਨਲੋਡਾਂ ਨੂੰ ਹੋਰ ਐਪਾਂ ਵਿੱਚ ਖੁੱਲ੍ਹਣ ਤੋਂ ਰੋਕਦਾ ਸੀ
|
||||
• ਅਨੁਵਾਦ ਅੱਪਡੇਟ
|
||||
@@ -1,5 +0,0 @@
|
||||
• Zwiększono minimalną wersję Androida do 6.0
|
||||
• Naprawiono błędy związane z importowaniem subskrypcji
|
||||
• Naprawiono wiele błędów związanych z odtwarzaniem wideo
|
||||
• Naprawiono błąd uniemożliwiający otwieranie pobranych plików w innych aplikacjach
|
||||
• Aktualizacje tłumaczeń
|
||||
@@ -1,5 +0,0 @@
|
||||
• Aumento da versão mínima do Android para 6.0
|
||||
• Bugs corrigidos com importação de assinaturas
|
||||
• Corrigidos vários bugs com reprodução de vídeo
|
||||
• Corrigido um bug que impedia a abertura de downloads em outro aplicativo
|
||||
• Atualizações de tradução
|
||||
@@ -1,6 +1 @@
|
||||
Toto je aktualizácia typu „hotfix“, ktorá odstraňuje chyby na YouTube:
|
||||
• [YouTube] Oprava problému s nenahraním žiadnych informácií o videu, oprava chýb HTTP 403 pri prehrávaní videí a obnovenie prehrávania niektorých videí s vekovým obmedzením
|
||||
• Oprava problému s nemennou veľkosťou titulkov
|
||||
• Oprava problému s dvojitým stiahnutím informácií pri otvorení streamu
|
||||
• [Soundcloud] Odstránenie neprehrateľných streamov chránených technológiou DRM
|
||||
• Aktualizované preklady
|
||||
Fixed YouTube not playing any stream
|
||||
|
||||
@@ -1,3 +1 @@
|
||||
Táto verzia rieši problém, keď YouTube poskytoval iba stream v rozlíšení 360p.
|
||||
|
||||
Upozorňujeme, že riešenie použité v tejto verzii je pravdepodobne dočasné a z dlhodobého hľadiska bude potrebné implementovať video protokol SABR, avšak členovia TeamNewPipe sú momentálne zaneprázdnení, takže akúkoľvek pomoc veľmi uvítame! https://github.com/TeamNewPipe/NewPipe/issues/12248
|
||||
Fixed YouTube not playing any stream
|
||||
|
||||
@@ -1,11 +1 @@
|
||||
Táto oprava odstraňuje chybu „Obsah nie je k dispozícii“: Videá na YouTube je teraz možné opäť prehrávať!
|
||||
|
||||
Opravuje tiež niekoľko chýb, ktoré sa objavili vo verzii 0.28.1:
|
||||
• Presúvanie položiek zo zoznamu prehrávania bolo možné len na susedné pozície
|
||||
• Blikanie názvu/komentárov medzi aktuálnym a predchádzajúcim videom
|
||||
• Nefungovala možnosť „Spustiť hlavný prehrávač na celú obrazovku“
|
||||
|
||||
Ďalšie vylepšenia:
|
||||
• [YouTube] Opäť je možné prehrávať živé vysielania až 4 hodiny dozadu
|
||||
• Pri prehrávaní na pozadí sa živé vysielanie nenačíta
|
||||
• Nové používateľské rozhranie pre funkciu „Odstrániť zo zoznamu pozretých“
|
||||
Fixed YouTube not playing any stream
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
• Zvýšila sa minimálna verzia systému Android na 6.0
|
||||
• Opravené chyby pri importe odberov
|
||||
• Opravené viaceré chyby pri prehrávaní videa
|
||||
• Opravená chyba, ktorá bránila otvoreniu stiahnutých súborov v inej aplikácii
|
||||
• Aktualizácie prekladov
|
||||
@@ -1,7 +0,0 @@
|
||||
* [YouTube] Kringgår SABR-krav med en annan spelarklient. Videor och strömmar finns åter i andra upplösningar än 360p!
|
||||
* [YouTube] Fixade extrahering av spellisteobjekt och egenskaper i lockup-vymodeller.
|
||||
* [YouTube] Tog bort blinda positionsfallbacks vid extrahering av visningsantal/datum i lockup.
|
||||
* [YouTube] Använder formatens xTags för att hitta ljudspårstyp.
|
||||
* [Bandcamp] Fixade Bandcamp-sökning.
|
||||
|
||||
Stort tack till alla som bidrog till denna version!
|
||||
@@ -1 +1 @@
|
||||
NewPipe använder varken Googles ramverksbibliotek eller YouTubes API. Den analyserar bara webbplatsens innehåll för att hämta den information den behöver. Därför kan appen användas på enheter som inte har Google-tjänster installerade. Du behöver inte heller ha ett YouTube-konto för att använda NewPipe, och det är fri och öppen programvara (FLOSS).
|
||||
NewPipe använder inte något av Googles ramverksbibliotek, eller YouTubes API. Den tolkar bara webbplatsens innehåll för att hämta den information den behöver. Därför kan denna app användas på enheter som inte har Google-tjänster installerat. Du behöver inte heller ha ett YouTube-konto för att använda NewPipe, och det är fri programvara med öppen källkod (FLOSS).
|
||||
|
||||
@@ -1 +1 @@
|
||||
En fri och lätt YouTube-klient för Android.
|
||||
En gratis, lättviktig YouTube-klient för Android.
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
• En düşük Android sürümü 6.0’a yükseltildi
|
||||
• Aboneliklerin içe aktarılmasıyla ilgili hatalar giderildi
|
||||
• Video oynatma ile ilgili çeşitli hatalar giderildi
|
||||
• İndirilenlerin başka bir uygulamada açılmasını engelleyen bir hata giderildi
|
||||
• Çeviri güncellemeleri
|
||||
@@ -1,5 +0,0 @@
|
||||
• 提升最低 Android 版本到 6.0
|
||||
• 修复了导入订阅的 bug
|
||||
• 修复了多个视频播放 bug
|
||||
• 修复了阻止在其他应用中打开下载的 bug
|
||||
• 翻译更新
|
||||
+1
-4
@@ -1,8 +1,5 @@
|
||||
org.gradle.jvmargs=-Xmx2048M --add-opens jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED
|
||||
org.gradle.jvmargs=-Xmx2048M --add-opens jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED --add-opens jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED
|
||||
systemProp.file.encoding=utf-8
|
||||
|
||||
# https://docs.gradle.org/current/userguide/configuration_cache.html
|
||||
org.gradle.configuration-cache=true
|
||||
|
||||
# https://kotlinlang.org/docs/native-target-support.html
|
||||
kotlin.native.ignoreDisabledTargets=true
|
||||
|
||||
+11
-10
@@ -4,7 +4,7 @@
|
||||
#
|
||||
|
||||
[versions]
|
||||
about-libraries = "15.0.3"
|
||||
about-libraries = "14.2.1"
|
||||
acra = "5.13.1"
|
||||
activity = "1.13.0"
|
||||
agp = "9.2.1"
|
||||
@@ -15,11 +15,11 @@ autoservice-zacsweers = "1.2.0"
|
||||
bridge = "v2.0.2"
|
||||
browser = "1.10.0"
|
||||
cardview = "1.0.0"
|
||||
checkstyle = "13.8.0"
|
||||
checkstyle = "13.6.0"
|
||||
coil = "3.5.0"
|
||||
compose = "1.11.4"
|
||||
compose = "1.11.2"
|
||||
constraintlayout = "2.2.1"
|
||||
core = "1.19.0"
|
||||
core = "1.18.0" # New versions require compileSdk 37
|
||||
coroutines = "1.11.0"
|
||||
desugar = "2.1.5"
|
||||
documentfile = "1.1.0"
|
||||
@@ -32,14 +32,14 @@ junit = "4.13.2"
|
||||
junit-ext = "1.3.0"
|
||||
kermit = "2.1.0"
|
||||
koin = "4.2.2"
|
||||
koin-plugin = "1.0.2"
|
||||
kotlin = "2.4.10"
|
||||
koin-plugin = "1.0.1"
|
||||
kotlin = "2.4.0"
|
||||
kotlinx-coroutines-rx3 = "1.11.0"
|
||||
kotlinx-serialization-json = "1.11.0"
|
||||
ksp = "2.3.9"
|
||||
ksp = "2.3.8"
|
||||
ktlint = "1.8.0"
|
||||
leakcanary = "2.14"
|
||||
lifecycle = "2.11.0"
|
||||
lifecycle = "2.10.0"
|
||||
localbroadcastmanager = "1.1.0"
|
||||
markwon = "4.6.2"
|
||||
material = "1.11.0" # TODO: update to newer version after bug is fixed. See https://github.com/TeamNewPipe/NewPipe/pull/13018
|
||||
@@ -59,7 +59,7 @@ rxandroid = "3.0.2"
|
||||
rxbinding = "4.0.0"
|
||||
rxjava = "3.1.12"
|
||||
settings = "1.3.0"
|
||||
sonarqube = "7.3.1.8318"
|
||||
sonarqube = "7.3.0.8198"
|
||||
statesaver = "1.4.1" # TODO: Drop because it is deprecated and incompatible with KSP2
|
||||
stetho = "1.6.0"
|
||||
swiperefreshlayout = "1.2.0"
|
||||
@@ -73,7 +73,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.26.5"
|
||||
teamnewpipe-newpipe-extractor = "v0.26.3"
|
||||
viewpager2 = "1.1.0"
|
||||
webkit = "1.15.0" # New versions require minSdk 24
|
||||
work = "2.11.2"
|
||||
@@ -163,6 +163,7 @@ puppycrawl-checkstyle = { module = "com.puppycrawl.tools:checkstyle", version.re
|
||||
reactivex-rxandroid = { module = "io.reactivex.rxjava3:rxandroid", version.ref = "rxandroid" }
|
||||
reactivex-rxjava = { module = "io.reactivex.rxjava3:rxjava", version.ref = "rxjava" }
|
||||
russhwolf-settings-core = { module = "com.russhwolf:multiplatform-settings", version.ref = "settings" }
|
||||
russhwolf-settings-coroutines = { module = "com.russhwolf:multiplatform-settings-coroutines", version.ref = "settings" }
|
||||
russhwolf-settings-test = { module = "com.russhwolf:multiplatform-settings-test", version.ref = "settings" }
|
||||
squareup-leakcanary-core = { module = "com.squareup.leakcanary:leakcanary-android-core", version.ref = "leakcanary" }
|
||||
squareup-leakcanary-plumber = { module = "com.squareup.leakcanary:plumber-android", version.ref = "leakcanary" }
|
||||
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionSha256Sum=9c0f7faeeb306cb14e4279a3e084ca6b596894089a0638e68a07c945a32c9e14
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.1-bin.zip
|
||||
distributionSha256Sum=bafc141b619ad6350fd975fc903156dd5c151998cc8b058e8c1044ab5f7b031f
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.1-bin.zip
|
||||
networkTimeout=10000
|
||||
retries=0
|
||||
retryBackOffMs=500
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
##############################################################################
|
||||
#
|
||||
# gradlew start up script for POSIX generated by Gradle.
|
||||
# Gradle start up script for POSIX generated by Gradle.
|
||||
#
|
||||
# Important for running:
|
||||
#
|
||||
@@ -29,7 +29,7 @@
|
||||
# bash, then to run this script, type that shell name before the whole
|
||||
# command line, like:
|
||||
#
|
||||
# ksh gradlew
|
||||
# ksh Gradle
|
||||
#
|
||||
# Busybox and similar reduced shells will NOT work, because this script
|
||||
# requires all of these POSIX shell features:
|
||||
|
||||
Vendored
+2
-2
@@ -19,7 +19,7 @@
|
||||
@if "%DEBUG%"=="" @echo off
|
||||
@rem ##########################################################################
|
||||
@rem
|
||||
@rem gradlew startup script for Windows
|
||||
@rem Gradle startup script for Windows
|
||||
@rem
|
||||
@rem ##########################################################################
|
||||
|
||||
@@ -72,7 +72,7 @@ echo location of your Java installation. 1>&2
|
||||
|
||||
|
||||
|
||||
@rem Execute gradlew
|
||||
@rem Execute Gradle
|
||||
@rem endlocal doesn't take effect until after the line is parsed and variables are expanded
|
||||
@rem which allows us to clear the local environment before executing the java command
|
||||
endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel
|
||||
|
||||
+11
-5
@@ -17,12 +17,14 @@ plugins {
|
||||
// https://stackoverflow.com/a/74771876/8446131
|
||||
val buildConfigGenerator by tasks.registering(Sync::class) {
|
||||
val buildConfigPackage = NEWPIPE_APPLICATION_ID_NEW
|
||||
val isDebug = providers.gradleProperty("buildVariant").orElse("release").map { it == "debug" }
|
||||
val rawClass = """
|
||||
package $buildConfigPackage
|
||||
|
||||
object BuildConfig {
|
||||
object BuildConfig {
|
||||
const val VERSION_NAME = "$NEWPIPE_VERSION_NAME"
|
||||
const val APP_NAME = "NewPipe"
|
||||
const val DEBUG = ${isDebug.get()}
|
||||
}
|
||||
""".trimIndent()
|
||||
from(resources.text.fromString(rawClass)) {
|
||||
@@ -37,8 +39,7 @@ kotlin {
|
||||
|
||||
compilerOptions {
|
||||
freeCompilerArgs.addAll(
|
||||
"-Xexpect-actual-classes",
|
||||
"-Xexplicit-backing-fields"
|
||||
"-Xexpect-actual-classes"
|
||||
)
|
||||
optIn.addAll(
|
||||
"androidx.compose.material3.ExperimentalMaterial3Api",
|
||||
@@ -109,10 +110,11 @@ kotlin {
|
||||
implementation(libs.kotlinx.serialization.json)
|
||||
|
||||
implementation(libs.koin.compose.navigation3)
|
||||
implementation(libs.koin.compose.viewmodel)
|
||||
implementation(libs.koin.annotations)
|
||||
api(libs.koin.compose.viewmodel)
|
||||
api(libs.koin.annotations)
|
||||
|
||||
implementation(libs.russhwolf.settings.core)
|
||||
implementation(libs.russhwolf.settings.coroutines)
|
||||
implementation(libs.touchlab.kermit)
|
||||
}
|
||||
}
|
||||
@@ -149,6 +151,10 @@ dependencies {
|
||||
androidRuntimeClasspath(libs.jetbrains.compose.tooling)
|
||||
}
|
||||
|
||||
koinCompiler {
|
||||
userLogs = true // See what the compiler plugin detects
|
||||
}
|
||||
|
||||
aboutLibraries {
|
||||
export {
|
||||
outputFile = file("src/iosMain/resources/aboutlibraries.json")
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
package net.newpipe.app
|
||||
|
||||
import android.content.Context
|
||||
import android.os.Bundle
|
||||
import androidx.activity.ComponentActivity
|
||||
import androidx.activity.compose.setContent
|
||||
@@ -16,11 +17,21 @@ import kotlinx.serialization.json.Json
|
||||
import net.newpipe.Constants
|
||||
import net.newpipe.app.navigation.Destination
|
||||
import net.newpipe.app.theme.currentService
|
||||
import org.koin.core.module.Module
|
||||
import org.koin.dsl.module
|
||||
|
||||
/**
|
||||
* Entry point for compose-related UI components on Android
|
||||
*/
|
||||
class ComposeActivity : ComponentActivity() {
|
||||
open class ComposeActivity : ComponentActivity() {
|
||||
|
||||
/** Override to add `:app`-side or other host-specific bindings. */
|
||||
protected open fun platformModules(): List<Module> {
|
||||
return listOf(
|
||||
module { single<Context> { applicationContext } }
|
||||
)
|
||||
}
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
enableEdgeToEdge()
|
||||
super.onCreate(savedInstanceState)
|
||||
@@ -28,17 +39,20 @@ class ComposeActivity : ComponentActivity() {
|
||||
setContent {
|
||||
App(
|
||||
// TODO: Change when everything is in compose and this is the primary activity
|
||||
startDestination = Json.decodeFromString<Destination>(
|
||||
startDestination = Json.decodeFromString<Destination>(
|
||||
intent.getStringExtra(Constants.INTENT_SCREEN_KEY)!!
|
||||
),
|
||||
onCloseRequest = ::finish
|
||||
onCloseRequest = ::finish,
|
||||
platformModules = platformModules()
|
||||
) {
|
||||
val view = LocalView.current
|
||||
val service = currentService()
|
||||
|
||||
DisposableEffect(service) {
|
||||
val windowController = WindowCompat.getInsetsController(window, view)
|
||||
windowController.isAppearanceLightStatusBars = service.isSchemeColorDensityLight
|
||||
val windowController =
|
||||
WindowCompat.getInsetsController(window, view)
|
||||
windowController.isAppearanceLightStatusBars =
|
||||
service.isSchemeColorDensityLight
|
||||
onDispose {
|
||||
windowController.isAppearanceLightStatusBars = false
|
||||
}
|
||||
|
||||
@@ -7,14 +7,22 @@ package net.newpipe.app.di.settings
|
||||
|
||||
import android.content.Context
|
||||
import androidx.preference.PreferenceManager
|
||||
import com.russhwolf.settings.ObservableSettings
|
||||
import com.russhwolf.settings.Settings
|
||||
import com.russhwolf.settings.SharedPreferencesSettings
|
||||
import org.koin.core.annotation.Singleton
|
||||
|
||||
/**
|
||||
* Settings for Android based on SharedPreferences
|
||||
* Shared key-value store for Android, backed by the default
|
||||
* [PreferenceManager] so Compose Multiplatform code and the legacy Views
|
||||
* fragments share the same `SharedPreferences`.
|
||||
*
|
||||
* Registered under both [ObservableSettings] (for flow-based callers like
|
||||
* [net.newpipe.app.viewmodel.settings.BooleanPreference]) and [Settings]
|
||||
* (for the original theme-layer callers).
|
||||
*/
|
||||
@Singleton
|
||||
fun provideSettings(context: Context): Settings = SharedPreferencesSettings(
|
||||
PreferenceManager.getDefaultSharedPreferences(context)
|
||||
)
|
||||
@Singleton(binds = [ObservableSettings::class, Settings::class])
|
||||
fun provideSettings(context: Context): ObservableSettings =
|
||||
SharedPreferencesSettings(
|
||||
PreferenceManager.getDefaultSharedPreferences(context)
|
||||
)
|
||||
@@ -0,0 +1,22 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2026 NewPipe e.V. <https://newpipe-ev.de>
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package net.newpipe.app.platform
|
||||
|
||||
import org.koin.core.annotation.Singleton
|
||||
|
||||
@Singleton(binds = [BackupRestoreActions::class])
|
||||
class AndroidBackupRestoreActions(
|
||||
private val legacyHooks: AndroidLegacyHooks
|
||||
) : BackupRestoreActions {
|
||||
override fun importDatabase() = legacyHooks.importDatabase()
|
||||
override fun exportDatabase() = legacyHooks.exportDatabase()
|
||||
override fun resetAllSettings() = legacyHooks.resetAllSettings()
|
||||
override fun importSubscriptions() = legacyHooks.importSubscriptions()
|
||||
override fun exportSubscriptions() = legacyHooks.exportSubscriptions()
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2026 NewPipe e.V. <https://newpipe-ev.de>
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package net.newpipe.app.platform
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import android.content.pm.ApplicationInfo
|
||||
import android.content.pm.PackageManager
|
||||
import androidx.core.content.pm.PackageInfoCompat
|
||||
import co.touchlab.kermit.Logger
|
||||
import org.koin.core.annotation.Singleton
|
||||
|
||||
@Singleton(binds = [BuildInfo::class])
|
||||
class AndroidBuildInfo(private val context: Context) : BuildInfo {
|
||||
|
||||
override val isDebug: Boolean =
|
||||
context.applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE != 0
|
||||
|
||||
@get:SuppressLint("NewApi")
|
||||
@OptIn(ExperimentalStdlibApi::class)
|
||||
override val isReleaseApk: Boolean by lazy {
|
||||
val certificates = mapOf(
|
||||
RELEASE_CERT_PUBLIC_KEY_SHA256.hexToByteArray() to PackageManager.CERT_INPUT_SHA256
|
||||
)
|
||||
try {
|
||||
PackageInfoCompat.hasSignatures(
|
||||
context.packageManager,
|
||||
context.packageName,
|
||||
certificates,
|
||||
false
|
||||
)
|
||||
} catch (exception: PackageManager.NameNotFoundException) {
|
||||
Logger.e(messageString = "Could not find package info", throwable = exception)
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val RELEASE_CERT_PUBLIC_KEY_SHA256 =
|
||||
"cb84069bd68116bafae5ee4ee5b08a567aa6d898404e7cb12f9e756df5cf5cab"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2026 NewPipe e.V. <https://newpipe-ev.de>
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package net.newpipe.app.platform
|
||||
|
||||
import org.koin.core.annotation.Singleton
|
||||
|
||||
@Singleton(binds = [ContentActions::class])
|
||||
class AndroidContentActions(
|
||||
private val legacyHooks: AndroidLegacyHooks
|
||||
) : ContentActions {
|
||||
override fun openMainPageTabsChooser() = legacyHooks.openMainPageTabsChooser()
|
||||
override fun openPeertubeInstanceList() = legacyHooks.openPeertubeInstanceList()
|
||||
override fun onAppLanguageChanged() = legacyHooks.onAppLanguageChanged()
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2026 NewPipe e.V. <https://newpipe-ev.de>
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package net.newpipe.app.platform
|
||||
|
||||
import android.app.Application
|
||||
import android.content.Intent
|
||||
import org.koin.core.annotation.Singleton
|
||||
|
||||
/**
|
||||
* Android implementation of [DebugActions].
|
||||
*
|
||||
* Receives [AndroidLegacyHooks] through Koin. The host activity
|
||||
* (`NewPipeComposeActivity`) overrides the default placeholder binding from
|
||||
* [AndroidLegacyHooksModule] with the real implementation (`AppLegacyHooks`)
|
||||
* via its `platformModules`.
|
||||
*/
|
||||
@Singleton(binds = [DebugActions::class])
|
||||
class AndroidDebugActions(
|
||||
private val application: Application,
|
||||
private val legacyHooks: AndroidLegacyHooks
|
||||
) : DebugActions {
|
||||
|
||||
override fun crashTheApp() {
|
||||
throw RuntimeException("Dummy")
|
||||
}
|
||||
|
||||
override fun showErrorSnackbar() = legacyHooks.showUiErrorSnackbar()
|
||||
|
||||
override fun createErrorNotification() = legacyHooks.createErrorNotification()
|
||||
|
||||
override fun checkNewStreams() = legacyHooks.runNotificationWorkerNow()
|
||||
|
||||
override fun showMemoryLeaks() {
|
||||
legacyHooks.newLeakDisplayActivityIntent()?.let { intent ->
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
application.startActivity(intent)
|
||||
}
|
||||
}
|
||||
|
||||
override fun isLeakCanaryAvailable(): Boolean =
|
||||
legacyHooks.newLeakDisplayActivityIntent() != null
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2026 NewPipe e.V. <https://newpipe-ev.de>
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package net.newpipe.app.platform
|
||||
|
||||
import org.koin.core.annotation.Singleton
|
||||
|
||||
@Singleton(binds = [DownloadActions::class])
|
||||
class AndroidDownloadActions(
|
||||
private val legacyHooks: AndroidLegacyHooks
|
||||
) : DownloadActions {
|
||||
|
||||
override fun pickDirectory(onPicked: (String) -> Unit) =
|
||||
legacyHooks.requestDirectoryPicker(onPicked)
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2026 NewPipe e.V. <https://newpipe-ev.de>
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package net.newpipe.app.platform
|
||||
|
||||
import org.koin.core.annotation.Singleton
|
||||
|
||||
@Singleton(binds = [HistoryActions::class])
|
||||
class AndroidHistoryActions(
|
||||
private val legacyHooks: AndroidLegacyHooks
|
||||
) : HistoryActions {
|
||||
|
||||
override fun wipeMetadataCache() = legacyHooks.wipeMetadataCache()
|
||||
override fun deleteWatchHistory() = legacyHooks.deleteWatchHistory()
|
||||
override fun deletePlaybackStates() = legacyHooks.deletePlaybackStates()
|
||||
override fun deleteSearchHistory() = legacyHooks.deleteSearchHistory()
|
||||
override fun clearRecaptchaCookies() =
|
||||
legacyHooks.clearRecaptchaCookies()
|
||||
override fun hasRecaptchaCookies(): Boolean =
|
||||
legacyHooks.hasRecaptchaCookies()
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user